UNPKG

kepler.gl.geoiq

Version:

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

393 lines (336 loc) 49.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof3 = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 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 _styledComponents = _interopRequireDefault(require("styled-components")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactAnythingSortable = require("react-anything-sortable"); var _lodash = _interopRequireDefault(require("lodash")); var _widgetConfigurator = _interopRequireDefault(require("./widget-configurator")); var _widgetPanelHeader = _interopRequireDefault(require("./widget-panel-header")); var _loadingSpinner = _interopRequireDefault(require("../../common/loading-spinner")); var _sliderBarHandle = _interopRequireDefault(require("../../common/slider/slider-bar-handle")); var _templateObject, _templateObject2, _templateObject3, _templateObject4; 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 || _typeof3(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 layers from '../../../../dist/components/common/icons/layers'; var PanelWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n border-radius: 1px;\n margin-bottom: 8px;\n\n &.dragging {\n cursor: move;\n }\n"]))); var StyledWidgetContent = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px;\n"])), function (props) { return props.theme.panelBackground; }); var StyledWidgetContentHeader = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n color: #6a7485;\n text-align: center;\n font-size: 14px;\n"])), function (props) { return props.theme.panelBackground; }); var StyledWidgetContentValue = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n text-align: center;\n font-size: 30px;\n"])), function (props) { return props.theme.panelBackground; }); function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase(); } function WidgetPanelFactory() { var _class, _class2, _temp; var WidgetPanel = (0, _reactAnythingSortable.sortable)(_class = (_temp = _class2 = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(WidgetPanel, _Component); var _super = _createSuper(WidgetPanel); function WidgetPanel() { var _this; (0, _classCallCheck2["default"])(this, WidgetPanel); 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), "state", { aggregatedData: null }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inDebounce", 0); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateState", function (func) { _this.setState({ aggregatedData: func }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetConfig", function (newProp) { var _this$props = _this.props, auth = _this$props.auth, widget = _this$props.widget, project = _this$props.project, mapState = _this$props.mapState, datasets = _this$props.datasets, filters = _this$props.filters, widgetConfigChange = _this$props.widgetConfigChange; var props = Object.keys(newProp); if (widget.shouldCalculateAggregatedData(props)) { // this.calculateWidgetAggregationData( // widget, // filters, // datasets, // mapState, // auth, // project, // widgetConfigChange // ); widgetConfigChange(widget, { apiCallRequest: true }); } newProp = _objectSpread(_objectSpread({}, newProp), {}, { mapState: mapState }); _this.props.widgetConfigChange(widget, newProp, auth, project); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetType", function (newType) { _this.props.widgetTypeChange(_this.props.widget, newType); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetVisConfig", function (newVisConfig) { _this.props.widgetVisConfigChange(_this.props.widget, newVisConfig); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateWidgetVisualChannelConfig", function (newConfig, channel, scaleKey) { _this.props.widgetVisualChannelConfigChange(_this.props.widget, newConfig, channel, scaleKey); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateWidgetLabel", function (_ref) { var value = _ref.target.value; _this.updateWidgetConfig({ label: value }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleVisibility", function (e) { e.stopPropagation(); var isVisible = !_this.props.widget.config.isVisible; _this.updateWidgetConfig({ isVisible: isVisible }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleEnableConfig", function (e) { e.stopPropagation(); var isConfigActive = _this.props.widget.config.isConfigActive; _this.updateWidgetConfig({ isConfigActive: !isConfigActive }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeWidget", function (e) { e.stopPropagation(); _this.props.removeWidget(_this.props.idx); }); return _this; } (0, _createClass2["default"])(WidgetPanel, [{ key: "componentDidMount", value: function componentDidMount() { var _this$props2 = this.props, auth = _this$props2.auth, project = _this$props2.project, mapState = _this$props2.mapState, datasets = _this$props2.datasets, filters = _this$props2.filters, widget = _this$props2.widget, widgetConfigChange = _this$props2.widgetConfigChange; var result = widget.calculateAggregationData(widget, filters, datasets, mapState, auth, project); if (result) { result.then(function (result) { // widget.updateWidgetConfig({ // aggregatedData: result // }); widgetConfigChange(widget, { aggregatedData: result }); }); } } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var _this2 = this; var auth = nextProps.auth, project = nextProps.project, widget = nextProps.widget, filters = nextProps.filters, datasets = nextProps.datasets, mapState = nextProps.mapState, widgetConfigChange = nextProps.widgetConfigChange; if (widget.config.apiCallRequest) { widgetConfigChange(widget, { apiCallRequest: false }); this.calculateWidgetAggregationData(widget, filters, datasets, mapState, auth, project, widgetConfigChange); } if (!_lodash["default"].isEqual(this.props.mapState, nextProps.mapState) && // nextProps.layers && nextProps.widget.config.bounds) { nextProps.widgetConfigChange(nextProps.widget, { isCalculating: true }, auth, project); clearTimeout(this.inDebounce); this.inDebounce = setTimeout(function () { var result = widget.calculateAggregationData(widget, filters, datasets, mapState, auth, project); result.then(function (result) { widgetConfigChange(widget, { aggregatedData: result, isCalculating: false }); }); // nextProps.widgetConfigChange( // nextProps.widget, // { // mapState: nextProps.mapState // }, // auth, // project // ); clearTimeout(_this2.inDebounce); _this2.inDebounce = 0; }, 300); } } }, { key: "calculateWidgetAggregationData", value: function calculateWidgetAggregationData(widget, filters, datasets, mapState, auth, project, widgetConfigChange) { var result = widget.calculateAggregationData(widget, filters, datasets, mapState, auth, project); if (result) { result.then(function (result) { widgetConfigChange(widget, { aggregatedData: result, apiCallRequest: false }); }); } } }, { key: "_renderLayerName", value: function _renderLayerName(id) { var placeholder = this.props.layers.map(function (l) { if (l.id === id) { return l.config.label; } }); return placeholder; } }, { key: "render", value: function render() { var _this$props3 = this.props, widget = _this$props3.widget, layers = _this$props3.layers, idx = _this$props3.idx, datasets = _this$props3.datasets, widgetTypeOptions = _this$props3.widgetTypeOptions; var config = widget.config; var isConfigActive = config.isConfigActive; return (/*#__PURE__*/_react["default"].createElement(PanelWrapper, { active: isConfigActive, className: "layer-panel ".concat(this.props.className), style: this.props.style, onMouseDown: this.props.onMouseDown, onTouchStart: this.props.onTouchStart }, /*#__PURE__*/_react["default"].createElement(_widgetPanelHeader["default"], { isConfigActive: isConfigActive, id: widget.id, idx: idx, isVisible: config.isVisible, label: config.label, labelRCGColorValues: datasets[config.dataId].color, widgetType: widget.name, onToggleEnableConfig: this._toggleEnableConfig, onToggleVisibility: this._toggleVisibility, onUpdateWidgetLabel: this._updateWidgetLabel, onRemoveWidget: this._removeWidget }), isConfigActive && /*#__PURE__*/_react["default"].createElement(_widgetConfigurator["default"], { widget: widget, layers: layers, datasets: datasets, widgetTypeOptions: widgetTypeOptions, openModal: this.props.openModal, updateLayerConfig: this.updateWidgetConfig, updateLayerVisualChannelConfig: this.updateWidgetVisualChannelConfig, updateLayerType: this.updateWidgetType, updateLayerVisConfig: this.updateWidgetVisConfig }), widget.type === 'Function' && config.isVisible && config.aggregatedData && config.aggregationType && (0, _typeof2["default"])(config.aggregatedData) !== 'object' || config.aggregatedData === 0 ? /*#__PURE__*/_react["default"].createElement(StyledWidgetContent, null, /*#__PURE__*/_react["default"].createElement(StyledWidgetContentHeader, null, capitalizeFirstLetter(config.aggregationType), " :", ' ', config.fieldName), /*#__PURE__*/_react["default"].createElement(StyledWidgetContentValue, null, config.isCalculating ? /*#__PURE__*/_react["default"].createElement("div", { style: { display: 'inline-block', marginTop: '5px' } }, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], null)) : /*#__PURE__*/_react["default"].createElement("div", { style: { color: '#6a7485' } }, config.aggregatedData))) : null, widget.type === 'Category' && config.isVisible && config.aggregatedData && config.aggregatedData.length && config.aggregationType ? /*#__PURE__*/_react["default"].createElement(StyledWidgetContent, null, config.aggregatedData.map(function (ad) { return (/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledWidgetContentHeader, { style: { textAlign: 'inherit' } }, /*#__PURE__*/_react["default"].createElement("div", { style: { display: 'flex', color: '#6a7485' } }, ad.y, ' ', /*#__PURE__*/_react["default"].createElement("div", { style: { marginLeft: 'auto' } }, ad.x))), /*#__PURE__*/_react["default"].createElement(_sliderBarHandle["default"], { type: 'category', width: ad.x / config.aggregatedData[0].x * 100, sliderBarListener: null }), /*#__PURE__*/_react["default"].createElement(StyledWidgetContentValue, null)) ); })) : null) ); } }]); return WidgetPanel; }(_react.Component), (0, _defineProperty2["default"])(_class2, "propTypes", { widget: _propTypes["default"].object.isRequired, datasets: _propTypes["default"].object.isRequired, idx: _propTypes["default"].number.isRequired, widgetConfigChange: _propTypes["default"].func.isRequired, widgetTypeChange: _propTypes["default"].func.isRequired, // layers: propTypes.arrayOf(propTypes.any), openModal: _propTypes["default"].func.isRequired, removeWidget: _propTypes["default"].func.isRequired, onCloseConfig: _propTypes["default"].func, widgetTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any), widgetVisConfigChange: _propTypes["default"].func, widgetVisualChannelConfigChange: _propTypes["default"].func, mapState: _propTypes["default"].object.isRequired, auth: _propTypes["default"].object.isRequired, project: _propTypes["default"].object.isRequired }), _temp)) || _class; return WidgetPanel; } var _default = exports["default"] = WidgetPanelFactory; { /* <StyledWidgetContent> {config.aggregatedData.map(ad => { return ( <React.Fragment> <StyledWidgetContentHeader style={{textAlign: 'inherit'}}> {ad[0]}-{ad[1]} </StyledWidgetContentHeader> <StyledWidgetContentValue /> </React.Fragment> ); })} </StyledWidgetContent> */ } { /* <WidgetBarChart data={config.aggregatedData} height={96.9} width={191.6} margin={0} /> */ } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvd2lkZ2V0LXBhbmVsL3dpZGdldC1wYW5lbC5qcyJdLCJuYW1lcyI6WyJQYW5lbFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJTdHlsZWRXaWRnZXRDb250ZW50IiwicHJvcHMiLCJ0aGVtZSIsInBhbmVsQmFja2dyb3VuZCIsIlN0eWxlZFdpZGdldENvbnRlbnRIZWFkZXIiLCJTdHlsZWRXaWRnZXRDb250ZW50VmFsdWUiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJzdHJpbmciLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJXaWRnZXRQYW5lbEZhY3RvcnkiLCJXaWRnZXRQYW5lbCIsInNvcnRhYmxlIiwiYWdncmVnYXRlZERhdGEiLCJmdW5jIiwic2V0U3RhdGUiLCJuZXdQcm9wIiwiYXV0aCIsIndpZGdldCIsInByb2plY3QiLCJtYXBTdGF0ZSIsImRhdGFzZXRzIiwiZmlsdGVycyIsIndpZGdldENvbmZpZ0NoYW5nZSIsIk9iamVjdCIsImtleXMiLCJzaG91bGRDYWxjdWxhdGVBZ2dyZWdhdGVkRGF0YSIsImFwaUNhbGxSZXF1ZXN0IiwibmV3VHlwZSIsIndpZGdldFR5cGVDaGFuZ2UiLCJuZXdWaXNDb25maWciLCJ3aWRnZXRWaXNDb25maWdDaGFuZ2UiLCJuZXdDb25maWciLCJjaGFubmVsIiwic2NhbGVLZXkiLCJ3aWRnZXRWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwidmFsdWUiLCJ0YXJnZXQiLCJ1cGRhdGVXaWRnZXRDb25maWciLCJsYWJlbCIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJpc1Zpc2libGUiLCJjb25maWciLCJpc0NvbmZpZ0FjdGl2ZSIsInJlbW92ZVdpZGdldCIsImlkeCIsInJlc3VsdCIsImNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YSIsInRoZW4iLCJuZXh0UHJvcHMiLCJjYWxjdWxhdGVXaWRnZXRBZ2dyZWdhdGlvbkRhdGEiLCJfIiwiaXNFcXVhbCIsImJvdW5kcyIsImlzQ2FsY3VsYXRpbmciLCJjbGVhclRpbWVvdXQiLCJpbkRlYm91bmNlIiwic2V0VGltZW91dCIsImlkIiwicGxhY2Vob2xkZXIiLCJsYXllcnMiLCJtYXAiLCJsIiwid2lkZ2V0VHlwZU9wdGlvbnMiLCJjbGFzc05hbWUiLCJzdHlsZSIsIm9uTW91c2VEb3duIiwib25Ub3VjaFN0YXJ0IiwiZGF0YUlkIiwiY29sb3IiLCJuYW1lIiwiX3RvZ2dsZUVuYWJsZUNvbmZpZyIsIl90b2dnbGVWaXNpYmlsaXR5IiwiX3VwZGF0ZVdpZGdldExhYmVsIiwiX3JlbW92ZVdpZGdldCIsIm9wZW5Nb2RhbCIsInVwZGF0ZVdpZGdldFZpc3VhbENoYW5uZWxDb25maWciLCJ1cGRhdGVXaWRnZXRUeXBlIiwidXBkYXRlV2lkZ2V0VmlzQ29uZmlnIiwidHlwZSIsImFnZ3JlZ2F0aW9uVHlwZSIsImZpZWxkTmFtZSIsImRpc3BsYXkiLCJtYXJnaW5Ub3AiLCJsZW5ndGgiLCJhZCIsInRleHRBbGlnbiIsInkiLCJtYXJnaW5MZWZ0IiwieCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJvbkNsb3NlQ29uZmlnIiwiYXJyYXlPZiIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQUVBLElBQU1BLFlBQVksR0FBR0MsNkJBQU9DLEdBQVYsb01BQWxCOztBQVNBLElBQU1DLG1CQUFtQixHQUFHRiw2QkFBT0MsR0FBVix3SUFDSCxVQUFBRSxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGVBQWhCO0FBQUEsQ0FERixDQUF6Qjs7QUFJQSxJQUFNQyx5QkFBeUIsR0FBR04sNkJBQU9DLEdBQVYsb0xBQ1QsVUFBQUUsS0FBSztB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QVpoQjtBQWFqQnFCLElBQUFBLCtCQUErQixFQUFFeUQsc0JBQVU5RSxJQWIxQjtBQWVqQk0sSUFBQUEsUUFBUSxFQUFFd0Usc0JBQVVDLE1BQVYsQ0FBaUJDLFVBZlY7QUFpQmpCN0UsSUFBQUEsSUFBSSxFQUFFMkUsc0JBQVVDLE1BQVYsQ0FBaUJDLFVBakJOO0FBa0JqQjNFLElBQUFBLE9BQU8sRUFBRXlFLHNCQUFVQyxNQUFWLENBQWlCQztBQWxCVCxHQUhPOztBQWdWNUIsU0FBT25GLFdBQVA7QUFDRDs7b0NBRWNELGtCOztBQUVmO0FBQ0U7Ozs7Ozs7Ozs7OztBQVlEO0FBRUQ7QUFDRTs7Ozs7O0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7c29ydGFibGV9IGZyb20gJ3JlYWN0LWFueXRoaW5nLXNvcnRhYmxlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgV2lkZ2V0Q29uZmlndXJhdG9yIGZyb20gJy4vd2lkZ2V0LWNvbmZpZ3VyYXRvcic7XG5pbXBvcnQgV2lkZ2V0UGFuZWxIZWFkZXIgZnJvbSAnLi93aWRnZXQtcGFuZWwtaGVhZGVyJztcbmltcG9ydCBMb2FkaW5nU3Bpbm5lciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9sb2FkaW5nLXNwaW5uZXInO1xuaW1wb3J0IFNsaWRlckhhbmRsZSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zbGlkZXIvc2xpZGVyLWJhci1oYW5kbGUnO1xuLy8gaW1wb3J0IGxheWVycyBmcm9tICcuLi8uLi8uLi8uLi9kaXN0L2NvbXBvbmVudHMvY29tbW9uL2ljb25zL2xheWVycyc7XG5cbmNvbnN0IFBhbmVsV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgYm9yZGVyLXJhZGl1czogMXB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG5cbiAgJi5kcmFnZ2luZyB7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5gO1xuY29uc3QgU3R5bGVkV2lkZ2V0Q29udGVudCA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgcGFkZGluZzogMTJweDtcbmA7XG5jb25zdCBTdHlsZWRXaWRnZXRDb250ZW50SGVhZGVyID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuICBjb2xvcjogIzZhNzQ4NTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDE0cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRXaWRnZXRDb250ZW50VmFsdWUgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZH07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAzMHB4O1xuYDtcblxuZnVuY3Rpb24gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIFdpZGdldFBhbmVsRmFjdG9yeSgpIHtcbiAgQHNvcnRhYmxlXG4gIGNsYXNzIFdpZGdldFBhbmVsIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgd2lkZ2V0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgaWR4OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgICB3aWRnZXRDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB3aWRnZXRUeXBlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgLy8gbGF5ZXJzOiBwcm9wVHlwZXMuYXJyYXlPZihwcm9wVHlwZXMuYW55KSxcbiAgICAgIG9wZW5Nb2RhbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZVdpZGdldDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9uQ2xvc2VDb25maWc6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICB3aWRnZXRUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgICB3aWRnZXRWaXNDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgd2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgIG1hcFN0YXRlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG5cbiAgICAgIGF1dGg6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIHByb2plY3Q6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIGFnZ3JlZ2F0ZWREYXRhOiBudWxsXG4gICAgfTtcblxuICAgIGluRGVib3VuY2UgPSAwO1xuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGF1dGgsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIG1hcFN0YXRlLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgd2lkZ2V0LFxuICAgICAgICB3aWRnZXRDb25maWdDaGFuZ2VcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gd2lkZ2V0LmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YShcbiAgICAgICAgd2lkZ2V0LFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIHByb2plY3RcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIC8vIHdpZGdldC51cGRhdGVXaWRnZXRDb25maWcoe1xuICAgICAgICAgIC8vICAgYWdncmVnYXRlZERhdGE6IHJlc3VsdFxuICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgIHdpZGdldENvbmZpZ0NoYW5nZSh3aWRnZXQsIHthZ2dyZWdhdGVkRGF0YTogcmVzdWx0fSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGF1dGgsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIHdpZGdldCxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIG1hcFN0YXRlLFxuICAgICAgICB3aWRnZXRDb25maWdDaGFuZ2VcbiAgICAgIH0gPSBuZXh0UHJvcHM7XG5cbiAgICAgIGlmICh3aWRnZXQuY29uZmlnLmFwaUNhbGxSZXF1ZXN0KSB7XG4gICAgICAgIHdpZGdldENvbmZpZ0NoYW5nZSh3aWRnZXQsIHthcGlDYWxsUmVxdWVzdDogZmFsc2V9KTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVXaWRnZXRBZ2dyZWdhdGlvbkRhdGEoXG4gICAgICAgICAgd2lkZ2V0LFxuICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHdpZGdldENvbmZpZ0NoYW5nZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgICFfLmlzRXF1YWwodGhpcy5wcm9wcy5tYXBTdGF0ZSwgbmV4dFByb3BzLm1hcFN0YXRlKSAmJlxuICAgICAgICAvLyBuZXh0UHJvcHMubGF5ZXJzICYmXG4gICAgICAgIG5leHRQcm9wcy53aWRnZXQuY29uZmlnLmJvdW5kc1xuICAgICAgKSB7XG4gICAgICAgIG5leHRQcm9wcy53aWRnZXRDb25maWdDaGFuZ2UoXG4gICAgICAgICAgbmV4dFByb3BzLndpZGdldCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpc0NhbGN1bGF0aW5nOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIHByb2plY3RcbiAgICAgICAgKTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAgICAgdGhpcy5pbkRlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gd2lkZ2V0LmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YShcbiAgICAgICAgICAgIHdpZGdldCxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgICAgIG1hcFN0YXRlLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIHByb2plY3RcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmVzdWx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICB3aWRnZXRDb25maWdDaGFuZ2Uod2lkZ2V0LCB7XG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZWREYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgIGlzQ2FsY3VsYXRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBuZXh0UHJvcHMud2lkZ2V0Q29uZmlnQ2hhbmdlKFxuICAgICAgICAgIC8vICAgbmV4dFByb3BzLndpZGdldCxcbiAgICAgICAgICAvLyAgIHtcbiAgICAgICAgICAvLyAgICAgbWFwU3RhdGU6IG5leHRQcm9wcy5tYXBTdGF0ZVxuICAgICAgICAgIC8vICAgfSxcbiAgICAgICAgICAvLyAgIGF1dGgsXG4gICAgICAgICAgLy8gICBwcm9qZWN0XG4gICAgICAgICAgLy8gKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAgICAgICB0aGlzLmluRGVib3VuY2UgPSAwO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlID0gZnVuYyA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHthZ2dyZWdhdGVkRGF0YTogZnVuY30pO1xuICAgIH07XG5cbiAgICBjYWxjdWxhdGVXaWRnZXRBZ2dyZWdhdGlvbkRhdGEoXG4gICAgICB3aWRnZXQsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZGF0YXNldHMsXG4gICAgICBtYXBTdGF0ZSxcbiAgICAgIGF1dGgsXG4gICAgICBwcm9qZWN0LFxuICAgICAgd2lkZ2V0Q29uZmlnQ2hhbmdlXG4gICAgKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB3aWRnZXQuY2FsY3VsYXRlQWdncmVnYXRpb25EYXRhKFxuICAgICAgICB3aWRnZXQsXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgcHJvamVjdFxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgd2lkZ2V0Q29uZmlnQ2hhbmdlKHdpZGdldCwge1xuICAgICAgICAgICAgYWdncmVnYXRlZERhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgIGFwaUNhbGxSZXF1ZXN0OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVXaWRnZXRDb25maWcgPSBuZXdQcm9wID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXV0aCxcbiAgICAgICAgd2lkZ2V0LFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIHdpZGdldENvbmZpZ0NoYW5nZVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMobmV3UHJvcCk7XG4gICAgICBpZiAod2lkZ2V0LnNob3VsZENhbGN1bGF0ZUFnZ3JlZ2F0ZWREYXRhKHByb3BzKSkge1xuICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVdpZGdldEFnZ3JlZ2F0aW9uRGF0YShcbiAgICAgICAgLy8gICB3aWRnZXQsXG4gICAgICAgIC8vICAgZmlsdGVycyxcbiAgICAgICAgLy8gICBkYXRhc2V0cyxcbiAgICAgICAgLy8gICBtYXBTdGF0ZSxcbiAgICAgICAgLy8gICBhdXRoLFxuICAgICAgICAvLyAgIHByb2plY3QsXG4gICAgICAgIC8vICAgd2lkZ2V0Q29uZmlnQ2hhbmdlXG4gICAgICAgIC8vICk7XG4gICAgICAgIHdpZGdldENvbmZpZ0NoYW5nZSh3aWRnZXQsIHthcGlDYWxsUmVxdWVzdDogdHJ1ZX0pO1xuICAgICAgfVxuXG4gICAgICBuZXdQcm9wID0ge1xuICAgICAgICAuLi5uZXdQcm9wLFxuICAgICAgICBtYXBTdGF0ZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5wcm9wcy53aWRnZXRDb25maWdDaGFuZ2Uod2lkZ2V0LCBuZXdQcm9wLCBhdXRoLCBwcm9qZWN0KTtcbiAgICB9O1xuXG4gICAgdXBkYXRlV2lkZ2V0VHlwZSA9IG5ld1R5cGUgPT4ge1xuICAgICAgdGhpcy5wcm9wcy53aWRnZXRUeXBlQ2hhbmdlKHRoaXMucHJvcHMud2lkZ2V0LCBuZXdUeXBlKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlV2lkZ2V0VmlzQ29uZmlnID0gbmV3VmlzQ29uZmlnID0+IHtcbiAgICAgIHRoaXMucHJvcHMud2lkZ2V0VmlzQ29uZmlnQ2hhbmdlKHRoaXMucHJvcHMud2lkZ2V0LCBuZXdWaXNDb25maWcpO1xuICAgIH07XG5cbiAgICB1cGRhdGVXaWRnZXRWaXN1YWxDaGFubmVsQ29uZmlnID0gKG5ld0NvbmZpZywgY2hhbm5lbCwgc2NhbGVLZXkpID0+IHtcbiAgICAgIHRoaXMucHJvcHMud2lkZ2V0VmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShcbiAgICAgICAgdGhpcy5wcm9wcy53aWRnZXQsXG4gICAgICAgIG5ld0NvbmZpZyxcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgc2NhbGVLZXlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF91cGRhdGVXaWRnZXRMYWJlbCA9ICh7dGFyZ2V0OiB7dmFsdWV9fSkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVXaWRnZXRDb25maWcoe2xhYmVsOiB2YWx1ZX0pO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlVmlzaWJpbGl0eSA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9ICF0aGlzLnByb3BzLndpZGdldC5jb25maWcuaXNWaXNpYmxlO1xuICAgICAgdGhpcy51cGRhdGVXaWRnZXRDb25maWcoe2lzVmlzaWJsZX0pO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlRW5hYmxlQ29uZmlnID0gZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWRnZXQ6IHtcbiAgICAgICAgICBjb25maWc6IHtpc0NvbmZpZ0FjdGl2ZX1cbiAgICAgICAgfVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLnVwZGF0ZVdpZGdldENvbmZpZyh7aXNDb25maWdBY3RpdmU6ICFpc0NvbmZpZ0FjdGl2ZX0pO1xuICAgIH07XG5cbiAgICBfcmVtb3ZlV2lkZ2V0ID0gZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5wcm9wcy5yZW1vdmVXaWRnZXQodGhpcy5wcm9wcy5pZHgpO1xuICAgIH07XG5cbiAgICBfcmVuZGVyTGF5ZXJOYW1lKGlkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLnByb3BzLmxheWVycy5tYXAobCA9PiB7XG4gICAgICAgIGlmIChsLmlkID09PSBpZCkge1xuICAgICAgICAgIHJldHVybiBsLmNvbmZpZy5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge3dpZGdldCwgbGF5ZXJzLCBpZHgsIGRhdGFzZXRzLCB3aWRnZXRUeXBlT3B0aW9uc30gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSB3aWRnZXQ7XG4gICAgICBjb25zdCB7aXNDb25maWdBY3RpdmV9ID0gY29uZmlnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFBhbmVsV3JhcHBlclxuICAgICAgICAgIGFjdGl2ZT17aXNDb25maWdBY3RpdmV9XG4gICAgICAgICAgY2xhc3NOYW1lPXtgbGF5ZXItcGFuZWwgJHt0aGlzLnByb3BzLmNsYXNzTmFtZX1gfVxuICAgICAgICAgIHN0eWxlPXt0aGlzLnByb3BzLnN0eWxlfVxuICAgICAgICAgIG9uTW91c2VEb3duPXt0aGlzLnByb3BzLm9uTW91c2VEb3dufVxuICAgICAgICAgIG9uVG91Y2hTdGFydD17dGhpcy5wcm9wcy5vblRvdWNoU3RhcnR9XG4gICAgICAgID5cbiAgICAgICAgICA8V2lkZ2V0UGFuZWxIZWFkZXJcbiAgICAgICAgICAgIGlzQ29uZmlnQWN0aXZlPXtpc0NvbmZpZ0FjdGl2ZX1cbiAgICAgICAgICAgIGlkPXt3aWRnZXQuaWR9XG4gICAgICAgICAgICBpZHg9e2lkeH1cbiAgICAgICAgICAgIGlzVmlzaWJsZT17Y29uZmlnLmlzVmlzaWJsZX1cbiAgICAgICAgICAgIGxhYmVsPXtjb25maWcubGFiZWx9XG4gICAgICAgICAgICBsYWJlbFJDR0NvbG9yVmFsdWVzPXtkYXRhc2V0c1tjb25maWcuZGF0YUlkXS5jb2xvcn1cbiAgICAgICAgICAgIHdpZGdldFR5cGU9e3dpZGdldC5uYW1lfVxuICAgICAgICAgICAgb25Ub2dnbGVFbmFibGVDb25maWc9e3RoaXMuX3RvZ2dsZUVuYWJsZUNvbmZpZ31cbiAgICAgICAgICAgIG9uVG9nZ2xlVmlzaWJpbGl0eT17dGhpcy5fdG9nZ2xlVmlzaWJpbGl0eX1cbiAgICAgICAgICAgIG9uVXBkYXRlV2lkZ2V0TGFiZWw9e3RoaXMuX3VwZGF0ZVdpZGdldExhYmVsfVxuICAgICAgICAgICAgb25SZW1vdmVXaWRnZXQ9e3RoaXMuX3JlbW92ZVdpZGdldH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtpc0NvbmZpZ0FjdGl2ZSAmJiAoXG4gICAgICAgICAgICA8V2lkZ2V0Q29uZmlndXJhdG9yXG4gICAgICAgICAgICAgIHdpZGdldD17d2lkZ2V0fVxuICAgICAgICAgICAgICBsYXllcnM9e2xheWVyc31cbiAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICB3aWRnZXRUeXBlT3B0aW9ucz17d2lkZ2V0VHlwZU9wdGlvbnN9XG4gICAgICAgICAgICAgIG9wZW5Nb2RhbD17dGhpcy5wcm9wcy5vcGVuTW9kYWx9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyQ29uZmlnPXt0aGlzLnVwZGF0ZVdpZGdldENvbmZpZ31cbiAgICAgICAgICAgICAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnPXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldFZpc3VhbENoYW5uZWxDb25maWdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllclR5cGU9e3RoaXMudXBkYXRlV2lkZ2V0VHlwZX1cbiAgICAgICAgICAgICAgdXBkYXRlTGF5ZXJWaXNDb25maWc9e3RoaXMudXBkYXRlV2lkZ2V0VmlzQ29uZmlnfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHsod2lkZ2V0LnR5cGUgPT09ICdGdW5jdGlvbicgJiZcbiAgICAgICAgICAgIGNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5hZ2dyZWdhdGVkRGF0YSAmJlxuICAgICAgICAgICAgY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5hZ2dyZWdhdGVkRGF0YSAhPT0gJ29iamVjdCcpIHx8XG4gICAgICAgICAgY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID09PSAwID8gKFxuICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnQ+XG4gICAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50SGVhZGVyPlxuICAgICAgICAgICAgICAgIHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIoY29uZmlnLmFnZ3JlZ2F0aW9uVHlwZSl9IDp7JyAnfVxuICAgICAgICAgICAgICAgIHsvKiB7dGhpcy5fcmVuZGVyTGF5ZXJOYW1lKGNvbmZpZy5zZWxlY3RlZExheWVyLmlkKX0gOnsnICd9ICovfVxuICAgICAgICAgICAgICAgIHtjb25maWcuZmllbGROYW1lfVxuICAgICAgICAgICAgICA8L1N0eWxlZFdpZGdldENvbnRlbnRIZWFkZXI+XG4gICAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50VmFsdWU+XG4gICAgICAgICAgICAgICAge2NvbmZpZy5pc0NhbGN1bGF0aW5nID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e2Rpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCBtYXJnaW5Ub3A6ICc1cHgnfX0+XG4gICAgICAgICAgICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tjb2xvcjogJyM2YTc0ODUnfX0+e2NvbmZpZy5hZ2dyZWdhdGVkRGF0YX08L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1N0eWxlZFdpZGdldENvbnRlbnRWYWx1ZT5cbiAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudD5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICB7d2lkZ2V0LnR5cGUgPT09ICdDYXRlZ29yeScgJiZcbiAgICAgICAgICBjb25maWcuaXNWaXNpYmxlICYmXG4gICAgICAgICAgY29uZmlnLmFnZ3JlZ2F0ZWREYXRhICYmXG4gICAgICAgICAgY29uZmlnLmFnZ3JlZ2F0ZWREYXRhLmxlbmd0aCAmJlxuICAgICAgICAgIGNvbmZpZy5hZ2dyZWdhdGlvblR5cGUgPyAoXG4gICAgICAgICAgICA8U3R5bGVkV2lkZ2V0Q29udGVudD5cbiAgICAgICAgICAgICAge2NvbmZpZy5hZ2dyZWdhdGVkRGF0YS5tYXAoYWQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50SGVhZGVyIHN0eWxlPXt7dGV4dEFsaWduOiAnaW5oZXJpdCd9fT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnLCBjb2xvcjogJyM2YTc0ODUnfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWQueX17JyAnfVxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkxlZnQ6ICdhdXRvJ319PnthZC54fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZFdpZGdldENvbnRlbnRIZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxTbGlkZXJIYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPXsnY2F0ZWdvcnknfVxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsoYWQueCAvIGNvbmZpZy5hZ2dyZWdhdGVkRGF0YVswXS54KSAqIDEwMH1cbiAgICAgICAgICAgICAgICAgICAgICBzbGlkZXJCYXJMaXN0ZW5lcj17bnVsbH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnRWYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvU3R5bGVkV2lkZ2V0Q29udGVudD5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9QYW5lbFdyYXBwZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBXaWRnZXRQYW5lbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2lkZ2V0UGFuZWxGYWN0b3J5O1xuXG57XG4gIC8qIDxTdHlsZWRXaWRnZXRDb250ZW50PlxuICAgICAgICAgICAgICB7Y29uZmlnLmFnZ3JlZ2F0ZWREYXRhLm1hcChhZCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFdpZGdldENvbnRlbnRIZWFkZXIgc3R5bGU9e3t0ZXh0QWxpZ246ICdpbmhlcml0J319PlxuICAgICAgICAgICAgICAgICAgICAgIHthZFswXX0te2FkWzFdfVxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZFdpZGdldENvbnRlbnRIZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxTdHlsZWRXaWRnZXRDb250ZW50VmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L1N0eWxlZFdpZGdldENvbnRlbnQ+ICovXG59XG5cbntcbiAgLyogPFdpZGdldEJhckNoYXJ0XG4gICAgICAgICAgICAgIGRhdGE9e2NvbmZpZy5hZ2dyZWdhdGVkRGF0YX1cbiAgICAgICAgICAgICAgaGVpZ2h0PXs5Ni45fVxuICAgICAgICAgICAgICB3aWR0aD17MTkxLjZ9XG4gICAgICAgICAgICAgIG1hcmdpbj17MH1cbiAgICAgICAgICAgIC8+ICovXG59XG4iXX0=