UNPKG

kepler.gl

Version:

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

252 lines (250 loc) 46.8 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"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); 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 _reactLifecyclesCompat = require("react-lifecycles-compat"); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _reactMapGl = require("react-map-gl"); var _styledComponents2 = require("../common/styled-components"); var _styles = require("@kepler.gl/styles"); var _utils = require("@kepler.gl/utils"); var _reactIntl = require("react-intl"); var _localization = require("@kepler.gl/localization"); var _constants = require("@kepler.gl/constants"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // Utils 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 ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } 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 MapH = 190; var MapW = 264; var ErrorMsg = { styleError: 'Failed to load map style, make sure it is published. For private style, paste in your access token.' }; var PreviewMap = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-left: 116px;\n flex-shrink: 0;\n\n .preview-title {\n font-weight: 500;\n font-size: 10px;\n padding: 8px 0px;\n }\n\n .preview-title.error {\n color: ", ";\n max-width: 250px;\n }\n\n ", ";\n\n ", ";\n"])), function (props) { return props.theme.errorColor; }, _styles.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 32px;\n "]))), _styles.media.palm(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: unset;\n .preview-title {\n margin-top: 0px;\n }\n "])))); var StyledPreviewImage = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background: ", ";\n border-radius: 4px;\n box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.18);\n width: ", "px;\n height: ", "px;\n position: relative;\n\n .preview-image-placeholder {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .preview-image-spinner {\n position: absolute;\n left: calc(50% - 25px);\n top: calc(50% - 25px);\n }\n"])), function (props) { return props.theme.modalImagePlaceHolder; }, MapW, MapH); var InlineLink = _styledComponents["default"].a(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n font-weight: 500;\n\n &:hover {\n cursor: pointer;\n }\n"]))); var nop = function nop() { return; }; function AddMapStyleModalFactory() { var AddMapStyleModal = /*#__PURE__*/function (_Component) { function AddMapStyleModal() { var _this; (0, _classCallCheck2["default"])(this, AddMapStyleModal); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, AddMapStyleModal, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { reRenderKey: 0, previousToken: null }); (0, _defineProperty2["default"])(_this, "_map", void 0); (0, _defineProperty2["default"])(_this, "_setMapRef", function (mapRef) { // Handle change of the basemap library if (_this._map && mapRef) { var _map = mapRef.getMap(); if (_map && _this._map !== _map) { _this._map.off('style.load', nop); _this._map.off('error', nop); _this._map = null; } } var map = mapRef && mapRef.getMap(); if (map && _this._map !== map) { _this._map = map; map.on('style.load', function () { var style = map.getStyle(); _this.loadMapStyleJson(style); }); map.on('error', function () { _this.loadMapStyleError(); }); } }); (0, _defineProperty2["default"])(_this, "loadMapStyleJson", function (style) { _this.props.loadCustomMapStyle({ style: style, error: false }); }); (0, _defineProperty2["default"])(_this, "loadMapStyleError", function () { _this.props.loadCustomMapStyle({ error: true }); }); return _this; } (0, _inherits2["default"])(AddMapStyleModal, _Component); return (0, _createClass2["default"])(AddMapStyleModal, [{ key: "render", value: function render() { var _this$props$transform, _this$props2, _this2 = this; var _this$props = this.props, inputStyle = _this$props.inputStyle, mapState = _this$props.mapState, intl = _this$props.intl; var baseMapLibraryName = (0, _utils.getBaseMapLibrary)(inputStyle); var baseMapLibraryConfig = (0, _utils.getApplicationConfig)().baseMapLibraryConfig[baseMapLibraryName]; var mapboxApiAccessToken = inputStyle.accessToken || this.props.mapboxApiAccessToken; var mapProps = _objectSpread(_objectSpread({}, mapState), {}, { // TODO baseApiUrl should be taken into account in transformRequest as we use dynamic mapLib import // baseApiUrl: mapboxApiUrl, mapboxAccessToken: mapboxApiAccessToken, mapLib: baseMapLibraryConfig.getMapLib(), preserveDrawingBuffer: true, transformRequest: ((_this$props$transform = (_this$props2 = this.props).transformRequest) === null || _this$props$transform === void 0 ? void 0 : _this$props$transform.call(_this$props2, mapboxApiAccessToken)) || (0, _utils.transformRequest)(mapboxApiAccessToken) }); return /*#__PURE__*/_react["default"].createElement("div", { className: "add-map-style-modal" }, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalContent, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalVerticalPanel, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.addStyle.pasteTitle' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle0' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/studio-manual-publish/#style-url" }, ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle2' })), ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle3' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://docs.mapbox.com/mapbox-gl-js/style-spec" }, ' ', intl.formatMessage({ id: 'modal.addStyle.pasteSubtitle4' }))), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.url || '', onChange: function onChange(_ref) { var value = _ref.target.value; return _this2.props.inputMapStyle({ url: value, id: 'Custom Style', icon: _constants.NO_BASEMAP_ICON }); }, placeholder: "e.g. https://basemaps.cartocdn.com/gl/positron-gl-style/style.json" })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.addStyle.publishTitle' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.publishSubtitle1' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/studio/styles/" }, ' ', "mapbox"), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle2' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/studio-manual-publish/" }, ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle3' })), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle4' })), /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-subtitle" }, intl.formatMessage({ id: 'modal.addStyle.publishSubtitle5' }), /*#__PURE__*/_react["default"].createElement(InlineLink, { target: "_blank", href: "https://www.mapbox.com/help/how-access-tokens-work/" }, ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle6' })), ' ', intl.formatMessage({ id: 'modal.addStyle.publishSubtitle7' })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.accessToken || '', onChange: function onChange(_ref2) { var value = _ref2.target.value; return _this2.props.inputMapStyle({ accessToken: value }); }, placeholder: intl.formatMessage({ id: 'modal.addStyle.exampleToken' }) })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalSection, null, /*#__PURE__*/_react["default"].createElement("div", { className: "modal-section-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.addStyle.namingTitle' })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.InputLight, { type: "text", value: inputStyle.label || '', onChange: function onChange(_ref3) { var value = _ref3.target.value; return _this2.props.inputMapStyle({ label: value }); }, placeholder: "Name your style" }))), /*#__PURE__*/_react["default"].createElement(PreviewMap, null, /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames["default"])('preview-title', { error: inputStyle.error }) }, inputStyle.error ? ErrorMsg.styleError : inputStyle.style && inputStyle.style.name || ''), /*#__PURE__*/_react["default"].createElement(StyledPreviewImage, { className: "preview-image" }, !inputStyle.isValid ? /*#__PURE__*/_react["default"].createElement("div", { className: "preview-image-spinner" }) : /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledMapContainer, null, /*#__PURE__*/_react["default"].createElement(_reactMapGl.Map, (0, _extends2["default"])({}, mapProps, { ref: this._setMapRef, key: "".concat(baseMapLibraryName, "-").concat(this.state.reRenderKey, "-").concat(inputStyle.url, "-").concat(mapboxApiAccessToken), style: { width: MapW, height: MapH }, mapStyle: inputStyle.url === null ? undefined : inputStyle.url }))))))); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(props, state) { if (props.inputStyle && props.inputStyle.accessToken && props.inputStyle.accessToken !== state.previousToken) { // toke has changed // ReactMapGl doesn't re-create map when token has changed // here we force the map to update return { reRenderKey: state.reRenderKey + 1, previousToken: props.inputStyle.accessToken }; } return null; } }]); }(_react.Component); return (0, _reactIntl.injectIntl)((0, _reactLifecyclesCompat.polyfill)(AddMapStyleModal)); } var _default = exports["default"] = AddMapStyleModalFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RMaWZlY3ljbGVzQ29tcGF0IiwiX2NsYXNzbmFtZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfcmVhY3RNYXBHbCIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9zdHlsZXMiLCJfdXRpbHMiLCJfcmVhY3RJbnRsIiwiX2xvY2FsaXphdGlvbiIsIl9jb25zdGFudHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJNYXBIIiwiTWFwVyIsIkVycm9yTXNnIiwic3R5bGVFcnJvciIsIlByZXZpZXdNYXAiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJlcnJvckNvbG9yIiwibWVkaWEiLCJwb3J0YWJsZSIsInBhbG0iLCJTdHlsZWRQcmV2aWV3SW1hZ2UiLCJtb2RhbEltYWdlUGxhY2VIb2xkZXIiLCJJbmxpbmVMaW5rIiwibm9wIiwiQWRkTWFwU3R5bGVNb2RhbEZhY3RvcnkiLCJBZGRNYXBTdHlsZU1vZGFsIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwicmVSZW5kZXJLZXkiLCJwcmV2aW91c1Rva2VuIiwibWFwUmVmIiwiX21hcCIsIm1hcCIsImdldE1hcCIsIm9mZiIsIm9uIiwic3R5bGUiLCJnZXRTdHlsZSIsImxvYWRNYXBTdHlsZUpzb24iLCJsb2FkTWFwU3R5bGVFcnJvciIsImxvYWRDdXN0b21NYXBTdHlsZSIsImVycm9yIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsInJlbmRlciIsIl90aGlzJHByb3BzJHRyYW5zZm9ybSIsIl90aGlzJHByb3BzMiIsIl90aGlzMiIsIl90aGlzJHByb3BzIiwiaW5wdXRTdHlsZSIsIm1hcFN0YXRlIiwiaW50bCIsImJhc2VNYXBMaWJyYXJ5TmFtZSIsImdldEJhc2VNYXBMaWJyYXJ5IiwiYmFzZU1hcExpYnJhcnlDb25maWciLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwiYWNjZXNzVG9rZW4iLCJtYXBQcm9wcyIsIm1hcGJveEFjY2Vzc1Rva2VuIiwibWFwTGliIiwiZ2V0TWFwTGliIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwidHJhbnNmb3JtUmVxdWVzdCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJTdHlsZWRNb2RhbENvbnRlbnQiLCJTdHlsZWRNb2RhbFZlcnRpY2FsUGFuZWwiLCJTdHlsZWRNb2RhbFNlY3Rpb24iLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaWQiLCJmb3JtYXRNZXNzYWdlIiwidGFyZ2V0IiwiaHJlZiIsIklucHV0TGlnaHQiLCJ0eXBlIiwidXJsIiwib25DaGFuZ2UiLCJfcmVmIiwiaW5wdXRNYXBTdHlsZSIsImljb24iLCJOT19CQVNFTUFQX0lDT04iLCJwbGFjZWhvbGRlciIsIl9yZWYyIiwibGFiZWwiLCJfcmVmMyIsImNsYXNzbmFtZXMiLCJuYW1lIiwiaXNWYWxpZCIsIlN0eWxlZE1hcENvbnRhaW5lciIsIk1hcCIsIl9leHRlbmRzMiIsInJlZiIsIl9zZXRNYXBSZWYiLCJzdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwibWFwU3R5bGUiLCJ1bmRlZmluZWQiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJDb21wb25lbnQiLCJpbmplY3RJbnRsIiwicG9seWZpbGwiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kYWxzL2FkZC1tYXAtc3R5bGUtbW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtwb2x5ZmlsbH0gZnJvbSAncmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7TWFwLCBNYXBib3hNYXAsIE1hcFJlZn0gZnJvbSAncmVhY3QtbWFwLWdsJztcbmltcG9ydCB7XG4gIFN0eWxlZE1vZGFsQ29udGVudCxcbiAgSW5wdXRMaWdodCxcbiAgU3R5bGVkTWFwQ29udGFpbmVyLFxuICBTdHlsZWRNb2RhbFZlcnRpY2FsUGFuZWwsXG4gIFN0eWxlZE1vZGFsU2VjdGlvblxufSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHttZWRpYX0gZnJvbSAnQGtlcGxlci5nbC9zdHlsZXMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZywgZ2V0QmFzZU1hcExpYnJhcnksIHRyYW5zZm9ybVJlcXVlc3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtpbmplY3RJbnRsLCBJbnRsU2hhcGV9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5pbXBvcnQge05PX0JBU0VNQVBfSUNPTn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtJbnB1dFN0eWxlLCBNYXBTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0FjdGlvbkhhbmRsZXIsIGlucHV0TWFwU3R5bGUsIGxvYWRDdXN0b21NYXBTdHlsZX0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcblxuY29uc3QgTWFwSCA9IDE5MDtcbmNvbnN0IE1hcFcgPSAyNjQ7XG5jb25zdCBFcnJvck1zZyA9IHtcbiAgc3R5bGVFcnJvcjpcbiAgICAnRmFpbGVkIHRvIGxvYWQgbWFwIHN0eWxlLCBtYWtlIHN1cmUgaXQgaXMgcHVibGlzaGVkLiBGb3IgcHJpdmF0ZSBzdHlsZSwgcGFzdGUgaW4geW91ciBhY2Nlc3MgdG9rZW4uJ1xufTtcblxuY29uc3QgUHJldmlld01hcCA9IHN0eWxlZC5kaXZgXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tbGVmdDogMTE2cHg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuXG4gIC5wcmV2aWV3LXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBwYWRkaW5nOiA4cHggMHB4O1xuICB9XG5cbiAgLnByZXZpZXctdGl0bGUuZXJyb3Ige1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVycm9yQ29sb3J9O1xuICAgIG1heC13aWR0aDogMjUwcHg7XG4gIH1cblxuICAke21lZGlhLnBvcnRhYmxlYFxuICAgIG1hcmdpbi1sZWZ0OiAzMnB4O1xuICBgfTtcblxuICAke21lZGlhLnBhbG1gXG4gICAgbWFyZ2luLWxlZnQ6IHVuc2V0O1xuICAgIC5wcmV2aWV3LXRpdGxlIHtcbiAgICAgIG1hcmdpbi10b3A6IDBweDtcbiAgICB9XG4gIGB9O1xuYDtcblxuY29uc3QgU3R5bGVkUHJldmlld0ltYWdlID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tb2RhbEltYWdlUGxhY2VIb2xkZXJ9O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJveC1zaGFkb3c6IDAgOHB4IDE2cHggMCByZ2JhKDAsIDAsIDAsIDAuMTgpO1xuICB3aWR0aDogJHtNYXBXfXB4O1xuICBoZWlnaHQ6ICR7TWFwSH1weDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5wcmV2aWV3LWltYWdlLXBsYWNlaG9sZGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gIH1cblxuICAucHJldmlldy1pbWFnZS1zcGlubmVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogY2FsYyg1MCUgLSAyNXB4KTtcbiAgICB0b3A6IGNhbGMoNTAlIC0gMjVweCk7XG4gIH1cbmA7XG5cbmNvbnN0IElubGluZUxpbmsgPSBzdHlsZWQuYWBcbiAgZm9udC13ZWlnaHQ6IDUwMDtcblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmNvbnN0IG5vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcblxuaW50ZXJmYWNlIEFkZE1hcFN0eWxlTW9kYWxQcm9wcyB7XG4gIGlucHV0TWFwU3R5bGU6IEFjdGlvbkhhbmRsZXI8dHlwZW9mIGlucHV0TWFwU3R5bGU+O1xuICBpbnB1dFN0eWxlOiBJbnB1dFN0eWxlO1xuICBsb2FkQ3VzdG9tTWFwU3R5bGU6IEFjdGlvbkhhbmRsZXI8dHlwZW9mIGxvYWRDdXN0b21NYXBTdHlsZT47XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIG1hcGJveEFwaVVybD86IHN0cmluZztcbiAgdHJhbnNmb3JtUmVxdWVzdD86IChtYXBib3hLZXk6IHN0cmluZykgPT4gKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHJlc291cmNlVHlwZTogc3RyaW5nXG4gICkgPT4ge1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICBtYXBTdGF0ZTogTWFwU3RhdGU7XG4gIGludGw6IEludGxTaGFwZTtcbn1cblxuZnVuY3Rpb24gQWRkTWFwU3R5bGVNb2RhbEZhY3RvcnkoKSB7XG4gIGNsYXNzIEFkZE1hcFN0eWxlTW9kYWwgZXh0ZW5kcyBDb21wb25lbnQ8QWRkTWFwU3R5bGVNb2RhbFByb3BzPiB7XG4gICAgc3RhdGUgPSB7XG4gICAgICByZVJlbmRlcktleTogMCxcbiAgICAgIHByZXZpb3VzVG9rZW46IG51bGxcbiAgICB9O1xuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuaW5wdXRTdHlsZSAmJlxuICAgICAgICBwcm9wcy5pbnB1dFN0eWxlLmFjY2Vzc1Rva2VuICYmXG4gICAgICAgIHByb3BzLmlucHV0U3R5bGUuYWNjZXNzVG9rZW4gIT09IHN0YXRlLnByZXZpb3VzVG9rZW5cbiAgICAgICkge1xuICAgICAgICAvLyB0b2tlIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIFJlYWN0TWFwR2wgZG9lc24ndCByZS1jcmVhdGUgbWFwIHdoZW4gdG9rZW4gaGFzIGNoYW5nZWRcbiAgICAgICAgLy8gaGVyZSB3ZSBmb3JjZSB0aGUgbWFwIHRvIHVwZGF0ZVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVSZW5kZXJLZXk6IHN0YXRlLnJlUmVuZGVyS2V5ICsgMSxcbiAgICAgICAgICBwcmV2aW91c1Rva2VuOiBwcm9wcy5pbnB1dFN0eWxlLmFjY2Vzc1Rva2VuXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9tYXA6IE1hcGJveE1hcCB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgICBfc2V0TWFwUmVmID0gKG1hcFJlZjogTWFwUmVmKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgY2hhbmdlIG9mIHRoZSBiYXNlbWFwIGxpYnJhcnlcbiAgICAgIGlmICh0aGlzLl9tYXAgJiYgbWFwUmVmKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG1hcFJlZi5nZXRNYXAoKTtcbiAgICAgICAgaWYgKG1hcCAmJiB0aGlzLl9tYXAgIT09IG1hcCkge1xuICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3N0eWxlLmxvYWQnLCBub3ApO1xuICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2Vycm9yJywgbm9wKTtcbiAgICAgICAgICB0aGlzLl9tYXAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcCA9IG1hcFJlZiAmJiBtYXBSZWYuZ2V0TWFwKCk7XG4gICAgICBpZiAobWFwICYmIHRoaXMuX21hcCAhPT0gbWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcblxuICAgICAgICBtYXAub24oJ3N0eWxlLmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSBtYXAuZ2V0U3R5bGUoKTtcbiAgICAgICAgICB0aGlzLmxvYWRNYXBTdHlsZUpzb24oc3R5bGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBtYXAub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZE1hcFN0eWxlRXJyb3IoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxvYWRNYXBTdHlsZUpzb24gPSBzdHlsZSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmxvYWRDdXN0b21NYXBTdHlsZSh7c3R5bGUsIGVycm9yOiBmYWxzZX0pO1xuICAgIH07XG5cbiAgICBsb2FkTWFwU3R5bGVFcnJvciA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMubG9hZEN1c3RvbU1hcFN0eWxlKHtlcnJvcjogdHJ1ZX0pO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBjb25zdCB7aW5wdXRTdHlsZSwgbWFwU3RhdGUsIGludGx9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3QgYmFzZU1hcExpYnJhcnlOYW1lID0gZ2V0QmFzZU1hcExpYnJhcnkoaW5wdXRTdHlsZSk7XG4gICAgICBjb25zdCBiYXNlTWFwTGlicmFyeUNvbmZpZyA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuYmFzZU1hcExpYnJhcnlDb25maWdbYmFzZU1hcExpYnJhcnlOYW1lXTtcblxuICAgICAgY29uc3QgbWFwYm94QXBpQWNjZXNzVG9rZW4gPSBpbnB1dFN0eWxlLmFjY2Vzc1Rva2VuIHx8IHRoaXMucHJvcHMubWFwYm94QXBpQWNjZXNzVG9rZW47XG4gICAgICBjb25zdCBtYXBQcm9wcyA9IHtcbiAgICAgICAgLi4ubWFwU3RhdGUsXG4gICAgICAgIC8vIFRPRE8gYmFzZUFwaVVybCBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHRyYW5zZm9ybVJlcXVlc3QgYXMgd2UgdXNlIGR5bmFtaWMgbWFwTGliIGltcG9ydFxuICAgICAgICAvLyBiYXNlQXBpVXJsOiBtYXBib3hBcGlVcmwsXG4gICAgICAgIG1hcGJveEFjY2Vzc1Rva2VuOiBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgbWFwTGliOiBiYXNlTWFwTGlicmFyeUNvbmZpZy5nZXRNYXBMaWIoKSxcbiAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OlxuICAgICAgICAgIHRoaXMucHJvcHMudHJhbnNmb3JtUmVxdWVzdD8uKG1hcGJveEFwaUFjY2Vzc1Rva2VuKSB8fFxuICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3QobWFwYm94QXBpQWNjZXNzVG9rZW4pXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFkZC1tYXAtc3R5bGUtbW9kYWxcIj5cbiAgICAgICAgICA8U3R5bGVkTW9kYWxDb250ZW50PlxuICAgICAgICAgICAgPFN0eWxlZE1vZGFsVmVydGljYWxQYW5lbD5cbiAgICAgICAgICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuYWRkU3R5bGUucGFzdGVUaXRsZSd9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnBhc3RlU3VidGl0bGUwJ30pfVxuICAgICAgICAgICAgICAgICAgPElubGluZUxpbmtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9zdHVkaW8tbWFudWFsLXB1Ymxpc2gvI3N0eWxlLXVybFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucGFzdGVTdWJ0aXRsZTInfSl9XG4gICAgICAgICAgICAgICAgICA8L0lubGluZUxpbms+eycgJ31cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucGFzdGVTdWJ0aXRsZTMnfSl9XG4gICAgICAgICAgICAgICAgICA8SW5saW5lTGlua1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnBhc3RlU3VidGl0bGU0J30pfVxuICAgICAgICAgICAgICAgICAgPC9JbmxpbmVMaW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRTdHlsZS51cmwgfHwgJyd9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHt0YXJnZXQ6IHt2YWx1ZX19KSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0TWFwU3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICAgIHVybDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6ICdDdXN0b20gU3R5bGUnLFxuICAgICAgICAgICAgICAgICAgICAgIGljb246IE5PX0JBU0VNQVBfSUNPTlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGh0dHBzOi8vYmFzZW1hcHMuY2FydG9jZG4uY29tL2dsL3Bvc2l0cm9uLWdsLXN0eWxlL3N0eWxlLmpzb25cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuXG4gICAgICAgICAgICAgIDxTdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hUaXRsZSd9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXN1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTEnfSl9XG4gICAgICAgICAgICAgICAgICA8SW5saW5lTGluayB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly93d3cubWFwYm94LmNvbS9zdHVkaW8vc3R5bGVzL1wiPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICBtYXBib3hcbiAgICAgICAgICAgICAgICAgIDwvSW5saW5lTGluaz57JyAnfVxuICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wdWJsaXNoU3VidGl0bGUyJ30pfVxuICAgICAgICAgICAgICAgICAgPElubGluZUxpbmtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9zdHVkaW8tbWFudWFsLXB1Ymxpc2gvXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeycgJ31cbiAgICAgICAgICAgICAgICAgICAge2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5wdWJsaXNoU3VidGl0bGUzJ30pfVxuICAgICAgICAgICAgICAgICAgPC9JbmxpbmVMaW5rPnsnICd9XG4gICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTQnfSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucHVibGlzaFN1YnRpdGxlNSd9KX1cbiAgICAgICAgICAgICAgICAgIDxJbmxpbmVMaW5rXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvaG93LWFjY2Vzcy10b2tlbnMtd29yay9cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7JyAnfVxuICAgICAgICAgICAgICAgICAgICB7aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogJ21vZGFsLmFkZFN0eWxlLnB1Ymxpc2hTdWJ0aXRsZTYnfSl9XG4gICAgICAgICAgICAgICAgICA8L0lubGluZUxpbms+eycgJ31cbiAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuYWRkU3R5bGUucHVibGlzaFN1YnRpdGxlNyd9KX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0U3R5bGUuYWNjZXNzVG9rZW4gfHwgJyd9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHt0YXJnZXQ6IHt2YWx1ZX19KSA9PiB0aGlzLnByb3BzLmlucHV0TWFwU3R5bGUoe2FjY2Vzc1Rva2VuOiB2YWx1ZX0pfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6ICdtb2RhbC5hZGRTdHlsZS5leGFtcGxlVG9rZW4nfSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuYWRkU3R5bGUubmFtaW5nVGl0bGUnfSAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRTdHlsZS5sYWJlbCB8fCAnJ31cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoe3RhcmdldDoge3ZhbHVlfX0pID0+IHRoaXMucHJvcHMuaW5wdXRNYXBTdHlsZSh7bGFiZWw6IHZhbHVlfSl9XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5hbWUgeW91ciBzdHlsZVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgICAgICA8L1N0eWxlZE1vZGFsVmVydGljYWxQYW5lbD5cbiAgICAgICAgICAgIDxQcmV2aWV3TWFwPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdwcmV2aWV3LXRpdGxlJywge1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGlucHV0U3R5bGUuZXJyb3JcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtpbnB1dFN0eWxlLmVycm9yXG4gICAgICAgICAgICAgICAgICA/IEVycm9yTXNnLnN0eWxlRXJyb3JcbiAgICAgICAgICAgICAgICAgIDogKGlucHV0U3R5bGUuc3R5bGUgJiYgaW5wdXRTdHlsZS5zdHlsZS5uYW1lKSB8fCAnJ31cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxTdHlsZWRQcmV2aWV3SW1hZ2UgY2xhc3NOYW1lPVwicHJldmlldy1pbWFnZVwiPlxuICAgICAgICAgICAgICAgIHsvKiogTm90ZSwgd2UgbmVlZCB0aGUgTWFwIHRvIHJlbmRlciB3aXRoIGVycm9yZWQgcGFyYW1zIHRvIGdldCBzdHlsZS5lcnJvciBtZXNzYWdlcyAqL31cbiAgICAgICAgICAgICAgICB7IWlucHV0U3R5bGUuaXNWYWxpZCA/IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHJldmlldy1pbWFnZS1zcGlubmVyXCIgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZE1hcENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPE1hcFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5tYXBQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuX3NldE1hcFJlZn1cbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Ake2Jhc2VNYXBMaWJyYXJ5TmFtZX0tJHt0aGlzLnN0YXRlLnJlUmVuZGVyS2V5fS0ke2lucHV0U3R5bGUudXJsfS0ke21hcGJveEFwaUFjY2Vzc1Rva2VufWB9XG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXBXLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBNYXBIXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBtYXBTdHlsZT17aW5wdXRTdHlsZS51cmwgPT09IG51bGwgPyB1bmRlZmluZWQgOiBpbnB1dFN0eWxlLnVybH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvU3R5bGVkTWFwQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvU3R5bGVkUHJldmlld0ltYWdlPlxuICAgICAgICAgICAgPC9QcmV2aWV3TWFwPlxuICAgICAgICAgIDwvU3R5bGVkTW9kYWxDb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluamVjdEludGwocG9seWZpbGwoQWRkTWFwU3R5bGVNb2RhbCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBZGRNYXBTdHlsZU1vZGFsRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLHNCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxpQkFBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssV0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sa0JBQUEsR0FBQU4sT0FBQTtBQU9BLElBQUFPLE9BQUEsR0FBQVAsT0FBQTtBQUdBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFX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