UNPKG

kepler.gl.geoiq

Version:

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

293 lines (250 loc) 44 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.PanelTitleFactory = void 0; exports["default"] = SidePanelFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _sideBar = _interopRequireDefault(require("./side-panel/side-bar")); var _panelHeader = _interopRequireDefault(require("./side-panel/panel-header")); var _layerManager = _interopRequireDefault(require("./side-panel/layer-manager")); var _filterManager = _interopRequireDefault(require("./side-panel/filter-manager")); var _interactionManager = _interopRequireDefault(require("./side-panel/interaction-manager")); var _mapManager = _interopRequireDefault(require("./side-panel/map-manager")); var _widgetManager = _interopRequireDefault(require("./side-panel/widget-manager")); var _panelToggle = _interopRequireDefault(require("./side-panel/panel-toggle")); var _defaultSettings = require("../constants/default-settings"); var _templateObject, _templateObject2; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var SidePanelContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n flex-grow: 1;\n padding: 16px;\n overflow-y: scroll;\n overflow-x: hidden;\n"])), function (props) { return props.theme.sidePanelScrollBar; }); var PanelTitleFactory = exports.PanelTitleFactory = function PanelTitleFactory() { return _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n font-weight: 400;\n letter-spacing: 1.25px;\n margin-bottom: 14px;\n"])), function (props) { return props.theme.titleTextColor; }); }; SidePanelFactory.deps = [_sideBar["default"], _panelHeader["default"], _panelToggle["default"], PanelTitleFactory, _layerManager["default"], _filterManager["default"], _interactionManager["default"], _mapManager["default"], _widgetManager["default"]]; /** * * Vertical sidebar containing input components for the rendering layers */ function SidePanelFactory(Sidebar, PanelHeader, PanelToggle, PanelTitle, LayerManager, FilterManager, InteractionManager, MapManager, WidgetManager) { var _class, _temp; return _temp = _class = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(SidePanel, _Component); var _super = _createSuper(SidePanel); function SidePanel() { var _this; (0, _classCallCheck2["default"])(this, SidePanel); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); /* component private functions */ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onOpenOrClose", function () { _this.props.uiStateActions.toggleSidePanel(_this.props.uiState.activeSidePanel ? null : 'layer'); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showDatasetTable", function (dataId) { // this will open data table modal _this.props.visStateActions.showDatasetTable(dataId); _this.props.uiStateActions.toggleModal(_defaultSettings.DATA_TABLE_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showAddDataModal", function () { _this.props.uiStateActions.toggleModal(_defaultSettings.ADD_DATA_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showAddExternalDataModal", function () { _this.props.uiStateActions.toggleModal(_defaultSettings.ADD_EXTERNAL_DATA_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showAddMapStyleModal", function () { _this.props.uiStateActions.toggleModal(_defaultSettings.ADD_MAP_STYLE_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_showAddWidgetModal", function () { _this.props.uiStateActions.toggleModal(_defaultSettings.ADD_WIDGET_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeDataset", function (key) { // this will show the modal dialog to confirm deletion _this.props.uiStateActions.openDeleteModal(key); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportImage", function () { return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_IMAGE_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportData", function () { return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_DATA_ID); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onExportConfig", function () { return _this.props.uiStateActions.toggleModal(_defaultSettings.EXPORT_CONFIG_ID); }); return _this; } (0, _createClass2["default"])(SidePanel, [{ key: "render", value: function render() { var _this$props = this.props, appName = _this$props.appName, version = _this$props.version, datasets = _this$props.datasets, filters = _this$props.filters, layers = _this$props.layers, layerBlending = _this$props.layerBlending, layerClasses = _this$props.layerClasses, uiState = _this$props.uiState, layerOrder = _this$props.layerOrder, interactionConfig = _this$props.interactionConfig, visStateActions = _this$props.visStateActions, mapStyleActions = _this$props.mapStyleActions, uiStateActions = _this$props.uiStateActions, widgets = _this$props.widgets, widgetClasses = _this$props.widgetClasses, widgetOrder = _this$props.widgetOrder, mapState = _this$props.mapState, auth = _this$props.auth, project = _this$props.project; var activeSidePanel = uiState.activeSidePanel; var isOpen = Boolean(activeSidePanel); var layerManagerActions = { addLayer: visStateActions.addLayer, layerConfigChange: visStateActions.layerConfigChange, layerVisualChannelConfigChange: visStateActions.layerVisualChannelConfigChange, layerTypeChange: visStateActions.layerTypeChange, layerVisConfigChange: visStateActions.layerVisConfigChange, layerColorUIChange: visStateActions.layerColorUIChange, layerTextLabelChange: visStateActions.layerTextLabelChange, updateLayerBlending: visStateActions.updateLayerBlending, updateLayerOrder: visStateActions.reorderLayer, showDatasetTable: this._showDatasetTable, showAddDataModal: this._showAddDataModal, showAddExternalDataModal: this._showAddExternalDataModal, removeLayer: visStateActions.removeLayer, removeDataset: this._removeDataset, updateLayerData: visStateActions.updateLayerData, axiosAPICAll: visStateActions.axiosAPICAll }; var filterManagerActions = { addFilter: visStateActions.addFilter, removeFilter: visStateActions.removeFilter, setFilter: visStateActions.setFilter, showDatasetTable: this._showDatasetTable, showAddDataModal: this._showAddDataModal, toggleAnimation: visStateActions.toggleFilterAnimation, enlargeFilter: visStateActions.enlargeFilter, setFilterAPI: visStateActions.setFilterAPI }; var interactionManagerActions = { onConfigChange: visStateActions.interactionConfigChange }; var mapManagerActions = { addMapStyleUrl: mapStyleActions.addMapStyleUrl, onConfigChange: mapStyleActions.mapConfigChange, onStyleChange: mapStyleActions.mapStyleChange, onBuildingChange: mapStyleActions.mapBuildingChange, showAddMapStyleModal: this._showAddMapStyleModal, set3dBuildingColor: mapStyleActions.set3dBuildingColor }; var WidgetManagerActions = { addWidget: visStateActions.addWidget, widgetConfigChange: visStateActions.widgetConfigChange, widgetVisualChannelConfigChange: visStateActions.widgetVisualChannelConfigChange, widgetVisConfigChange: visStateActions.widgetVisConfigChange, showDatasetTable: this._showDatasetTable, widgetTypeChange: visStateActions.widgetTypeChange, updateWidgetOrder: visStateActions.reorderWidget, removeWidget: visStateActions.removeWidget // enlargeWidget: visStateActions.enlargeWidget ((for future)) }; return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(Sidebar, { width: this.props.width, isOpen: isOpen, minifiedWidth: 0, onOpenOrClose: this._onOpenOrClose }, /*#__PURE__*/_react["default"].createElement(PanelHeader, { appName: appName, version: version, onExportImage: this._onExportImage, onExportData: this._onExportData, visibleDropdown: uiState.visibleDropdown, showExportDropdown: uiStateActions.showExportDropdown, hideExportDropdown: uiStateActions.hideExportDropdown, onExportConfig: this._onExportConfig, onSaveMap: this.props.onSaveMap }), /*#__PURE__*/_react["default"].createElement(PanelToggle, { panels: _defaultSettings.PANELS, activePanel: activeSidePanel, togglePanel: uiStateActions.toggleSidePanel }), /*#__PURE__*/_react["default"].createElement(SidePanelContent, { className: "side-panel__content" }, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(PanelTitle, { className: "side-panel__content__title" }, (_defaultSettings.PANELS.find(function (_ref) { var id = _ref.id; return id === activeSidePanel; }) || {}).label), activeSidePanel === 'layer' && /*#__PURE__*/_react["default"].createElement(LayerManager, (0, _extends2["default"])({}, layerManagerActions, { datasets: datasets, layers: layers, layerClasses: layerClasses, layerOrder: layerOrder, layerBlending: layerBlending, openModal: uiStateActions.toggleModal, mapState: mapState, filters: filters, isPublic: !uiState.readOnly })), activeSidePanel === 'filter' && /*#__PURE__*/_react["default"].createElement(FilterManager, (0, _extends2["default"])({}, filterManagerActions, { datasets: datasets, layers: layers, filters: filters, mapState: mapState, auth: auth, project: project })), activeSidePanel === 'interaction' && /*#__PURE__*/_react["default"].createElement(InteractionManager, (0, _extends2["default"])({}, interactionManagerActions, { datasets: datasets, interactionConfig: interactionConfig })), activeSidePanel === 'map' && /*#__PURE__*/_react["default"].createElement(MapManager, (0, _extends2["default"])({}, mapManagerActions, { mapStyle: this.props.mapStyle })), activeSidePanel === 'widget' && /*#__PURE__*/_react["default"].createElement(WidgetManager, (0, _extends2["default"])({}, WidgetManagerActions, { datasets: datasets, widgets: widgets, widgetClasses: widgetClasses, widgetOrder: widgetOrder, layers: layers, filters: filters, openModal: uiStateActions.toggleModal, mapState: mapState, auth: auth, project: project })))))) ); } }]); return SidePanel; }(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", { filters: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, auth: _propTypes["default"].object.isRequired, project: _propTypes["default"].object.isRequired, interactionConfig: _propTypes["default"].object.isRequired, layerBlending: _propTypes["default"].string.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, layerClasses: _propTypes["default"].object.isRequired, mapStyle: _propTypes["default"].object.isRequired, mapState: _propTypes["default"].object.isRequired, width: _propTypes["default"].number.isRequired, datasets: _propTypes["default"].object.isRequired, visStateActions: _propTypes["default"].object.isRequired, mapStyleActions: _propTypes["default"].object.isRequired }), _temp; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwuanMiXSwibmFtZXMiOlsiU2lkZVBhbmVsQ29udGVudCIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzaWRlUGFuZWxTY3JvbGxCYXIiLCJQYW5lbFRpdGxlRmFjdG9yeSIsInRpdGxlVGV4dENvbG9yIiwiU2lkZVBhbmVsRmFjdG9yeSIsImRlcHMiLCJTaWRlYmFyRmFjdG9yeSIsIlBhbmVsSGVhZGVyRmFjdG9yeSIsIlBhbmVsVG9nZ2xlRmFjdG9yeSIsIkxheWVyTWFuYWdlckZhY3RvcnkiLCJGaWx0ZXJNYW5hZ2VyRmFjdG9yeSIsIkludGVyYWN0aW9uTWFuYWdlckZhY3RvcnkiLCJNYXBNYW5hZ2VyRmFjdG9yeSIsIldpZGdldE1hbmFnZXJGYWN0b3J5IiwiU2lkZWJhciIsIlBhbmVsSGVhZGVyIiwiUGFuZWxUb2dnbGUiLCJQYW5lbFRpdGxlIiwiTGF5ZXJNYW5hZ2VyIiwiRmlsdGVyTWFuYWdlciIsIkludGVyYWN0aW9uTWFuYWdlciIsIk1hcE1hbmFnZXIiLCJXaWRnZXRNYW5hZ2VyIiwidWlTdGF0ZUFjdGlvbnMiLCJ0b2dnbGVTaWRlUGFuZWwiLCJ1aVN0YXRlIiwiYWN0aXZlU2lkZVBhbmVsIiwiZGF0YUlkIiwidmlzU3RhdGVBY3Rpb25zIiwic2hvd0RhdGFzZXRUYWJsZSIsInRvZ2dsZU1vZGFsIiwiREFUQV9UQUJMRV9JRCIsIkFERF9EQVRBX0lEIiwiQUREX0VYVEVSTkFMX0RBVEFfSUQiLCJBRERfTUFQX1NUWUxFX0lEIiwiQUREX1dJREdFVF9JRCIsImtleSIsIm9wZW5EZWxldGVNb2RhbCIsIkVYUE9SVF9JTUFHRV9JRCIsIkVYUE9SVF9EQVRBX0lEIiwiRVhQT1JUX0NPTkZJR19JRCIsImFwcE5hbWUiLCJ2ZXJzaW9uIiwiZGF0YXNldHMiLCJmaWx0ZXJzIiwibGF5ZXJzIiwibGF5ZXJCbGVuZGluZyIsImxheWVyQ2xhc3NlcyIsImxheWVyT3JkZXIiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIm1hcFN0eWxlQWN0aW9ucyIsIndpZGdldHMiLCJ3aWRnZXRDbGFzc2VzIiwid2lkZ2V0T3JkZXIiLCJtYXBTdGF0ZSIsImF1dGgiLCJwcm9qZWN0IiwiaXNPcGVuIiwiQm9vbGVhbiIsImxheWVyTWFuYWdlckFjdGlvbnMiLCJhZGRMYXllciIsImxheWVyQ29uZmlnQ2hhbmdlIiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwibGF5ZXJUeXBlQ2hhbmdlIiwibGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllclRleHRMYWJlbENoYW5nZSIsInVwZGF0ZUxheWVyQmxlbmRpbmciLCJ1cGRhdGVMYXllck9yZGVyIiwicmVvcmRlckxheWVyIiwiX3Nob3dEYXRhc2V0VGFibGUiLCJzaG93QWRkRGF0YU1vZGFsIiwiX3Nob3dBZGREYXRhTW9kYWwiLCJzaG93QWRkRXh0ZXJuYWxEYXRhTW9kYWwiLCJfc2hvd0FkZEV4dGVybmFsRGF0YU1vZGFsIiwicmVtb3ZlTGF5ZXIiLCJyZW1vdmVEYXRhc2V0IiwiX3JlbW92ZURhdGFzZXQiLCJ1cGRhdGVMYXllckRhdGEiLCJheGlvc0FQSUNBbGwiLCJmaWx0ZXJNYW5hZ2VyQWN0aW9ucyIsImFkZEZpbHRlciIsInJlbW92ZUZpbHRlciIsInNldEZpbHRlciIsInRvZ2dsZUFuaW1hdGlvbiIsInRvZ2dsZUZpbHRlckFuaW1hdGlvbiIsImVubGFyZ2VGaWx0ZXIiLCJzZXRGaWx0ZXJBUEkiLCJpbnRlcmFjdGlvbk1hbmFnZXJBY3Rpb25zIiwib25Db25maWdDaGFuZ2UiLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZSIsIm1hcE1hbmFnZXJBY3Rpb25zIiwiYWRkTWFwU3R5bGVVcmwiLCJtYXBDb25maWdDaGFuZ2UiLCJvblN0eWxlQ2hhbmdlIiwibWFwU3R5bGVDaGFuZ2UiLCJvbkJ1aWxkaW5nQ2hhbmdlIiwibWFwQnVpbGRpbmdDaGFuZ2UiLCJzaG93QWRkTWFwU3R5bGVNb2RhbCIsIl9zaG93QWRkTWFwU3R5bGVNb2RhbCIsInNldDNkQnVpbGRpbmdDb2xvciIsIldpZGdldE1hbmFnZXJBY3Rpb25zIiwiYWRkV2lkZ2V0Iiwid2lkZ2V0Q29uZmlnQ2hhbmdlIiwid2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsIndpZGdldFZpc0NvbmZpZ0NoYW5nZSIsIndpZGdldFR5cGVDaGFuZ2UiLCJ1cGRhdGVXaWRnZXRPcmRlciIsInJlb3JkZXJXaWRnZXQiLCJyZW1vdmVXaWRnZXQiLCJ3aWR0aCIsIl9vbk9wZW5PckNsb3NlIiwiX29uRXhwb3J0SW1hZ2UiLCJfb25FeHBvcnREYXRhIiwidmlzaWJsZURyb3Bkb3duIiwic2hvd0V4cG9ydERyb3Bkb3duIiwiaGlkZUV4cG9ydERyb3Bkb3duIiwiX29uRXhwb3J0Q29uZmlnIiwib25TYXZlTWFwIiwiUEFORUxTIiwiZmluZCIsImlkIiwibGFiZWwiLCJyZWFkT25seSIsIm1hcFN0eWxlIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiYXJyYXlPZiIsImFueSIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FBWUEsSUFBTUEsZ0JBQWdCLEdBQUdDLDZCQUFPQyxHQUFWLG1MQUNsQixVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGtCQUFoQjtBQUFBLENBRGEsQ0FBdEI7O0FBUU8sSUFBTUMsaUJBQWlCLCtCQUFHLFNBQXBCQSxpQkFBb0I7QUFBQSxTQUFNTCw2QkFBT0MsR0FBYix1TUFDdEIsVUFBQUMsS0FBSztBQUFBLFdBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZRyxjQUFoQjtBQUFBLEdBRGlCO0FBQUEsQ0FBMUI7O0FBUVBDLGdCQUFnQixDQUFD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QVYsQ0FBaUJELFVBUlY7QUFTakIzRSxJQUFBQSxRQUFRLEVBQUV3RSxzQkFBVUksTUFBVixDQUFpQkQsVUFUVjtBQVVqQm5CLElBQUFBLEtBQUssRUFBRWdCLHNCQUFVTSxNQUFWLENBQWlCSCxVQVZQO0FBV2pCdEYsSUFBQUEsUUFBUSxFQUFFbUYsc0JBQVVJLE1BQVYsQ0FBaUJELFVBWFY7QUFZakJyRyxJQUFBQSxlQUFlLEVBQUVrRyxzQkFBVUksTUFBVixDQUFpQkQsVUFaakI7QUFhakIvRSxJQUFBQSxlQUFlLEVBQUU0RSxzQkFBVUksTUFBVixDQUFpQkQ7QUFiakIsR0FEckI7QUFzT0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IFNpZGViYXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9zaWRlLWJhcic7XG5pbXBvcnQgUGFuZWxIZWFkZXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9wYW5lbC1oZWFkZXInO1xuaW1wb3J0IExheWVyTWFuYWdlckZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL2xheWVyLW1hbmFnZXInO1xuaW1wb3J0IEZpbHRlck1hbmFnZXJGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbC9maWx0ZXItbWFuYWdlcic7XG5pbXBvcnQgSW50ZXJhY3Rpb25NYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvaW50ZXJhY3Rpb24tbWFuYWdlcic7XG5pbXBvcnQgTWFwTWFuYWdlckZhY3RvcnkgZnJvbSAnLi9zaWRlLXBhbmVsL21hcC1tYW5hZ2VyJztcbmltcG9ydCBXaWRnZXRNYW5hZ2VyRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvd2lkZ2V0LW1hbmFnZXInO1xuaW1wb3J0IFBhbmVsVG9nZ2xlRmFjdG9yeSBmcm9tICcuL3NpZGUtcGFuZWwvcGFuZWwtdG9nZ2xlJztcblxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIEFERF9NQVBfU1RZTEVfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIEFERF9XSURHRVRfSUQsXG4gIEVYUE9SVF9JTUFHRV9JRCxcbiAgRVhQT1JUX0RBVEFfSUQsXG4gIEVYUE9SVF9DT05GSUdfSUQsXG4gIFBBTkVMUyxcbiAgQUREX0VYVEVSTkFMX0RBVEFfSURcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5jb25zdCBTaWRlUGFuZWxDb250ZW50ID0gc3R5bGVkLmRpdmBcbiAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zaWRlUGFuZWxTY3JvbGxCYXJ9O1xuICBmbGV4LWdyb3c6IDE7XG4gIHBhZGRpbmc6IDE2cHg7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuYDtcblxuZXhwb3J0IGNvbnN0IFBhbmVsVGl0bGVGYWN0b3J5ID0gKCkgPT4gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGl0bGVUZXh0Q29sb3J9O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGxldHRlci1zcGFjaW5nOiAxLjI1cHg7XG4gIG1hcmdpbi1ib3R0b206IDE0cHg7XG5gO1xuXG5TaWRlUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIFNpZGViYXJGYWN0b3J5LFxuICBQYW5lbEhlYWRlckZhY3RvcnksXG4gIFBhbmVsVG9nZ2xlRmFjdG9yeSxcbiAgUGFuZWxUaXRsZUZhY3RvcnksXG4gIExheWVyTWFuYWdlckZhY3RvcnksXG4gIEZpbHRlck1hbmFnZXJGYWN0b3J5LFxuICBJbnRlcmFjdGlvbk1hbmFnZXJGYWN0b3J5LFxuICBNYXBNYW5hZ2VyRmFjdG9yeSxcbiAgV2lkZ2V0TWFuYWdlckZhY3Rvcnlcbl07XG5cbi8qKlxuICpcbiAqIFZlcnRpY2FsIHNpZGViYXIgY29udGFpbmluZyBpbnB1dCBjb21wb25lbnRzIGZvciB0aGUgcmVuZGVyaW5nIGxheWVyc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTaWRlUGFuZWxGYWN0b3J5KFxuICBTaWRlYmFyLFxuICBQYW5lbEhlYWRlcixcbiAgUGFuZWxUb2dnbGUsXG4gIFBhbmVsVGl0bGUsXG4gIExheWVyTWFuYWdlcixcbiAgRmlsdGVyTWFuYWdlcixcbiAgSW50ZXJhY3Rpb25NYW5hZ2VyLFxuICBNYXBNYW5hZ2VyLFxuICBXaWRnZXRNYW5hZ2VyXG4pIHtcbiAgcmV0dXJuIGNsYXNzIFNpZGVQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4gICAgICBhdXRoOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBwcm9qZWN0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBpbnRlcmFjdGlvbkNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJCbGVuZGluZzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KS5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJDbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBtYXBTdHlsZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgbWFwU3RhdGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBtYXBTdHlsZUFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICAvKiBjb21wb25lbnQgcHJpdmF0ZSBmdW5jdGlvbnMgKi9cbiAgICBfb25PcGVuT3JDbG9zZSA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlU2lkZVBhbmVsKFxuICAgICAgICB0aGlzLnByb3BzLnVpU3RhdGUuYWN0aXZlU2lkZVBhbmVsID8gbnVsbCA6ICdsYXllcidcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF9zaG93RGF0YXNldFRhYmxlID0gZGF0YUlkID0+IHtcbiAgICAgIC8vIHRoaXMgd2lsbCBvcGVuIGRhdGEgdGFibGUgbW9kYWxcbiAgICAgIHRoaXMucHJvcHMudmlzU3RhdGVBY3Rpb25zLnNob3dEYXRhc2V0VGFibGUoZGF0YUlkKTtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoREFUQV9UQUJMRV9JRCk7XG4gICAgfTtcblxuICAgIF9zaG93QWRkRGF0YU1vZGFsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbChBRERfREFUQV9JRCk7XG4gICAgfTtcblxuICAgIF9zaG93QWRkRXh0ZXJuYWxEYXRhTW9kYWwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLnVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1vZGFsKEFERF9FWFRFUk5BTF9EQVRBX0lEKTtcbiAgICB9O1xuXG4gICAgX3Nob3dBZGRNYXBTdHlsZU1vZGFsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbChBRERfTUFQX1NUWUxFX0lEKTtcbiAgICB9O1xuXG4gICAgX3Nob3dBZGRXaWRnZXRNb2RhbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoQUREX1dJREdFVF9JRCk7XG4gICAgfTtcblxuICAgIF9yZW1vdmVEYXRhc2V0ID0ga2V5ID0+IHtcbiAgICAgIC8vIHRoaXMgd2lsbCBzaG93IHRoZSBtb2RhbCBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvblxuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy5vcGVuRGVsZXRlTW9kYWwoa2V5KTtcbiAgICB9O1xuXG4gICAgX29uRXhwb3J0SW1hZ2UgPSAoKSA9PlxuICAgICAgdGhpcy5wcm9wcy51aVN0YXRlQWN0aW9ucy50b2dnbGVNb2RhbChFWFBPUlRfSU1BR0VfSUQpO1xuXG4gICAgX29uRXhwb3J0RGF0YSA9ICgpID0+IHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoRVhQT1JUX0RBVEFfSUQpO1xuXG4gICAgX29uRXhwb3J0Q29uZmlnID0gKCkgPT5cbiAgICAgIHRoaXMucHJvcHMudWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWwoRVhQT1JUX0NPTkZJR19JRCk7XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFwcE5hbWUsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBsYXllcnMsXG4gICAgICAgIGxheWVyQmxlbmRpbmcsXG4gICAgICAgIGxheWVyQ2xhc3NlcyxcbiAgICAgICAgdWlTdGF0ZSxcbiAgICAgICAgbGF5ZXJPcmRlcixcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICAgICAgbWFwU3R5bGVBY3Rpb25zLFxuICAgICAgICB1aVN0YXRlQWN0aW9ucyxcbiAgICAgICAgd2lkZ2V0cyxcbiAgICAgICAgd2lkZ2V0Q2xhc3NlcyxcbiAgICAgICAgd2lkZ2V0T3JkZXIsXG4gICAgICAgIG1hcFN0YXRlLFxuICAgICAgICBhdXRoLFxuICAgICAgICBwcm9qZWN0XG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3Qge2FjdGl2ZVNpZGVQYW5lbH0gPSB1aVN0YXRlO1xuICAgICAgY29uc3QgaXNPcGVuID0gQm9vbGVhbihhY3RpdmVTaWRlUGFuZWwpO1xuXG4gICAgICBjb25zdCBsYXllck1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBhZGRMYXllcjogdmlzU3RhdGVBY3Rpb25zLmFkZExheWVyLFxuICAgICAgICBsYXllckNvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6XG4gICAgICAgICAgdmlzU3RhdGVBY3Rpb25zLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgICAgICAgbGF5ZXJUeXBlQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUeXBlQ2hhbmdlLFxuICAgICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLmxheWVyVmlzQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllckNvbG9yVUlDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy5sYXllckNvbG9yVUlDaGFuZ2UsXG4gICAgICAgIGxheWVyVGV4dExhYmVsQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UsXG4gICAgICAgIHVwZGF0ZUxheWVyQmxlbmRpbmc6IHZpc1N0YXRlQWN0aW9ucy51cGRhdGVMYXllckJsZW5kaW5nLFxuICAgICAgICB1cGRhdGVMYXllck9yZGVyOiB2aXNTdGF0ZUFjdGlvbnMucmVvcmRlckxheWVyLFxuICAgICAgICBzaG93RGF0YXNldFRhYmxlOiB0aGlzLl9zaG93RGF0YXNldFRhYmxlLFxuICAgICAgICBzaG93QWRkRGF0YU1vZGFsOiB0aGlzLl9zaG93QWRkRGF0YU1vZGFsLFxuICAgICAgICBzaG93QWRkRXh0ZXJuYWxEYXRhTW9kYWw6IHRoaXMuX3Nob3dBZGRFeHRlcm5hbERhdGFNb2RhbCxcbiAgICAgICAgcmVtb3ZlTGF5ZXI6IHZpc1N0YXRlQWN0aW9ucy5yZW1vdmVMYXllcixcbiAgICAgICAgcmVtb3ZlRGF0YXNldDogdGhpcy5fcmVtb3ZlRGF0YXNldCxcbiAgICAgICAgdXBkYXRlTGF5ZXJEYXRhOiB2aXNTdGF0ZUFjdGlvbnMudXBkYXRlTGF5ZXJEYXRhLFxuICAgICAgICBheGlvc0FQSUNBbGw6IHZpc1N0YXRlQWN0aW9ucy5heGlvc0FQSUNBbGxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbHRlck1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBhZGRGaWx0ZXI6IHZpc1N0YXRlQWN0aW9ucy5hZGRGaWx0ZXIsXG4gICAgICAgIHJlbW92ZUZpbHRlcjogdmlzU3RhdGVBY3Rpb25zLnJlbW92ZUZpbHRlcixcbiAgICAgICAgc2V0RmlsdGVyOiB2aXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyLFxuICAgICAgICBzaG93RGF0YXNldFRhYmxlOiB0aGlzLl9zaG93RGF0YXNldFRhYmxlLFxuICAgICAgICBzaG93QWRkRGF0YU1vZGFsOiB0aGlzLl9zaG93QWRkRGF0YU1vZGFsLFxuICAgICAgICB0b2dnbGVBbmltYXRpb246IHZpc1N0YXRlQWN0aW9ucy50b2dnbGVGaWx0ZXJBbmltYXRpb24sXG4gICAgICAgIGVubGFyZ2VGaWx0ZXI6IHZpc1N0YXRlQWN0aW9ucy5lbmxhcmdlRmlsdGVyLFxuICAgICAgICBzZXRGaWx0ZXJBUEk6IHZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBUElcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGludGVyYWN0aW9uTWFuYWdlckFjdGlvbnMgPSB7XG4gICAgICAgIG9uQ29uZmlnQ2hhbmdlOiB2aXNTdGF0ZUFjdGlvbnMuaW50ZXJhY3Rpb25Db25maWdDaGFuZ2VcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hcE1hbmFnZXJBY3Rpb25zID0ge1xuICAgICAgICBhZGRNYXBTdHlsZVVybDogbWFwU3R5bGVBY3Rpb25zLmFkZE1hcFN0eWxlVXJsLFxuICAgICAgICBvbkNvbmZpZ0NoYW5nZTogbWFwU3R5bGVBY3Rpb25zLm1hcENvbmZpZ0NoYW5nZSxcbiAgICAgICAgb25TdHlsZUNoYW5nZTogbWFwU3R5bGVBY3Rpb25zLm1hcFN0eWxlQ2hhbmdlLFxuICAgICAgICBvbkJ1aWxkaW5nQ2hhbmdlOiBtYXBTdHlsZUFjdGlvbnMubWFwQnVpbGRpbmdDaGFuZ2UsXG4gICAgICAgIHNob3dBZGRNYXBTdHlsZU1vZGFsOiB0aGlzLl9zaG93QWRkTWFwU3R5bGVNb2RhbCxcbiAgICAgICAgc2V0M2RCdWlsZGluZ0NvbG9yOiBtYXBTdHlsZUFjdGlvbnMuc2V0M2RCdWlsZGluZ0NvbG9yXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBXaWRnZXRNYW5hZ2VyQWN0aW9ucyA9IHtcbiAgICAgICAgYWRkV2lkZ2V0OiB2aXNTdGF0ZUFjdGlvbnMuYWRkV2lkZ2V0LFxuICAgICAgICB3aWRnZXRDb25maWdDaGFuZ2U6IHZpc1N0YXRlQWN0aW9ucy53aWRnZXRDb25maWdDaGFuZ2UsXG4gICAgICAgIHdpZGdldFZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6XG4gICAgICAgICAgdmlzU3RhdGVBY3Rpb25zLndpZGdldFZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UsXG4gICAgICAgIHdpZGdldFZpc0NvbmZpZ0NoYW5nZTogdmlzU3RhdGVBY3Rpb25zLndpZGdldFZpc0NvbmZpZ0NoYW5nZSxcbiAgICAgICAgc2hvd0RhdGFzZXRUYWJsZTogdGhpcy5fc2hvd0RhdGFzZXRUYWJsZSxcbiAgICAgICAgd2lkZ2V0VHlwZUNoYW5nZTogdmlzU3RhdGVBY3Rpb25zLndpZGdldFR5cGVDaGFuZ2UsXG4gICAgICAgIHVwZGF0ZVdpZGdldE9yZGVyOiB2aXNTdGF0ZUFjdGlvbnMucmVvcmRlcldpZGdldCxcbiAgICAgICAgcmVtb3ZlV2lkZ2V0OiB2aXNTdGF0ZUFjdGlvbnMucmVtb3ZlV2lkZ2V0XG4gICAgICAgIC8vIGVubGFyZ2VXaWRnZXQ6IHZpc1N0YXRlQWN0aW9ucy5lbmxhcmdlV2lkZ2V0ICgoZm9yIGZ1dHVyZSkpXG4gICAgICB9O1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8U2lkZWJhclxuICAgICAgICAgICAgd2lkdGg9e3RoaXMucHJvcHMud2lkdGh9XG4gICAgICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgICAgIG1pbmlmaWVkV2lkdGg9ezB9XG4gICAgICAgICAgICBvbk9wZW5PckNsb3NlPXt0aGlzLl9vbk9wZW5PckNsb3NlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQYW5lbEhlYWRlclxuICAgICAgICAgICAgICBhcHBOYW1lPXthcHBOYW1lfVxuICAgICAgICAgICAgICB2ZXJzaW9uPXt2ZXJzaW9ufVxuICAgICAgICAgICAgICBvbkV4cG9ydEltYWdlPXt0aGlzLl9vbkV4cG9ydEltYWdlfVxuICAgICAgICAgICAgICBvbkV4cG9ydERhdGE9e3RoaXMuX29uRXhwb3J0RGF0YX1cbiAgICAgICAgICAgICAgdmlzaWJsZURyb3Bkb3duPXt1aVN0YXRlLnZpc2libGVEcm9wZG93bn1cbiAgICAgICAgICAgICAgc2hvd0V4cG9ydERyb3Bkb3duPXt1aVN0YXRlQWN0aW9ucy5zaG93RXhwb3J0RHJvcGRvd259XG4gICAgICAgICAgICAgIGhpZGVFeHBvcnREcm9wZG93bj17dWlTdGF0ZUFjdGlvbnMuaGlkZUV4cG9ydERyb3Bkb3dufVxuICAgICAgICAgICAgICBvbkV4cG9ydENvbmZpZz17dGhpcy5fb25FeHBvcnRDb25maWd9XG4gICAgICAgICAgICAgIG9uU2F2ZU1hcD17dGhpcy5wcm9wcy5vblNhdmVNYXB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPFBhbmVsVG9nZ2xlXG4gICAgICAgICAgICAgIHBhbmVscz17UEFORUxTfVxuICAgICAgICAgICAgICBhY3RpdmVQYW5lbD17YWN0aXZlU2lkZVBhbmVsfVxuICAgICAgICAgICAgICB0b2dnbGVQYW5lbD17dWlTdGF0ZUFjdGlvbnMudG9nZ2xlU2lkZVBhbmVsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxTaWRlUGFuZWxDb250ZW50IGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8UGFuZWxUaXRsZSBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19jb250ZW50X190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgeyhQQU5FTFMuZmluZCgoe2lkfSkgPT4gaWQgPT09IGFjdGl2ZVNpZGVQYW5lbCkgfHwge30pLmxhYmVsfVxuICAgICAgICAgICAgICAgIDwvUGFuZWxUaXRsZT5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU2lkZVBhbmVsID09PSAnbGF5ZXInICYmIChcbiAgICAgICAgICAgICAgICAgIDxMYXllck1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLmxheWVyTWFuYWdlckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICAgICAgICAgIGxheWVyQ2xhc3Nlcz17bGF5ZXJDbGFzc2VzfVxuICAgICAgICAgICAgICAgICAgICBsYXllck9yZGVyPXtsYXllck9yZGVyfVxuICAgICAgICAgICAgICAgICAgICBsYXllckJsZW5kaW5nPXtsYXllckJsZW5kaW5nfVxuICAgICAgICAgICAgICAgICAgICBvcGVuTW9kYWw9e3VpU3RhdGVBY3Rpb25zLnRvZ2dsZU1vZGFsfVxuICAgICAgICAgICAgICAgICAgICBtYXBTdGF0ZT17bWFwU3RhdGV9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICAgICAgICAgIGlzUHVibGljPXshdWlTdGF0ZS5yZWFkT25seX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YWN0aXZlU2lkZVBhbmVsID09PSAnZmlsdGVyJyAmJiAoXG4gICAgICAgICAgICAgICAgICA8RmlsdGVyTWFuYWdlclxuICAgICAgICAgICAgICAgICAgICB7Li4uZmlsdGVyTWFuYWdlckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICAgICAgICAgIG1hcFN0YXRlPXttYXBTdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgYXV0aD17YXV0aH1cbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdD17cHJvamVjdH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7YWN0aXZlU2lkZVBhbmVsID09PSAnaW50ZXJhY3Rpb24nICYmIChcbiAgICAgICAgICAgICAgICAgIDxJbnRlcmFjdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLmludGVyYWN0aW9uTWFuYWdlckFjdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWc9e2ludGVyYWN0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHthY3RpdmVTaWRlUGFuZWwgPT09ICdtYXAnICYmIChcbiAgICAgICAgICAgICAgICAgIDxNYXBNYW5hZ2VyXG4gICAgICAgICAgICAgICAgICAgIHsuLi5tYXBNYW5hZ2VyQWN0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgbWFwU3R5bGU9e3RoaXMucHJvcHMubWFwU3R5bGV9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2FjdGl2ZVNpZGVQYW5lbCA9PT0gJ3dpZGdldCcgJiYgKFxuICAgICAgICAgICAgICAgICAgPFdpZGdldE1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLldpZGdldE1hbmFnZXJBY3Rpb25zfVxuICAgICAgICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldHM9e3dpZGdldHN9XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldENsYXNzZXM9e3dpZGdldENsYXNzZXN9XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldE9yZGVyPXt3aWRnZXRPcmRlcn1cbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzPXtsYXllcnN9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICAgICAgICAgIG9wZW5Nb2RhbD17dWlTdGF0ZUFjdGlvbnMudG9nZ2xlTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgIG1hcFN0YXRlPXttYXBTdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgYXV0aD17YXV0aH1cbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdD17cHJvamVjdH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L1NpZGVQYW5lbENvbnRlbnQ+XG4gICAgICAgICAgPC9TaWRlYmFyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuIl19