kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
392 lines (325 loc) • 38.7 kB
JavaScript
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.CloudStorageDropdownFactory = exports.SaveExportDropdownFactory = exports.PanelHeaderDropdownFactory = exports.PanelAction = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
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 _reselect = require("reselect");
var _styledComponents2 = require("../common/styled-components");
var _logo = _interopRequireDefault(require("../common/logo"));
var _icons = require("../common/icons");
var _panelDropdown = _interopRequireDefault(require("./panel-dropdown"));
var _toolbar = _interopRequireDefault(require("../common/toolbar"));
var _toolbarItem = _interopRequireDefault(require("../common/toolbar-item"));
var _reactIntl = require("react-intl");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject5() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n"]);
_templateObject5 = function _templateObject5() {
return data;
};
return data;
}
function _templateObject4() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n color: ", ";\n display: flex;\n height: 26px;\n justify-content: space-between;\n margin-left: 4px;\n padding: 5px;\n font-weight: bold;\n p {\n display: inline-block;\n margin-right: 6px;\n }\n a {\n height: 20px;\n }\n\n :hover {\n cursor: pointer;\n color: ", ";\n\n a {\n color: ", ";\n }\n }\n"]);
_templateObject4 = function _templateObject4() {
return data;
};
return data;
}
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px 16px 0 16px;\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var StyledPanelHeader = _styledComponents["default"].div.attrs({
className: 'side-side-panel__header'
})(_templateObject(), function (props) {
return props.theme.sidePanelHeaderBg;
});
var StyledPanelHeaderTop = _styledComponents["default"].div.attrs({
className: 'side-panel__header__top'
})(_templateObject2());
var StyledPanelTopActions = _styledComponents["default"].div.attrs({
className: 'side-panel__top__actions'
})(_templateObject3());
var StyledPanelAction = _styledComponents["default"].div.attrs({
className: 'side-panel__panel-header__action'
})(_templateObject4(), function (props) {
return props.active ? props.theme.textColorHl : props.theme.subtextColor;
}, function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.textColorHl;
});
var StyledToolbar = (0, _styledComponents["default"])(_toolbar["default"])(_templateObject5());
var PanelAction = function PanelAction(_ref) {
var item = _ref.item,
onClick = _ref.onClick;
return _react["default"].createElement(StyledPanelAction, {
"data-tip": true,
"data-for": "".concat(item.id, "-action"),
onClick: onClick
}, item.label ? _react["default"].createElement("p", null, item.label) : null, _react["default"].createElement("a", {
target: item.blank ? '_blank' : '',
href: item.href
}, _react["default"].createElement(item.iconComponent, {
height: "20px"
})), item.tooltip ? _react["default"].createElement(_styledComponents2.Tooltip, {
id: "".concat(item.id, "-action"),
place: "bottom",
delayShow: 500,
effect: "solid"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: item.tooltip
})) : null);
};
exports.PanelAction = PanelAction;
var PanelHeaderDropdownFactory = function PanelHeaderDropdownFactory() {
var PanelHeaderDropdown = function PanelHeaderDropdown(_ref2) {
var items = _ref2.items,
show = _ref2.show,
onClose = _ref2.onClose,
id = _ref2.id;
return _react["default"].createElement(StyledToolbar, {
show: show,
className: "".concat(id, "-dropdown")
}, _react["default"].createElement(_panelDropdown["default"], {
className: "panel-header-dropdown__inner",
show: show,
onClose: onClose
}, items.map(function (item) {
return _react["default"].createElement(_toolbarItem["default"], {
id: item.key,
key: item.key,
label: item.label,
icon: item.icon,
onClick: item.onClick,
onClose: onClose
});
})));
};
return PanelHeaderDropdown;
};
exports.PanelHeaderDropdownFactory = PanelHeaderDropdownFactory;
var getDropdownItemsSelector = function getDropdownItemsSelector() {
return (0, _reselect.createSelector)(function (props) {
return props;
}, function (props) {
return props.items.map(function (t) {
return _objectSpread({}, t, {
onClick: t.onClick && t.onClick(props) ? t.onClick(props) : null
});
}).filter(function (l) {
return l.onClick;
});
});
};
var SaveExportDropdownFactory = function SaveExportDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var SaveExportDropdown = function SaveExportDropdown(props) {
return _react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "save-export"
});
};
SaveExportDropdown.defaultProps = {
items: [{
label: 'toolbar.exportImage',
icon: _icons.Picture,
key: 'image',
onClick: function onClick(props) {
return props.onExportImage;
}
}, {
label: 'toolbar.exportData',
icon: _icons.DataTable,
key: 'data',
onClick: function onClick(props) {
return props.onExportData;
}
}, {
label: 'toolbar.exportMap',
icon: _icons.Map,
key: 'map',
onClick: function onClick(props) {
return props.onExportMap;
}
}, {
label: 'toolbar.saveMap',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveMap;
}
}, {
label: 'toolbar.shareMapURL',
icon: _icons.Share,
key: 'share',
onClick: function onClick(props) {
return props.onShareMap;
}
}]
};
return SaveExportDropdown;
};
exports.SaveExportDropdownFactory = SaveExportDropdownFactory;
SaveExportDropdownFactory.deps = [PanelHeaderDropdownFactory];
var CloudStorageDropdownFactory = function CloudStorageDropdownFactory(PanelHeaderDropdown) {
var dropdownItemsSelector = getDropdownItemsSelector();
var CloudStorageDropdown = function CloudStorageDropdown(props) {
return _react["default"].createElement(PanelHeaderDropdown, {
items: dropdownItemsSelector(props),
show: props.show,
onClose: props.onClose,
id: "cloud-storage"
});
};
CloudStorageDropdown.defaultProps = {
items: [{
label: 'Save',
icon: _icons.Save2,
key: 'save',
onClick: function onClick(props) {
return props.onSaveToStorage;
}
}, {
label: 'Save As',
icon: _icons.Save2,
key: 'saveAs',
onClick: function onClick(props) {
return props.onSaveAsToStorage;
}
}]
};
return CloudStorageDropdown;
};
exports.CloudStorageDropdownFactory = CloudStorageDropdownFactory;
CloudStorageDropdownFactory.deps = [PanelHeaderDropdownFactory];
PanelHeaderFactory.deps = [SaveExportDropdownFactory, CloudStorageDropdownFactory];
function PanelHeaderFactory(SaveExportDropdown, CloudStorageDropdown) {
var _class, _temp;
return _temp = _class =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(PanelHeader, _Component);
function PanelHeader() {
(0, _classCallCheck2["default"])(this, PanelHeader);
return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(PanelHeader).apply(this, arguments));
}
(0, _createClass2["default"])(PanelHeader, [{
key: "render",
value: function render() {
var _this$props = this.props,
appName = _this$props.appName,
appWebsite = _this$props.appWebsite,
version = _this$props.version,
actionItems = _this$props.actionItems,
visibleDropdown = _this$props.visibleDropdown,
showExportDropdown = _this$props.showExportDropdown,
hideExportDropdown = _this$props.hideExportDropdown,
dropdownCallbacks = (0, _objectWithoutProperties2["default"])(_this$props, ["appName", "appWebsite", "version", "actionItems", "visibleDropdown", "showExportDropdown", "hideExportDropdown"]);
var items = actionItems || []; // don't render cloud storage icon if onSaveToStorage is not provided
if (typeof this.props.onSaveToStorage !== 'function') {
items = actionItems.filter(function (ai) {
return ai.id !== 'storage';
});
}
return _react["default"].createElement(StyledPanelHeader, {
className: "side-panel__panel-header"
}, _react["default"].createElement(StyledPanelHeaderTop, {
className: "side-panel__panel-header__top"
}, _react["default"].createElement(this.props.logoComponent, {
appName: appName,
version: version,
appWebsite: appWebsite
}), _react["default"].createElement(StyledPanelTopActions, null, items.map(function (item) {
return _react["default"].createElement("div", {
className: "side-panel__panel-header__right",
key: item.id,
style: {
position: 'relative'
}
}, _react["default"].createElement(PanelAction, {
item: item,
onClick: function onClick() {
if (item.dropdownComponent) {
showExportDropdown(item.id);
}
item.onClick();
}
}), item.dropdownComponent ? _react["default"].createElement(item.dropdownComponent, (0, _extends2["default"])({
onClose: hideExportDropdown,
show: visibleDropdown === item.id
}, dropdownCallbacks)) : null);
}))));
}
}]);
return PanelHeader;
}(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", {
appName: _propTypes["default"].string,
appWebsite: _propTypes["default"].string,
version: _propTypes["default"].string,
visibleDropdown: _propTypes["default"].string,
logoComponent: _propTypes["default"].oneOfType([_propTypes["default"].element, _propTypes["default"].func]),
actionItems: _propTypes["default"].arrayOf(_propTypes["default"].any),
onExportImage: _propTypes["default"].func,
onExportData: _propTypes["default"].func,
onExportConfig: _propTypes["default"].func,
onExportMap: _propTypes["default"].func,
onSaveToStorage: _propTypes["default"].func,
onSaveAsToStorage: _propTypes["default"].func,
onSaveMap: _propTypes["default"].func,
onShareMap: _propTypes["default"].func
}), (0, _defineProperty2["default"])(_class, "defaultProps", {
logoComponent: _logo["default"],
actionItems: [{
id: 'storage',
iconComponent: _icons.Db,
tooltip: 'tooltip.cloudStorage',
onClick: function onClick() {},
dropdownComponent: CloudStorageDropdown
}, {
id: 'save',
iconComponent: _icons.Save,
onClick: function onClick() {},
label: 'Share',
dropdownComponent: SaveExportDropdown
}]
}), _temp;
}
var _default = PanelHeaderFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLmpzIl0sIm5hbWVzIjpbIlN0eWxlZFBhbmVsSGVhZGVyIiwic3R5bGVkIiwiZGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJwcm9wcyIsInRoZW1lIiwic2lkZVBhbmVsSGVhZGVyQmciLCJTdHlsZWRQYW5lbEhlYWRlclRvcCIsIlN0eWxlZFBhbmVsVG9wQWN0aW9ucyIsIlN0eWxlZFBhbmVsQWN0aW9uIiwiYWN0aXZlIiwidGV4dENvbG9ySGwiLCJzdWJ0ZXh0Q29sb3IiLCJTdHlsZWRUb29sYmFyIiwiVG9vbGJhciIsIlBhbmVsQWN0aW9uIiwiaXRlbSIsIm9uQ2xpY2siLCJpZCIsImxhYmVsIiwiYmxhbmsiLCJocmVmIiwidG9vbHRpcCIsIlBhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5IiwiUGFuZWxIZWFkZXJEcm9wZG93biIsIml0ZW1zIiwic2hvdyIsIm9uQ2xvc2UiLCJtYXAiLCJrZXkiLCJpY29uIiwiZ2V0RHJvcGRvd25JdGVtc1NlbGVjdG9yIiwidCIsImZpbHRlciIsImwiLCJTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5IiwiZHJvcGRvd25JdGVtc1NlbGVjdG9yIiwiU2F2ZUV4cG9ydERyb3Bkb3duIiwiZGVmYXVsdFByb3BzIiwiUGljdHVyZSIsIm9uRXhwb3J0SW1hZ2UiLCJEYXRhVGFibGUiLCJvbkV4cG9ydERhdGEiLCJNYXBJY29uIiwib25FeHBvcnRNYXAiLCJTYXZlMiIsIm9uU2F2ZU1hcCIsIlNoYXJlIiwib25TaGFyZU1hcCIsImRlcHMiLCJDbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnkiLCJDbG91ZFN0b3JhZ2VEcm9wZG93biIsIm9uU2F2ZVRvU3RvcmFnZSIsIm9uU2F2ZUFzVG9TdG9yYWdlIiwiUGFuZWxIZWFkZXJGYWN0b3J5IiwiYXBwTmFtZSIsImFwcFdlYnNpdGUiLCJ2ZXJzaW9uIiwiYWN0aW9uSXRlbXMiLCJ2aXNpYmxlRHJvcGRvd24iLCJzaG93RXhwb3J0RHJvcGRvd24iLCJoaWRlRXhwb3J0RHJvcGRvd24iLCJkcm9wZG93bkNhbGxiYWNrcyIsImFpIiwicG9zaXRpb24iLCJkcm9wZG93bkNvbXBvbmVudCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsInN0cmluZyIsImxvZ29Db21wb25lbnQiLCJvbmVPZlR5cGUiLCJlbGVtZW50IiwiZnVuYyIsImFycmF5T2YiLCJhbnkiLCJvbkV4cG9ydENvbmZpZyIsIktlcGxlckdsTG9nbyIsImljb25Db21wb25lbnQiLCJEYiIsIlNhdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGlCQUFpQixHQUFHQyw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxvQkFHRCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGlCQUFoQjtBQUFBLENBSEosQ0FBdkI7O0FBT0EsSUFBTUMsb0JBQW9CLEdBQUdQLDZCQUFPQyxHQUFQLENBQVdDLEtBQVgsQ0FBaUI7QUFDNUNDLEVBQUFBLFNBQVMsRUFBRTtBQURpQyxDQUFqQixDQUFILG9CQUExQjs7QUFTQSxJQUFNSyxxQkFBcUIsR0FBR1IsNkJBQU9DLEdBQVAsQ0FBV0MsS0FBWCxDQUFpQjtBQUM3Q0MsRUFBQUEsU0FBUyxFQUFFO0FBRGtDLENBQWpCLENBQUgsb0JBQTNCOztBQU1BLElBQU1NLGlCQUFpQixHQUFHVCw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxxQkFLWixVQUFBQyxLQUFLO0FBQUEsU0FBS0EsS0FBSyxDQUFDTSxNQUFOLEdBQWVOLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxXQUEzQixHQUF5Q1AsS0FBSyxDQUFDQyxLQUFOLENBQVlPLFlBQTFEO0FBQUEsQ0FMTyxFQXNCVixVQUFBUixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlNLFdBQWhCO0FBQUEsQ0F0QkssRUF5QlIsVUFBQVAsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxXQUFoQjtBQUFBLENBekJHLENBQXZCOztBQThCQSxJQUFNRSxhQUFhLEdBQUcsa0NBQU9DLG1CQUFQLENBQUgsb0JBQW5COztBQUlPLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFjO0FBQUEsTUFBRUMsSUFBRixRQUFFQSxJQUFGO0FBQUEsTUFBUUMsT0FBUixRQUFRQSxPQUFSO0FBQUEsU0FDekIsZ0NBQUMsaUJBQUQ7QUFBbUIsb0JBQW5CO0FBQTRCLDBCQUFhRCxJQUFJLENBQUNFLEVBQWxCLFlBQTVCO0FBQTJELElBQUEsT0FBTyxFQUFFRDtBQUFwRSxLQUNHRCxJQUFJLENBQUNHLEtBQUwsR0FBYSwyQ0FBSUgsSUFBSSxDQUFDRyxLQUFULENBQWIsR0FBbUMsSUFEdEMsRUFFRTtBQUFHLElBQUEsTUFBTSxFQUFFSCxJQUFJLENBQUNJLEtBQUwsR0FBYSxRQUFiLEdBQXdCLEVBQW5DO0FBQXVDLElBQUEsSUFBSSxFQUFFSixJQUFJLENBQUNLO0FBQWxELEtBQ0UsZ0NBQUMsSUFBRCxDQUFNLGFBQU47QUFBb0IsSUFBQSxNQUFNLEVBQUM7QUFBM0IsSUFERixDQUZGLEVBS0dMLElBQUksQ0FBQ00sT0FBTCxHQUNDLGdDQUFDLDBCQUFEO0FBQVMsSUFBQSxFQUFFLFlBQUtOLElBQUksQ0FBQ0UsRUFBVixZQUFYO0FBQWtDLElBQUEsS0FBSyxFQUFDLFFBQXhDO0FBQWlELElBQUEsU0FBUyxFQUFFLEdBQTVEO0FBQWlFLElBQUEsTUFBTSxFQUFDO0FBQXhFLEtBQ0UsZ0NBQUMsMkJBQUQ7QUFBa0IsSUFBQSxFQUFFLEVBQUVGLElBQUksQ0FBQ007QUFBM0IsSUFERixDQURELEdBSUcsSUFUTixDQUR5QjtBQUFBLENBQXBCOzs7O0FBY0EsSUFBTUMsMEJBQTBCLEdBQUcsU0FBN0JBLDBCQUE2QixHQUFNO0FBQzlDLE1BQU1DLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsUUFBZ0M7QUFBQSxRQUE5QkMsS0FBOEIsU0FBOUJBLEtBQThCO0FBQUEsUUFBdkJDLElBQXVCLFNBQXZCQSxJQUF1QjtBQUFBLFFBQWpCQyxPQUFpQixTQUFqQkEsT0FBaUI7QUFBQSxRQUFSVCxFQUFRLFNBQVJBLEVBQVE7QUFDMUQsV0FDRSxnQ0FBQyxhQUFEO0FBQWUsTUFBQSxJQUFJLEVBQUVRLElBQXJCO0FBQTJCLE1BQUEsU0FBUyxZQUFLUixFQUFMO0FBQXBDLE9BQ0UsZ0NBQUMseUJBQUQ7QUFDRSxNQUFBLFNBQVMsRUFBQyw4QkFEWjtBQUVFLE1BQUEsSUFBSSxFQUFFUSxJQUZSO0FBR0UsTUFBQSxPQUFPLEVBQUVDO0FBSFgsT0FLR0YsS0FBSyxDQUFDRyxHQUFOLENBQVUsVUFBQVosSUFBSTtBQUFBLGFBQ2IsZ0NBQUMsdUJBQUQ7QUFDRSxRQUFBLEVBQUUsRUFBRUEsSUFBSSxDQUFDYSxHQURYO0FBRUUsUUFBQSxHQUFHLEVBQUViLElBQUksQ0FBQ2EsR0FGWjtBQUdFLFFBQUEsS0FBSyxFQUFFYixJQUFJLENBQUNHLEtBSGQ7QUFJRSxRQUFBLElBQUksRUFBRUgsSUFBSSxDQUFDYyxJQUpiO0FBS0UsUUFBQSxPQUFPLEVBQUVkLElBQUksQ0FBQ0MsT0FMaEI7QUFNRSxRQUFBLE9BQU8sRUFBRVU7QUFOWCxRQURhO0FBQUEsS0FBZCxDQUxILENBREYsQ0FERjtBQW9CRCxHQXJCRDs7QUF1QkEsU0FBT0gsbUJBQVA7QUFDRCxDQXpCTTs7OztBQTJCUCxJQUFNTyx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQTJCO0FBQUEsU0FDL0IsOEJBQ0UsVUFBQTNCLEtBQUs7QUFBQSxXQUFJQSxLQUFKO0FBQUEsR0FEUCxFQUVFLFVBQUFBLEtBQUs7QUFBQSxXQUNIQSxLQUFLLENBQUNxQixLQUFOLENBQ0dHLEdBREgsQ0FDTyxVQUFBSSxDQUFDO0FBQUEsK0JBQ0RBLENBREM7QUFFSmYsUUFBQUEsT0FBTyxFQUFFZSxDQUFDLENBQUNmLE9BQUYsSUFBYWUsQ0FBQyxDQUFDZixPQUFGLENBQVViLEtBQVYsQ0FBYixHQUFnQzRCLENBQUMsQ0FBQ2YsT0FBRixDQUFVYixLQUFWLENBQWhDLEdBQW1EO0FBRnhEO0FBQUEsS0FEUixFQUtHNkIsTUFMSCxDQUtVLFVBQUFDLENBQUM7QUFBQSxhQUFJQSxDQUFDLENBQUNqQixPQUFOO0FBQUEsS0FMWCxDQURHO0FBQUEsR0FGUCxDQUQrQjtBQUFBLENBQWpDOztBQVlPLElBQU1rQix5QkFBeUIsR0FBRyxTQUE1QkEseUJBQTRCLENBQUFYLG1CQUFtQixFQUFJO0FBQzlELE1BQU1ZLHFCQUFxQixHQUFHTCx3QkFBd0IsRUFBdEQ7O0FBRUEsTUFBTU0sa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFBakMsS0FBSztBQUFBLFdBQzlCLGdDQUFDLG1CQUFEO0FBQ0UsTUFBQSxLQUFLLEVBQUVnQyxxQkFBcUIsQ0FBQ2hDLEtBQUQsQ0FEOUI7QUFFRSxNQUFBLElBQUksRUFBRUEsS0FBSyxDQUFDc0IsSUFGZDtBQUdFLE1BQUEsT0FBTyxFQUFFdEIsS0FBSyxDQUFDdUIsT0FIakI7QUFJRSxNQUFBLEVBQUUsRUFBQztBQUpMLE1BRDhCO0FBQUEsR0FBaEM7O0FBU0FVLEVBQUFBLGtCQUFrQixDQUFDQyxZQUFuQixHQUFrQztBQUNoQ2IsSUFBQUEsS0FBSyxFQUFFLENBQ0w7QUFDRU4sTUFBQUEsS0FBSyxFQUFFLHFCQURUO0FBRUVXLE1BQUFBLElBQUksRUFBRVMsY0FGUjtBQUdFVixNQUFBQSxHQUFHLEVBQUUsT0FIUDtBQUlFWixNQUFBQSxPQUFPLEVBQUUsaUJBQUFiLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUNvQyxhQUFWO0FBQUE7QUFKaEIsS0FESyxFQU9MO0FBQ0VyQixNQUFBQSxLQUFLLEVBQUUsb0JBRFQ7QUFFRVcsTUFBQUEsSUFBSSxFQUFFVyxnQkFGUjtBQUdFWixNQUFBQSxHQUFHLEVBQUUsTUFIUDtBQUlFWixNQUFBQSxPQUFPLEVBQUUsaUJBQUFiLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUNzQyxZQUFWO0FBQUE7QUFKaEIsS0FQSyxFQWFMO0FBQ0V2QixNQUFBQSxLQUFLLEVBQUUsbUJBRFQ7QUFFRVcsTUFBQUEsSUFBSSxFQUFFYSxVQUZSO0FBR0VkLE1BQUFBLEdBQUcsRUFBRSxLQUhQO0FBSUVaLE1BQUFBLE9BQU8sRUFBRSxpQkFBQWIsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQ3dDLFdBQVY7QUFBQTtBQUpoQixLQWJLLEVBbUJMO0FBQ0V6QixNQUFBQSxLQUFLLEVBQUUsaUJBRFQ7QUFFRVcsTUFBQUEsSUFBSSxFQUFFZSxZQUZSO0FBR0VoQixNQUFBQSxHQUFHLEVBQUUsTUFIUDtBQUlFWixNQUFBQSxPQUFPLEVBQUUsaUJBQUFiLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUMwQyxTQUFWO0FBQUE7QUFKaEIsS0FuQkssRUF5Qkw7QUFDRTNCLE1BQUFBLEtBQUssRUFBRSxxQkFEVDtBQUVFVyxNQUFBQSxJQUFJLEVBQUVpQixZQUZSO0FBR0VsQixNQUFBQSxHQUFHLEVBQUUsT0FIUDtBQUlFWixNQUFBQSxPQUFPLEVBQUUsaUJBQUFiLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUM0QyxVQUFWO0FBQUE7QUFKaEIsS0F6Qks7QUFEeUIsR0FBbEM7QUFtQ0EsU0FBT1gsa0JBQVA7QUFDRCxDQWhETTs7O0FBaURQRix5QkFBeUIsQ0FBQ2MsSUFBMUIsR0FBaUMsQ0FBQzFCLDBCQUFELENBQWpDOztBQUVPLElBQU0yQiwyQkFBMkIsR0FBRyxTQUE5QkEsMkJBQThCLENBQUExQixtQkFBbUIsRUFBSTtBQUNoRSxNQUFNWSxxQkFBcUIsR0FBR0wsd0JBQXdCLEVBQXREOztBQUVBLE1BQU1vQixvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQUEvQyxLQUFLO0FBQUEsV0FDaEMsZ0NBQUMsbUJBQUQ7QUFDRSxNQUFBLEtBQUssRUFBRWdDLHFCQUFxQixDQUFDaEMsS0FBRCxDQUQ5QjtBQUVFLE1BQUEsSUFBSSxFQUFFQSxLQUFLLENBQUNzQixJQUZkO0FBR0UsTUFBQSxPQUFPLEVBQUV0QixLQUFLLENBQUN1QixPQUhqQjtBQUlFLE1BQUEsRUFBRSxFQUFDO0FBSkwsTUFEZ0M7QUFBQSxHQUFsQzs7QUFRQXdCLEVBQUFBLG9CQUFvQixDQUFDYixZQUFyQixHQUFvQztBQUNsQ2IsSUFBQUEsS0FBSyxFQUFFLENBQ0w7QUFDRU4sTUFBQUEsS0FBSyxFQUFFLE1BRFQ7QUFFRVcsTUFBQUEsSUFBSSxFQUFFZSxZQUZSO0FBR0VoQixNQUFBQSxHQUFHLEVBQUUsTUFIUDtBQUlFWixNQUFBQSxPQUFPLEVBQUUsaUJBQUFiLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUNnRCxlQUFWO0FBQUE7QUFKaEIsS0FESyxFQU9MO0FBQ0VqQyxNQUFBQSxLQUFLLEVBQUUsU0FEVDtBQUVFVyxNQUFBQSxJQUFJLEVBQUVlLFlBRlI7QUFHRWhCLE1BQUFBLEdBQUcsRUFBRSxRQUhQO0FBSUVaLE1BQUFBLE9BQU8sRUFBRSxpQkFBQWIsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQ2lELGlCQUFWO0FBQUE7QUFKaEIsS0FQSztBQUQyQixHQUFwQztBQWdCQSxTQUFPRixvQkFBUDtBQUNELENBNUJNOzs7QUE2QlBELDJCQUEyQixDQUFDRCxJQUE1QixHQUFtQyxDQUFDMUIsMEJBQUQsQ0FBbkM7QUFFQStCLGtCQUFrQixDQUFDTCxJQUFuQixHQUEwQixDQUFDZCx5QkFBRCxFQUE0QmUsMkJBQTVCLENBQTFCOztBQUVBLFNBQVNJLGtCQUFULENBQTRCakIsa0JBQTVCLEVBQWdEYyxvQkFBaEQsRUFBc0U7QUFBQTs7QUFDcEU7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLCtCQXNDVztBQUFBLDBCQVVILEtBQUsvQyxLQVZGO0FBQUEsWUFFTG1ELE9BRkssZUFFTEEsT0FGSztBQUFBLFlBR0xDLFVBSEssZUFHTEEsVUFISztBQUFBLFlBSUxDLE9BSkssZUFJTEEsT0FKSztBQUFBLFlBS0xDLFdBTEssZUFLTEEsV0FMSztBQUFBLFlBTUxDLGVBTkssZUFNTEEsZUFOSztBQUFBLFlBT0xDLGtCQVBLLGVBT0xBLGtCQVBLO0FBQUEsWUFRTEMsa0JBUkssZUFRTEEsa0JBUks7QUFBQSxZQVNGQyxpQkFURTtBQVdQLFlBQUlyQyxLQUFLLEdBQUdpQyxXQUFXLElBQUksRUFBM0IsQ0FYTyxDQWFQOztBQUNBLFlBQUksT0FBTyxLQUFLdEQsS0FBTCxDQUFXZ0QsZUFBbEIsS0FBc0MsVUFBMUMsRUFBc0Q7QUFDcEQzQixVQUFBQSxLQUFLLEdBQUdpQyxXQUFXLENBQUN6QixNQUFaLENBQW1CLFVBQUE4QixFQUFFO0FBQUEsbUJBQUlBLEVBQUUsQ0FBQzdDLEVBQUgsS0FBVSxTQUFkO0FBQUEsV0FBckIsQ0FBUjtBQUNEOztBQUVELGVBQ0UsZ0NBQUMsaUJBQUQ7QUFBbUIsVUFBQSxTQUFTLEVBQUM7QUFBN0IsV0FDRSxnQ0FBQyxvQkFBRDtBQUFzQixVQUFBLFNBQVMsRUFBQztBQUFoQyxXQUNFLHFDQUFNLEtBQU4sQ0FBWSxhQUFaO0FBQTBCLFVBQUEsT0FBTyxFQUFFcUMsT0FBbkM7QUFBNEMsVUFBQSxPQUFPLEVBQUVFLE9BQXJEO0FBQThELFVBQUEsVUFBVSxFQUFFRDtBQUExRSxVQURGLEVBRUUsZ0NBQUMscUJBQUQsUUFDRy9CLEtBQUssQ0FBQ0csR0FBTixDQUFVLFVBQUFaLElBQUk7QUFBQSxpQkFDYjtBQUNFLFlBQUEsU0FBUyxFQUFDLGlDQURaO0FBRUUsWUFBQSxHQUFHLEVBQUVBLElBQUksQ0FBQ0UsRUFGWjtBQUdFLFlBQUEsS0FBSyxFQUFFO0FBQUM4QyxjQUFBQSxRQUFRLEVBQUU7QUFBWDtBQUhULGFBS0UsZ0NBQUMsV0FBRDtBQUNFLFlBQUEsSUFBSSxFQUFFaEQsSUFEUjtBQUVFLFlBQUEsT0FBTyxFQUFFLG1CQUFNO0FBQ2Isa0JBQUlBLElBQUksQ0FBQ2lELGlCQUFULEVBQTRCO0FBQzFCTCxnQkFBQUEsa0JBQWtCLENBQUM1QyxJQUFJLENBQUNFLEVBQU4sQ0FBbEI7QUFDRDs7QUFDREYsY0FBQUEsSUFBSSxDQUFDQyxPQUFMO0FBQ0Q7QUFQSCxZQUxGLEVBY0dELElBQUksQ0FBQ2lELGlCQUFMLEdBQ0MsZ0NBQUMsSUFBRCxDQUFNLGlCQUFOO0FBQ0UsWUFBQSxPQUFPLEVBQUVKLGtCQURYO0FBRUUsWUFBQSxJQUFJLEVBQUVGLGVBQWUsS0FBSzNDLElBQUksQ0FBQ0U7QUFGakMsYUFHTTRDLGlCQUhOLEVBREQsR0FNRyxJQXBCTixDQURhO0FBQUEsU0FBZCxDQURILENBRkYsQ0FERixDQURGO0FBaUNEO0FBekZIO0FBQUE7QUFBQSxJQUFpQ0ksZ0JBQWpDLHlEQUNxQjtBQUNqQlgsSUFBQUEsT0FBTyxFQUFFWSxzQkFBVUMsTUFERjtBQUVqQlosSUFBQUEsVUFBVSxFQUFFVyxzQkFBVUMsTUFGTDtBQUdqQlgsSUFBQUEsT0FBTyxFQUFFVSxzQkFBVUMsTUFIRjtBQUlqQlQsSUFBQUEsZUFBZSxFQUFFUSxzQkFBVUMsTUFKVjtBQUtqQkMsSUFBQUEsYUFBYSxFQUFFRixzQkFBVUcsU0FBVixDQUFvQixDQUFDSCxzQkFBVUksT0FBWCxFQUFvQkosc0JBQVVLLElBQTlCLENBQXBCLENBTEU7QUFNakJkLElBQUFBLFdBQVcsRUFBRVMsc0JBQVVNLE9BQVYsQ0FBa0JOLHNCQUFVTyxHQUE1QixDQU5JO0FBT2pCbEMsSUFBQUEsYUFBYSxFQUFFMkIsc0JBQVVLLElBUFI7QUFRakI5QixJQUFBQSxZQUFZLEVBQUV5QixzQkFBVUssSUFSUDtBQVNqQkcsSUFBQUEsY0FBYyxFQUFFUixzQkFBVUssSUFUVDtBQVVqQjVCLElBQUFBLFdBQVcsRUFBRXVCLHNCQUFVSyxJQVZOO0FBV2pCcEIsSUFBQUEsZUFBZSxFQUFFZSxzQkFBVUssSUFYVjtBQVlqQm5CLElBQUFBLGlCQUFpQixFQUFFYyxzQkFBVUssSUFaWjtBQWFqQjFCLElBQUFBLFNBQVMsRUFBRXFCLHNCQUFVSyxJQWJKO0FBY2pCeEIsSUFBQUEsVUFBVSxFQUFFbUIsc0JBQVVLO0FBZEwsR0FEckIsNERBa0J3QjtBQUNwQkgsSUFBQUEsYUFBYSxFQUFFTyxnQkFESztBQUVwQmxCLElBQUFBLFdBQVcsRUFBRSxDQUNYO0FBQ0V4QyxNQUFBQSxFQUFFLEVBQUUsU0FETjtBQUVFMkQsTUFBQUEsYUFBYSxFQUFFQyxTQUZqQjtBQUdFeEQsTUFBQUEsT0FBTyxFQUFFLHNCQUhYO0FBSUVMLE1BQUFBLE9BQU8sRUFBRSxtQkFBTSxDQUFFLENBSm5CO0FBS0VnRCxNQUFBQSxpQkFBaUIsRUFBRWQ7QUFMckIsS0FEVyxFQVFYO0FBQ0VqQyxNQUFBQSxFQUFFLEVBQUUsTUFETjtBQUVFMkQsTUFBQUEsYUFBYSxFQUFFRSxXQUZqQjtBQUdFOUQsTUFBQUEsT0FBTyxFQUFFLG1CQUFNLENBQUUsQ0FIbkI7QUFJRUUsTUFBQUEsS0FBSyxFQUFFLE9BSlQ7QUFLRThDLE1BQUFBLGlCQUFpQixFQUFFNUI7QUFMckIsS0FSVztBQUZPLEdBbEJ4QjtBQTJGRDs7ZUFFY2lCLGtCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQge1Rvb2x0aXB9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBLZXBsZXJHbExvZ28gZnJvbSAnY29tcG9uZW50cy9jb21tb24vbG9nbyc7XG5pbXBvcnQge1NhdmUsIERhdGFUYWJsZSwgU2F2ZTIsIFBpY3R1cmUsIERiLCBNYXAgYXMgTWFwSWNvbiwgU2hhcmV9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBDbGlja091dHNpZGVDbG9zZURyb3Bkb3duIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9wYW5lbC1kcm9wZG93bic7XG5pbXBvcnQgVG9vbGJhciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi90b29sYmFyJztcbmltcG9ydCBUb29sYmFySXRlbSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi90b29sYmFyLWl0ZW0nO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdyZWFjdC1pbnRsJztcblxuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXIgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1zaWRlLXBhbmVsX19oZWFkZXInXG59KWBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zaWRlUGFuZWxIZWFkZXJCZ307XG4gIHBhZGRpbmc6IDEycHggMTZweCAwIDE2cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRQYW5lbEhlYWRlclRvcCA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzaWRlLXBhbmVsX19oZWFkZXJfX3RvcCdcbn0pYFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIHdpZHRoOiAxMDAlO1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxUb3BBY3Rpb25zID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtcGFuZWxfX3RvcF9fYWN0aW9ucydcbn0pYFxuICBkaXNwbGF5OiBmbGV4O1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxBY3Rpb24gPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX19hY3Rpb24nXG59KWBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUudGV4dENvbG9ySGwgOiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3IpfTtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyNnB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIHBhZGRpbmc6IDVweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHAge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDZweDtcbiAgfVxuICBhIHtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gIH1cblxuICA6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG5cbiAgICBhIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFRvb2xiYXIgPSBzdHlsZWQoVG9vbGJhcilgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbmA7XG5cbmV4cG9ydCBjb25zdCBQYW5lbEFjdGlvbiA9ICh7aXRlbSwgb25DbGlja30pID0+IChcbiAgPFN0eWxlZFBhbmVsQWN0aW9uIGRhdGEtdGlwIGRhdGEtZm9yPXtgJHtpdGVtLmlkfS1hY3Rpb25gfSBvbkNsaWNrPXtvbkNsaWNrfT5cbiAgICB7aXRlbS5sYWJlbCA/IDxwPntpdGVtLmxhYmVsfTwvcD4gOiBudWxsfVxuICAgIDxhIHRhcmdldD17aXRlbS5ibGFuayA/ICdfYmxhbmsnIDogJyd9IGhyZWY9e2l0ZW0uaHJlZn0+XG4gICAgICA8aXRlbS5pY29uQ29tcG9uZW50IGhlaWdodD1cIjIwcHhcIiAvPlxuICAgIDwvYT5cbiAgICB7aXRlbS50b29sdGlwID8gKFxuICAgICAgPFRvb2x0aXAgaWQ9e2Ake2l0ZW0uaWR9LWFjdGlvbmB9IHBsYWNlPVwiYm90dG9tXCIgZGVsYXlTaG93PXs1MDB9IGVmZmVjdD1cInNvbGlkXCI+XG4gICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXtpdGVtLnRvb2x0aXB9IC8+XG4gICAgICA8L1Rvb2x0aXA+XG4gICAgKSA6IG51bGx9XG4gIDwvU3R5bGVkUGFuZWxBY3Rpb24+XG4pO1xuXG5leHBvcnQgY29uc3QgUGFuZWxIZWFkZXJEcm9wZG93bkZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IFBhbmVsSGVhZGVyRHJvcGRvd24gPSAoe2l0ZW1zLCBzaG93LCBvbkNsb3NlLCBpZH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFRvb2xiYXIgc2hvdz17c2hvd30gY2xhc3NOYW1lPXtgJHtpZH0tZHJvcGRvd25gfT5cbiAgICAgICAgPENsaWNrT3V0c2lkZUNsb3NlRHJvcGRvd25cbiAgICAgICAgICBjbGFzc05hbWU9XCJwYW5lbC1oZWFkZXItZHJvcGRvd25fX2lubmVyXCJcbiAgICAgICAgICBzaG93PXtzaG93fVxuICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgID5cbiAgICAgICAgICB7aXRlbXMubWFwKGl0ZW0gPT4gKFxuICAgICAgICAgICAgPFRvb2xiYXJJdGVtXG4gICAgICAgICAgICAgIGlkPXtpdGVtLmtleX1cbiAgICAgICAgICAgICAga2V5PXtpdGVtLmtleX1cbiAgICAgICAgICAgICAgbGFiZWw9e2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICAgIGljb249e2l0ZW0uaWNvbn1cbiAgICAgICAgICAgICAgb25DbGljaz17aXRlbS5vbkNsaWNrfVxuICAgICAgICAgICAgICBvbkNsb3NlPXtvbkNsb3NlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9DbGlja091dHNpZGVDbG9zZURyb3Bkb3duPlxuICAgICAgPC9TdHlsZWRUb29sYmFyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsSGVhZGVyRHJvcGRvd247XG59O1xuXG5jb25zdCBnZXREcm9wZG93bkl0ZW1zU2VsZWN0b3IgPSAoKSA9PlxuICBjcmVhdGVTZWxlY3RvcihcbiAgICBwcm9wcyA9PiBwcm9wcyxcbiAgICBwcm9wcyA9PlxuICAgICAgcHJvcHMuaXRlbXNcbiAgICAgICAgLm1hcCh0ID0+ICh7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICBvbkNsaWNrOiB0Lm9uQ2xpY2sgJiYgdC5vbkNsaWNrKHByb3BzKSA/IHQub25DbGljayhwcm9wcykgOiBudWxsXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKGwgPT4gbC5vbkNsaWNrKVxuICApO1xuXG5leHBvcnQgY29uc3QgU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeSA9IFBhbmVsSGVhZGVyRHJvcGRvd24gPT4ge1xuICBjb25zdCBkcm9wZG93bkl0ZW1zU2VsZWN0b3IgPSBnZXREcm9wZG93bkl0ZW1zU2VsZWN0b3IoKTtcblxuICBjb25zdCBTYXZlRXhwb3J0RHJvcGRvd24gPSBwcm9wcyA9PiAoXG4gICAgPFBhbmVsSGVhZGVyRHJvcGRvd25cbiAgICAgIGl0ZW1zPXtkcm9wZG93bkl0ZW1zU2VsZWN0b3IocHJvcHMpfVxuICAgICAgc2hvdz17cHJvcHMuc2hvd31cbiAgICAgIG9uQ2xvc2U9e3Byb3BzLm9uQ2xvc2V9XG4gICAgICBpZD1cInNhdmUtZXhwb3J0XCJcbiAgICAvPlxuICApO1xuXG4gIFNhdmVFeHBvcnREcm9wZG93bi5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaXRlbXM6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd0b29sYmFyLmV4cG9ydEltYWdlJyxcbiAgICAgICAgaWNvbjogUGljdHVyZSxcbiAgICAgICAga2V5OiAnaW1hZ2UnLFxuICAgICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vbkV4cG9ydEltYWdlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3Rvb2xiYXIuZXhwb3J0RGF0YScsXG4gICAgICAgIGljb246IERhdGFUYWJsZSxcbiAgICAgICAga2V5OiAnZGF0YScsXG4gICAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uRXhwb3J0RGF0YVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICd0b29sYmFyLmV4cG9ydE1hcCcsXG4gICAgICAgIGljb246IE1hcEljb24sXG4gICAgICAgIGtleTogJ21hcCcsXG4gICAgICAgIG9uQ2xpY2s6IHByb3BzID0+IHByb3BzLm9uRXhwb3J0TWFwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3Rvb2xiYXIuc2F2ZU1hcCcsXG4gICAgICAgIGljb246IFNhdmUyLFxuICAgICAgICBrZXk6ICdzYXZlJyxcbiAgICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25TYXZlTWFwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ3Rvb2xiYXIuc2hhcmVNYXBVUkwnLFxuICAgICAgICBpY29uOiBTaGFyZSxcbiAgICAgICAga2V5OiAnc2hhcmUnLFxuICAgICAgICBvbkNsaWNrOiBwcm9wcyA9PiBwcm9wcy5vblNoYXJlTWFwXG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIHJldHVybiBTYXZlRXhwb3J0RHJvcGRvd247XG59O1xuU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeS5kZXBzID0gW1BhbmVsSGVhZGVyRHJvcGRvd25GYWN0b3J5XTtcblxuZXhwb3J0IGNvbnN0IENsb3VkU3RvcmFnZURyb3Bkb3duRmFjdG9yeSA9IFBhbmVsSGVhZGVyRHJvcGRvd24gPT4ge1xuICBjb25zdCBkcm9wZG93bkl0ZW1zU2VsZWN0b3IgPSBnZXREcm9wZG93bkl0ZW1zU2VsZWN0b3IoKTtcblxuICBjb25zdCBDbG91ZFN0b3JhZ2VEcm9wZG93biA9IHByb3BzID0+IChcbiAgICA8UGFuZWxIZWFkZXJEcm9wZG93blxuICAgICAgaXRlbXM9e2Ryb3Bkb3duSXRlbXNTZWxlY3Rvcihwcm9wcyl9XG4gICAgICBzaG93PXtwcm9wcy5zaG93fVxuICAgICAgb25DbG9zZT17cHJvcHMub25DbG9zZX1cbiAgICAgIGlkPVwiY2xvdWQtc3RvcmFnZVwiXG4gICAgLz5cbiAgKTtcbiAgQ2xvdWRTdG9yYWdlRHJvcGRvd24uZGVmYXVsdFByb3BzID0ge1xuICAgIGl0ZW1zOiBbXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnU2F2ZScsXG4gICAgICAgIGljb246IFNhdmUyLFxuICAgICAgICBrZXk6ICdzYXZlJyxcbiAgICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25TYXZlVG9TdG9yYWdlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ1NhdmUgQXMnLFxuICAgICAgICBpY29uOiBTYXZlMixcbiAgICAgICAga2V5OiAnc2F2ZUFzJyxcbiAgICAgICAgb25DbGljazogcHJvcHMgPT4gcHJvcHMub25TYXZlQXNUb1N0b3JhZ2VcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIHJldHVybiBDbG91ZFN0b3JhZ2VEcm9wZG93bjtcbn07XG5DbG91ZFN0b3JhZ2VEcm9wZG93bkZhY3RvcnkuZGVwcyA9IFtQYW5lbEhlYWRlckRyb3Bkb3duRmFjdG9yeV07XG5cblBhbmVsSGVhZGVyRmFjdG9yeS5kZXBzID0gW1NhdmVFeHBvcnREcm9wZG93bkZhY3RvcnksIENsb3VkU3RvcmFnZURyb3Bkb3duRmFjdG9yeV07XG5cbmZ1bmN0aW9uIFBhbmVsSGVhZGVyRmFjdG9yeShTYXZlRXhwb3J0RHJvcGRvd24sIENsb3VkU3RvcmFnZURyb3Bkb3duKSB7XG4gIHJldHVybiBjbGFzcyBQYW5lbEhlYWRlciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGFwcE5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBhcHBXZWJzaXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgdmVyc2lvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHZpc2libGVEcm9wZG93bjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGxvZ29Db21wb25lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5lbGVtZW50LCBQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgYWN0aW9uSXRlbXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgb25FeHBvcnRJbWFnZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkV4cG9ydERhdGE6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25FeHBvcnRDb25maWc6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25FeHBvcnRNYXA6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25TYXZlVG9TdG9yYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uU2F2ZUFzVG9TdG9yYWdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uU2F2ZU1hcDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvblNoYXJlTWFwOiBQcm9wVHlwZXMuZnVuY1xuICAgIH07XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbG9nb0NvbXBvbmVudDogS2VwbGVyR2xMb2dvLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc3RvcmFnZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogRGIsXG4gICAgICAgICAgdG9vbHRpcDogJ3Rvb2x0aXAuY2xvdWRTdG9yYWdlJyxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogQ2xvdWRTdG9yYWdlRHJvcGRvd25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2F2ZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogU2F2ZSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgICBsYWJlbDogJ1NoYXJlJyxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogU2F2ZUV4cG9ydERyb3Bkb3duXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBhcHBXZWJzaXRlLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBhY3Rpb25JdGVtcyxcbiAgICAgICAgdmlzaWJsZURyb3Bkb3duLFxuICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24sXG4gICAgICAgIGhpZGVFeHBvcnREcm9wZG93bixcbiAgICAgICAgLi4uZHJvcGRvd25DYWxsYmFja3NcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgbGV0IGl0ZW1zID0gYWN0aW9uSXRlbXMgfHwgW107XG5cbiAgICAgIC8vIGRvbid0IHJlbmRlciBjbG91ZCBzdG9yYWdlIGljb24gaWYgb25TYXZlVG9TdG9yYWdlIGlzIG5vdCBwcm92aWRlZFxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uU2F2ZVRvU3RvcmFnZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpdGVtcyA9IGFjdGlvbkl0ZW1zLmZpbHRlcihhaSA9PiBhaS5pZCAhPT0gJ3N0b3JhZ2UnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFBhbmVsSGVhZGVyIGNsYXNzTmFtZT1cInNpZGUtcGFuZWxfX3BhbmVsLWhlYWRlclwiPlxuICAgICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlclRvcCBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX3RvcFwiPlxuICAgICAgICAgICAgPHRoaXMucHJvcHMubG9nb0NvbXBvbmVudCBhcHBOYW1lPXthcHBOYW1lfSB2ZXJzaW9uPXt2ZXJzaW9ufSBhcHBXZWJzaXRlPXthcHBXZWJzaXRlfSAvPlxuICAgICAgICAgICAgPFN0eWxlZFBhbmVsVG9wQWN0aW9ucz5cbiAgICAgICAgICAgICAge2l0ZW1zLm1hcChpdGVtID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX3JpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGtleT17aXRlbS5pZH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7cG9zaXRpb246ICdyZWxhdGl2ZSd9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxQYW5lbEFjdGlvblxuICAgICAgICAgICAgICAgICAgICBpdGVtPXtpdGVtfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZHJvcGRvd25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dFeHBvcnREcm9wZG93bihpdGVtLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge2l0ZW0uZHJvcGRvd25Db21wb25lbnQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxpdGVtLmRyb3Bkb3duQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgb25DbG9zZT17aGlkZUV4cG9ydERyb3Bkb3dufVxuICAgICAgICAgICAgICAgICAgICAgIHNob3c9e3Zpc2libGVEcm9wZG93biA9PT0gaXRlbS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICB7Li4uZHJvcGRvd25DYWxsYmFja3N9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L1N0eWxlZFBhbmVsVG9wQWN0aW9ucz5cbiAgICAgICAgICA8L1N0eWxlZFBhbmVsSGVhZGVyVG9wPlxuICAgICAgICA8L1N0eWxlZFBhbmVsSGVhZGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhbmVsSGVhZGVyRmFjdG9yeTtcbiJdfQ==
;