UNPKG

kepler.gl

Version:

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

260 lines (259 loc) 50.2 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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _classnames = _interopRequireDefault(require("classnames")); var _reactDom = require("react-dom"); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _core = require("@dnd-kit/core"); var _utilities = require("@dnd-kit/utilities"); var _react2 = require("@floating-ui/react"); var _actions = require("@kepler.gl/actions"); var _reducers = require("@kepler.gl/reducers"); var _styles = require("@kepler.gl/styles"); var _utils = require("@kepler.gl/utils"); var _icons = require("../common/icons"); var _styledComponents2 = require("../common/styled-components"); var _context = require("../context"); var _useLegendPosition3 = _interopRequireDefault(require("../hooks/use-legend-position")); var _injector = require("../injector"); var _mapControlPanel = _interopRequireDefault(require("./map-control-panel")); var _mapControlTooltip = _interopRequireDefault(require("./map-control-tooltip")); var _mapLegend = _interopRequireDefault(require("./map-legend")); var _modifiers = require("@dnd-kit/modifiers"); 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 DRAG_RESIZE_ID = 'map-legend-resize'; var DRAG_MOVE_ID = 'map-legend-move'; var StyledDraggableLegendContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n outline: none;\n transition: border-color 0.2s ease-in-out;\n border: 1px solid transparent;\n .legend-input-block {\n display: none;\n }\n &.is-dragging .legend-input-block {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: transparent;\n }\n &:hover,\n &.is-dragging {\n .legend-move-handle {\n opacity: 1;\n pointer-events: auto;\n }\n .legend-resize-handle {\n opacity: 1;\n pointer-events: auto;\n }\n border-color: ", ";\n }\n .map-control__panel-content {\n max-height: calc(100vh - 100px);\n ", ";\n }\n border-radius: 4px;\n z-index: 2;\n .map-control-panel {\n margin-bottom: 0 !important;\n }\n"])), function (props) { return props.theme.activeColor; }, function (props) { return props.contentHeight ? "height: ".concat(props.contentHeight, "px;") : ''; }); var StyledMoveHandle = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n color: white;\n z-index: 2;\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 48px;\n height: 16px;\n border-radius: 4px;\n cursor: move;\n background-color: ", ";\n"])), function (props) { return props.theme.activeColor; }); var StyledResizeHandle = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n color: #f7f8fa;\n z-index: 2;\n bottom: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 48px;\n height: 16px;\n border-radius: 4px;\n cursor: ns-resize;\n"]))); var DraggableLegendContent = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { var positionStyles = props.positionStyles, children = props.children; var draggableMove = (0, _core.useDraggable)({ id: DRAG_MOVE_ID }); var draggableResize = (0, _core.useDraggable)({ id: DRAG_RESIZE_ID }); var refs = (0, _react2.useMergeRefs)([draggableMove.setNodeRef, ref]); var isDragging = draggableMove.isDragging || draggableResize.isDragging; return /*#__PURE__*/_react["default"].createElement(StyledDraggableLegendContent, (0, _extends2["default"])({ ref: refs, className: (0, _classnames["default"])('draggable-legend', { 'is-dragging': isDragging }), style: _objectSpread(_objectSpread({}, positionStyles), {}, { transform: _utilities.CSS.Translate.toString(draggableMove.transform) }), contentHeight: props.contentHeight }, draggableMove.attributes), children, isDragging ? /*#__PURE__*/_react["default"].createElement("div", { className: "legend-input-block" }) : null, /*#__PURE__*/_react["default"].createElement(StyledMoveHandle, (0, _extends2["default"])({ className: "legend-move-handle" }, draggableMove.listeners), /*#__PURE__*/_react["default"].createElement(_icons.DraggableDots, { height: "16px" })), /*#__PURE__*/_react["default"].createElement(StyledResizeHandle, (0, _extends2["default"])({ className: "legend-resize-handle", ref: draggableResize.setNodeRef }, draggableResize.listeners), /*#__PURE__*/_react["default"].createElement(_icons.HorizontalResizeHandle, { height: "16px" }))); }); var DraggableLegend = (0, _injector.withState)([_reducers.uiStateLens], function (state) { return state; }, { setMapControlSettings: _actions.setMapControlSettings })((0, _styledComponents.withTheme)(function (_ref) { var _uiState$mapControls; var uiState = _ref.uiState, theme = _ref.theme, setMapControlSettings = _ref.setMapControlSettings, children = _ref.children; var isSidePanelShown = uiState.activeSidePanel; var settings = (_uiState$mapControls = uiState.mapControls) === null || _uiState$mapControls === void 0 || (_uiState$mapControls = _uiState$mapControls.mapLegend) === null || _uiState$mapControls === void 0 ? void 0 : _uiState$mapControls.settings; var legendContentRef = (0, _react.useRef)(null); var onChangeSettings = (0, _react.useCallback)(function (newSettings) { return setMapControlSettings('mapLegend', newSettings); }, [setMapControlSettings]); var _useLegendPosition = (0, _useLegendPosition3["default"])({ legendContentRef: legendContentRef, isSidePanelShown: isSidePanelShown, theme: theme, settings: settings, onChangeSettings: onChangeSettings }), positionStyles = _useLegendPosition.positionStyles, updatePosition = _useLegendPosition.updatePosition, startResize = _useLegendPosition.startResize, resize = _useLegendPosition.resize, contentHeight = _useLegendPosition.contentHeight; var handleDragStart = (0, _react.useCallback)(function (event) { switch (event.active.id) { case DRAG_RESIZE_ID: startResize(); break; default: updatePosition(); } }, [updatePosition, startResize]); var handleDragEnd = (0, _react.useCallback)(updatePosition, [updatePosition]); var handleDragMove = (0, _react.useCallback)(function (event) { switch (event.active.id) { case DRAG_RESIZE_ID: resize(event.delta.y); break; } }, [resize]); return /*#__PURE__*/_react["default"].createElement(_core.DndContext, { onDragStart: handleDragStart, onDragMove: handleDragMove, onDragEnd: handleDragEnd, modifiers: [_modifiers.restrictToWindowEdges] }, /*#__PURE__*/_react["default"].createElement(DraggableLegendContent, { ref: legendContentRef, positionStyles: positionStyles, contentHeight: contentHeight }, children)); })); var ImageExportLegend = (0, _styledComponents.withTheme)(function (_ref2) { var _containerRef$current; var settings = _ref2.settings, isSidePanelShown = _ref2.isSidePanelShown, theme = _ref2.theme, children = _ref2.children; var containerRef = (0, _react.useRef)(null); var legendContentRef = (0, _react.useRef)(null); var _useLegendPosition2 = (0, _useLegendPosition3["default"])({ legendContentRef: legendContentRef, isSidePanelShown: isSidePanelShown, theme: theme, settings: settings, onChangeSettings: function onChangeSettings() { // do nothing by default } }), positionStyles = _useLegendPosition2.positionStyles; var portalRoot = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 || (_containerRef$current = _containerRef$current.closest('.export-map-instance')) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.querySelector('#default-deckgl-overlay-wrapper'); return /*#__PURE__*/_react["default"].createElement("div", { ref: containerRef }, portalRoot ? /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react["default"].createElement("div", { className: "fixed-legend", ref: legendContentRef, style: _objectSpread(_objectSpread({}, positionStyles), {}, { position: 'absolute' }) }, children), portalRoot) : null); }); MapLegendPanelFactory.deps = [_mapControlTooltip["default"], _mapControlPanel["default"], _mapLegend["default"]]; var defaultActionIcons = { legend: _icons.Legend }; var MapLegendPanelComponent = function MapLegendPanelComponent(_ref3) { var _uiState$mapControls2, _rootContext$current; var layers = _ref3.layers, mapControls = _ref3.mapControls, scale = _ref3.scale, onToggleMapControl = _ref3.onToggleMapControl, isExport = _ref3.isExport, logoComponent = _ref3.logoComponent, _ref3$actionIcons = _ref3.actionIcons, actionIcons = _ref3$actionIcons === void 0 ? defaultActionIcons : _ref3$actionIcons, mapState = _ref3.mapState, uiState = _ref3.uiState, onLayerVisConfigChange = _ref3.onLayerVisConfigChange, onToggleSplitMapViewport = _ref3.onToggleSplitMapViewport, onClickControlBtn = _ref3.onClickControlBtn, _ref3$isViewportUnsyn = _ref3.isViewportUnsyncAllowed, isViewportUnsyncAllowed = _ref3$isViewportUnsyn === void 0 ? true : _ref3$isViewportUnsyn, className = _ref3.className, MapControlTooltip = _ref3.MapControlTooltip, MapControlPanel = _ref3.MapControlPanel, MapLegend = _ref3.MapLegend; var isSidePanelShown = uiState.activeSidePanel; var settings = (_uiState$mapControls2 = uiState.mapControls) === null || _uiState$mapControls2 === void 0 || (_uiState$mapControls2 = _uiState$mapControls2.mapLegend) === null || _uiState$mapControls2 === void 0 ? void 0 : _uiState$mapControls2.settings; var mapLegend = (mapControls === null || mapControls === void 0 ? void 0 : mapControls.mapLegend) || {}; var _ref4 = mapLegend || {}, active = _ref4.active, disableEdit = _ref4.disableEdit; var rootContext = (0, _react.useContext)(_context.RootContext); var onClick = (0, _react.useCallback)(function () { var _mapControls$mapDraw; onClickControlBtn === null || onClickControlBtn === void 0 || onClickControlBtn(); if (mapControls !== null && mapControls !== void 0 && (_mapControls$mapDraw = mapControls.mapDraw) !== null && _mapControls$mapDraw !== void 0 && _mapControls$mapDraw.active) { onToggleMapControl('mapDraw'); } onToggleMapControl('mapLegend'); }, [onClickControlBtn, onToggleMapControl, mapControls]); var onCloseClick = (0, _react.useCallback)(function (e) { e.preventDefault(); onToggleMapControl('mapLegend'); }, [onToggleMapControl]); if (!mapLegend.show) { return null; } var legendPanel = active ? /*#__PURE__*/_react["default"].createElement(MapControlPanel, { scale: scale, header: "header.layerLegend", onClick: onCloseClick, pinnable: false, disableClose: false, isExport: isExport, logoComponent: logoComponent, mapState: mapState, onToggleSplitMapViewport: onToggleSplitMapViewport, isViewportUnsyncAllowed: isViewportUnsyncAllowed, className: className }, /*#__PURE__*/_react["default"].createElement(MapLegend, { layers: layers, mapState: mapState, disableEdit: disableEdit, isExport: isExport, onLayerVisConfigChange: onLayerVisConfigChange })) : null; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, active ? (0, _utils.hasPortableWidth)(_styles.breakPointValues) ? legendPanel : isExport ? /*#__PURE__*/_react["default"].createElement(ImageExportLegend, { isSidePanelShown: isSidePanelShown, settings: settings }, legendPanel) : ( /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react["default"].createElement(DraggableLegend, null, legendPanel), (_rootContext$current = rootContext === null || rootContext === void 0 ? void 0 : rootContext.current) !== null && _rootContext$current !== void 0 ? _rootContext$current : document.body)) : null, !isExport ? /*#__PURE__*/_react["default"].createElement(MapControlTooltip, { id: "show-legend", message: "tooltip.showLegend" }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.MapControlButton, { className: "map-control-button show-legend", onClick: onClick }, /*#__PURE__*/_react["default"].createElement(actionIcons.legend, { height: "22px" }))) : null); }; function MapLegendPanelFactory(MapControlTooltip, MapControlPanel, MapLegend) { var MapLegendPanel = (0, _injector.withState)([_reducers.uiStateLens], function (_state) { return { MapControlTooltip: MapControlTooltip, MapControlPanel: MapControlPanel, MapLegend: MapLegend }; }, { setMapControlSettings: _actions.setMapControlSettings })(MapLegendPanelComponent); MapLegendPanel.displayName = 'MapLegendPanel'; return (0, _styledComponents.withTheme)(MapLegendPanel); } var _default = exports["default"] = MapLegendPanelFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0RG9tIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb3JlIiwiX3V0aWxpdGllcyIsIl9yZWFjdDIiLCJfYWN0aW9ucyIsIl9yZWR1Y2VycyIsIl9zdHlsZXMiLCJfdXRpbHMiLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfY29udGV4dCIsIl91c2VMZWdlbmRQb3NpdGlvbjMiLCJfaW5qZWN0b3IiLCJfbWFwQ29udHJvbFBhbmVsIiwiX21hcENvbnRyb2xUb29sdGlwIiwiX21hcExlZ2VuZCIsIl9tb2RpZmllcnMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIkRSQUdfUkVTSVpFX0lEIiwiRFJBR19NT1ZFX0lEIiwiU3R5bGVkRHJhZ2dhYmxlTGVnZW5kQ29udGVudCIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsImFjdGl2ZUNvbG9yIiwiY29udGVudEhlaWdodCIsImNvbmNhdCIsIlN0eWxlZE1vdmVIYW5kbGUiLCJTdHlsZWRSZXNpemVIYW5kbGUiLCJEcmFnZ2FibGVMZWdlbmRDb250ZW50IiwiZm9yd2FyZFJlZiIsInJlZiIsInBvc2l0aW9uU3R5bGVzIiwiY2hpbGRyZW4iLCJkcmFnZ2FibGVNb3ZlIiwidXNlRHJhZ2dhYmxlIiwiaWQiLCJkcmFnZ2FibGVSZXNpemUiLCJyZWZzIiwidXNlTWVyZ2VSZWZzIiwic2V0Tm9kZVJlZiIsImlzRHJhZ2dpbmciLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsInN0eWxlIiwidHJhbnNmb3JtIiwiQ1NTIiwiVHJhbnNsYXRlIiwidG9TdHJpbmciLCJhdHRyaWJ1dGVzIiwibGlzdGVuZXJzIiwiRHJhZ2dhYmxlRG90cyIsImhlaWdodCIsIkhvcml6b250YWxSZXNpemVIYW5kbGUiLCJEcmFnZ2FibGVMZWdlbmQiLCJ3aXRoU3RhdGUiLCJ1aVN0YXRlTGVucyIsInN0YXRlIiwic2V0TWFwQ29udHJvbFNldHRpbmdzIiwid2l0aFRoZW1lIiwiX3JlZiIsIl91aVN0YXRlJG1hcENvbnRyb2xzIiwidWlTdGF0ZSIsImlzU2lkZVBhbmVsU2hvd24iLCJhY3RpdmVTaWRlUGFuZWwiLCJzZXR0aW5ncyIsIm1hcENvbnRyb2xzIiwibWFwTGVnZW5kIiwibGVnZW5kQ29udGVudFJlZiIsInVzZVJlZiIsIm9uQ2hhbmdlU2V0dGluZ3MiLCJ1c2VDYWxsYmFjayIsIm5ld1NldHRpbmdzIiwiX3VzZUxlZ2VuZFBvc2l0aW9uIiwidXNlTGVnZW5kUG9zaXRpb24iLCJ1cGRhdGVQb3NpdGlvbiIsInN0YXJ0UmVzaXplIiwicmVzaXplIiwiaGFuZGxlRHJhZ1N0YXJ0IiwiZXZlbnQiLCJhY3RpdmUiLCJoYW5kbGVEcmFnRW5kIiwiaGFuZGxlRHJhZ01vdmUiLCJkZWx0YSIsInkiLCJEbmRDb250ZXh0Iiwib25EcmFnU3RhcnQiLCJvbkRyYWdNb3ZlIiwib25EcmFnRW5kIiwibW9kaWZpZXJzIiwicmVzdHJpY3RUb1dpbmRvd0VkZ2VzIiwiSW1hZ2VFeHBvcnRMZWdlbmQiLCJfcmVmMiIsIl9jb250YWluZXJSZWYkY3VycmVudCIsImNvbnRhaW5lclJlZiIsIl91c2VMZWdlbmRQb3NpdGlvbjIiLCJwb3J0YWxSb290IiwiY3VycmVudCIsImNsb3Nlc3QiLCJxdWVyeVNlbGVjdG9yIiwiY3JlYXRlUG9ydGFsIiwicG9zaXRpb24iLCJNYXBMZWdlbmRQYW5lbEZhY3RvcnkiLCJkZXBzIiwiTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5IiwiTWFwQ29udHJvbFBhbmVsRmFjdG9yeSIsIk1hcExlZ2VuZEZhY3RvcnkiLCJkZWZhdWx0QWN0aW9uSWNvbnMiLCJsZWdlbmQiLCJMZWdlbmQiLCJNYXBMZWdlbmRQYW5lbENvbXBvbmVudCIsIl9yZWYzIiwiX3VpU3RhdGUkbWFwQ29udHJvbHMyIiwiX3Jvb3RDb250ZXh0JGN1cnJlbnQiLCJsYXllcnMiLCJzY2FsZSIsIm9uVG9nZ2xlTWFwQ29udHJvbCIsImlzRXhwb3J0IiwibG9nb0NvbXBvbmVudCIsIl9yZWYzJGFjdGlvbkljb25zIiwiYWN0aW9uSWNvbnMiLCJtYXBTdGF0ZSIsIm9uTGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJvblRvZ2dsZVNwbGl0TWFwVmlld3BvcnQiLCJvbkNsaWNrQ29udHJvbEJ0biIsIl9yZWYzJGlzVmlld3BvcnRVbnN5biIsImlzVmlld3BvcnRVbnN5bmNBbGxvd2VkIiwiTWFwQ29udHJvbFRvb2x0aXAiLCJNYXBDb250cm9sUGFuZWwiLCJNYXBMZWdlbmQiLCJfcmVmNCIsImRpc2FibGVFZGl0Iiwicm9vdENvbnRleHQiLCJ1c2VDb250ZXh0IiwiUm9vdENvbnRleHQiLCJvbkNsaWNrIiwiX21hcENvbnRyb2xzJG1hcERyYXciLCJtYXBEcmF3Iiwib25DbG9zZUNsaWNrIiwicHJldmVudERlZmF1bHQiLCJzaG93IiwibGVnZW5kUGFuZWwiLCJoZWFkZXIiLCJwaW5uYWJsZSIsImRpc2FibGVDbG9zZSIsIkZyYWdtZW50IiwiaGFzUG9ydGFibGVXaWR0aCIsImJyZWFrUG9pbnRWYWx1ZXMiLCJkb2N1bWVudCIsImJvZHkiLCJtZXNzYWdlIiwiTWFwQ29udHJvbEJ1dHRvbiIsIk1hcExlZ2VuZFBhbmVsIiwiX3N0YXRlIiwiZGlzcGxheU5hbWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwL21hcC1sZWdlbmQtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHtjcmVhdGVQb3J0YWx9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnRUeXBlLCBGQywgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge0RuZENvbnRleHQsIHVzZURyYWdnYWJsZX0gZnJvbSAnQGRuZC1raXQvY29yZSc7XG5pbXBvcnQge0NTU30gZnJvbSAnQGRuZC1raXQvdXRpbGl0aWVzJztcbmltcG9ydCB7dXNlTWVyZ2VSZWZzfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QnO1xuXG5pbXBvcnQge0FjdGlvbkhhbmRsZXIsIHNldE1hcENvbnRyb2xTZXR0aW5ncywgdG9nZ2xlU3BsaXRNYXBWaWV3cG9ydH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7dWlTdGF0ZUxlbnN9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuaW1wb3J0IHticmVha1BvaW50VmFsdWVzfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5pbXBvcnQge0xheWVyVmlzQ29uZmlnLCBNYXBDb250cm9sTWFwTGVnZW5kLCBNYXBDb250cm9scywgTWFwU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtoYXNQb3J0YWJsZVdpZHRofSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtMZWdlbmQsIERyYWdnYWJsZURvdHMsIEhvcml6b250YWxSZXNpemVIYW5kbGV9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge01hcENvbnRyb2xCdXR0b259IGZyb20gJy4uL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge1Jvb3RDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB1c2VMZWdlbmRQb3NpdGlvbiwge01hcExlZ2VuZENvbnRyb2xTZXR0aW5nc30gZnJvbSAnLi4vaG9va3MvdXNlLWxlZ2VuZC1wb3NpdGlvbic7XG5pbXBvcnQge3dpdGhTdGF0ZX0gZnJvbSAnLi4vaW5qZWN0b3InO1xuaW1wb3J0IE1hcENvbnRyb2xQYW5lbEZhY3RvcnkgZnJvbSAnLi9tYXAtY29udHJvbC1wYW5lbCc7XG5pbXBvcnQgTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5IGZyb20gJy4vbWFwLWNvbnRyb2wtdG9vbHRpcCc7XG5pbXBvcnQgTWFwTGVnZW5kRmFjdG9yeSBmcm9tICcuL21hcC1sZWdlbmQnO1xuaW1wb3J0IHtyZXN0cmljdFRvV2luZG93RWRnZXN9IGZyb20gJ0BkbmQta2l0L21vZGlmaWVycyc7XG5cbmNvbnN0IERSQUdfUkVTSVpFX0lEID0gJ21hcC1sZWdlbmQtcmVzaXplJztcbmNvbnN0IERSQUdfTU9WRV9JRCA9ICdtYXAtbGVnZW5kLW1vdmUnO1xuXG5jb25zdCBTdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50ID0gc3R5bGVkLmRpdjx7Y29udGVudEhlaWdodD86IG51bWJlcn0+YFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzIGVhc2UtaW4tb3V0O1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgLmxlZ2VuZC1pbnB1dC1ibG9jayB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAmLmlzLWRyYWdnaW5nIC5sZWdlbmQtaW5wdXQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJjpob3ZlcixcbiAgJi5pcy1kcmFnZ2luZyB7XG4gICAgLmxlZ2VuZC1tb3ZlLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgfVxuICAgIC5sZWdlbmQtcmVzaXplLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgfVxuICAgIGJvcmRlci1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5hY3RpdmVDb2xvcn07XG4gIH1cbiAgLm1hcC1jb250cm9sX19wYW5lbC1jb250ZW50IHtcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTAwcHgpO1xuICAgICR7cHJvcHMgPT4gKHByb3BzLmNvbnRlbnRIZWlnaHQgPyBgaGVpZ2h0OiAke3Byb3BzLmNvbnRlbnRIZWlnaHR9cHg7YCA6ICcnKX07XG4gIH1cbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB6LWluZGV4OiAyO1xuICAubWFwLWNvbnRyb2wtcGFuZWwge1xuICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTW92ZUhhbmRsZSA9IHN0eWxlZC5kaXZgXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6IHdoaXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHdpZHRoOiA0OHB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiBtb3ZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmFjdGl2ZUNvbG9yfTtcbmA7XG5cbmNvbnN0IFN0eWxlZFJlc2l6ZUhhbmRsZSA9IHN0eWxlZC5kaXZgXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQ7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICNmN2Y4ZmE7XG4gIHotaW5kZXg6IDI7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgd2lkdGg6IDQ4cHg7XG4gIGhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBjdXJzb3I6IG5zLXJlc2l6ZTtcbmA7XG5cbmV4cG9ydCB0eXBlIE1hcExlZ2VuZFBhbmVsRmFjdG9yeURlcHMgPSBbXG4gIHR5cGVvZiBNYXBDb250cm9sVG9vbHRpcEZhY3RvcnksXG4gIHR5cGVvZiBNYXBDb250cm9sUGFuZWxGYWN0b3J5LFxuICB0eXBlb2YgTWFwTGVnZW5kRmFjdG9yeVxuXTtcblxudHlwZSBEcmFnZ2FibGVMZWdlbmRDb250ZW50UHJvcHMgPSB7XG4gIGNvbnRlbnRIZWlnaHQ/OiBudW1iZXI7XG4gIHBvc2l0aW9uU3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn07XG5cbmNvbnN0IERyYWdnYWJsZUxlZ2VuZENvbnRlbnQgPSBmb3J3YXJkUmVmKChwcm9wczogRHJhZ2dhYmxlTGVnZW5kQ29udGVudFByb3BzLCByZWYpID0+IHtcbiAgY29uc3Qge3Bvc2l0aW9uU3R5bGVzLCBjaGlsZHJlbn0gPSBwcm9wcztcbiAgY29uc3QgZHJhZ2dhYmxlTW92ZSA9IHVzZURyYWdnYWJsZSh7aWQ6IERSQUdfTU9WRV9JRH0pO1xuICBjb25zdCBkcmFnZ2FibGVSZXNpemUgPSB1c2VEcmFnZ2FibGUoe2lkOiBEUkFHX1JFU0laRV9JRH0pO1xuICBjb25zdCByZWZzID0gdXNlTWVyZ2VSZWZzKFtkcmFnZ2FibGVNb3ZlLnNldE5vZGVSZWYsIHJlZl0pO1xuICBjb25zdCBpc0RyYWdnaW5nID0gZHJhZ2dhYmxlTW92ZS5pc0RyYWdnaW5nIHx8IGRyYWdnYWJsZVJlc2l6ZS5pc0RyYWdnaW5nO1xuICByZXR1cm4gKFxuICAgIDxTdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50XG4gICAgICByZWY9e3JlZnN9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2RyYWdnYWJsZS1sZWdlbmQnLCB7J2lzLWRyYWdnaW5nJzogaXNEcmFnZ2luZ30pfVxuICAgICAgc3R5bGU9e3suLi5wb3NpdGlvblN0eWxlcywgdHJhbnNmb3JtOiBDU1MuVHJhbnNsYXRlLnRvU3RyaW5nKGRyYWdnYWJsZU1vdmUudHJhbnNmb3JtKX19XG4gICAgICBjb250ZW50SGVpZ2h0PXtwcm9wcy5jb250ZW50SGVpZ2h0fVxuICAgICAgey4uLmRyYWdnYWJsZU1vdmUuYXR0cmlidXRlc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7aXNEcmFnZ2luZyA/IDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLWlucHV0LWJsb2NrXCIgLz4gOiBudWxsfVxuICAgICAgPFN0eWxlZE1vdmVIYW5kbGUgY2xhc3NOYW1lPVwibGVnZW5kLW1vdmUtaGFuZGxlXCIgey4uLmRyYWdnYWJsZU1vdmUubGlzdGVuZXJzfT5cbiAgICAgICAgPERyYWdnYWJsZURvdHMgaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICA8L1N0eWxlZE1vdmVIYW5kbGU+XG4gICAgICA8U3R5bGVkUmVzaXplSGFuZGxlXG4gICAgICAgIGNsYXNzTmFtZT1cImxlZ2VuZC1yZXNpemUtaGFuZGxlXCJcbiAgICAgICAgcmVmPXtkcmFnZ2FibGVSZXNpemUuc2V0Tm9kZVJlZn1cbiAgICAgICAgey4uLmRyYWdnYWJsZVJlc2l6ZS5saXN0ZW5lcnN9XG4gICAgICA+XG4gICAgICAgIDxIb3Jpem9udGFsUmVzaXplSGFuZGxlIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgPC9TdHlsZWRSZXNpemVIYW5kbGU+XG4gICAgPC9TdHlsZWREcmFnZ2FibGVMZWdlbmRDb250ZW50PlxuICApO1xufSk7XG5cbmNvbnN0IERyYWdnYWJsZUxlZ2VuZCA9IHdpdGhTdGF0ZShbdWlTdGF0ZUxlbnNdLCBzdGF0ZSA9PiBzdGF0ZSwge3NldE1hcENvbnRyb2xTZXR0aW5nc30pKFxuICB3aXRoVGhlbWUoKHt1aVN0YXRlLCB0aGVtZSwgc2V0TWFwQ29udHJvbFNldHRpbmdzLCBjaGlsZHJlbn0pID0+IHtcbiAgICBjb25zdCBpc1NpZGVQYW5lbFNob3duID0gdWlTdGF0ZS5hY3RpdmVTaWRlUGFuZWw7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB1aVN0YXRlLm1hcENvbnRyb2xzPy5tYXBMZWdlbmQ/LnNldHRpbmdzO1xuXG4gICAgY29uc3QgbGVnZW5kQ29udGVudFJlZiA9IHVzZVJlZjxIVE1MRWxlbWVudD4obnVsbCk7XG4gICAgY29uc3Qgb25DaGFuZ2VTZXR0aW5ncyA9IHVzZUNhbGxiYWNrKFxuICAgICAgbmV3U2V0dGluZ3MgPT4gc2V0TWFwQ29udHJvbFNldHRpbmdzKCdtYXBMZWdlbmQnLCBuZXdTZXR0aW5ncyksXG4gICAgICBbc2V0TWFwQ29udHJvbFNldHRpbmdzXVxuICAgICk7XG4gICAgY29uc3Qge3Bvc2l0aW9uU3R5bGVzLCB1cGRhdGVQb3NpdGlvbiwgc3RhcnRSZXNpemUsIHJlc2l6ZSwgY29udGVudEhlaWdodH0gPSB1c2VMZWdlbmRQb3NpdGlvbih7XG4gICAgICBsZWdlbmRDb250ZW50UmVmLFxuICAgICAgaXNTaWRlUGFuZWxTaG93bixcbiAgICAgIHRoZW1lLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBvbkNoYW5nZVNldHRpbmdzXG4gICAgfSk7XG5cbiAgICBjb25zdCBoYW5kbGVEcmFnU3RhcnQgPSB1c2VDYWxsYmFjayhcbiAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC5hY3RpdmUuaWQpIHtcbiAgICAgICAgICBjYXNlIERSQUdfUkVTSVpFX0lEOlxuICAgICAgICAgICAgc3RhcnRSZXNpemUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB1cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW3VwZGF0ZVBvc2l0aW9uLCBzdGFydFJlc2l6ZV1cbiAgICApO1xuICAgIGNvbnN0IGhhbmRsZURyYWdFbmQgPSB1c2VDYWxsYmFjayh1cGRhdGVQb3NpdGlvbiwgW3VwZGF0ZVBvc2l0aW9uXSk7XG4gICAgY29uc3QgaGFuZGxlRHJhZ01vdmUgPSB1c2VDYWxsYmFjayhcbiAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC5hY3RpdmUuaWQpIHtcbiAgICAgICAgICBjYXNlIERSQUdfUkVTSVpFX0lEOlxuICAgICAgICAgICAgcmVzaXplKGV2ZW50LmRlbHRhLnkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbcmVzaXplXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERuZENvbnRleHRcbiAgICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgICAgb25EcmFnTW92ZT17aGFuZGxlRHJhZ01vdmV9XG4gICAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgICAgbW9kaWZpZXJzPXtbcmVzdHJpY3RUb1dpbmRvd0VkZ2VzXX1cbiAgICAgID5cbiAgICAgICAgPERyYWdnYWJsZUxlZ2VuZENvbnRlbnRcbiAgICAgICAgICByZWY9e2xlZ2VuZENvbnRlbnRSZWZ9XG4gICAgICAgICAgcG9zaXRpb25TdHlsZXM9e3Bvc2l0aW9uU3R5bGVzfVxuICAgICAgICAgIGNvbnRlbnRIZWlnaHQ9e2NvbnRlbnRIZWlnaHR9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvRHJhZ2dhYmxlTGVnZW5kQ29udGVudD5cbiAgICAgIDwvRG5kQ29udGV4dD5cbiAgICApO1xuICB9KVxuKSBhcyBGQzx7Y2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZX0+O1xuXG50eXBlIEltYWdlRXhwb3J0TGVnZW5kUHJvcHMgPSB7XG4gIHNldHRpbmdzOiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3M7XG4gIGlzU2lkZVBhbmVsU2hvd246IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5jb25zdCBJbWFnZUV4cG9ydExlZ2VuZCA9IHdpdGhUaGVtZSgoe3NldHRpbmdzLCBpc1NpZGVQYW5lbFNob3duLCB0aGVtZSwgY2hpbGRyZW59KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZjogUmVhY3QuTXV0YWJsZVJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+ID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBsZWdlbmRDb250ZW50UmVmOiBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD4gPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3Qge3Bvc2l0aW9uU3R5bGVzfSA9IHVzZUxlZ2VuZFBvc2l0aW9uKHtcbiAgICBsZWdlbmRDb250ZW50UmVmLFxuICAgIGlzU2lkZVBhbmVsU2hvd24sXG4gICAgdGhlbWUsXG4gICAgc2V0dGluZ3MsXG4gICAgb25DaGFuZ2VTZXR0aW5nczogKCkgPT4ge1xuICAgICAgLy8gZG8gbm90aGluZyBieSBkZWZhdWx0XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBwb3J0YWxSb290ID0gY29udGFpbmVyUmVmLmN1cnJlbnRcbiAgICA/LmNsb3Nlc3QoJy5leHBvcnQtbWFwLWluc3RhbmNlJylcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoJyNkZWZhdWx0LWRlY2tnbC1vdmVybGF5LXdyYXBwZXInKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgcmVmPXtjb250YWluZXJSZWZ9PlxuICAgICAge3BvcnRhbFJvb3RcbiAgICAgICAgPyBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpeGVkLWxlZ2VuZFwiXG4gICAgICAgICAgICAgIHJlZj17bGVnZW5kQ29udGVudFJlZn1cbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5wb3NpdGlvblN0eWxlcywgcG9zaXRpb246ICdhYnNvbHV0ZSd9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICBwb3J0YWxSb290XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59KSBhcyBSZWFjdC5GQzxJbWFnZUV4cG9ydExlZ2VuZFByb3BzPjtcblxuTWFwTGVnZW5kUGFuZWxGYWN0b3J5LmRlcHMgPSBbTWFwQ29udHJvbFRvb2x0aXBGYWN0b3J5LCBNYXBDb250cm9sUGFuZWxGYWN0b3J5LCBNYXBMZWdlbmRGYWN0b3J5XTtcblxuaW50ZXJmYWNlIE1hcExlZ2VuZFBhbmVsSWNvbnMge1xuICBsZWdlbmQ6IENvbXBvbmVudFR5cGU8YW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgTWFwTGVnZW5kUGFuZWxQcm9wcyA9IHtcbiAgdGhlbWU6IGFueTtcbiAgbGF5ZXJzOiBSZWFkb25seUFycmF5PExheWVyPjtcbiAgc2NhbGU6IG51bWJlcjtcbiAgb25Ub2dnbGVNYXBDb250cm9sOiAoY29udHJvbDogc3RyaW5nKSA9PiB2b2lkO1xuICBpc0V4cG9ydDogYm9vbGVhbjtcbiAgbG9nb0NvbXBvbmVudDogRWxlbWVudDtcbiAgYWN0aW9uSWNvbnM6IE1hcExlZ2VuZFBhbmVsSWNvbnM7XG4gIG1hcENvbnRyb2xzOiBNYXBDb250cm9scztcbiAgbWFwU3RhdGU/OiBNYXBTdGF0ZTtcbiAgb25MYXllclZpc0NvbmZpZ0NoYW5nZT86IChvbGRMYXllcjogTGF5ZXIsIG5ld1Zpc0NvbmZpZzogUGFydGlhbDxMYXllclZpc0NvbmZpZz4pID0+IHZvaWQ7XG4gIG9uVG9nZ2xlU3BsaXRNYXBWaWV3cG9ydD86IEFjdGlvbkhhbmRsZXI8dHlwZW9mIHRvZ2dsZVNwbGl0TWFwVmlld3BvcnQ+O1xuICBpc1ZpZXdwb3J0VW5zeW5jQWxsb3dlZD86IGJvb2xlYW47XG4gIG9uQ2xpY2tDb250cm9sQnRuPzogKGU/OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgc2V0dGluZ3M6IE1hcExlZ2VuZENvbnRyb2xTZXR0aW5ncztcbiAgaXNTaWRlUGFuZWxTaG93bjogYm9vbGVhbjtcbn07XG5cbnR5cGUgTWFwTGVnZW5kUGFuZWxDb21wb25lbnRUeXBlID0gUmVhY3QuRkM8TWFwTGVnZW5kUGFuZWxQcm9wcz47XG5cbmNvbnN0IGRlZmF1bHRBY3Rpb25JY29ucyA9IHtcbiAgbGVnZW5kOiBMZWdlbmRcbn07XG5cbmNvbnN0IE1hcExlZ2VuZFBhbmVsQ29tcG9uZW50ID0gKHtcbiAgbGF5ZXJzLFxuICBtYXBDb250cm9scyxcbiAgc2NhbGUsXG4gIG9uVG9nZ2xlTWFwQ29udHJvbCxcbiAgaXNFeHBvcnQsXG4gIGxvZ29Db21wb25lbnQsXG4gIGFjdGlvbkljb25zID0gZGVmYXVsdEFjdGlvbkljb25zLFxuICBtYXBTdGF0ZSxcbiAgdWlTdGF0ZSxcbiAgb25MYXllclZpc0NvbmZpZ0NoYW5nZSxcbiAgb25Ub2dnbGVTcGxpdE1hcFZpZXdwb3J0LFxuICBvbkNsaWNrQ29udHJvbEJ0bixcbiAgaXNWaWV3cG9ydFVuc3luY0FsbG93ZWQgPSB0cnVlLFxuICBjbGFzc05hbWUsXG4gIE1hcENvbnRyb2xUb29sdGlwLFxuICBNYXBDb250cm9sUGFuZWwsXG4gIE1hcExlZ2VuZFxufSkgPT4ge1xuICBjb25zdCBpc1NpZGVQYW5lbFNob3duID0gdWlTdGF0ZS5hY3RpdmVTaWRlUGFuZWw7XG4gIGNvbnN0IHNldHRpbmdzID0gdWlTdGF0ZS5tYXBDb250cm9scz8ubWFwTGVnZW5kPy5zZXR0aW5ncztcblxuICBjb25zdCBtYXBMZWdlbmQgPSBtYXBDb250cm9scz8ubWFwTGVnZW5kIHx8ICh7fSBhcyBNYXBDb250cm9sTWFwTGVnZW5kKTtcbiAgY29uc3Qge2FjdGl2ZSwgZGlzYWJsZUVkaXR9ID0gbWFwTGVnZW5kIHx8IHt9O1xuICBjb25zdCByb290Q29udGV4dCA9IHVzZUNvbnRleHQoUm9vdENvbnRleHQpO1xuXG4gIGNvbnN0IG9uQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgb25DbGlja0NvbnRyb2xCdG4/LigpO1xuICAgIGlmIChtYXBDb250cm9scz8ubWFwRHJhdz8uYWN0aXZlKSB7XG4gICAgICBvblRvZ2dsZU1hcENvbnRyb2woJ21hcERyYXcnKTtcbiAgICB9XG4gICAgb25Ub2dnbGVNYXBDb250cm9sKCdtYXBMZWdlbmQnKTtcbiAgfSwgW29uQ2xpY2tDb250cm9sQnRuLCBvblRvZ2dsZU1hcENvbnRyb2wsIG1hcENvbnRyb2xzXSk7XG4gIGNvbnN0IG9uQ2xvc2VDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIGUgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgb25Ub2dnbGVNYXBDb250cm9sKCdtYXBMZWdlbmQnKTtcbiAgICB9LFxuICAgIFtvblRvZ2dsZU1hcENvbnRyb2xdXG4gICk7XG5cbiAgaWYgKCFtYXBMZWdlbmQuc2hvdykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGVnZW5kUGFuZWwgPSBhY3RpdmUgPyAoXG4gICAgPE1hcENvbnRyb2xQYW5lbFxuICAgICAgc2NhbGU9e3NjYWxlfVxuICAgICAgaGVhZGVyPVwiaGVhZGVyLmxheWVyTGVnZW5kXCJcbiAgICAgIHsuLi57b25DbGljazogb25DbG9zZUNsaWNrLCBwaW5uYWJsZTogZmFsc2UsIGRpc2FibGVDbG9zZTogZmFsc2V9fVxuICAgICAgaXNFeHBvcnQ9e2lzRXhwb3J0fVxuICAgICAgbG9nb0NvbXBvbmVudD17bG9nb0NvbXBvbmVudH1cbiAgICAgIG1hcFN0YXRlPXttYXBTdGF0ZX1cbiAgICAgIG9uVG9nZ2xlU3BsaXRNYXBWaWV3cG9ydD17b25Ub2dnbGVTcGxpdE1hcFZpZXdwb3J0fVxuICAgICAgaXNWaWV3cG9ydFVuc3luY0FsbG93ZWQ9e2lzVmlld3BvcnRVbnN5bmNBbGxvd2VkfVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgPlxuICAgICAgPE1hcExlZ2VuZFxuICAgICAgICBsYXllcnM9e2xheWVyc31cbiAgICAgICAgbWFwU3RhdGU9e21hcFN0YXRlfVxuICAgICAgICBkaXNhYmxlRWRpdD17ZGlzYWJsZUVkaXR9XG4gICAgICAgIGlzRXhwb3J0PXtpc0V4cG9ydH1cbiAgICAgICAgb25MYXllclZpc0NvbmZpZ0NoYW5nZT17b25MYXllclZpc0NvbmZpZ0NoYW5nZX1cbiAgICAgIC8+XG4gICAgPC9NYXBDb250cm9sUGFuZWw+XG4gICkgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHthY3RpdmUgPyAoXG4gICAgICAgIGhhc1BvcnRhYmxlV2lkdGgoYnJlYWtQb2ludFZhbHVlcykgPyAoXG4gICAgICAgICAgbGVnZW5kUGFuZWxcbiAgICAgICAgKSA6IGlzRXhwb3J0ID8gKFxuICAgICAgICAgIDxJbWFnZUV4cG9ydExlZ2VuZCBpc1NpZGVQYW5lbFNob3duPXtpc1NpZGVQYW5lbFNob3dufSBzZXR0aW5ncz17c2V0dGluZ3N9PlxuICAgICAgICAgICAge2xlZ2VuZFBhbmVsfVxuICAgICAgICAgIDwvSW1hZ2VFeHBvcnRMZWdlbmQ+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgY3JlYXRlUG9ydGFsKFxuICAgICAgICAgICAgPERyYWdnYWJsZUxlZ2VuZD57bGVnZW5kUGFuZWx9PC9EcmFnZ2FibGVMZWdlbmQ+LFxuICAgICAgICAgICAgcm9vdENvbnRleHQ/LmN1cnJlbnQgPz8gZG9jdW1lbnQuYm9keVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSA6IG51bGx9XG4gICAgICB7IWlzRXhwb3J0ID8gKFxuICAgICAgICA8TWFwQ29udHJvbFRvb2x0aXAgaWQ9XCJzaG93LWxlZ2VuZFwiIG1lc3NhZ2U9XCJ0b29sdGlwLnNob3dMZWdlbmRcIj5cbiAgICAgICAgICA8TWFwQ29udHJvbEJ1dHRvbiBjbGFzc05hbWU9XCJtYXAtY29udHJvbC1idXR0b24gc2hvdy1sZWdlbmRcIiBvbkNsaWNrPXtvbkNsaWNrfT5cbiAgICAgICAgICAgIDxhY3Rpb25JY29ucy5sZWdlbmQgaGVpZ2h0PVwiMjJweFwiIC8+XG4gICAgICAgICAgPC9NYXBDb250cm9sQnV0dG9uPlxuICAgICAgICA8L01hcENvbnRyb2xUb29sdGlwPlxuICAgICAgKSA6IG51bGx9XG4gICAgPC8+XG4gICk7XG59O1xuXG5mdW5jdGlvbiBNYXBMZWdlbmRQYW5lbEZhY3RvcnkoXG4gIE1hcENvbnRyb2xUb29sdGlwOiBSZXR1cm5UeXBlPHR5cGVvZiBNYXBDb250cm9sVG9vbHRpcEZhY3Rvcnk+LFxuICBNYXBDb250cm9sUGFuZWw6IFJldHVyblR5cGU8dHlwZW9mIE1hcENvbnRyb2xQYW5lbEZhY3Rvcnk+LFxuICBNYXBMZWdlbmQ6IFJldHVyblR5cGU8dHlwZW9mIE1hcExlZ2VuZEZhY3Rvcnk+XG4pOiBNYXBMZWdlbmRQYW5lbENvbXBvbmVudFR5cGUge1xuICBjb25zdCBNYXBMZWdlbmRQYW5lbCA9IHdpdGhTdGF0ZShcbiAgICBbdWlTdGF0ZUxlbnNdLFxuICAgIF9zdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBNYXBDb250cm9sVG9vbHRpcCxcbiAgICAgICAgTWFwQ29udHJvbFBhbmVsLFxuICAgICAgICBNYXBMZWdlbmRcbiAgICAgIH07XG4gICAgfSxcbiAgICB7c2V0TWFwQ29udHJvbFNldHRpbmdzfVxuICApKE1hcExlZ2VuZFBhbmVsQ29tcG9uZW50KTtcblxuICBNYXBMZWdlbmRQYW5lbC5kaXNwbGF5TmFtZSA9ICdNYXBMZWdlbmRQYW5lbCc7XG4gIHJldHVybiB3aXRoVGhlbWUoTWFwTGVnZW5kUGFuZWwgYXMgTWFwTGVnZW5kUGFuZWxDb21wb25lbnRUeXBlKSBhcyBNYXBMZWdlbmRQYW5lbENvbXBvbmVudFR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcExlZ2VuZFBhbmVsRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxXQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxpQkFBQSxHQUFBRCx1QkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBRUEsSUFBQVEsUUFBQSxHQUFB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