react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
229 lines (183 loc) • 20.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _redux = require('redux');
var _reactRedux = require('react-redux');
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _translator = require('./translator/translator');
var _translator2 = _interopRequireDefault(_translator);
var _catalog = require('./catalog/catalog');
var _catalog2 = _interopRequireDefault(_catalog);
var _export = require('./actions/export');
var _export2 = _interopRequireDefault(_export);
var _objectsUtils = require('./utils/objects-utils');
var _export3 = require('./components/export');
var _version = require('./version');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var wrapperStyle = {
display: 'flex',
flexFlow: 'row nowrap'
};
var ReactPlanner = function (_Component) {
_inherits(ReactPlanner, _Component);
function ReactPlanner() {
_classCallCheck(this, ReactPlanner);
return _possibleConstructorReturn(this, (ReactPlanner.__proto__ || Object.getPrototypeOf(ReactPlanner)).apply(this, arguments));
}
_createClass(ReactPlanner, [{
key: 'getChildContext',
value: function getChildContext() {
var _this2 = this;
return _extends({}, (0, _objectsUtils.objectsMap)(_export2.default, function (actionNamespace) {
return _this2.props[actionNamespace];
}), {
translator: this.props.translator,
catalog: this.props.catalog
});
}
}, {
key: 'componentWillMount',
value: function componentWillMount() {
var store = this.context.store;
var _props = this.props,
projectActions = _props.projectActions,
catalog = _props.catalog,
stateExtractor = _props.stateExtractor,
plugins = _props.plugins,
state = _props.state,
areaActions = _props.areaActions,
heatMapValues = _props.heatMapValues,
heatMapColors = _props.heatMapColors,
newScene = _props.newScene;
plugins.forEach(function (plugin) {
return plugin(store, stateExtractor);
});
projectActions.initCatalog(catalog);
//modified for the viewer
var plannerState = stateExtractor(state);
var scene = plannerState.scene;
var layerID = scene.selectedLayer;
if (newScene) {
projectActions.loadProject(newScene);
}
areaActions.showHeatMapAreas(layerID, heatMapValues, heatMapColors);
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var stateExtractor = nextProps.stateExtractor,
areaActions = nextProps.areaActions,
state = nextProps.state,
projectActions = nextProps.projectActions,
catalog = nextProps.catalog,
newScene = nextProps.newScene;
var plannerState = stateExtractor(state);
var catalogReady = plannerState.getIn(['catalog', 'ready']);
if (!catalogReady) {
projectActions.initCatalog(catalog);
}
if (nextProps.newScene && nextProps.newScene !== newScene) {
var json = JSON.parse(nextProps.newScene);
projectActions.loadProject(json);
}
//AREA KPIS
var scene = plannerState.scene;
var layerID = scene.selectedLayer;
if (!_lodash2.default.isEqual(nextProps.heatMapValues, this.props.heatMapValues)) {
areaActions.showHeatMapAreas(layerID, nextProps.heatMapValues, this.props.heatMapColors);
}
}
}, {
key: 'render',
value: function render() {
var _props2 = this.props,
width = _props2.width,
height = _props2.height,
state = _props2.state,
stateExtractor = _props2.stateExtractor,
props = _objectWithoutProperties(_props2, ['width', 'height', 'state', 'stateExtractor']);
var contentW = width;
var contentH = height;
var extractedState = stateExtractor(state);
//change sizes
contentW = width;
contentH = height;
return _react2.default.createElement(
'div',
{ style: _extends({}, wrapperStyle, { height: height }) },
_react2.default.createElement(_export3.Content, _extends({ width: contentW, height: contentH, state: extractedState }, props, { onWheel: function onWheel(event) {
return event.preventDefault();
} }))
);
}
}]);
return ReactPlanner;
}(_react.Component);
ReactPlanner.propTypes = {
translator: _propTypes2.default.instanceOf(_translator2.default),
catalog: _propTypes2.default.instanceOf(_catalog2.default),
allowProjectFileSupport: _propTypes2.default.bool,
plugins: _propTypes2.default.arrayOf(_propTypes2.default.func),
autosaveKey: _propTypes2.default.string,
autosaveDelay: _propTypes2.default.number,
width: _propTypes2.default.number.isRequired,
height: _propTypes2.default.number.isRequired,
stateExtractor: _propTypes2.default.func.isRequired,
toolbarButtons: _propTypes2.default.array,
sidebarComponents: _propTypes2.default.array,
footerbarComponents: _propTypes2.default.array,
customContents: _propTypes2.default.object,
softwareSignature: _propTypes2.default.string,
//modified for the viewer
heatMapValues: _propTypes2.default.arrayOf(_propTypes2.default.object),
heatMapColors: _propTypes2.default.array,
onSelectArea: _propTypes2.default.func,
newScene: _propTypes2.default.object
};
ReactPlanner.contextTypes = {
store: _propTypes2.default.object.isRequired
};
ReactPlanner.childContextTypes = _extends({}, (0, _objectsUtils.objectsMap)(_export2.default, function () {
return _propTypes2.default.object;
}), {
translator: _propTypes2.default.object,
catalog: _propTypes2.default.object
});
ReactPlanner.defaultProps = {
translator: new _translator2.default(),
catalog: new _catalog2.default(),
plugins: [],
allowProjectFileSupport: true,
softwareSignature: 'React-Planner ' + _version.VERSION,
toolbarButtons: [],
sidebarComponents: [],
footerbarComponents: [],
customContents: {},
heatMapValues: [],
heatMapColors: ['white', 'blue']
};
//redux connect
function mapStateToProps(reduxState) {
return {
state: reduxState
};
}
function mapDispatchToProps(dispatch) {
return (0, _objectsUtils.objectsMap)(_export2.default, function (actionNamespace) {
return (0, _redux.bindActionCreators)(_export2.default[actionNamespace], dispatch);
});
}
exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(ReactPlanner);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFjdC1wbGFubmVyLmpzeCJdLCJuYW1lcyI6WyJ3cmFwcGVyU3R5bGUiLCJkaXNwbGF5IiwiZmxleEZsb3ciLCJSZWFjdFBsYW5uZXIiLCJwcm9wcyIsImFjdGlvbk5hbWVzcGFjZSIsInRyYW5zbGF0b3IiLCJjYXRhbG9nIiwic3RvcmUiLCJjb250ZXh0IiwicHJvamVjdEFjdGlvbnMiLCJzdGF0ZUV4dHJhY3RvciIsInBsdWdpbnMiLCJzdGF0ZSIsImFyZWFBY3Rpb25zIiwiaGVhdE1hcFZhbHVlcyIsImhlYXRNYXBDb2xvcnMiLCJuZXdTY2VuZSIsImZvckVhY2giLCJwbHVnaW4iLCJpbml0Q2F0YWxvZyIsInBsYW5uZXJTdGF0ZSIsInNjZW5lIiwibGF5ZXJJRCIsInNlbGVjdGVkTGF5ZXIiLCJsb2FkUHJvamVjdCIsInNob3dIZWF0TWFwQXJlYXMiLCJuZXh0UHJvcHMiLCJjYXRhbG9nUmVhZHkiLCJnZXRJbiIsImpzb24iLCJKU09OIiwicGFyc2UiLCJpc0VxdWFsIiwid2lkdGgiLCJoZWlnaHQiLCJjb250ZW50VyIsImNvbnRlbnRIIiwiZXh0cmFjdGVkU3RhdGUiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwicHJvcFR5cGVzIiwiaW5zdGFuY2VPZiIsImFsbG93UHJvamVjdEZpbGVTdXBwb3J0IiwiYm9vbCIsImFycmF5T2YiLCJmdW5jIiwiYXV0b3NhdmVLZXkiLCJzdHJpbmciLCJhdXRvc2F2ZURlbGF5IiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsInRvb2xiYXJCdXR0b25zIiwiYXJyYXkiLCJzaWRlYmFyQ29tcG9uZW50cyIsImZvb3RlcmJhckNvbXBvbmVudHMiLCJjdXN0b21Db250ZW50cyIsIm9iamVjdCIsInNvZnR3YXJlU2lnbmF0dXJlIiwib25TZWxlY3RBcmVhIiwiY29udGV4dFR5cGVzIiwiY2hpbGRDb250ZXh0VHlwZXMiLCJkZWZhdWx0UHJvcHMiLCJtYXBTdGF0ZVRvUHJvcHMiLCJyZWR1eFN0YXRlIiwibWFw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bUIsaUJBQVE3RCxlQUFSLENBQW5CLEVBQTZDNkQsUUFBN0MsQ0FBbkI7QUFBQSxHQUFwQixDQUFQO0FBQ0Q7O2tCQUVjLHlCQUFRSCxlQUFSLEVBQXlCRSxrQkFBekIsRUFBNkM5RCxZQUE3QyxDIiwiZmlsZSI6InJlYWN0LXBsYW5uZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGJpbmRBY3Rpb25DcmVhdG9ycyB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgVHJhbnNsYXRvciBmcm9tICcuL3RyYW5zbGF0b3IvdHJhbnNsYXRvcic7XG5pbXBvcnQgQ2F0YWxvZyBmcm9tICcuL2NhdGFsb2cvY2F0YWxvZyc7XG5pbXBvcnQgYWN0aW9ucyBmcm9tICcuL2FjdGlvbnMvZXhwb3J0JztcbmltcG9ydCB7IG9iamVjdHNNYXAgfSBmcm9tICcuL3V0aWxzL29iamVjdHMtdXRpbHMnO1xuaW1wb3J0IHtcbiAgQ29udGVudCxcbn0gZnJvbSAnLi9jb21wb25lbnRzL2V4cG9ydCc7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuY29uc3Qgd3JhcHBlclN0eWxlID0ge1xuICBkaXNwbGF5OiAnZmxleCcsXG4gIGZsZXhGbG93OiAncm93IG5vd3JhcCdcbn07XG5cbmNsYXNzIFJlYWN0UGxhbm5lciBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vYmplY3RzTWFwKGFjdGlvbnMsIGFjdGlvbk5hbWVzcGFjZSA9PiB0aGlzLnByb3BzW2FjdGlvbk5hbWVzcGFjZV0pLFxuICAgICAgdHJhbnNsYXRvcjogdGhpcy5wcm9wcy50cmFuc2xhdG9yLFxuICAgICAgY2F0YWxvZzogdGhpcy5wcm9wcy5jYXRhbG9nLFxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICBsZXQgeyBzdG9yZSB9ID0gdGhpcy5jb250ZXh0O1xuICAgIGxldCB7IHByb2plY3RBY3Rpb25zLCBjYXRhbG9nLCBzdGF0ZUV4dHJhY3RvciwgcGx1Z2lucywgc3RhdGUsIGFyZWFBY3Rpb25zLCBoZWF0TWFwVmFsdWVzLCBoZWF0TWFwQ29sb3JzLCBuZXdTY2VuZSB9ID0gdGhpcy5wcm9wcztcbiAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHBsdWdpbihzdG9yZSwgc3RhdGVFeHRyYWN0b3IpKTtcbiAgICBwcm9qZWN0QWN0aW9ucy5pbml0Q2F0YWxvZyhjYXRhbG9nKTtcblxuICAgIC8vbW9kaWZpZWQgZm9yIHRoZSB2aWV3ZXJcbiAgICBsZXQgcGxhbm5lclN0YXRlID0gc3RhdGVFeHRyYWN0b3Ioc3RhdGUpO1xuICAgIGNvbnN0IHsgc2NlbmUgfSA9IHBsYW5uZXJTdGF0ZTtcbiAgICBjb25zdCBsYXllcklEID0gc2NlbmUuc2VsZWN0ZWRMYXllcjtcbiAgICBpZihuZXdTY2VuZSl7XG4gICAgICBwcm9qZWN0QWN0aW9ucy5sb2FkUHJvamVjdChuZXdTY2VuZSk7XG4gICAgfVxuICAgIGFyZWFBY3Rpb25zLnNob3dIZWF0TWFwQXJlYXMobGF5ZXJJRCwgaGVhdE1hcFZhbHVlcywgaGVhdE1hcENvbG9ycyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGxldCB7IHN0YXRlRXh0cmFjdG9yLCBhcmVhQWN0aW9ucywgc3RhdGUsIHByb2plY3RBY3Rpb25zLCBjYXRhbG9nLCBuZXdTY2VuZSB9ID0gbmV4dFByb3BzO1xuICAgIGxldCBwbGFubmVyU3RhdGUgPSBzdGF0ZUV4dHJhY3RvcihzdGF0ZSk7XG4gICAgbGV0IGNhdGFsb2dSZWFkeSA9IHBsYW5uZXJTdGF0ZS5nZXRJbihbJ2NhdGFsb2cnLCAncmVhZHknXSk7XG4gICAgaWYgKCFjYXRhbG9nUmVhZHkpIHtcbiAgICAgIHByb2plY3RBY3Rpb25zLmluaXRDYXRhbG9nKGNhdGFsb2cpO1xuICAgIH0gXG4gICAgaWYobmV4dFByb3BzLm5ld1NjZW5lICYmIG5leHRQcm9wcy5uZXdTY2VuZSAhPT0gbmV3U2NlbmUpe1xuICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKG5leHRQcm9wcy5uZXdTY2VuZSk7XG4gICAgICBwcm9qZWN0QWN0aW9ucy5sb2FkUHJvamVjdChqc29uKTtcbiAgICB9XG5cbiAgICAvL0FSRUEgS1BJU1xuICAgIGNvbnN0IHsgc2NlbmUgfSA9IHBsYW5uZXJTdGF0ZTtcbiAgICBjb25zdCBsYXllcklEID0gc2NlbmUuc2VsZWN0ZWRMYXllcjtcbiAgICBpZiAoIV8uaXNFcXVhbChuZXh0UHJvcHMuaGVhdE1hcFZhbHVlcywgdGhpcy5wcm9wcy5oZWF0TWFwVmFsdWVzKSkge1xuICAgICAgYXJlYUFjdGlvbnMuc2hvd0hlYXRNYXBBcmVhcyhsYXllcklELCBuZXh0UHJvcHMuaGVhdE1hcFZhbHVlcywgdGhpcy5wcm9wcy5oZWF0TWFwQ29sb3JzKTtcbiAgICB9XG5cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgbGV0IHsgd2lkdGgsIGhlaWdodCwgc3RhdGUsIHN0YXRlRXh0cmFjdG9yLCAuLi5wcm9wcyB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgY29udGVudFcgPSB3aWR0aDtcbiAgICBsZXQgY29udGVudEggPSBoZWlnaHQ7XG4gICAgbGV0IGV4dHJhY3RlZFN0YXRlID0gc3RhdGVFeHRyYWN0b3Ioc3RhdGUpO1xuICAgIC8vY2hhbmdlIHNpemVzXG4gICAgY29udGVudFcgPSB3aWR0aDtcbiAgICBjb250ZW50SCA9IGhlaWdodDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17eyAuLi53cmFwcGVyU3R5bGUsIGhlaWdodCB9fT5cbiAgICAgICAgPENvbnRlbnQgd2lkdGg9e2NvbnRlbnRXfSBoZWlnaHQ9e2NvbnRlbnRIfSBzdGF0ZT17ZXh0cmFjdGVkU3RhdGV9IHsuLi5wcm9wc30gb25XaGVlbD17ZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKX0gLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RQbGFubmVyLnByb3BUeXBlcyA9IHtcbiAgdHJhbnNsYXRvcjogUHJvcFR5cGVzLmluc3RhbmNlT2YoVHJhbnNsYXRvciksXG4gIGNhdGFsb2c6IFByb3BUeXBlcy5pbnN0YW5jZU9mKENhdGFsb2cpLFxuICBhbGxvd1Byb2plY3RGaWxlU3VwcG9ydDogUHJvcFR5cGVzLmJvb2wsXG4gIHBsdWdpbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5mdW5jKSxcbiAgYXV0b3NhdmVLZXk6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGF1dG9zYXZlRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzdGF0ZUV4dHJhY3RvcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdG9vbGJhckJ1dHRvbnM6IFByb3BUeXBlcy5hcnJheSxcbiAgc2lkZWJhckNvbXBvbmVudHM6IFByb3BUeXBlcy5hcnJheSxcbiAgZm9vdGVyYmFyQ29tcG9uZW50czogUHJvcFR5cGVzLmFycmF5LFxuICBjdXN0b21Db250ZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgc29mdHdhcmVTaWduYXR1cmU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8vbW9kaWZpZWQgZm9yIHRoZSB2aWV3ZXJcbiAgaGVhdE1hcFZhbHVlczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gIGhlYXRNYXBDb2xvcnM6IFByb3BUeXBlcy5hcnJheSxcbiAgb25TZWxlY3RBcmVhOiBQcm9wVHlwZXMuZnVuYyxcbiAgbmV3U2NlbmU6IFByb3BUeXBlcy5vYmplY3QsXG59O1xuXG5SZWFjdFBsYW5uZXIuY29udGV4dFR5cGVzID0ge1xuICBzdG9yZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxufTtcblxuUmVhY3RQbGFubmVyLmNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAuLi5vYmplY3RzTWFwKGFjdGlvbnMsICgpID0+IFByb3BUeXBlcy5vYmplY3QpLFxuICB0cmFuc2xhdG9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICBjYXRhbG9nOiBQcm9wVHlwZXMub2JqZWN0LFxufTtcblxuUmVhY3RQbGFubmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgdHJhbnNsYXRvcjogbmV3IFRyYW5zbGF0b3IoKSxcbiAgY2F0YWxvZzogbmV3IENhdGFsb2coKSxcbiAgcGx1Z2luczogW10sXG4gIGFsbG93UHJvamVjdEZpbGVTdXBwb3J0OiB0cnVlLFxuICBzb2Z0d2FyZVNpZ25hdHVyZTogYFJlYWN0LVBsYW5uZXIgJHtWRVJTSU9OfWAsXG4gIHRvb2xiYXJCdXR0b25zOiBbXSxcbiAgc2lkZWJhckNvbXBvbmVudHM6IFtdLFxuICBmb290ZXJiYXJDb21wb25lbnRzOiBbXSxcbiAgY3VzdG9tQ29udGVudHM6IHt9LFxuICBoZWF0TWFwVmFsdWVzOiBbXSxcbiAgaGVhdE1hcENvbG9yczogWyd3aGl0ZScsJ2JsdWUnXSxcbn07XG5cbi8vcmVkdXggY29ubmVjdFxuZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzKHJlZHV4U3RhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogcmVkdXhTdGF0ZVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCkge1xuICByZXR1cm4gb2JqZWN0c01hcChhY3Rpb25zLCBhY3Rpb25OYW1lc3BhY2UgPT4gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbnNbYWN0aW9uTmFtZXNwYWNlXSwgZGlzcGF0Y2gpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoUmVhY3RQbGFubmVyKTtcbiJdfQ==