UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

281 lines (279 loc) 42.8 kB
"use strict"; 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]) { if (debounceTimeout) { clearTimeout(debounceTimeout); } var _resultCoordinates = (0, _slicedToArray2["default"])(resultCoordinates, 3), _isValid = _resultCoordinates[0], longitude = _resultCoordinates[1], latitude = _resultCoordinates[2]; setShowResults(true); 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: "16px", 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9nZW9jb2RpbmciLCJfcmVhY3RJbnRsIiwiX3ZpZXdwb3J0TWVyY2F0b3JQcm9qZWN0IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pY29ucyIsIl91dGlscyIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIkNPT1JESU5BVEVfUkVHRVhfU1RSSU5HIiwiQ09PUkRJTkFURV9SRUdFWCIsIlJlZ0V4cCIsIlBMQUNFSE9MREVSIiwiZGVib3VuY2VUaW1lb3V0IiwidGVzdEZvckNvb3JkaW5hdGVzIiwiZXhwb3J0cyIsInF1ZXJ5IiwiaXNWYWxpZCIsInRlc3QiLCJ0cmltIiwidG9rZW5zIiwic3BsaXQiLCJsYXRpdHVkZSIsIk51bWJlciIsImxvbmdpdHVkZSIsIlN0eWxlZENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInRleHRDb2xvciIsImJveFNoYWRvdyIsImdlb2NvZGVySW5wdXRIZWlnaHQiLCJzdWJ0ZXh0Q29sb3IiLCJwYW5lbEJhY2tncm91bmQiLCJpc0Zpbml0ZSIsIndpZHRoIiwiZ2VvY29kZXJXaWR0aCIsImRyb3Bkb3duV2FwcGVyTWFyZ2luIiwiZHJvcGRvd25MaXN0SXRlbSIsInRleHRUcnVuY2F0ZSIsImRyb3Bkb3duTGlzdEhpZ2hsaWdodEJnIiwidGV4dENvbG9ySGwiLCJHZW9Db2RlciIsIl9yZWYiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIl9yZWYkY2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiX3JlZiRsaW1pdCIsImxpbWl0IiwiX3JlZiR0aW1lb3V0IiwidGltZW91dCIsIl9yZWYkZm9ybWF0SXRlbSIsImZvcm1hdEl0ZW0iLCJpdGVtIiwicGxhY2VfbmFtZSIsInZpZXdwb3J0Iiwib25TZWxlY3RlZCIsIm9uRGVsZXRlTWFya2VyIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwicG9pbnRab29tIiwiaW50bCIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImlucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJzaG93UmVzdWx0cyIsInNldFNob3dSZXN1bHRzIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93RGVsZXRlIiwic2V0U2hvd0RlbGV0ZSIsImluaXRpYWxSZXN1bHRzIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJyZXN1bHRzIiwic2V0UmVzdWx0cyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUxMCIsInNlbGVjdGVkSW5kZXgiLCJzZXRTZWxlY3RlZEluZGV4IiwiY2xpZW50IiwidXNlTWVtbyIsImlzVGVzdCIsImdlb2NvZGVyU2VydmljZSIsImFjY2Vzc1Rva2VuIiwib25DaGFuZ2UiLCJ1c2VDYWxsYmFjayIsImV2ZW50IiwicXVlcnlTdHJpbmciLCJ0YXJnZXQiLCJ2YWx1ZSIsInJlc3VsdENvb3JkaW5hdGVzIiwiY2xlYXJUaW1lb3V0IiwiX3Jlc3VsdENvb3JkaW5hdGVzIiwiX2lzVmFsaWQiLCJjZW50ZXIiLCJzZXRUaW1lb3V0IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJyZXNwb25zZSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJCb29sZWFuIiwiZm9yd2FyZEdlb2NvZGUiLCJzZW5kIiwic2VudCIsImJvZHkiLCJmZWF0dXJlcyIsInQwIiwiY29uc29sZSIsImxvZyIsInN0b3AiLCJvbkJsdXIiLCJvbkZvY3VzIiwib25JdGVtU2VsZWN0ZWQiLCJuZXdWaWV3cG9ydCIsIldlYk1lcmNhdG9yVmlld3BvcnQiLCJiYm94IiwiZ290b1ZpZXdwb3J0IiwiZml0Qm91bmRzIiwiem9vbSIsIm9uTWFya0RlbGV0ZWQiLCJvbktleURvd24iLCJrZXlDb2RlIiwiS2V5RXZlbnQiLCJET01fVktfVVAiLCJET01fVktfRE9XTiIsIkRPTV9WS19FTlRFUiIsIkRPTV9WS19SRVRVUk4iLCJjcmVhdGVFbGVtZW50IiwiU2VhcmNoIiwiaGVpZ2h0IiwiSW5wdXQiLCJ0eXBlIiwicGxhY2Vob2xkZXIiLCJmb3JtYXRNZXNzYWdlIiwiaWQiLCJkZWZhdWx0TWVzc2FnZSIsIkRlbGV0ZSIsIm9uQ2xpY2siLCJtYXAiLCJpbmRleCIsImtleSIsImNsYXNzbmFtZXMiLCJhY3RpdmUiLCJfZGVmYXVsdCIsImluamVjdEludGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VvY29kZXIvZ2VvY29kZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBnZW9jb2RlclNlcnZpY2UgZnJvbSAnQG1hcGJveC9tYXBib3gtc2RrL3NlcnZpY2VzL2dlb2NvZGluZyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1dlYk1lcmNhdG9yVmlld3BvcnR9IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHtLZXlFdmVudH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtJbnB1dH0gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7U2VhcmNoLCBEZWxldGV9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge1ZpZXdwb3J0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7aXNUZXN0fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxudHlwZSBTdHlsZWRDb250YWluZXJQcm9wcyA9IHtcbiAgd2lkdGg/OiBudW1iZXI7XG59O1xuXG4vLyBtYXRjaGVzIG9ubHkgdmFsaWQgY29vcmRpbmF0ZXNcbmNvbnN0IENPT1JESU5BVEVfUkVHRVhfU1RSSU5HID1cbiAgJyheWy0rXT8oPzpbMS04XT9cXFxcZCg/OlxcXFwuXFxcXGQrKT98OTAoPzpcXFxcLjArKT8pKSxcXFxccyooWy0rXT8oPzoxODAoPzpcXFxcLjArKT98KD86KD86MVswLTddXFxcXGQpfCg/OlsxLTldP1xcXFxkKSkoPzpcXFxcLlxcXFxkKyk/KSkkJztcblxuY29uc3QgQ09PUkRJTkFURV9SRUdFWCA9IFJlZ0V4cChDT09SRElOQVRFX1JFR0VYX1NUUklORyk7XG5cbmNvbnN0IFBMQUNFSE9MREVSID0gJ0VudGVyIGFuIGFkZHJlc3Mgb3IgY29vcmRpbmF0ZXMsIGV4IDM3Ljc5LC0xMjIuNDAnO1xuXG5sZXQgZGVib3VuY2VUaW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgZ2l2ZW4gcXVlcnkgc3RyaW5nIGNvbnRhaW5zIHZhbGlkIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHF1ZXJ5IFRoZSBpbnB1dCBzdHJpbmcgdG8gdGVzdCBmb3IgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyBBIHR1cGxlIHdoZXJlOlxuICogICAtIElmIHZhbGlkLCByZXR1cm5zIGBbdHJ1ZSwgbG9uZ2l0dWRlLCBsYXRpdHVkZV1gLlxuICogICAtIElmIGludmFsaWQsIHJldHVybnMgYFtmYWxzZSwgcXVlcnldYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlc3RGb3JDb29yZGluYXRlcyA9IChxdWVyeTogc3RyaW5nKTogW3RydWUsIG51bWJlciwgbnVtYmVyXSB8IFtmYWxzZSwgc3RyaW5nXSA9PiB7XG4gIGNvbnN0IGlzVmFsaWQgPSBDT09SRElOQVRFX1JFR0VYLnRlc3QocXVlcnkudHJpbSgpKTtcblxuICBpZiAoIWlzVmFsaWQpIHtcbiAgICByZXR1cm4gW2lzVmFsaWQsIHF1ZXJ5XTtcbiAgfVxuXG4gIGNvbnN0IHRva2VucyA9IHF1ZXJ5LnRyaW0oKS5zcGxpdCgnLCcpO1xuICBjb25zdCBsYXRpdHVkZSA9IE51bWJlcih0b2tlbnNbMF0pO1xuICBjb25zdCBsb25naXR1ZGUgPSBOdW1iZXIodG9rZW5zWzFdKTtcblxuICByZXR1cm4gW2lzVmFsaWQsIGxvbmdpdHVkZSwgbGF0aXR1ZGVdO1xufTtcblxuY29uc3QgU3R5bGVkQ29udGFpbmVyID0gc3R5bGVkLmRpdjxTdHlsZWRDb250YWluZXJQcm9wcz5gXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcblxuICAuZ2VvY29kZXItaW5wdXQge1xuICAgIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYm94U2hhZG93fTtcblxuICAgIC5nZW9jb2Rlci1pbnB1dF9fc2VhcmNoIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5nZW9jb2RlcklucHV0SGVpZ2h0fXB4O1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIH1cblxuICAgIGlucHV0IHtcbiAgICAgIHBhZGRpbmc6IDRweCAzNnB4O1xuICAgICAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdlb2NvZGVySW5wdXRIZWlnaHR9cHg7XG4gICAgICBjYXJldC1jb2xvcjogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgLmdlb2NvZGVyLXJlc3VsdHMge1xuICAgIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYm94U2hhZG93fTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZH07XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAke3Byb3BzID0+IChOdW1iZXIuaXNGaW5pdGUocHJvcHMud2lkdGgpID8gcHJvcHMud2lkdGggOiBwcm9wcy50aGVtZS5nZW9jb2RlcldpZHRoKX1weDtcbiAgICBtYXJnaW4tdG9wOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV2FwcGVyTWFyZ2lufXB4O1xuICB9XG5cbiAgLmdlb2NvZGVyLWl0ZW0ge1xuICAgICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0SXRlbX07XG4gICAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0VHJ1bmNhdGV9O1xuXG4gICAgJi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RIaWdobGlnaHRCZ307XG4gICAgfVxuICB9XG5cbiAgLnJlbW92ZS1yZXN1bHQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMTZweDtcbiAgICB0b3A6IDBweDtcbiAgICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZ2VvY29kZXJJbnB1dEhlaWdodH1weDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0IHtcbiAgY2VudGVyOiBbbnVtYmVyLCBudW1iZXJdO1xuICBwbGFjZV9uYW1lOiBzdHJpbmc7XG4gIGJib3g/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgdGV4dD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUmVzdWx0cyA9IFJlYWRvbmx5QXJyYXk8UmVzdWx0PjtcblxudHlwZSBHZW9jb2RlclByb3BzID0ge1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIGxpbWl0PzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBmb3JtYXRJdGVtPzogKGl0ZW06IFJlc3VsdCkgPT4gc3RyaW5nO1xuICB2aWV3cG9ydD86IFZpZXdwb3J0O1xuICBvblNlbGVjdGVkOiAodmlld3BvcnQ6IFZpZXdwb3J0IHwgbnVsbCwgaXRlbTogUmVzdWx0KSA9PiB2b2lkO1xuICBvbkRlbGV0ZU1hcmtlcj86ICgpID0+IHZvaWQ7XG4gIHRyYW5zaXRpb25EdXJhdGlvbj86IG51bWJlcjtcbiAgcG9pbnRab29tPzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbn07XG5cbnR5cGUgSW50bFByb3BzID0ge1xuICBpbnRsOiBJbnRsU2hhcGU7XG59O1xuXG5jb25zdCBHZW9Db2RlcjogUmVhY3QuRkM8R2VvY29kZXJQcm9wcyAmIEludGxQcm9wcz4gPSAoe1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgY2xhc3NOYW1lID0gJycsXG4gIGxpbWl0ID0gNSxcbiAgdGltZW91dCA9IDMwMCxcbiAgZm9ybWF0SXRlbSA9IGl0ZW0gPT4gaXRlbS5wbGFjZV9uYW1lLFxuICB2aWV3cG9ydCxcbiAgb25TZWxlY3RlZCxcbiAgb25EZWxldGVNYXJrZXIsXG4gIHRyYW5zaXRpb25EdXJhdGlvbixcbiAgcG9pbnRab29tLFxuICB3aWR0aCxcbiAgaW50bFxufSkgPT4ge1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzaG93UmVzdWx0cywgc2V0U2hvd1Jlc3VsdHNdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd0RlbGV0ZSwgc2V0U2hvd0RlbGV0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGluaXRpYWxSZXN1bHRzOiBSZXN1bHRbXSA9IFtdO1xuICBjb25zdCBbcmVzdWx0cywgc2V0UmVzdWx0c10gPSB1c2VTdGF0ZShpbml0aWFsUmVzdWx0cyk7XG4gIGNvbnN0IFtzZWxlY3RlZEluZGV4LCBzZXRTZWxlY3RlZEluZGV4XSA9IHVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKGlzVGVzdCgpID8gbnVsbCA6IGdlb2NvZGVyU2VydmljZSh7YWNjZXNzVG9rZW46IG1hcGJveEFwaUFjY2Vzc1Rva2VufSkpLFxuICAgIFttYXBib3hBcGlBY2Nlc3NUb2tlbl1cbiAgKTtcblxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgc2V0SW5wdXRWYWx1ZShxdWVyeVN0cmluZyk7XG4gICAgICBjb25zdCByZXN1bHRDb29yZGluYXRlcyA9IHRlc3RGb3JDb29yZGluYXRlcyhxdWVyeVN0cmluZyk7XG4gICAgICBpZiAocmVzdWx0Q29vcmRpbmF0ZXNbMF0pIHtcbiAgICAgICAgaWYgKGRlYm91bmNlVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFtfaXNWYWxpZCwgbG9uZ2l0dWRlLCBsYXRpdHVkZV0gPSByZXN1bHRDb29yZGluYXRlcztcbiAgICAgICAgc2V0U2hvd1Jlc3VsdHModHJ1ZSk7XG4gICAgICAgIHNldFJlc3VsdHMoW3tjZW50ZXI6IFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgcGxhY2VfbmFtZTogcXVlcnlTdHJpbmd9XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVib3VuY2VUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVib3VuY2VUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKGxpbWl0ID4gMCAmJiBCb29sZWFuKHF1ZXJ5U3RyaW5nKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgICAgICAgICAuZm9yd2FyZEdlb2NvZGUoe1xuICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5U3RyaW5nLFxuICAgICAgICAgICAgICAgICAgbGltaXRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zZW5kKCk7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgc2V0U2hvd1Jlc3VsdHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2V0UmVzdWx0cyhyZXNwb25zZS5ib2R5LmZlYXR1cmVzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBzaG93IGdlb2NvZGUgZXJyb3JcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjbGllbnQsIGxpbWl0LCB0aW1lb3V0LCBzZXRSZXN1bHRzLCBzZXRTaG93UmVzdWx0c11cbiAgKTtcblxuICBjb25zdCBvbkJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXRTaG93UmVzdWx0cyhmYWxzZSk7XG4gICAgfSwgdGltZW91dCk7XG4gIH0sIFtzZXRTaG93UmVzdWx0cywgdGltZW91dF0pO1xuXG4gIGNvbnN0IG9uRm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiBzZXRTaG93UmVzdWx0cyh0cnVlKSwgW3NldFNob3dSZXN1bHRzXSk7XG5cbiAgY29uc3Qgb25JdGVtU2VsZWN0ZWQgPSB1c2VDYWxsYmFjayhcbiAgICBpdGVtID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgY29uc3Qge2Jib3gsIGNlbnRlcn0gPSBpdGVtO1xuXG4gICAgICBjb25zdCBnb3RvVmlld3BvcnQgPSBiYm94XG4gICAgICAgID8gbmV3Vmlld3BvcnQuZml0Qm91bmRzKFtcbiAgICAgICAgICAgIFtiYm94WzBdLCBiYm94WzFdXSxcbiAgICAgICAgICAgIFtiYm94WzJdLCBiYm94WzNdXVxuICAgICAgICAgIF0pXG4gICAgICAgIDoge1xuICAgICAgICAgICAgbG9uZ2l0dWRlOiBjZW50ZXJbMF0sXG4gICAgICAgICAgICBsYXRpdHVkZTogY2VudGVyWzFdLFxuICAgICAgICAgICAgem9vbTogcG9pbnRab29tXG4gICAgICAgICAgfTtcblxuICAgICAgY29uc3Qge2xvbmdpdHVkZSwgbGF0aXR1ZGUsIHpvb219ID0gZ290b1ZpZXdwb3J0O1xuXG4gICAgICBvblNlbGVjdGVkKHsuLi52aWV3cG9ydCwgLi4ue2xvbmdpdHVkZSwgbGF0aXR1ZGUsIHpvb20sIHRyYW5zaXRpb25EdXJhdGlvbn19LCBpdGVtKTtcblxuICAgICAgc2V0U2hvd1Jlc3VsdHMoZmFsc2UpO1xuICAgICAgc2V0SW5wdXRWYWx1ZShmb3JtYXRJdGVtKGl0ZW0pKTtcbiAgICAgIHNldFNob3dEZWxldGUodHJ1ZSk7XG4gICAgfSxcbiAgICBbdmlld3BvcnQsIG9uU2VsZWN0ZWQsIHRyYW5zaXRpb25EdXJhdGlvbiwgcG9pbnRab29tLCBmb3JtYXRJdGVtXVxuICApO1xuXG4gIGNvbnN0IG9uTWFya0RlbGV0ZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2hvd0RlbGV0ZShmYWxzZSk7XG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgb25EZWxldGVNYXJrZXI/LigpO1xuICB9LCBbb25EZWxldGVNYXJrZXJdKTtcblxuICBjb25zdCBvbktleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICBlID0+IHtcbiAgICAgIGlmICghcmVzdWx0cyB8fCByZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19VUDpcbiAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KHNlbGVjdGVkSW5kZXggPiAwID8gc2VsZWN0ZWRJbmRleCAtIDEgOiBzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfRE9XTjpcbiAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KHNlbGVjdGVkSW5kZXggPCByZXN1bHRzLmxlbmd0aCAtIDEgPyBzZWxlY3RlZEluZGV4ICsgMSA6IHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEtleUV2ZW50LkRPTV9WS19FTlRFUjpcbiAgICAgICAgY2FzZSBLZXlFdmVudC5ET01fVktfUkVUVVJOOlxuICAgICAgICAgIGlmIChyZXN1bHRzW3NlbGVjdGVkSW5kZXhdKSB7XG4gICAgICAgICAgICBvbkl0ZW1TZWxlY3RlZChyZXN1bHRzW3NlbGVjdGVkSW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVzdWx0cywgc2VsZWN0ZWRJbmRleCwgc2V0U2VsZWN0ZWRJbmRleCwgb25JdGVtU2VsZWN0ZWRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQ29udGFpbmVyIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSB3aWR0aD17d2lkdGh9PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJnZW9jb2Rlci1pbnB1dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdlb2NvZGVyLWlucHV0X19zZWFyY2hcIj5cbiAgICAgICAgICA8U2VhcmNoIGhlaWdodD1cIjIwcHhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPElucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcbiAgICAgICAgICAgIGludGxcbiAgICAgICAgICAgICAgPyBpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnZ2VvY29kZXIudGl0bGUnLCBkZWZhdWx0TWVzc2FnZTogUExBQ0VIT0xERVJ9KVxuICAgICAgICAgICAgICA6IFBMQUNFSE9MREVSXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgICB7c2hvd0RlbGV0ZSA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbW92ZS1yZXN1bHRcIj5cbiAgICAgICAgICAgIDxEZWxldGUgaGVpZ2h0PVwiMTZweFwiIG9uQ2xpY2s9e29uTWFya0RlbGV0ZWR9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtzaG93UmVzdWx0cyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnZW9jb2Rlci1yZXN1bHRzXCI+XG4gICAgICAgICAge3Jlc3VsdHMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2dlb2NvZGVyLWl0ZW0nLCB7YWN0aXZlOiBzZWxlY3RlZEluZGV4ID09PSBpbmRleH0pfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkl0ZW1TZWxlY3RlZChpdGVtKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Zvcm1hdEl0ZW0oaXRlbSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogbnVsbH1cbiAgICA8L1N0eWxlZENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZh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