kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
319 lines (272 loc) • 38.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _layerConfigurator = _interopRequireDefault(require("./layer-configurator"));
var _layerPanelHeader = _interopRequireDefault(require("./layer-panel-header"));
var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project"));
var _lodash = _interopRequireDefault(require("lodash"));
var _layer = _interopRequireDefault(require("react-map-gl/dist/es5/components/layer"));
var _styles = require("../../../styles");
var _actions = require("../../../actions");
var _templateObject;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var PanelWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n border-radius: 1px;\n margin-bottom: 8px;\n z-index: 1000;\n\n &.dragging {\n cursor: move;\n }\n"])));
LayerPanelFactory.deps = [_layerConfigurator["default"]];
function LayerPanelFactory(LayerConfigurator) {
var LayerPanel = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(LayerPanel, _Component);
var _super = _createSuper(LayerPanel);
function LayerPanel() {
var _this;
(0, _classCallCheck2["default"])(this, LayerPanel);
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), "updateLayerConfig", function (newProp) {
_this.props.layerConfigChange(_this.props.layer, newProp);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerType", function (newType) {
_this.props.layerTypeChange(_this.props.layer, newType); // this.props.layerConfigChange(this.props.layer, {apiCallRequest: true});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerVisConfig", function (newVisConfig) {
_this.props.layerVisConfigChange(_this.props.layer, newVisConfig);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerColorUI", function () {
var _this$props;
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
(_this$props = _this.props).layerColorUIChange.apply(_this$props, [_this.props.layer].concat(args));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerTextLabel", function () {
var _this$props2;
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
(_this$props2 = _this.props).layerTextLabelChange.apply(_this$props2, [_this.props.layer].concat(args));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "updateLayerVisualChannelConfig", function (newConfig, channel, scaleKey) {
_this.props.layerVisualChannelConfigChange(_this.props.layer, newConfig, channel, scaleKey);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateLayerLabel", function (_ref) {
var value = _ref.target.value;
_this.updateLayerConfig({
label: value
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleVisibility", function (e) {
e.stopPropagation();
var isVisible = !_this.props.layer.config.isVisible;
_this.updateLayerConfig({
isVisible: isVisible
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleEnableConfig", function (e) {
e.stopPropagation();
var isConfigActive = _this.props.layer.config.isConfigActive;
_this.updateLayerConfig({
isConfigActive: !isConfigActive
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_removeLayer", function (e) {
e.stopPropagation();
_this.props.removeLayer(_this.props.idx);
});
// filterLayerOptions = ['grid', 'hexagon', 'boundary'];
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterLargeDataOptions", ['backendPoint', 'backendGeojson', 'geoHash', 'dynamic']);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSmallDataOptions", ['backendPoint', 'backendGeojson']);
return _this;
}
(0, _createClass2["default"])(LayerPanel, [{
key: "componentWillReceiveProps",
value: // inDebounce = 0;
// componentWillReceiveProps(nextProps) {
// const {config} = nextProps.layer;
// const {columns, boundaryAggregation, apiCallRequest} = config;
// if (
// nextProps.layer.type === 'dynamic' ||
// nextProps.layer.type === 'geoHash' ||
// nextProps.layer.type === 'point'
// ) {
// if (
// !_.isEqual(this.props.mapState, nextProps.mapState)
// // &&
// // nextProps.layers
// // nextProps.widget.config.bounds
// ) {
// nextProps.layerConfigChange(nextProps.layer, {
// apiCallRequest: true
// });
// }
// }
// if (
// nextProps.layer &&
// config &&
// apiCallRequest === true
// // columns[Object.keys(columns)[0]].fieldIdx !== -1
// ) {
// nextProps.layerConfigChange(nextProps.layer, {
// apiCallRequest: false,
// apiCallLoader: true
// });
// clearTimeout(this.inDebounce);
// this.inDebounce = setTimeout(() => {
// const result = nextProps.layer.axiosApiCall(
// nextProps.datasets,
// this.getViewport(nextProps.mapState),
// nextProps.mapState.zoom,
// nextProps.filters
// );
// result.then(function(result) {
// nextProps.layerConfigChange(nextProps.layer, {
// apiCallLoader: false
// });
// nextProps.updateLayerData(nextProps.layer, result);
// });
// clearTimeout(this.inDebounce);
// this.inDebounce = 0;
// }, 300);
// }
// }
// getViewport(mapState) {
// const {
// longitude,
// latitude,
// height,
// width,
// zoom,
// pitch,
// bearing
// } = mapState;
// // let boundingBox = geoViewport.bounds([longitude, latitude], zoom, [
// // width,
// // height
// // ]);
// const viewport = new WebMercatorViewport({
// width: width,
// height: height,
// longitude: longitude,
// latitude: latitude,
// zoom: zoom,
// pitch: pitch,
// bearing: bearing
// });
// let cUL = viewport.unproject([0, 0]);
// let cUR = viewport.unproject([width, 0]);
// let cLR = viewport.unproject([width, height]);
// let cLL = viewport.unproject([0, height]);
// let latRange = [...new Set([cLL[1], cUR[1], cLR[1], cUL[1]])].sort(
// (a, b) => a - b
// );
// let lngRange = [...new Set([cLL[0], cUR[0], cLR[0], cUL[0]])].sort(
// (a, b) => a - b
// );
// return [lngRange[0], lngRange[1], latRange[0], latRange[1]];
// }
function componentWillReceiveProps(nextProps) {
if (this.props.layer.config.dataId && nextProps.layer.config.dataId && this.props.layer.config.dataId !== nextProps.layer.config.dataId) {
if (_layer["default"].name !== 'boundary' && _layer["default"].name !== 'pincode') {
this.props.layerConfigChange(nextProps.layer, {
apiCallRequest: true
});
}
}
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props3 = this.props,
layer = _this$props3.layer,
idx = _this$props3.idx,
datasets = _this$props3.datasets,
updateLayerData = _this$props3.updateLayerData;
var layerTypeOptions = this.props.layerTypeOptions;
var largeData = datasets[layer.config.dataId] && layer.config.dataId ? datasets[layer.config.dataId].isLargeCategory : undefined;
layerTypeOptions = largeData && largeData === true ? layerTypeOptions.filter(function (lto) {
return _this2.filterLargeDataOptions.indexOf(lto.id) >= 0;
}) : layerTypeOptions.filter(function (lto) {
return _this2.filterSmallDataOptions.indexOf(lto.id) === -1;
});
var config = layer.config;
var isConfigActive = config.isConfigActive,
apiCallLoader = config.apiCallLoader;
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(_layerPanelHeader["default"], {
isConfigActive: isConfigActive,
apiCallLoader: apiCallLoader,
id: layer.id,
showLoader: layer.showLoader,
idx: idx,
isVisible: config.isVisible,
label: config.label,
labelRCGColorValues: datasets[config.dataId].color,
layerType: layer.name,
onToggleEnableConfig: this._toggleEnableConfig,
onToggleVisibility: this._toggleVisibility,
onUpdateLayerLabel: this._updateLayerLabel,
onRemoveLayer: this._removeLayer
}), isConfigActive && /*#__PURE__*/_react["default"].createElement(LayerConfigurator, {
layer: layer,
datasets: datasets,
updateLayerData: updateLayerData,
layerTypeOptions: layerTypeOptions,
openModal: this.props.openModal,
updateLayerColorUI: this.updateLayerColorUI,
updateLayerConfig: this.updateLayerConfig,
updateLayerVisualChannelConfig: this.updateLayerVisualChannelConfig,
updateLayerType: this.updateLayerType,
updateLayerTextLabel: this.updateLayerTextLabel,
updateLayerVisConfig: this.updateLayerVisConfig
}))
);
}
}]);
return LayerPanel;
}(_react.Component);
(0, _defineProperty2["default"])(LayerPanel, "propTypes", {
layer: _propTypes["default"].object.isRequired,
datasets: _propTypes["default"].object.isRequired,
idx: _propTypes["default"].number.isRequired,
layerConfigChange: _propTypes["default"].func.isRequired,
layerTypeChange: _propTypes["default"].func.isRequired,
openModal: _propTypes["default"].func.isRequired,
removeLayer: _propTypes["default"].func.isRequired,
updateLayerData: _propTypes["default"].func.isRequired,
axiosAPICAll: _propTypes["default"].func.isRequired,
onCloseConfig: _propTypes["default"].func,
layerTypeOptions: _propTypes["default"].arrayOf(_propTypes["default"].any),
layerVisConfigChange: _propTypes["default"].func.isRequired,
layerVisualChannelConfigChange: _propTypes["default"].func.isRequired,
layerColorUIChange: _propTypes["default"].func.isRequired,
updateAnimationTime: _propTypes["default"].func,
updateLayerAnimationSpeed: _propTypes["default"].func
});
return LayerPanel;
}
var _default = exports["default"] = LayerPanelFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvbGF5ZXItcGFuZWwuanMiXSwibmFtZXMiOlsiUGFuZWxXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiTGF5ZXJQYW5lbEZhY3RvcnkiLCJkZXBzIiwiTGF5ZXJDb25maWd1cmF0b3JGYWN0b3J5IiwiTGF5ZXJDb25maWd1cmF0b3IiLCJMYXllclBhbmVsIiwibmV3UHJvcCIsInByb3BzIiwibGF5ZXJDb25maWdDaGFuZ2UiLCJsYXllciIsIm5ld1R5cGUiLCJsYXllclR5cGVDaGFuZ2UiLCJuZXdWaXNDb25maWciLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsImFyZ3MiLCJsYXllckNvbG9yVUlDaGFuZ2UiLCJsYXllclRleHRMYWJlbENoYW5nZSIsIm5ld0NvbmZpZyIsImNoYW5uZWwiLCJzY2FsZUtleSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsInZhbHVlIiwidGFyZ2V0IiwidXBkYXRlTGF5ZXJDb25maWciLCJsYWJlbCIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJpc1Zpc2libGUiLCJjb25maWciLCJpc0NvbmZpZ0FjdGl2ZSIsInJlbW92ZUxheWVyIiwiaWR4IiwibmV4dFByb3BzIiwiZGF0YUlkIiwibmFtZSIsImFwaUNhbGxSZXF1ZXN0IiwiZGF0YXNldHMiLCJ1cGRhdGVMYXllckRhdGEiLCJsYXllclR5cGVPcHRpb25zIiwibGFyZ2VEYXRhIiwiaXNMYXJnZUNhdGVnb3J5IiwidW5kZWZpbmVkIiwiZmlsdGVyIiwibHRvIiwiZmlsdGVyTGFyZ2VEYXRhT3B0aW9ucyIsImluZGV4T2YiLCJpZCIsImZpbHRlclNtYWxsRGF0YU9wdGlvbnMiLCJhcGlDYWxsTG9hZGVyIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJvbk1vdXNlRG93biIsIm9uVG91Y2hTdGFydCIsInNob3dMb2FkZXIiLCJjb2xvciIsIl90b2dnbGVFbmFibGVDb25maWciLCJfdG9nZ2xlVmlzaWJpbGl0eSIsIl91cGRhdGVMYXllckxhYmVsIiwiX3JlbW92ZUxheWVyIiwib3Blbk1vZGFsIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnIiwidXBkYXRlTGF5ZXJUeXBlIiwidXBkYXRlTGF5ZXJUZXh0TGFiZWwiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJmdW5jIiwiYXhpb3NBUElDQWxsIiwib25DbG9zZUNvbmZpZyIsImFycmF5T2YiLCJhbnkiLCJ1cGRhdGVBbmltYXRpb25UaW1lIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxZQUFZLEdBQUdDLDZCQUFPQyxHQUFWLHNOQUFsQjs7QUFXQUMsaUJBQWlCLENBQUNDLElBQWxCLEdBQXlCLENBQUNDLDZCQUFELENBQXpCOztBQUVBLFNBQVNGLGlCQUFULENBQTJCRyxpQkFBM0IsRUFBOEM7QUFBQSxNQUN0Q0MsVUFEc0M7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDRHQTZIdEIsVUFBQUMsT0FBTyxFQUFJO0FBQzdCLGNBQUtDLEtBQUwsQ0FBV0MsaUJBQVgsQ0FBNkIsTUFBS0QsS0FBTCxDQUFXRSxLQUF4QyxFQUErQ0gsT0FBL0M7QUFDRCxPQS9IeUM7QUFBQSwwR0FpSXhCLFVBQUFJLE9BQU8sRUFBSTtBQUMzQixjQUFLSCxLQUFMLENBQVdJLGVBQVgsQ0FBMkIsTUFBS0osS0FBTCxDQUFXRSxLQUF0QyxFQUE2Q0MsT0FBN0MsRUFEMkIsQ0FFM0I7O0FBQ0QsT0FwSXlDO0FBQUEsK0dBc0luQixVQUFB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ekQsSUFBQUEsZUFBZSxFQUFFdUQsc0JBQVVJLElBQVYsQ0FBZUYsVUFMZjtBQU1qQlQsSUFBQUEsU0FBUyxFQUFFTyxzQkFBVUksSUFBVixDQUFlRixVQU5UO0FBT2pCdEMsSUFBQUEsV0FBVyxFQUFFb0Msc0JBQVVJLElBQVYsQ0FBZUYsVUFQWDtBQVFqQi9CLElBQUFBLGVBQWUsRUFBRTZCLHNCQUFVSSxJQUFWLENBQWVGLFVBUmY7QUFTakJHLElBQUFBLFlBQVksRUFBRUwsc0JBQVVJLElBQVYsQ0FBZUYsVUFUWjtBQVVqQkksSUFBQUEsYUFBYSxFQUFFTixzQkFBVUksSUFWUjtBQVdqQmhDLElBQUFBLGdCQUFnQixFQUFFNEIsc0JBQVVPLE9BQVYsQ0FBa0JQLHNCQUFVUSxHQUE1QixDQVhEO0FBWWpCN0QsSUFBQUEsb0JBQW9CLEVBQUVxRCxzQkFBVUksSUFBVixDQUFlRixVQVpwQjtBQWFqQmhELElBQUFBLDhCQUE4QixFQUFFOEMsc0JBQVVJLElBQVYsQ0FBZUYsVUFiOUI7QUFjakJyRCxJQUFBQSxrQkFBa0IsRUFBRW1ELHNCQUFVSSxJQUFWLENBQWVGLFVBZGxCO0FBZWpCTyxJQUFBQSxtQkFBbUIsRUFBRVQsc0JBQVVJLElBZmQ7QUFnQmpCTSxJQUFBQSx5QkFBeUIsRUFBRVYsc0JBQVVJO0FBaEJwQixHQUZ1QjtBQTRQNUMsU0FBT2pFLFVBQVA7QUFDRDs7b0NBRWNKLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCBMYXllckNvbmZpZ3VyYXRvckZhY3RvcnkgZnJvbSAnLi9sYXllci1jb25maWd1cmF0b3InO1xuaW1wb3J0IExheWVyUGFuZWxIZWFkZXIgZnJvbSAnLi9sYXllci1wYW5lbC1oZWFkZXInO1xuXG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbGF5ZXIgZnJvbSAncmVhY3QtbWFwLWdsL2Rpc3QvZXM1L2NvbXBvbmVudHMvbGF5ZXInO1xuaW1wb3J0IHtsYWJlbENvbG9yfSBmcm9tICdzdHlsZXMnO1xuaW1wb3J0IHthZGRMYXllcn0gZnJvbSAnYWN0aW9ucyc7XG5cbmNvbnN0IFBhbmVsV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgYm9yZGVyLXJhZGl1czogMXB4O1xuICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIHotaW5kZXg6IDEwMDA7XG5cbiAgJi5kcmFnZ2luZyB7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5gO1xuXG5MYXllclBhbmVsRmFjdG9yeS5kZXBzID0gW0xheWVyQ29uZmlndXJhdG9yRmFjdG9yeV07XG5cbmZ1bmN0aW9uIExheWVyUGFuZWxGYWN0b3J5KExheWVyQ29uZmlndXJhdG9yKSB7XG4gIGNsYXNzIExheWVyUGFuZWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgICAgZGF0YXNldHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBsYXllclR5cGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICByZW1vdmVMYXllcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUxheWVyRGF0YTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGF4aW9zQVBJQ0FsbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIG9uQ2xvc2VDb25maWc6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgbGF5ZXJUeXBlT3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyQ29sb3JVSUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHVwZGF0ZUFuaW1hdGlvblRpbWU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgdXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9O1xuXG4gICAgLy8gaW5EZWJvdW5jZSA9IDA7XG5cbiAgICAvLyBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIC8vICAgY29uc3Qge2NvbmZpZ30gPSBuZXh0UHJvcHMubGF5ZXI7XG4gICAgLy8gICBjb25zdCB7Y29sdW1ucywgYm91bmRhcnlBZ2dyZWdhdGlvbiwgYXBpQ2FsbFJlcXVlc3R9ID0gY29uZmlnO1xuXG4gICAgLy8gICBpZiAoXG4gICAgLy8gICAgIG5leHRQcm9wcy5sYXllci50eXBlID09PSAnZHluYW1pYycgfHxcbiAgICAvLyAgICAgbmV4dFByb3BzLmxheWVyLnR5cGUgPT09ICdnZW9IYXNoJyB8fFxuICAgIC8vICAgICBuZXh0UHJvcHMubGF5ZXIudHlwZSA9PT0gJ3BvaW50J1xuICAgIC8vICAgKSB7XG4gICAgLy8gICAgIGlmIChcbiAgICAvLyAgICAgICAhXy5pc0VxdWFsKHRoaXMucHJvcHMubWFwU3RhdGUsIG5leHRQcm9wcy5tYXBTdGF0ZSlcbiAgICAvLyAgICAgICAvLyAmJlxuICAgIC8vICAgICAgIC8vIG5leHRQcm9wcy5sYXllcnNcbiAgICAvLyAgICAgICAvLyBuZXh0UHJvcHMud2lkZ2V0LmNvbmZpZy5ib3VuZHNcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgICAgYXBpQ2FsbFJlcXVlc3Q6IHRydWVcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuXG4gICAgLy8gICBpZiAoXG4gICAgLy8gICAgIG5leHRQcm9wcy5sYXllciAmJlxuICAgIC8vICAgICBjb25maWcgJiZcbiAgICAvLyAgICAgYXBpQ2FsbFJlcXVlc3QgPT09IHRydWVcbiAgICAvLyAgICAgLy8gY29sdW1uc1tPYmplY3Qua2V5cyhjb2x1bW5zKVswXV0uZmllbGRJZHggIT09IC0xXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgIGFwaUNhbGxSZXF1ZXN0OiBmYWxzZSxcbiAgICAvLyAgICAgICBhcGlDYWxsTG9hZGVyOiB0cnVlXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAvLyAgICAgdGhpcy5pbkRlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dFByb3BzLmxheWVyLmF4aW9zQXBpQ2FsbChcbiAgICAvLyAgICAgICAgIG5leHRQcm9wcy5kYXRhc2V0cyxcbiAgICAvLyAgICAgICAgIHRoaXMuZ2V0Vmlld3BvcnQobmV4dFByb3BzLm1hcFN0YXRlKSxcbiAgICAvLyAgICAgICAgIG5leHRQcm9wcy5tYXBTdGF0ZS56b29tLFxuICAgIC8vICAgICAgICAgbmV4dFByb3BzLmZpbHRlcnNcbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICAgIHJlc3VsdC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIC8vICAgICAgICAgbmV4dFByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKG5leHRQcm9wcy5sYXllciwge1xuICAgIC8vICAgICAgICAgICBhcGlDYWxsTG9hZGVyOiBmYWxzZVxuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgICBuZXh0UHJvcHMudXBkYXRlTGF5ZXJEYXRhKG5leHRQcm9wcy5sYXllciwgcmVzdWx0KTtcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbkRlYm91bmNlKTtcbiAgICAvLyAgICAgICB0aGlzLmluRGVib3VuY2UgPSAwO1xuICAgIC8vICAgICB9LCAzMDApO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIGdldFZpZXdwb3J0KG1hcFN0YXRlKSB7XG4gICAgLy8gICBjb25zdCB7XG4gICAgLy8gICAgIGxvbmdpdHVkZSxcbiAgICAvLyAgICAgbGF0aXR1ZGUsXG4gICAgLy8gICAgIGhlaWdodCxcbiAgICAvLyAgICAgd2lkdGgsXG4gICAgLy8gICAgIHpvb20sXG4gICAgLy8gICAgIHBpdGNoLFxuICAgIC8vICAgICBiZWFyaW5nXG4gICAgLy8gICB9ID0gbWFwU3RhdGU7XG5cbiAgICAvLyAgIC8vIGxldCAgYm91bmRpbmdCb3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbXG4gICAgLy8gICAvLyAgICAgd2lkdGgsXG4gICAgLy8gICAvLyAgICAgaGVpZ2h0XG4gICAgLy8gICAvLyAgIF0pO1xuXG4gICAgLy8gICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAvLyAgICAgd2lkdGg6IHdpZHRoLFxuICAgIC8vICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAvLyAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgLy8gICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAvLyAgICAgem9vbTogem9vbSxcbiAgICAvLyAgICAgcGl0Y2g6IHBpdGNoLFxuICAgIC8vICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIGxldCBjVUwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIDBdKTtcbiAgICAvLyAgIGxldCBjVVIgPSB2aWV3cG9ydC51bnByb2plY3QoW3dpZHRoLCAwXSk7XG4gICAgLy8gICBsZXQgY0xSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgaGVpZ2h0XSk7XG4gICAgLy8gICBsZXQgY0xMID0gdmlld3BvcnQudW5wcm9qZWN0KFswLCBoZWlnaHRdKTtcblxuICAgIC8vICAgbGV0IGxhdFJhbmdlID0gWy4uLm5ldyBTZXQoW2NMTFsxXSwgY1VSWzFdLCBjTFJbMV0sIGNVTFsxXV0pXS5zb3J0KFxuICAgIC8vICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICAvLyAgICk7XG4gICAgLy8gICBsZXQgbG5nUmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzBdLCBjVVJbMF0sIGNMUlswXSwgY1VMWzBdXSldLnNvcnQoXG4gICAgLy8gICAgIChhLCBiKSA9PiBhIC0gYlxuICAgIC8vICAgKTtcbiAgICAvLyAgIHJldHVybiBbbG5nUmFuZ2VbMF0sIGxuZ1JhbmdlWzFdLCBsYXRSYW5nZVswXSwgbGF0UmFuZ2VbMV1dO1xuICAgIC8vIH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnByb3BzLmxheWVyLmNvbmZpZy5kYXRhSWQgJiZcbiAgICAgICAgbmV4dFByb3BzLmxheWVyLmNvbmZpZy5kYXRhSWQgJiZcbiAgICAgICAgdGhpcy5wcm9wcy5sYXllci5jb25maWcuZGF0YUlkICE9PSBuZXh0UHJvcHMubGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgKSB7XG4gICAgICAgIGlmIChsYXllci5uYW1lICE9PSAnYm91bmRhcnknICYmIGxheWVyLm5hbWUgIT09ICdwaW5jb2RlJykge1xuICAgICAgICAgIHRoaXMucHJvcHMubGF5ZXJDb25maWdDaGFuZ2UobmV4dFByb3BzLmxheWVyLCB7XG4gICAgICAgICAgICBhcGlDYWxsUmVxdWVzdDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUxheWVyQ29uZmlnID0gbmV3UHJvcCA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxheWVyQ29uZmlnQ2hhbmdlKHRoaXMucHJvcHMubGF5ZXIsIG5ld1Byb3ApO1xuICAgIH07XG5cbiAgICB1cGRhdGVMYXllclR5cGUgPSBuZXdUeXBlID0+IHtcbiAgICAgIHRoaXMucHJvcHMubGF5ZXJUeXBlQ2hhbmdlKHRoaXMucHJvcHMubGF5ZXIsIG5ld1R5cGUpO1xuICAgICAgLy8gdGhpcy5wcm9wcy5sYXllckNvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLmxheWVyLCB7YXBpQ2FsbFJlcXVlc3Q6IHRydWV9KTtcbiAgICB9O1xuXG4gICAgdXBkYXRlTGF5ZXJWaXNDb25maWcgPSBuZXdWaXNDb25maWcgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5sYXllclZpc0NvbmZpZ0NoYW5nZSh0aGlzLnByb3BzLmxheWVyLCBuZXdWaXNDb25maWcpO1xuICAgIH07XG5cbiAgICB1cGRhdGVMYXllckNvbG9yVUkgPSAoLi4uYXJncykgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5sYXllckNvbG9yVUlDaGFuZ2UodGhpcy5wcm9wcy5sYXllciwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHVwZGF0ZUxheWVyVGV4dExhYmVsID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHRoaXMucHJvcHMubGF5ZXJUZXh0TGFiZWxDaGFuZ2UodGhpcy5wcm9wcy5sYXllciwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIHVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZyA9IChuZXdDb25maWcsIGNoYW5uZWwsIHNjYWxlS2V5KSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShcbiAgICAgICAgdGhpcy5wcm9wcy5sYXllcixcbiAgICAgICAgbmV3Q29uZmlnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBzY2FsZUtleVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgX3VwZGF0ZUxheWVyTGFiZWwgPSAoe3RhcmdldDoge3ZhbHVlfX0pID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJDb25maWcoe2xhYmVsOiB2YWx1ZX0pO1xuICAgIH07XG5cbiAgICBfdG9nZ2xlVmlzaWJpbGl0eSA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9ICF0aGlzLnByb3BzLmxheWVyLmNvbmZpZy5pc1Zpc2libGU7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtpc1Zpc2libGV9KTtcbiAgICB9O1xuXG4gICAgX3RvZ2dsZUVuYWJsZUNvbmZpZyA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGF5ZXI6IHtcbiAgICAgICAgICBjb25maWc6IHtpc0NvbmZpZ0FjdGl2ZX1cbiAgICAgICAgfVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtpc0NvbmZpZ0FjdGl2ZTogIWlzQ29uZmlnQWN0aXZlfSk7XG4gICAgfTtcblxuICAgIF9yZW1vdmVMYXllciA9IGUgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMucHJvcHMucmVtb3ZlTGF5ZXIodGhpcy5wcm9wcy5pZHgpO1xuICAgIH07XG5cbiAgICAvLyBmaWx0ZXJMYXllck9wdGlvbnMgPSBbJ2dyaWQnLCAnaGV4YWdvbicsICdib3VuZGFyeSddO1xuICAgIGZpbHRlckxhcmdlRGF0YU9wdGlvbnMgPSBbXG4gICAgICAnYmFja2VuZFBvaW50JyxcbiAgICAgICdiYWNrZW5kR2VvanNvbicsXG4gICAgICAnZ2VvSGFzaCcsXG4gICAgICAnZHluYW1pYydcbiAgICBdO1xuICAgIGZpbHRlclNtYWxsRGF0YU9wdGlvbnMgPSBbJ2JhY2tlbmRQb2ludCcsICdiYWNrZW5kR2VvanNvbiddO1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2xheWVyLCBpZHgsIGRhdGFzZXRzLCB1cGRhdGVMYXllckRhdGF9ID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciB7bGF5ZXJUeXBlT3B0aW9uc30gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgbGFyZ2VEYXRhID1cbiAgICAgICAgZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0gJiYgbGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgICAgID8gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0uaXNMYXJnZUNhdGVnb3J5XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGxheWVyVHlwZU9wdGlvbnMgPVxuICAgICAgICBsYXJnZURhdGEgJiYgbGFyZ2VEYXRhID09PSB0cnVlXG4gICAgICAgICAgPyBsYXllclR5cGVPcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgbHRvID0+IHRoaXMuZmlsdGVyTGFyZ2VEYXRhT3B0aW9ucy5pbmRleE9mKGx0by5pZCkgPj0gMFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogbGF5ZXJUeXBlT3B0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgIGx0byA9PiB0aGlzLmZpbHRlclNtYWxsRGF0YU9wdGlvbnMuaW5kZXhPZihsdG8uaWQpID09PSAtMVxuICAgICAgICAgICAgKTtcbiAgICAgIGNvbnN0IHtjb25maWd9ID0gbGF5ZXI7XG4gICAgICBjb25zdCB7aXNDb25maWdBY3RpdmUsIGFwaUNhbGxMb2FkZXJ9ID0gY29uZmlnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFBhbmVsV3JhcHBlclxuICAgICAgICAgIGFjdGl2ZT17aXNDb25maWdBY3RpdmV9XG4gICAgICAgICAgY2xhc3NOYW1lPXtgbGF5ZXItcGFuZWwgJHt0aGlzLnByb3BzLmNsYXNzTmFtZX1gfVxuICAgICAgICAgIHN0eWxlPXt0aGlzLnByb3BzLnN0eWxlfVxuICAgICAgICAgIG9uTW91c2VEb3duPXt0aGlzLnByb3BzLm9uTW91c2VEb3dufVxuICAgICAgICAgIG9uVG91Y2hTdGFydD17dGhpcy5wcm9wcy5vblRvdWNoU3RhcnR9XG4gICAgICAgID5cbiAgICAgICAgICA8TGF5ZXJQYW5lbEhlYWRlclxuICAgICAgICAgICAgaXNDb25maWdBY3RpdmU9e2lzQ29uZmlnQWN0aXZlfVxuICAgICAgICAgICAgYXBpQ2FsbExvYWRlcj17YXBpQ2FsbExvYWRlcn1cbiAgICAgICAgICAgIGlkPXtsYXllci5pZH1cbiAgICAgICAgICAgIHNob3dMb2FkZXI9e2xheWVyLnNob3dMb2FkZXJ9XG4gICAgICAgICAgICBpZHg9e2lkeH1cbiAgICAgICAgICAgIGlzVmlzaWJsZT17Y29uZmlnLmlzVmlzaWJsZX1cbiAgICAgICAgICAgIGxhYmVsPXtjb25maWcubGFiZWx9XG4gICAgICAgICAgICBsYWJlbFJDR0NvbG9yVmFsdWVzPXtkYXRhc2V0c1tjb25maWcuZGF0YUlkXS5jb2xvcn1cbiAgICAgICAgICAgIGxheWVyVHlwZT17bGF5ZXIubmFtZX1cbiAgICAgICAgICAgIG9uVG9nZ2xlRW5hYmxlQ29uZmlnPXt0aGlzLl90b2dnbGVFbmFibGVDb25maWd9XG4gICAgICAgICAgICBvblRvZ2dsZVZpc2liaWxpdHk9e3RoaXMuX3RvZ2dsZVZpc2liaWxpdHl9XG4gICAgICAgICAgICBvblVwZGF0ZUxheWVyTGFiZWw9e3RoaXMuX3VwZGF0ZUxheWVyTGFiZWx9XG4gICAgICAgICAgICBvblJlbW92ZUxheWVyPXt0aGlzLl9yZW1vdmVMYXllcn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIHtpc0NvbmZpZ0FjdGl2ZSAmJiAoXG4gICAgICAgICAgICA8TGF5ZXJDb25maWd1cmF0b3JcbiAgICAgICAgICAgICAgbGF5ZXI9e2xheWVyfVxuICAgICAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyRGF0YT17dXBkYXRlTGF5ZXJEYXRhfVxuICAgICAgICAgICAgICBsYXllclR5cGVPcHRpb25zPXtsYXllclR5cGVPcHRpb25zfVxuICAgICAgICAgICAgICBvcGVuTW9kYWw9e3RoaXMucHJvcHMub3Blbk1vZGFsfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbG9yVUk9e3RoaXMudXBkYXRlTGF5ZXJDb2xvclVJfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllckNvbmZpZz17dGhpcy51cGRhdGVMYXllckNvbmZpZ31cbiAgICAgICAgICAgICAgdXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnPXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVHlwZT17dGhpcy51cGRhdGVMYXllclR5cGV9XG4gICAgICAgICAgICAgIHVwZGF0ZUxheWVyVGV4dExhYmVsPXt0aGlzLnVwZGF0ZUxheWVyVGV4dExhYmVsfVxuICAgICAgICAgICAgICB1cGRhdGVMYXllclZpc0NvbmZpZz17dGhpcy51cGRhdGVMYXllclZpc0NvbmZpZ31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9QYW5lbFdyYXBwZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBMYXllclBhbmVsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBMYXllclBhbmVsRmFjdG9yeTtcbiJdfQ==