react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
390 lines (321 loc) • 41.6 kB
JavaScript
'use strict';
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; }; }();
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; }
import React from 'react';
import PropTypes from 'prop-types';
import { ReactSVGPanZoom, TOOL_NONE, TOOL_PAN, TOOL_ZOOM_IN, TOOL_ZOOM_OUT, TOOL_AUTO } from 'react-svg-pan-zoom';
import * as constants from '../../constants';
import State from './state';
function mode2Tool(mode) {
switch (mode) {
case constants.MODE_2D_PAN:
return TOOL_PAN;
case constants.MODE_2D_ZOOM_IN:
return TOOL_ZOOM_IN;
case constants.MODE_2D_ZOOM_OUT:
return TOOL_ZOOM_OUT;
case constants.MODE_IDLE:
return TOOL_AUTO;
default:
return TOOL_NONE;
}
}
function mode2PointerEvents(mode) {
switch (mode) {
case constants.MODE_DRAWING_LINE:
case constants.MODE_DRAWING_HOLE:
case constants.MODE_DRAWING_ITEM:
case constants.MODE_DRAGGING_HOLE:
case constants.MODE_DRAGGING_ITEM:
case constants.MODE_DRAGGING_LINE:
case constants.MODE_DRAGGING_VERTEX:
return { pointerEvents: 'none' };
default:
return {};
}
}
function mode2Cursor(mode) {
switch (mode) {
case constants.MODE_DRAGGING_HOLE:
case constants.MODE_DRAGGING_LINE:
case constants.MODE_DRAGGING_VERTEX:
case constants.MODE_DRAGGING_ITEM:
return { cursor: 'move' };
case constants.MODE_ROTATING_ITEM:
return { cursor: 'ew-resize' };
case constants.MODE_WAITING_DRAWING_LINE:
case constants.MODE_DRAWING_LINE:
return { cursor: 'crosshair' };
default:
return { cursor: 'default' };
}
}
function mode2DetectAutopan(mode) {
switch (mode) {
case constants.MODE_DRAWING_LINE:
case constants.MODE_DRAGGING_LINE:
case constants.MODE_DRAGGING_VERTEX:
case constants.MODE_DRAGGING_HOLE:
case constants.MODE_DRAGGING_ITEM:
case constants.MODE_DRAWING_HOLE:
case constants.MODE_DRAWING_ITEM:
return true;
default:
return false;
}
}
function extractElementData(node) {
while (!node.attributes.getNamedItem('data-element-root') && node.tagName !== 'svg') {
node = node.parentNode;
}
if (node.tagName === 'svg') return null;
return {
part: node.attributes.getNamedItem('data-part') ? node.attributes.getNamedItem('data-part').value : undefined,
layer: node.attributes.getNamedItem('data-layer').value,
prototype: node.attributes.getNamedItem('data-prototype').value,
selected: node.attributes.getNamedItem('data-selected').value === 'true',
id: node.attributes.getNamedItem('data-id').value,
name: node.attributes.getNamedItem('data-name') ? node.attributes.getNamedItem('data-name').value : null
};
}
var Viewer2D = function (_React$Component) {
_inherits(Viewer2D, _React$Component);
function Viewer2D() {
_classCallCheck(this, Viewer2D);
return _possibleConstructorReturn(this, (Viewer2D.__proto__ || Object.getPrototypeOf(Viewer2D)).apply(this, arguments));
}
_createClass(Viewer2D, [{
key: 'componentDidMount',
value: function componentDidMount() {
var _props = this.props,
height = _props.height,
width = _props.width,
state = _props.state;
this.Viewer.fitToViewer();
var scale = this.getScale(state.scene.width, state.scene.height, width, height);
this.Viewer.setPointOnViewerCenter(this.props.state.scene.width / 2, this.props.state.scene.height / 2, scale);
}
}, {
key: 'getScale',
value: function getScale(sceneWidth, sceneHeight, width, height) {
var scaleHeight = height / sceneHeight;
var scaleWidth = width / sceneWidth;
return Math.min(scaleHeight, scaleWidth);
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps) {
var _props2 = this.props,
nextWidth = _props2.width,
nextHeight = _props2.height,
nextState = _props2.state;
var prevWidth = prevProps.width,
prevHeight = prevProps.height,
prevState = prevProps.state;
var _prevState$scene = prevState.scene,
prevSceneWidth = _prevState$scene.width,
prevSceneHeight = _prevState$scene.height;
var _nextState$scene = nextState.scene,
nextSceneWidth = _nextState$scene.width,
nextSceneHeight = _nextState$scene.height;
var dimensionsExits = nextWidth && nextHeight && nextSceneWidth && nextSceneHeight;
var sceneDimensionsChanged = nextSceneWidth != prevSceneWidth || nextSceneHeight != prevSceneHeight;
var containerDimensionsChanged = nextWidth != prevWidth || nextHeight != prevHeight;
if (dimensionsExits && (sceneDimensionsChanged || containerDimensionsChanged)) {
this.Viewer.fitToViewer();
var scale = this.getScale(nextSceneWidth, nextSceneHeight, nextWidth, nextHeight);
this.Viewer.setPointOnViewerCenter(nextSceneWidth / 2, nextSceneHeight / 2, scale);
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props3 = this.props,
state = _props3.state,
width = _props3.width,
height = _props3.height,
onSelectArea = _props3.onSelectArea;
var _context = this.context,
viewer2DActions = _context.viewer2DActions,
linesActions = _context.linesActions,
holesActions = _context.holesActions,
verticesActions = _context.verticesActions,
itemsActions = _context.itemsActions,
areaActions = _context.areaActions,
projectActions = _context.projectActions,
catalog = _context.catalog;
var viewer2D = state.viewer2D,
mode = state.mode,
scene = state.scene;
var layerID = scene.selectedLayer;
var mapCursorPosition = function mapCursorPosition(_ref) {
var x = _ref.x,
y = _ref.y;
return { x: x, y: -y + scene.height };
};
var onMouseMove = function onMouseMove(viewerEvent) {
//workaround that allow imageful component to work
var evt = new Event('mousemove-planner-event');
evt.viewerEvent = viewerEvent;
document.dispatchEvent(evt);
var _mapCursorPosition = mapCursorPosition(viewerEvent),
x = _mapCursorPosition.x,
y = _mapCursorPosition.y;
projectActions.updateMouseCoord({ x: x, y: y });
switch (mode) {
case constants.MODE_DRAWING_LINE:
linesActions.updateDrawingLine(x, y, state.snapMask);
break;
case constants.MODE_DRAWING_HOLE:
holesActions.updateDrawingHole(layerID, x, y);
break;
case constants.MODE_DRAWING_ITEM:
itemsActions.updateDrawingItem(layerID, x, y);
break;
case constants.MODE_DRAGGING_HOLE:
holesActions.updateDraggingHole(x, y);
break;
case constants.MODE_DRAGGING_LINE:
linesActions.updateDraggingLine(x, y, state.snapMask);
break;
case constants.MODE_DRAGGING_VERTEX:
verticesActions.updateDraggingVertex(x, y, state.snapMask);
break;
case constants.MODE_DRAGGING_ITEM:
itemsActions.updateDraggingItem(x, y);
break;
case constants.MODE_ROTATING_ITEM:
itemsActions.updateRotatingItem(x, y);
break;
}
viewerEvent.originalEvent.stopPropagation();
};
var onMouseUp = function onMouseUp(viewerEvent) {
var event = viewerEvent.originalEvent;
var evt = new Event('mouseup-planner-event');
evt.viewerEvent = viewerEvent;
document.dispatchEvent(evt);
var _mapCursorPosition2 = mapCursorPosition(viewerEvent),
x = _mapCursorPosition2.x,
y = _mapCursorPosition2.y;
switch (mode) {
case constants.MODE_IDLE:
var elementData = extractElementData(event.target);
if (elementData && elementData.selected) return;
switch (elementData ? elementData.prototype : 'none') {
case 'areas':
areaActions.selectArea(elementData.layer, elementData.id, elementData.name);
onSelectArea(elementData.name);
break;
case 'none':
projectActions.unselectAll();
onSelectArea(null);
break;
}
break;
case constants.MODE_WAITING_DRAWING_LINE:
linesActions.beginDrawingLine(layerID, x, y, state.snapMask);
break;
case constants.MODE_DRAWING_LINE:
linesActions.endDrawingLine(x, y, state.snapMask);
linesActions.beginDrawingLine(layerID, x, y, state.snapMask);
break;
case constants.MODE_DRAWING_HOLE:
holesActions.endDrawingHole(layerID, x, y);
break;
case constants.MODE_DRAWING_ITEM:
itemsActions.endDrawingItem(layerID, x, y);
break;
case constants.MODE_DRAGGING_LINE:
linesActions.endDraggingLine(x, y, state.snapMask);
break;
case constants.MODE_DRAGGING_VERTEX:
verticesActions.endDraggingVertex(x, y, state.snapMask);
break;
case constants.MODE_DRAGGING_ITEM:
itemsActions.endDraggingItem(x, y);
break;
case constants.MODE_DRAGGING_HOLE:
holesActions.endDraggingHole(x, y);
break;
case constants.MODE_ROTATING_ITEM:
itemsActions.endRotatingItem(x, y);
break;
}
event.stopPropagation();
};
var onChangeValue = function onChangeValue(value) {
projectActions.updateZoomScale(value.a);
return viewer2DActions.updateCameraView(value);
};
var onChangeTool = function onChangeTool(tool) {
switch (tool) {
case TOOL_NONE:
projectActions.selectToolEdit();
break;
case TOOL_PAN:
viewer2DActions.selectToolPan();
break;
case TOOL_ZOOM_IN:
viewer2DActions.selectToolZoomIn();
break;
case TOOL_ZOOM_OUT:
viewer2DActions.selectToolZoomOut();
break;
}
};
var scale = this.getScale(scene.width, scene.height, width, height);
return React.createElement(
ReactSVGPanZoom,
{
ref: function ref(Viewer) {
return _this2.Viewer = Viewer;
},
width: width,
height: height,
value: viewer2D.isEmpty() ? null : viewer2D.toJS(),
onChangeValue: onChangeValue,
background: 'transparent',
tool: mode2Tool(mode),
toolbarPosition: 'none',
onChangeTool: onChangeTool,
detectAutoPan: mode2DetectAutopan(mode),
onMouseUp: onMouseUp,
SVGBackground: 'transparent',
preventPanOutside: true,
scaleFactorMin: scale,
miniaturePosition: 'none' },
React.createElement(
'svg',
{ width: scene.width, height: scene.height },
React.createElement(
'g',
{ style: Object.assign(mode2Cursor(mode), mode2PointerEvents(mode)) },
React.createElement(State, { state: state, catalog: catalog })
)
)
);
}
}]);
return Viewer2D;
}(React.Component);
Viewer2D.propTypes = {
state: PropTypes.object.isRequired,
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired
};
Viewer2D.contextTypes = {
viewer2DActions: PropTypes.object.isRequired,
linesActions: PropTypes.object.isRequired,
holesActions: PropTypes.object.isRequired,
verticesActions: PropTypes.object.isRequired,
itemsActions: PropTypes.object.isRequired,
areaActions: PropTypes.object.isRequired,
projectActions: PropTypes.object.isRequired,
catalog: PropTypes.object.isRequired
};
export default Viewer2D;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdlcjJkL3ZpZXdlcjJkLmpzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsIlJlYWN0U1ZHUGFuWm9vbSIsIlRPT0xfTk9ORSIsIlRPT0xfUEFOIiwiVE9PTF9aT09NX0lOIiwiVE9PTF9aT09NX09VVCIsIlRPT0xfQVVUTyIsImNvbnN0YW50cyIsIlN0YXRlIiwibW9kZTJUb29sIiwibW9kZSIsIk1PREVfMkRfUEFOIiwiTU9ERV8yRF9aT09NX0lOIiwiTU9ERV8yRF9aT09NX09VVCIsIk1PREVfSURMRSIsIm1vZGUyUG9pbnRlckV2ZW50cyIsIk1PREVfRFJBV0lOR19MSU5FIiwiTU9ERV9EUkFXSU5HX0hPTEUiLCJNT0RFX0RSQVdJTkdfSVRFTSIsIk1PREVfRFJBR0dJTkdfSE9MRSIsIk1PREVfRFJBR0dJTkdfSVRFTSIsIk1PREVfRFJBR0dJTkdfTElORSIsIk1PREVfRFJBR0dJTkdfVkVSVEVYIiwicG9pbnRlckV2ZW50cyIsIm1vZGUyQ3Vyc29yIiwiY3Vyc29yIiwiTU9ERV9ST1RBVElOR19JVEVNIiwiTU9ERV9XQUlUSU5HX0RSQVdJTkdfTElORSIsIm1vZGUyRGV0ZWN0QXV0b3BhbiIsImV4dHJhY3RFbGVtZW50RGF0YSIsIm5vZGUiLCJhdHRyaWJ1dGVzIiwiZ2V0TmFtZWRJdGVtIiwidGFnTmFtZSIsInBhcmVudE5vZGUiLCJwYXJ0IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJsYXllciIsInByb3RvdHlwZSIsInNlbGVjdGVkIiwiaWQiLCJuYW1lIiwiVmlld2VyMkQiLCJwcm9wcyIsImhlaWdodCIsIndpZHRoIiwic3RhdGUiLCJWaWV3ZXIiLCJmaXRUb1ZpZXdlciIsInNjYWxlIiwiZ2V0U2NhbGUiLCJzY2VuZSIsInNldFBvaW50T25WaWV3ZXJDZW50ZXIiLCJzY2VuZVdpZHRoIiwic2NlbmVIZWlnaHQiLCJzY2FsZUhlaWdodCIsInNjYWxlV2lkdGgiLCJNYXRoIiwibWluIiwicHJldlByb3BzIiwibmV4dFdpZHRoIiwibmV4dEhlaWdodCIsIm5leHRTdGF0ZSIsInByZXZXaWR0aCIsInByZXZIZWlnaHQiLCJwcmV2U3RhdGUiLCJwcmV2U2NlbmVXaWR0aCIsInByZXZTY2VuZUhlaWdodCIsIm5leHRTY2VuZVdpZHRoIiwibmV4dFNjZW5lSGVpZ2h0IiwiZGltZW5zaW9uc0V4aXRzIiwic2NlbmVEaW1lbnNpb25zQ2hhbmdlZCIsImNvbnRhaW5lckRpbWVuc2lvbnNDaGFuZ2VkIiwib25TZWxlY3RBcmVhIiwiY29udGV4dCIsInZpZXdlcjJEQWN0aW9ucyIsImxpbmVzQWN0aW9ucyIsImhvbGVzQWN0aW9ucyIsInZlcnRpY2VzQWN0aW9ucyIsIml0ZW1zQWN0aW9ucyIsImFyZWFBY3Rpb25zIiwicHJvamVjdEFjdGlvbnMiLCJjYXRhbG9nIiwidmlld2VyMkQiLCJsYXllcklEIiwic2VsZWN0ZWRMYXllciIsIm1hcEN1cnNvclBvc2l0aW9uIiwieCIsInkiLCJvbk1vdXNlTW92ZSIsImV2dCIsIkV2ZW50Iiwidmlld2VyRXZlbnQiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJ1cGRhdGVNb3VzZUNvb3JkIiwidXBkYXRlRHJhd2luZ0xpbmUiLCJzbmFwTWFzayIsInVwZGF0ZURyYXdpbmdIb2xlIiwidXBkYXRlRHJhd2luZ0l0ZW0iLCJ1cGRhdGVEcmFnZ2luZ0hvbGUiLCJ1cGRhdGVEcmFnZ2luZ0xpbmUiLCJ1cGRhdGVEcmFnZ2luZ1ZlcnRleCIsInVwZGF0ZURyYWdnaW5nSXRlbSIsInVwZGF0ZVJvdGF0aW5nSXRlbSIsIm9yaWdpbmFsRXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJvbk1vdXNlVXAiLCJldmVudCIsImVsZW1lbnREYXRhIiwidGFyZ2V0Iiwic2VsZWN0QXJlYSIsInVuc2VsZWN0QWxsIiwiYmVnaW5EcmF3aW5nTGluZSIsImVuZERyYXdpbmdMaW5lIiwiZW5kRHJhd2luZ0hvbGUiLCJlbmREcmF3aW5nSXRlbSIsImVuZERyYWdnaW5nTGluZSIsImVuZERyYWdnaW5nVmVydGV4IiwiZW5kRHJhZ2dpbmdJdGVtIiwiZW5kRHJhZ2dpbmdIb2xlIiwiZW5kUm90YXRpbmdJdGVtIiwib25DaGFuZ2VWYWx1ZSIsInVwZGF0ZVpvb21TY2FsZSIsImEiLCJ1cGRhdGVDYW1lcmFWaWV3Iiwib25DaGFuZ2VUb29sIiwidG9vbCIsInNlbGVjdFRvb2xFZGl0Iiwic2VsZWN0VG9vbFBhbiIsInNlbGVjdFRvb2xab29tSW4iLCJzZWxlY3RUb29sWm9vbU91dCIsImlzRW1wdHkiLCJ0b0pTIiwiT2JqZWN0IiwiYXNzaWduIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwib2JqZWN0IiwiaXNSZXF1aXJlZCIsIm51bWJlciIsImNvbnRleHRUeXBlcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFFQSxPQUFPQSxLQUFQLE1BQWtCLE9BQWxCO0FBQ0EsT0FBT0MsU0FBUCxNQUFzQixZQUF0Qjs7QUFFQSxTQUFTQyxlQUFULEVBQTBCQyxTQUExQixFQUFxQ0MsUUFBckMsRUFBK0NDLFlBQS9DLEVBQTZEQyxhQUE3RCxFQUE0RUMsU0FBNUUsUUFBNkYsb0JBQTdGO0FBQ0EsT0FBTyxLQUFLQyxTQUFaLE1BQTJCLGlCQUEzQjtBQUNBLE9BQU9DLEtBQVAsTUFBa0IsU0FBbEI7O0FBRUEsU0FBU0MsU0FBVCxDQUFtQkMsSUFBbkIsRUFBeUI7QUFDdkIsVUFBUUEsSUFBUjtBQUNFLFNBQUtILFVBQVVJLFdBQWY7QUFDRSxhQUFPUixRQUFQO0FBQ0YsU0FBS0ksVUFBVUssZUFBZjtBQUNFLGFBQU9SLFlBQVA7QUFDRixTQUFLRyxVQUFVTSxnQkFBZjtBQUNFLGFBQU9SLGFBQVA7QUFDRixTQUFLRSxVQUFVTyxTQUFmO0FBQ0UsYUFBT1IsU0FBUDtBQUNGO0FBQ0UsYUFBT0osU0FBUDtBQVZKO0FBWUQ7O0FBRUQsU0FBU2Esa0JBQVQsQ0FBNEJMLElBQTVCLEVBQWtDO0FBQ2hDLFVBQVFBLElBQVI7QUFDRSxTQUFLSCxVQUFVUyxpQkFBZjtBQUNBLFNBQUtULFVBQVVVLGlC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LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0IHsgUmVhY3RTVkdQYW5ab29tLCBUT09MX05PTkUsIFRPT0xfUEFOLCBUT09MX1pPT01fSU4sIFRPT0xfWk9PTV9PVVQsIFRPT0xfQVVUTyB9IGZyb20gJ3JlYWN0LXN2Zy1wYW4tem9vbSc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCBTdGF0ZSBmcm9tICcuL3N0YXRlJztcblxuZnVuY3Rpb24gbW9kZTJUb29sKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV8yRF9QQU46XG4gICAgICByZXR1cm4gVE9PTF9QQU47XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV8yRF9aT09NX0lOOlxuICAgICAgcmV0dXJuIFRPT0xfWk9PTV9JTjtcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFXzJEX1pPT01fT1VUOlxuICAgICAgcmV0dXJuIFRPT0xfWk9PTV9PVVQ7XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9JRExFOlxuICAgICAgcmV0dXJuIFRPT0xfQVVUTztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFRPT0xfTk9ORTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb2RlMlBvaW50ZXJFdmVudHMobW9kZSkge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfTElORTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfSE9MRTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfSVRFTTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQUdHSU5HX0hPTEU6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19JVEVNOlxuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfTElORTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQUdHSU5HX1ZFUlRFWDpcbiAgICAgIHJldHVybiB7IHBvaW50ZXJFdmVudHM6ICdub25lJyB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb2RlMkN1cnNvcihtb2RlKSB7XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfSE9MRTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQUdHSU5HX0xJTkU6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19WRVJURVg6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19JVEVNOlxuICAgICAgcmV0dXJuIHsgY3Vyc29yOiAnbW92ZScgfTtcblxuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfUk9UQVRJTkdfSVRFTTpcbiAgICAgIHJldHVybiB7IGN1cnNvcjogJ2V3LXJlc2l6ZScgfTtcblxuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfV0FJVElOR19EUkFXSU5HX0xJTkU6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFXSU5HX0xJTkU6XG4gICAgICByZXR1cm4geyBjdXJzb3I6ICdjcm9zc2hhaXInIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGN1cnNvcjogJ2RlZmF1bHQnIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW9kZTJEZXRlY3RBdXRvcGFuKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFXSU5HX0xJTkU6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19MSU5FOlxuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfVkVSVEVYOlxuICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfSE9MRTpcbiAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQUdHSU5HX0lURU06XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFXSU5HX0hPTEU6XG4gICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFXSU5HX0lURU06XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVsZW1lbnREYXRhKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLWVsZW1lbnQtcm9vdCcpICYmIG5vZGUudGFnTmFtZSAhPT0gJ3N2ZycpIHtcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIGlmIChub2RlLnRhZ05hbWUgPT09ICdzdmcnKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHBhcnQ6IG5vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtcGFydCcpID8gbm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1wYXJ0JykudmFsdWUgOiB1bmRlZmluZWQsXG4gICAgbGF5ZXI6IG5vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtbGF5ZXInKS52YWx1ZSxcbiAgICBwcm90b3R5cGU6IG5vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtcHJvdG90eXBlJykudmFsdWUsXG4gICAgc2VsZWN0ZWQ6IG5vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtc2VsZWN0ZWQnKS52YWx1ZSA9PT0gJ3RydWUnLFxuICAgIGlkOiBub2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLWlkJykudmFsdWUsXG4gICAgbmFtZTogbm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1uYW1lJykgPyBub2RlLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLW5hbWUnKS52YWx1ZSA6IG51bGwsXG4gIH1cbn1cblxuY2xhc3MgVmlld2VyMkQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRoLHN0YXRlfSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5WaWV3ZXIuZml0VG9WaWV3ZXIoKTtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0U2NhbGUoc3RhdGUuc2NlbmUud2lkdGgsIHN0YXRlLnNjZW5lLmhlaWdodCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5WaWV3ZXIuc2V0UG9pbnRPblZpZXdlckNlbnRlcih0aGlzLnByb3BzLnN0YXRlLnNjZW5lLndpZHRoLzIsIHRoaXMucHJvcHMuc3RhdGUuc2NlbmUuaGVpZ2h0LzIsIHNjYWxlKVxuICB9XG4gIGdldFNjYWxlKHNjZW5lV2lkdGgsIHNjZW5lSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KXtcbiAgICBjb25zdCBzY2FsZUhlaWdodCA9IGhlaWdodC9zY2VuZUhlaWdodDtcbiAgICBjb25zdCBzY2FsZVdpZHRoID0gd2lkdGgvc2NlbmVXaWR0aDtcbiAgICByZXR1cm4gTWF0aC5taW4oc2NhbGVIZWlnaHQsc2NhbGVXaWR0aCk7XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcyl7XG4gICAgY29uc3Qge3dpZHRoOiBuZXh0V2lkdGgsIGhlaWdodDogbmV4dEhlaWdodCwgc3RhdGU6IG5leHRTdGF0ZSB9ID0gdGhpcy5wcm9wczsgXG4gICAgY29uc3Qge3dpZHRoOiBwcmV2V2lkdGgsIGhlaWdodDogcHJldkhlaWdodCwgc3RhdGU6IHByZXZTdGF0ZSB9ID0gcHJldlByb3BzOyBcbiAgICBjb25zdCB7d2lkdGg6IHByZXZTY2VuZVdpZHRoLCBoZWlnaHQ6IHByZXZTY2VuZUhlaWdodH0gPSBwcmV2U3RhdGUuc2NlbmU7XG4gICAgY29uc3Qge3dpZHRoOiBuZXh0U2NlbmVXaWR0aCwgaGVpZ2h0OiBuZXh0U2NlbmVIZWlnaHR9ID0gbmV4dFN0YXRlLnNjZW5lO1xuXG4gICAgY29uc3QgZGltZW5zaW9uc0V4aXRzID0gbmV4dFdpZHRoICYmIG5leHRIZWlnaHQgJiYgbmV4dFNjZW5lV2lkdGggJiYgbmV4dFNjZW5lSGVpZ2h0O1xuICAgIGNvbnN0IHNjZW5lRGltZW5zaW9uc0NoYW5nZWQgPSBuZXh0U2NlbmVXaWR0aCAhPSBwcmV2U2NlbmVXaWR0aCB8fCBuZXh0U2NlbmVIZWlnaHQgIT0gcHJldlNjZW5lSGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbWVuc2lvbnNDaGFuZ2VkID0gbmV4dFdpZHRoICE9IHByZXZXaWR0aCB8fCBuZXh0SGVpZ2h0ICE9IHByZXZIZWlnaHQ7XG4gXG4gICAgaWYoZGltZW5zaW9uc0V4aXRzICYmIChzY2VuZURpbWVuc2lvbnNDaGFuZ2VkIHx8IGNvbnRhaW5lckRpbWVuc2lvbnNDaGFuZ2VkKSl7XG4gICAgICB0aGlzLlZpZXdlci5maXRUb1ZpZXdlcigpO1xuICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmdldFNjYWxlKG5leHRTY2VuZVdpZHRoLCBuZXh0U2NlbmVIZWlnaHQsIG5leHRXaWR0aCwgbmV4dEhlaWdodCk7XG4gICAgICB0aGlzLlZpZXdlci5zZXRQb2ludE9uVmlld2VyQ2VudGVyKG5leHRTY2VuZVdpZHRoLzIsIG5leHRTY2VuZUhlaWdodC8yLCBzY2FsZSlcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuXG4gICAgY29uc3QgeyBzdGF0ZSwgd2lkdGgsIGhlaWdodCwgb25TZWxlY3RBcmVhIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgdmlld2VyMkRBY3Rpb25zLCBsaW5lc0FjdGlvbnMsIGhvbGVzQWN0aW9ucywgdmVydGljZXNBY3Rpb25zLCBpdGVtc0FjdGlvbnMsIGFyZWFBY3Rpb25zLCBwcm9qZWN0QWN0aW9ucywgY2F0YWxvZyB9ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgbGV0IHsgdmlld2VyMkQsIG1vZGUsIHNjZW5lIH0gPSBzdGF0ZTtcblxuICAgIGxldCBsYXllcklEID0gc2NlbmUuc2VsZWN0ZWRMYXllcjtcblxuICAgIGxldCBtYXBDdXJzb3JQb3NpdGlvbiA9ICh7IHgsIHkgfSkgPT4ge1xuICAgICAgcmV0dXJuIHsgeCwgeTogLXkgKyBzY2VuZS5oZWlnaHQgfVxuICAgIH07XG5cbiAgICBsZXQgb25Nb3VzZU1vdmUgPSB2aWV3ZXJFdmVudCA9PiB7XG5cbiAgICAgIC8vd29ya2Fyb3VuZCB0aGF0IGFsbG93IGltYWdlZnVsIGNvbXBvbmVudCB0byB3b3JrXG4gICAgICB2YXIgZXZ0ID0gbmV3IEV2ZW50KCdtb3VzZW1vdmUtcGxhbm5lci1ldmVudCcpO1xuICAgICAgZXZ0LnZpZXdlckV2ZW50ID0gdmlld2VyRXZlbnQ7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgICAgIGxldCB7IHgsIHkgfSA9IG1hcEN1cnNvclBvc2l0aW9uKHZpZXdlckV2ZW50KTtcblxuICAgICAgcHJvamVjdEFjdGlvbnMudXBkYXRlTW91c2VDb29yZCh7IHgsIHkgfSk7XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfTElORTpcbiAgICAgICAgICBsaW5lc0FjdGlvbnMudXBkYXRlRHJhd2luZ0xpbmUoeCwgeSwgc3RhdGUuc25hcE1hc2spO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBV0lOR19IT0xFOlxuICAgICAgICAgIGhvbGVzQWN0aW9ucy51cGRhdGVEcmF3aW5nSG9sZShsYXllcklELCB4LCB5KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfSVRFTTpcbiAgICAgICAgICBpdGVtc0FjdGlvbnMudXBkYXRlRHJhd2luZ0l0ZW0obGF5ZXJJRCwgeCwgeSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19IT0xFOlxuICAgICAgICAgIGhvbGVzQWN0aW9ucy51cGRhdGVEcmFnZ2luZ0hvbGUoeCwgeSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19MSU5FOlxuICAgICAgICAgIGxpbmVzQWN0aW9ucy51cGRhdGVEcmFnZ2luZ0xpbmUoeCwgeSwgc3RhdGUuc25hcE1hc2spO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfVkVSVEVYOlxuICAgICAgICAgIHZlcnRpY2VzQWN0aW9ucy51cGRhdGVEcmFnZ2luZ1ZlcnRleCh4LCB5LCBzdGF0ZS5zbmFwTWFzayk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFHR0lOR19JVEVNOlxuICAgICAgICAgIGl0ZW1zQWN0aW9ucy51cGRhdGVEcmFnZ2luZ0l0ZW0oeCwgeSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjb25zdGFudHMuTU9ERV9ST1RBVElOR19JVEVNOlxuICAgICAgICAgIGl0ZW1zQWN0aW9ucy51cGRhdGVSb3RhdGluZ0l0ZW0oeCwgeSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHZpZXdlckV2ZW50Lm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuXG5cbiAgICBsZXQgb25Nb3VzZVVwID0gdmlld2VyRXZlbnQgPT4ge1xuICAgICAgbGV0IGV2ZW50ID0gdmlld2VyRXZlbnQub3JpZ2luYWxFdmVudDtcbiAgICAgIHZhciBldnQgPSBuZXcgRXZlbnQoJ21vdXNldXAtcGxhbm5lci1ldmVudCcpO1xuICAgICAgZXZ0LnZpZXdlckV2ZW50ID0gdmlld2VyRXZlbnQ7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgICBsZXQgeyB4LCB5IH0gPSBtYXBDdXJzb3JQb3NpdGlvbih2aWV3ZXJFdmVudCk7XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfSURMRTpcbiAgICAgICAgICBsZXQgZWxlbWVudERhdGEgPSBleHRyYWN0RWxlbWVudERhdGEoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YSAmJiBlbGVtZW50RGF0YS5zZWxlY3RlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgc3dpdGNoIChlbGVtZW50RGF0YSA/IGVsZW1lbnREYXRhLnByb3RvdHlwZSA6ICdub25lJykge1xuICAgICAgICAgICAgY2FzZSAnYXJlYXMnOlxuICAgICAgICAgICAgICBhcmVhQWN0aW9ucy5zZWxlY3RBcmVhKGVsZW1lbnREYXRhLmxheWVyLCBlbGVtZW50RGF0YS5pZCwgZWxlbWVudERhdGEubmFtZSk7XG4gICAgICAgICAgICAgIG9uU2VsZWN0QXJlYShlbGVtZW50RGF0YS5uYW1lKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgICBwcm9qZWN0QWN0aW9ucy51bnNlbGVjdEFsbCgpO1xuICAgICAgICAgICAgICBvblNlbGVjdEFyZWEobnVsbCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX1dBSVRJTkdfRFJBV0lOR19MSU5FOlxuICAgICAgICAgIGxpbmVzQWN0aW9ucy5iZWdpbkRyYXdpbmdMaW5lKGxheWVySUQsIHgsIHksIHN0YXRlLnNuYXBNYXNrKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfTElORTpcbiAgICAgICAgICBsaW5lc0FjdGlvbnMuZW5kRHJhd2luZ0xpbmUoeCwgeSwgc3RhdGUuc25hcE1hc2spO1xuICAgICAgICAgIGxpbmVzQWN0aW9ucy5iZWdpbkRyYXdpbmdMaW5lKGxheWVySUQsIHgsIHksIHN0YXRlLnNuYXBNYXNrKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQVdJTkdfSE9MRTpcbiAgICAgICAgICBob2xlc0FjdGlvbnMuZW5kRHJhd2luZ0hvbGUobGF5ZXJJRCwgeCwgeSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBjb25zdGFudHMuTU9ERV9EUkFXSU5HX0lURU06XG4gICAgICAgICAgaXRlbXNBY3Rpb25zLmVuZERyYXdpbmdJdGVtKGxheWVySUQsIHgsIHkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfTElORTpcbiAgICAgICAgICBsaW5lc0FjdGlvbnMuZW5kRHJhZ2dpbmdMaW5lKHgsIHksIHN0YXRlLnNuYXBNYXNrKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGNvbnN0YW50cy5NT0RFX0RSQUdHSU5HX1ZFUlRFWDpcbiAgICAgICAgICB2ZXJ0aWNlc0FjdGlvbnMuZW5kRHJhZ2dpbmdWZXJ0ZXgoeCwgeSwgc3RhdGUuc25hcE1hc2spO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfSVRFTTpcbiAgICAgICAgICBpdGVtc0FjdGlvbnMuZW5kRHJhZ2dpbmdJdGVtKHgsIHkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfRFJBR0dJTkdfSE9MRTpcbiAgICAgICAgICBob2xlc0FjdGlvbnMuZW5kRHJhZ2dpbmdIb2xlKHgsIHkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgY29uc3RhbnRzLk1PREVfUk9UQVRJTkdfSVRFTTpcbiAgICAgICAgICBpdGVtc0FjdGlvbnMuZW5kUm90YXRpbmdJdGVtKHgsIHkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgbGV0IG9uQ2hhbmdlVmFsdWUgPSAodmFsdWUpID0+IHtcbiAgICAgIHByb2plY3RBY3Rpb25zLnVwZGF0ZVpvb21TY2FsZSh2YWx1ZS5hKTtcbiAgICAgIHJldHVybiB2aWV3ZXIyREFjdGlvbnMudXBkYXRlQ2FtZXJhVmlldyh2YWx1ZSlcbiAgICB9O1xuXG4gICAgbGV0IG9uQ2hhbmdlVG9vbCA9ICh0b29sKSA9PiB7XG4gICAgICBzd2l0Y2ggKHRvb2wpIHtcbiAgICAgICAgY2FzZSBUT09MX05PTkU6XG4gICAgICAgICAgcHJvamVjdEFjdGlvbnMuc2VsZWN0VG9vbEVkaXQoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRPT0xfUEFOOlxuICAgICAgICAgIHZpZXdlcjJEQWN0aW9ucy5zZWxlY3RUb29sUGFuKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUT09MX1pPT01fSU46XG4gICAgICAgICAgdmlld2VyMkRBY3Rpb25zLnNlbGVjdFRvb2xab29tSW4oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRPT0xfWk9PTV9PVVQ6XG4gICAgICAgICAgdmlld2VyMkRBY3Rpb25zLnNlbGVjdFRvb2xab29tT3V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcbiAgIGNvbnN0IHNjYWxlID0gdGhpcy5nZXRTY2FsZShzY2VuZS53aWR0aCwgc2NlbmUuaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiAoXG5cbiAgICAgIDxSZWFjdFNWR1Bhblpvb21cbiAgICAgICAgcmVmPXtWaWV3ZXIgPT4gdGhpcy5WaWV3ZXIgPSBWaWV3ZXJ9XG4gICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgaGVpZ2h0PXtoZWlnaHR9XG4gICAgICAgIHZhbHVlPXt2aWV3ZXIyRC5pc0VtcHR5KCkgPyBudWxsIDogdmlld2VyMkQudG9KUygpfVxuICAgICAgICBvbkNoYW5nZVZhbHVlPXtvbkNoYW5nZVZhbHVlfVxuICAgICAgICBiYWNrZ3JvdW5kPXsndHJhbnNwYXJlbnQnfVxuICAgICAgICB0b29sPXttb2RlMlRvb2wobW9kZSl9XG4gICAgICAgIHRvb2xiYXJQb3NpdGlvbj17J25vbmUnfVxuICAgICAgICBvbkNoYW5nZVRvb2w9e29uQ2hhbmdlVG9vbH1cbiAgICAgICAgZGV0ZWN0QXV0b1Bhbj17bW9kZTJEZXRlY3RBdXRvcGFuKG1vZGUpfVxuICAgICAgICBvbk1vdXNlVXA9e29uTW91c2VVcH1cbiAgICAgICAgU1ZHQmFja2dyb3VuZD17J3RyYW5zcGFyZW50J31cbiAgICAgICAgcHJldmVudFBhbk91dHNpZGU9e3RydWV9XG4gICAgICAgIHNjYWxlRmFjdG9yTWluPXtzY2FsZX1cbiAgICAgICAgbWluaWF0dXJlUG9zaXRpb249J25vbmUnPlxuXG4gICAgICAgIDxzdmcgd2lkdGg9e3NjZW5lLndpZHRofSBoZWlnaHQ9e3NjZW5lLmhlaWdodH0+XG4gICAgICAgICAgPGcgc3R5bGU9e09iamVjdC5hc3NpZ24obW9kZTJDdXJzb3IobW9kZSksIG1vZGUyUG9pbnRlckV2ZW50cyhtb2RlKSl9PlxuICAgICAgICAgICAgPFN0YXRlIHN0YXRlPXtzdGF0ZX0gY2F0YWxvZz17Y2F0YWxvZ30gLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvc3ZnPlxuXG4gICAgICA8L1JlYWN0U1ZHUGFuWm9vbT5cblxuICAgICk7XG4gIH1cblxufVxuXG5WaWV3ZXIyRC5wcm9wVHlwZXMgPSB7XG4gIHN0YXRlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGhlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxufTtcblxuVmlld2VyMkQuY29udGV4dFR5cGVzID0ge1xuICB2aWV3ZXIyREFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgbGluZXNBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGhvbGVzQWN0aW9uczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB2ZXJ0aWNlc0FjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgaXRlbXNBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGFyZWFBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHByb2plY3RBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGNhdGFsb2c6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgVmlld2VyMkQ7Il19