kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
181 lines (174 loc) • 28.2 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _window = _interopRequireDefault(require("global/window"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Copied from https://github.com/sarink/react-file-drop
* For React 16.8 compatibility
*/
var isIE = function isIE() {
return _window["default"] && _window["default"].navigator && ((_window["default"].navigator.userAgent || []).includes('MSIE') || (_window["default"].navigator.appVersion || []).includes('Trident/'));
};
var eventHasFiles = function eventHasFiles(event) {
// In most browsers this is an array, but in IE11 it's an Object :(
var hasFiles = false;
if (event.dataTransfer) {
var types = event.dataTransfer.types;
for (var keyOrIndex in types) {
if (types[keyOrIndex] === 'Files') {
hasFiles = true;
break;
}
}
}
return hasFiles;
};
var FileDrop = function FileDrop(_ref) {
var _ref$dropEffect = _ref.dropEffect,
dropEffect = _ref$dropEffect === void 0 ? 'copy' : _ref$dropEffect,
_ref$frame = _ref.frame,
frame = _ref$frame === void 0 ? _window["default"] ? _window["default"].document : undefined : _ref$frame,
_ref$className = _ref.className,
className = _ref$className === void 0 ? 'file-drop' : _ref$className,
_ref$targetClassName = _ref.targetClassName,
targetClassName = _ref$targetClassName === void 0 ? 'file-drop-target' : _ref$targetClassName,
_ref$draggingOverFram = _ref.draggingOverFrameClassName,
draggingOverFrameClassName = _ref$draggingOverFram === void 0 ? 'file-drop-dragging-over-frame' : _ref$draggingOverFram,
_ref$draggingOverTarg = _ref.draggingOverTargetClassName,
draggingOverTargetClassName = _ref$draggingOverTarg === void 0 ? 'file-drop-dragging-over-target' : _ref$draggingOverTarg,
onDragOver = _ref.onDragOver,
onDragLeave = _ref.onDragLeave,
onDrop = _ref.onDrop,
onFrameDragEnter = _ref.onFrameDragEnter,
onFrameDragLeave = _ref.onFrameDragLeave,
onFrameDrop = _ref.onFrameDrop,
children = _ref.children;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
draggingOverTarget = _useState2[0],
setDraggingOverTarget = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
draggingOverFrame = _useState4[0],
setDraggingOverFrame = _useState4[1];
var _useState5 = (0, _react.useState)(0),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
frameDragCounter = _useState6[0],
setFrameDragCounter = _useState6[1];
var prevFrame = (0, _react.useRef)(frame);
(0, _react.useEffect)(function () {
// componentDidMount
startFrameListeners(frame);
resetDragging();
_window["default"].addEventListener('dragover', handleWindowDragOverOrDrop);
_window["default"].addEventListener('drop', handleWindowDragOverOrDrop);
return function () {
// componentWillUnmount
stopFrameListeners(frame);
_window["default"].removeEventListener('dragover', handleWindowDragOverOrDrop);
_window["default"].removeEventListener('drop', handleWindowDragOverOrDrop);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var resetDragging = (0, _react.useCallback)(function () {
setFrameDragCounter(0);
setDraggingOverTarget(false);
setDraggingOverFrame(false);
}, []);
var handleWindowDragOverOrDrop = (0, _react.useCallback)(function (event) {
// This prevents the browser from trying to load whatever file the user dropped on the window
event.preventDefault();
}, []);
var handleFrameDrag = (0, _react.useCallback)(function (event) {
// Only allow dragging of files
if (!eventHasFiles(event)) return;
// We are listening for events on the 'frame', so every time the user drags over any element in the frame's tree,
// the event bubbles up to the frame. By keeping count of how many "dragenters" we get, we can tell if they are still
// "draggingOverFrame" (b/c you get one "dragenter" initially, and one "dragenter"/one "dragleave" for every bubble)
// This is far better than a "dragover" handler, which would be calling `setState` continuously.
var newDragCounterValue = frameDragCounter + (event.type === 'dragenter' ? 1 : -1);
setFrameDragCounter(newDragCounterValue);
if (newDragCounterValue === 1) {
setDraggingOverFrame(true);
if (onFrameDragEnter) onFrameDragEnter(event);
return;
}
if (newDragCounterValue === 0) {
setDraggingOverFrame(false);
if (onFrameDragLeave) onFrameDragLeave(event);
return;
}
}, [frameDragCounter, setDraggingOverFrame, onFrameDragEnter, onFrameDragLeave]);
var handleFrameDrop = (0, _react.useCallback)(function (event) {
event.preventDefault();
if (!draggingOverTarget) {
resetDragging();
if (onFrameDrop) onFrameDrop(event);
}
}, [onFrameDrop, draggingOverTarget, resetDragging]);
var handleDragOver = (0, _react.useCallback)(function (event) {
if (eventHasFiles(event)) {
setDraggingOverTarget(true);
if (!isIE() && dropEffect) event.dataTransfer.dropEffect = dropEffect;
if (onDragOver) onDragOver(event);
}
}, [dropEffect, onDragOver]);
var handleDragLeave = (0, _react.useCallback)(function (event) {
setDraggingOverTarget(false);
if (onDragLeave) onDragLeave(event);
}, [onDragLeave]);
var handleDrop = (0, _react.useCallback)(function (event) {
if (onDrop && eventHasFiles(event)) {
var files = event.dataTransfer ? event.dataTransfer.files : null;
onDrop(files, event);
}
resetDragging();
}, [onDrop, resetDragging]);
var stopFrameListeners = (0, _react.useCallback)(function (frame) {
if (frame) {
frame.removeEventListener('dragenter', handleFrameDrag);
frame.removeEventListener('dragleave', handleFrameDrag);
frame.removeEventListener('drop', handleFrameDrop);
}
}, [handleFrameDrag, handleFrameDrop]);
var startFrameListeners = (0, _react.useCallback)(function (frame) {
if (frame) {
frame.addEventListener('dragenter', handleFrameDrag);
frame.addEventListener('dragleave', handleFrameDrag);
frame.addEventListener('drop', handleFrameDrop);
}
}, [handleFrameDrag, handleFrameDrop]);
(0, _react.useEffect)(function () {
// componentDidUpdate
if (prevFrame.current !== frame) {
resetDragging();
stopFrameListeners(prevFrame.current);
startFrameListeners(frame);
prevFrame.current = frame;
}
}, [frame, resetDragging, stopFrameListeners, startFrameListeners]);
// Render
var fileDropTargetClassName = targetClassName;
if (draggingOverFrame) fileDropTargetClassName += " ".concat(draggingOverFrameClassName);
if (draggingOverTarget) fileDropTargetClassName += " ".concat(draggingOverTargetClassName);
return /*#__PURE__*/_react["default"].createElement("div", {
className: className,
onDragOver: handleDragOver,
onDragLeave: handleDragLeave,
onDrop: handleDrop
}, /*#__PURE__*/_react["default"].createElement("div", {
className: fileDropTargetClassName
}, children));
};
var _default = exports["default"] = FileDrop;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImlzSUUiLCJXaW5kb3ciLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmNsdWRlcyIsImFwcFZlcnNpb24iLCJldmVudEhhc0ZpbGVzIiwiZXZlbnQiLCJoYXNGaWxlcyIsImRhdGFUcmFuc2ZlciIsInR5cGVzIiwia2V5T3JJbmRleCIsIkZpbGVEcm9wIiwiX3JlZiIsIl9yZWYkZHJvcEVmZmVjdCIsImRyb3BFZmZlY3QiLCJfcmVmJGZyYW1lIiwiZnJhbWUiLCJkb2N1bWVudCIsInVuZGVmaW5lZCIsIl9yZWYkY2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiX3JlZiR0YXJnZXRDbGFzc05hbWUiLCJ0YXJnZXRDbGFzc05hbWUiLCJfcmVmJGRyYWdnaW5nT3ZlckZyYW0iLCJkcmFnZ2luZ092ZXJGcmFtZUNsYXNzTmFtZSIsIl9yZWYkZHJhZ2dpbmdPdmVyVGFyZyIsImRyYWdnaW5nT3ZlclRhcmdldENsYXNzTmFtZSIsIm9uRHJhZ092ZXIiLCJvbkRyYWdMZWF2ZSIsIm9uRHJvcCIsIm9uRnJhbWVEcmFnRW50ZXIiLCJvbkZyYW1lRHJhZ0xlYXZlIiwib25GcmFtZURyb3AiLCJjaGlsZHJlbiIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImRyYWdnaW5nT3ZlclRhcmdldCIsInNldERyYWdnaW5nT3ZlclRhcmdldCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiZHJhZ2dpbmdPdmVyRnJhbWUiLCJzZXREcmFnZ2luZ092ZXJGcmFtZSIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiZnJhbWVEcmFnQ291bnRlciIsInNldEZyYW1lRHJhZ0NvdW50ZXIiLCJwcmV2RnJhbWUiLCJ1c2VSZWYiLCJ1c2VFZmZlY3QiLCJzdGFydEZyYW1lTGlzdGVuZXJzIiwicmVzZXREcmFnZ2luZyIsImFkZEV2ZW50TGlzdGVuZXIiLCJoYW5kbGVXaW5kb3dEcmFnT3Zlck9yRHJvcCIsInN0b3BGcmFtZUxpc3RlbmVycyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1c2VDYWxsYmFjayIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlRnJhbWVEcmFnIiwibmV3RHJhZ0NvdW50ZXJWYWx1ZSIsInR5cGUiLCJoYW5kbGVGcmFtZURyb3AiLCJoYW5kbGVEcmFnT3ZlciIsImhhbmRsZURyYWdMZWF2ZSIsImhhbmRsZURyb3AiLCJmaWxlcyIsImN1cnJlbnQiLCJmaWxlRHJvcFRhcmdldENsYXNzTmFtZSIsImNvbmNhdCIsImNyZWF0ZUVsZW1lbnQiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL2ZpbGUtdXBsb2FkZXIvZmlsZS1kcm9wLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKipcbiAqIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXJpbmsvcmVhY3QtZmlsZS1kcm9wXG4gKiBGb3IgUmVhY3QgMTYuOCBjb21wYXRpYmlsaXR5XG4gKi9cbmltcG9ydCBSZWFjdCwge1JlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcblxuY29uc3QgaXNJRSA9ICgpID0+XG4gIFdpbmRvdyAmJlxuICBXaW5kb3cubmF2aWdhdG9yICYmXG4gICgoV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQgfHwgW10pLmluY2x1ZGVzKCdNU0lFJykgfHxcbiAgICAoV2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uIHx8IFtdKS5pbmNsdWRlcygnVHJpZGVudC8nKSk7XG5cbmNvbnN0IGV2ZW50SGFzRmlsZXMgPSBldmVudCA9PiB7XG4gIC8vIEluIG1vc3QgYnJvd3NlcnMgdGhpcyBpcyBhbiBhcnJheSwgYnV0IGluIElFMTEgaXQncyBhbiBPYmplY3QgOihcblxuICBsZXQgaGFzRmlsZXMgPSBmYWxzZTtcbiAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgIGNvbnN0IHR5cGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzO1xuICAgIGZvciAoY29uc3Qga2V5T3JJbmRleCBpbiB0eXBlcykge1xuICAgICAgaWYgKHR5cGVzW2tleU9ySW5kZXhdID09PSAnRmlsZXMnKSB7XG4gICAgICAgIGhhc0ZpbGVzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNGaWxlcztcbn07XG5cbmV4cG9ydCB0eXBlIEZpbGVEcm9wUHJvcHMgPSB7XG4gIGRyb3BFZmZlY3Q/OiAnY29weScgfCAnbW92ZScgfCAnbGluaycgfCAnbm9uZSc7XG4gIGZyYW1lPzogdHlwZW9mIGRvY3VtZW50IHwgdHlwZW9mIFdpbmRvdyB8IEhUTUxFbGVtZW50O1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHRhcmdldENsYXNzTmFtZT86IHN0cmluZztcbiAgZHJhZ2dpbmdPdmVyRnJhbWVDbGFzc05hbWU/OiBzdHJpbmc7XG4gIGRyYWdnaW5nT3ZlclRhcmdldENsYXNzTmFtZT86IHN0cmluZztcbiAgb25EcmFnT3Zlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBvbkRyYWdMZWF2ZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICBvbkRyb3A/OiAoZmlsZUxpc3Q6IEZpbGVMaXN0LCBldmVudDogYW55KSA9PiB2b2lkO1xuICBvbkZyYW1lRHJhZ0VudGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gIG9uRnJhbWVEcmFnTGVhdmU/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgb25GcmFtZURyb3A/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59O1xuXG5jb25zdCBGaWxlRHJvcCA9ICh7XG4gIGRyb3BFZmZlY3QgPSAnY29weScsXG4gIGZyYW1lID0gV2luZG93ID8gV2luZG93LmRvY3VtZW50IDogdW5kZWZpbmVkLFxuICBjbGFzc05hbWUgPSAnZmlsZS1kcm9wJyxcbiAgdGFyZ2V0Q2xhc3NOYW1lID0gJ2ZpbGUtZHJvcC10YXJnZXQnLFxuICBkcmFnZ2luZ092ZXJGcmFtZUNsYXNzTmFtZSA9ICdmaWxlLWRyb3AtZHJhZ2dpbmctb3Zlci1mcmFtZScsXG4gIGRyYWdnaW5nT3ZlclRhcmdldENsYXNzTmFtZSA9ICdmaWxlLWRyb3AtZHJhZ2dpbmctb3Zlci10YXJnZXQnLFxuICBvbkRyYWdPdmVyLFxuICBvbkRyYWdMZWF2ZSxcbiAgb25Ecm9wLFxuICBvbkZyYW1lRHJhZ0VudGVyLFxuICBvbkZyYW1lRHJhZ0xlYXZlLFxuICBvbkZyYW1lRHJvcCxcbiAgY2hpbGRyZW5cbn06IEZpbGVEcm9wUHJvcHMpID0+IHtcbiAgY29uc3QgW2RyYWdnaW5nT3ZlclRhcmdldCwgc2V0RHJhZ2dpbmdPdmVyVGFyZ2V0XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2RyYWdnaW5nT3ZlckZyYW1lLCBzZXREcmFnZ2luZ092ZXJGcmFtZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtmcmFtZURyYWdDb3VudGVyLCBzZXRGcmFtZURyYWdDb3VudGVyXSA9IHVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IHByZXZGcmFtZSA9IHVzZVJlZihmcmFtZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBjb21wb25lbnREaWRNb3VudFxuICAgIHN0YXJ0RnJhbWVMaXN0ZW5lcnMoZnJhbWUpO1xuICAgIHJlc2V0RHJhZ2dpbmcoKTtcbiAgICBXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVXaW5kb3dEcmFnT3Zlck9yRHJvcCk7XG4gICAgV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVXaW5kb3dEcmFnT3Zlck9yRHJvcCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnRcbiAgICAgIHN0b3BGcmFtZUxpc3RlbmVycyhmcmFtZSk7XG4gICAgICBXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBoYW5kbGVXaW5kb3dEcmFnT3Zlck9yRHJvcCk7XG4gICAgICBXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIGhhbmRsZVdpbmRvd0RyYWdPdmVyT3JEcm9wKTtcbiAgICB9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgY29uc3QgcmVzZXREcmFnZ2luZyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRGcmFtZURyYWdDb3VudGVyKDApO1xuICAgIHNldERyYWdnaW5nT3ZlclRhcmdldChmYWxzZSk7XG4gICAgc2V0RHJhZ2dpbmdPdmVyRnJhbWUoZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlV2luZG93RHJhZ092ZXJPckRyb3AgPSB1c2VDYWxsYmFjayhldmVudCA9PiB7XG4gICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHRyeWluZyB0byBsb2FkIHdoYXRldmVyIGZpbGUgdGhlIHVzZXIgZHJvcHBlZCBvbiB0aGUgd2luZG93XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUZyYW1lRHJhZyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIC8vIE9ubHkgYWxsb3cgZHJhZ2dpbmcgb2YgZmlsZXNcbiAgICAgIGlmICghZXZlbnRIYXNGaWxlcyhldmVudCkpIHJldHVybjtcblxuICAgICAgLy8gV2UgYXJlIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoZSAnZnJhbWUnLCBzbyBldmVyeSB0aW1lIHRoZSB1c2VyIGRyYWdzIG92ZXIgYW55IGVsZW1lbnQgaW4gdGhlIGZyYW1lJ3MgdHJlZSxcbiAgICAgIC8vIHRoZSBldmVudCBidWJibGVzIHVwIHRvIHRoZSBmcmFtZS4gQnkga2VlcGluZyBjb3VudCBvZiBob3cgbWFueSBcImRyYWdlbnRlcnNcIiB3ZSBnZXQsIHdlIGNhbiB0ZWxsIGlmIHRoZXkgYXJlIHN0aWxsXG4gICAgICAvLyBcImRyYWdnaW5nT3ZlckZyYW1lXCIgKGIvYyB5b3UgZ2V0IG9uZSBcImRyYWdlbnRlclwiIGluaXRpYWxseSwgYW5kIG9uZSBcImRyYWdlbnRlclwiL29uZSBcImRyYWdsZWF2ZVwiIGZvciBldmVyeSBidWJibGUpXG4gICAgICAvLyBUaGlzIGlzIGZhciBiZXR0ZXIgdGhhbiBhIFwiZHJhZ292ZXJcIiBoYW5kbGVyLCB3aGljaCB3b3VsZCBiZSBjYWxsaW5nIGBzZXRTdGF0ZWAgY29udGludW91c2x5LlxuICAgICAgY29uc3QgbmV3RHJhZ0NvdW50ZXJWYWx1ZSA9IGZyYW1lRHJhZ0NvdW50ZXIgKyAoZXZlbnQudHlwZSA9PT0gJ2RyYWdlbnRlcicgPyAxIDogLTEpO1xuICAgICAgc2V0RnJhbWVEcmFnQ291bnRlcihuZXdEcmFnQ291bnRlclZhbHVlKTtcblxuICAgICAgaWYgKG5ld0RyYWdDb3VudGVyVmFsdWUgPT09IDEpIHtcbiAgICAgICAgc2V0RHJhZ2dpbmdPdmVyRnJhbWUodHJ1ZSk7XG4gICAgICAgIGlmIChvbkZyYW1lRHJhZ0VudGVyKSBvbkZyYW1lRHJhZ0VudGVyKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3RHJhZ0NvdW50ZXJWYWx1ZSA9PT0gMCkge1xuICAgICAgICBzZXREcmFnZ2luZ092ZXJGcmFtZShmYWxzZSk7XG4gICAgICAgIGlmIChvbkZyYW1lRHJhZ0xlYXZlKSBvbkZyYW1lRHJhZ0xlYXZlKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZyYW1lRHJhZ0NvdW50ZXIsIHNldERyYWdnaW5nT3ZlckZyYW1lLCBvbkZyYW1lRHJhZ0VudGVyLCBvbkZyYW1lRHJhZ0xlYXZlXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUZyYW1lRHJvcCA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoIWRyYWdnaW5nT3ZlclRhcmdldCkge1xuICAgICAgICByZXNldERyYWdnaW5nKCk7XG4gICAgICAgIGlmIChvbkZyYW1lRHJvcCkgb25GcmFtZURyb3AoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29uRnJhbWVEcm9wLCBkcmFnZ2luZ092ZXJUYXJnZXQsIHJlc2V0RHJhZ2dpbmddXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRHJhZ092ZXIgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnRIYXNGaWxlcyhldmVudCkpIHtcbiAgICAgICAgc2V0RHJhZ2dpbmdPdmVyVGFyZ2V0KHRydWUpO1xuICAgICAgICBpZiAoIWlzSUUoKSAmJiBkcm9wRWZmZWN0KSBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IGRyb3BFZmZlY3Q7XG4gICAgICAgIGlmIChvbkRyYWdPdmVyKSBvbkRyYWdPdmVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkcm9wRWZmZWN0LCBvbkRyYWdPdmVyXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZURyYWdMZWF2ZSA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIHNldERyYWdnaW5nT3ZlclRhcmdldChmYWxzZSk7XG5cbiAgICAgIGlmIChvbkRyYWdMZWF2ZSkgb25EcmFnTGVhdmUoZXZlbnQpO1xuICAgIH0sXG4gICAgW29uRHJhZ0xlYXZlXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZURyb3AgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBpZiAob25Ecm9wICYmIGV2ZW50SGFzRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyID8gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzIDogbnVsbDtcbiAgICAgICAgb25Ecm9wKGZpbGVzLCBldmVudCk7XG4gICAgICB9XG4gICAgICByZXNldERyYWdnaW5nKCk7XG4gICAgfSxcbiAgICBbb25Ecm9wLCByZXNldERyYWdnaW5nXVxuICApO1xuXG4gIGNvbnN0IHN0b3BGcmFtZUxpc3RlbmVycyA9IHVzZUNhbGxiYWNrKFxuICAgIGZyYW1lID0+IHtcbiAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVGcmFtZURyYWcpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCBoYW5kbGVGcmFtZURyYWcpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRnJhbWVEcm9wKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVGcmFtZURyYWcsIGhhbmRsZUZyYW1lRHJvcF1cbiAgKTtcblxuICBjb25zdCBzdGFydEZyYW1lTGlzdGVuZXJzID0gdXNlQ2FsbGJhY2soXG4gICAgZnJhbWUgPT4ge1xuICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGhhbmRsZUZyYW1lRHJhZyk7XG4gICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIGhhbmRsZUZyYW1lRHJhZyk7XG4gICAgICAgIGZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVGcmFtZURyb3ApO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUZyYW1lRHJhZywgaGFuZGxlRnJhbWVEcm9wXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY29tcG9uZW50RGlkVXBkYXRlXG4gICAgaWYgKHByZXZGcmFtZS5jdXJyZW50ICE9PSBmcmFtZSkge1xuICAgICAgcmVzZXREcmFnZ2luZygpO1xuICAgICAgc3RvcEZyYW1lTGlzdGVuZXJzKHByZXZGcmFtZS5jdXJyZW50KTtcbiAgICAgIHN0YXJ0RnJhbWVMaXN0ZW5lcnMoZnJhbWUpO1xuXG4gICAgICBwcmV2RnJhbWUuY3VycmVudCA9IGZyYW1lO1xuICAgIH1cbiAgfSwgW2ZyYW1lLCByZXNldERyYWdnaW5nLCBzdG9wRnJhbWVMaXN0ZW5lcnMsIHN0YXJ0RnJhbWVMaXN0ZW5lcnNdKTtcblxuICAvLyBSZW5kZXJcbiAgbGV0IGZpbGVEcm9wVGFyZ2V0Q2xhc3NOYW1lID0gdGFyZ2V0Q2xhc3NOYW1lO1xuICBpZiAoZHJhZ2dpbmdPdmVyRnJhbWUpIGZpbGVEcm9wVGFyZ2V0Q2xhc3NOYW1lICs9IGAgJHtkcmFnZ2luZ092ZXJGcmFtZUNsYXNzTmFtZX1gO1xuICBpZiAoZHJhZ2dpbmdPdmVyVGFyZ2V0KSBmaWxlRHJvcFRhcmdldENsYXNzTmFtZSArPSBgICR7ZHJhZ2dpbmdPdmVyVGFyZ2V0Q2xhc3NOYW1lfWA7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgIG9uRHJhZ092ZXI9e2hhbmRsZURyYWdPdmVyfVxuICAgICAgb25EcmFnTGVhdmU9e2hhbmRsZURyYWdMZWF2ZX1cbiAgICAgIG9uRHJvcD17aGFuZGxlRHJvcH1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17ZmlsZURyb3BUYXJnZXRDbGFzc05hbWV9PntjaGlsZHJlbn08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVEcm9wO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFBbUMsU0FBQUcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFMLHdCQUFBSyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBYyxDQUFBLFVBQUFHLENBQUEsS0FB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
;