UNPKG

kepler.gl

Version:

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

244 lines (242 loc) 48.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.WarningMsg = exports.FileUpload = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _reactIntl = require("react-intl"); var _uploadButton = _interopRequireDefault(require("./upload-button")); var _icons = require("../icons"); var _fileUploadProgress = _interopRequireDefault(require("./file-upload-progress")); var _fileDrop = _interopRequireDefault(require("./file-drop")); var _utils = require("@kepler.gl/utils"); var _constants = require("@kepler.gl/constants"); var _reactMarkdown = _interopRequireDefault(require("react-markdown")); var _localization = require("@kepler.gl/localization"); var _styles = require("@kepler.gl/styles"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // Breakpoints function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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; }, _styles.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 12px;\n "])))); var WarningMsg = exports.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 StyledFileDrop = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: ", ";\n border-width: 1px;\n border-color: ", ";\n text-align: center;\n width: 100%;\n padding: 48px 8px 0;\n height: 360px;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n\n .file-type-row {\n opacity: 0.5;\n }\n ", ";\n"])), function (props) { return props.dragOver ? 'solid' : 'dashed'; }, function (props) { return props.dragOver ? props.theme.textColorLT : props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }, _styles.media.portable(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 16px 4px 0;\n "])))); var MsgWrapper = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"])), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 48px;\n\n display: flex;\n justify-content: center;\n\n ", ";\n ", ";\n"])), fileIconColor, _styles.media.portable(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _styles.media.palm(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileTypeFow = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n ", ";\n ", ";\n"])), _styles.media.portable(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "]))), _styles.media.palm(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n "])))); var StyledFileUpload = _styledComponents["default"].div(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n .file-drop {\n position: relative;\n }\n"]))); var StyledMessage = _styledComponents["default"].div(_templateObject14 || (_templateObject14 = (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(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 32px;\n ", ";\n ", ";\n"])), _styles.media.portable(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 24px;\n "]))), _styles.media.portable(_templateObject17 || (_templateObject17 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 16px;\n "])))); var StyledDisclaimer = (0, _styledComponents["default"])(StyledMessage)(_templateObject18 || (_templateObject18 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 auto;\n"]))); function FileUploadFactory() { /** @augments {Component<FileUploadProps>} */ var FileUpload = /*#__PURE__*/function (_Component) { 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 = _callSuper(this, FileUpload, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { dragOver: false, fileLoading: false, files: [], errorFiles: [] }); (0, _defineProperty2["default"])(_this, "frame", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "_isValidFileType", function (filename) { var _this$props$fileExten = _this.props.fileExtensions, fileExtensions = _this$props$fileExten === void 0 ? [] : _this$props$fileExten; var fileExt = fileExtensions.find(function (ext) { return filename.endsWith(ext); }); return Boolean(fileExt); }); /** @param {FileList} fileList */ (0, _defineProperty2["default"])(_this, "_handleFileInput", function (fileList, event) { if (event) { event.stopPropagation(); } var files = (0, _toConsumableArray2["default"])(fileList).filter(Boolean); var _this$props$disableEx = _this.props.disableExtensionFilter, disableExtensionFilter = _this$props$disableEx === void 0 ? false : _this$props$disableEx; // TODO - move this code out of the component var filesToLoad = []; var errorFiles = []; var _iterator = _createForOfIteratorHelper(files), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var file = _step.value; if (disableExtensionFilter || _this._isValidFileType(file.name)) { filesToLoad.push(file); } else { errorFiles.push(file.name); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var nextState = { files: filesToLoad, errorFiles: errorFiles, dragOver: false }; _this.setState(nextState, function () { return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null; }); }); (0, _defineProperty2["default"])(_this, "_toggleDragState", function (newState) { _this.setState({ dragOver: newState }); }); return _this; } (0, _inherits2["default"])(FileUpload, _Component); return (0, _createClass2["default"])(FileUpload, [{ key: "render", value: function render() { var _this2 = this; var _this$state = this.state, dragOver = _this$state.dragOver, files = _this$state.files, errorFiles = _this$state.errorFiles; var _this$props = this.props, fileLoading = _this$props.fileLoading, fileLoadingProgress = _this$props.fileLoadingProgress, theme = _this$props.theme, intl = _this$props.intl; var _this$props2 = this.props, _this$props2$fileExte = _this$props2.fileExtensions, fileExtensions = _this$props2$fileExte === void 0 ? [] : _this$props2$fileExte, _this$props2$fileForm = _this$props2.fileFormatNames, fileFormatNames = _this$props2$fileForm === void 0 ? [] : _this$props2$fileForm; var fileUploadInfoText = "".concat(intl.formatMessage({ id: 'fileUploader.configUploadMessage' }, { fileFormatNames: fileFormatNames.map(function (format) { return "**".concat(format, "**"); }).join(', ') }), "(").concat(_constants.GUIDES_FILE_FORMAT_DOC, ")."); return /*#__PURE__*/_react["default"].createElement(StyledFileUpload, { className: "file-uploader", ref: this.frame }, _fileDrop["default"] ? /*#__PURE__*/_react["default"].createElement(_fileDrop["default"], { frame: this.frame.current || document, onDragOver: function onDragOver() { return _this2._toggleDragState(true); }, onDragLeave: function onDragLeave() { return _this2._toggleDragState(false); }, onDrop: this._handleFileInput, className: "file-uploader__file-drop" }, /*#__PURE__*/_react["default"].createElement(StyledUploadMessage, { className: "file-upload__message" }, /*#__PURE__*/_react["default"].createElement(_reactMarkdown["default"], { components: { a: LinkRenderer } }, fileUploadInfoText)), /*#__PURE__*/_react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, /*#__PURE__*/_react["default"].createElement(StyledFileTypeFow, { className: "file-type-row" }, fileExtensions.map(function (ext) { return /*#__PURE__*/_react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }); })), fileLoading ? /*#__PURE__*/_react["default"].createElement(_fileUploadProgress["default"], { fileLoadingProgress: fileLoadingProgress, theme: theme }) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 }, className: "file-upload-display-message" }, /*#__PURE__*/_react["default"].createElement(StyledDragNDropIcon, null, /*#__PURE__*/_react["default"].createElement(_icons.DragNDrop, { height: "44px" })), errorFiles.length ? /*#__PURE__*/_react["default"].createElement(WarningMsg, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.fileNotSupported', values: { errorFiles: errorFiles.join(', ') } })) : null), !files.length ? /*#__PURE__*/_react["default"].createElement(StyledDragFileWrapper, null, /*#__PURE__*/_react["default"].createElement(MsgWrapper, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.message' })), /*#__PURE__*/_react["default"].createElement("span", { className: "file-upload-or" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.or' })), /*#__PURE__*/_react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileInput }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.browseFiles' }))) : null, /*#__PURE__*/_react["default"].createElement(StyledDisclaimer, null, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.disclaimer' }))))) : null, /*#__PURE__*/_react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'fileUploader.chromeMessage' }) : '')); } }], [{ 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 }; } }]); }(_react.Component); return (0, _reactIntl.injectIntl)(FileUpload); } var _default = exports["default"] = FileUploadFactory; var FileUpload = exports.FileUpload = FileUploadFactory(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX3VwbG9hZEJ1dHRvbiIsIl9pY29ucyIsIl9maWxlVXBsb2FkUHJvZ3Jlc3MiLCJfZmlsZURyb3AiLCJfdXRpbHMiLCJfY29uc3RhbnRzIiwiX3JlYWN0TWFya2Rvd24iLCJfbG9jYWxpemF0aW9uIiwiX3N0eWxlcyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX3RlbXBsYXRlT2JqZWN0NyIsIl90ZW1wbGF0ZU9iamVjdDgiLCJfdGVtcGxhdGVPYmplY3Q5IiwiX3RlbXBsYXRlT2JqZWN0MTAiLCJfdGVtcGxhdGVPYmplY3QxMSIsIl90ZW1wbGF0ZU9iamVjdDEyIiwiX3RlbXBsYXRlT2JqZWN0MTMiLCJfdGVtcGxhdGVPYmplY3QxNCIsIl90ZW1wbGF0ZU9iamVjdDE1IiwiX3RlbXBsYXRlT2JqZWN0MTYiLCJfdGVtcGxhdGVPYmplY3QxNyIsIl90ZW1wbGF0ZU9iamVjdDE4IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiZmlsZUljb25Db2xvciIsIkxpbmtSZW5kZXJlciIsInByb3BzIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJ0YXJnZXQiLCJyZWwiLCJjaGlsZHJlbiIsIlN0eWxlZFVwbG9hZE1lc3NhZ2UiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInRoZW1lIiwidGV4dENvbG9yTFQiLCJtZWRpYSIsInBvcnRhYmxlIiwiV2FybmluZ01zZyIsImV4cG9ydHMiLCJzcGFuIiwiZXJyb3JDb2xvciIsIlN0eWxlZEZpbGVEcm9wIiwiZHJhZ092ZXIiLCJzdWJ0ZXh0Q29sb3JMVCIsImxpbmtCdG5Db2xvciIsIk1zZ1dyYXBwZXIiLCJtb2RhbFRpdGxlQ29sb3IiLCJTdHlsZWREcmFnTkRyb3BJY29uIiwicGFsbSIsIlN0eWxlZEZpbGVUeXBlRm93IiwiU3R5bGVkRmlsZVVwbG9hZCIsIlN0eWxlZE1lc3NhZ2UiLCJTdHlsZWREcmFnRmlsZVdyYXBwZXIiLCJTdHlsZWREaXNjbGFpbWVyIiwiRmlsZVVwbG9hZEZhY3RvcnkiLCJGaWxlVXBsb2FkIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmd1bWVudHMiLCJhcmdzIiwiX2tleSIsImNvbmNhdCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJmaWxlTG9hZGluZyIsImZpbGVzIiwiZXJyb3JGaWxlcyIsImNyZWF0ZVJlZiIsImZpbGVuYW1lIiwiX3RoaXMkcHJvcHMkZmlsZUV4dGVuIiwiZmlsZUV4dGVuc2lvbnMiLCJmaWxlRXh0IiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiZmlsZUxpc3QiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJmaWx0ZXIiLCJfdGhpcyRwcm9wcyRkaXNhYmxlRXgiLCJkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyIiwiZmlsZXNUb0xvYWQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImZpbGUiLCJfaXNWYWxpZEZpbGVUeXBlIiwicHVzaCIsImVyciIsIm5leHRTdGF0ZSIsInNldFN0YXRlIiwib25GaWxlVXBsb2FkIiwibmV3U3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInJlbmRlciIsIl90aGlzMiIsIl90aGlzJHN0YXRlIiwic3RhdGUiLCJfdGhpcyRwcm9wcyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJpbnRsIiwiX3RoaXMkcHJvcHMyIiwiX3RoaXMkcHJvcHMyJGZpbGVFeHRlIiwiX3RoaXMkcHJvcHMyJGZpbGVGb3JtIiwiZmlsZUZvcm1hdE5hbWVzIiwiZmlsZVVwbG9hZEluZm9UZXh0IiwiZm9ybWF0TWVzc2FnZSIsImlkIiwibWFwIiwiZm9ybWF0Iiwiam9pbiIsIkdVSURFU19GSUxFX0ZPUk1BVF9ET0MiLCJjbGFzc05hbWUiLCJyZWYiLCJmcmFtZSIsIkZpbGVEcm9wIiwiY3VycmVudCIsImRvY3VtZW50Iiwib25EcmFnT3ZlciIsIl90b2dnbGVEcmFnU3RhdGUiLCJvbkRyYWdMZWF2ZSIsIm9uRHJvcCIsIl9oYW5kbGVGaWxlSW5wdXQiLCJjb21wb25lbnRzIiwiRmlsZVR5cGUiLCJoZWlnaHQiLCJmb250U2l6ZSIsIkZyYWdtZW50Iiwic3R5bGUiLCJvcGFjaXR5IiwiRHJhZ05Ecm9wIiwiRm9ybWF0dGVkTWVzc2FnZSIsInZhbHVlcyIsIm9uVXBsb2FkIiwiaXNDaHJvbWUiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJDb21wb25lbnQiLCJpbmplY3RJbnRsIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL2ZpbGUtdXBsb2FkZXIvZmlsZS11cGxvYWQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7aW5qZWN0SW50bCwgV3JhcHBlZENvbXBvbmVudFByb3BzfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCBVcGxvYWRCdXR0b24gZnJvbSAnLi91cGxvYWQtYnV0dG9uJztcbmltcG9ydCB7RHJhZ05Ecm9wLCBGaWxlVHlwZX0gZnJvbSAnLi4vaWNvbnMnO1xuaW1wb3J0IEZpbGVVcGxvYWRQcm9ncmVzcyBmcm9tICcuL2ZpbGUtdXBsb2FkLXByb2dyZXNzJztcbmltcG9ydCBGaWxlRHJvcCBmcm9tICcuL2ZpbGUtZHJvcCc7XG5pbXBvcnQge0ZpbGVMb2FkaW5nLCBGaWxlTG9hZGluZ1Byb2dyZXNzfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuaW1wb3J0IHtpc0Nocm9tZX0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge0dVSURFU19GSUxFX0ZPUk1BVF9ET0N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBSZWFjdE1hcmtkb3duIGZyb20gJ3JlYWN0LW1hcmtkb3duJztcbi8vIEJyZWFrcG9pbnRzXG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7bWVkaWF9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcblxuY29uc3QgZmlsZUljb25Db2xvciA9ICcjRDNEOEUwJztcblxuY29uc3QgTGlua1JlbmRlcmVyID0gcHJvcHMgPT4ge1xuICByZXR1cm4gKFxuICAgIDxhIGhyZWY9e3Byb3BzLmhyZWZ9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L2E+XG4gICk7XG59O1xuY29uc3QgU3R5bGVkVXBsb2FkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgZm9udC1zaXplOiAxMnB4O1xuICBgfTtcbmA7XG5cbmV4cG9ydCBjb25zdCBXYXJuaW5nTXNnID0gc3R5bGVkLnNwYW5gXG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVycm9yQ29sb3J9O1xuICBmb250LXdlaWdodDogNTAwO1xuYDtcblxuaW50ZXJmYWNlIFN0eWxlZEZpbGVEcm9wUHJvcHMge1xuICBkcmFnT3Zlcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IFN0eWxlZEZpbGVEcm9wID0gc3R5bGVkLmRpdjxTdHlsZWRGaWxlRHJvcFByb3BzPmBcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXN0eWxlOiAke3Byb3BzID0+IChwcm9wcy5kcmFnT3ZlciA/ICdzb2xpZCcgOiAnZGFzaGVkJyl9O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiAke3Byb3BzID0+IChwcm9wcy5kcmFnT3ZlciA/IHByb3BzLnRoZW1lLnRleHRDb2xvckxUIDogcHJvcHMudGhlbWUuc3VidGV4dENvbG9yTFQpfTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogNDhweCA4cHggMDtcbiAgaGVpZ2h0OiAzNjBweDtcblxuICAuZmlsZS11cGxvYWQtb3Ige1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gICAgcGFkZGluZy1yaWdodDogNHB4O1xuICB9XG5cbiAgLmZpbGUtdHlwZS1yb3cge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIHBhZGRpbmc6IDE2cHggNHB4IDA7XG4gIGB9O1xuYDtcblxuY29uc3QgTXNnV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsVGl0bGVDb2xvcn07XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgaGVpZ2h0OiAzNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkRHJhZ05Ecm9wSWNvbiA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke2ZpbGVJY29uQ29sb3J9O1xuICBtYXJnaW4tYm90dG9tOiA0OHB4O1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gICR7bWVkaWEucG9ydGFibGVgXG4gICAgbWFyZ2luLWJvdHRvbTogMTZweDtcbiAgYH07XG4gICR7bWVkaWEucGFsbWBcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gIGB9O1xuYDtcblxuY29uc3QgU3R5bGVkRmlsZVR5cGVGb3cgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGB9O1xuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZEZpbGVVcGxvYWQgPSBzdHlsZWQuZGl2YFxuICAuZmlsZS1kcm9wIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZE1lc3NhZ2UgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcblxuICAubG9hZGluZy1hY3Rpb24ge1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgfVxuICAubG9hZGluZy1zcGlubmVyIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWJvdHRvbTogMzJweDtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuICBgfTtcbiAgJHttZWRpYS5wb3J0YWJsZWBcbiAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICBgfTtcbmA7XG5cbmNvbnN0IFN0eWxlZERpc2NsYWltZXIgPSBzdHlsZWQoU3R5bGVkTWVzc2FnZSlgXG4gIG1hcmdpbjogMCBhdXRvO1xuYDtcblxudHlwZSBGaWxlVXBsb2FkUHJvcHMgPSB7XG4gIG9uRmlsZVVwbG9hZDogKGZpbGVzOiBGaWxlW10pID0+IHZvaWQ7XG4gIGZpbGVMb2FkaW5nOiBGaWxlTG9hZGluZyB8IGZhbHNlO1xuICBmaWxlTG9hZGluZ1Byb2dyZXNzOiBGaWxlTG9hZGluZ1Byb2dyZXNzO1xuICB0aGVtZTogb2JqZWN0O1xuICAvKiogQSBsaXN0IG9mIG5hbWVzIG9mIHN1cHBvcnRlZCBmb3JtYXRzIHN1aXRhYmxlIHRvIHByZXNlbnQgdG8gdXNlciAqL1xuICBmaWxlRm9ybWF0TmFtZXM/OiBzdHJpbmdbXTtcbiAgLyoqIEEgbGlzdCBvZiB0eXBpY2FsbHkgMyBsZXR0ZXIgZXh0ZW5zaW9ucyAod2l0aG91dCAnLicpIGZvciBmaWxlIG1hdGNoaW5nICovXG4gIGZpbGVFeHRlbnNpb25zPzogc3RyaW5nW107XG4gIC8qKiBTZXQgdG8gdHJ1ZSBpZiBhcHAgd2FudHMgdG8gZG8gaXRzIG93biBmaWxlIGZpbHRlcmluZyAqL1xuICBkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyPzogYm9vbGVhbjtcbn0gJiBXcmFwcGVkQ29tcG9uZW50UHJvcHM7XG5cbmZ1bmN0aW9uIEZpbGVVcGxvYWRGYWN0b3J5KCkge1xuICAvKiogQGF1Z21lbnRzIHtDb21wb25lbnQ8RmlsZVVwbG9hZFByb3BzPn0gKi9cbiAgY2xhc3MgRmlsZVVwbG9hZCBleHRlbmRzIENvbXBvbmVudDxGaWxlVXBsb2FkUHJvcHM+IHtcbiAgICBzdGF0ZSA9IHtcbiAgICAgIGRyYWdPdmVyOiBmYWxzZSxcbiAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGVycm9yRmlsZXM6IFtdXG4gICAgfTtcblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgICBpZiAoc3RhdGUuZmlsZUxvYWRpbmcgJiYgcHJvcHMuZmlsZUxvYWRpbmcgPT09IGZhbHNlICYmIHN0YXRlLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgICBmaWxlTG9hZGluZzogcHJvcHMuZmlsZUxvYWRpbmdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVMb2FkaW5nOiBwcm9wcy5maWxlTG9hZGluZ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmcmFtZSA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIF9pc1ZhbGlkRmlsZVR5cGUgPSBmaWxlbmFtZSA9PiB7XG4gICAgICBjb25zdCB7ZmlsZUV4dGVuc2lvbnMgPSBbXX0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgZmlsZUV4dCA9IGZpbGVFeHRlbnNpb25zLmZpbmQoZXh0ID0+IGZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpO1xuXG4gICAgICByZXR1cm4gQm9vbGVhbihmaWxlRXh0KTtcbiAgICB9O1xuXG4gICAgLyoqIEBwYXJhbSB7RmlsZUxpc3R9IGZpbGVMaXN0ICovXG4gICAgX2hhbmRsZUZpbGVJbnB1dCA9IChmaWxlTGlzdDogRmlsZUxpc3QsIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZXMgPSBbLi4uZmlsZUxpc3RdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgY29uc3Qge2Rpc2FibGVFeHRlbnNpb25GaWx0ZXIgPSBmYWxzZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAvLyBUT0RPIC0gbW92ZSB0aGlzIGNvZGUgb3V0IG9mIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGZpbGVzVG9Mb2FkOiBGaWxlW10gPSBbXTtcbiAgICAgIGNvbnN0IGVycm9yRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKGRpc2FibGVFeHRlbnNpb25GaWx0ZXIgfHwgdGhpcy5faXNWYWxpZEZpbGVUeXBlKGZpbGUubmFtZSkpIHtcbiAgICAgICAgICBmaWxlc1RvTG9hZC5wdXNoKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yRmlsZXMucHVzaChmaWxlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHtmaWxlczogZmlsZXNUb0xvYWQsIGVycm9yRmlsZXMsIGRyYWdPdmVyOiBmYWxzZX07XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCAoKSA9PlxuICAgICAgICBuZXh0U3RhdGUuZmlsZXMubGVuZ3RoID8gdGhpcy5wcm9wcy5vbkZpbGVVcGxvYWQobmV4dFN0YXRlLmZpbGVzKSA6IG51bGxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIF90b2dnbGVEcmFnU3RhdGUgPSBuZXdTdGF0ZSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogbmV3U3RhdGV9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2RyYWdPdmVyLCBmaWxlcywgZXJyb3JGaWxlc30gPSB0aGlzLnN0YXRlO1xuICAgICAgY29uc3Qge2ZpbGVMb2FkaW5nLCBmaWxlTG9hZGluZ1Byb2dyZXNzLCB0aGVtZSwgaW50bH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge2ZpbGVFeHRlbnNpb25zID0gW10sIGZpbGVGb3JtYXROYW1lcyA9IFtdfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBmaWxlVXBsb2FkSW5mb1RleHQgPSBgJHtpbnRsLmZvcm1hdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ2ZpbGVVcGxvYWRlci5jb25maWdVcGxvYWRNZXNzYWdlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZmlsZUZvcm1hdE5hbWVzOiBmaWxlRm9ybWF0TmFtZXMubWFwKGZvcm1hdCA9PiBgKioke2Zvcm1hdH0qKmApLmpvaW4oJywgJylcbiAgICAgICAgfVxuICAgICAgKX0oJHtHVUlERVNfRklMRV9GT1JNQVRfRE9DfSkuYDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRGaWxlVXBsb2FkIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJcIiByZWY9e3RoaXMuZnJhbWV9PlxuICAgICAgICAgIHtGaWxlRHJvcCA/IChcbiAgICAgICAgICAgIDxGaWxlRHJvcFxuICAgICAgICAgICAgICBmcmFtZT17dGhpcy5mcmFtZS5jdXJyZW50IHx8IGRvY3VtZW50fVxuICAgICAgICAgICAgICBvbkRyYWdPdmVyPXsoKSA9PiB0aGlzLl90b2dnbGVEcmFnU3RhdGUodHJ1ZSl9XG4gICAgICAgICAgICAgIG9uRHJhZ0xlYXZlPXsoKSA9PiB0aGlzLl90b2dnbGVEcmFnU3RhdGUoZmFsc2UpfVxuICAgICAgICAgICAgICBvbkRyb3A9e3RoaXMuX2hhbmRsZUZpbGVJbnB1dH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fZmlsZS1kcm9wXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFN0eWxlZFVwbG9hZE1lc3NhZ2UgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRfX21lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8UmVhY3RNYXJrZG93biBjb21wb25lbnRzPXt7YTogTGlua1JlbmRlcmVyfX0+e2ZpbGVVcGxvYWRJbmZvVGV4dH08L1JlYWN0TWFya2Rvd24+XG4gICAgICAgICAgICAgIDwvU3R5bGVkVXBsb2FkTWVzc2FnZT5cbiAgICAgICAgICAgICAgPFN0eWxlZEZpbGVEcm9wIGRyYWdPdmVyPXtkcmFnT3Zlcn0+XG4gICAgICAgICAgICAgICAgPFN0eWxlZEZpbGVUeXBlRm93IGNsYXNzTmFtZT1cImZpbGUtdHlwZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIHtmaWxlRXh0ZW5zaW9ucy5tYXAoZXh0ID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZpbGVUeXBlIGtleT17ZXh0fSBleHQ9e2V4dH0gaGVpZ2h0PVwiNTBweFwiIGZvbnRTaXplPVwiOXB4XCIgLz5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRmlsZVR5cGVGb3c+XG4gICAgICAgICAgICAgICAge2ZpbGVMb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgPEZpbGVVcGxvYWRQcm9ncmVzcyBmaWxlTG9hZGluZ1Byb2dyZXNzPXtmaWxlTG9hZGluZ1Byb2dyZXNzfSB0aGVtZT17dGhlbWV9IC8+XG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e29wYWNpdHk6IGRyYWdPdmVyID8gMC41IDogMX19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWQtZGlzcGxheS1tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWREcmFnTkRyb3BJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPERyYWdORHJvcCBoZWlnaHQ9XCI0NHB4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZERyYWdORHJvcEljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3JGaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8V2FybmluZ01zZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD17J2ZpbGVVcGxvYWRlci5maWxlTm90U3VwcG9ydGVkJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9e3tlcnJvckZpbGVzOiBlcnJvckZpbGVzLmpvaW4oJywgJyl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9XYXJuaW5nTXNnPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgeyFmaWxlcy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZERyYWdGaWxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNc2dXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5tZXNzYWdlJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvTXNnV3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkLW9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLm9yJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxVcGxvYWRCdXR0b24gb25VcGxvYWQ9e3RoaXMuX2hhbmRsZUZpbGVJbnB1dH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnZmlsZVVwbG9hZGVyLmJyb3dzZUZpbGVzJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVXBsb2FkQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRHJhZ0ZpbGVXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cblxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkRGlzY2xhaW1lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J2ZpbGVVcGxvYWRlci5kaXNjbGFpbWVyJ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWREaXNjbGFpbWVyPlxuICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9TdHlsZWRGaWxlRHJvcD5cbiAgICAgICAgICAgIDwvRmlsZURyb3A+XG4gICAgICAgICAgKSA6IG51bGx9XG5cbiAgICAgICAgICA8V2FybmluZ01zZz5cbiAgICAgICAgICAgIHtpc0Nocm9tZSgpID8gPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWxlVXBsb2FkZXIuY2hyb21lTWVzc2FnZSd9IC8+IDogJyd9XG4gICAgICAgICAgPC9XYXJuaW5nTXNnPlxuICAgICAgICA8L1N0eWxlZEZpbGVVcGxvYWQ+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmplY3RJbnRsKEZpbGVVcGxvYWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlVXBsb2FkRmFjdG9yeTtcbmV4cG9ydCBjb25zdCBGaWxlVXBsb2FkID0gRmlsZVVwbG9hZEZhY3RvcnkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxhQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxtQkFBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBR0EsSUFBQVEsTUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsVUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsY0FBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQVcsYUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksT0FBQSxHQUFBWixPQUFBO0FBQXdDLElBQUFhLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFqQnhDO0FBQ0E7QUFjQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxD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