kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
150 lines (149 loc) • 31.3 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _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 _reactIntl = require("react-intl");
var _localization = require("@kepler.gl/localization");
var _styledComponents2 = require("../../common/styled-components");
var _datasetTag = _interopRequireDefault(require("../common/dataset-tag"));
var _tooltipChicklet = _interopRequireDefault(require("./tooltip-config/tooltip-chicklet"));
var _switch = _interopRequireDefault(require("../../common/switch"));
var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector"));
var _constants = require("@kepler.gl/constants");
var _fieldSelector = _interopRequireDefault(require("../../common/field-selector"));
var _templateObject, _templateObject2, _templateObject3; // 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; }
var TooltipConfigWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .item-selector > div > div {\n overflow: visible;\n }\n"])));
var ButtonWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: inherit;\n padding: 0;\n\n .button.clear-all {\n background: transparent;\n color: ", ";\n margin: 0 0 0 8px;\n padding: 0;\n\n &:hover {\n color: ", ";\n }\n }\n"])), function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.textColor;
});
var CompareSwitchWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n display: flex;\n font-size: ", ";\n justify-content: space-between;\n line-height: 11px;\n margin-bottom: 8px;\n"])), function (props) {
return props.theme.labelColor;
}, function (props) {
return props.theme.inputFontSize;
});
TooltipConfigFactory.deps = [_datasetTag["default"], _fieldSelector["default"]];
function TooltipConfigFactory(DatasetTag, FieldSelector) {
var DatasetTooltipConfig = function DatasetTooltipConfig(_ref) {
var config = _ref.config,
onChange = _ref.onChange,
dataset = _ref.dataset,
onDisplayFormatChange = _ref.onDisplayFormatChange;
var dataId = dataset.id;
var handleClick = (0, _react.useCallback)(function () {
return onChange(_objectSpread(_objectSpread({}, config), {}, {
fieldsToShow: _objectSpread(_objectSpread({}, config.fieldsToShow), {}, (0, _defineProperty2["default"])({}, dataId, []))
}));
}, [config, dataId, onChange]);
var findSelectedHelper = (0, _react.useCallback)(function (selected, tooltipFields) {
return selected.map(function (f) {
return tooltipFields.find(function (tooltipField) {
return tooltipField.name === f.name;
}) || {
name: f.name,
// default initial tooltip is null
format: null
};
});
}, []);
var handleSelect = (0, _react.useCallback)(function (selected) {
var newConfig = _objectSpread(_objectSpread({}, config), {}, {
fieldsToShow: _objectSpread(_objectSpread({}, config.fieldsToShow), {}, (0, _defineProperty2["default"])({}, dataId, findSelectedHelper(selected, config.fieldsToShow[dataId])))
});
onChange(newConfig);
}, [config, dataId, onChange, findSelectedHelper]);
var handleReorderItems = (0, _react.useCallback)(function (newOrder) {
return onChange(_objectSpread(_objectSpread({}, config), {}, {
fieldsToShow: _objectSpread(_objectSpread({}, config.fieldsToShow), {}, (0, _defineProperty2["default"])({}, dataId, newOrder))
}));
}, [config, dataId, onChange]);
return /*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, {
key: dataId
}, /*#__PURE__*/_react["default"].createElement(_styledComponents2.SBFlexboxNoMargin, null, /*#__PURE__*/_react["default"].createElement(DatasetTag, {
dataset: dataset
}), Boolean(config.fieldsToShow[dataId].length) && /*#__PURE__*/_react["default"].createElement(ButtonWrapper, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, {
className: "clear-all",
onClick: handleClick,
width: "54px",
secondary: true
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "fieldSelector.clearAll"
})))), /*#__PURE__*/_react["default"].createElement(FieldSelector, {
fields: dataset.fields,
value: config.fieldsToShow[dataId],
onSelect: handleSelect,
reorderItems: handleReorderItems,
closeOnSelect: false,
multiSelect: true,
inputTheme: "secondary",
CustomChickletComponent: (0, _tooltipChicklet["default"])(dataId, config, onChange, dataset.fields, onDisplayFormatChange)
}));
};
var TooltipConfig = function TooltipConfig(_ref2) {
var config = _ref2.config,
datasets = _ref2.datasets,
_onChange = _ref2.onChange,
onDisplayFormatChange = _ref2.onDisplayFormatChange,
intl = _ref2.intl;
var handleChange = (0, _react.useCallback)(function (option) {
return _onChange(_objectSpread(_objectSpread({}, config), {}, {
compareType: option
}));
}, [config, _onChange]);
return /*#__PURE__*/_react["default"].createElement(TooltipConfigWrapper, null, Object.keys(config.fieldsToShow).map(function (dataId) {
return dataId === _constants.GEOCODER_DATASET_NAME ? null : /*#__PURE__*/_react["default"].createElement(DatasetTooltipConfig, {
key: dataId,
config: config,
onChange: _onChange,
dataset: datasets[dataId],
onDisplayFormatChange: onDisplayFormatChange
});
}), /*#__PURE__*/_react["default"].createElement(CompareSwitchWrapper, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "compare.modeLabel"
}), /*#__PURE__*/_react["default"].createElement(_switch["default"], {
checked: config.compareMode,
id: "compare-mode-toggle",
onChange: function onChange() {
var newConfig = _objectSpread(_objectSpread({}, config), {}, {
compareMode: !config.compareMode
});
_onChange(newConfig);
},
secondary: true
})), /*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "compare.typeLabel"
})), /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], {
disabled: !config.compareMode,
displayOption: function displayOption(d) {
return intl.formatMessage({
id: "compare.types.".concat(d)
});
},
selectedItems: config.compareType,
options: Object.values(_constants.COMPARE_TYPES),
multiSelect: false,
searchable: false,
inputTheme: 'secondary',
getOptionValue: function getOptionValue(d) {
return d;
},
onChange: handleChange
})));
};
return (0, _reactIntl.injectIntl)(TooltipConfig);
}
var _default = exports["default"] = TooltipConfigFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX2xvY2FsaXphdGlvbiIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9kYXRhc2V0VGFnIiwiX3Rvb2x0aXBDaGlja2xldCIsIl9zd2l0Y2giLCJfaXRlbVNlbGVjdG9yIiwiX2NvbnN0YW50cyIsIl9maWVsZFNlbGVjdG9yIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUb29sdGlwQ29uZmlnV3JhcHBlciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiQnV0dG9uV3JhcHBlciIsInByb3BzIiwidGhlbWUiLCJzdWJ0ZXh0Q29sb3IiLCJ0ZXh0Q29sb3IiLCJDb21wYXJlU3dpdGNoV3JhcHBlciIsImxhYmVsQ29sb3IiLCJpbnB1dEZvbnRTaXplIiwiVG9vbHRpcENvbmZpZ0ZhY3RvcnkiLCJkZXBzIiwiRGF0YXNldFRhZ0ZhY3RvcnkiLCJGaWVsZFNlbGVjdG9yRmFjdG9yeSIsIkRhdGFzZXRUYWciLCJGaWVsZFNlbGVjdG9yIiwiRGF0YXNldFRvb2x0aXBDb25maWciLCJfcmVmIiwiY29uZmlnIiwib25DaGFuZ2UiLCJkYXRhc2V0Iiwib25EaXNwbGF5Rm9ybWF0Q2hhbmdlIiwiZGF0YUlkIiwiaWQiLCJoYW5kbGVDbGljayIsInVzZUNhbGxiYWNrIiwiZmllbGRzVG9TaG93IiwiZmluZFNlbGVjdGVkSGVscGVyIiwic2VsZWN0ZWQiLCJ0b29sdGlwRmllbGRzIiwibWFwIiwiZiIsImZpbmQiLCJ0b29sdGlwRmllbGQiLCJuYW1lIiwiZm9ybWF0IiwiaGFuZGxlU2VsZWN0IiwibmV3Q29uZmlnIiwiaGFuZGxlUmVvcmRlckl0ZW1zIiwibmV3T3JkZXIiLCJjcmVhdGVFbGVtZW50IiwiU2lkZVBhbmVsU2VjdGlvbiIsImtleSIsIlNCRmxleGJveE5vTWFyZ2luIiwiQm9vbGVhbiIsIkJ1dHRvbiIsImNsYXNzTmFtZSIsIm9uQ2xpY2siLCJ3aWR0aCIsInNlY29uZGFyeSIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJmaWVsZHMiLCJ2YWx1ZSIsIm9uU2VsZWN0IiwicmVvcmRlckl0ZW1zIiwiY2xvc2VPblNlbGVjdCIsIm11bHRpU2VsZWN0IiwiaW5wdXRUaGVtZSIsIkN1c3RvbUNoaWNrbGV0Q29tcG9uZW50IiwiVG9vbHRpcENoaWNrbGV0RmFjdG9yeSIsIlRvb2x0aXBDb25maWciLCJfcmVmMiIsImRhdGFzZXRzIiwiaW50bCIsImhhbmRsZUNoYW5nZSIsIm9wdGlvbiIsImNvbXBhcmVUeXBlIiwiR0VPQ09ERVJfREFUQVNFVF9OQU1FIiwiY2hlY2tlZCIsImNvbXBhcmVNb2RlIiwiUGFuZWxMYWJlbCIsImRpc2FibGVkIiwiZGlzcGxheU9wdGlvbiIsImQiLCJmb3JtYXRNZXNzYWdlIiwiY29uY2F0Iiwic2VsZWN0ZWRJdGVtcyIsIm9wdGlvbnMiLCJ2YWx1ZXMiLCJDT01QQVJFX1RZUEVTIiwic2VhcmNoYWJsZSIsImdldE9wdGlvblZhbHVlIiwiaW5qZWN0SW50bCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaWRlLXBhbmVsL2ludGVyYWN0aW9uLXBhbmVsL3Rvb2x0aXAtY29uZmlnLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFja30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcblxuaW1wb3J0IHtcbiAgU2lkZVBhbmVsU2VjdGlvbixcbiAgU0JGbGV4Ym94Tm9NYXJnaW4sXG4gIEJ1dHRvbixcbiAgUGFuZWxMYWJlbFxufSBmcm9tICcuLi8uLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IERhdGFzZXRUYWdGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9kYXRhc2V0LXRhZyc7XG5pbXBvcnQgVG9vbHRpcENoaWNrbGV0RmFjdG9yeSBmcm9tICcuL3Rvb2x0aXAtY29uZmlnL3Rvb2x0aXAtY2hpY2tsZXQnO1xuaW1wb3J0IFN3aXRjaCBmcm9tICcuLi8uLi9jb21tb24vc3dpdGNoJztcbmltcG9ydCBJdGVtU2VsZWN0b3IgZnJvbSAnLi4vLi4vY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5pbXBvcnQge0NPTVBBUkVfVFlQRVMsIEdFT0NPREVSX0RBVEFTRVRfTkFNRX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IEZpZWxkU2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uLy4uL2NvbW1vbi9maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQgS2VwbGVyVGFibGUsIHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmNvbnN0IFRvb2x0aXBDb25maWdXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgLml0ZW0tc2VsZWN0b3IgPiBkaXYgPiBkaXYge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5gO1xuXG5jb25zdCBCdXR0b25XcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogaW5oZXJpdDtcbiAgcGFkZGluZzogMDtcblxuICAuYnV0dG9uLmNsZWFyLWFsbCB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc3VidGV4dENvbG9yfTtcbiAgICBtYXJnaW46IDAgMCAwIDhweDtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgQ29tcGFyZVN3aXRjaFdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5sYWJlbENvbG9yfTtcbiAgZGlzcGxheTogZmxleDtcbiAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmlucHV0Rm9udFNpemV9O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG5gO1xuXG50eXBlIFRvb2x0aXBDb25maWdQcm9wcyA9IHtcbiAgY29uZmlnOiB7XG4gICAgZmllbGRzVG9TaG93OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB7bmFtZTogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZyB8IG51bGx9W107XG4gICAgfTtcbiAgICBjb21wYXJlTW9kZTogYm9vbGVhbjtcbiAgICBjb21wYXJlVHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgfTtcbiAgb25DaGFuZ2U6IChjb25maWc6IHtcbiAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHtuYW1lOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nIHwgbnVsbH1bXTtcbiAgICB9O1xuICAgIGNvbXBhcmVNb2RlOiBib29sZWFuO1xuICAgIGNvbXBhcmVUeXBlOiBzdHJpbmcgfCBudWxsO1xuICB9KSA9PiB2b2lkO1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGludGw6IEludGxTaGFwZTtcbiAgb25EaXNwbGF5Rm9ybWF0Q2hhbmdlOiAoZGF0YUlkLCBjb2x1bW4sIGRpc3BsYXlGb3JtYXQpID0+IHZvaWQ7XG59O1xuXG50eXBlIERhdGFzZXRUb29sdGlwQ29uZmlnUHJvcHMgPSB7XG4gIGNvbmZpZzoge1xuICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgW2tleTogc3RyaW5nXToge25hbWU6IHN0cmluZzsgZm9ybWF0OiBzdHJpbmcgfCBudWxsfVtdO1xuICAgIH07XG4gICAgY29tcGFyZU1vZGU6IGJvb2xlYW47XG4gICAgY29tcGFyZVR5cGU6IHN0cmluZyB8IG51bGw7XG4gIH07XG4gIG9uQ2hhbmdlOiAoY29uZmlnOiB7XG4gICAgZmllbGRzVG9TaG93OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB7bmFtZTogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZyB8IG51bGx9W107XG4gICAgfTtcbiAgICBjb21wYXJlTW9kZTogYm9vbGVhbjtcbiAgICBjb21wYXJlVHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgfSkgPT4gdm9pZDtcbiAgZGF0YXNldDogS2VwbGVyVGFibGU7XG4gIG9uRGlzcGxheUZvcm1hdENoYW5nZTogKGRhdGFJZCwgY29sdW1uLCBkaXNwbGF5Rm9ybWF0KSA9PiB2b2lkO1xufTtcblxuVG9vbHRpcENvbmZpZ0ZhY3RvcnkuZGVwcyA9IFtEYXRhc2V0VGFnRmFjdG9yeSwgRmllbGRTZWxlY3RvckZhY3RvcnldO1xuZnVuY3Rpb24gVG9vbHRpcENvbmZpZ0ZhY3RvcnkoXG4gIERhdGFzZXRUYWc6IFJldHVyblR5cGU8dHlwZW9mIERhdGFzZXRUYWdGYWN0b3J5PixcbiAgRmllbGRTZWxlY3RvcjogUmV0dXJuVHlwZTx0eXBlb2YgRmllbGRTZWxlY3RvckZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgRGF0YXNldFRvb2x0aXBDb25maWcgPSAoe1xuICAgIGNvbmZpZyxcbiAgICBvbkNoYW5nZSxcbiAgICBkYXRhc2V0LFxuICAgIG9uRGlzcGxheUZvcm1hdENoYW5nZVxuICB9OiBEYXRhc2V0VG9vbHRpcENvbmZpZ1Byb3BzKSA9PiB7XG4gICAgY29uc3QgZGF0YUlkID0gZGF0YXNldC5pZDtcblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgICAoKSA9PlxuICAgICAgICBvbkNoYW5nZSh7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIFtkYXRhSWRdOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICBbY29uZmlnLCBkYXRhSWQsIG9uQ2hhbmdlXVxuICAgICk7XG5cbiAgICBjb25zdCBmaW5kU2VsZWN0ZWRIZWxwZXIgPSB1c2VDYWxsYmFjaygoc2VsZWN0ZWQsIHRvb2x0aXBGaWVsZHMpID0+IHtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5tYXAoXG4gICAgICAgIGYgPT5cbiAgICAgICAgICB0b29sdGlwRmllbGRzLmZpbmQodG9vbHRpcEZpZWxkID0+IHRvb2x0aXBGaWVsZC5uYW1lID09PSBmLm5hbWUpIHx8IHtcbiAgICAgICAgICAgIG5hbWU6IGYubmFtZSxcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgaW5pdGlhbCB0b29sdGlwIGlzIG51bGxcbiAgICAgICAgICAgIGZvcm1hdDogbnVsbFxuICAgICAgICAgIH1cbiAgICAgICk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgICBzZWxlY3RlZCA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0NvbmZpZzogRGF0YXNldFRvb2x0aXBDb25maWdQcm9wc1snY29uZmlnJ10gPSB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIFtkYXRhSWRdOiBmaW5kU2VsZWN0ZWRIZWxwZXIoc2VsZWN0ZWQsIGNvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXSlcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG9uQ2hhbmdlKG5ld0NvbmZpZyk7XG4gICAgICB9LFxuICAgICAgW2NvbmZpZywgZGF0YUlkLCBvbkNoYW5nZSwgZmluZFNlbGVjdGVkSGVscGVyXVxuICAgICk7XG5cbiAgICBjb25zdCBoYW5kbGVSZW9yZGVySXRlbXMgPSB1c2VDYWxsYmFjayhcbiAgICAgIG5ld09yZGVyID0+XG4gICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgICAuLi5jb25maWcuZmllbGRzVG9TaG93LFxuICAgICAgICAgICAgW2RhdGFJZF06IG5ld09yZGVyXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIFtjb25maWcsIGRhdGFJZCwgb25DaGFuZ2VdXG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFNpZGVQYW5lbFNlY3Rpb24ga2V5PXtkYXRhSWR9PlxuICAgICAgICA8U0JGbGV4Ym94Tm9NYXJnaW4+XG4gICAgICAgICAgPERhdGFzZXRUYWcgZGF0YXNldD17ZGF0YXNldH0gLz5cbiAgICAgICAgICB7Qm9vbGVhbihjb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0ubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgICA8QnV0dG9uV3JhcHBlcj5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJjbGVhci1hbGxcIiBvbkNsaWNrPXtoYW5kbGVDbGlja30gd2lkdGg9XCI1NHB4XCIgc2Vjb25kYXJ5PlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwiZmllbGRTZWxlY3Rvci5jbGVhckFsbFwiIC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9CdXR0b25XcmFwcGVyPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU0JGbGV4Ym94Tm9NYXJnaW4+XG4gICAgICAgIDxGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgZmllbGRzPXtkYXRhc2V0LmZpZWxkc31cbiAgICAgICAgICB2YWx1ZT17Y29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdfVxuICAgICAgICAgIG9uU2VsZWN0PXtoYW5kbGVTZWxlY3R9XG4gICAgICAgICAgcmVvcmRlckl0ZW1zPXtoYW5kbGVSZW9yZGVySXRlbXN9XG4gICAgICAgICAgY2xvc2VPblNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgbXVsdGlTZWxlY3RcbiAgICAgICAgICBpbnB1dFRoZW1lPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBDdXN0b21DaGlja2xldENvbXBvbmVudD17VG9vbHRpcENoaWNrbGV0RmFjdG9yeShcbiAgICAgICAgICAgIGRhdGFJZCxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICAgICAgZGF0YXNldC5maWVsZHMsXG4gICAgICAgICAgICBvbkRpc3BsYXlGb3JtYXRDaGFuZ2VcbiAgICAgICAgICApfVxuICAgICAgICAvPlxuICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgVG9vbHRpcENvbmZpZyA9ICh7XG4gICAgY29uZmlnLFxuICAgIGRhdGFzZXRzLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uRGlzcGxheUZvcm1hdENoYW5nZSxcbiAgICBpbnRsXG4gIH06IFRvb2x0aXBDb25maWdQcm9wcykgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKG9wdGlvbjogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG9iamVjdCB8IG51bGwpID0+XG4gICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgY29tcGFyZVR5cGU6IG9wdGlvbiBhcyBzdHJpbmcgfCBudWxsXG4gICAgICAgIH0pLFxuICAgICAgW2NvbmZpZywgb25DaGFuZ2VdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8VG9vbHRpcENvbmZpZ1dyYXBwZXI+XG4gICAgICAgIHtPYmplY3Qua2V5cyhjb25maWcuZmllbGRzVG9TaG93KS5tYXAoZGF0YUlkID0+XG4gICAgICAgICAgZGF0YUlkID09PSBHRU9DT0RFUl9EQVRBU0VUX05BTUUgPyBudWxsIDogKFxuICAgICAgICAgICAgPERhdGFzZXRUb29sdGlwQ29uZmlnXG4gICAgICAgICAgICAgIGtleT17ZGF0YUlkfVxuICAgICAgICAgICAgICBjb25maWc9e2NvbmZpZ31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgICAgICBkYXRhc2V0PXtkYXRhc2V0c1tkYXRhSWRdfVxuICAgICAgICAgICAgICBvbkRpc3BsYXlGb3JtYXRDaGFuZ2U9e29uRGlzcGxheUZvcm1hdENoYW5nZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICApfVxuICAgICAgICA8Q29tcGFyZVN3aXRjaFdyYXBwZXI+XG4gICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9XCJjb21wYXJlLm1vZGVMYWJlbFwiIC8+XG4gICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgY2hlY2tlZD17Y29uZmlnLmNvbXBhcmVNb2RlfVxuICAgICAgICAgICAgaWQ9XCJjb21wYXJlLW1vZGUtdG9nZ2xlXCJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0NvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgY29tcGFyZU1vZGU6ICFjb25maWcuY29tcGFyZU1vZGVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgb25DaGFuZ2UobmV3Q29uZmlnKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBzZWNvbmRhcnlcbiAgICAgICAgICAvPlxuICAgICAgICA8L0NvbXBhcmVTd2l0Y2hXcmFwcGVyPlxuICAgICAgICA8U2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgICA8UGFuZWxMYWJlbD5cbiAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwiY29tcGFyZS50eXBlTGFiZWxcIiAvPlxuICAgICAgICAgIDwvUGFuZWxMYWJlbD5cbiAgICAgICAgICA8SXRlbVNlbGVjdG9yXG4gICAgICAgICAgICBkaXNhYmxlZD17IWNvbmZpZy5jb21wYXJlTW9kZX1cbiAgICAgICAgICAgIGRpc3BsYXlPcHRpb249e2QgPT5cbiAgICAgICAgICAgICAgaW50bC5mb3JtYXRNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogYGNvbXBhcmUudHlwZXMuJHtkfWBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXM9e2NvbmZpZy5jb21wYXJlVHlwZX1cbiAgICAgICAgICAgIG9wdGlvbnM9e09iamVjdC52YWx1ZXMoQ09NUEFSRV9UWVBFUyl9XG4gICAgICAgICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICAgICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgICAgICAgIGlucHV0VGhlbWU9eydzZWNvbmRhcnknfVxuICAgICAgICAgICAgZ2V0T3B0aW9uVmFsdWU9e2QgPT4gZH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgPC9Ub29sdGlwQ29uZmlnV3JhcHBlcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBpbmplY3RJbnRsKFRvb2x0aXBDb25maWcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUb29sdGlwQ29uZmlnRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxrQkFBQSxHQUFBTCxPQUFBO0FBTUEsSUFBQU0sV0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLGNBQUEsR0FBQVQsc0JBQUEsQ0FBQUYsT0FBQTtBQUErRCxJQUFBWSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBbkIvRDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFqQix3QkFBQWlCLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENB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QUFtQixDQUFFLENBQUMsZUFDM0M3RSxNQUFBLFlBQUE4RixhQUFBLENBQUNwRixPQUFBLFdBQU07TUFDTGdILE9BQU8sRUFBRWxELE1BQU0sQ0FBQ21ELFdBQVk7TUFDNUI5QyxFQUFFLEVBQUMscUJBQXFCO01BQ3hCSixRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBQSxFQUFRO1FBQ2QsSUFBTWtCLFNBQVMsR0FBQTlDLGFBQUEsQ0FBQUEsYUFBQSxLQUNWMkIsTUFBTTtVQUNUbUQsV0FBVyxFQUFFLENBQUNuRCxNQUFNLENBQUNtRDtRQUFXLEVBQ2pDO1FBQ0RsRCxTQUFRLENBQUNrQixTQUFTLENBQUM7TUFDckIsQ0FBRTtNQUNGWSxTQUFTO0lBQUEsQ0FDVixDQUNtQixDQUFDLGVBQ3ZCdkcsTUFBQSxZQUFBOEYsYUFBQSxDQUFDdkYsa0JBQUEsQ0FBQXdGLGdCQUFnQixxQkFDZi9GLE1BQUEsWUFBQThGLGFBQUEsQ0FBQ3ZGLGtCQUFBLENBQUFxSCxVQUFVLHFCQUNUNUgsTUFBQSxZQUFBOEYsYUFBQSxDQUFDeEYsYUFBQSxDQUFBa0csZ0JBQWdCO01BQUMzQixFQUFFLEVBQUM7SUFBbUIsQ0FBRSxDQUNoQyxDQUFDLGVBQ2I3RSxNQUFBLFlBQUE4RixhQUFBLENBQUNuRixhQUFBLFdBQVk7TUFDWGtILFFBQVEsRUFBRSxDQUFDckQsTUFBTSxDQUFDbUQsV0FBWTtNQUM5QkcsYUFBYSxFQUFFLFNBQWZBLGFBQWFBLENBQUVDLENBQUM7UUFBQSxPQUNkVixJQUFJLENBQUNXLGFBQWEsQ0FBQztVQUNqQm5ELEVBQUUsbUJBQUFvRCxNQUFBLENBQW1CRixDQUFDO1FBQ3hCLENBQUMsQ0FBQztNQUFBLENBQ0g7TUFDREcsYUFBYSxFQUFFMUQsTUFBTSxDQUFDZ0QsV0FBWTtNQUNsQ1csT0FBTyxFQUFFdEcsTUFBTSxDQUFDdUcsTUFBTSxDQUFDQyx3QkFBYSxDQUFFO01BQ3RDdkIsV0FBVyxFQUFFLEtBQU07TUFDbkJ3QixVQUFVLEVBQUUsS0FBTTtNQUNsQnZCLFVBQVUsRUFBRSxXQUFZO01BQ3hCd0IsY0FBYyxFQUFFLFNBQWhCQSxjQUFjQSxDQUFFUixDQUFDO1FBQUEsT0FBSUEsQ0FBQztNQUFBLENBQUM7TUFDdkJ0RCxRQUFRLEVBQUU2QztJQUFhLENBQ3hCLENBQ2UsQ0FDRSxDQUFDO0VBRTNCLENBQUM7RUFFRCxPQUFPLElBQUFrQixxQkFBVSxFQUFDdEIsYUFBYSxDQUFDO0FBQ2xDO0FBQUMsSUFBQXVCLFFBQUEsR0FBQUMsT0FBQSxjQUVjMUUsb0JBQW9CIiwiaWdub3JlTGlzdCI6W119
;