UNPKG

kepler.gl

Version:

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

261 lines (222 loc) 31.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.MapInfoPanel = void 0; 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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); 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 _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _cloudTile = _interopRequireDefault(require("./cloud-tile")); var _imageModalContainer = _interopRequireDefault(require("./image-modal-container")); var _providerModalContainer = _interopRequireDefault(require("./provider-modal-container")); var _statusPanel = _interopRequireWildcard(require("./status-panel")); var _defaultSettings = require("../../constants/default-settings"); var _styledComponents2 = require("../common/styled-components"); var _imagePreview = _interopRequireDefault(require("../common/image-preview")); var _reactIntl = require("react-intl"); function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .save-map-modal-content {\n min-height: 400px;\n flex-direction: column;\n }\n\n .description {\n width: 300px;\n }\n\n .image-preview-panel {\n width: 300px;\n\n .image-preview {\n padding: 0;\n }\n }\n\n .map-info-panel {\n flex-direction: column;\n }\n\n .save-map-modal-description {\n .modal-section-subtitle {\n margin-left: 6px;\n }\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var StyledSaveMapModal = _styledComponents["default"].div.attrs({ className: 'save-map-modal' })(_templateObject()); var nop = function nop() {}; var MapInfoPanel = function MapInfoPanel(_ref) { var _ref$mapInfo = _ref.mapInfo, mapInfo = _ref$mapInfo === void 0 ? { description: '', title: '' } : _ref$mapInfo, characterLimits = _ref.characterLimits, onChangeInput = _ref.onChangeInput; return _react["default"].createElement("div", { className: "selection map-info-panel" }, _react["default"].createElement(_styledComponents2.StyledModalSection, { className: "save-map-modal-name" }, _react["default"].createElement("div", { className: "modal-section-title" }, "Name*"), _react["default"].createElement("div", null, _react["default"].createElement(_styledComponents2.InputLight, { id: "map-title", type: "text", value: mapInfo.title, onChange: function onChange(e) { return onChangeInput('title', e); }, placeholder: "Type map title" }))), _react["default"].createElement(_styledComponents2.StyledModalSection, null, _react["default"].createElement("div", { className: "save-map-modal-description", style: { display: 'flex' } }, _react["default"].createElement("div", { className: "modal-section-title" }, "Description"), _react["default"].createElement("div", { className: "modal-section-subtitle" }, "(optional)")), _react["default"].createElement("div", null, _react["default"].createElement(_styledComponents2.TextAreaLight, { rows: "3", id: "map-description", style: { resize: 'none' }, value: mapInfo.description, onChange: function onChange(e) { return onChangeInput('description', e); }, placeholder: "Type map description" })), _react["default"].createElement(_styledComponents2.StyledModalInputFootnote, { className: "save-map-modal-description__footnote", error: characterLimits.description && mapInfo.description.length > characterLimits.description }, mapInfo.description.length, "/", characterLimits.description || _defaultSettings.MAP_INFO_CHARACTER.description, ' ', "characters"))); }; exports.MapInfoPanel = MapInfoPanel; function SaveMapModalFactory() { var SaveMapModal = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(SaveMapModal, _Component); function SaveMapModal() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, SaveMapModal); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(SaveMapModal)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onChangeInput", function (key, e) { var value = e.target.value; _this.props.onSetMapInfo((0, _defineProperty2["default"])({}, key, value)); }); return _this; } (0, _createClass2["default"])(SaveMapModal, [{ key: "render", value: function render() { var _this$props = this.props, mapInfo = _this$props.mapInfo, exportImage = _this$props.exportImage, _this$props$character = _this$props.characterLimits, characterLimits = _this$props$character === void 0 ? {} : _this$props$character, cloudProviders = _this$props.cloudProviders, isProviderLoading = _this$props.isProviderLoading, currentProvider = _this$props.currentProvider, providerError = _this$props.providerError, onSetCloudProvider = _this$props.onSetCloudProvider, onUpdateImageSetting = _this$props.onUpdateImageSetting; var provider = currentProvider ? cloudProviders.find(function (p) { return p.name === currentProvider; }) : null; return _react["default"].createElement(_providerModalContainer["default"], { onSetCloudProvider: onSetCloudProvider, cloudProviders: cloudProviders, currentProvider: currentProvider }, _react["default"].createElement(_imageModalContainer["default"], { currentProvider: currentProvider, cloudProviders: cloudProviders, onUpdateImageSetting: onUpdateImageSetting }, _react["default"].createElement(StyledSaveMapModal, null, _react["default"].createElement(_styledComponents2.StyledModalContent, { className: "save-map-modal-content" }, _react["default"].createElement(_styledComponents2.StyledExportSection, { disabled: isProviderLoading }, _react["default"].createElement("div", { className: "description" }, _react["default"].createElement("div", { className: "title" }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'modal.saveMap.title' })), _react["default"].createElement("div", { className: "subtitle" }, _react["default"].createElement(_reactIntl.FormattedMessage, { id: 'modal.saveMap.subtitle' }))), _react["default"].createElement("div", { className: "selection" }, cloudProviders.map(function (cloudProvider) { return _react["default"].createElement(_cloudTile["default"], { key: cloudProvider.name, onSelect: function onSelect() { return onSetCloudProvider(cloudProvider.name); }, onSetCloudProvider: onSetCloudProvider, cloudProvider: cloudProvider, isSelected: cloudProvider.name === currentProvider, isConnected: Boolean(cloudProvider.getAccessToken && cloudProvider.getAccessToken()) }); }))), provider && provider.getManagementUrl && _react["default"].createElement(_styledComponents2.StyledExportSection, { style: { margin: '2px 0' } }, _react["default"].createElement("div", { className: "description" }), _react["default"].createElement("div", { className: "selection" }, _react["default"].createElement("a", { key: 1, href: provider.getManagementUrl(), target: "_blank", rel: "noopener noreferrer", style: { textDecoration: 'underline' } }, "Go to your Kepler.gl ", provider.displayName, " page"))), _react["default"].createElement(_styledComponents2.StyledExportSection, null, _react["default"].createElement("div", { className: "description image-preview-panel" }, _react["default"].createElement(_imagePreview["default"], { exportImage: exportImage, width: _defaultSettings.MAP_THUMBNAIL_DIMENSION.width, showDimension: false })), isProviderLoading ? _react["default"].createElement("div", { className: "selection map-saving-animation" }, _react["default"].createElement(_statusPanel.UploadAnimation, { icon: provider && provider.icon })) : _react["default"].createElement(MapInfoPanel, { mapInfo: mapInfo, characterLimits: characterLimits, onChangeInput: this._onChangeInput })), providerError ? _react["default"].createElement(_statusPanel["default"], { isLoading: false, error: providerError, providerIcon: provider && provider.icon }) : null)))); } }]); return SaveMapModal; }(_react.Component); (0, _defineProperty2["default"])(SaveMapModal, "propTypes", { exportImage: _propTypes["default"].object.isRequired, mapInfo: _propTypes["default"].object.isRequired, isProviderLoading: _propTypes["default"].bool.isRequired, thumbWidth: _propTypes["default"].number, thumbHeight: _propTypes["default"].number, characterLimits: _propTypes["default"].object, cloudProviders: _propTypes["default"].arrayOf(_propTypes["default"].object), currentProvider: _propTypes["default"].string, onSetMapInfo: _propTypes["default"].func.isRequired, onSetCloudProvider: _propTypes["default"].func.isRequired, onUpdateImageSetting: _propTypes["default"].func.isRequired }); (0, _defineProperty2["default"])(SaveMapModal, "defaultProps", { characterLimits: _defaultSettings.MAP_INFO_CHARACTER, cloudProviders: [], currentProvider: null, providerError: null, isProviderLoading: false, onSetCloudProvider: nop, onUpdateImageSetting: nop }); return SaveMapModal; } var _default = SaveMapModalFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9zYXZlLW1hcC1tb2RhbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRTYXZlTWFwTW9kYWwiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIm5vcCIsIk1hcEluZm9QYW5lbCIsIm1hcEluZm8iLCJkZXNjcmlwdGlvbiIsInRpdGxlIiwiY2hhcmFjdGVyTGltaXRzIiwib25DaGFuZ2VJbnB1dCIsImUiLCJkaXNwbGF5IiwicmVzaXplIiwibGVuZ3RoIiwiTUFQX0lORk9fQ0hBUkFDVEVSIiwiU2F2ZU1hcE1vZGFsRmFjdG9yeSIsIlNhdmVNYXBNb2RhbCIsImtleSIsInZhbHVlIiwidGFyZ2V0IiwicHJvcHMiLCJvblNldE1hcEluZm8iLCJleHBvcnRJbWFnZSIsImNsb3VkUHJvdmlkZXJzIiwiaXNQcm92aWRlckxvYWRpbmciLCJjdXJyZW50UHJvdmlkZXIiLCJwcm92aWRlckVycm9yIiwib25TZXRDbG91ZFByb3ZpZGVyIiwib25VcGRhdGVJbWFnZVNldHRpbmciLCJwcm92aWRlciIsImZpbmQiLCJwIiwibmFtZSIsIm1hcCIsImNsb3VkUHJvdmlkZXIiLCJCb29sZWFuIiwiZ2V0QWNjZXNzVG9rZW4iLCJnZXRNYW5hZ2VtZW50VXJsIiwibWFyZ2luIiwidGV4dERlY29yYXRpb24iLCJkaXNwbGF5TmFtZSIsIk1BUF9USFVNQk5BSUxfRElNRU5TSU9OIiwid2lkdGgiLCJpY29uIiwiX29uQ2hhbmdlSW5wdXQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwiYm9vbCIsInRodW1iV2lkdGgiLCJudW1iZXIiLCJ0aHVtYkhlaWdodCIsImFycmF5T2YiLCJzdHJpbmciLCJmdW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FB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UlY7QUFTakJqQyxJQUFBQSxZQUFZLEVBQUV5QixzQkFBVVMsSUFBVixDQUFlUCxVQVRaO0FBVWpCckIsSUFBQUEsa0JBQWtCLEVBQUVtQixzQkFBVVMsSUFBVixDQUFlUCxVQVZsQjtBQVdqQnBCLElBQUFBLG9CQUFvQixFQUFFa0Isc0JBQVVTLElBQVYsQ0FBZVA7QUFYcEIsR0FGUTtBQUFBLG1DQUN2QmhDLFlBRHVCLGtCQWdCTDtBQUNwQlIsSUFBQUEsZUFBZSxFQUFFTSxtQ0FERztBQUVwQlMsSUFBQUEsY0FBYyxFQUFFLEVBRkk7QUFHcEJFLElBQUFBLGVBQWUsRUFBRSxJQUhHO0FBSXBCQyxJQUFBQSxhQUFhLEVBQUUsSUFKSztBQUtwQkYsSUFBQUEsaUJBQWlCLEVBQUUsS0FMQztBQU1wQkcsSUFBQUEsa0JBQWtCLEVBQUV4QixHQU5BO0FBT3BCeUIsSUFBQUEsb0JBQW9CLEVBQUV6QjtBQVBGLEdBaEJLO0FBb0k3QixTQUFPYSxZQUFQO0FBQ0Q7O2VBRWNELG1CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgQ2xvdWRUaWxlIGZyb20gJy4vY2xvdWQtdGlsZSc7XG5pbXBvcnQgSW1hZ2VNb2RhbENvbnRhaW5lciBmcm9tICcuL2ltYWdlLW1vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQgUHJvdmlkZXJNb2RhbENvbnRhaW5lciBmcm9tICcuL3Byb3ZpZGVyLW1vZGFsLWNvbnRhaW5lcic7XG5cbmltcG9ydCBTdGF0dXNQYW5lbCwge1VwbG9hZEFuaW1hdGlvbn0gZnJvbSAnLi9zdGF0dXMtcGFuZWwnO1xuXG5pbXBvcnQge01BUF9USFVNQk5BSUxfRElNRU5TSU9OLCBNQVBfSU5GT19DSEFSQUNURVJ9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtcbiAgU3R5bGVkTW9kYWxDb250ZW50LFxuICBJbnB1dExpZ2h0LFxuICBUZXh0QXJlYUxpZ2h0LFxuICBTdHlsZWRFeHBvcnRTZWN0aW9uLFxuICBTdHlsZWRNb2RhbFNlY3Rpb24sXG4gIFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgSW1hZ2VQcmV2aWV3IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ltYWdlLXByZXZpZXcnO1xuaW1wb3J0IHsgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gXCJyZWFjdC1pbnRsXCI7XG5cbmNvbnN0IFN0eWxlZFNhdmVNYXBNb2RhbCA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzYXZlLW1hcC1tb2RhbCdcbn0pYFxuICAuc2F2ZS1tYXAtbW9kYWwtY29udGVudCB7XG4gICAgbWluLWhlaWdodDogNDAwcHg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuXG4gIC5kZXNjcmlwdGlvbiB7XG4gICAgd2lkdGg6IDMwMHB4O1xuICB9XG5cbiAgLmltYWdlLXByZXZpZXctcGFuZWwge1xuICAgIHdpZHRoOiAzMDBweDtcblxuICAgIC5pbWFnZS1wcmV2aWV3IHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICB9XG5cbiAgLm1hcC1pbmZvLXBhbmVsIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG5cbiAgLnNhdmUtbWFwLW1vZGFsLWRlc2NyaXB0aW9uIHtcbiAgICAubW9kYWwtc2VjdGlvbi1zdWJ0aXRsZSB7XG4gICAgICBtYXJnaW4tbGVmdDogNnB4O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3Qgbm9wID0gKCkgPT4ge307XG5cbmV4cG9ydCBjb25zdCBNYXBJbmZvUGFuZWwgPSAoe1xuICBtYXBJbmZvID0ge2Rlc2NyaXB0aW9uOiAnJywgdGl0bGU6ICcnfSxcbiAgY2hhcmFjdGVyTGltaXRzLFxuICBvbkNoYW5nZUlucHV0XG59KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uIG1hcC1pbmZvLXBhbmVsXCI+XG4gICAgPFN0eWxlZE1vZGFsU2VjdGlvbiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1uYW1lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5OYW1lKjwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICBpZD1cIm1hcC10aXRsZVwiXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIHZhbHVlPXttYXBJbmZvLnRpdGxlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ3RpdGxlJywgZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIG1hcCB0aXRsZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L1N0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICA8U3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1kZXNjcmlwdGlvblwiIHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnfX0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi10aXRsZVwiPkRlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi1zdWJ0aXRsZVwiPihvcHRpb25hbCk8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPFRleHRBcmVhTGlnaHRcbiAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgICAgaWQ9XCJtYXAtZGVzY3JpcHRpb25cIlxuICAgICAgICAgIHN0eWxlPXt7cmVzaXplOiAnbm9uZSd9fVxuICAgICAgICAgIHZhbHVlPXttYXBJbmZvLmRlc2NyaXB0aW9ufVxuICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ2Rlc2NyaXB0aW9uJywgZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIG1hcCBkZXNjcmlwdGlvblwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxTdHlsZWRNb2RhbElucHV0Rm9vdG5vdGVcbiAgICAgICAgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtZGVzY3JpcHRpb25fX2Zvb3Rub3RlXCJcbiAgICAgICAgZXJyb3I9e1xuICAgICAgICAgIGNoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvbiAmJiBtYXBJbmZvLmRlc2NyaXB0aW9uLmxlbmd0aCA+IGNoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvblxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIHttYXBJbmZvLmRlc2NyaXB0aW9uLmxlbmd0aH0ve2NoYXJhY3RlckxpbWl0cy5kZXNjcmlwdGlvbiB8fCBNQVBfSU5GT19DSEFSQUNURVIuZGVzY3JpcHRpb259eycgJ31cbiAgICAgICAgY2hhcmFjdGVyc1xuICAgICAgPC9TdHlsZWRNb2RhbElucHV0Rm9vdG5vdGU+XG4gICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG4gIDwvZGl2PlxuKTtcblxuZnVuY3Rpb24gU2F2ZU1hcE1vZGFsRmFjdG9yeSgpIHtcbiAgY2xhc3MgU2F2ZU1hcE1vZGFsIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgZXhwb3J0SW1hZ2U6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIG1hcEluZm86IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGlzUHJvdmlkZXJMb2FkaW5nOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICAgICAgdGh1bWJXaWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHRodW1iSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgY2hhcmFjdGVyTGltaXRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgY2xvdWRQcm92aWRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgY3VycmVudFByb3ZpZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgb25TZXRNYXBJbmZvOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgb25TZXRDbG91ZFByb3ZpZGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNoYXJhY3RlckxpbWl0czogTUFQX0lORk9fQ0hBUkFDVEVSLFxuICAgICAgY2xvdWRQcm92aWRlcnM6IFtdLFxuICAgICAgY3VycmVudFByb3ZpZGVyOiBudWxsLFxuICAgICAgcHJvdmlkZXJFcnJvcjogbnVsbCxcbiAgICAgIGlzUHJvdmlkZXJMb2FkaW5nOiBmYWxzZSxcbiAgICAgIG9uU2V0Q2xvdWRQcm92aWRlcjogbm9wLFxuICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc6IG5vcFxuICAgIH07XG5cbiAgICBfb25DaGFuZ2VJbnB1dCA9IChrZXksIGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdGFyZ2V0OiB7dmFsdWV9XG4gICAgICB9ID0gZTtcbiAgICAgIHRoaXMucHJvcHMub25TZXRNYXBJbmZvKHtba2V5XTogdmFsdWV9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYXBJbmZvLFxuICAgICAgICBleHBvcnRJbWFnZSxcbiAgICAgICAgY2hhcmFjdGVyTGltaXRzID0ge30sXG4gICAgICAgIGNsb3VkUHJvdmlkZXJzLFxuICAgICAgICBpc1Byb3ZpZGVyTG9hZGluZyxcbiAgICAgICAgY3VycmVudFByb3ZpZGVyLFxuICAgICAgICBwcm92aWRlckVycm9yLFxuICAgICAgICBvblNldENsb3VkUHJvdmlkZXIsXG4gICAgICAgIG9uVXBkYXRlSW1hZ2VTZXR0aW5nXG4gICAgICB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gY3VycmVudFByb3ZpZGVyXG4gICAgICAgID8gY2xvdWRQcm92aWRlcnMuZmluZChwID0+IHAubmFtZSA9PT0gY3VycmVudFByb3ZpZGVyKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxQcm92aWRlck1vZGFsQ29udGFpbmVyXG4gICAgICAgICAgb25TZXRDbG91ZFByb3ZpZGVyPXtvblNldENsb3VkUHJvdmlkZXJ9XG4gICAgICAgICAgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfVxuICAgICAgICAgIGN1cnJlbnRQcm92aWRlcj17Y3VycmVudFByb3ZpZGVyfVxuICAgICAgICA+XG4gICAgICAgICAgPEltYWdlTW9kYWxDb250YWluZXJcbiAgICAgICAgICAgIGN1cnJlbnRQcm92aWRlcj17Y3VycmVudFByb3ZpZGVyfVxuICAgICAgICAgICAgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfVxuICAgICAgICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc9e29uVXBkYXRlSW1hZ2VTZXR0aW5nfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxTdHlsZWRTYXZlTWFwTW9kYWw+XG4gICAgICAgICAgICAgIDxTdHlsZWRNb2RhbENvbnRlbnQgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uIGRpc2FibGVkPXtpc1Byb3ZpZGVyTG9hZGluZ30+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj48Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLnNhdmVNYXAudGl0bGUnfSAvPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN1YnRpdGxlXCI+PEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydtb2RhbC5zYXZlTWFwLnN1YnRpdGxlJ30gLz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge2Nsb3VkUHJvdmlkZXJzLm1hcChjbG91ZFByb3ZpZGVyID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8Q2xvdWRUaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nsb3VkUHJvdmlkZXIubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNldENsb3VkUHJvdmlkZXIoY2xvdWRQcm92aWRlci5uYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU2V0Q2xvdWRQcm92aWRlcj17b25TZXRDbG91ZFByb3ZpZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvdWRQcm92aWRlcj17Y2xvdWRQcm92aWRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e2Nsb3VkUHJvdmlkZXIubmFtZSA9PT0gY3VycmVudFByb3ZpZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0ZWQ9e0Jvb2xlYW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3VkUHJvdmlkZXIuZ2V0QWNjZXNzVG9rZW4gJiYgY2xvdWRQcm92aWRlci5nZXRBY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgIHtwcm92aWRlciAmJiBwcm92aWRlci5nZXRNYW5hZ2VtZW50VXJsICYmIChcbiAgICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uIHN0eWxlPXt7bWFyZ2luOiAnMnB4IDAnfX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtwcm92aWRlci5nZXRNYW5hZ2VtZW50VXJsKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e3RleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJ319XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgR28gdG8geW91ciBLZXBsZXIuZ2wge3Byb3ZpZGVyLmRpc3BsYXlOYW1lfSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvbiBpbWFnZS1wcmV2aWV3LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbWFnZVByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRJbWFnZT17ZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e01BUF9USFVNQk5BSUxfRElNRU5TSU9OLndpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaW1lbnNpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7aXNQcm92aWRlckxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uIG1hcC1zYXZpbmctYW5pbWF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFVwbG9hZEFuaW1hdGlvbiBpY29uPXtwcm92aWRlciAmJiBwcm92aWRlci5pY29ufSAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxNYXBJbmZvUGFuZWxcbiAgICAgICAgICAgICAgICAgICAgICBtYXBJbmZvPXttYXBJbmZvfVxuICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckxpbWl0cz17Y2hhcmFjdGVyTGltaXRzfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQ9e3RoaXMuX29uQ2hhbmdlSW5wdXR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgICB7cHJvdmlkZXJFcnJvciA/IChcbiAgICAgICAgICAgICAgICAgIDxTdGF0dXNQYW5lbFxuICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcj17cHJvdmlkZXJFcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJJY29uPXtwcm92aWRlciAmJiBwcm92aWRlci5pY29ufVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbENvbnRlbnQ+XG4gICAgICAgICAgICA8L1N0eWxlZFNhdmVNYXBNb2RhbD5cbiAgICAgICAgICA8L0ltYWdlTW9kYWxDb250YWluZXI+XG4gICAgICAgIDwvUHJvdmlkZXJNb2RhbENvbnRhaW5lcj5cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTYXZlTWFwTW9kYWw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNhdmVNYXBNb2RhbEZhY3Rvcnk7XG4iXX0=