UNPKG

kepler.gl

Version:

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

203 lines (202 loc) 37.5 kB
"use strict"; 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _reactIntl = require("react-intl"); var _styledComponents = require("../common/styled-components"); var _sourceDataCatalog = _interopRequireDefault(require("./common/source-data-catalog")); var _filterPanel = _interopRequireDefault(require("./filter-panel/filter-panel")); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _panelViewListToggle = _interopRequireDefault(require("./panel-view-list-toggle")); var _panelTitle = _interopRequireDefault(require("./panel-title")); var _addFilterButton = _interopRequireDefault(require("./filter-panel/add-filter-button")); var _datasetSection = _interopRequireDefault(require("./layer-panel/dataset-section")); 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project FilterManagerFactory.deps = [_datasetSection["default"], _filterPanel["default"], _panelTitle["default"], _addFilterButton["default"], _panelViewListToggle["default"], _sourceDataCatalog["default"]]; function FilterManagerFactory(DatasetSection, FilterPanel, PanelTitle, AddFilterButton, PanelViewListToggle, SourceDataCatalog) { var FilterList = function FilterList(_ref) { var filtersByIndex = _ref.filtersByIndex, filters = _ref.filters, datasets = _ref.datasets, layers = _ref.layers, isAnyFilterAnimating = _ref.isAnyFilterAnimating, visStateActions = _ref.visStateActions; var _removeFilter = visStateActions.removeFilter, setFilter = visStateActions.setFilter, setFilterPlot = visStateActions.setFilterPlot, toggleFilterAnimation = visStateActions.toggleFilterAnimation, _toggleFilterFeature = visStateActions.toggleFilterFeature, setFilterView = visStateActions.setFilterView, syncTimeFilterWithLayerTimeline = visStateActions.syncTimeFilterWithLayerTimeline; var filterPanelCallbacks = (0, _react.useMemo)(function () { return filtersByIndex.reduce(function (accu, _ref2) { var filter = _ref2.filter, idx = _ref2.idx; return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, filter.id, { removeFilter: function removeFilter() { return _removeFilter(idx); }, toggleFilterView: function toggleFilterView() { return setFilterView(idx, (0, _utils.isSideFilter)(filter) ? _constants.FILTER_VIEW_TYPES.enlarged : _constants.FILTER_VIEW_TYPES.side); }, toggleAnimation: function toggleAnimation() { return toggleFilterAnimation(idx); }, toggleFilterFeature: function toggleFilterFeature() { return _toggleFilterFeature(idx); } })); }, {}); }, [filtersByIndex, _removeFilter, setFilterView, toggleFilterAnimation, _toggleFilterFeature]); return /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, (0, _toConsumableArray2["default"])(filtersByIndex).reverse().map(function (_ref3) { var filter = _ref3.filter, idx = _ref3.idx; return /*#__PURE__*/_react["default"].createElement(FilterPanel, { key: "".concat(filter.id, "-").concat(idx), idx: idx, filters: filters, filter: filter, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, removeFilter: filterPanelCallbacks[filter.id].removeFilter, enlargeFilter: filterPanelCallbacks[filter.id].toggleFilterView, toggleAnimation: filterPanelCallbacks[filter.id].toggleAnimation, toggleFilterFeature: filterPanelCallbacks[filter.id].toggleFilterFeature, setFilter: setFilter, setFilterPlot: setFilterPlot, syncTimeFilterWithLayerTimeline: syncTimeFilterWithLayerTimeline }); })); }; var DatasetFilterSection = function DatasetFilterSection(_ref4) { var filtersByIndex = _ref4.filtersByIndex, filters = _ref4.filters, dataset = _ref4.dataset, datasets = _ref4.datasets, layers = _ref4.layers, isAnyFilterAnimating = _ref4.isAnyFilterAnimating, visStateActions = _ref4.visStateActions, showDatasetTable = _ref4.showDatasetTable, updateTableColor = _ref4.updateTableColor, removeDataset = _ref4.removeDataset, showDeleteDataset = _ref4.showDeleteDataset; var datasetCatalog = (0, _react.useMemo)(function () { return (0, _defineProperty2["default"])({}, dataset.id, dataset); }, [dataset]); return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(SourceDataCatalog, { datasets: datasetCatalog, showDatasetTable: showDatasetTable, updateTableColor: updateTableColor, removeDataset: removeDataset, showDeleteDataset: showDeleteDataset }), /*#__PURE__*/_react["default"].createElement(FilterList, { filtersByIndex: filtersByIndex, filters: filters, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, visStateActions: visStateActions })); }; var FilterManager = function FilterManager(_ref6) { var _ref6$filters = _ref6.filters, filters = _ref6$filters === void 0 ? [] : _ref6$filters, datasets = _ref6.datasets, layers = _ref6.layers, showDatasetTable = _ref6.showDatasetTable, updateTableColor = _ref6.updateTableColor, removeDataset = _ref6.removeDataset, showAddDataModal = _ref6.showAddDataModal, panelMetadata = _ref6.panelMetadata, panelListView = _ref6.panelListView, visStateActions = _ref6.visStateActions, uiStateActions = _ref6.uiStateActions; var addFilter = visStateActions.addFilter; var togglePanelListView = uiStateActions.togglePanelListView; var isAnyFilterAnimating = filters.some(function (f) { return f.isAnimating; }); var onClickAddFilter = (0, _react.useCallback)(function (dataset) { return addFilter(dataset); }, [addFilter]); var isSortByDatasetMode = panelListView === _constants.PANEL_VIEW_TOGGLES.byDataset; var filtersByIndex = (0, _react.useMemo)(function () { return filters.map(function (f, idx) { return { filter: f, idx: idx }; }); }, [filters]); var filtersByDatasets = (0, _react.useMemo)(function () { return Object.keys(datasets).reduce(function (accu, dataId) { return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, dataId, filtersByIndex.filter(function (fidx) { return fidx.filter.dataId && fidx.filter.dataId[0] === dataId; }))); }, {}); }, [datasets, filtersByIndex]); var _TogglePanelListView = (0, _react.useCallback)(function (listView) { togglePanelListView({ panelId: 'filter', listView: listView }); }, [togglePanelListView]); var intl = (0, _reactIntl.useIntl)(); var filterListProps = { datasets: datasets, filters: filters, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, visStateActions: visStateActions }; var sourceDataCatalogProps = { showDatasetTable: showDatasetTable, updateTableColor: updateTableColor, removeDataset: removeDataset, showDeleteDataset: true }; return /*#__PURE__*/_react["default"].createElement("div", { className: "filter-manager" }, /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(PanelViewListToggle, { togglePanelListView: _TogglePanelListView, mode: panelListView })), /*#__PURE__*/_react["default"].createElement(DatasetSection, (0, _extends2["default"])({ datasets: datasets }, sourceDataCatalogProps, { showDatasetList: !isSortByDatasetMode, showAddDataModal: showAddDataModal })), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelDivider, null), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(PanelTitle, { className: "filter-manager-title", title: intl.formatMessage({ id: panelMetadata.label }) }, /*#__PURE__*/_react["default"].createElement(AddFilterButton, { datasets: datasets, onAdd: onClickAddFilter }))), /*#__PURE__*/_react["default"].createElement(_styledComponents.SidePanelSection, null, isSortByDatasetMode ? Object.keys(filtersByDatasets).map(function (dataId) { return /*#__PURE__*/_react["default"].createElement(DatasetFilterSection, (0, _extends2["default"])({ key: dataId, filtersByIndex: filtersByDatasets[dataId], dataset: datasets[dataId] }, filterListProps, sourceDataCatalogProps)); }) : /*#__PURE__*/_react["default"].createElement(FilterList, (0, _extends2["default"])({ filtersByIndex: filtersByIndex }, filterListProps)))); }; return FilterManager; } var _default = exports["default"] = FilterManagerFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RJbnRsIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfc291cmNlRGF0YUNhdGFsb2ciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2ZpbHRlclBhbmVsIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9wYW5lbFZpZXdMaXN0VG9nZ2xlIiwiX3BhbmVsVGl0bGUiLCJfYWRkRmlsdGVyQnV0dG9uIiwiX2RhdGFzZXRTZWN0aW9uIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiRmlsdGVyTWFuYWdlckZhY3RvcnkiLCJkZXBzIiwiRGF0YXNldFNlY3Rpb25GYWN0b3J5IiwiRmlsdGVyUGFuZWxGYWN0b3J5IiwiUGFuZWxUaXRsZUZhY3RvcnkiLCJBZGRGaWx0ZXJCdXR0b25GYWN0b3J5IiwiUGFuZWxWaWV3TGlzdFRvZ2dsZUZhY3RvcnkiLCJTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3RvcnkiLCJEYXRhc2V0U2VjdGlvbiIsIkZpbHRlclBhbmVsIiwiUGFuZWxUaXRsZSIsIkFkZEZpbHRlckJ1dHRvbiIsIlBhbmVsVmlld0xpc3RUb2dnbGUiLCJTb3VyY2VEYXRhQ2F0YWxvZyIsIkZpbHRlckxpc3QiLCJfcmVmIiwiZmlsdGVyc0J5SW5kZXgiLCJmaWx0ZXJzIiwiZGF0YXNldHMiLCJsYXllcnMiLCJpc0FueUZpbHRlckFuaW1hdGluZyIsInZpc1N0YXRlQWN0aW9ucyIsInJlbW92ZUZpbHRlciIsInNldEZpbHRlciIsInNldEZpbHRlclBsb3QiLCJ0b2dnbGVGaWx0ZXJBbmltYXRpb24iLCJ0b2dnbGVGaWx0ZXJGZWF0dXJlIiwic2V0RmlsdGVyVmlldyIsInN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmUiLCJmaWx0ZXJQYW5lbENhbGxiYWNrcyIsInVzZU1lbW8iLCJyZWR1Y2UiLCJhY2N1IiwiX3JlZjIiLCJpZHgiLCJpZCIsInRvZ2dsZUZpbHRlclZpZXciLCJpc1NpZGVGaWx0ZXIiLCJGSUxURVJfVklFV19UWVBFUyIsImVubGFyZ2VkIiwic2lkZSIsInRvZ2dsZUFuaW1hdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJTaWRlUGFuZWxTZWN0aW9uIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInJldmVyc2UiLCJtYXAiLCJfcmVmMyIsImtleSIsImNvbmNhdCIsImVubGFyZ2VGaWx0ZXIiLCJEYXRhc2V0RmlsdGVyU2VjdGlvbiIsIl9yZWY0IiwiZGF0YXNldCIsInNob3dEYXRhc2V0VGFibGUiLCJ1cGRhdGVUYWJsZUNvbG9yIiwicmVtb3ZlRGF0YXNldCIsInNob3dEZWxldGVEYXRhc2V0IiwiZGF0YXNldENhdGFsb2ciLCJGcmFnbWVudCIsIkZpbHRlck1hbmFnZXIiLCJfcmVmNiIsIl9yZWY2JGZpbHRlcnMiLCJzaG93QWRkRGF0YU1vZGFsIiwicGFuZWxNZXRhZGF0YSIsInBhbmVsTGlzdFZpZXciLCJ1aVN0YXRlQWN0aW9ucyIsImFkZEZpbHRlciIsInRvZ2dsZVBhbmVsTGlzdFZpZXciLCJzb21lIiwiZiIsImlzQW5pbWF0aW5nIiwib25DbGlja0FkZEZpbHRlciIsInVzZUNhbGxiYWNrIiwiaXNTb3J0QnlEYXRhc2V0TW9kZSIsIlBBTkVMX1ZJRVdfVE9HR0xFUyIsImJ5RGF0YXNldCIsImZpbHRlcnNCeURhdGFzZXRzIiwiZGF0YUlkIiwiZmlkeCIsIl9Ub2dnbGVQYW5lbExpc3RWaWV3IiwibGlzdFZpZXciLCJwYW5lbElkIiwiaW50bCIsInVzZUludGwiLCJmaWx0ZXJMaXN0UHJvcHMiLCJzb3VyY2VEYXRhQ2F0YWxvZ1Byb3BzIiwiY2xhc3NOYW1lIiwibW9kZSIsIl9leHRlbmRzMiIsInNob3dEYXRhc2V0TGlzdCIsIlNpZGVQYW5lbERpdmlkZXIiLCJ0aXRsZSIsImZvcm1hdE1lc3NhZ2UiLCJsYWJlbCIsIm9uQWRkIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpZGUtcGFuZWwvZmlsdGVyLW1hbmFnZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtTaWRlUGFuZWxEaXZpZGVyLCBTaWRlUGFuZWxTZWN0aW9ufSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeSBmcm9tICcuL2NvbW1vbi9zb3VyY2UtZGF0YS1jYXRhbG9nJztcbmltcG9ydCBGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSAnLi9maWx0ZXItcGFuZWwvZmlsdGVyLXBhbmVsJztcbmltcG9ydCB7RklMVEVSX1ZJRVdfVFlQRVMsIFBBTkVMX1ZJRVdfVE9HR0xFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtGaWx0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtpc1NpZGVGaWx0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnMsIEFjdGlvbkhhbmRsZXIsIFVJU3RhdGVBY3Rpb25zLCBBY3Rpb25IYW5kbGVyc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG5pbXBvcnQgUGFuZWxWaWV3TGlzdFRvZ2dsZUZhY3RvcnkgZnJvbSAnLi9wYW5lbC12aWV3LWxpc3QtdG9nZ2xlJztcbmltcG9ydCBQYW5lbFRpdGxlRmFjdG9yeSBmcm9tICcuL3BhbmVsLXRpdGxlJztcbmltcG9ydCBBZGRGaWx0ZXJCdXR0b25GYWN0b3J5IGZyb20gJy4vZmlsdGVyLXBhbmVsL2FkZC1maWx0ZXItYnV0dG9uJztcbmltcG9ydCBEYXRhc2V0U2VjdGlvbkZhY3RvcnkgZnJvbSAnLi9sYXllci1wYW5lbC9kYXRhc2V0LXNlY3Rpb24nO1xuaW1wb3J0IHtQYW5lbE1ldGF9IGZyb20gJy4vY29tbW9uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgVmlzU3RhdGVBY3Rpb25IYW5kbGVycyA9IEFjdGlvbkhhbmRsZXJzPHR5cGVvZiBWaXNTdGF0ZUFjdGlvbnM+O1xuZXhwb3J0IHR5cGUgVWlTdGF0ZUFjdGlvbkhhbmRsZXJzID0gQWN0aW9uSGFuZGxlcnM8dHlwZW9mIFVJU3RhdGVBY3Rpb25zPjtcblxuZXhwb3J0IHR5cGUgRmlsdGVyTWFuYWdlclByb3BzID0ge1xuICBmaWx0ZXJzOiBGaWx0ZXJbXTtcbiAgZGF0YXNldHM6IERhdGFzZXRzO1xuICBsYXllcnM6IExheWVyW107XG4gIHNob3dEYXRhc2V0VGFibGU6IEFjdGlvbkhhbmRsZXI8dHlwZW9mIFZpc1N0YXRlQWN0aW9ucy5zaG93RGF0YXNldFRhYmxlPjtcbiAgdXBkYXRlVGFibGVDb2xvcjogQWN0aW9uSGFuZGxlcjx0eXBlb2YgVmlzU3RhdGVBY3Rpb25zLnVwZGF0ZVRhYmxlQ29sb3I+O1xuICByZW1vdmVEYXRhc2V0OiBBY3Rpb25IYW5kbGVyPHR5cGVvZiBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldD47XG4gIHNob3dBZGREYXRhTW9kYWw6ICgpID0+IHZvaWQ7XG5cbiAgcGFuZWxNZXRhZGF0YTogUGFuZWxNZXRhO1xuICBwYW5lbExpc3RWaWV3OiBzdHJpbmc7XG4gIHZpc1N0YXRlQWN0aW9uczogVmlzU3RhdGVBY3Rpb25IYW5kbGVycztcbiAgdWlTdGF0ZUFjdGlvbnM6IFVpU3RhdGVBY3Rpb25IYW5kbGVycztcbn07XG5cbnR5cGUgRmlsdGVyTGlzdFByb3BzID0ge1xuICBmaWx0ZXJzOiBGaWx0ZXJbXTtcbiAgZGF0YXNldHM6IERhdGFzZXRzO1xuICBsYXllcnM6IExheWVyW107XG4gIGZpbHRlcnNCeUluZGV4OiB7XG4gICAgZmlsdGVyOiBGaWx0ZXI7XG4gICAgaWR4OiBudW1iZXI7XG4gIH1bXTtcbiAgaXNBbnlGaWx0ZXJBbmltYXRpbmc6IGJvb2xlYW47XG4gIHZpc1N0YXRlQWN0aW9uczogVmlzU3RhdGVBY3Rpb25IYW5kbGVycztcbn07XG5cbkZpbHRlck1hbmFnZXJGYWN0b3J5LmRlcHMgPSBbXG4gIERhdGFzZXRTZWN0aW9uRmFjdG9yeSxcbiAgRmlsdGVyUGFuZWxGYWN0b3J5LFxuICBQYW5lbFRpdGxlRmFjdG9yeSxcbiAgQWRkRmlsdGVyQnV0dG9uRmFjdG9yeSxcbiAgUGFuZWxWaWV3TGlzdFRvZ2dsZUZhY3RvcnksXG4gIFNvdXJjZURhdGFDYXRhbG9nRmFjdG9yeVxuXTtcblxuZnVuY3Rpb24gRmlsdGVyTWFuYWdlckZhY3RvcnkoXG4gIERhdGFzZXRTZWN0aW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBEYXRhc2V0U2VjdGlvbkZhY3Rvcnk+LFxuICBGaWx0ZXJQYW5lbDogUmV0dXJuVHlwZTx0eXBlb2YgRmlsdGVyUGFuZWxGYWN0b3J5PixcbiAgUGFuZWxUaXRsZTogUmV0dXJuVHlwZTx0eXBlb2YgUGFuZWxUaXRsZUZhY3Rvcnk+LFxuICBBZGRGaWx0ZXJCdXR0b246IFJldHVyblR5cGU8dHlwZW9mIEFkZEZpbHRlckJ1dHRvbkZhY3Rvcnk+LFxuICBQYW5lbFZpZXdMaXN0VG9nZ2xlOiBSZXR1cm5UeXBlPHR5cGVvZiBQYW5lbFZpZXdMaXN0VG9nZ2xlRmFjdG9yeT4sXG4gIFNvdXJjZURhdGFDYXRhbG9nOiBSZXR1cm5UeXBlPHR5cGVvZiBTb3VyY2VEYXRhQ2F0YWxvZ0ZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgRmlsdGVyTGlzdCA9ICh7XG4gICAgZmlsdGVyc0J5SW5kZXgsXG4gICAgZmlsdGVycyxcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgaXNBbnlGaWx0ZXJBbmltYXRpbmcsXG4gICAgdmlzU3RhdGVBY3Rpb25zXG4gIH06IEZpbHRlckxpc3RQcm9wcykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbW92ZUZpbHRlcixcbiAgICAgIHNldEZpbHRlcixcbiAgICAgIHNldEZpbHRlclBsb3QsXG4gICAgICB0b2dnbGVGaWx0ZXJBbmltYXRpb24sXG4gICAgICB0b2dnbGVGaWx0ZXJGZWF0dXJlLFxuICAgICAgc2V0RmlsdGVyVmlldyxcbiAgICAgIHN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVcbiAgICB9ID0gdmlzU3RhdGVBY3Rpb25zO1xuXG4gICAgY29uc3QgZmlsdGVyUGFuZWxDYWxsYmFja3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBmaWx0ZXJzQnlJbmRleC5yZWR1Y2UoXG4gICAgICAgIChhY2N1LCB7ZmlsdGVyLCBpZHh9KSA9PiAoe1xuICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgW2ZpbHRlci5pZF06IHtcbiAgICAgICAgICAgIHJlbW92ZUZpbHRlcjogKCkgPT4gcmVtb3ZlRmlsdGVyKGlkeCksXG4gICAgICAgICAgICB0b2dnbGVGaWx0ZXJWaWV3OiAoKSA9PlxuICAgICAgICAgICAgICBzZXRGaWx0ZXJWaWV3KFxuICAgICAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgICAgICBpc1NpZGVGaWx0ZXIoZmlsdGVyKSA/IEZJTFRFUl9WSUVXX1RZUEVTLmVubGFyZ2VkIDogRklMVEVSX1ZJRVdfVFlQRVMuc2lkZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdG9nZ2xlQW5pbWF0aW9uOiAoKSA9PiB0b2dnbGVGaWx0ZXJBbmltYXRpb24oaWR4KSxcbiAgICAgICAgICAgIHRvZ2dsZUZpbHRlckZlYXR1cmU6ICgpID0+IHRvZ2dsZUZpbHRlckZlYXR1cmUoaWR4KVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHt9XG4gICAgICApO1xuICAgIH0sIFtmaWx0ZXJzQnlJbmRleCwgcmVtb3ZlRmlsdGVyLCBzZXRGaWx0ZXJWaWV3LCB0b2dnbGVGaWx0ZXJBbmltYXRpb24sIHRvZ2dsZUZpbHRlckZlYXR1cmVdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAge1suLi5maWx0ZXJzQnlJbmRleF0ucmV2ZXJzZSgpLm1hcCgoe2ZpbHRlciwgaWR4fSkgPT4gKFxuICAgICAgICAgIDxGaWx0ZXJQYW5lbFxuICAgICAgICAgICAga2V5PXtgJHtmaWx0ZXIuaWR9LSR7aWR4fWB9XG4gICAgICAgICAgICBpZHg9e2lkeH1cbiAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcn1cbiAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc9e2lzQW55RmlsdGVyQW5pbWF0aW5nfVxuICAgICAgICAgICAgcmVtb3ZlRmlsdGVyPXtmaWx0ZXJQYW5lbENhbGxiYWNrc1tmaWx0ZXIuaWRdLnJlbW92ZUZpbHRlcn1cbiAgICAgICAgICAgIGVubGFyZ2VGaWx0ZXI9e2ZpbHRlclBhbmVsQ2FsbGJhY2tzW2ZpbHRlci5pZF0udG9nZ2xlRmlsdGVyVmlld31cbiAgICAgICAgICAgIHRvZ2dsZUFuaW1hdGlvbj17ZmlsdGVyUGFuZWxDYWxsYmFja3NbZmlsdGVyLmlkXS50b2dnbGVBbmltYXRpb259XG4gICAgICAgICAgICB0b2dnbGVGaWx0ZXJGZWF0dXJlPXtmaWx0ZXJQYW5lbENhbGxiYWNrc1tmaWx0ZXIuaWRdLnRvZ2dsZUZpbHRlckZlYXR1cmV9XG4gICAgICAgICAgICBzZXRGaWx0ZXI9e3NldEZpbHRlcn1cbiAgICAgICAgICAgIHNldEZpbHRlclBsb3Q9e3NldEZpbHRlclBsb3R9XG4gICAgICAgICAgICBzeW5jVGltZUZpbHRlcldpdGhMYXllclRpbWVsaW5lPXtzeW5jVGltZUZpbHRlcldpdGhMYXllclRpbWVsaW5lfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgRGF0YXNldEZpbHRlclNlY3Rpb24gPSAoe1xuICAgIGZpbHRlcnNCeUluZGV4LFxuICAgIGZpbHRlcnMsXG4gICAgZGF0YXNldCxcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgaXNBbnlGaWx0ZXJBbmltYXRpbmcsXG4gICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgIHNob3dEYXRhc2V0VGFibGUsXG4gICAgdXBkYXRlVGFibGVDb2xvcixcbiAgICByZW1vdmVEYXRhc2V0LFxuICAgIHNob3dEZWxldGVEYXRhc2V0XG4gIH0pID0+IHtcbiAgICBjb25zdCBkYXRhc2V0Q2F0YWxvZyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgcmV0dXJuIHtbZGF0YXNldC5pZF06IGRhdGFzZXR9O1xuICAgIH0sIFtkYXRhc2V0XSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPFNvdXJjZURhdGFDYXRhbG9nXG4gICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRDYXRhbG9nfVxuICAgICAgICAgIHNob3dEYXRhc2V0VGFibGU9e3Nob3dEYXRhc2V0VGFibGV9XG4gICAgICAgICAgdXBkYXRlVGFibGVDb2xvcj17dXBkYXRlVGFibGVDb2xvcn1cbiAgICAgICAgICByZW1vdmVEYXRhc2V0PXtyZW1vdmVEYXRhc2V0fVxuICAgICAgICAgIHNob3dEZWxldGVEYXRhc2V0PXtzaG93RGVsZXRlRGF0YXNldH1cbiAgICAgICAgLz5cbiAgICAgICAgPEZpbHRlckxpc3RcbiAgICAgICAgICBmaWx0ZXJzQnlJbmRleD17ZmlsdGVyc0J5SW5kZXh9XG4gICAgICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc9e2lzQW55RmlsdGVyQW5pbWF0aW5nfVxuICAgICAgICAgIHZpc1N0YXRlQWN0aW9ucz17dmlzU3RhdGVBY3Rpb25zfVxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBGaWx0ZXJNYW5hZ2VyOiBSZWFjdC5GQzxGaWx0ZXJNYW5hZ2VyUHJvcHM+ID0gKHtcbiAgICBmaWx0ZXJzID0gW10sXG4gICAgZGF0YXNldHMsXG4gICAgbGF5ZXJzLFxuICAgIHNob3dEYXRhc2V0VGFibGUsXG4gICAgdXBkYXRlVGFibGVDb2xvcixcbiAgICByZW1vdmVEYXRhc2V0LFxuICAgIHNob3dBZGREYXRhTW9kYWwsXG4gICAgcGFuZWxNZXRhZGF0YSxcbiAgICBwYW5lbExpc3RWaWV3LFxuICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICB1aVN0YXRlQWN0aW9uc1xuICB9KSA9PiB7XG4gICAgY29uc3Qge2FkZEZpbHRlcn0gPSB2aXNTdGF0ZUFjdGlvbnM7XG4gICAgY29uc3Qge3RvZ2dsZVBhbmVsTGlzdFZpZXd9ID0gdWlTdGF0ZUFjdGlvbnM7XG4gICAgY29uc3QgaXNBbnlGaWx0ZXJBbmltYXRpbmcgPSBmaWx0ZXJzLnNvbWUoZiA9PiBmLmlzQW5pbWF0aW5nKTtcbiAgICBjb25zdCBvbkNsaWNrQWRkRmlsdGVyID0gdXNlQ2FsbGJhY2soZGF0YXNldCA9PiBhZGRGaWx0ZXIoZGF0YXNldCksIFthZGRGaWx0ZXJdKTtcbiAgICBjb25zdCBpc1NvcnRCeURhdGFzZXRNb2RlID0gcGFuZWxMaXN0VmlldyA9PT0gUEFORUxfVklFV19UT0dHTEVTLmJ5RGF0YXNldDtcbiAgICBjb25zdCBmaWx0ZXJzQnlJbmRleCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBmaWx0ZXJzLm1hcCgoZiwgaWR4KSA9PiAoe1xuICAgICAgICAgIGZpbHRlcjogZixcbiAgICAgICAgICBpZHhcbiAgICAgICAgfSkpLFxuICAgICAgW2ZpbHRlcnNdXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJzQnlEYXRhc2V0cyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhc2V0cykucmVkdWNlKFxuICAgICAgICAgIChhY2N1LCBkYXRhSWQpID0+ICh7XG4gICAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgICAgLy8gaWYgc3luY2VkIGZpbHRlciwgc2hvdyBpdCB1bmZkZXIgaXRzIHRoZSBmaXJzdCBkYXRhc2V0XG4gICAgICAgICAgICBbZGF0YUlkXTogZmlsdGVyc0J5SW5kZXguZmlsdGVyKFxuICAgICAgICAgICAgICBmaWR4ID0+IGZpZHguZmlsdGVyLmRhdGFJZCAmJiBmaWR4LmZpbHRlci5kYXRhSWRbMF0gPT09IGRhdGFJZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9XG4gICAgICAgICksXG4gICAgICBbZGF0YXNldHMsIGZpbHRlcnNCeUluZGV4XVxuICAgICk7XG4gICAgY29uc3QgX1RvZ2dsZVBhbmVsTGlzdFZpZXcgPSB1c2VDYWxsYmFjayhcbiAgICAgIGxpc3RWaWV3ID0+IHtcbiAgICAgICAgdG9nZ2xlUGFuZWxMaXN0Vmlldyh7cGFuZWxJZDogJ2ZpbHRlcicsIGxpc3RWaWV3fSk7XG4gICAgICB9LFxuICAgICAgW3RvZ2dsZVBhbmVsTGlzdFZpZXddXG4gICAgKTtcblxuICAgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gICAgY29uc3QgZmlsdGVyTGlzdFByb3BzID0ge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgbGF5ZXJzLFxuICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmcsXG4gICAgICB2aXNTdGF0ZUFjdGlvbnNcbiAgICB9O1xuXG4gICAgY29uc3Qgc291cmNlRGF0YUNhdGFsb2dQcm9wcyA9IHtcbiAgICAgIHNob3dEYXRhc2V0VGFibGUsXG4gICAgICB1cGRhdGVUYWJsZUNvbG9yLFxuICAgICAgcmVtb3ZlRGF0YXNldCxcbiAgICAgIHNob3dEZWxldGVEYXRhc2V0OiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlci1tYW5hZ2VyXCI+XG4gICAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgIDxQYW5lbFZpZXdMaXN0VG9nZ2xlIHRvZ2dsZVBhbmVsTGlzdFZpZXc9e19Ub2dnbGVQYW5lbExpc3RWaWV3fSBtb2RlPXtwYW5lbExpc3RWaWV3fSAvPlxuICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgIDxEYXRhc2V0U2VjdGlvblxuICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICB7Li4uc291cmNlRGF0YUNhdGFsb2dQcm9wc31cbiAgICAgICAgICBzaG93RGF0YXNldExpc3Q9eyFpc1NvcnRCeURhdGFzZXRNb2RlfVxuICAgICAgICAgIHNob3dBZGREYXRhTW9kYWw9e3Nob3dBZGREYXRhTW9kYWx9XG4gICAgICAgIC8+XG4gICAgICAgIDxTaWRlUGFuZWxEaXZpZGVyIC8+XG4gICAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgIDxQYW5lbFRpdGxlXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmaWx0ZXItbWFuYWdlci10aXRsZVwiXG4gICAgICAgICAgICB0aXRsZT17aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogcGFuZWxNZXRhZGF0YS5sYWJlbH0pfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBZGRGaWx0ZXJCdXR0b24gZGF0YXNldHM9e2RhdGFzZXRzfSBvbkFkZD17b25DbGlja0FkZEZpbHRlcn0gLz5cbiAgICAgICAgICA8L1BhbmVsVGl0bGU+XG4gICAgICAgIDwvU2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgICAge2lzU29ydEJ5RGF0YXNldE1vZGUgPyAoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmaWx0ZXJzQnlEYXRhc2V0cykubWFwKGRhdGFJZCA9PiAoXG4gICAgICAgICAgICAgIDxEYXRhc2V0RmlsdGVyU2VjdGlvblxuICAgICAgICAgICAgICAgIGtleT17ZGF0YUlkfVxuICAgICAgICAgICAgICAgIGZpbHRlcnNCeUluZGV4PXtmaWx0ZXJzQnlEYXRhc2V0c1tkYXRhSWRdfVxuICAgICAgICAgICAgICAgIGRhdGFzZXQ9e2RhdGFzZXRzW2RhdGFJZF19XG4gICAgICAgICAgICAgICAgey4uLmZpbHRlckxpc3RQcm9wc31cbiAgICAgICAgICAgICAgICB7Li4uc291cmNlRGF0YUNhdGFsb2dQcm9wc31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxGaWx0ZXJMaXN0IGZpbHRlcnNCeUluZGV4PXtmaWx0ZXJzQnlJbmRleH0gey4uLmZpbHRlckxpc3RQcm9wc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBGaWx0ZXJNYW5hZ2VyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJNYW5hZ2VyRmFjdG9y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