UNPKG

kepler.gl.geoiq

Version:

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

455 lines (386 loc) 55.7 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"] = exports.WidgetAggregationSelectors = exports.LayerColorSelector = exports.HowToButton = exports.ColorRangeConfig = exports.ChannelByValueSelector = exports.ArcLayerColorSelector = exports.AggregationTypeSelector = exports.AggrColorScaleSelector = void 0; 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 _styledComponents2 = require("../../common/styled-components"); var _itemSelector = _interopRequireDefault(require("../../common/item-selector/item-selector")); var _visConfigByFieldSelector = _interopRequireDefault(require("./vis-config-by-field-selector")); var _layerTypeSelector = _interopRequireDefault(require("./layer-type-selector")); var _dimensionScaleSelector = _interopRequireDefault(require("./dimension-scale-selector")); var _colorSelector = _interopRequireDefault(require("./color-selector")); var _sourceDataSelector = _interopRequireDefault(require("../source-data-selector")); var _layerConfigGroup = _interopRequireWildcard(require("./layer-config-group")); var _widgetLayerSelector = _interopRequireDefault(require("./widget-layer-selector")); var _widgetAggregationSelector = _interopRequireDefault(require("./widget-aggregation-selector")); var _widgetFieldSelector = _interopRequireDefault(require("./widget-field-selector")); var _widgetConfigGroup = _interopRequireDefault(require("./widget-config-group")); var _utils = require("../../../utils/utils"); var _defaultSettings = require("../../../constants/default-settings"); var _templateObject, _templateObject2, _templateObject3; 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 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; } 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; } } // import files from '../../../../dist/components/common/icons/files'; // import layerPanel from '../../../../dist/components/side-panel/layer-panel/layer-panel'; var StyledLayerConfigurator = _styledComponents["default"].div.attrs({ className: 'layer-panel__config' })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin-top: 12px;\n"]))); var StyledWidgetVisualConfigurator = _styledComponents["default"].div.attrs({ className: 'layer-panel__config__visualC-config' })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 12px;\n"]))); var WidgetConfigurator = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(WidgetConfigurator, _Component); var _super = _createSuper(WidgetConfigurator); function WidgetConfigurator() { var _this; (0, _classCallCheck2["default"])(this, WidgetConfigurator); 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)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_findLayerIdx", function (layers, id) { // console.log('inside_findLayerIdx', layers, id); layers.map(function (key, lidget) { if (lidget.id === id) {// console.log(key); } }); }); return _this; } (0, _createClass2["default"])(WidgetConfigurator, [{ key: "_renderFunctionWidgetConfig", value: function _renderFunctionWidgetConfig(props) { return this._renderAggregationWidgetConfig(props); } }, { key: "_renderAggregationWidgetConfig", value: function _renderAggregationWidgetConfig(_ref) { var layers = _ref.layers, widget = _ref.widget, datasets = _ref.datasets, dataId = _ref.dataId, widgetConfiguratorProps = _ref.widgetConfiguratorProps; var _ref2 = widget.config.dataId ? datasets[widget.config.dataId] : {}, fields = _ref2.fields; fields.filter(function (field) { return field.type !== 'geojson'; }); return (/*#__PURE__*/_react["default"].createElement(StyledWidgetVisualConfigurator, null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], { label: 'Aggregation' }, /*#__PURE__*/_react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({ widget: widget }, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], { fields: fields, widget: widget, placeholder: 'empty', onChange: this.props.updateLayerConfig }) : null), /*#__PURE__*/_react["default"].createElement(_widgetConfigGroup["default"], (0, _extends2["default"])({ label: 'Dynamic', property: 'bounds', description: 'Calculation on the basis of bounds of map on screen' }, widgetConfiguratorProps))) ); } }, { key: "_renderCategoryWidgetConfig", value: function _renderCategoryWidgetConfig(props) { return this._renderCategoryConfig(props); } }, { key: "_renderCategoryConfig", value: function _renderCategoryConfig(_ref3) { var layers = _ref3.layers, widget = _ref3.widget, datasets = _ref3.datasets, dataId = _ref3.dataId, widgetConfiguratorProps = _ref3.widgetConfiguratorProps; var _ref4 = widget.config.dataId ? datasets[widget.config.dataId] : [], fields = _ref4.fields; fields.filter(function (field) { return field.type !== 'geojson'; }); return (/*#__PURE__*/_react["default"].createElement(StyledWidgetVisualConfigurator, null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], { label: 'Categorize by' }, /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], { fields: fields, widget: widget, placeholder: 'empty', type: 'category', onChange: this.props.updateLayerConfig })), /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], { label: 'Aggregation' }, /*#__PURE__*/_react["default"].createElement(_widgetAggregationSelector["default"], (0, _extends2["default"])({ widget: widget }, widgetConfiguratorProps)), widget.config.aggregationType ? widget.config.aggregationType === 'count' ? null : /*#__PURE__*/_react["default"].createElement(_widgetFieldSelector["default"], { fields: fields, widget: widget, placeholder: 'empty', onChange: this.props.updateLayerConfig }) : null), /*#__PURE__*/_react["default"].createElement(_widgetConfigGroup["default"], (0, _extends2["default"])({ label: 'Dynamic', property: 'bounds', description: 'Calculation on the basis of bounds of map on screen' }, widgetConfiguratorProps))) ); } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, widget = _this$props.widget, layers = _this$props.layers, datasets = _this$props.datasets, updateLayerConfig = _this$props.updateLayerConfig, widgetTypeOptions = _this$props.widgetTypeOptions, updateLayerType = _this$props.updateLayerType; var _ref5 = widget.config.dataId ? datasets[widget.config.dataId] : {}, _ref5$fields = _ref5.fields, fields = _ref5$fields === void 0 ? [] : _ref5$fields; var config = widget.config; var dataId = config.dataId; var commonConfigProp = { widget: widget, fields: fields }; var visConfiguratorProps = _objectSpread(_objectSpread({}, commonConfigProp), {}, { onChange: this.props.updateLayerVisConfig }); var widgetConfiguratorProps = _objectSpread(_objectSpread({}, commonConfigProp), {}, { onChange: updateLayerConfig }); var layerChannelConfigProps = _objectSpread(_objectSpread({}, commonConfigProp), {}, { onChange: this.props.updateLayerVisualChannelConfig }); var renderTemplate = widget.type && "_render".concat((0, _utils.capitalizeFirstLetter)(widget.type), "WidgetConfig"); // console.log('layer inside widget-configurator', layer); return (/*#__PURE__*/_react["default"].createElement(StyledLayerConfigurator, null, widget.layerInfoModal ? /*#__PURE__*/_react["default"].createElement(HowToButton, { onClick: function onClick() { return _this2.props.openModal(widget.layerInfoModal); } }) : null, /*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], { label: 'basic', collapsible: true, expanded: Object.keys(datasets).length > 1 && widget.type }, /*#__PURE__*/_react["default"].createElement(_layerTypeSelector["default"], { layer: widget, widgetTypeOptions: widgetTypeOptions, onSelect: updateLayerType }), /*#__PURE__*/_react["default"].createElement(_layerConfigGroup.ConfigGroupCollapsibleContent, null, Object.keys(datasets).length > 1 && /*#__PURE__*/_react["default"].createElement(_sourceDataSelector["default"], { datasets: datasets, id: widget.id, disabled: widget.tyep && config.selectedField, dataId: config.dataId, onSelect: function onSelect(value) { return updateLayerConfig({ dataId: value, aggregationType: null, selectedLayer: null, aggregatedData: null }); } }))), this[renderTemplate] && this[renderTemplate]({ widget: widget, layers: layers, datasets: datasets, dataId: dataId, visConfiguratorProps: visConfiguratorProps, layerChannelConfigProps: layerChannelConfigProps, widgetConfiguratorProps: widgetConfiguratorProps })) ); } }]); return WidgetConfigurator; }(_react.Component); /* * Componentize config component into pure functional components */ (0, _defineProperty2["default"])(WidgetConfigurator, "propTypes", { widget: _propTypes["default"].object.isRequired, datasets: _propTypes["default"].object.isRequired, widgetTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, openModal: _propTypes["default"].func.isRequired, updateLayerConfig: _propTypes["default"].func.isRequired, updateLayerType: _propTypes["default"].func.isRequired, updateLayerVisConfig: _propTypes["default"].func.isRequired, updateLayerVisualChannelConfig: _propTypes["default"].func.isRequired }); var StyledHowToButton = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n right: 12px;\n top: -4px;\n"]))); var HowToButton = exports.HowToButton = function HowToButton(_ref6) { var onClick = _ref6.onClick; return (/*#__PURE__*/_react["default"].createElement(StyledHowToButton, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { link: true, small: true, onClick: onClick }, "How to")) ); }; var LayerColorSelector = exports.LayerColorSelector = function LayerColorSelector(_ref7) { var layer = _ref7.layer, onChange = _ref7.onChange; return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, { disabled: layer.config.colorField }, /*#__PURE__*/_react["default"].createElement(_colorSelector["default"], { colorSets: [{ selectedColor: layer.config.color, setColor: function setColor(rgbValue) { return onChange({ color: rgbValue }); } }] })) ); }; var ArcLayerColorSelector = exports.ArcLayerColorSelector = function ArcLayerColorSelector(_ref8) { var layer = _ref8.layer, onChangeConfig = _ref8.onChangeConfig, onChangeVisConfig = _ref8.onChangeVisConfig; return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_colorSelector["default"], { colorSets: [{ selectedColor: layer.config.color, setColor: function setColor(rgbValue) { return onChangeConfig({ color: rgbValue }); }, label: 'Source' }, { selectedColor: layer.config.visConfig.targetColor || layer.config.color, setColor: function setColor(rgbValue) { return onChangeVisConfig({ targetColor: rgbValue }); }, label: 'Target' }] })) ); }; var ColorRangeConfig = exports.ColorRangeConfig = function ColorRangeConfig(_ref9) { var layer = _ref9.layer, onChange = _ref9.onChange; return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_colorSelector["default"], { colorSets: [{ selectedColor: layer.config.visConfig.colorRange, isRange: true, setColor: function setColor(colorRange) { return onChange({ colorRange: colorRange }); } }] })) ); }; var ChannelByValueSelector = exports.ChannelByValueSelector = function ChannelByValueSelector(_ref10) { var widget = _ref10.widget, channel = _ref10.channel, onChange = _ref10.onChange, fields = _ref10.fields, description = _ref10.description; var channelScaleType = channel.channelScaleType, domain = channel.domain, field = channel.field, key = channel.key, property = channel.property, range = channel.range, scale = channel.scale, defaultMeasure = channel.defaultMeasure, supportedFieldTypes = channel.supportedFieldTypes; var channelSupportedFieldTypes = supportedFieldTypes || _defaultSettings.CHANNEL_SCALE_SUPPORTED_FIELDS[channelScaleType]; var supportedFields = fields.filter(function (_ref11) { var type = _ref11.type; return channelSupportedFieldTypes.includes(type); }); var scaleOptions = widget.getScaleOptions(channel.key); var showScale = !widget.isAggregated && widget.config[scale] && scaleOptions.length > 1; var defaultDescription = "Calculate ".concat(property, " based on selected field"); return (/*#__PURE__*/_react["default"].createElement(_visConfigByFieldSelector["default"], { channel: channel.key, description: description || defaultDescription, domain: widget.config[domain], fields: supportedFields, id: widget.id, key: "".concat(key, "-channel-selector"), property: property, placeholder: defaultMeasure || 'Select a field', range: widget.config.visConfig[range], scaleOptions: scaleOptions, scaleType: scale ? widget.config[scale] : null, selectedField: widget.config[field], showScale: showScale, updateField: function updateField(val) { return onChange((0, _defineProperty2["default"])({}, field, val), key); }, updateScale: function updateScale(val) { return onChange((0, _defineProperty2["default"])({}, scale, val), key); } }) ); }; var AggrColorScaleSelector = exports.AggrColorScaleSelector = function AggrColorScaleSelector(_ref12) { var layer = _ref12.layer, onChange = _ref12.onChange; var scaleOptions = layer.getScaleOptions('color'); return Array.isArray(scaleOptions) && scaleOptions.length > 1 ? /*#__PURE__*/_react["default"].createElement(_dimensionScaleSelector["default"], { label: "Color Scale", options: scaleOptions, scaleType: layer.config.colorScale, onSelect: function onSelect(val) { return onChange({ colorScale: val }, 'color'); } }) : null; }; var WidgetAggregationSelectors = exports.WidgetAggregationSelectors = function WidgetAggregationSelectors() { return (/*#__PURE__*/_react["default"].createElement(_layerConfigGroup["default"], { label: 'Aggregation', collapsible: true }) ); }; var AggregationTypeSelector = exports.AggregationTypeSelector = function AggregationTypeSelector(_ref13) { var widget = _ref13.widget, channel = _ref13.channel, _onChange3 = _ref13.onChange; var field = channel.field, aggregation = channel.aggregation, key = channel.key; var selectedField = widget.config[field]; var visConfig = widget.config.visConfig; // aggregation should only be selectable when field is selected var aggregationOptions = widget.getAggregationOptions(key); return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.SidePanelSection, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, "Aggregate ".concat(selectedField.name, " by")), /*#__PURE__*/_react["default"].createElement(_itemSelector["default"], { selectedItems: visConfig[aggregation], options: aggregationOptions, multiSelect: false, searchable: false, onChange: function onChange(value) { return _onChange3({ visConfig: _objectSpread(_objectSpread({}, widget.config.visConfig), {}, (0, _defineProperty2["default"])({}, aggregation, value)) }, channel.key); } })) ); }; /* eslint-enable max-params */ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvd2lkZ2V0LXBhbmVsL3dpZGdldC1jb25maWd1cmF0b3IuanMiXSwibmFtZXMiOlsiU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIlN0eWxlZFdpZGdldFZpc3VhbENvbmZpZ3VyYXRvciIsIldpZGdldENvbmZpZ3VyYXRvciIsImxheWVycyIsImlkIiwibWFwIiwia2V5IiwibGlkZ2V0IiwicHJvcHMiLCJfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWciLCJ3aWRnZXQiLCJkYXRhc2V0cyIsImRhdGFJZCIsIndpZGdldENvbmZpZ3VyYXRvclByb3BzIiwiY29uZmlnIiwiZmllbGRzIiwiZmlsdGVyIiwiZmllbGQiLCJ0eXBlIiwiYWdncmVnYXRpb25UeXBlIiwidXBkYXRlTGF5ZXJDb25maWciLCJfcmVuZGVyQ2F0ZWdvcnlDb25maWciLCJ3aWRnZXRUeXBlT3B0aW9ucyIsInVwZGF0ZUxheWVyVHlwZSIsImNvbW1vbkNvbmZpZ1Byb3AiLCJ2aXNDb25maWd1cmF0b3JQcm9wcyIsIm9uQ2hhbmdlIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJsYXllckNoYW5uZWxDb25maWdQcm9wcyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZyIsInJlbmRlclRlbXBsYXRlIiwibGF5ZXJJbmZvTW9kYWwiLCJvcGVuTW9kYWwiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwidHllcCIsInNlbGVjdGVkRmllbGQiLCJ2YWx1ZSIsInNlbGVjdGVkTGF5ZXIiLCJhZ2dyZWdhdGVkRGF0YSIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheU9mIiwiYW55IiwiZnVuYyIsIlN0eWxlZEhvd1RvQnV0dG9uIiwiSG93VG9CdXR0b24iLCJvbkNsaWNrIiwiTGF5ZXJDb2xvclNlbGVjdG9yIiwibGF5ZXIiLCJjb2xvckZpZWxkIiwic2VsZWN0ZWRDb2xvciIsImNvbG9yIiwic2V0Q29sb3IiLCJyZ2JWYWx1ZSIsIkFyY0xheWVyQ29sb3JTZWxlY3RvciIsIm9uQ2hhbmdlQ29uZmlnIiwib25DaGFuZ2VWaXNDb25maWciLCJsYWJlbCIsInZpc0NvbmZpZyIsInRhcmdldENvbG9yIiwiQ29sb3JSYW5nZUNvbmZpZyIsImNvbG9yUmFuZ2UiLCJpc1JhbmdlIiwiQ2hhbm5lbEJ5VmFsdWVTZWxlY3RvciIsImNoYW5uZWwiLCJkZXNjcmlwdGlvbiIsImNoYW5uZWxTY2FsZVR5cGUiLCJkb21haW4iLCJwcm9wZXJ0eSIsInJhbmdlIiwic2NhbGUiLCJkZWZhdWx0TWVhc3VyZSIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJjaGFubmVsU3VwcG9ydGVkRmllbGRUeXBlcyIsIkNIQU5ORUxfU0NBTEVfU1VQUE9SVEVEX0ZJRUxEUyIsInN1cHBvcnRlZEZpZWxkcyIsImluY2x1ZGVzIiwic2NhbGVPcHRpb25zIiwiZ2V0U2NhbGVPcHRpb25zIiwic2hvd1NjYWxlIiwiaXNBZ2dyZWdhdGVkIiwiZGVmYXVsdERlc2NyaXB0aW9uIiwidmFsIiwiQWdnckNvbG9yU2NhbGVTZWxlY3RvciIsIkFycmF5IiwiaXNBcnJheSIsImNvbG9yU2NhbGUiLCJXaWRnZXRBZ2dyZWdhdGlvblNlbGVjdG9ycyIsIkFnZ3JlZ2F0aW9uVHlwZVNlbGVjdG9yIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbk9wdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbk9wdGlvbnMiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFLQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFFQSxJQUFNQSx1QkFBdUIsR0FBR0MsNkJB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QVAsQ0FBY2dELFNBRFYsNENBRU4rQixXQUZNLEVBRVF2RCxLQUZSO0FBRFgsU0FETSxFQU9OOEIsT0FBTyxDQUFDOUQsR0FQRixDQURLO0FBQUE7QUFMakIsTUFGRjtBQURGO0FBc0JELENBOUJNO0FBK0JQIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUGFuZWxMYWJlbCxcbiAgU2lkZVBhbmVsU2VjdGlvblxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSXRlbVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2l0ZW0tc2VsZWN0b3IvaXRlbS1zZWxlY3Rvcic7XG5cbmltcG9ydCBWaXNDb25maWdCeUZpZWxkU2VsZWN0b3IgZnJvbSAnLi92aXMtY29uZmlnLWJ5LWZpZWxkLXNlbGVjdG9yJztcbmltcG9ydCBMYXllclR5cGVTZWxlY3RvciBmcm9tICcuL2xheWVyLXR5cGUtc2VsZWN0b3InO1xuaW1wb3J0IERpbWVuc2lvblNjYWxlU2VsZWN0b3IgZnJvbSAnLi9kaW1lbnNpb24tc2NhbGUtc2VsZWN0b3InO1xuaW1wb3J0IENvbG9yU2VsZWN0b3IgZnJvbSAnLi9jb2xvci1zZWxlY3Rvcic7XG5pbXBvcnQgU291cmNlRGF0YVNlbGVjdG9yIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9zb3VyY2UtZGF0YS1zZWxlY3Rvcic7XG5pbXBvcnQgTGF5ZXJDb25maWdHcm91cCwge1xuICBDb25maWdHcm91cENvbGxhcHNpYmxlQ29udGVudFxufSBmcm9tICcuL2xheWVyLWNvbmZpZy1ncm91cCc7XG5pbXBvcnQgV2lkZ2V0TGF5ZXJTZWxlY3RvciBmcm9tICcuL3dpZGdldC1sYXllci1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvciBmcm9tICcuL3dpZGdldC1hZ2dyZWdhdGlvbi1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0RmllbGRTZWxlY3RvciBmcm9tICcuL3dpZGdldC1maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQgV2lkZ2V0Q29uZmlnR3JvdXAgZnJvbSAnLi93aWRnZXQtY29uZmlnLWdyb3VwJztcblxuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtDSEFOTkVMX1NDQUxFX1NVUFBPUlRFRF9GSUVMRFN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbi8vIGltcG9ydCBmaWxlcyBmcm9tICcuLi8uLi8uLi8uLi9kaXN0L2NvbXBvbmVudHMvY29tbW9uL2ljb25zL2ZpbGVzJztcbi8vIGltcG9ydCBsYXllclBhbmVsIGZyb20gJy4uLy4uLy4uLy4uL2Rpc3QvY29tcG9uZW50cy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsJztcblxuY29uc3QgU3R5bGVkTGF5ZXJDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZydcbn0pYFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDEycHg7XG5gO1xuXG5jb25zdCBTdHlsZWRXaWRnZXRWaXN1YWxDb25maWd1cmF0b3IgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnbGF5ZXItcGFuZWxfX2NvbmZpZ19fdmlzdWFsQy1jb25maWcnXG59KWBcbiAgbWFyZ2luLXRvcDogMTJweDtcbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpZGdldENvbmZpZ3VyYXRvciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgd2lkZ2V0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICB3aWRnZXRUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJDb25maWc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJUeXBlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzQ29uZmlnOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIF9yZW5kZXJGdW5jdGlvbldpZGdldENvbmZpZyhwcm9wcykge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJBZ2dyZWdhdGlvbldpZGdldENvbmZpZyhwcm9wcyk7XG4gIH1cblxuICBfcmVuZGVyQWdncmVnYXRpb25XaWRnZXRDb25maWcoe1xuICAgIGxheWVycyxcbiAgICB3aWRnZXQsXG4gICAgZGF0YXNldHMsXG4gICAgZGF0YUlkLFxuICAgIHdpZGdldENvbmZpZ3VyYXRvclByb3BzXG4gIH0pIHtcbiAgICBjb25zdCB7ZmllbGRzfSA9IHdpZGdldC5jb25maWcuZGF0YUlkID8gZGF0YXNldHNbd2lkZ2V0LmNvbmZpZy5kYXRhSWRdIDoge307XG4gICAgZmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC50eXBlICE9PSAnZ2VvanNvbicpO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICAgICB7LyogPExheWVyQ29uZmlnR3JvdXAgbGFiZWw9eydsYXllcid9PlxuICAgICAgICAgIDxXaWRnZXRMYXllclNlbGVjdG9yXG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgZGF0YUlkPXtkYXRhSWR9XG4gICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy51cGRhdGVMYXllckNvbmZpZyh7c2VsZWN0ZWRMYXllcjogdmFsdWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD4gKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnQWdncmVnYXRpb24nfT5cbiAgICAgICAgICA8V2lkZ2V0QWdncmVnYXRpb25TZWxlY3RvclxuICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICB7Li4ud2lkZ2V0Q29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7d2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPyAoXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IG51bGwgOiAoXG4gICAgICAgICAgICAgIDxXaWRnZXRGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgICAgICAgZmllbGRzPXtmaWVsZHN9XG4gICAgICAgICAgICAgICAgd2lkZ2V0PXt3aWRnZXR9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9eydlbXB0eSd9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWd9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAgPFdpZGdldENvbmZpZ0dyb3VwXG4gICAgICAgICAgbGFiZWw9eydEeW5hbWljJ31cbiAgICAgICAgICBwcm9wZXJ0eT17J2JvdW5kcyd9XG4gICAgICAgICAgZGVzY3JpcHRpb249eydDYWxjdWxhdGlvbiBvbiB0aGUgYmFzaXMgb2YgYm91bmRzIG9mIG1hcCBvbiBzY3JlZW4nfVxuICAgICAgICAgIHsuLi53aWRnZXRDb25maWd1cmF0b3JQcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvU3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICk7XG4gIH1cblxuICBfcmVuZGVyQ2F0ZWdvcnlXaWRnZXRDb25maWcocHJvcHMpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyQ2F0ZWdvcnlDb25maWcocHJvcHMpO1xuICB9XG5cbiAgX3JlbmRlckNhdGVnb3J5Q29uZmlnKHtcbiAgICBsYXllcnMsXG4gICAgd2lkZ2V0LFxuICAgIGRhdGFzZXRzLFxuICAgIGRhdGFJZCxcbiAgICB3aWRnZXRDb25maWd1cmF0b3JQcm9wc1xuICB9KSB7XG4gICAgY29uc3Qge2ZpZWxkc30gPSB3aWRnZXQuY29uZmlnLmRhdGFJZCA/IGRhdGFzZXRzW3dpZGdldC5jb25maWcuZGF0YUlkXSA6IFtdO1xuICAgIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudHlwZSAhPT0gJ2dlb2pzb24nKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkV2lkZ2V0VmlzdWFsQ29uZmlndXJhdG9yPlxuICAgICAgICB7LyogPExheWVyQ29uZmlnR3JvdXAgbGFiZWw9eydsYXllcid9PlxuICAgICAgICAgIDxXaWRnZXRMYXllclNlbGVjdG9yXG4gICAgICAgICAgICB3aWRnZXQ9e3dpZGdldH1cbiAgICAgICAgICAgIGxheWVycz17bGF5ZXJzfVxuICAgICAgICAgICAgZGF0YUlkPXtkYXRhSWR9XG4gICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy51cGRhdGVMYXllckNvbmZpZyh7c2VsZWN0ZWRMYXllcjogdmFsdWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD4gKi99XG4gICAgICAgIDxMYXllckNvbmZpZ0dyb3VwIGxhYmVsPXsnQ2F0ZWdvcml6ZSBieSd9PlxuICAgICAgICAgIDxXaWRnZXRGaWVsZFNlbGVjdG9yXG4gICAgICAgICAgICBmaWVsZHM9e2ZpZWxkc31cbiAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9eydlbXB0eSd9XG4gICAgICAgICAgICB0eXBlPXsnY2F0ZWdvcnknfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMucHJvcHMudXBkYXRlTGF5ZXJDb25maWd9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9MYXllckNvbmZpZ0dyb3VwPlxuICAgICAgICA8TGF5ZXJDb25maWdHcm91cCBsYWJlbD17J0FnZ3JlZ2F0aW9uJ30+XG4gICAgICAgICAgPFdpZGdldEFnZ3JlZ2F0aW9uU2VsZWN0b3JcbiAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgey4uLndpZGdldENvbmZpZ3VyYXRvclByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge3dpZGdldC5jb25maWcuYWdncmVnYXRpb25UeXBlID8gKFxuICAgICAgICAgICAgd2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPT09ICdjb3VudCcgPyBudWxsIDogKFxuICAgICAgICAgICAgICA8V2lkZ2V0RmllbGRTZWxlY3RvclxuICAgICAgICAgICAgICAgIGZpZWxkcz17ZmllbGRzfVxuICAgICAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsnZW1wdHknfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLnVwZGF0ZUxheWVyQ29uZmlnfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKVxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0xheWVyQ29uZmlnR3JvdXA+XG4gICAgICAgIDxXaWRnZXRDb25maWdHcm91cFxuICAgICAgICAgIGxhYmVsPXsnRHluYW1pYyd9XG4gICAgICAgICAgcHJvcGVydHk9eydib3VuZHMnfVxuICAgICAgICAgIGRlc2NyaXB0aW9uPXsnQ2FsY3VsYXRpb24gb24gdGhlIGJhc2lzIG9mIGJvdW5kcyBvZiBtYXAgb24gc2NyZWVuJ31cbiAgICAgICAgICB7Li4ud2lkZ2V0Q29uZmlndXJhdG9yUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L1N0eWxlZFdpZGdldFZpc3VhbENvbmZpZ3VyYXRvcj5cbiAgICApO1xuICB9XG5cbiAgX2ZpbmRMYXllcklkeCA9IChsYXllcnMsIGlkKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ2luc2lkZV9maW5kTGF5ZXJJZHgnLCBsYXllcnMsIGlkKTtcbiAgICBsYXllcnMubWFwKChrZXksIGxpZGdldCkgPT4ge1xuICAgICAgaWYgKGxpZGdldC5pZCA9PT0gaWQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgd2lkZ2V0LFxuICAgICAgbGF5ZXJzLFxuICAgICAgZGF0YXNldHMsXG4gICAgICB1cGRhdGVMYXllckNvbmZpZyxcbiAgICAgIHdpZGdldFR5cGVPcHRpb25zLFxuICAgICAgdXBkYXRlTGF5ZXJUeXBlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge2ZpZWxkcyA9IFtdfSA9IHdpZGdldC5jb25maWcuZGF0YUlkXG4gICAgICA/IGRhdGFzZXRzW3dpZGdldC5jb25maWcuZGF0YUlkXVxuICAgICAgOiB7fTtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHdpZGdldDtcblxuICAgIGNvbnN0IGRhdGFJZCA9IGNvbmZpZy5kYXRhSWQ7XG5cbiAgICBjb25zdCBjb21tb25Db25maWdQcm9wID0ge1xuICAgICAgd2lkZ2V0LFxuICAgICAgZmllbGRzXG4gICAgfTtcblxuICAgIGNvbnN0IHZpc0NvbmZpZ3VyYXRvclByb3BzID0ge1xuICAgICAgLi4uY29tbW9uQ29uZmlnUHJvcCxcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLnByb3BzLnVwZGF0ZUxheWVyVmlzQ29uZmlnXG4gICAgfTtcblxuICAgIGNvbnN0IHdpZGdldENvbmZpZ3VyYXRvclByb3BzID0ge1xuICAgICAgLi4uY29tbW9uQ29uZmlnUHJvcCxcbiAgICAgIG9uQ2hhbmdlOiB1cGRhdGVMYXllckNvbmZpZ1xuICAgIH07XG5cbiAgICBjb25zdCBsYXllckNoYW5uZWxDb25maWdQcm9wcyA9IHtcbiAgICAgIC4uLmNvbW1vbkNvbmZpZ1Byb3AsXG4gICAgICBvbkNoYW5nZTogdGhpcy5wcm9wcy51cGRhdGVMYXllclZpc3VhbENoYW5uZWxDb25maWdcbiAgICB9O1xuXG4gICAgY29uc3QgcmVuZGVyVGVtcGxhdGUgPVxuICAgICAgd2lkZ2V0LnR5cGUgJiYgYF9yZW5kZXIke2NhcGl0YWxpemVGaXJzdExldHRlcih3aWRnZXQudHlwZSl9V2lkZ2V0Q29uZmlnYDtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdsYXllciBpbnNpZGUgd2lkZ2V0LWNvbmZpZ3VyYXRvcicsIGxheWVyKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZExheWVyQ29uZmlndXJhdG9yPlxuICAgICAgICB7d2lkZ2V0LmxheWVySW5mb01vZGFsID8gKFxuICAgICAgICAgIDxIb3dUb0J1dHRvblxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5wcm9wcy5vcGVuTW9kYWwod2lkZ2V0LmxheWVySW5mb01vZGFsKX1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPExheWVyQ29uZmlnR3JvdXBcbiAgICAgICAgICBsYWJlbD17J2Jhc2ljJ31cbiAgICAgICAgICBjb2xsYXBzaWJsZVxuICAgICAgICAgIGV4cGFuZGVkPXtPYmplY3Qua2V5cyhkYXRhc2V0cykubGVuZ3RoID4gMSAmJiB3aWRnZXQudHlwZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXllclR5cGVTZWxlY3RvclxuICAgICAgICAgICAgbGF5ZXI9e3dpZGdldH1cbiAgICAgICAgICAgIHdpZGdldFR5cGVPcHRpb25zPXt3aWRnZXRUeXBlT3B0aW9uc31cbiAgICAgICAgICAgIG9uU2VsZWN0PXt1cGRhdGVMYXllclR5cGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Q29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgICB7T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICAgICAgICA8U291cmNlRGF0YVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgIGlkPXt3aWRnZXQuaWR9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3dpZGdldC50eWVwICYmIGNvbmZpZy5zZWxlY3RlZEZpZWxkfVxuICAgICAgICAgICAgICAgIGRhdGFJZD17Y29uZmlnLmRhdGFJZH1cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT5cbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUlkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRpb25UeXBlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExheWVyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkRGF0YTogbnVsbFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ29uZmlnR3JvdXBDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgIDwvTGF5ZXJDb25maWdHcm91cD5cbiAgICAgICAge3RoaXNbcmVuZGVyVGVtcGxhdGVdICYmXG4gICAgICAgICAgdGhpc1tyZW5kZXJUZW1wbGF0ZV0oe1xuICAgICAgICAgICAgd2lkZ2V0LFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgICBkYXRhSWQsXG4gICAgICAgICAgICB2aXNDb25maWd1cmF0b3JQcm9wcyxcbiAgICAgICAgICAgIGxheWVyQ2hhbm5lbENvbmZpZ1Byb3BzLFxuICAgICAgICAgICAgd2lkZ2V0Q29uZmlndXJhdG9yUHJvcHNcbiAgICAgICAgICB9KX1cbiAgICAgIDwvU3R5bGVkTGF5ZXJDb25maWd1cmF0b3I+XG4gICAgKTtcbiAgfVxufVxuXG4vKlxuICogQ29tcG9uZW50aXplIGNvbmZpZyBjb21wb25lbnQgaW50byBwdXJlIGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICovXG5cbmNvbnN0IFN0eWxlZEhvd1RvQnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMTJweDtcbiAgdG9wOiAtNHB4O1xuYDtcblxuZXhwb3J0IGNvbnN0IEhvd1RvQnV0dG9uID0gKHtvbkNsaWNrfSkgPT4gKFxuICA8U3R5bGVkSG93VG9CdXR0b24+XG4gICAgPEJ1dHRvbiBsaW5rIHNtYWxsIG9uQ2xpY2s9e29uQ2xpY2t