kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
172 lines (170 loc) • 28.8 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
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 _classnames3 = _interopRequireDefault(require("classnames"));
var _sortable = require("@dnd-kit/sortable");
var _utilities = require("@dnd-kit/utilities");
var _layerPanel = _interopRequireDefault(require("./layer-panel"));
var _utils = require("@kepler.gl/utils");
var _constants = require("@kepler.gl/constants");
var _dndLayerItems = require("../../common/dnd-layer-items");
var _templateObject, _templateObject2; // 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; }
// make sure the element is always visible while is being dragged
// item being dragged is appended in body, here to reset its global style
var Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n gap: 8px;\n"])));
var SortableStyledItem = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n transition: ", ";\n transform: ", ";\n &.sorting {\n opacity: 0.3;\n pointer-events: none;\n }\n &.sorting-layers .layer-panel__header {\n background-color: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-size: ", ";\n line-height: ", ";\n *,\n *:before,\n *:after {\n box-sizing: border-box;\n }\n .layer__drag-handle {\n opacity: 1;\n color: ", ";\n }\n }\n"])), function (props) {
return props.$transition;
}, function (props) {
return props.$transform;
}, function (props) {
return props.theme.panelBackgroundHover;
}, function (props) {
return props.theme.fontFamily;
}, function (props) {
return props.theme.fontWeight;
}, function (props) {
return props.theme.fontSize;
}, function (props) {
return props.theme.lineHeight;
}, function (props) {
return props.theme.textColorHl;
});
var INITIAL_LAYERS_TO_SHOW = [];
LayerListFactory.deps = [_layerPanel["default"]];
function LayerListFactory(LayerPanel) {
// By wrapping layer panel using a sortable element we don't have to implement the drag and drop logic into the panel itself;
// Developers can provide any layer panel implementation and it will still be sortable
var SortableItem = function SortableItem(_ref) {
var layer = _ref.layer,
idx = _ref.idx,
panelProps = _ref.panelProps,
layerActions = _ref.layerActions,
disabled = _ref.disabled;
var _useSortable = (0, _sortable.useSortable)({
id: layer.id,
data: {
type: _dndLayerItems.SORTABLE_LAYER_TYPE,
parent: _dndLayerItems.SORTABLE_SIDE_PANEL_TYPE
},
disabled: disabled
}),
attributes = _useSortable.attributes,
listeners = _useSortable.listeners,
setNodeRef = _useSortable.setNodeRef,
isDragging = _useSortable.isDragging,
transform = _useSortable.transform,
transition = _useSortable.transition;
return /*#__PURE__*/_react["default"].createElement(SortableStyledItem, (0, _extends2["default"])({
ref: setNodeRef,
className: (0, _classnames3["default"])((0, _defineProperty2["default"])({}, _constants.dataTestIds.sortableLayerItem, !disabled), (0, _defineProperty2["default"])({}, _constants.dataTestIds.staticLayerItem, disabled), {
sorting: isDragging
}),
"data-testid": disabled ? _constants.dataTestIds.staticLayerItem : _constants.dataTestIds.sortableLayerItem,
$transform: _utilities.CSS.Transform.toString(transform),
$transition: transition
}, attributes), /*#__PURE__*/_react["default"].createElement(LayerPanel, (0, _extends2["default"])({}, panelProps, layerActions, {
key: layer.id,
idx: idx,
layer: layer,
listeners: listeners,
isDraggable: !disabled
})));
};
var LayerList = function LayerList(props) {
var layers = props.layers,
datasets = props.datasets,
layerOrder = props.layerOrder,
uiStateActions = props.uiStateActions,
visStateActions = props.visStateActions,
mapStateActions = props.mapStateActions,
layerClasses = props.layerClasses,
_props$isSortable = props.isSortable,
isSortable = _props$isSortable === void 0 ? true : _props$isSortable,
splitMap = props.splitMap;
var openModal = uiStateActions.toggleModal;
var layersToShow = (0, _react.useMemo)(function () {
return layerOrder.reduce(function (acc, layerId) {
var layer = (0, _utils.findById)(layerId)(layers.filter(Boolean));
if (!layer) {
return acc;
}
return !layer.config.hidden ? [].concat((0, _toConsumableArray2["default"])(acc), [layer]) : acc;
}, INITIAL_LAYERS_TO_SHOW);
}, [layers, layerOrder]);
var sidePanelDndItems = (0, _react.useMemo)(function () {
return layersToShow.map(function (_ref2) {
var id = _ref2.id;
return id;
});
}, [layersToShow]);
var layerTypeOptions = (0, _react.useMemo)(function () {
return Object.keys(layerClasses).map(function (key) {
var layer = new layerClasses[key]({
dataId: ''
});
return {
id: key,
label: layer.name,
icon: layer.layerIcon,
requireData: layer.requireData
};
});
}, [layerClasses]);
var layerActions = (0, _react.useMemo)(function () {
return {
layerColorUIChange: visStateActions.layerColorUIChange,
layerConfigChange: visStateActions.layerConfigChange,
layerVisualChannelConfigChange: visStateActions.layerVisualChannelConfigChange,
layerToggleVisibility: visStateActions.layerToggleVisibility,
layerTypeChange: visStateActions.layerTypeChange,
layerVisConfigChange: visStateActions.layerVisConfigChange,
layerTextLabelChange: visStateActions.layerTextLabelChange,
removeLayer: visStateActions.removeLayer,
zoomToLayer: mapStateActions.fitBounds,
duplicateLayer: visStateActions.duplicateLayer,
layerSetIsValid: visStateActions.layerSetIsValid
};
}, [visStateActions, mapStateActions]);
var panelProps = (0, _react.useMemo)(function () {
return {
datasets: datasets,
openModal: openModal,
layerTypeOptions: layerTypeOptions,
splitMap: splitMap
};
}, [datasets, openModal, layerTypeOptions, splitMap]);
return /*#__PURE__*/_react["default"].createElement(Container, null, /*#__PURE__*/_react["default"].createElement(_sortable.SortableContext, {
id: _dndLayerItems.SORTABLE_SIDE_PANEL_TYPE,
items: sidePanelDndItems,
strategy: _sortable.verticalListSortingStrategy,
disabled: !isSortable
}, layersToShow.map(function (layer) {
return /*#__PURE__*/_react["default"].createElement(SortableItem, {
key: layer.id,
layer: layer,
idx: layers.findIndex(function (l) {
return (l === null || l === void 0 ? void 0 : l.id) === layer.id;
}),
panelProps: panelProps,
layerActions: layerActions,
disabled: !isSortable
});
})));
};
return LayerList;
}
var _default = exports["default"] = LayerListFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lczMiLCJfc29ydGFibGUiLCJfdXRpbGl0aWVzIiwiX2xheWVyUGFuZWwiLCJfdXRpbHMiLCJfY29uc3RhbnRzIiwiX2RuZExheWVySXRlbXMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ29udGFpbmVyIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJTb3J0YWJsZVN0eWxlZEl0ZW0iLCJwcm9wcyIsIiR0cmFuc2l0aW9uIiwiJHRyYW5zZm9ybSIsInRoZW1lIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImZvbnRTaXplIiwibGluZUhlaWdodCIsInRleHRDb2xvckhsIiwiSU5JVElBTF9MQVlFUlNfVE9fU0hPVyIsIkxheWVyTGlzdEZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJMYXllclBhbmVsIiwiU29ydGFibGVJdGVtIiwiX3JlZiIsImxheWVyIiwiaWR4IiwicGFuZWxQcm9wcyIsImxheWVyQWN0aW9ucyIsImRpc2FibGVkIiwiX3VzZVNvcnRhYmxlIiwidXNlU29ydGFibGUiLCJpZCIsImRhdGEiLCJ0eXBlIiwiU09SVEFCTEVfTEFZRVJfVFlQRSIsInBhcmVudCIsIlNPUlRBQkxFX1NJREVfUEFORUxfVFlQRSIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwiaXNEcmFnZ2luZyIsInRyYW5zZm9ybSIsInRyYW5zaXRpb24iLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwicmVmIiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkYXRhVGVzdElkcyIsInNvcnRhYmxlTGF5ZXJJdGVtIiwic3RhdGljTGF5ZXJJdGVtIiwic29ydGluZyIsIkNTUyIsIlRyYW5zZm9ybSIsInRvU3RyaW5nIiwia2V5IiwiaXNEcmFnZ2FibGUiLCJMYXllckxpc3QiLCJsYXllcnMiLCJkYXRhc2V0cyIsImxheWVyT3JkZXIiLCJ1aVN0YXRlQWN0aW9ucyIsInZpc1N0YXRlQWN0aW9ucyIsIm1hcFN0YXRlQWN0aW9ucyIsImxheWVyQ2xhc3NlcyIsIl9wcm9wcyRpc1NvcnRhYmxlIiwiaXNTb3J0YWJsZSIsInNwbGl0TWFwIiwib3Blbk1vZGFsIiwidG9nZ2xlTW9kYWwiLCJsYXllcnNUb1Nob3ciLCJ1c2VNZW1vIiwicmVkdWNlIiwiYWNjIiwibGF5ZXJJZCIsImZpbmRCeUlkIiwiZmlsdGVyIiwiQm9vbGVhbiIsImNvbmZpZyIsImhpZGRlbiIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzaWRlUGFuZWxEbmRJdGVtcyIsIm1hcCIsIl9yZWYyIiwibGF5ZXJUeXBlT3B0aW9ucyIsImtleXMiLCJkYXRhSWQiLCJsYWJlbCIsIm5hbWUiLCJpY29uIiwibGF5ZXJJY29uIiwicmVxdWlyZURhdGEiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllckNvbmZpZ0NoYW5nZSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImxheWVyVG9nZ2xlVmlzaWJpbGl0eSIsImxheWVyVHlwZUNoYW5nZSIsImxheWVyVmlzQ29uZmlnQ2hhbmdlIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2UiLCJyZW1vdmVMYXllciIsInpvb21Ub0xheWVyIiwiZml0Qm91bmRzIiwiZHVwbGljYXRlTGF5ZXIiLCJsYXllclNldElzVmFsaWQiLCJTb3J0YWJsZUNvbnRleHQiLCJpdGVtcyIsInN0cmF0ZWd5IiwidmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5IiwiZmluZEluZGV4IiwibCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLWxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCB7TGF5ZXIsIExheWVyQ2xhc3Nlc1R5cGV9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7RGF0YXNldHN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtVSVN0YXRlQWN0aW9ucywgVmlzU3RhdGVBY3Rpb25zLCBNYXBTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbmltcG9ydCB7dXNlU29ydGFibGUsIFNvcnRhYmxlQ29udGV4dCwgdmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5fSBmcm9tICdAZG5kLWtpdC9zb3J0YWJsZSc7XG5pbXBvcnQge0NTU30gZnJvbSAnQGRuZC1raXQvdXRpbGl0aWVzJztcbmltcG9ydCBMYXllclBhbmVsRmFjdG9yeSBmcm9tICcuL2xheWVyLXBhbmVsJztcbmltcG9ydCB7ZmluZEJ5SWR9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtkYXRhVGVzdElkc30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtTcGxpdE1hcH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1NPUlRBQkxFX0xBWUVSX1RZUEUsIFNPUlRBQkxFX1NJREVfUEFORUxfVFlQRX0gZnJvbSAnLi4vLi4vY29tbW9uL2RuZC1sYXllci1pdGVtcyc7XG5cbmV4cG9ydCB0eXBlIExheWVyTGlzdFByb3BzID0ge1xuICBkYXRhc2V0czogRGF0YXNldHM7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJPcmRlcjogc3RyaW5nW107XG4gIGxheWVyQ2xhc3NlczogTGF5ZXJDbGFzc2VzVHlwZTtcbiAgaXNTb3J0YWJsZT86IGJvb2xlYW47XG4gIHNwbGl0TWFwPzogU3BsaXRNYXA7XG4gIHVpU3RhdGVBY3Rpb25zOiB0eXBlb2YgVUlTdGF0ZUFjdGlvbnM7XG4gIHZpc1N0YXRlQWN0aW9uczogdHlwZW9mIFZpc1N0YXRlQWN0aW9ucztcbiAgbWFwU3RhdGVBY3Rpb25zOiB0eXBlb2YgTWFwU3RhdGVBY3Rpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgTGF5ZXJMaXN0RmFjdG9yeURlcHMgPSBbdHlwZW9mIExheWVyUGFuZWxGYWN0b3J5XTtcblxuLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFsd2F5cyB2aXNpYmxlIHdoaWxlIGlzIGJlaW5nIGRyYWdnZWRcbi8vIGl0ZW0gYmVpbmcgZHJhZ2dlZCBpcyBhcHBlbmRlZCBpbiBib2R5LCBoZXJlIHRvIHJlc2V0IGl0cyBnbG9iYWwgc3R5bGVcblxuY29uc3QgQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiA4cHg7XG5gO1xuXG5pbnRlcmZhY2UgU29ydGFibGVTdHlsZWRJdGVtUHJvcHMge1xuICAkdHJhbnNpdGlvbj86IHN0cmluZztcbiAgJHRyYW5zZm9ybT86IHN0cmluZztcbn1cblxuY29uc3QgU29ydGFibGVTdHlsZWRJdGVtID0gc3R5bGVkLmRpdjxTb3J0YWJsZVN0eWxlZEl0ZW1Qcm9wcz5gXG4gIHRyYW5zaXRpb246ICR7cHJvcHMgPT4gcHJvcHMuJHRyYW5zaXRpb259O1xuICB0cmFuc2Zvcm06ICR7cHJvcHMgPT4gcHJvcHMuJHRyYW5zZm9ybX07XG4gICYuc29ydGluZyB7XG4gICAgb3BhY2l0eTogMC4zO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG4gICYuc29ydGluZy1sYXllcnMgLmxheWVyLXBhbmVsX19oZWFkZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHl9O1xuICAgIGZvbnQtd2VpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRXZWlnaHR9O1xuICAgIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5mb250U2l6ZX07XG4gICAgbGluZS1oZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGluZUhlaWdodH07XG4gICAgKixcbiAgICAqOmJlZm9yZSxcbiAgICAqOmFmdGVyIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5sYXllcl9fZHJhZy1oYW5kbGUge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IElOSVRJQUxfTEFZRVJTX1RPX1NIT1c6IExheWVyW10gPSBbXTtcblxuTGF5ZXJMaXN0RmFjdG9yeS5kZXBzID0gW0xheWVyUGFuZWxGYWN0b3J5XTtcblxuZnVuY3Rpb24gTGF5ZXJMaXN0RmFjdG9yeShMYXllclBhbmVsOiBSZXR1cm5UeXBlPHR5cGVvZiBMYXllclBhbmVsRmFjdG9yeT4pIHtcbiAgLy8gQnkgd3JhcHBpbmcgbGF5ZXIgcGFuZWwgdXNpbmcgYSBzb3J0YWJsZSBlbGVtZW50IHdlIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBkcmFnIGFuZCBkcm9wIGxvZ2ljIGludG8gdGhlIHBhbmVsIGl0c2VsZjtcbiAgLy8gRGV2ZWxvcGVycyBjYW4gcHJvdmlkZSBhbnkgbGF5ZXIgcGFuZWwgaW1wbGVtZW50YXRpb24gYW5kIGl0IHdpbGwgc3RpbGwgYmUgc29ydGFibGVcbiAgY29uc3QgU29ydGFibGVJdGVtID0gKHtsYXllciwgaWR4LCBwYW5lbFByb3BzLCBsYXllckFjdGlvbnMsIGRpc2FibGVkfSkgPT4ge1xuICAgIGNvbnN0IHthdHRyaWJ1dGVzLCBsaXN0ZW5lcnMsIHNldE5vZGVSZWYsIGlzRHJhZ2dpbmcsIHRyYW5zZm9ybSwgdHJhbnNpdGlvbn0gPSB1c2VTb3J0YWJsZSh7XG4gICAgICBpZDogbGF5ZXIuaWQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHR5cGU6IFNPUlRBQkxFX0xBWUVSX1RZUEUsXG4gICAgICAgIHBhcmVudDogU09SVEFCTEVfU0lERV9QQU5FTF9UWVBFXG4gICAgICB9LFxuICAgICAgZGlzYWJsZWRcbiAgICB9KTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U29ydGFibGVTdHlsZWRJdGVtXG4gICAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKFxuICAgICAgICAgIHtbZGF0YVRlc3RJZHMuc29ydGFibGVMYXllckl0ZW1dOiAhZGlzYWJsZWR9LFxuICAgICAgICAgIHtbZGF0YVRlc3RJZHMuc3RhdGljTGF5ZXJJdGVtXTogZGlzYWJsZWR9LFxuICAgICAgICAgIHtzb3J0aW5nOiBpc0RyYWdnaW5nfVxuICAgICAgICApfVxuICAgICAgICBkYXRhLXRlc3RpZD17ZGlzYWJsZWQgPyBkYXRhVGVzdElkcy5zdGF0aWNMYXllckl0ZW0gOiBkYXRhVGVzdElkcy5zb3J0YWJsZUxheWVySXRlbX1cbiAgICAgICAgJHRyYW5zZm9ybT17Q1NTLlRyYW5zZm9ybS50b1N0cmluZyh0cmFuc2Zvcm0pfVxuICAgICAgICAkdHJhbnNpdGlvbj17dHJhbnNpdGlvbn1cbiAgICAgICAgey4uLmF0dHJpYnV0ZXN9XG4gICAgICA+XG4gICAgICAgIDxMYXllclBhbmVsXG4gICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgey4uLmxheWVyQWN0aW9uc31cbiAgICAgICAgICBrZXk9e2xheWVyLmlkfVxuICAgICAgICAgIGlkeD17aWR4fVxuICAgICAgICAgIGxheWVyPXtsYXllcn1cbiAgICAgICAgICBsaXN0ZW5lcnM9e2xpc3RlbmVyc31cbiAgICAgICAgICBpc0RyYWdnYWJsZT17IWRpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgPC9Tb3J0YWJsZVN0eWxlZEl0ZW0+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBMYXllckxpc3Q6IFJlYWN0LkZDPExheWVyTGlzdFByb3BzPiA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBsYXllcnMsXG4gICAgICBkYXRhc2V0cyxcbiAgICAgIGxheWVyT3JkZXIsXG4gICAgICB1aVN0YXRlQWN0aW9ucyxcbiAgICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICAgIG1hcFN0YXRlQWN0aW9ucyxcbiAgICAgIGxheWVyQ2xhc3NlcyxcbiAgICAgIGlzU29ydGFibGUgPSB0cnVlLFxuICAgICAgc3BsaXRNYXBcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qge3RvZ2dsZU1vZGFsOiBvcGVuTW9kYWx9ID0gdWlTdGF0ZUFjdGlvbnM7XG5cbiAgICBjb25zdCBsYXllcnNUb1Nob3cgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBsYXllcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gZmluZEJ5SWQobGF5ZXJJZCkobGF5ZXJzLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhbGF5ZXIuY29uZmlnLmhpZGRlbiA/IFsuLi5hY2MsIGxheWVyXSA6IGFjYztcbiAgICAgIH0sIElOSVRJQUxfTEFZRVJTX1RPX1NIT1cpO1xuICAgIH0sIFtsYXllcnMsIGxheWVyT3JkZXJdKTtcblxuICAgIGNvbnN0IHNpZGVQYW5lbERuZEl0ZW1zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gbGF5ZXJzVG9TaG93Lm1hcCgoe2lkfSkgPT4gaWQpO1xuICAgIH0sIFtsYXllcnNUb1Nob3ddKTtcblxuICAgIGNvbnN0IGxheWVyVHlwZU9wdGlvbnMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgT2JqZWN0LmtleXMobGF5ZXJDbGFzc2VzKS5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNba2V5XSh7ZGF0YUlkOiAnJ30pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDoga2V5LFxuICAgICAgICAgICAgbGFiZWw6IGxheWVyLm5hbWUsXG4gICAgICAgICAgICBpY29uOiBsYXllci5sYXllckljb24sXG4gICAgICAgICAgICByZXF1aXJlRGF0YTogbGF5ZXIucmVxdWlyZURhdGFcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIFtsYXllckNsYXNzZXNdXG4gICAgKTtcblxuICAgIGNvbnN0IGxheWVyQWN0aW9ucyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBsYXllckNvbG9yVUlDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllckNvbG9yVUlDaGFuZ2UsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUb2dnbGVWaXNpYmlsaXR5OiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUb2dnbGVWaXNpYmlsaXR5LFxuICAgICAgICBsYXllclR5cGVDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllclR5cGVDaGFuZ2UsXG4gICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gICAgICAgIGxheWVyVGV4dExhYmVsQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UsXG4gICAgICAgIHJlbW92ZUxheWVyOiB2aXNTdGF0ZUFjdGlvbnMucmVtb3ZlTGF5ZXIsXG4gICAgICAgIHpvb21Ub0xheWVyOiBtYXBTdGF0ZUFjdGlvbnMuZml0Qm91bmRzLFxuICAgICAgICBkdXBsaWNhdGVMYXllcjogdmlzU3RhdGVBY3Rpb25zLmR1cGxpY2F0ZUxheWVyLFxuICAgICAgICBsYXllclNldElzVmFsaWQ6IHZpc1N0YXRlQWN0aW9ucy5sYXllclNldElzVmFsaWRcbiAgICAgIH0pLFxuICAgICAgW3Zpc1N0YXRlQWN0aW9ucywgbWFwU3RhdGVBY3Rpb25zXVxuICAgICk7XG5cbiAgICBjb25zdCBwYW5lbFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcGVuTW9kYWwsXG4gICAgICAgIGxheWVyVHlwZU9wdGlvbnMsXG4gICAgICAgIHNwbGl0TWFwXG4gICAgICB9KSxcbiAgICAgIFtkYXRhc2V0cywgb3Blbk1vZGFsLCBsYXllclR5cGVPcHRpb25zLCBzcGxpdE1hcF1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb250YWluZXI+XG4gICAgICAgIDxTb3J0YWJsZUNvbnRleHRcbiAgICAgICAgICBpZD17U09SVEFCTEVfU0lERV9QQU5FTF9UWVBFfVxuICAgICAgICAgIGl0ZW1zPXtzaWRlUGFuZWxEbmRJdGVtc31cbiAgICAgICAgICBzdHJhdGVneT17dmVydGljYWxMaXN0U29ydGluZ1N0cmF0ZWd5fVxuICAgICAgICAgIGRpc2FibGVkPXshaXNTb3J0YWJsZX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiB3YXJuaW5nOiBjb250YWluZXJJZCBzaG91bGQgYmUgc2ltaWxhciB0byB0aGUgZmlyc3Qga2V5IGluIGRuZEl0ZW1zIGRlZmluZWQgaW4ga2VwbGVyLWdsLmpzKi99XG4gICAgICAgICAge2xheWVyc1RvU2hvdy5tYXAobGF5ZXIgPT4gKFxuICAgICAgICAgICAgPFNvcnRhYmxlSXRlbVxuICAgICAgICAgICAgICBrZXk9e2xheWVyLmlkfVxuICAgICAgICAgICAgICBsYXllcj17bGF5ZXJ9XG4gICAgICAgICAgICAgIGlkeD17bGF5ZXJzLmZpbmRJbmRleChsID0+IGw/LmlkID09PSBsYXllci5pZCl9XG4gICAgICAgICAgICAgIHBhbmVsUHJvcHM9e3BhbmVsUHJvcHN9XG4gICAgICAgICAgICAgIGxheWVyQWN0aW9ucz17bGF5ZXJBY3Rpb25zfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17IWlzU29ydGFibGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L1NvcnRhYmxlQ29udGV4dD5cbiAgICAgIDwvQ29udGFpbmVyPlxuICAgICk7XG4gIH07XG4gIHJldHVybiBMYXllckxpc3Q7XG59XG5leHBvcnQgZGVmYXVsdCBMYXllckxpc3RGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsWUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBTUEsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FB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
;