kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
289 lines (233 loc) • 37.4 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 _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _uploadButton = _interopRequireDefault(require("./upload-button"));
var _icons = require("../icons");
var _loadingSpinner = _interopRequireDefault(require("../loading-spinner"));
var _utils = require("../../../utils/utils");
var _userGuides = require("../../../constants/user-guides");
var _reactMarkdown = _interopRequireDefault(require("react-markdown"));
var _mediaBreakpoints = require("../../../styles/media-breakpoints");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19;
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 FileDrop = typeof document !== "undefined" ? require("react-file-drop") : null; // File.type is not reliable if the OS does not have a
// registered mapping for the extension.
// NOTE: Shapefiles must be in a compressed format since
// it requires multiple files to be present.
var defaultValidFileExt = ["csv", "json", "geojson"];
var MESSAGE = " Drag & Drop Your File(s) Here";
var CHROME_MSG = "*Chrome user: Limit file size to 250mb, if need to upload larger file, try Safari";
var DISCLAIMER = "";
var CONFIG_UPLOAD_MESSAGE = "Upload **CSV**, **GeoJson** or saved map **Json**. Read more about [**supported file formats**](".concat(_userGuides.GUIDES_FILE_FORMAT, ").");
var fileIconColor = "#D3D8E0";
var LinkRenderer = function LinkRenderer(props) {
return (/*#__PURE__*/_react["default"].createElement("a", {
href: props.href,
target: "_blank",
rel: "noopener noreferrer"
}, props.children)
);
};
var StyledUploadMessage = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n\n ", "\n"])), function (props) {
return props.theme.textColorLT;
}, _mediaBreakpoints.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "]))));
var WarningMsg = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n font-weight: 500;\n"])), function (props) {
return props.theme.errorColor;
});
var PositiveMsg = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-block;\n color: ", ";\n font-weight: 500;\n margin-right: 8px;\n"])), function (props) {
return props.theme.primaryBtnActBgd;
});
var StyledFileDrop = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: dashed;\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n ", ";\n"])), function (props) {
return props.theme.subtextColorLT;
}, function (props) {
return props.theme.linkBtnColor;
}, _mediaBreakpoints.media.portable(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "]))));
var MsgWrapper = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"])), function (props) {
return props.theme.modalTitleColor;
});
var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n ", ";\n ", ";\n"])), fileIconColor, _mediaBreakpoints.media.portable(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _mediaBreakpoints.media.palm(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]))));
var StyledFileTypeFow = _styledComponents["default"].div(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"])), _mediaBreakpoints.media.portable(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _mediaBreakpoints.media.palm(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "]))));
var StyledFileUpload = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["\n .filter-upload__input {\n visibility: hidden;\n height: 0;\n position: absolute;\n }\n\n .file-drop {\n position: relative;\n }\n"])));
var StyledMessage = _styledComponents["default"].div(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 32px;\n\n .loading-action {\n margin-right: 10px;\n }\n .loading-spinner {\n margin-left: 10px;\n }\n"])));
var StyledDragFileWrapper = _styledComponents["default"].div(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", "\n"])), _mediaBreakpoints.media.portable(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]))), _mediaBreakpoints.media.portable(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))));
var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject19 || (_templateObject19 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"])));
var FileUpload = exports["default"] = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(FileUpload, _Component);
var _super = _createSuper(FileUpload);
function FileUpload() {
var _this;
(0, _classCallCheck2["default"])(this, FileUpload);
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", {
dragOver: false,
fileLoading: false,
files: [],
errorFiles: []
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "frame", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isValidFileType", function (filename) {
var validFileExt = _this.props.validFileExt;
var fileExt = validFileExt.find(function (ext) {
return filename.endsWith(ext);
});
return Boolean(fileExt);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFileInput", function (files, e) {
if (e) {
e.stopPropagation();
}
var nextState = {
files: [],
errorFiles: [],
dragOver: false
};
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file && _this._isValidFileType(file.name)) {
nextState.files.push(file);
} else {
nextState.errorFiles.push(file.name);
}
}
_this.setState(nextState, function () {
return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null;
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleDragState", function (newState) {
_this.setState({
dragOver: newState
});
});
return _this;
}
(0, _createClass2["default"])(FileUpload, [{
key: "_renderMessage",
value: function _renderMessage() {
var _this$state = this.state,
errorFiles = _this$state.errorFiles,
files = _this$state.files;
if (errorFiles.length) {
return (/*#__PURE__*/_react["default"].createElement(WarningMsg, null, "File ".concat(errorFiles.join(", "), " is not supported."))
);
} else if (this.props.fileLoading && files.length) {
return (/*#__PURE__*/_react["default"].createElement(StyledMessage, {
className: "file-uploader__message"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "loading-action"
}, "Uploading"), /*#__PURE__*/_react["default"].createElement("div", null, files.map(function (f, i) {
return (/*#__PURE__*/_react["default"].createElement(PositiveMsg, {
key: i
}, f.name)
);
}), "..."), /*#__PURE__*/_react["default"].createElement("div", {
className: "loading-spinner"
}, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], {
size: 20
})))
);
}
return null;
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$state2 = this.state,
dragOver = _this$state2.dragOver,
files = _this$state2.files;
var validFileExt = this.props.validFileExt;
return (/*#__PURE__*/_react["default"].createElement(StyledFileUpload, {
className: "file-uploader",
ref: this.frame
}, /*#__PURE__*/_react["default"].createElement("input", {
className: "filter-upload__input",
type: "file",
onChange: this._onChange
}), FileDrop ? /*#__PURE__*/_react["default"].createElement(FileDrop, {
frame: this.frame.current || document,
targetAlwaysVisible: true,
onDragOver: function onDragOver() {
return _this2._toggleDragState(true);
},
onDragLeave: function onDragLeave() {
return _this2._toggleDragState(false);
},
onDrop: this._handleFileInput
}, /*#__PURE__*/_react["default"].createElement(StyledUploadMessage, {
className: "file-upload__message"
}, /*#__PURE__*/_react["default"].createElement(_reactMarkdown["default"], {
source: CONFIG_UPLOAD_MESSAGE,
renderers: {
link: LinkRenderer
}
})), /*#__PURE__*/_react["default"].createElement(StyledFileDrop, {
dragOver: dragOver
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
opacity: dragOver ? 0.5 : 1
}
}, /*#__PURE__*/_react["default"].createElement(StyledDragNDropIcon, null, /*#__PURE__*/_react["default"].createElement(StyledFileTypeFow, {
className: "file-type-row"
}, validFileExt.map(function (ext) {
return (/*#__PURE__*/_react["default"].createElement(_icons.FileType, {
key: ext,
ext: ext,
height: "50px",
fontSize: "9px"
})
);
})), /*#__PURE__*/_react["default"].createElement(_icons.DragNDrop, {
height: "44px"
})), /*#__PURE__*/_react["default"].createElement("div", null, this._renderMessage())), !files.length ? /*#__PURE__*/_react["default"].createElement(StyledDragFileWrapper, null, /*#__PURE__*/_react["default"].createElement(MsgWrapper, null, MESSAGE), /*#__PURE__*/_react["default"].createElement("span", {
className: "file-upload-or"
}, "or"), /*#__PURE__*/_react["default"].createElement(_uploadButton["default"], {
onUpload: this._handleFileInput
}, "browse your files")) : null, /*#__PURE__*/_react["default"].createElement(StyledDisclaimer, null, DISCLAIMER))) : null, /*#__PURE__*/_react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? CHROME_MSG : ""))
);
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
if (state.fileLoading && props.fileLoading === false && state.files.length) {
return {
files: [],
fileLoading: props.fileLoading
};
}
return {
fileLoading: props.fileLoading
};
}
}]);
return FileUpload;
}(_react.Component);
(0, _defineProperty2["default"])(FileUpload, "propTypes", {
onFileUpload: _propTypes["default"].func.isRequired,
validFileExt: _propTypes["default"].arrayOf(_propTypes["default"].string),
fileLoading: _propTypes["default"].bool
});
(0, _defineProperty2["default"])(FileUpload, "defaultProps", {
validFileExt: defaultValidFileExt
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbIkZpbGVEcm9wIiwiZG9jdW1lbnQiLCJyZXF1aXJlIiwiZGVmYXVsdFZhbGlkRmlsZUV4dCIsIk1FU1NBR0UiLCJDSFJPTUVfTVNHIiwiRElTQ0xBSU1FUiIsIkNPTkZJR19VUExPQURfTUVTU0FHRSIsIkdVSURFU19GSUxFX0ZPUk1BVCIsImZpbGVJY29uQ29sb3IiLCJMaW5rUmVuZGVyZXIiLCJwcm9wcyIsImhyZWYiLCJjaGlsZHJlbiIsIlN0eWxlZFVwbG9hZE1lc3NhZ2UiLCJzdHlsZWQiLCJkaXYiLCJ0aGVtZSIsInRleHRDb2xvckxUIiwibWVkaWEiLCJwb3J0YWJsZSIsIldhcm5pbmdNc2ciLCJzcGFuIiwiZXJyb3JDb2xvciIsIlBvc2l0aXZlTXNnIiwicHJpbWFyeUJ0bkFjdEJnZCIsIlN0eWxlZEZpbGVEcm9wIiwic3VidGV4dENvbG9yTFQiLCJsaW5rQnRuQ29sb3IiLCJNc2dXcmFwcGVyIiwibW9kYWxUaXRsZUNvbG9yIiwiU3R5bGVkRHJhZ05Ecm9wSWNvbiIsInBhbG0iLCJTdHlsZWRGaWxlVHlwZUZvdyIsIlN0eWxlZEZpbGVVcGxvYWQiLCJTdHlsZWRNZXNzYWdlIiwiU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyIiwiU3R5bGVkRGlzY2xhaW1lciIsIkZpbGVVcGxvYWQiLCJkcmFnT3ZlciIsImZpbGVMb2FkaW5nIiwiZmlsZXMiLCJlcnJvckZpbGVzIiwiZmlsZW5hbWUiLCJ2YWxpZEZpbGVFeHQiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiQm9vbGVhbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJuZXh0U3RhdGUiLCJpIiwibGVuZ3RoIiwiZmlsZSIsIl9pc1ZhbGlkRmlsZVR5cGUiLCJuYW1lIiwicHVzaCIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJzdGF0ZSIsImpvaW4iLCJtYXAiLCJmIiwiZnJhbWUiLCJfb25DaGFuZ2UiLCJjdXJyZW50IiwiX3RvZ2dsZURyYWdTdGF0ZSIsIl9oYW5kbGVGaWxlSW5wdXQiLCJsaW5rIiwib3BhY2l0eSIsIl9yZW5kZXJNZXNzYWdlIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJhcnJheU9mIiwic3RyaW5nIiwiYm9vbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxRQUFRLEdBQ1osT0FBT0MsUUFBUCxLQUFvQixXQUFwQixHQUFrQ0MsT0FBTyxDQUFDLGlCQUFELENBQXpDLEdBQStELElBRGpFLEMsQ0FHQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxJQUFNQyxtQkFBbUIsR0FBRyxDQUFDLEtBQUQsRUFBUSxNQUFSLEVBQWdCLFNBQWhCLENBQTVCO0FBRUEsSUFBTUMsT0FBTyxHQUFHLGdDQUFoQjtBQUNBLElBQU1DLFVBQVUsR0FDZCxtRkFERjtBQUVBLElBQU1DLFVBQVUsR0FBRyxFQUFuQjtBQUNBLElBQU1DLHFCQUFxQiw2R0FBc0dDLDhCQUF0RyxPQUEzQjtBQUVBLElBQU1DLGFBQWEsR0FBRyxTQUF0Qjs7QUFFQSxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFBQyxLQUFLLEVBQUk7QUFDNUIsdUJBQ0U7QUFBRyxNQUFBLElBQUksRUFBRUEsS0FBSyxDQUFDQyxJQUFmO0FBQXFCLE1BQUEsTUFBTSxFQUFDLFFBQTVCO0FBQXFDLE1BQUEsR0FBRyxFQUFDO0FBQXpDLE9BQ0dELEtBQUssQ0FBQ0UsUUFEVDtBQURGO0FBS0QsQ0FORDs7QUFPQSxJQUFNQyxtQkFBbUIsR0FBR0MsNkJBQU9DLEdBQVYsK0pBQ2QsVUFBQUwsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ00sS0FBTixDQUFZQyxXQUFo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Q0xiLFVBQUFBLEtBQUssRUFBRSxFQURGO0FBRUxELFVBQUFBLFdBQVcsRUFBRTdCLEtBQUssQ0FBQzZCO0FBRmQsU0FBUDtBQUlEOztBQUNELGFBQU87QUFDTEEsUUFBQUEsV0FBVyxFQUFFN0IsS0FBSyxDQUFDNkI7QUFEZCxPQUFQO0FBR0Q7OztFQWhDcUNrQyxnQjs7aUNBQW5CcEMsVSxlQUNBO0FBQ2pCc0IsRUFBQUEsWUFBWSxFQUFFZSxzQkFBVUMsSUFBVixDQUFlQyxVQURaO0FBRWpCakMsRUFBQUEsWUFBWSxFQUFFK0Isc0JBQVVHLE9BQVYsQ0FBa0JILHNCQUFVSSxNQUE1QixDQUZHO0FBR2pCdkMsRUFBQUEsV0FBVyxFQUFFbUMsc0JBQVVLO0FBSE4sQztpQ0FEQTFDLFUsa0JBT0c7QUFDcEJNLEVBQUFBLFlBQVksRUFBRXpDO0FBRE0sQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcblxuaW1wb3J0IFVwbG9hZEJ1dHRvbiBmcm9tIFwiLi91cGxvYWQtYnV0dG9uXCI7XG5pbXBvcnQgeyBGaWxlVHlwZSwgRHJhZ05Ecm9wIH0gZnJvbSBcImNvbXBvbmVudHMvY29tbW9uL2ljb25zXCI7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSBcImNvbXBvbmVudHMvY29tbW9uL2xvYWRpbmctc3Bpbm5lclwiO1xuaW1wb3J0IHsgaXNDaHJvbWUgfSBmcm9tIFwidXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEdVSURFU19GSUxFX0ZPUk1BVCB9IGZyb20gXCJjb25zdGFudHMvdXNlci1ndWlkZXNcIjtcbmltcG9ydCBSZWFjdE1hcmtkb3duIGZyb20gXCJyZWFjdC1tYXJrZG93blwiO1xuXG4vLyBCcmVha3BvaW50c1xuaW1wb3J0IHsgbWVkaWEgfSBmcm9tIFwic3R5bGVzL21lZGlhLWJyZWFrcG9pbnRzXCI7XG5cbmNvbnN0IEZpbGVEcm9wID1cbiAgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gcmVxdWlyZShcInJlYWN0LWZpbGUtZHJvcFwiKSA6IG51bGw7XG5cbi8vIEZpbGUudHlwZSBpcyBub3QgcmVsaWFibGUgaWYgdGhlIE9TIGRvZXMgbm90IGhhdmUgYVxuLy8gcmVnaXN0ZXJlZCBtYXBwaW5nIGZvciB0aGUgZXh0ZW5zaW9uLlxuLy8gTk9URTogU2hhcGVmaWxlcyBtdXN0IGJlIGluIGEgY29tcHJlc3NlZCBmb3JtYXQgc2luY2Vcbi8vIGl0IHJlcXVpcmVzIG11bHRpcGxlIGZpbGVzIHRvIGJlIHByZXNlbnQuXG5jb25zdCBkZWZhdWx0VmFsaWRGaWxlRXh0ID0gW1wiY3N2XCIsIFwianNvblwiLCBcImdlb2pzb25cIl07XG5cbmNvbnN0IE1FU1NBR0UgPSBcIiBEcmFnICYgRHJvcCBZb3VyIEZpbGUocykgSGVyZVwiO1xuY29uc3QgQ0hST01FX01TRyA9XG4gIFwiKkNocm9tZSB1c2VyOiBMaW1pdCBmaWxlIHNpemUgdG8gMjUwbWIsIGlmIG5lZWQgdG8gdXBsb2FkIGxhcmdlciBmaWxlLCB0cnkgU2FmYXJpXCI7XG5jb25zdCBESVNDTEFJTUVSID0gXCJcIlxuY29uc3QgQ09ORklHX1VQTE9BRF9NRVNTQUdFID0gYFVwbG9hZCAqKkNTVioqLCAqKkdlb0pzb24qKiBvciBzYXZlZCBtYXAgKipKc29uKiouIFJlYWQgbW9yZSBhYm91dCBbKipzdXBwb3J0ZWQgZmlsZSBmb3JtYXRzKipdKCR7R1VJREVTX0ZJTEVfRk9STUFUfSkuYDtcblxuY29uc3QgZmlsZUljb25Db2xvciA9IFwiI0QzRDhFMFwiO1xuXG5jb25zdCBMaW5rUmVuZGVyZXIgPSBwcm9wcyA9PiB7XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17cHJvcHMuaHJlZn0gdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgIDwvYT5cbiAgKTtcbn07XG5jb25zdCBTdHlsZWRVcGxvYWRNZXNzYWdlID0gc3R5bGVkLmRpdmBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yTFR9O1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG5cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBmb250LXNpemU6IDEycHg7XG4gIGB9XG5gO1xuXG5jb25zdCBXYXJuaW5nTXNnID0gc3R5bGVkLnNwYW5gXG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVycm9yQ29sb3J9O1xuICBmb250LXdlaWdodDogNTAwO1xuYDtcblxuY29uc3QgUG9zaXRpdmVNc2cgPSBzdHlsZWQuc3BhbmBcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wcmltYXJ5QnRuQWN0QmdkfTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRGaWxlRHJvcCA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1zdHlsZTogZGFzaGVkO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckxUfTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogNDhweCA4cHggMDtcblxuICAuZmlsZS11cGxvYWQtb3Ige1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICB9XG5cbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBwYWRkaW5nOiAxNnB4IDRweCAwO1xuICBgfTtcbmA7XG5cbmNvbnN0IE1zZ1dyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tb2RhbFRpdGxlQ29sb3J9O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGhlaWdodDogMzZweDtcbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdORHJvcEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtmaWxlSWNvbkNvbG9yfTtcbiAgbWFyZ2luLWJvdHRvbTogNDhweDtcblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVUeXBlRm93ID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfTtcbiAgJHttZWRpYS5wYWxtYFxuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgYH07XG5gO1xuXG5jb25zdCBTdHlsZWRGaWxlVXBsb2FkID0gc3R5bGVkLmRpdmBcbiAgLmZpbHRlci11cGxvYWRfX2lucHV0IHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgfVxuXG4gIC5maWxlLWRyb3Age1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAzMnB4O1xuXG4gIC5sb2FkaW5nLWFjdGlvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICB9XG4gIC5sb2FkaW5nLXNwaW5uZXIge1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREcmFnRmlsZVdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAzMnB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gIGB9O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9XG5gO1xuXG5jb25zdCBTdHlsZWREaXNjbGFpbWVyID0gc3R5bGVkKFN0eWxlZE1lc3NhZ2UpYFxuICBtYXJnaW46IDAgYXV0bztcbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVVcGxvYWQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIG9uRmlsZVVwbG9hZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB2YWxpZEZpbGVFeHQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICAgIGZpbGVMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsaWRGaWxlRXh0OiBkZWZhdWx0VmFsaWRGaWxlRXh0XG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgZHJhZ092ZXI6IGZhbHNlLFxuICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICBmaWxlczogW10sXG4gICAgZXJyb3JGaWxlczogW11cbiAgfTtcblxuICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIGlmIChcbiAgICAgIHN0YXRlLmZpbGVMb2FkaW5nICYmXG4gICAgICBwcm9wcy5maWxlTG9hZGluZyA9PT0gZmFsc2UgJiZcbiAgICAgIHN0YXRlLmZpbGVzLmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZXM6IFtdLFxuICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICB9O1xuICB9XG5cbiAgZnJhbWUgPSBjcmVhdGVSZWYoKTtcblxuICBfaXNWYWxpZEZpbGVUeXBlID0gZmlsZW5hbWUgPT4ge1xuICAgIGNvbnN0IHsgdmFsaWRGaWxlRXh0IH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGZpbGVFeHQgPSB2YWxpZEZpbGVFeHQuZmluZChleHQgPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSk7XG5cbiAgICByZXR1cm4gQm9vbGVhbihmaWxlRXh0KTtcbiAgfTtcblxuICBfaGFuZGxlRmlsZUlucHV0ID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgaWYgKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFN0YXRlID0geyBmaWxlczogW10sIGVycm9yRmlsZXM6IFtdLCBkcmFnT3ZlcjogZmFsc2UgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG5cbiAgICAgIGlmIChmaWxlICYmIHRoaXMuX2lzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgIG5leHRTdGF0ZS5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFN0YXRlLmVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgbmV4dFN0YXRlLmZpbGVzLmxlbmd0aCA/IHRoaXMucHJvcHMub25GaWxlVXBsb2FkKG5leHRTdGF0ZS5maWxlcykgOiBudWxsXG4gICAgKTtcbiAgfTtcblxuICBfdG9nZ2xlRHJhZ1N0YXRlID0gbmV3U3RhdGUgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBkcmFnT3ZlcjogbmV3U3RhdGUgfSk7XG4gIH07XG5cbiAgX3JlbmRlck1lc3NhZ2UoKSB7XG4gICAgY29uc3QgeyBlcnJvckZpbGVzLCBmaWxlcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBpZiAoZXJyb3JGaWxlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxXYXJuaW5nTXNnPlxuICAgICAgICAgIHtgRmlsZSAke2Vycm9yRmlsZXMuam9pbihcIiwgXCIpfSBpcyBub3Qgc3VwcG9ydGVkLmB9XG4gICAgICAgIDwvV2FybmluZ01zZz5cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmZpbGVMb2FkaW5nICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fbWVzc2FnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1hY3Rpb25cIj5VcGxvYWRpbmc8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAge2ZpbGVzLm1hcCgoZiwgaSkgPT4gKFxuICAgICAgICAgICAgICA8UG9zaXRpdmVNc2cga2V5PXtpfT57Zi5uYW1lfTwvUG9zaXRpdmVNc2c+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICAgIC4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1zcGlubmVyXCI+XG4gICAgICAgICAgICA8TG9hZGluZ1NwaW5uZXIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3R5bGVkTWVzc2FnZT5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBkcmFnT3ZlciwgZmlsZXMgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyB2YWxpZEZpbGVFeHQgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEZpbGVVcGxvYWQgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlclwiIHJlZj17dGhpcy5mcmFtZX0+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGNsYXNzTmFtZT1cImZpbHRlci11cGxvYWRfX2lucHV0XCJcbiAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uQ2hhbmdlfVxuICAgICAgICAvPlxuICAgICAgICB7RmlsZURyb3AgPyAoXG4gICAgICAgICAgPEZpbGVEcm9wXG4gICAgICAgICAgICBmcmFtZT17dGhpcy5mcmFtZS5jdXJyZW50IHx8IGRvY3VtZW50fVxuICAgICAgICAgICAgdGFyZ2V0QWx3YXlzVmlzaWJsZVxuICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgb25EcmFnTGVhdmU9eygpID0+IHRoaXMuX3RvZ2dsZURyYWdTdGF0ZShmYWxzZSl9XG4gICAgICAgICAgICBvbkRyb3A9e3RoaXMuX2hhbmRsZUZpbGVJbnB1dH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8U3R5bGVkVXBsb2FkTWVzc2FnZSBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZF9fbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8UmVhY3RNYXJrZG93blxuICAgICAgICAgICAgICAgIHNvdXJjZT17Q09ORklHX1VQTE9BRF9NRVNTQUdFfVxuICAgICAgICAgICAgICAgIHJlbmRlcmVycz17eyBsaW5rOiBMaW5rUmVuZGVyZXIgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkTWVzc2FnZT5cbiAgICAgICAgICAgIDxTdHlsZWRGaWxlRHJvcCBkcmFnT3Zlcj17ZHJhZ092ZXJ9PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IG9wYWNpdHk6IGRyYWdPdmVyID8gMC41IDogMSB9fT5cbiAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ05Ecm9wSWNvbj5cbiAgICAgICAgICAgICAgICAgIDxTdHlsZWRGaWxlVHlwZUZvdyBjbGFzc05hbWU9XCJmaWxlLXR5cGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIHt2YWxpZEZpbGVFeHQubWFwKGV4dCA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpbGVUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2V4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dD17ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiNTBweFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT1cIjlweFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEZpbGVUeXBlRm93PlxuICAgICAgICAgICAgICAgICAgPERyYWdORHJvcCBoZWlnaHQ9XCI0NHB4XCIgLz5cbiAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdORHJvcEljb24+XG4gICAgICAgICAgICAgICAgPGRpdj57dGhpcy5fcmVuZGVyTWVzc2FnZSgpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgeyFmaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgPFN0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxNc2dXcmFwcGVyPntNRVNTQUdFfTwvTXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkLW9yXCI+b3I8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8VXBsb2FkQnV0dG9uIG9uVXBsb2FkPXt0aGlzLl9oYW5kbGVGaWxlSW5wdXR9PlxuICAgICAgICAgICAgICAgICAgICBicm93c2UgeW91ciBmaWxlc1xuICAgICAgICAgICAgICAgICAgPC9VcGxvYWRCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWREcmFnRmlsZVdyYXBwZXI+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8U3R5bGVkRGlzY2xhaW1lcj57RElTQ0xBSU1FUn08L1N0eWxlZERpc2NsYWltZXI+XG4gICAgICAgICAgICA8L1N0eWxlZEZpbGVEcm9wPlxuICAgICAgICAgIDwvRmlsZURyb3A+XG4gICAgICAgICkgOiBudWxsfVxuXG4gICAgICAgIDxXYXJuaW5nTXNnPntpc0Nocm9tZSgpID8gQ0hST01FX01TRyA6IFwiXCJ9PC9XYXJuaW5nTXNnPlxuICAgICAgPC9TdHlsZWRGaWxlVXBsb2FkPlxuICAgICk7XG4gIH1cbn1cbiJdfQ==