UNPKG

kepler.gl.geoiq

Version:

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

277 lines (217 loc) 28.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.DatasetTabs = exports.DatasetModalTab = exports.DataTableModal = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _window = _interopRequireDefault(require("global/window")); var _defaultSettings = require("../../constants/default-settings"); var _fieldToken = _interopRequireDefault(require("../common/field-token")); var _datasetLabel = _interopRequireDefault(require("../common/dataset-label")); var _icons = require("../common/icons"); function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-bottom: 3px solid ", ";\n cursor: pointer;\n display: flex;\n height: 35px;\n margin: 0 3px;\n padding: 0 5px;\n\n :first-child {\n margin-left: 0;\n padding-left: 0;\n }\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n padding: 0 ", ";\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .react-grid-Main {\n outline: 0;\n }\n\n .react-grid-Grid {\n border: 0;\n }\n\n .react-grid-Cell {\n border-right: 0;\n border-bottom: ", ";\n padding-left: 16px;\n }\n\n .react-grid-HeaderCell {\n border-right: 0;\n border-bottom: 0;\n background: ", ";\n color: ", ";\n padding: 14px 8px 14px 0;\n }\n .react-grid-Cell:first-child,\n .react-grid-HeaderCell:first-child {\n padding-left: ", ";\n }\n .react-grid-Cell:last-child,\n .react-grid-HeaderCell:last-child {\n padding-right: ", ";\n }\n .react-grid-Cell__value {\n color: ", ";\n }\n .react-grid-Canvas {\n ", ";\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var ReactDataGrid = _window["default"].navigator ? require('react-data-grid/dist/react-data-grid.min') : null; var shouldPreventScrollBack = false; if (_window["default"].navigator && _window["default"].navigator.userAgent) { var navigator = _window["default"].navigator; // Detect browsers // http://stackoverflow.com/questions/5899783/detect-safari-using-jquery var isMac = navigator.userAgent.match(/Macintosh/); var is_chrome = navigator.userAgent.indexOf('Chrome') > -1; var is_safari = navigator.userAgent.indexOf('Safari') > -1; var is_firefox = navigator.userAgent.indexOf('Firefox') > -1; // prevent chrome scroll back shouldPreventScrollBack = isMac && (is_chrome || is_safari || is_firefox); } var dgSettings = { sidePadding: '38px' }; var DataGridWrapper = _styledComponents["default"].div(_templateObject(), function (props) { return props.theme.panelBorderLT; }, function (props) { return props.theme.panelBackgroundLT; }, function (props) { return props.theme.titleColorLT; }, dgSettings.sidePadding, dgSettings.sidePadding, function (props) { return props.theme.labelColorLT; }, function (props) { return props.theme.modalScrollBar; }); var BooleanFormatter = function BooleanFormatter(_ref) { var value = _ref.value; return _react["default"].createElement("span", null, String(value)); }; var DataTableModal = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(DataTableModal, _Component); function DataTableModal() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, DataTableModal); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(DataTableModal)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMouseWheel", function (e) { // Prevent futile scroll, which would trigger the Back/Next page event // https://github.com/micho/jQuery.preventMacBackScroll // This prevents scroll when reaching the topmost or leftmost // positions of a container. // react-data-grid canvas element can be scrolled var canvas = _this._root.querySelector('.react-grid-Canvas'); // If canvas can not be scrolled left anymore when we try to scroll left var prevent_left = e.deltaX < 0 && canvas.scrollLeft <= 0; // If canvas can not be scrolled up when we try to scroll up var prevent_up = e.deltaY < 0 && canvas.scrollTop <= 0; if (prevent_left || prevent_up) { e.preventDefault(); } }); return _this; } (0, _createClass2["default"])(DataTableModal, [{ key: "render", value: function render() { var _this2 = this; var _this$props = this.props, datasets = _this$props.datasets, dataId = _this$props.dataId, showDatasetTable = _this$props.showDatasetTable; if (!datasets || !dataId) { return null; } var activeDataset = datasets[dataId]; // TODO: this should be all data var rows = activeDataset.data; var columns = activeDataset.fields.map(function (field, i) { return _objectSpread({}, field, { key: i, headerRenderer: _react["default"].createElement(FieldHeader, field), resizable: true, formatter: field.type === _defaultSettings.ALL_FIELD_TYPES["boolean"] ? BooleanFormatter : undefined }); }).filter(function (_ref2) { var name = _ref2.name; return name !== '_geojson'; }); return _react["default"].createElement("div", { ref: function ref(_ref3) { _this2._root = _ref3; }, className: "dataset-modal", style: { overflow: 'scroll' } }, _react["default"].createElement(DatasetTabs, { activeDataset: activeDataset, datasets: datasets, showDatasetTable: showDatasetTable }), _react["default"].createElement(DataGridWrapper, { onWheel: shouldPreventScrollBack ? this._onMouseWheel : null }, ReactDataGrid ? _react["default"].createElement(ReactDataGrid, { headerRowHeight: 72, columns: columns, minColumnWidth: 172, minWidth: this.props.width, minHeight: this.props.height - 65, rowGetter: function rowGetter(i) { return rows[i]; }, rowHeight: 48, rowsCount: rows.length }) : null)); } }]); return DataTableModal; }(_react.Component); exports.DataTableModal = DataTableModal; var tagContainerStyle = { display: 'flex', flexDirection: 'column', justifyContent: 'space-between' }; var FieldHeader = function FieldHeader(_ref4) { var name = _ref4.name, type = _ref4.type; return _react["default"].createElement("div", { style: tagContainerStyle }, _react["default"].createElement("div", { style: { display: 'flex', alignItems: 'center' } }, _react["default"].createElement("div", { style: { marginRight: type === 'timestamp' ? '2px' : '18px', height: '16px' } }, type === 'timestamp' ? _react["default"].createElement(_icons.Clock, { height: "16px" }) : null), name), _react["default"].createElement("div", { style: { marginLeft: '18px' } }, _react["default"].createElement(_fieldToken["default"], { type: type }))); }; var DatasetCatalog = _styledComponents["default"].div(_templateObject2(), dgSettings.sidePadding); var DatasetModalTab = _styledComponents["default"].div(_templateObject3(), function (props) { return props.active ? 'black' : 'transparent'; }); exports.DatasetModalTab = DatasetModalTab; var DatasetTabs = function DatasetTabs(_ref5) { var activeDataset = _ref5.activeDataset, datasets = _ref5.datasets, showDatasetTable = _ref5.showDatasetTable; return _react["default"].createElement(DatasetCatalog, { className: "dataset-modal-catalog" }, Object.values(datasets).map(function (dataset) { return dataset.externalData && dataset.externalData === true ? null : _react["default"].createElement(DatasetModalTab, { className: "dataset-modal-tab", active: dataset === activeDataset, key: dataset.id, onClick: function onClick() { return showDatasetTable(dataset.id); } }, _react["default"].createElement(_datasetLabel["default"], { dataset: dataset })); })); }; exports.DatasetTabs = DatasetTabs; var DataTableModalFactory = function DataTableModalFactory() { return DataTableModal; }; var _default = DataTableModalFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9kYXRhLXRhYmxlLW1vZGFsLmpzIl0sIm5hbWVzIjpbIlJlYWN0RGF0YUdyaWQiLCJ3aW5kb3ciLCJuYXZpZ2F0b3IiLCJyZXF1aXJlIiwic2hvdWxkUHJldmVudFNjcm9sbEJhY2siLCJ1c2VyQWdlbnQiLCJpc01hYyIsIm1hdGNoIiwiaXNfY2hyb21lIiwiaW5kZXhPZiIsImlzX3NhZmFyaSIsImlzX2ZpcmVmb3giLCJkZ1NldHRpbmdzIiwic2lkZVBhZGRpbmciLCJEYXRhR3JpZFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwicGFuZWxCb3JkZXJMVCIsInBhbmVsQmFja2dyb3VuZExUIiwidGl0bGVDb2xvckxUIiwibGFiZWxDb2xvckxUIiwibW9kYWxTY3JvbGxCYXIiLCJCb29sZWFuRm9ybWF0dGVyIiwidmFsdWUiLCJTdHJpbmciLCJEYXRhVGFibGVNb2RhbCIsImUiLCJjYW52YXMiLCJfcm9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJwcmV2ZW50X2xlZnQiLCJkZWx0YVgiLCJzY3JvbGxMZWZ0IiwicHJldmVudF91cCIsImRlbHRhWSIsInNjcm9sbFRvcCIsInByZXZlbnREZWZhdWx0IiwiZGF0YXNldHMiLCJkYXRhSWQiLCJzaG93RGF0YXNldFRhYmxlIiwiYWN0aXZlRGF0YXNldCIsInJvd3MiLCJkYXRhIiwiY29sdW1ucyIsImZpZWxkcyIsIm1hcCIsImZpZWxkIiwiaSIsImtleSIsImhlYWRlclJlbmRlcmVyIiwicmVzaXphYmxlIiwiZm9ybWF0dGVyIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInVuZGVmaW5lZCIsImZpbHRlciIsIm5hbWUiLCJyZWYiLCJvdmVyZmxvdyIsIl9vbk1vdXNlV2hlZWwiLCJ3aWR0aCIsImhlaWdodCIsImxlbmd0aCIsIkNvbXBvbmVudCIsInRhZ0NvbnRhaW5lclN0eWxlIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJqdXN0aWZ5Q29udGVudCIsIkZpZWxkSGVhZGVyIiwiYWxpZ25JdGVtcyIsIm1hcmdpblJpZ2h0IiwibWFyZ2luTGVmdCIsIkRhdGFzZXRDYXRhbG9nIiwiRGF0YXNldE1vZGFsVGFiIiwiYWN0aXZlIiwiRGF0YXNldFRhYnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJkYXRhc2V0IiwiZXh0ZXJuYWxEYXRhIiwiaWQiLCJEYXRhVGFibGVNb2RhbEZhY3RvcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBTUEsYUFBYSxHQUFHQyxtQkFBT0MsU0FBUCxHQUNsQkMsT0FBTyxDQUFDLDBDQUFELENBRFcsR0FFbEIsSUFGSjtBQUlBLElBQUlDLHVCQUF1QixHQUFHLEtBQTlCOztBQUVBLElBQUlILG1CQUFPQyxTQUFQLElBQW9CRCxtQkFBT0MsU0FBUCxDQUFpQkcsU0FBekMsRUFBb0Q7QUFBQSxNQUMzQ0gsU0FEMkMsR0FDOUJELGtCQUQ4QixDQUMzQ0MsU0FEMkMsRUFFbEQ7QUFDQTs7QUFDQSxNQUFNSSxLQUFLLEdBQUdKLFNBQVMsQ0FBQ0csU0FBVixDQUFvQkUsS0FBcEIsQ0FBMEIsV0FBMUIsQ0FBZDtBQUNBLE1BQU1DLFNBQVMsR0FBR04sU0FBUyxDQUFDRyxTQUFWLENBQW9CSSxPQUFwQixDQUE0QixRQUE1QixJQUF3QyxDQUFDLENBQTNEO0FBQ0EsTUFBTUMsU0FBUyxHQUFHUixTQUFTLENBQUNHLFNBQVYsQ0FBb0JJLE9BQXBCLENBQTRCLFFBQTVCLElBQXdDLENBQUMsQ0FBM0Q7QUFDQSxNQUFNRSxVQUFVLEdBQUdULFNBQVMsQ0FBQ0csU0FBVixDQUFvQkksT0FBcEIsQ0FBNEIsU0FBNUIsSUFBeUMsQ0FBQyxDQUE3RCxDQVBrRCxDQVNsRDs7QUFDQUwsRUFBQUEsdUJBQXVCLEdBQUdFLEtBQUssS0FBS0UsU0FBUyxJQUFJ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QUF5QixJQUFqRCxHQUF3RCxJQUF4RCxHQUNFLGdDQUFDLGVBQUQ7QUFDRSxNQUFBLFNBQVMsRUFBQyxtQkFEWjtBQUVFLE1BQUEsTUFBTSxFQUFFRCxPQUFPLEtBQUt0QyxhQUZ0QjtBQUdFLE1BQUEsR0FBRyxFQUFFc0MsT0FBTyxDQUFDRSxFQUhmO0FBSUUsTUFBQSxPQUFPLEVBQUU7QUFBQSxlQUFNekMsZ0JBQWdCLENBQUN1QyxPQUFPLENBQUNFLEVBQVQsQ0FBdEI7QUFBQTtBQUpYLE9BTUUsZ0NBQUMsd0JBQUQ7QUFBYyxNQUFBLE9BQU8sRUFBRUY7QUFBdkIsTUFORixDQUZnQztBQUFBLEdBQW5DLENBREgsQ0FEeUI7QUFBQSxDQUFwQjs7OztBQWlCUCxJQUFNRyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCO0FBQUEsU0FBTXhELGNBQU47QUFBQSxDQUE5Qjs7ZUFDZXdELHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQgRmllbGRUb2tlbiBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9maWVsZC10b2tlbic7XG5pbXBvcnQgRGF0YXNldExhYmVsIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2RhdGFzZXQtbGFiZWwnO1xuaW1wb3J0IHtDbG9ja30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMvaW5kZXgnO1xuY29uc3QgUmVhY3REYXRhR3JpZCA9IHdpbmRvdy5uYXZpZ2F0b3JcbiAgPyByZXF1aXJlKCdyZWFjdC1kYXRhLWdyaWQvZGlzdC9yZWFjdC1kYXRhLWdyaWQubWluJylcbiAgOiBudWxsO1xuXG5sZXQgc2hvdWxkUHJldmVudFNjcm9sbEJhY2sgPSBmYWxzZTtcblxuaWYgKHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHtcbiAgY29uc3Qge25hdmlnYXRvcn0gPSB3aW5kb3c7XG4gIC8vIERldGVjdCBicm93c2Vyc1xuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU4OTk3ODMvZGV0ZWN0LXNhZmFyaS11c2luZy1qcXVlcnlcbiAgY29uc3QgaXNNYWMgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NYWNpbnRvc2gvKTtcbiAgY29uc3QgaXNfY2hyb21lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xO1xuICBjb25zdCBpc19zYWZhcmkgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaScpID4gLTE7XG4gIGNvbnN0IGlzX2ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xO1xuXG4gIC8vIHByZXZlbnQgY2hyb21lIHNjcm9sbCBiYWNrXG4gIHNob3VsZFByZXZlbnRTY3JvbGxCYWNrID0gaXNNYWMgJiYgKGlzX2Nocm9tZSB8fCBpc19zYWZhcmkgfHwgaXNfZmlyZWZveCk7XG59XG5cbmNvbnN0IGRnU2V0dGluZ3MgPSB7XG4gIHNpZGVQYWRkaW5nOiAnMzhweCdcbn07XG5cbmNvbnN0IERhdGFHcmlkV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIC5yZWFjdC1ncmlkLU1haW4ge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1HcmlkIHtcbiAgICBib3JkZXI6IDA7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1DZWxsIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJvcmRlckxUfTtcbiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICBiYWNrZ3JvdW5kOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZExUfTtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZUNvbG9yTFR9O1xuICAgIHBhZGRpbmc6IDE0cHggOHB4IDE0cHggMDtcbiAgfVxuICAucmVhY3QtZ3JpZC1DZWxsOmZpcnN0LWNoaWxkLFxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsOmZpcnN0LWNoaWxkIHtcbiAgICBwYWRkaW5nLWxlZnQ6ICR7ZGdTZXR0aW5ncy5zaWRlUGFkZGluZ307XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2VsbDpsYXN0LWNoaWxkLFxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsOmxhc3QtY2hpbGQge1xuICAgIHBhZGRpbmctcmlnaHQ6ICR7ZGdTZXR0aW5ncy5zaWRlUGFkZGluZ307XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2VsbF9fdmFsdWUge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3JMVH07XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2FudmFzIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfTtcbiAgfVxuYDtcblxuY29uc3QgQm9vbGVhbkZvcm1hdHRlciA9ICh7dmFsdWV9KSA9PiA8c3Bhbj57U3RyaW5nKHZhbHVlKX08L3NwYW4+O1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlTW9kYWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICBfb25Nb3VzZVdoZWVsID0gZSA9PiB7XG4gICAgLy8gUHJldmVudCBmdXRpbGUgc2Nyb2xsLCB3aGljaCB3b3VsZCB0cmlnZ2VyIHRoZSBCYWNrL05leHQgcGFnZSBldmVudFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoby9qUXVlcnkucHJldmVudE1hY0JhY2tTY3JvbGxcbiAgICAvLyBUaGlzIHByZXZlbnRzIHNjcm9sbCB3aGVuIHJlYWNoaW5nIHRoZSB0b3Btb3N0IG9yIGxlZnRtb3N0XG4gICAgLy8gcG9zaXRpb25zIG9mIGEgY29udGFpbmVyLlxuXG4gICAgLy8gcmVhY3QtZGF0YS1ncmlkIGNhbnZhcyBlbGVtZW50IGNhbiBiZSBzY3JvbGxlZFxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcignLnJlYWN0LWdyaWQtQ2FudmFzJyk7XG5cbiAgICAvLyBJZiBjYW52YXMgY2FuIG5vdCBiZSBzY3JvbGxlZCBsZWZ0IGFueW1vcmUgd2hlbiB3ZSB0cnkgdG8gc2Nyb2xsIGxlZnRcbiAgICBjb25zdCBwcmV2ZW50X2xlZnQgPSBlLmRlbHRhWCA8IDAgJiYgY2FudmFzLnNjcm9sbExlZnQgPD0gMDtcbiAgICAvLyBJZiBjYW52YXMgY2FuIG5vdCBiZSBzY3JvbGxlZCB1cCB3aGVuIHdlIHRyeSB0byBzY3JvbGwgdXBcbiAgICBjb25zdCBwcmV2ZW50X3VwID0gZS5kZWx0YVkgPCAwICYmIGNhbnZhcy5zY3JvbGxUb3AgPD0gMDtcblxuICAgIGlmIChwcmV2ZW50X2xlZnQgfHwgcHJldmVudF91cCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2RhdGFzZXRzLCBkYXRhSWQsIHNob3dEYXRhc2V0VGFibGV9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghZGF0YXNldHMgfHwgIWRhdGFJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRGF0YXNldCA9IGRhdGFzZXRzW2RhdGFJZF07XG4gICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgYWxsIGRhdGFcbiAgICBjb25zdCByb3dzID0gYWN0aXZlRGF0YXNldC5kYXRhO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBhY3RpdmVEYXRhc2V0LmZpZWxkc1xuICAgICAgLm1hcCgoZmllbGQsIGkpID0+ICh7XG4gICAgICAgIC4uLmZpZWxkLFxuICAgICAgICBrZXk6IGksXG4gICAgICAgIGhlYWRlclJlbmRlcmVyOiA8RmllbGRIZWFkZXIgey4uLmZpZWxkfSAvPixcbiAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICBmb3JtYXR0ZXI6XG4gICAgICAgICAgZmllbGQudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW4gPyBCb29sZWFuRm9ybWF0dGVyIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKHtuYW1lfSkgPT4gbmFtZSAhPT0gJ19nZW9qc29uJyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3JlZiA9PiB7XG4gICAgICAgICAgdGhpcy5fcm9vdCA9IHJlZjtcbiAgICAgICAgfX1cbiAgICAgICAgY2xhc3NOYW1lPVwiZGF0YXNldC1tb2RhbFwiXG4gICAgICAgIHN0eWxlPXt7b3ZlcmZsb3c6ICdzY3JvbGwnfX1cbiAgICAgID5cbiAgICAgICAgPERhdGFzZXRUYWJzXG4gICAgICAgICAgYWN0aXZlRGF0YXNldD17YWN0aXZlRGF0YXNldH1cbiAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgc2hvd0RhdGFzZXRUYWJsZT17c2hvd0RhdGFzZXRUYWJsZX1cbiAgICAgICAgLz5cbiAgICAgICAgPERhdGFHcmlkV3JhcHBlclxuICAgICAgICAgIG9uV2hlZWw9e3Nob3VsZFByZXZlbnRTY3JvbGxCYWNrID8gdGhpcy5fb25Nb3VzZVdoZWVsIDogbnVsbH1cbiAgICAgICAgPlxuICAgICAgICAgIHtSZWFjdERhdGFHcmlkID8gKFxuICAgICAgICAgICAgPFJlYWN0RGF0YUdyaWRcbiAgICAgICAgICAgICAgaGVhZGVyUm93SGVpZ2h0PXs3Mn1cbiAgICAgICAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgICAgICAgbWluQ29sdW1uV2lkdGg9ezE3Mn1cbiAgICAgICAgICAgICAgbWluV2lkdGg9e3RoaXMucHJvcHMud2lkdGh9XG4gICAgICAgICAgICAgIG1pbkhlaWdodD17dGhpcy5wcm9wcy5oZWlnaHQgLSA2NX1cbiAgICAgICAgICAgICAgcm93R2V0dGVyPXtpID0+IHJvd3NbaV19XG4gICAgICAgICAgICAgIHJvd0hlaWdodD17NDh9XG4gICAgICAgICAgICAgIHJvd3NDb3VudD17cm93cy5sZW5ndGh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0RhdGFHcmlkV3JhcHBlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgdGFnQ29udGFpbmVyU3R5bGUgPSB7XG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2Vlbidcbn07XG5cbmNvbnN0IEZpZWxkSGVhZGVyID0gKHtuYW1lLCB0eXBlfSkgPT4gKFxuICA8ZGl2IHN0eWxlPXt0YWdDb250YWluZXJTdHlsZX0+XG4gICAgPGRpdiBzdHlsZT17e2Rpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcid9fT5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBtYXJnaW5SaWdodDogdHlwZSA9PT0gJ3RpbWVzdGFtcCcgPyAnMnB4JyA6ICcxOHB4JyxcbiAgICAgICAgICBoZWlnaHQ6ICcxNnB4J1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dHlwZSA9PT0gJ3RpbWVzdGFtcCcgPyA8Q2xvY2sgaGVpZ2h0PVwiMTZweFwiIC8+IDogbnVsbH1cbiAgICAgIDwvZGl2PlxuICAgICAge25hbWV9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT17e21hcmdpbkxlZnQ6ICcxOHB4J319PlxuICAgICAgPEZpZWxkVG9rZW4gdHlwZT17dHlwZX0gLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCBEYXRhc2V0Q2F0YWxvZyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmc6IDAgJHtkZ1NldHRpbmdzLnNpZGVQYWRkaW5nfTtcbmA7XG5cbmV4cG9ydCBjb25zdCBEYXRhc2V0TW9kYWxUYWIgPSBzdHlsZWQuZGl2YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItYm90dG9tOiAzcHggc29saWQgJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gJ2JsYWNrJyA6ICd0cmFuc3BhcmVudCcpfTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDM1cHg7XG4gIG1hcmdpbjogMCAzcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xuXG4gIDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgRGF0YXNldFRhYnMgPSAoe2FjdGl2ZURhdGFzZXQsIGRhdGFzZXRzLCBzaG93RGF0YXNldFRhYmxlfSkgPT4gKFxuICA8RGF0YXNldENhdGFsb2cgY2xhc3NOYW1lPVwiZGF0YXNldC1tb2RhbC1jYXRhbG9nXCI+XG4gICAge09iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkYXRhc2V0ID0+XG4gICAgICBkYXRhc2V0LmV4dGVybmFsRGF0YSAmJiBkYXRhc2V0LmV4dGVybmFsRGF0YSA9PT0gdHJ1ZSA/IG51bGwgOiAoXG4gICAgICAgIDxEYXRhc2V0TW9kYWxUYWJcbiAgICAgICAgICBjbGFzc05hbWU9XCJkYXRhc2V0LW1vZGFsLXRhYlwiXG4gICAgICAgICAgYWN0aXZlPXtkYXRhc2V0ID09PSBhY3RpdmVEYXRhc2V0fVxuICAgICAgICAgIGtleT17ZGF0YXNldC5pZH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzaG93RGF0YXNldFRhYmxlKGRhdGFzZXQuaWQpfVxuICAgICAgICA+XG4gICAgICAgICAgPERhdGFzZXRMYWJlbCBkYXRhc2V0PXtkYXRhc2V0fSAvPlxuICAgICAgICA8L0RhdGFzZXRNb2RhbFRhYj5cbiAgICAgIClcbiAgICApfVxuICA8L0RhdGFzZXRDYXRhbG9nPlxuKTtcblxuY29uc3QgRGF0YVRhYmxlTW9kYWxGYWN0b3J5ID0gKCkgPT4gRGF0YVRhYmxlTW9kYWw7XG5leHBvcnQgZGVmYXVsdCBEYXRhVGFibGVNb2RhbEZhY3Rvcnk7XG4iXX0=