kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
277 lines (275 loc) • 42.4 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.testForCoordinates = exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _geocoding = _interopRequireDefault(require("@mapbox/mapbox-sdk/services/geocoding"));
var _reactIntl = require("react-intl");
var _viewportMercatorProject = require("viewport-mercator-project");
var _constants = require("@kepler.gl/constants");
var _styledComponents2 = require("../common/styled-components");
var _icons = require("../common/icons");
var _utils = require("@kepler.gl/utils");
var _templateObject; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
// matches only valid coordinates
var COORDINATE_REGEX_STRING = '(^[-+]?(?:[1-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?)),\\s*([-+]?(?:180(?:\\.0+)?|(?:(?:1[0-7]\\d)|(?:[1-9]?\\d))(?:\\.\\d+)?))$';
var COORDINATE_REGEX = RegExp(COORDINATE_REGEX_STRING);
var PLACEHOLDER = 'Enter an address or coordinates, ex 37.79,-122.40';
var debounceTimeout = null;
/**
* Tests if a given query string contains valid coordinates.
* @param query The input string to test for coordinates.
* @returns A tuple where:
* - If valid, returns `[true, longitude, latitude]`.
* - If invalid, returns `[false, query]`.
*/
var testForCoordinates = exports.testForCoordinates = function testForCoordinates(query) {
var isValid = COORDINATE_REGEX.test(query.trim());
if (!isValid) {
return [isValid, query];
}
var tokens = query.trim().split(',');
var latitude = Number(tokens[0]);
var longitude = Number(tokens[1]);
return [isValid, longitude, latitude];
};
var StyledContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n color: ", ";\n\n .geocoder-input {\n box-shadow: ", ";\n\n .geocoder-input__search {\n position: absolute;\n height: ", "px;\n width: 30px;\n padding-left: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ", ";\n }\n\n input {\n padding: 4px 36px;\n height: ", "px;\n caret-color: unset;\n }\n }\n\n .geocoder-results {\n box-shadow: ", ";\n background-color: ", ";\n position: absolute;\n width: ", "px;\n margin-top: ", "px;\n }\n\n .geocoder-item {\n ", ";\n ", ";\n\n &.active {\n background-color: ", ";\n }\n }\n\n .remove-result {\n position: absolute;\n right: 16px;\n top: 0px;\n height: ", "px;\n display: flex;\n align-items: center;\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n }\n"])), function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.boxShadow;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.boxShadow;
}, function (props) {
return props.theme.panelBackground;
}, function (props) {
return Number.isFinite(props.width) ? props.width : props.theme.geocoderWidth;
}, function (props) {
return props.theme.dropdownWapperMargin;
}, function (props) {
return props.theme.dropdownListItem;
}, function (props) {
return props.theme.textTruncate;
}, function (props) {
return props.theme.dropdownListHighlightBg;
}, function (props) {
return props.theme.geocoderInputHeight;
}, function (props) {
return props.theme.textColorHl;
});
var GeoCoder = function GeoCoder(_ref) {
var mapboxApiAccessToken = _ref.mapboxApiAccessToken,
_ref$className = _ref.className,
className = _ref$className === void 0 ? '' : _ref$className,
_ref$limit = _ref.limit,
limit = _ref$limit === void 0 ? 5 : _ref$limit,
_ref$timeout = _ref.timeout,
timeout = _ref$timeout === void 0 ? 300 : _ref$timeout,
_ref$formatItem = _ref.formatItem,
formatItem = _ref$formatItem === void 0 ? function (item) {
return item.place_name;
} : _ref$formatItem,
viewport = _ref.viewport,
onSelected = _ref.onSelected,
onDeleteMarker = _ref.onDeleteMarker,
transitionDuration = _ref.transitionDuration,
pointZoom = _ref.pointZoom,
width = _ref.width,
intl = _ref.intl;
var _useState = (0, _react.useState)(''),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
inputValue = _useState2[0],
setInputValue = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
showResults = _useState4[0],
setShowResults = _useState4[1];
var _useState5 = (0, _react.useState)(false),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
showDelete = _useState6[0],
setShowDelete = _useState6[1];
var initialResults = [];
var _useState7 = (0, _react.useState)(initialResults),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
results = _useState8[0],
setResults = _useState8[1];
var _useState9 = (0, _react.useState)(0),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
selectedIndex = _useState10[0],
setSelectedIndex = _useState10[1];
var client = (0, _react.useMemo)(function () {
return (0, _utils.isTest)() ? null : (0, _geocoding["default"])({
accessToken: mapboxApiAccessToken
});
}, [mapboxApiAccessToken]);
var onChange = (0, _react.useCallback)(function (event) {
var queryString = event.target.value;
setInputValue(queryString);
var resultCoordinates = testForCoordinates(queryString);
if (resultCoordinates[0]) {
var _resultCoordinates = (0, _slicedToArray2["default"])(resultCoordinates, 3),
_isValid = _resultCoordinates[0],
longitude = _resultCoordinates[1],
latitude = _resultCoordinates[2];
setResults([{
center: [longitude, latitude],
place_name: queryString
}]);
} else {
if (debounceTimeout) {
clearTimeout(debounceTimeout);
}
debounceTimeout = setTimeout( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var response;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(limit > 0 && Boolean(queryString))) {
_context.next = 11;
break;
}
_context.prev = 1;
_context.next = 4;
return client.forwardGeocode({
query: queryString,
limit: limit
}).send();
case 4:
response = _context.sent;
if (response.body.features) {
setShowResults(true);
setResults(response.body.features);
}
_context.next = 11;
break;
case 8:
_context.prev = 8;
_context.t0 = _context["catch"](1);
// TODO: show geocode error
// eslint-disable-next-line no-console
console.log(_context.t0);
case 11:
case "end":
return _context.stop();
}
}, _callee, null, [[1, 8]]);
})), timeout);
}
}, [client, limit, timeout, setResults, setShowResults]);
var onBlur = (0, _react.useCallback)(function () {
setTimeout(function () {
setShowResults(false);
}, timeout);
}, [setShowResults, timeout]);
var onFocus = (0, _react.useCallback)(function () {
return setShowResults(true);
}, [setShowResults]);
var onItemSelected = (0, _react.useCallback)(function (item) {
var newViewport = new _viewportMercatorProject.WebMercatorViewport(viewport);
var bbox = item.bbox,
center = item.center;
var gotoViewport = bbox ? newViewport.fitBounds([[bbox[0], bbox[1]], [bbox[2], bbox[3]]]) : {
longitude: center[0],
latitude: center[1],
zoom: pointZoom
};
var longitude = gotoViewport.longitude,
latitude = gotoViewport.latitude,
zoom = gotoViewport.zoom;
onSelected(_objectSpread(_objectSpread({}, viewport), {
longitude: longitude,
latitude: latitude,
zoom: zoom,
transitionDuration: transitionDuration
}), item);
setShowResults(false);
setInputValue(formatItem(item));
setShowDelete(true);
}, [viewport, onSelected, transitionDuration, pointZoom, formatItem]);
var onMarkDeleted = (0, _react.useCallback)(function () {
setShowDelete(false);
setInputValue('');
onDeleteMarker === null || onDeleteMarker === void 0 || onDeleteMarker();
}, [onDeleteMarker]);
var onKeyDown = (0, _react.useCallback)(function (e) {
if (!results || results.length === 0) {
return;
}
switch (e.keyCode) {
case _constants.KeyEvent.DOM_VK_UP:
setSelectedIndex(selectedIndex > 0 ? selectedIndex - 1 : selectedIndex);
break;
case _constants.KeyEvent.DOM_VK_DOWN:
setSelectedIndex(selectedIndex < results.length - 1 ? selectedIndex + 1 : selectedIndex);
break;
case _constants.KeyEvent.DOM_VK_ENTER:
case _constants.KeyEvent.DOM_VK_RETURN:
if (results[selectedIndex]) {
onItemSelected(results[selectedIndex]);
}
break;
default:
break;
}
}, [results, selectedIndex, setSelectedIndex, onItemSelected]);
return /*#__PURE__*/_react["default"].createElement(StyledContainer, {
className: className,
width: width
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-input"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-input__search"
}, /*#__PURE__*/_react["default"].createElement(_icons.Search, {
height: "20px"
})), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Input, {
type: "text",
onChange: onChange,
onBlur: onBlur,
onFocus: onFocus,
onKeyDown: onKeyDown,
value: inputValue,
placeholder: intl ? intl.formatMessage({
id: 'geocoder.title',
defaultMessage: PLACEHOLDER
}) : PLACEHOLDER
}), showDelete ? /*#__PURE__*/_react["default"].createElement("div", {
className: "remove-result"
}, /*#__PURE__*/_react["default"].createElement(_icons.Delete, {
height: "12px",
onClick: onMarkDeleted
})) : null), showResults ? /*#__PURE__*/_react["default"].createElement("div", {
className: "geocoder-results"
}, results.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement("div", {
key: index,
className: (0, _classnames["default"])('geocoder-item', {
active: selectedIndex === index
}),
onClick: function onClick() {
return onItemSelected(item);
}
}, formatItem(item));
})) : null);
};
var _default = exports["default"] = (0, _reactIntl.injectIntl)(GeoCoder);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9nZW9jb2RpbmciLCJfcmVhY3RJbnRsIiwiX3ZpZXdwb3J0TWVyY2F0b3JQcm9qZWN0IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pY29ucyIsIl91dGlscyIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIkNPT1JESU5BVEVfUkVHRVhfU1RSSU5HIiwiQ09PUkRJTkFURV9SRUdFWCIsIlJlZ0V4cCIsIlBMQUNFSE9MREVSIiwiZGVib3VuY2VUaW1lb3V0IiwidGVzdEZvckNvb3JkaW5hdGVzIiwiZXhwb3J0cyIsInF1ZXJ5IiwiaXNWYWxpZCIsInRlc3QiLCJ0cmltIiwidG9rZW5zIiwic3BsaXQiLCJsYXRpdHVkZSIsIk51bWJlciIsImxvbmdpdHVkZSIsIlN0eWxlZENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInRleHRDb2xvciIsImJveFNoYWRvdyIsImdlb2NvZGVySW5wdXRIZWlnaHQiLCJzdWJ0ZXh0Q29sb3IiLCJwYW5lbEJhY2tncm91bmQiLCJpc0Zpbml0ZSIsIndpZHRoIiwiZ2VvY29kZXJXaWR0aCIsImRyb3Bkb3duV2FwcGVyTWFyZ2luIiwiZHJvcGRvd25MaXN0SXRlbSIsInRleHRUcnVuY2F0ZSIsImRyb3Bkb3duTGlzdEhpZ2hsaWdodEJnIiwidGV4dENvbG9ySGwiLCJHZW9Db2RlciIsIl9yZWYiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIl9yZWYkY2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiX3JlZiRsaW1pdCIsImxpbWl0IiwiX3JlZiR0aW1lb3V0IiwidGltZW91dCIsIl9yZWYkZm9ybWF0SXRlbSIsImZvcm1hdEl0ZW0iLCJpdGVtIiwicGxhY2VfbmFtZSIsInZpZXdwb3J0Iiwib25TZWxlY3RlZCIsIm9uRGVsZXRlTWFya2VyIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwicG9pbnRab29tIiwiaW50bCIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImlucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJzaG93UmVzdWx0cyIsInNldFNob3dSZXN1bHRzIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93RGVsZXRlIiwic2V0U2hvd0RlbGV0ZSIsImluaXRpYWxSZXN1bHRzIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJyZXN1bHRzIiwic2V0UmVzdWx0cyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUxMCIsInNlbGVjdGVkSW5kZXgiLCJzZXRTZWxlY3RlZEluZGV4IiwiY2xpZW50IiwidXNlTWVtbyIsImlzVGVzdCIsImdlb2NvZGVyU2VydmljZSIsImFjY2Vzc1Rva2VuIiwib25DaGFuZ2UiLCJ1c2VDYWxsYmFjayIsImV2ZW50IiwicXVlcnlTdHJpbmciLCJ0YXJnZXQiLCJ2YWx1ZSIsInJlc3VsdENvb3JkaW5hdGVzIiwiX3Jlc3VsdENvb3JkaW5hdGVzIiwiX2lzVmFsaWQiLCJjZW50ZXIiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJyZXNwb25zZSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJCb29sZWFuIiwiZm9yd2FyZEdlb2NvZGUiLCJzZW5kIiwic2VudCIsImJvZHkiLCJmZWF0dXJlcyIsInQwIiwiY29uc29sZSIsImxvZyIsInN0b3AiLCJvbkJsdXIiLCJvbkZvY3VzIiwib25JdGVtU2VsZWN0ZWQiLCJuZXdWaWV3cG9ydCIsIldlYk1lcmNhdG9yVmlld3BvcnQiLCJiYm94IiwiZ290b1ZpZXdwb3J0IiwiZml0Qm91bmRzIiwiem9vbSIsIm9uTWFya0RlbGV0ZWQiLCJvbktleURvd24iLCJrZXlDb2RlIiwiS2V5RXZlbnQiLCJET01fVktfVVAiLCJET01fVktfRE9XTiIsIkRPTV9WS19FTlRFUiIsIkRPTV9WS19SRVRVUk4iLCJjcmVhdGVFbGVtZW50IiwiU2VhcmNoIiwiaGVpZ2h0IiwiSW5wdXQiLCJ0eXBlIiwicGxhY2Vob2xkZXIiLCJmb3JtYXRNZXNzYWdlIiwiaWQiLCJkZWZhdWx0TWVzc2FnZSIsIkRlbGV0ZSIsIm9uQ2xpY2siLCJtYXAiLCJpbmRleCIsImtleSIsImNsYXNzbmFtZXMiLCJhY3RpdmUiLCJfZGVmYXVsdCIsImluamVjdEludGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VvY29kZXIvZ2VvY29kZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBnZW9jb2RlclNlcnZpY2UgZnJvbSAnQG1hcGJveC9tYXBib3gtc2RrL3NlcnZpY2VzL2dlb2NvZGluZyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1dlYk1lcmNhdG9yVmlld3BvcnR9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHtLZXlFdmVudH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtJbnB1dH0gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7U2VhcmNoLCBEZWxldGV9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge1ZpZXdwb3J0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7aXNUZXN0fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxudHlwZSBTdHlsZWRDb250YWluZXJQcm9wcyA9IHtcbiAgd2lkdGg/OiBudW1iZXI7XG59O1xuXG4vLyBtYXRjaGVzIG9ubHkgdmFsaWQgY29vcmRpbmF0ZXNcbmNvbnN0IENPT1JESU5BVEVfUkVHRVhfU1RSSU5HID1cbiAgJyheWy0rXT8oPzpbMS04XT9cXFxcZCg/OlxcXFwuXFxcXGQrKT98OTAoPzpcXFxcLjArKT8pKSxcXFxccyooWy0rXT8oPzoxODAoPzpcXFxcLjArKT98KD86KD86MVswLTddXFxcXGQpfCg/OlsxLTldP1xcXFxkKSkoPzpcXFxcLlxcXFxkKyk/KSkkJztcblxuY29uc3QgQ09PUkRJTkFURV9SRUdFWCA9IFJlZ0V4cChDT09SRElOQVRFX1JFR0VYX1NUUklORyk7XG5cbmNvbnN0IFBMQUNFSE9MREVSID0gJ0VudGVyIGFuIGFkZHJlc3Mgb3IgY29vcmRpbmF0ZXMsIGV4IDM3Ljc5LC0xMjIuNDAnO1xuXG5sZXQgZGVib3VuY2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgZ2l2ZW4gcXVlcnkgc3RyaW5nIGNvbnRhaW5zIHZhbGlkIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHF1ZXJ5IFRoZSBpbnB1dCBzdHJpbmcgdG8gdGVzdCBmb3IgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyBBIHR1cGxlIHdoZXJlOlxuICogICAtIElmIHZhbGlkLCByZXR1cm5zIGBbdHJ1ZSwgbG9uZ2l0dWRlLCBsYXRpdHVkZV1gLlxuICogICAtIElmIGludmFsaWQsIHJldHVybnMgYFtmYWxzZSwgcXVlcnldYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlc3RGb3JDb29yZGluYXRlcyA9IChxdWVyeTogc3RyaW5nKTogW3RydWUsIG51bWJlciwgbnVtYmVyXSB8IFtmYWxzZSwgc3RyaW5nXSA9PiB7XG4gIGNvbnN0IGlzVmFsaWQgPSBDT09SRElOQVRFX1JFR0VYLnRlc3QocXVlcnkudHJpbSgpKTtcblxuICBpZiAoIWlzVmFsaWQpIHtcbiAgICByZXR1cm4gW2lzVmFsaWQsIHF1ZXJ5XTtcbiAgfVxuXG4gIGNvbnN0IHRva2VucyA9IHF1ZXJ5LnRyaW0oKS5zcGxpdCgnLCcpO1xuICBjb25zdCBsYXRpdHVkZSA9IE51bWJlcih0b2tlbnNbMF0pO1xuICBjb25zdCBsb25naXR1ZGUgPSBOdW1iZXIodG9rZW5zWzFdKTtcblxuICByZXR1cm4gW2lzVmFsaWQsIGxvbmdpdHVkZSwgbGF0aXR1ZGVdO1xufTtcblxuY29uc3QgU3R5bGVkQ29udGFpbmVyID0gc3R5bGVkLmRpdjxTdHlsZWRDb250YWluZXJQcm9wcz5gXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcblxuICAuZ2VvY29kZXItaW5wdXQge1xuICAgIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYm94U2hhZG93fTtcblxuICAgIC5nZW9jb2Rlci1pbnB1dF9fc2VhcmNoIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlcklucHV0SGVpZ2h0fXB4O1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIH1cblxuICAgIGlucHV0IHtcbiAgICAgIHBhZGRpbmc6IDRweCAzNnB4O1xuICAgICAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdlb2NvZGVySW5wdXRIZWlnaHR9cHg7XG4gICAgICBjYXJldC1jb2xvcjogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgLmdlb2NvZGVyLXJlc3VsdHMge1xuICAgIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYm94U2hhZG93fTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZH07XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAke3Byb3BzID0+IChOdW1iZXIuaXNGaW5pdGUocHJvcHMud2lkdGgpID8gcHJvcHMud2lkdGggOiBwcm9wcy50aGVtZS5nZW9jb2RlcldpZHRoKX1weDtcbiAgICBtYXJnaW4tdG9wOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV2FwcGVyTWFyZ2lufXB4O1xuICB9XG5cbiAgLmdlb2NvZGVyLWl0ZW0ge1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0SXRlbX07XG4gICAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0VHJ1bmNhdGV9O1xuXG4gICAgJi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RIaWdobGlnaHRCZ307XG4gICAgfVxuICB9XG5cbiAgLnJlbW92ZS1yZXN1bHQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMTZweDtcbiAgICB0b3A6IDBweDtcbiAgICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZ2VvY29kZXJJbnB1dEhlaWdodH1weDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0IHtcbiAgY2VudGVyOiBbbnVtYmVyLCBudW1iZXJdO1xuICBwbGFjZV9uYW1lOiBzdHJpbmc7XG4gIGJib3g/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUmVzdWx0cyA9IFJlYWRvbmx5QXJyYXk8UmVzdWx0PjtcblxudHlwZSBHZW9jb2RlclByb3BzID0ge1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBmb3JtYXRJdGVtPzogKGl0ZW06IFJlc3VsdCkgPT4gc3RyaW5nO1xuICB2aWV3cG9ydD86IFZpZXdwb3J0O1xuICBvblNlbGVjdGVkOiAodmlld3BvcnQ6IFZpZXdwb3J0IHwgbnVsbCwgaXRlbTogUmVzdWx0KSA9PiB2b2lkO1xuICBvbkRlbGV0ZU1hcmtlcj86ICgpID0+IHZvaWQ7XG4gIHRyYW5zaXRpb25EdXJhdGlvbj86IG51bWJlcjtcbiAgcG9pbnRab29tPzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbn07XG5cbnR5cGUgSW50bFByb3BzID0ge1xuICBpbnRsOiBJbnRsU2hhcGU7XG59O1xuXG5jb25zdCBHZW9Db2RlcjogUmVhY3QuRkM8R2VvY29kZXJQcm9wcyAmIEludGxQcm9wcz4gPSAoe1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgY2xhc3NOYW1lID0gJycsXG4gIGxpbWl0ID0gNSxcbiAgdGltZW91dCA9IDMwMCxcbiAgZm9ybWF0SXRlbSA9IGl0ZW0gPT4gaXRlbS5wbGFjZV9uYW1lLFxuICB2aWV3cG9ydCxcbiAgb25TZWxlY3RlZCxcbiAgb25EZWxldGVNYXJrZXIsXG4gIHRyYW5zaXRpb25EdXJhdGlvbixcbiAgcG9pbnRab29tLFxuICB3aWR0aCxcbiAgaW50bFxufSkgPT4ge1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzaG93UmVzdWx0cywgc2V0U2hvd1Jlc3VsdHNdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd0RlbGV0ZSwgc2V0U2hvd0RlbGV0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGluaXRpYWxSZXN1bHRzOiBSZXN1bHRbXSA9IFtdO1xuICBjb25zdCBbcmVzdWx0cywgc2V0UmVzdWx0c10gPSB1c2VTdGF0ZShpbml0aWFsUmVzdWx0cyk7XG4gIGNvbnN0IFtzZWxlY3RlZEluZGV4LCBzZXRTZWxlY3RlZEluZGV4XSA9IHVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKGlzVGVzdCgpID8gbnVsbCA6IGdlb2NvZGVyU2VydmljZSh7YWNjZXNzVG9rZW46IG1hcGJveEFwaUFjY2Vzc1Rva2VufSkpLFxuICAgIFttYXBib3hBcGlBY2Nlc3NUb2tlbl1cbiAgKTtcblxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgc2V0SW5wdXRWYWx1ZShxdWVyeVN0cmluZyk7XG4gICAgICBjb25zdCByZXN1bHRDb29yZGluYXRlcyA9IHRlc3RGb3JDb29yZGluYXRlcyhxdWVyeVN0cmluZyk7XG4gICAgICBpZiAocmVzdWx0Q29vcmRpbmF0ZXNbMF0pIHtcbiAgICAgICAgY29uc3QgW19pc1ZhbGlkLCBsb25naXR1ZGUsIGxhdGl0dWRlXSA9IHJlc3VsdENvb3JkaW5hdGVzO1xuICAgICAgICBzZXRSZXN1bHRzKFt7Y2VudGVyOiBbbG9uZ2l0dWRlLCBsYXRpdHVkZV0sIHBsYWNlX25hbWU6IHF1ZXJ5U3RyaW5nfV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChsaW1pdCA+IDAgJiYgQm9vbGVhbihxdWVyeVN0cmluZykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgICAgICAgICAgLmZvcndhcmRHZW9jb2RlKHtcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeVN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGxpbWl0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2VuZCgpO1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIHNldFNob3dSZXN1bHRzKHRydWUpO1xuICAgICAgICAgICAgICAgIHNldFJlc3VsdHMocmVzcG9uc2UuYm9keS5mZWF0dXJlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdyBnZW9jb2RlIGVycm9yXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbY2xpZW50LCBsaW1pdCwgdGltZW91dCwgc2V0UmVzdWx0cywgc2V0U2hvd1Jlc3VsdHNdXG4gICk7XG5cbiAgY29uc3Qgb25CbHVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2V0U2hvd1Jlc3VsdHMoZmFsc2UpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9LCBbc2V0U2hvd1Jlc3VsdHMsIHRpbWVvdXRdKTtcblxuICBjb25zdCBvbkZvY3VzID0gdXNlQ2FsbGJhY2soKCkgPT4gc2V0U2hvd1Jlc3VsdHModHJ1ZSksIFtzZXRTaG93UmVzdWx0c10pO1xuXG4gIGNvbnN0IG9uSXRlbVNlbGVjdGVkID0gdXNlQ2FsbGJhY2soXG4gICAgaXRlbSA9PiB7XG4gICAgICBjb25zdCBuZXdWaWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHZpZXdwb3J0KTtcbiAgICAgIGNvbnN0IHtiYm94LCBjZW50ZXJ9ID0gaXRlbTtcblxuICAgICAgY29uc3QgZ290b1ZpZXdwb3J0ID0gYmJveFxuICAgICAgICA/IG5ld1ZpZXdwb3J0LmZpdEJvdW5kcyhbXG4gICAgICAgICAgICBbYmJveFswXSwgYmJveFsxXV0sXG4gICAgICAgICAgICBbYmJveFsyXSwgYmJveFszXV1cbiAgICAgICAgICBdKVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGxvbmdpdHVkZTogY2VudGVyWzBdLFxuICAgICAgICAgICAgbGF0aXR1ZGU6IGNlbnRlclsxXSxcbiAgICAgICAgICAgIHpvb206IHBvaW50Wm9vbVxuICAgICAgICAgIH07XG5cbiAgICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tfSA9IGdvdG9WaWV3cG9ydDtcblxuICAgICAgb25TZWxlY3RlZCh7Li4udmlld3BvcnQsIC4uLntsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCB0cmFuc2l0aW9uRHVyYXRpb259fSwgaXRlbSk7XG5cbiAgICAgIHNldFNob3dSZXN1bHRzKGZhbHNlKTtcbiAgICAgIHNldElucHV0VmFsdWUoZm9ybWF0SXRlbShpdGVtKSk7XG4gICAgICBzZXRTaG93RGVsZXRlKHRydWUpO1xuICAgIH0sXG4gICAgW3ZpZXdwb3J0LCBvblNlbGVjdGVkLCB0cmFuc2l0aW9uRHVyYXRpb24sIHBvaW50Wm9vbSwgZm9ybWF0SXRlbV1cbiAgKTtcblxuICBjb25zdCBvbk1hcmtEZWxldGVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFNob3dEZWxldGUoZmFsc2UpO1xuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIG9uRGVsZXRlTWFya2VyPy4oKTtcbiAgfSwgW29uRGVsZXRlTWFya2VyXSk7XG5cbiAgY29uc3Qgb25LZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgZSA9PiB7XG4gICAgICBpZiAoIXJlc3VsdHMgfHwgcmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfVVA6XG4gICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChzZWxlY3RlZEluZGV4ID4gMCA/IHNlbGVjdGVkSW5kZXggLSAxIDogc2VsZWN0ZWRJbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgS2V5RXZlbnQuRE9NX1ZLX0RPV046XG4gICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChzZWxlY3RlZEluZGV4IDwgcmVzdWx0cy5sZW5ndGggLSAxID8gc2VsZWN0ZWRJbmRleCArIDEgOiBzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfRU5URVI6XG4gICAgICAgIGNhc2UgS2V5RXZlbnQuRE9NX1ZLX1JFVFVSTjpcbiAgICAgICAgICBpZiAocmVzdWx0c1tzZWxlY3RlZEluZGV4XSkge1xuICAgICAgICAgICAgb25JdGVtU2VsZWN0ZWQocmVzdWx0c1tzZWxlY3RlZEluZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Jlc3VsdHMsIHNlbGVjdGVkSW5kZXgsIHNldFNlbGVjdGVkSW5kZXgsIG9uSXRlbVNlbGVjdGVkXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZENvbnRhaW5lciBjbGFzc05hbWU9e2NsYXNzTmFtZX0gd2lkdGg9e3dpZHRofT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2VvY29kZXItaW5wdXRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnZW9jb2Rlci1pbnB1dF9fc2VhcmNoXCI+XG4gICAgICAgICAgPFNlYXJjaCBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICBvbktleURvd249e29uS2V5RG93bn1cbiAgICAgICAgICB2YWx1ZT17aW5wdXRWYWx1ZX1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICBpbnRsXG4gICAgICAgICAgICAgID8gaW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ2dlb2NvZGVyLnRpdGxlJywgZGVmYXVsdE1lc3NhZ2U6IFBMQUNFSE9MREVSfSlcbiAgICAgICAgICAgICAgOiBQTEFDRUhPTERFUlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICAge3Nob3dEZWxldGUgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZW1vdmUtcmVzdWx0XCI+XG4gICAgICAgICAgICA8RGVsZXRlIGhlaWdodD1cIjEycHhcIiBvbkNsaWNrPXtvbk1hcmtEZWxldGVkfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7c2hvd1Jlc3VsdHMgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2VvY29kZXItcmVzdWx0c1wiPlxuICAgICAgICAgIHtyZXN1bHRzLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdnZW9jb2Rlci1pdGVtJywge2FjdGl2ZTogc2VsZWN0ZWRJbmRleCA9PT0gaW5kZXh9KX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25JdGVtU2VsZWN0ZWQoaXRlbSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtmb3JtYXRJdGVtKGl0ZW0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IG51bGx9XG4gICAgPC9TdHlsZWRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKEdlb0NvZGVyKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFD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
;