UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

398 lines (321 loc) 33.9 kB
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 _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; }; 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 { Record, List, Map, fromJS } from 'immutable'; import { MODE_IDLE, MODE_2D_PAN } from './constants'; import { SNAP_MASK } from './utils/snap'; var safeLoadMapList = function safeLoadMapList(mapList, Model, defaultMap) { return mapList ? new Map(mapList).map(function (m) { return new Model(m); }).toMap() : defaultMap || new Map(); }; export var Guide = function (_Record) { _inherits(Guide, _Record); function Guide() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Guide); return _possibleConstructorReturn(this, (Guide.__proto__ || Object.getPrototypeOf(Guide)).call(this, _extends({}, json, { properties: fromJS(json.properties || {}) }))); } return Guide; }(Record({ id: '', type: '', properties: Map() }, 'Guide')); export var DefaultGuides = new Map({ 'h1': new Guide({ id: 'h1', type: 'horizontal-streak', properties: { step: 20, colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd'] } }), 'v1': new Guide({ id: 'v1', type: 'vertical-streak', properties: { step: 20, colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd'] } }) }); export var ElementsSet = function (_Record2) { _inherits(ElementsSet, _Record2); function ElementsSet() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, ElementsSet); return _possibleConstructorReturn(this, (ElementsSet.__proto__ || Object.getPrototypeOf(ElementsSet)).call(this, { vertices: new List(json.vertices || []), lines: new List(json.lines || []), holes: new List(json.holes || []), areas: new List(json.areas || []), items: new List(json.items || []) })); } return ElementsSet; }(Record({ vertices: new List(), lines: new List(), holes: new List(), areas: new List(), items: new List() }, 'ElementsSet')); var sharedAttributes = { id: '', type: '', prototype: '', name: '', misc: new Map(), selected: false, properties: new Map() }; export var Vertex = function (_Record3) { _inherits(Vertex, _Record3); function Vertex() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Vertex); return _possibleConstructorReturn(this, (Vertex.__proto__ || Object.getPrototypeOf(Vertex)).call(this, _extends({}, json, { lines: new List(json.lines || []), areas: new List(json.areas || []) }))); } return Vertex; }(Record(_extends({}, sharedAttributes, { x: -1, y: -1, prototype: 'vertices', lines: new List(), areas: new List() }), 'Vertex')); export var Line = function (_Record4) { _inherits(Line, _Record4); function Line() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Line); return _possibleConstructorReturn(this, (Line.__proto__ || Object.getPrototypeOf(Line)).call(this, _extends({}, json, { properties: fromJS(json.properties || {}), vertices: new List(json.vertices || []), holes: new List(json.holes || []) }))); } return Line; }(Record(_extends({}, sharedAttributes, { prototype: 'lines', vertices: new List(), holes: new List() }), 'Line')); export var Hole = function (_Record5) { _inherits(Hole, _Record5); function Hole() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Hole); return _possibleConstructorReturn(this, (Hole.__proto__ || Object.getPrototypeOf(Hole)).call(this, _extends({}, json, { properties: fromJS(json.properties || {}) }))); } return Hole; }(Record(_extends({}, sharedAttributes, { prototype: 'holes', offset: -1, line: '' }), 'Hole')); export var Area = function (_Record6) { _inherits(Area, _Record6); function Area() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Area); return _possibleConstructorReturn(this, (Area.__proto__ || Object.getPrototypeOf(Area)).call(this, _extends({}, json, { properties: fromJS(json.properties || {}), vertices: new List(json.vertices || []) }))); } return Area; }(Record(_extends({}, sharedAttributes, { prototype: 'areas', vertices: new List(), holes: new List(), showHeatMap: false, heatMapText: '', heatMapColor: [], tooltip: {} }), 'Area')); export var Item = function (_Record7) { _inherits(Item, _Record7); function Item() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Item); return _possibleConstructorReturn(this, (Item.__proto__ || Object.getPrototypeOf(Item)).call(this, _extends({}, json, { properties: fromJS(json.properties || {}) }))); } return Item; }(Record(_extends({}, sharedAttributes, { prototype: 'items', x: 0, y: 0, rotation: 0 }), 'Item')); export var Layer = function (_Record8) { _inherits(Layer, _Record8); function Layer() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Layer); return _possibleConstructorReturn(this, (Layer.__proto__ || Object.getPrototypeOf(Layer)).call(this, _extends({}, json, { vertices: safeLoadMapList(json.vertices, Vertex), lines: safeLoadMapList(json.lines, Line), holes: safeLoadMapList(json.holes, Hole), areas: safeLoadMapList(json.areas, Area), items: safeLoadMapList(json.items, Item), selected: new ElementsSet(json.selected) }))); } return Layer; }(Record({ id: '', altitude: 0, order: 0, opacity: 1, name: '', visible: true, vertices: new Map(), lines: new Map(), holes: new Map(), areas: new Map(), items: new Map(), selected: new ElementsSet() }, 'Layer')); export var DefaultLayers = new Map({ 'layer-1': new Layer({ id: 'layer-1', name: 'default' }) }); export var Scene = function (_Record9) { _inherits(Scene, _Record9); function Scene() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Scene); var layers = safeLoadMapList(json.layers, Layer, DefaultLayers); return _possibleConstructorReturn(this, (Scene.__proto__ || Object.getPrototypeOf(Scene)).call(this, _extends({}, json, { guides: safeLoadMapList(json.guides, Guide, DefaultGuides), layers: layers, selectedLayer: layers.first().id, meta: json.meta ? fromJS(json.meta) : new Map() }))); } return Scene; }(Record({ unit: 'cm', layers: new Map(), guides: new Map(), selectedLayer: null, fontSize: 12, width: 3000, height: 2000, meta: new Map() //additional info }, 'Scene')); export var CatalogElement = function (_Record10) { _inherits(CatalogElement, _Record10); function CatalogElement() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, CatalogElement); return _possibleConstructorReturn(this, (CatalogElement.__proto__ || Object.getPrototypeOf(CatalogElement)).call(this, _extends({}, json, { info: fromJS(json.info), properties: fromJS(json.properties) }))); } return CatalogElement; }(Record({ name: '', prototype: '', info: new Map(), properties: new Map() }, 'CatalogElement')); export var Catalog = function (_Record11) { _inherits(Catalog, _Record11); function Catalog() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Catalog); var elements = safeLoadMapList(json.elements, CatalogElement); return _possibleConstructorReturn(this, (Catalog.__proto__ || Object.getPrototypeOf(Catalog)).call(this, { elements: elements, ready: !elements.isEmpty() })); } _createClass(Catalog, [{ key: 'factoryElement', value: function factoryElement(type, options) { var initialProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!this.elements.has(type)) { var catList = this.elements.map(function (element) { return element.name; }).toArray(); throw new Error('Element ' + type + ' does not exist in catalog ' + catList); } var element = this.elements.get(type); var properties = element.properties.map(function (value, key) { return initialProperties[key] || value.get('defaultValue'); }); switch (element.prototype) { case 'lines': return new Line(options).merge({ properties: properties }); case 'holes': return new Hole(options).merge({ properties: properties }); case 'areas': return new Area(options).merge({ properties: properties }); case 'items': return new Item(options).merge({ properties: properties }); default: throw new Error('prototype not valid'); } } }]); return Catalog; }(Record({ ready: false, page: "root", path: new List(), elements: new Map() }, 'Catalog')); export var State = function (_Record12) { _inherits(State, _Record12); function State() { var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, State); var scene = new Scene(json.scene); return _possibleConstructorReturn(this, (State.__proto__ || Object.getPrototypeOf(State)).call(this, _extends({}, json, { scene: scene, sceneHistory: json.sceneHistory ? json.sceneHistory : new List([scene]), catalog: new Catalog(json.catalog || {}), viewer2D: new Map(json.viewer2D || {}), drawingSupport: new Map(json.drawingSupport || {}), draggingSupport: new Map(json.draggingSupport || {}), rotatingSupport: new Map(json.rotatingSupport || {}), misc: json.misc ? fromJS(json.misc) : new Map() }))); } return State; }(Record({ mode: MODE_IDLE, scene: new Scene(), sceneHistory: new List([new Scene()]), catalog: new Catalog(), viewer2D: new Map(), mouse: new Map({ x: 0, y: 0 }), zoom: 0, areasText: new Map(), snapMask: SNAP_MASK, snapElements: new List(), activeSnapElement: null, drawingSupport: new Map(), draggingSupport: new Map(), rotatingSupport: new Map(), errors: new List(), warnings: new List(), clipboardProperties: null, selectedElementsHistory: new List(), misc: new Map() //additional info }, 'State')); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbHMuanMiXSwibmFtZXMiOlsiUmVjb3JkIiwiTGlzdCIsIk1hcCIsImZyb21KUyIsIk1PREVfSURMRSIsIk1PREVfMkRfUEFOIiwiU05BUF9NQVNLIiwic2FmZUxvYWRNYXBMaXN0IiwibWFwTGlzdCIsIk1vZGVsIiwiZGVmYXVsdE1hcCIsIm1hcCIsIm0iLCJ0b01hcCIsIkd1aWRlIiwianNvbiIsInByb3BlcnRpZXMiLCJpZCIsInR5cGUiLCJEZWZhdWx0R3VpZGVzIiwic3RlcCIsImNvbG9ycyIsIkVsZW1lbnRzU2V0IiwidmVydGljZXMiLCJsaW5lcyIsImhvbGVzIiwiYXJlYXMiLCJpdGVtcyIsInNoYXJlZEF0dHJpYnV0ZXMiLCJwcm90b3R5cGUiLCJuYW1lIiwibWlzYyIsInNlbGVjdGVkIiwiVmVydGV4IiwieCIsInkiLCJMaW5lIiwiSG9sZSIsIm9mZnNldCIsImxpbmUiLCJBcmVhIiwic2hvd0hlYXRNYXAiLCJoZWF0TWFwVGV4dCIsImhlYXRNYXBDb2xvciIsInRvb2x0aXAiLCJJdGVtIiwicm90YXRpb24iLCJMYXllciIsImFsdGl0dWRlIiwib3JkZXIiLCJvcGFjaXR5IiwidmlzaWJsZSIsIkRlZmF1bHRMYXllcnMiLCJTY2VuZSIsImxheWVycyIsImd1aWRlcyIsInNlbGVjdGVkTGF5ZXIiLCJmaXJzdCIsIm1ldGEiLCJ1bml0IiwiZm9udFNpemUiLCJ3aWR0aCIsImhlaWdodCIsIkNhdGFsb2dFbGVtZW50IiwiaW5mbyIsIkNhdGFsb2ciLCJlbGVtZW50cyIsInJlYWR5IiwiaXNFbXB0eSIsIm9wdGlvbnMiLCJpbml0aWFsUHJvcGVydGllcyIsImhhcyIsImNhdExpc3QiLCJlbGVtZW50IiwidG9BcnJheSIsIkVycm9yIiwiZ2V0IiwidmFsdWUiLCJrZXkiLCJtZXJnZSIsInBhZ2UiLCJwYXRoIiwiU3RhdGUiLCJzY2VuZSIsInNjZW5lSGlzdG9yeSIsImNhdGFsb2ciLCJ2aWV3ZXIyRCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwibW9kZSIsIm1vdXNlIiwiem9vbSIsImFyZWFzVGV4dCIsInNuYXBNYXNrIiwic25hcEVsZW1lbnRzIiwiYWN0aXZlU25hcEVsZW1lbnQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImNsaXBib2FyZFByb3BlcnRpZXMiLCJzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLFNBQVFBLE1BQVIsRUFBZ0JDLElBQWhCLEVBQXNCQyxHQUF0QixFQUEyQkMsTUFBM0IsUUFBd0MsV0FBeEM7QUFDQSxTQUFRQyxTQUFSLEVBQW1CQyxXQUFuQixRQUFxQyxhQUFyQztBQUNBLFNBQVFDLFNBQVIsUUFBd0IsY0FBeEI7O0FBRUEsSUFBSUMsa0JBQWtCLFNBQWxCQSxlQUFrQixDQUFDQyxPQUFELEVBQVVDLEtBQVYsRUFBaUJDLFVBQWpCLEVBQWdDO0FBQ3BELFNBQU9GLFVBQ0gsSUFBSU4sR0FBSixDQUFRTSxPQUFSLEVBQWlCRyxHQUFqQixDQUFxQjtBQUFBLFdBQUssSUFBSUYsS0FBSixDQUFVRyxDQUFWLENBQUw7QUFBQSxHQUFyQixFQUF3Q0MsS0FBeEMsRUFERyxHQUVGSCxjQUFjLElBQUlSLEdBQUosRUFGbkI7QUFHRCxDQUpEOztBQU9BLFdBQWFZLEtBQWI7QUFBQTs7QUFLRSxtQkFBdUI7QUFBQSxRQUFYQyxJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEsc0hBRWhCQSxJQUZnQjtBQUduQkMsa0JBQVliLE9BQU9ZLEtBQUtDLFVBQUwsSUFBbUIsRUFBMUI7QUFITztBQUt0Qjs7QUFWSDtBQUFBLEVBQTJCaEIsT0FBTztBQUNoQ2lCLE1BQUksRUFENEI7QUFFaENDLFFBQU0sRUFGMEI7QUFHaENGLGNBQVlkO0FBSG9CLENBQVAsRUFJeEIsT0FKd0IsQ0FBM0I7O0FBYUEsT0FBTyxJQUFNaUIsZ0JBQWdCLElBQUlqQixHQUFKLENBQVE7QUFDbkMsUUFBTSxJQUFJWSxLQUFKLENBQVU7QUFDZEcsUUFBSSxJQURVO0FBRWRDLFVBQU0sbUJBRlE7QUFHZEYsZ0JBQVk7QUFDVkksWUFBTSxFQURJO0FBRVZDLGNBQVEsQ0FBQyxTQUFELEVBQVksTUFBWixFQUFvQixNQUFwQixFQUE0QixNQUE1QixFQUFvQyxNQUFwQztBQUZFO0FBSEUsR0FBVixDQUQ2QjtBQVNuQyxRQUFNLElBQUlQLEtBQUosQ0FBVTtBQUNkRyxRQUFJLElBRFU7QUFFZEMsVUFBTSxpQkFGUTtBQUdkRixnQkFBWTtBQUNWSSxZQUFNLEVBREk7QUFFVkMsY0FBUSxDQUFDLFNBQUQsRUFBWSxNQUFaLEVBQW9CLE1BQXBCLEVBQTRCLE1BQTVCLEVBQW9DLE1BQXBDO0FBRkU7QUFIRSxHQUFWO0FBVDZCLENBQVIsQ0FBdEI7O0FBb0JQLFdBQWFDLFdBQWI7QUFBQTs7QUFPRSx5QkFBdUI7QUFBQSxRQUFYUCxJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEscUhBQ2Y7QUFDSlEsZ0JBQVUsSUFBSXRCLElBQUosQ0FBU2MsS0FBS1EsUUFBTCxJQUFpQixFQUExQixDQUROO0FBRUpDLGFBQU8sSUFBSXZCLElBQUosQ0FBU2MsS0FBS1MsS0FBTCxJQUFjLEVBQXZCLENBRkg7QUFHSkMsYUFBTyxJQUFJeEIsSUFBSixDQUFTYyxLQUFLVSxLQUFMLElBQWMsRUFBdkIsQ0FISDtBQUlKQyxhQUFPLElBQUl6QixJQUFKLENBQVNjLEtBQUtXLEtBQUwsSUFBYyxFQUF2QixDQUpIO0FBS0pDLGFBQU8sSUFBSTFCLElBQUosQ0FBU2MsS0FBS1ksS0FBTCxJQUFjLEVBQXZCO0FBTEgsS0FEZTtBQVF0Qjs7QUFmSDtBQUFBLEVBQWlDM0IsT0FBTztBQUN0Q3VCLFlBQVUsSUFBSXRCLElBQUosRUFENEI7QUFFdEN1QixTQUFPLElBQUl2QixJQUFKLEVBRitCO0FBR3RDd0IsU0FBTyxJQUFJeEIsSUFBSixFQUgrQjtBQUl0Q3lCLFNBQU8sSUFBSXpCLElBQUosRUFKK0I7QUFLdEMwQixTQUFPLElBQUkxQixJQUFKO0FBTCtCLENBQVAsRUFNOUIsYUFOOEIsQ0FBakM7O0FBa0JBLElBQU0yQixtQkFDTjtBQUNFWCxNQUFJLEVBRE47QUFFRUMsUUFBTSxFQUZSO0FBR0VXLGFBQVcsRUFIYjtBQUlFQyxRQUFNLEVBSlI7QUFLRUMsUUFBTSxJQUFJN0IsR0FBSixFQUxSO0FBTUU4QixZQUFVLEtBTlo7QUFPRWhCLGNBQVksSUFBSWQsR0FBSjtBQVBkLENBREE7O0FBV0EsV0FBYStCLE1BQWI7QUFBQTs7QUFRRSxvQkFBdUI7QUFBQSxRQUFYbEIsSUFBVyx1RUFBSixFQUFJOztBQUFBOztBQUFBLHdIQUVoQkEsSUFGZ0I7QUFHbkJTLGFBQU8sSUFBSXZCLElBQUosQ0FBU2MsS0FBS1MsS0FBTCxJQUFjLEVBQXZCLENBSFk7QUFJbkJFLGFBQU8sSUFBSXpCLElBQUosQ0FBU2MsS0FBS1csS0FBTCxJQUFjLEVBQXZCO0FBSlk7QUFNdEI7O0FBZEg7QUFBQSxFQUE0QjFCLG9CQUN2QjRCLGdCQUR1QjtBQUUxQk0sS0FBRyxDQUFDLENBRnNCO0FBRzFCQyxLQUFHLENBQUMsQ0FIc0I7QUFJMUJOLGFBQVcsVUFKZTtBQUsxQkwsU0FBTyxJQUFJdkIsSUFBSixFQUxtQjtBQU0xQnlCLFNBQU8sSUFBSXpCLElBQUo7QUFObUIsSUFPekIsUUFQeUIsQ0FBNUI7O0FBaUJBLFdBQWFtQyxJQUFiO0FBQUE7O0FBTUUsa0JBQXVCO0FBQUEsUUFBWHJCLElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSxvSEFFaEJBLElBRmdCO0FBR25CQyxrQkFBWWIsT0FBT1ksS0FBS0MsVUFBTCxJQUFtQixFQUExQixDQUhPO0FBSW5CTyxnQkFBVSxJQUFJdEIsSUFBSixDQUFTYyxLQUFLUSxRQUFMLElBQWlCLEVBQTFCLENBSlM7QUFLbkJFLGFBQU8sSUFBSXhCLElBQUosQ0FBU2MsS0FBS1UsS0FBTCxJQUFjLEVBQXZCO0FBTFk7QUFPdEI7O0FBYkg7QUFBQSxFQUEwQnpCLG9CQUNyQjRCLGdCQURxQjtBQUV4QkMsYUFBVyxPQUZhO0FBR3hCTixZQUFVLElBQUl0QixJQUFKLEVBSGM7QUFJeEJ3QixTQUFPLElBQUl4QixJQUFKO0FBSmlCLElBS3ZCLE1BTHVCLENBQTFCOztBQWdCQSxXQUFhb0MsSUFBYjtBQUFBOztBQU1FLGtCQUF1QjtBQUFBLFFBQVh0QixJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEsb0hBRWhCQSxJQUZnQjtBQUduQkMsa0JBQVliLE9BQU9ZLEtBQUtDLFVBQUwsSUFBbUIsRUFBMUI7QUFITztBQUt0Qjs7QUFYSDtBQUFBLEVBQTBCaEIsb0JBQ3JCNEIsZ0JBRHFCO0FBRXhCQyxhQUFXLE9BRmE7QUFHeEJTLFVBQVEsQ0FBQyxDQUhlO0FBSXhCQyxRQUFNO0FBSmtCLElBS3ZCLE1BTHVCLENBQTFCOztBQWNBLFdBQWFDLElBQWI7QUFBQTs7QUFVRSxrQkFBdUI7QUFBQSxRQUFYekIsSUFBVyx1RUFBSixFQUFJOztBQUFBOztBQUFBLG9IQUVoQkEsSUFGZ0I7QUFHbkJDLGtCQUFZYixPQUFPWSxLQUFLQyxVQUFMLElBQW1CLEVBQTFCLENBSE87QUFJbkJPLGdCQUFVLElBQUl0QixJQUFKLENBQVNjLEtBQUtRLFFBQUwsSUFBaUIsRUFBMUI7QUFKUztBQU10Qjs7QUFoQkg7QUFBQSxFQUEwQnZCLG9CQUNyQjRCLGdCQURxQjtBQUV4QkMsYUFBVyxPQUZhO0FBR3hCTixZQUFVLElBQUl0QixJQUFKLEVBSGM7QUFJeEJ3QixTQUFPLElBQUl4QixJQUFKLEVBSmlCO0FBS3hCd0MsZUFBYSxLQUxXO0FBTXhCQyxlQUFhLEVBTlc7QUFPeEJDLGdCQUFjLEVBUFU7QUFReEJDLFdBQVM7QUFSZSxJQVN2QixNQVR1QixDQUExQjs7QUFtQkEsV0FBYUMsSUFBYjtBQUFBOztBQU9FLGtCQUF1QjtBQUFBLFFBQVg5QixJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQUEsb0hBRWhCQSxJQUZnQjtBQUduQkMsa0JBQVliLE9BQU9ZLEtBQUtDLFVBQUwsSUFBbUIsRUFBMUI7QUFITztBQUt0Qjs7QUFaSDtBQUFBLEVBQTBCaEIsb0JBQ3JCNEIsZ0JBRHFCO0FBRXhCQyxhQUFXLE9BRmE7QUFHeEJLLEtBQUcsQ0FIcUI7QUFJeEJDLEtBQUcsQ0FKcUI7QUFLeEJXLFlBQVU7QUFMYyxJQU12QixNQU51QixDQUExQjs7QUFlQSxXQUFhQyxLQUFiO0FBQUE7O0FBY0UsbUJBQXVCO0FBQUEsUUFBWGhDLElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSxzSEFFaEJBLElBRmdCO0FBR25CUSxnQkFBVWhCLGdCQUFnQlEsS0FBS1EsUUFBckIsRUFBK0JVLE1BQS9CLENBSFM7QUFJbkJULGFBQU9qQixnQkFBZ0JRLEtBQUtTLEtBQXJCLEVBQTRCWSxJQUE1QixDQUpZO0FBS25CWCxhQUFPbEIsZ0JBQWdCUSxLQUFLVSxLQUFyQixFQUE0QlksSUFBNUIsQ0FMWTtBQU1uQlgsYUFBT25CLGdCQUFnQlEsS0FBS1csS0FBckIsRUFBNEJjLElBQTVCLENBTlk7QUFPbkJiLGFBQU9wQixnQkFBZ0JRLEtBQUtZLEtBQXJCLEVBQTRCa0IsSUFBNUIsQ0FQWTtBQVFuQmIsZ0JBQVUsSUFBSVYsV0FBSixDQUFnQlAsS0FBS2lCLFFBQXJCO0FBUlM7QUFVdEI7O0FBeEJIO0FBQUEsRUFBMkJoQyxPQUFPO0FBQ2hDaUIsTUFBSSxFQUQ0QjtBQUVoQytCLFlBQVUsQ0FGc0I7QUFHaENDLFNBQU8sQ0FIeUI7QUFJaENDLFdBQVMsQ0FKdUI7QUFLaENwQixRQUFNLEVBTDBCO0FBTWhDcUIsV0FBUyxJQU51QjtBQU9oQzVCLFlBQVUsSUFBSXJCLEdBQUosRUFQc0I7QUFRaENzQixTQUFPLElBQUl0QixHQUFKLEVBUnlCO0FBU2hDdUIsU0FBTyxJQUFJdkIsR0FBSixFQVR5QjtBQVVoQ3dCLFNBQU8sSUFBSXhCLEdBQUosRUFWeUI7QUFXaEN5QixTQUFPLElBQUl6QixHQUFKLEVBWHlCO0FBWWhDOEIsWUFBVSxJQUFJVixXQUFKO0FBWnNCLENBQVAsRUFheEIsT0Fid0IsQ0FBM0I7O0FBNEJBLE9BQU8sSUFBTThCLGdCQUFnQixJQUFJbEQsR0FBSixDQUFRO0FBQ25DLGFBQVcsSUFBSTZDLEtBQUosQ0FBVSxFQUFDOUIsSUFBSSxTQUFMLEVBQWdCYSxNQUFNLFNBQXRCLEVBQVY7QUFEd0IsQ0FBUixDQUF0Qjs7QUFLUCxXQUFhdUIsS0FBYjtBQUFBOztBQVVFLG1CQUF1QjtBQUFBLFFBQVh0QyxJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQ3JCLFFBQUl1QyxTQUFTL0MsZ0JBQWdCUSxLQUFLdUMsTUFBckIsRUFBNkJQLEtBQTdCLEVBQW9DSyxhQUFwQyxDQUFiO0FBRHFCLHNIQUdoQnJDLElBSGdCO0FBSW5Cd0MsY0FBUWhELGdCQUFnQlEsS0FBS3dDLE1BQXJCLEVBQTZCekMsS0FBN0IsRUFBb0NLLGFBQXBDLENBSlc7QUFLbkJtQyxvQkFMbUI7QUFNbkJFLHFCQUFlRixPQUFPRyxLQUFQLEdBQWV4QyxFQU5YO0FBT25CeUMsWUFBTTNDLEtBQUsyQyxJQUFMLEdBQVl2RCxPQUFPWSxLQUFLMkMsSUFBWixDQUFaLEdBQWdDLElBQUl4RCxHQUFKO0FBUG5CO0FBU3RCOztBQW5CSDtBQUFBLEVBQTJCRixPQUFPO0FBQ2hDMkQsUUFBTSxJQUQwQjtBQUVoQ0wsVUFBUSxJQUFJcEQsR0FBSixFQUZ3QjtBQUdoQ3FELFVBQVEsSUFBSXJELEdBQUosRUFId0I7QUFJaENzRCxpQkFBZSxJQUppQjtBQUtoQ0ksWUFBVSxFQUxzQjtBQU1oQ0MsU0FBTyxJQU55QjtBQU9oQ0MsVUFBUSxJQVB3QjtBQVFoQ0osUUFBTSxJQUFJeEQsR0FBSixFQVIwQixDQVFkO0FBUmMsQ0FBUCxFQVN4QixPQVR3QixDQUEzQjs7QUFzQkEsV0FBYTZELGNBQWI7QUFBQTs7QUFNRSw0QkFBdUI7QUFBQSxRQUFYaEQsSUFBVyx1RUFBSixFQUFJOztBQUFBOztBQUFBLHdJQUVoQkEsSUFGZ0I7QUFHbkJpRCxZQUFNN0QsT0FBT1ksS0FBS2lELElBQVosQ0FIYTtBQUluQmhELGtCQUFZYixPQUFPWSxLQUFLQyxVQUFaO0FBSk87QUFNdEI7O0FBWkg7QUFBQSxFQUFvQ2hCLE9BQU87QUFDekM4QixRQUFNLEVBRG1DO0FBRXpDRCxhQUFXLEVBRjhCO0FBR3pDbUMsUUFBTSxJQUFJOUQsR0FBSixFQUhtQztBQUl6Q2MsY0FBWSxJQUFJZCxHQUFKO0FBSjZCLENBQVAsRUFLakMsZ0JBTGlDLENBQXBDOztBQWVBLFdBQWErRCxPQUFiO0FBQUE7O0FBTUUscUJBQXVCO0FBQUEsUUFBWGxELElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFDckIsUUFBSW1ELFdBQVczRCxnQkFBZ0JRLEtBQUttRCxRQUFyQixFQUErQkgsY0FBL0IsQ0FBZjtBQURxQiw2R0FFZjtBQUNKRyx3QkFESTtBQUVKQyxhQUFPLENBQUNELFNBQVNFLE9BQVQ7QUFGSixLQUZlO0FBTXRCOztBQVpIO0FBQUE7QUFBQSxtQ0FjaUJsRCxJQWRqQixFQWN1Qm1ELE9BZHZCLEVBY3dEO0FBQUEsVUFBeEJDLGlCQUF3Qix1RUFBSixFQUFJOztBQUNwRCxVQUFJLENBQUMsS0FBS0osUUFBTCxDQUFjSyxHQUFkLENBQWtCckQsSUFBbEIsQ0FBTCxFQUE4QjtBQUM1QixZQUFJc0QsVUFBVSxLQUFLTixRQUFMLENBQWN2RCxHQUFkLENBQWtCO0FBQUEsaUJBQVc4RCxRQUFRM0MsSUFBbkI7QUFBQSxTQUFsQixFQUEyQzRDLE9BQTNDLEVBQWQ7QUFDQSxjQUFNLElBQUlDLEtBQUosY0FBcUJ6RCxJQUFyQixtQ0FBdURzRCxPQUF2RCxDQUFOO0FBQ0Q7O0FBRUQsVUFBSUMsVUFBVSxLQUFLUCxRQUFMLENBQWNVLEdBQWQsQ0FBa0IxRCxJQUFsQixDQUFkO0FBQ0EsVUFBSUYsYUFBYXlELFFBQVF6RCxVQUFSLENBQW1CTCxHQUFuQixDQUF1QixVQUFDa0UsS0FBRCxFQUFRQyxHQUFSO0FBQUEsZUFBZ0JSLGtCQUFrQlEsR0FBbEIsS0FBMEJELE1BQU1ELEdBQU4sQ0FBVSxjQUFWLENBQTFDO0FBQUEsT0FBdkIsQ0FBakI7O0FBRUEsY0FBUUgsUUFBUTVDLFNBQWhCO0FBQ0UsYUFBSyxPQUFMO0FBQ0UsaUJBQU8sSUFBSU8sSUFBSixDQUFTaUMsT0FBVCxFQUFrQlUsS0FBbEIsQ0FBd0IsRUFBQy9ELHNCQUFELEVBQXhCLENBQVA7O0FBRUYsYUFBSyxPQUFMO0FBQ0UsaUJBQU8sSUFBSXFCLElBQUosQ0FBU2dDLE9BQVQsRUFBa0JVLEtBQWxCLENBQXdCLEVBQUMvRCxzQkFBRCxFQUF4QixDQUFQOztBQUVGLGFBQUssT0FBTDtBQUNFLGlCQUFPLElBQUl3QixJQUFKLENBQVM2QixPQUFULEVBQWtCVSxLQUFsQixDQUF3QixFQUFDL0Qsc0JBQUQsRUFBeEIsQ0FBUDs7QUFFRixhQUFLLE9BQUw7QUFDRSxpQkFBTyxJQUFJNkIsSUFBSixDQUFTd0IsT0FBVCxFQUFrQlUsS0FBbEIsQ0FBd0IsRUFBQy9ELHNCQUFELEVBQXhCLENBQVA7O0FBRUY7QUFDRSxnQkFBTSxJQUFJMkQsS0FBSixDQUFVLHFCQUFWLENBQU47QUFkSjtBQWdCRDtBQXZDSDs7QUFBQTtBQUFBLEVBQTZCM0UsT0FBTztBQUNsQ21FLFNBQU8sS0FEMkI7QUFFbENhLFFBQU0sTUFGNEI7QUFHbENDLFFBQU0sSUFBSWhGLElBQUosRUFINEI7QUFJbENpRSxZQUFVLElBQUloRSxHQUFKO0FBSndCLENBQVAsRUFLMUIsU0FMMEIsQ0FBN0I7O0FBMENBLFdBQWFnRixLQUFiO0FBQUE7O0FBcUJFLG1CQUF1QjtBQUFBLFFBQVhuRSxJQUFXLHVFQUFKLEVBQUk7O0FBQUE7O0FBQ3JCLFFBQUlvRSxRQUFRLElBQUk5QixLQUFKLENBQVV0QyxLQUFLb0UsS0FBZixDQUFaO0FBRHFCLHNIQUdoQnBFLElBSGdCO0FBSW5Cb0Usa0JBSm1CO0FBS25CQyxvQkFBY3JFLEtBQUtxRSxZQUFMLEdBQW9CckUsS0FBS3FFLFlBQXpCLEdBQXdDLElBQUluRixJQUFKLENBQVMsQ0FBQ2tGLEtBQUQsQ0FBVCxDQUxuQztBQU1uQkUsZUFBUyxJQUFJcEIsT0FBSixDQUFZbEQsS0FBS3NFLE9BQUwsSUFBZ0IsRUFBNUIsQ0FOVTtBQU9uQkMsZ0JBQVUsSUFBSXBGLEdBQUosQ0FBUWEsS0FBS3VFLFFBQUwsSUFBaUIsRUFBekIsQ0FQUztBQVFuQkMsc0JBQWdCLElBQUlyRixHQUFKLENBQVFhLEtBQUt3RSxjQUFMLElBQXVCLEVBQS9CLENBUkc7QUFTbkJDLHVCQUFpQixJQUFJdEYsR0FBSixDQUFRYSxLQUFLeUUsZUFBTCxJQUF3QixFQUFoQyxDQVRFO0FBVW5CQyx1QkFBaUIsSUFBSXZGLEdBQUosQ0FBUWEsS0FBSzBFLGVBQUwsSUFBd0IsRUFBaEMsQ0FWRTtBQVduQjFELFlBQU1oQixLQUFLZ0IsSUFBTCxHQUFZNUIsT0FBT1ksS0FBS2dCLElBQVosQ0FBWixHQUFnQyxJQUFJN0IsR0FBSjtBQVhuQjtBQWF0Qjs7QUFsQ0g7QUFBQSxFQUEyQkYsT0FBTztBQUNoQzBGLFFBQU10RixTQUQwQjtBQUVoQytFLFNBQU8sSUFBSTlCLEtBQUosRUFGeUI7QUFHaEMrQixnQkFBYyxJQUFJbkYsSUFBSixDQUFTLENBQUMsSUFBSW9ELEtBQUosRUFBRCxDQUFULENBSGtCO0FBSWhDZ0MsV0FBUyxJQUFJcEIsT0FBSixFQUp1QjtBQUtoQ3FCLFlBQVUsSUFBSXBGLEdBQUosRUFMc0I7QUFNaEN5RixTQUFPLElBQUl6RixHQUFKLENBQVEsRUFBQ2dDLEdBQUcsQ0FBSixFQUFPQyxHQUFHLENBQVYsRUFBUixDQU55QjtBQU9oQ3lELFFBQU0sQ0FQMEI7QUFRaENDLGFBQVcsSUFBSTNGLEdBQUosRUFScUI7QUFTaEM0RixZQUFVeEYsU0FUc0I7QUFVaEN5RixnQkFBYyxJQUFJOUYsSUFBSixFQVZrQjtBQVdoQytGLHFCQUFtQixJQVhhO0FBWWhDVCxrQkFBZ0IsSUFBSXJGLEdBQUosRUFaZ0I7QUFhaENzRixtQkFBaUIsSUFBSXRGLEdBQUosRUFiZTtBQWNoQ3VGLG1CQUFpQixJQUFJdkYsR0FBSixFQWRlO0FBZWhDK0YsVUFBUSxJQUFJaEcsSUFBSixFQWZ3QjtBQWdCaENpRyxZQUFVLElBQUlqRyxJQUFKLEVBaEJzQjtBQWlCaENrRyx1QkFBcUIsSUFqQlc7QUFrQmhDQywyQkFBeUIsSUFBSW5HLElBQUosRUFsQk87QUFtQmhDOEIsUUFBTSxJQUFJN0IsR0FBSixFQW5CMEIsQ0FtQmQ7QUFuQmMsQ0FBUCxFQW9CeEIsT0FwQndCLENBQTNCIiwiZmlsZSI6Im1vZGVscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVjb3JkLCBMaXN0LCBNYXAsIGZyb21KU30gZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCB7TU9ERV9JRExFLCBNT0RFXzJEX1BBTn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtTTkFQX01BU0t9IGZyb20gJy4vdXRpbHMvc25hcCc7XG5cbmxldCBzYWZlTG9hZE1hcExpc3QgPSAobWFwTGlzdCwgTW9kZWwsIGRlZmF1bHRNYXApID0+IHtcbiAgcmV0dXJuIG1hcExpc3RcbiAgICA/IG5ldyBNYXAobWFwTGlzdCkubWFwKG0gPT4gbmV3IE1vZGVsKG0pKS50b01hcCgpXG4gICAgOiAoZGVmYXVsdE1hcCB8fCBuZXcgTWFwKCkpO1xufTtcblxuXG5leHBvcnQgY2xhc3MgR3VpZGUgZXh0ZW5kcyBSZWNvcmQoe1xuICBpZDogJycsXG4gIHR5cGU6ICcnLFxuICBwcm9wZXJ0aWVzOiBNYXAoKVxufSwgJ0d1aWRlJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEd1aWRlcyA9IG5ldyBNYXAoe1xuICAnaDEnOiBuZXcgR3VpZGUoe1xuICAgIGlkOiAnaDEnLFxuICAgIHR5cGU6ICdob3Jpem9udGFsLXN0cmVhaycsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc3RlcDogMjAsXG4gICAgICBjb2xvcnM6IFsnIzgwODA4MCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJ11cbiAgICB9XG4gIH0pLFxuICAndjEnOiBuZXcgR3VpZGUoe1xuICAgIGlkOiAndjEnLFxuICAgIHR5cGU6ICd2ZXJ0aWNhbC1zdHJlYWsnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHN0ZXA6IDIwLFxuICAgICAgY29sb3JzOiBbJyM4MDgwODAnLCAnI2RkZCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCddXG4gICAgfVxuICB9KVxufSk7XG5cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRzU2V0IGV4dGVuZHMgUmVjb3JkKHtcbiAgdmVydGljZXM6IG5ldyBMaXN0KCksXG4gIGxpbmVzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKSxcbiAgYXJlYXM6IG5ldyBMaXN0KCksXG4gIGl0ZW1zOiBuZXcgTGlzdCgpLFxufSwgJ0VsZW1lbnRzU2V0Jykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSksXG4gICAgICBsaW5lczogbmV3IExpc3QoanNvbi5saW5lcyB8fCBbXSksXG4gICAgICBob2xlczogbmV3IExpc3QoanNvbi5ob2xlcyB8fCBbXSksXG4gICAgICBhcmVhczogbmV3IExpc3QoanNvbi5hcmVhcyB8fCBbXSksXG4gICAgICBpdGVtczogbmV3IExpc3QoanNvbi5pdGVtcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IHNoYXJlZEF0dHJpYnV0ZXMgPVxue1xuICBpZDogJycsXG4gIHR5cGU6ICcnLFxuICBwcm90b3R5cGU6ICcnLFxuICBuYW1lOiAnJyxcbiAgbWlzYzogbmV3IE1hcCgpLFxuICBzZWxlY3RlZDogZmFsc2UsXG4gIHByb3BlcnRpZXM6IG5ldyBNYXAoKSxcbn1cblxuZXhwb3J0IGNsYXNzIFZlcnRleCBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHg6IC0xLFxuICB5OiAtMSxcbiAgcHJvdG90eXBlOiAndmVydGljZXMnLFxuICBsaW5lczogbmV3IExpc3QoKSxcbiAgYXJlYXM6IG5ldyBMaXN0KClcbn0sICdWZXJ0ZXgnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBsaW5lczogbmV3IExpc3QoanNvbi5saW5lcyB8fCBbXSksXG4gICAgICBhcmVhczogbmV3IExpc3QoanNvbi5hcmVhcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5lIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnbGluZXMnLFxuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgaG9sZXM6IG5ldyBMaXN0KClcbn0sICdMaW5lJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSksXG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSksXG4gICAgICBob2xlczogbmV3IExpc3QoanNvbi5ob2xlcyB8fCBbXSksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9sZSBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHByb3RvdHlwZTogJ2hvbGVzJyxcbiAgb2Zmc2V0OiAtMSxcbiAgbGluZTogJydcbn0sICdIb2xlJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcmVhIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnYXJlYXMnLFxuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgaG9sZXM6IG5ldyBMaXN0KCksXG4gIHNob3dIZWF0TWFwOiBmYWxzZSxcbiAgaGVhdE1hcFRleHQ6ICcnLFxuICBoZWF0TWFwQ29sb3I6IFtdLFxuICB0b29sdGlwOiB7fSxcbn0sICdBcmVhJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7IFxuICAgICAgLi4uanNvbixcbiAgICAgIHByb3BlcnRpZXM6IGZyb21KUyhqc29uLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgdmVydGljZXM6IG5ldyBMaXN0KGpzb24udmVydGljZXMgfHwgW10pXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSXRlbSBleHRlbmRzIFJlY29yZCh7XG4gIC4uLnNoYXJlZEF0dHJpYnV0ZXMsXG4gIHByb3RvdHlwZTogJ2l0ZW1zJyxcbiAgeDogMCxcbiAgeTogMCxcbiAgcm90YXRpb246IDBcbn0sICdJdGVtJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIFJlY29yZCh7XG4gIGlkOiAnJyxcbiAgYWx0aXR1ZGU6IDAsXG4gIG9yZGVyOiAwLFxuICBvcGFjaXR5OiAxLFxuICBuYW1lOiAnJyxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgdmVydGljZXM6IG5ldyBNYXAoKSxcbiAgbGluZXM6IG5ldyBNYXAoKSxcbiAgaG9sZXM6IG5ldyBNYXAoKSxcbiAgYXJlYXM6IG5ldyBNYXAoKSxcbiAgaXRlbXM6IG5ldyBNYXAoKSxcbiAgc2VsZWN0ZWQ6IG5ldyBFbGVtZW50c1NldCgpLFxufSwgJ0xheWVyJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgdmVydGljZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLnZlcnRpY2VzLCBWZXJ0ZXgpLFxuICAgICAgbGluZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmxpbmVzLCBMaW5lKSxcbiAgICAgIGhvbGVzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5ob2xlcywgSG9sZSksXG4gICAgICBhcmVhczogc2FmZUxvYWRNYXBMaXN0KGpzb24uYXJlYXMsIEFyZWEpLFxuICAgICAgaXRlbXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLml0ZW1zLCBJdGVtKSxcbiAgICAgIHNlbGVjdGVkOiBuZXcgRWxlbWVudHNTZXQoanNvbi5zZWxlY3RlZClcbiAgICB9KTtcbiAgfVxufVxuXG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0TGF5ZXJzID0gbmV3IE1hcCh7XG4gICdsYXllci0xJzogbmV3IExheWVyKHtpZDogJ2xheWVyLTEnLCBuYW1lOiAnZGVmYXVsdCd9KVxufSk7XG5cblxuZXhwb3J0IGNsYXNzIFNjZW5lIGV4dGVuZHMgUmVjb3JkKHtcbiAgdW5pdDogJ2NtJyxcbiAgbGF5ZXJzOiBuZXcgTWFwKCksXG4gIGd1aWRlczogbmV3IE1hcCgpLFxuICBzZWxlY3RlZExheWVyOiBudWxsLFxuICBmb250U2l6ZTogMTIsXG4gIHdpZHRoOiAzMDAwLFxuICBoZWlnaHQ6IDIwMDAsXG4gIG1ldGE6IG5ldyBNYXAoKSAgIC8vYWRkaXRpb25hbCBpbmZvXG59LCAnU2NlbmUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIGxldCBsYXllcnMgPSBzYWZlTG9hZE1hcExpc3QoanNvbi5sYXllcnMsIExheWVyLCBEZWZhdWx0TGF5ZXJzKTtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgZ3VpZGVzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5ndWlkZXMsIEd1aWRlLCBEZWZhdWx0R3VpZGVzKSxcbiAgICAgIGxheWVycyxcbiAgICAgIHNlbGVjdGVkTGF5ZXI6IGxheWVycy5maXJzdCgpLmlkLFxuICAgICAgbWV0YToganNvbi5tZXRhID8gZnJvbUpTKGpzb24ubWV0YSkgOiBuZXcgTWFwKClcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRhbG9nRWxlbWVudCBleHRlbmRzIFJlY29yZCh7XG4gIG5hbWU6ICcnLFxuICBwcm90b3R5cGU6ICcnLFxuICBpbmZvOiBuZXcgTWFwKCksXG4gIHByb3BlcnRpZXM6IG5ldyBNYXAoKSxcbn0sICdDYXRhbG9nRWxlbWVudCcpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uanNvbixcbiAgICAgIGluZm86IGZyb21KUyhqc29uLmluZm8pLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcylcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0YWxvZyBleHRlbmRzIFJlY29yZCh7XG4gIHJlYWR5OiBmYWxzZSxcbiAgcGFnZTogXCJyb290XCIsXG4gIHBhdGg6IG5ldyBMaXN0KCksXG4gIGVsZW1lbnRzOiBuZXcgTWFwKCksXG59LCAnQ2F0YWxvZycpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IGVsZW1lbnRzID0gc2FmZUxvYWRNYXBMaXN0KGpzb24uZWxlbWVudHMsIENhdGFsb2dFbGVtZW50KTtcbiAgICBzdXBlcih7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIHJlYWR5OiAhZWxlbWVudHMuaXNFbXB0eSgpXG4gICAgfSlcbiAgfVxuXG4gIGZhY3RvcnlFbGVtZW50KHR5cGUsIG9wdGlvbnMsIGluaXRpYWxQcm9wZXJ0aWVzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMuaGFzKHR5cGUpKSB7XG4gICAgICBsZXQgY2F0TGlzdCA9IHRoaXMuZWxlbWVudHMubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5uYW1lKS50b0FycmF5KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nICR7Y2F0TGlzdH1gKTtcbiAgICB9XG5cbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KHR5cGUpO1xuICAgIGxldCBwcm9wZXJ0aWVzID0gZWxlbWVudC5wcm9wZXJ0aWVzLm1hcCgodmFsdWUsIGtleSkgPT4gaW5pdGlhbFByb3BlcnRpZXNba2V5XSB8fCB2YWx1ZS5nZXQoJ2RlZmF1bHRWYWx1ZScpKTtcblxuICAgIHN3aXRjaCAoZWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmVzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2hvbGVzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBIb2xlKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2FyZWFzJzpcbiAgICAgICAgcmV0dXJuIG5ldyBBcmVhKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGNhc2UgJ2l0ZW1zJzpcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVtKG9wdGlvbnMpLm1lcmdlKHtwcm9wZXJ0aWVzfSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvdG90eXBlIG5vdCB2YWxpZCcpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdGUgZXh0ZW5kcyBSZWNvcmQoe1xuICBtb2RlOiBNT0RFX0lETEUsXG4gIHNjZW5lOiBuZXcgU2NlbmUoKSxcbiAgc2NlbmVIaXN0b3J5OiBuZXcgTGlzdChbbmV3IFNjZW5lKCldKSxcbiAgY2F0YWxvZzogbmV3IENhdGFsb2coKSxcbiAgdmlld2VyMkQ6IG5ldyBNYXAoKSxcbiAgbW91c2U6IG5ldyBNYXAoe3g6IDAsIHk6IDB9KSxcbiAgem9vbTogMCxcbiAgYXJlYXNUZXh0OiBuZXcgTWFwKCksXG4gIHNuYXBNYXNrOiBTTkFQX01BU0ssXG4gIHNuYXBFbGVtZW50czogbmV3IExpc3QoKSxcbiAgYWN0aXZlU25hcEVsZW1lbnQ6IG51bGwsXG4gIGRyYXdpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gIGRyYWdnaW5nU3VwcG9ydDogbmV3IE1hcCgpLFxuICByb3RhdGluZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgZXJyb3JzOiBuZXcgTGlzdCgpLFxuICB3YXJuaW5nczogbmV3IExpc3QoKSxcbiAgY2xpcGJvYXJkUHJvcGVydGllczogbnVsbCxcbiAgc2VsZWN0ZWRFbGVtZW50c0hpc3Rvcnk6IG5ldyBMaXN0KCksXG4gIG1pc2M6IG5ldyBNYXAoKSAgIC8vYWRkaXRpb25hbCBpbmZvXG59LCAnU3RhdGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIGxldCBzY2VuZSA9IG5ldyBTY2VuZShqc29uLnNjZW5lKTtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgc2NlbmUsXG4gICAgICBzY2VuZUhpc3Rvcnk6IGpzb24uc2NlbmVIaXN0b3J5ID8ganNvbi5zY2VuZUhpc3RvcnkgOiBuZXcgTGlzdChbc2NlbmVdKSxcbiAgICAgIGNhdGFsb2c6IG5ldyBDYXRhbG9nKGpzb24uY2F0YWxvZyB8fCB7fSksXG4gICAgICB2aWV3ZXIyRDogbmV3IE1hcChqc29uLnZpZXdlcjJEIHx8IHt9KSxcbiAgICAgIGRyYXdpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24uZHJhd2luZ1N1cHBvcnQgfHwge30pLFxuICAgICAgZHJhZ2dpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24uZHJhZ2dpbmdTdXBwb3J0IHx8IHt9KSxcbiAgICAgIHJvdGF0aW5nU3VwcG9ydDogbmV3IE1hcChqc29uLnJvdGF0aW5nU3VwcG9ydCB8fCB7fSksXG4gICAgICBtaXNjOiBqc29uLm1pc2MgPyBmcm9tSlMoanNvbi5taXNjKSA6IG5ldyBNYXAoKVxuICAgIH0pXG4gIH1cbn1cblxuXG5cbiJdfQ==