UNPKG

kepler.gl

Version:

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

180 lines (177 loc) 41 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.EffectPanelHeaderActionSectionFactory = EffectPanelHeaderActionSectionFactory; exports.defaultProps = exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _constants = require("@kepler.gl/constants"); var _panelHeaderAction = _interopRequireDefault(require("../side-panel/panel-header-action")); var _icons = require("../common/icons"); var _styledComponents2 = require("../common/styled-components"); var _defaultEffectIcons, _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // 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; } var defaultProps = exports.defaultProps = { isDragNDropEnabled: true }; var defaultActionIcons = { remove: _icons.Trash, visible: _icons.EyeSeen, hidden: _icons.EyeUnseen, enableConfig: _icons.ArrowDown, disableConfig: _icons.ArrowUp }; var defaultEffectIcons = (_defaultEffectIcons = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_defaultEffectIcons, _constants.LIGHT_AND_SHADOW_EFFECT.type, _icons.LightAndShadowEffectIcon), _constants.POSTPROCESSING_EFFECTS.ink.type, _icons.InkEffectIcon), _constants.POSTPROCESSING_EFFECTS.brightnessContrast.type, _icons.BrightnessContrastEffectIcon), _constants.POSTPROCESSING_EFFECTS.hueSaturation.type, _icons.HueSaturationEffectIcon), _constants.POSTPROCESSING_EFFECTS.vibrance.type, _icons.VibranceEffectIcon), _constants.POSTPROCESSING_EFFECTS.sepia.type, _icons.SepiaEffectIcon), _constants.POSTPROCESSING_EFFECTS.dotScreen.type, _icons.DotScreenEffectIcon), _constants.POSTPROCESSING_EFFECTS.colorHalftone.type, _icons.ColorHalftoneEffectIcon), _constants.POSTPROCESSING_EFFECTS.noise.type, _icons.NoiseEffectIcon), _constants.POSTPROCESSING_EFFECTS.triangleBlur.type, _icons.TriangleBlurEffectIcon), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_defaultEffectIcons, _constants.POSTPROCESSING_EFFECTS.zoomBlur.type, _icons.ZoomBlurEffectIcon), _constants.POSTPROCESSING_EFFECTS.tiltShift.type, _icons.TiltShiftEffectIcon), _constants.POSTPROCESSING_EFFECTS.edgeWork.type, _icons.EdgeWorkEffectIcon), _constants.POSTPROCESSING_EFFECTS.vignette.type, _icons.VignetteEffectIcon), _constants.POSTPROCESSING_EFFECTS.magnify.type, _icons.MagnifyEffectIcon), _constants.POSTPROCESSING_EFFECTS.hexagonalPixelate.type, _icons.HexagonalPixelateEffectIcon), _constants.DISTANCE_FOG_TYPE, _icons.DistanceFogEffectIcon), _constants.SURFACE_FOG_TYPE, _icons.SurfaceFogEffectIcon)); var StyledEffectPanelHeader = (0, _styledComponents["default"])(_styledComponents2.StyledPanelHeader)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n position: relative;\n align-items: stretch;\n\n .effect__drag-handle {\n margin-left: -5px;\n color: ", ";\n }\n\n .effect__drag-handle__placeholder {\n height: 20px;\n padding: 0px;\n margin: 10px 10px 10px 5px;\n }\n\n &:hover {\n cursor: pointer;\n background-color: ", ";\n .effect__drag-handle {\n opacity: 1;\n }\n }\n\n border-left: 3px solid ", ";\n"])), function (props) { return props.theme.effectPanelHeaderHeight; }, function (props) { return props.theme.textColor; }, function (props) { return props.theme.panelBackgroundHover; }, function (props) { return props.theme.panelBackgroundHover; }); var HeaderActionSection = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: absolute;\n height: 100%;\n align-items: stretch;\n right: 10px;\n &:hover {\n .effect-panel__header__actions__hidden {\n opacity: 1;\n background-color: ", ";\n }\n }\n"])), function (props) { return props.theme.panelBackgroundHover; }); // Hiden actions only show up on hover var StyledPanelHeaderHiddenActions = _styledComponents["default"].div.attrs({ className: 'effect-panel__header__actions__hidden' })(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n opacity: 0;\n display: flex;\n align-items: center;\n transition: opacity 0.4s ease, background-color 0.4s ease;\n background-color: ", ";\n\n &:hover {\n opacity: 1;\n }\n"])), function (props) { return props.isConfigActive ? props.theme.panelBackgroundHover : props.theme.panelBackground; }); var StyledDragHandle = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n opacity: 0;\n z-index: 1000;\n &:hover {\n cursor: move;\n opacity: 1;\n color: ", ";\n }\n"])), function (props) { return props.theme.textColorHl; }); var DragHandle = function DragHandle(_ref) { var className = _ref.className, listeners = _ref.listeners, children = _ref.children; return /*#__PURE__*/_react["default"].createElement(StyledDragHandle, (0, _extends2["default"])({ className: className }, listeners), children); }; EffectPanelHeaderActionSectionFactory.deps = [_panelHeaderAction["default"]]; function EffectPanelHeaderActionSectionFactory(PanelHeaderAction) { var EffectPanelHeaderActionSection = function EffectPanelHeaderActionSection(props) { var effectId = props.effectId, isEnabled = props.isEnabled, isConfigActive = props.isConfigActive, onToggleEnabled = props.onToggleEnabled, onRemoveEffect = props.onRemoveEffect, onToggleEnableConfig = props.onToggleEnableConfig, actionItems = props.actionItems, _props$actionIcons = props.actionIcons, actionIcons = _props$actionIcons === void 0 ? defaultActionIcons : _props$actionIcons; var effectActionItems = (0, _react.useMemo)(function () { return actionItems !== null && actionItems !== void 0 ? actionItems : [{ key: 'remove-effect', isHidden: true, tooltip: 'tooltip.removeEffect', tooltipType: 'error', onClick: onRemoveEffect, icon: actionIcons.remove }, { key: 'visibility-toggle', tooltip: isEnabled ? 'tooltip.disableEffect' : 'tooltip.enabledEffect', onClick: onToggleEnabled, icon: isEnabled ? actionIcons.visible : actionIcons.hidden }, { key: 'enable-config', classNames: { 'is-open': isConfigActive }, tooltip: 'tooltip.effectSettings', onClick: onToggleEnableConfig, icon: actionIcons.enableConfig }]; }, [actionItems, actionIcons, isEnabled, isConfigActive, onRemoveEffect, onToggleEnabled, onToggleEnableConfig]); return /*#__PURE__*/_react["default"].createElement(HeaderActionSection, { className: "effect-panel__header__actions" }, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderHiddenActions, { isConfigActive: isConfigActive }, effectActionItems.filter(function (item) { return Boolean(item.isHidden); }).map(function (item) { return /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { key: item.key, className: "effect__".concat(item.key), testId: "".concat(item.key, "-action"), id: effectId, tooltip: item.tooltip, onClick: item.onClick, tooltipType: item.tooltipType, IconComponent: item.icon }); })), effectActionItems.filter(function (item) { return !item.isHidden; }).map(function (item) { return /*#__PURE__*/_react["default"].createElement(PanelHeaderAction, { key: item.key, className: (0, _classnames["default"])("effect__".concat(item.key), item.classNames), testId: "".concat(item.key, "-action"), id: effectId, tooltip: item.tooltip, onClick: item.onClick, tooltipType: item.tooltipType, IconComponent: item.icon }); })); }; return EffectPanelHeaderActionSection; } var StyledEffectTitleSection = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 8px;\n flex-grow: 1;\n align-items: center;\n display: flex;\n color: ", ";\n"])), function (props) { return props.theme.textColor; }); var IconPlaceholder = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n width: 20px;\n height: 20px;\n"]))); var EffectIconWrapper = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n height: 18px;\n margin: auto;\n color: ", ";\n"])), function (props) { return props.theme.textColor; }); EffectPanelHeaderFactory.deps = [EffectPanelHeaderActionSectionFactory]; function EffectPanelHeaderFactory(EffectPanelHeaderActionSection) { var EffectPanelHeader = function EffectPanelHeader(props) { var isConfigActive = props.isConfigActive, _props$isDragNDropEna = props.isDragNDropEnabled, isDragNDropEnabled = _props$isDragNDropEna === void 0 ? true : _props$isDragNDropEna, type = props.type, onToggleEnableConfig = props.onToggleEnableConfig, listeners = props.listeners, _props$showSortHandle = props.showSortHandle, showSortHandle = _props$showSortHandle === void 0 ? true : _props$showSortHandle; var label = (0, _react.useMemo)(function () { var description = _constants.EFFECT_DESCRIPTIONS.find(function (_description) { return _description.type === type; }); return (description === null || description === void 0 ? void 0 : description.name) || 'Effect'; }, [type]); var EffectIcon = defaultEffectIcons[type]; return /*#__PURE__*/_react["default"].createElement(StyledEffectPanelHeader, { className: (0, _classnames["default"])('effect-panel__header', { 'sort--handle': !isConfigActive }), active: isConfigActive, onClick: onToggleEnableConfig }, isDragNDropEnabled ? /*#__PURE__*/_react["default"].createElement(DragHandle, { className: "effect__drag-handle", listeners: listeners }, showSortHandle ? /*#__PURE__*/_react["default"].createElement(_icons.VertDots, { height: "20px" }) : /*#__PURE__*/_react["default"].createElement(IconPlaceholder, null)) : /*#__PURE__*/_react["default"].createElement("div", { className: "effect__drag-handle__placeholder" }), /*#__PURE__*/_react["default"].createElement(EffectIconWrapper, null, EffectIcon ? /*#__PURE__*/_react["default"].createElement(EffectIcon, { height: "18px" }) : null), /*#__PURE__*/_react["default"].createElement(StyledEffectTitleSection, null, label), /*#__PURE__*/_react["default"].createElement(EffectPanelHeaderActionSection, props)); }; return EffectPanelHeader; } var _default = exports["default"] = EffectPanelHeaderFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfcGFuZWxIZWFkZXJBY3Rpb24iLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfZGVmYXVsdEVmZmVjdEljb25zIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiZGVmYXVsdFByb3BzIiwiZXhwb3J0cyIsImlzRHJhZ05Ecm9wRW5hYmxlZCIsImRlZmF1bHRBY3Rpb25JY29ucyIsInJlbW92ZSIsIlRyYXNoIiwidmlzaWJsZSIsIkV5ZVNlZW4iLCJoaWRkZW4iLCJFeWVVbnNlZW4iLCJlbmFibGVDb25maWciLCJBcnJvd0Rvd24iLCJkaXNhYmxlQ29uZmlnIiwiQXJyb3dVcCIsImRlZmF1bHRFZmZlY3RJY29ucyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsInR5cGUiLCJMaWdodEFuZFNoYWRvd0VmZmVjdEljb24iLCJQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTIiwiaW5rIiwiSW5rRWZmZWN0SWNvbiIsImJyaWdodG5lc3NDb250cmFzdCIsIkJyaWdodG5lc3NDb250cmFzdEVmZmVjdEljb24iLCJodWVTYXR1cmF0aW9uIiwiSHVlU2F0dXJhdGlvbkVmZmVjdEljb24iLCJ2aWJyYW5jZSIsIlZpYnJhbmNlRWZmZWN0SWNvbiIsInNlcGlhIiwiU2VwaWFFZmZlY3RJY29uIiwiZG90U2NyZWVuIiwiRG90U2NyZWVuRWZmZWN0SWNvbiIsImNvbG9ySGFsZnRvbmUiLCJDb2xvckhhbGZ0b25lRWZmZWN0SWNvbiIsIm5vaXNlIiwiTm9pc2VFZmZlY3RJY29uIiwidHJpYW5nbGVCbHVyIiwiVHJpYW5nbGVCbHVyRWZmZWN0SWNvbiIsInpvb21CbHVyIiwiWm9vbUJsdXJFZmZlY3RJY29uIiwidGlsdFNoaWZ0IiwiVGlsdFNoaWZ0RWZmZWN0SWNvbiIsImVkZ2VXb3JrIiwiRWRnZVdvcmtFZmZlY3RJY29uIiwidmlnbmV0dGUiLCJWaWduZXR0ZUVmZmVjdEljb24iLCJtYWduaWZ5IiwiTWFnbmlmeUVmZmVjdEljb24iLCJoZXhhZ29uYWxQaXhlbGF0ZSIsIkhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvbiIsIkRJU1RBTkNFX0ZPR19UWVBFIiwiRGlzdGFuY2VGb2dFZmZlY3RJY29uIiwiU1VSRkFDRV9GT0dfVFlQRSIsIlN1cmZhY2VGb2dFZmZlY3RJY29uIiwiU3R5bGVkRWZmZWN0UGFuZWxIZWFkZXIiLCJzdHlsZWQiLCJTdHlsZWRQYW5lbEhlYWRlciIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsImVmZmVjdFBhbmVsSGVhZGVySGVpZ2h0IiwidGV4dENvbG9yIiwicGFuZWxCYWNrZ3JvdW5kSG92ZXIiLCJIZWFkZXJBY3Rpb25TZWN0aW9uIiwiZGl2IiwiU3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsInBhbmVsQmFja2dyb3VuZCIsIlN0eWxlZERyYWdIYW5kbGUiLCJ0ZXh0Q29sb3JIbCIsIkRyYWdIYW5kbGUiLCJfcmVmIiwibGlzdGVuZXJzIiwiY2hpbGRyZW4iLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwiRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uRmFjdG9yeSIsImRlcHMiLCJQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnkiLCJQYW5lbEhlYWRlckFjdGlvbiIsIkVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbiIsImVmZmVjdElkIiwiaXNFbmFibGVkIiwib25Ub2dnbGVFbmFibGVkIiwib25SZW1vdmVFZmZlY3QiLCJvblRvZ2dsZUVuYWJsZUNvbmZpZyIsImFjdGlvbkl0ZW1zIiwiX3Byb3BzJGFjdGlvbkljb25zIiwiYWN0aW9uSWNvbnMiLCJlZmZlY3RBY3Rpb25JdGVtcyIsInVzZU1lbW8iLCJrZXkiLCJpc0hpZGRlbiIsInRvb2x0aXAiLCJ0b29sdGlwVHlwZSIsIm9uQ2xpY2siLCJpY29uIiwiY2xhc3NOYW1lcyIsImZpbHRlciIsIml0ZW0iLCJCb29sZWFuIiwibWFwIiwiY29uY2F0IiwidGVzdElkIiwiaWQiLCJJY29uQ29tcG9uZW50IiwiY2xhc3NuYW1lcyIsIlN0eWxlZEVmZmVjdFRpdGxlU2VjdGlvbiIsIkljb25QbGFjZWhvbGRlciIsIkVmZmVjdEljb25XcmFwcGVyIiwiRWZmZWN0UGFuZWxIZWFkZXJGYWN0b3J5IiwiRWZmZWN0UGFuZWxIZWFkZXIiLCJfcHJvcHMkaXNEcmFnTkRyb3BFbmEiLCJfcHJvcHMkc2hvd1NvcnRIYW5kbGUiLCJzaG93U29ydEhhbmRsZSIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJFRkZFQ1RfREVTQ1JJUFRJT05TIiwiZmluZCIsIl9kZXNjcmlwdGlvbiIsIm5hbWUiLCJFZmZlY3RJY29uIiwiYWN0aXZlIiwiVmVydERvdHMiLCJoZWlnaHQiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZmZlY3RzL2VmZmVjdC1wYW5lbC1oZWFkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7XG4gIEVGRkVDVF9ERVNDUklQVElPTlMsXG4gIExJR0hUX0FORF9TSEFET1dfRUZGRUNULFxuICBQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLFxuICBESVNUQU5DRV9GT0dfVFlQRSxcbiAgU1VSRkFDRV9GT0dfVFlQRVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmltcG9ydCBQYW5lbEhlYWRlckFjdGlvbkZhY3RvcnksIHtQYW5lbEhlYWRlckFjdGlvbkljb259IGZyb20gJy4uL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLWFjdGlvbic7XG5pbXBvcnQge1xuICBBcnJvd0Rvd24sXG4gIEFycm93VXAsXG4gIEV5ZVNlZW4sXG4gIEV5ZVVuc2VlbixcbiAgVHJhc2gsXG4gIFZlcnREb3RzLFxuICBMaWdodEFuZFNoYWRvd0VmZmVjdEljb24sXG4gIElua0VmZmVjdEljb24sXG4gIEJyaWdodG5lc3NDb250cmFzdEVmZmVjdEljb24sXG4gIEh1ZVNhdHVyYXRpb25FZmZlY3RJY29uLFxuICBWaWJyYW5jZUVmZmVjdEljb24sXG4gIFNlcGlhRWZmZWN0SWNvbixcbiAgRG90U2NyZWVuRWZmZWN0SWNvbixcbiAgQ29sb3JIYWxmdG9uZUVmZmVjdEljb24sXG4gIE5vaXNlRWZmZWN0SWNvbixcbiAgVHJpYW5nbGVCbHVyRWZmZWN0SWNvbixcbiAgWm9vbUJsdXJFZmZlY3RJY29uLFxuICBUaWx0U2hpZnRFZmZlY3RJY29uLFxuICBFZGdlV29ya0VmZmVjdEljb24sXG4gIFZpZ25ldHRlRWZmZWN0SWNvbixcbiAgTWFnbmlmeUVmZmVjdEljb24sXG4gIEhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvbixcbiAgRGlzdGFuY2VGb2dFZmZlY3RJY29uLFxuICBTdXJmYWNlRm9nRWZmZWN0SWNvbixcbiAgQmFzZVByb3BzXG59IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge1N0eWxlZFBhbmVsSGVhZGVyfSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5leHBvcnQgdHlwZSBBY3Rpb25JdGVtID0ge1xuICBrZXk6IHN0cmluZztcbiAgaXNIaWRkZW4/OiBib29sZWFuO1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIGNsYXNzTmFtZXM/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbiAgaWNvbjogUGFuZWxIZWFkZXJBY3Rpb25JY29uO1xuICB0b29sdGlwVHlwZT86ICdlcnJvcic7XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBFZmZlY3RQYW5lbEhlYWRlclByb3BzID0ge1xuICB0eXBlOiBzdHJpbmc7XG4gIGxpc3RlbmVyczogYW55O1xuICBlZmZlY3RJZDogc3RyaW5nO1xuICBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gIGlzQ29uZmlnQWN0aXZlOiBib29sZWFuO1xuICBpc0pzb25FZGl0b3JBY3RpdmU6IGJvb2xlYW47XG4gIHNob3dTb3J0SGFuZGxlPzogYm9vbGVhbjtcbiAgaXNEcmFnTkRyb3BFbmFibGVkOiBib29sZWFuO1xuICBvblRvZ2dsZUVuYWJsZWQ6ICgpID0+IHZvaWQ7XG4gIG9uUmVtb3ZlRWZmZWN0OiAoKSA9PiB2b2lkO1xuICBvblRvZ2dsZUVuYWJsZUNvbmZpZzogKCkgPT4gdm9pZDtcbiAgYWN0aW9uSWNvbnM/OiB7XG4gICAgcmVtb3ZlOiBSZWFjdC5Db21wb25lbnRUeXBlPFBhcnRpYWw8QmFzZVByb3BzPj47XG4gICAgdmlzaWJsZTogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGhpZGRlbjogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGVuYWJsZUNvbmZpZzogUmVhY3QuQ29tcG9uZW50VHlwZTxQYXJ0aWFsPEJhc2VQcm9wcz4+O1xuICAgIGRpc2FibGVDb25maWc6IFJlYWN0LkNvbXBvbmVudFR5cGU8UGFydGlhbDxCYXNlUHJvcHM+PjtcbiAgfTtcbiAgYWN0aW9uSXRlbXM/OiBBY3Rpb25JdGVtW107XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBpc0RyYWdORHJvcEVuYWJsZWQ6IHRydWVcbn07XG5cbmNvbnN0IGRlZmF1bHRBY3Rpb25JY29ucyA9IHtcbiAgcmVtb3ZlOiBUcmFzaCxcbiAgdmlzaWJsZTogRXllU2VlbixcbiAgaGlkZGVuOiBFeWVVbnNlZW4sXG4gIGVuYWJsZUNvbmZpZzogQXJyb3dEb3duLFxuICBkaXNhYmxlQ29uZmlnOiBBcnJvd1VwXG59O1xuXG5jb25zdCBkZWZhdWx0RWZmZWN0SWNvbnMgPSB7XG4gIFtMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlXTogTGlnaHRBbmRTaGFkb3dFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5pbmsudHlwZV06IElua0VmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLmJyaWdodG5lc3NDb250cmFzdC50eXBlXTogQnJpZ2h0bmVzc0NvbnRyYXN0RWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuaHVlU2F0dXJhdGlvbi50eXBlXTogSHVlU2F0dXJhdGlvbkVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnZpYnJhbmNlLnR5cGVdOiBWaWJyYW5jZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnNlcGlhLnR5cGVdOiBTZXBpYUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLmRvdFNjcmVlbi50eXBlXTogRG90U2NyZWVuRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuY29sb3JIYWxmdG9uZS50eXBlXTogQ29sb3JIYWxmdG9uZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLm5vaXNlLnR5cGVdOiBOb2lzZUVmZmVjdEljb24sXG4gIFtQT1NUUFJPQ0VTU0lOR19FRkZFQ1RTLnRyaWFuZ2xlQmx1ci50eXBlXTogVHJpYW5nbGVCbHVyRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuem9vbUJsdXIudHlwZV06IFpvb21CbHVyRWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMudGlsdFNoaWZ0LnR5cGVdOiBUaWx0U2hpZnRFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5lZGdlV29yay50eXBlXTogRWRnZVdvcmtFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy52aWduZXR0ZS50eXBlXTogVmlnbmV0dGVFZmZlY3RJY29uLFxuICBbUE9TVFBST0NFU1NJTkdfRUZGRUNUUy5tYWduaWZ5LnR5cGVdOiBNYWduaWZ5RWZmZWN0SWNvbixcbiAgW1BPU1RQUk9DRVNTSU5HX0VGRkVDVFMuaGV4YWdvbmFsUGl4ZWxhdGUudHlwZV06IEhleGFnb25hbFBpeGVsYXRlRWZmZWN0SWNvbixcbiAgW0RJU1RBTkNFX0ZPR19UWVBFXTogRGlzdGFuY2VGb2dFZmZlY3RJY29uLFxuICBbU1VSRkFDRV9GT0dfVFlQRV06IFN1cmZhY2VGb2dFZmZlY3RJY29uXG59O1xuXG5jb25zdCBTdHlsZWRFZmZlY3RQYW5lbEhlYWRlciA9IHN0eWxlZChTdHlsZWRQYW5lbEhlYWRlcilgXG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lZmZlY3RQYW5lbEhlYWRlckhlaWdodH1weDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcblxuICAuZWZmZWN0X19kcmFnLWhhbmRsZSB7XG4gICAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgfVxuXG4gIC5lZmZlY3RfX2RyYWctaGFuZGxlX19wbGFjZWhvbGRlciB7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgICBtYXJnaW46IDEwcHggMTBweCAxMHB4IDVweDtcbiAgfVxuXG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICAuZWZmZWN0X19kcmFnLWhhbmRsZSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgfVxuXG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmRIb3Zlcn07XG5gO1xuXG5jb25zdCBIZWFkZXJBY3Rpb25TZWN0aW9uID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICByaWdodDogMTBweDtcbiAgJjpob3ZlciB7XG4gICAgLmVmZmVjdC1wYW5lbF9faGVhZGVyX19hY3Rpb25zX19oaWRkZW4ge1xuICAgICAgb3BhY2l0eTogMTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgIH1cbiAgfVxuYDtcblxuLy8gSGlkZW4gYWN0aW9ucyBvbmx5IHNob3cgdXAgb24gaG92ZXJcbnR5cGUgU3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zUHJvcHMgPSB7aXNDb25maWdBY3RpdmU6IGJvb2xlYW59O1xuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2VmZmVjdC1wYW5lbF9faGVhZGVyX19hY3Rpb25zX19oaWRkZW4nXG59KTxTdHlsZWRQYW5lbEhlYWRlckhpZGRlbkFjdGlvbnNQcm9wcz5gXG4gIG9wYWNpdHk6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC40cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIDAuNHMgZWFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PlxuICAgIHByb3BzLmlzQ29uZmlnQWN0aXZlID8gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXIgOiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuXG4gICY6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdIYW5kbGUgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBvcGFjaXR5OiAwO1xuICB6LWluZGV4OiAxMDAwO1xuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IG1vdmU7XG4gICAgb3BhY2l0eTogMTtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIH1cbmA7XG5cbmNvbnN0IERyYWdIYW5kbGUgPSAoe2NsYXNzTmFtZSwgbGlzdGVuZXJzLCBjaGlsZHJlbn0pID0+IChcbiAgPFN0eWxlZERyYWdIYW5kbGUgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHsuLi5saXN0ZW5lcnN9PlxuICAgIHtjaGlsZHJlbn1cbiAgPC9TdHlsZWREcmFnSGFuZGxlPlxuKTtcblxuRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uRmFjdG9yeS5kZXBzID0gW1BhbmVsSGVhZGVyQWN0aW9uRmFjdG9yeV07XG5cbmV4cG9ydCBmdW5jdGlvbiBFZmZlY3RQYW5lbEhlYWRlckFjdGlvblNlY3Rpb25GYWN0b3J5KFxuICBQYW5lbEhlYWRlckFjdGlvbjogUmV0dXJuVHlwZTx0eXBlb2YgUGFuZWxIZWFkZXJBY3Rpb25GYWN0b3J5PlxuKTogUmVhY3QuRkM8RWZmZWN0UGFuZWxIZWFkZXJQcm9wcz4ge1xuICBjb25zdCBFZmZlY3RQYW5lbEhlYWRlckFjdGlvblNlY3Rpb24gPSAocHJvcHM6IEVmZmVjdFBhbmVsSGVhZGVyUHJvcHMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlZmZlY3RJZCxcbiAgICAgIGlzRW5hYmxlZCxcbiAgICAgIGlzQ29uZmlnQWN0aXZlLFxuICAgICAgb25Ub2dnbGVFbmFibGVkLFxuICAgICAgb25SZW1vdmVFZmZlY3QsXG4gICAgICBvblRvZ2dsZUVuYWJsZUNvbmZpZyxcbiAgICAgIGFjdGlvbkl0ZW1zLFxuICAgICAgYWN0aW9uSWNvbnMgPSBkZWZhdWx0QWN0aW9uSWNvbnNcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBlZmZlY3RBY3Rpb25JdGVtczogQWN0aW9uSXRlbVtdID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGFjdGlvbkl0ZW1zID8/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdyZW1vdmUtZWZmZWN0JyxcbiAgICAgICAgICAgIGlzSGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgdG9vbHRpcDogJ3Rvb2x0aXAucmVtb3ZlRWZmZWN0JyxcbiAgICAgICAgICAgIHRvb2x0aXBUeXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgb25DbGljazogb25SZW1vdmVFZmZlY3QsXG4gICAgICAgICAgICBpY29uOiBhY3Rpb25JY29ucy5yZW1vdmVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ3Zpc2liaWxpdHktdG9nZ2xlJyxcbiAgICAgICAgICAgIHRvb2x0aXA6IGlzRW5hYmxlZCA/ICd0b29sdGlwLmRpc2FibGVFZmZlY3QnIDogJ3Rvb2x0aXAuZW5hYmxlZEVmZmVjdCcsXG4gICAgICAgICAgICBvbkNsaWNrOiBvblRvZ2dsZUVuYWJsZWQsXG4gICAgICAgICAgICBpY29uOiBpc0VuYWJsZWQgPyBhY3Rpb25JY29ucy52aXNpYmxlIDogYWN0aW9uSWNvbnMuaGlkZGVuXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdlbmFibGUtY29uZmlnJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZXM6IHsnaXMtb3Blbic6IGlzQ29uZmlnQWN0aXZlfSxcbiAgICAgICAgICAgIHRvb2x0aXA6ICd0b29sdGlwLmVmZmVjdFNldHRpbmdzJyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IG9uVG9nZ2xlRW5hYmxlQ29uZmlnLFxuICAgICAgICAgICAgaWNvbjogYWN0aW9uSWNvbnMuZW5hYmxlQ29uZmlnXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgW1xuICAgICAgICBhY3Rpb25JdGVtcyxcbiAgICAgICAgYWN0aW9uSWNvbnMsXG4gICAgICAgIGlzRW5hYmxlZCxcbiAgICAgICAgaXNDb25maWdBY3RpdmUsXG4gICAgICAgIG9uUmVtb3ZlRWZmZWN0LFxuICAgICAgICBvblRvZ2dsZUVuYWJsZWQsXG4gICAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8SGVhZGVyQWN0aW9uU2VjdGlvbiBjbGFzc05hbWU9XCJlZmZlY3QtcGFuZWxfX2hlYWRlcl9fYWN0aW9uc1wiPlxuICAgICAgICA8U3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zIGlzQ29uZmlnQWN0aXZlPXtpc0NvbmZpZ0FjdGl2ZX0+XG4gICAgICAgICAge2VmZmVjdEFjdGlvbkl0ZW1zXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBBY3Rpb25JdGVtKSA9PiBCb29sZWFuKGl0ZW0uaXNIaWRkZW4pKVxuICAgICAgICAgICAgLm1hcCgoaXRlbTogQWN0aW9uSXRlbSkgPT4gKFxuICAgICAgICAgICAgICA8UGFuZWxIZWFkZXJBY3Rpb25cbiAgICAgICAgICAgICAgICBrZXk9e2l0ZW0ua2V5fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGVmZmVjdF9fJHtpdGVtLmtleX1gfVxuICAgICAgICAgICAgICAgIHRlc3RJZD17YCR7aXRlbS5rZXl9LWFjdGlvbmB9XG4gICAgICAgICAgICAgICAgaWQ9e2VmZmVjdElkfVxuICAgICAgICAgICAgICAgIHRvb2x0aXA9e2l0ZW0udG9vbHRpcH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtpdGVtLm9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgdG9vbHRpcFR5cGU9e2l0ZW0udG9vbHRpcFR5cGV9XG4gICAgICAgICAgICAgICAgSWNvbkNvbXBvbmVudD17aXRlbS5pY29ufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvU3R5bGVkUGFuZWxIZWFkZXJIaWRkZW5BY3Rpb25zPlxuICAgICAgICB7ZWZmZWN0QWN0aW9uSXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtOiBBY3Rpb25JdGVtKSA9PiAhaXRlbS5pc0hpZGRlbilcbiAgICAgICAgICAubWFwKChpdGVtOiBBY3Rpb25JdGVtKSA9PiAoXG4gICAgICAgICAgICA8UGFuZWxIZWFkZXJBY3Rpb25cbiAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKGBlZmZlY3RfXyR7aXRlbS5rZXl9YCwgaXRlbS5jbGFzc05hbWVzKX1cbiAgICAgICAgICAgICAgdGVzdElkPXtgJHtpdGVtLmtleX0tYWN0aW9uYH1cbiAgICAgICAgICAgICAgaWQ9e2VmZmVjdElkfVxuICAgICAgICAgICAgICB0b29sdGlwPXtpdGVtLnRvb2x0aXB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2l0ZW0ub25DbGlja31cbiAgICAgICAgICAgICAgdG9vbHRpcFR5cGU9e2l0ZW0udG9vbHRpcFR5cGV9XG4gICAgICAgICAgICAgIEljb25Db21wb25lbnQ9e2l0ZW0uaWNvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICA8L0hlYWRlckFjdGlvblNlY3Rpb24+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uO1xufVxuXG5jb25zdCBTdHlsZWRFZmZlY3RUaXRsZVNlY3Rpb24gPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tbGVmdDogOHB4O1xuICBmbGV4LWdyb3c6IDE7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG5gO1xuXG5jb25zdCBJY29uUGxhY2Vob2xkZXIgPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuYDtcblxuY29uc3QgRWZmZWN0SWNvbldyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBoZWlnaHQ6IDE4cHg7XG4gIG1hcmdpbjogYXV0bztcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbmA7XG5cbkVmZmVjdFBhbmVsSGVhZGVyRmFjdG9yeS5kZXBzID0gW0VmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbkZhY3RvcnldO1xuXG5mdW5jdGlvbiBFZmZlY3RQYW5lbEhlYWRlckZhY3RvcnkoXG4gIEVmZmVjdFBhbmVsSGVhZGVyQWN0aW9uU2VjdGlvbjogUmV0dXJuVHlwZTx0eXBlb2YgRWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uRmFjdG9yeT5cbik6IFJlYWN0LkZDPEVmZmVjdFBhbmVsSGVhZGVyUHJvcHM+IHtcbiAgY29uc3QgRWZmZWN0UGFuZWxIZWFkZXIgPSAocHJvcHM6IEVmZmVjdFBhbmVsSGVhZGVyUHJvcHMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBpc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIGlzRHJhZ05Ecm9wRW5hYmxlZCA9IHRydWUsXG4gICAgICB0eXBlLFxuICAgICAgb25Ub2dnbGVFbmFibGVDb25maWcsXG4gICAgICBsaXN0ZW5lcnMsXG4gICAgICBzaG93U29ydEhhbmRsZSA9IHRydWVcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBsYWJlbCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBFRkZFQ1RfREVTQ1JJUFRJT05TLmZpbmQoX2Rlc2NyaXB0aW9uID0+IF9kZXNjcmlwdGlvbi50eXBlID09PSB0eXBlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdGlvbj8ubmFtZSB8fCAnRWZmZWN0JztcbiAgICB9LCBbdHlwZV0pO1xuXG4gICAgY29uc3QgRWZmZWN0SWNvbiA9IGRlZmF1bHRFZmZlY3RJY29uc1t0eXBlXTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkRWZmZWN0UGFuZWxIZWFkZXJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdlZmZlY3QtcGFuZWxfX2hlYWRlcicsIHtcbiAgICAgICAgICAnc29ydC0taGFuZGxlJzogIWlzQ29uZmlnQWN0aXZlXG4gICAgICAgIH0pfVxuICAgICAgICBhY3RpdmU9e2lzQ29uZmlnQWN0aXZlfVxuICAgICAgICBvbkNsaWNrPXtvblRvZ2dsZUVuYWJsZUNvbmZpZ31cbiAgICAgID5cbiAgICAgICAge2lzRHJhZ05Ecm9wRW5hYmxlZCA/IChcbiAgICAgICAgICA8RHJhZ0hhbmRsZSBjbGFzc05hbWU9XCJlZmZlY3RfX2RyYWctaGFuZGxlXCIgbGlzdGVuZXJzPXtsaXN0ZW5lcnN9PlxuICAgICAgICAgICAge3Nob3dTb3J0SGFuZGxlID8gPFZlcnREb3RzIGhlaWdodD1cIjIwcHhcIiAvPiA6IDxJY29uUGxhY2Vob2xkZXIgLz59XG4gICAgICAgICAgPC9EcmFnSGFuZGxlPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZWZmZWN0X19kcmFnLWhhbmRsZV9fcGxhY2Vob2xkZXJcIiAvPlxuICAgICAgICApfVxuXG4gICAgICAgIDxFZmZlY3RJY29uV3JhcHBlcj57RWZmZWN0SWNvbiA/IDxFZmZlY3RJY29uIGhlaWdodD1cIjE4cHhcIiAvPiA6IG51bGx9PC9FZmZlY3RJY29uV3JhcHBlcj5cblxuICAgICAgICA8U3R5bGVkRWZmZWN0VGl0bGVTZWN0aW9uPntsYWJlbH08L1N0eWxlZEVmZmVjdFRpdGxlU2VjdGlvbj5cblxuICAgICAgICA8RWZmZWN0UGFuZWxIZWFkZXJBY3Rpb25TZWN0aW9uIHsuLi5wcm9wc30gLz5cbiAgICAgIDwvU3R5bGVkRWZmZWN0UGFuZWxIZWFkZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gRWZmZWN0UGFuZWxIZWFkZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVmZmVjdFBhbmVsSGVhZGVyRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQVFBLElBQUFLLGtCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxNQUFBLEdBQUFOLE9BQUE7QUEyQkEsSUFBQU8sa0JBQUEsR0FBQVAsT0FBQTtBQUE4RCxJQUFBUSxtQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBM0M5RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFsQix3QkFBQWtCLENB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