UNPKG

react-planner-viewer

Version:

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

333 lines (260 loc) 32.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (state, action) { switch (action.type) { case _constants.NEW_PROJECT: return newProject(state); case _constants.LOAD_PROJECT: return loadProject(state, action.sceneJSON); case _constants.OPEN_CATALOG: return openCatalog(state); case _constants.CHANGE_CATALOG_PAGE: return state.setIn(['catalog', 'page'], action.newPage).updateIn(['catalog', 'path'], function (path) { return path.push(action.oldPage); }); case _constants.GO_BACK_TO_CATALOG_PAGE: var path = state.catalog.path; var pageIndex = state.catalog.path.findIndex(function (page) { return page === action.newPage; }); return state.setIn(['catalog', 'page'], action.newPage).updateIn(['catalog', 'path'], function (path) { return path.take(pageIndex); }); case _constants.SELECT_TOOL_EDIT: return state.set('mode', _constants.MODE_IDLE); case _constants.UNSELECT_ALL: return unselectAll(state); case _constants.SET_PROPERTIES: return setProperties(state, action.properties); case _constants.SET_ITEMS_ATTRIBUTES: return setItemsAttributes(state, action.itemsAttributes); case _constants.SET_LINES_ATTRIBUTES: return setLinesAttributes(state, action.linesAttributes); case _constants.SET_HOLES_ATTRIBUTES: return setHolesAttributes(state, action.holesAttributes); case _constants.REMOVE: return remove(state); case _constants.UNDO: return undo(state); case _constants.ROLLBACK: return rollback(state); case _constants.SET_PROJECT_PROPERTIES: return setProjectProperties(state, action.properties); case _constants.OPEN_PROJECT_CONFIGURATOR: return openProjectConfigurator(state); case _constants.INIT_CATALOG: return initCatalog(state, action.catalog); case _constants.UPDATE_MOUSE_COORDS: return updateMouseCoord(state, action.coords); case _constants.UPDATE_ZOOM_SCALE: return updateZoomScale(state, action.scale); case _constants.TOGGLE_SNAP: return toggleSnap(state, action.mask); case _constants.THROW_ERROR: return throwError(state, action.error); case _constants.THROW_WARNING: return throwWarning(state, action.warning); case _constants.COPY_PROPERTIES: return copyProperties(state, action.properties); case _constants.PASTE_PROPERTIES: return pasteProperties(state); case _constants.PUSH_LAST_SELECTED_CATALOG_ELEMENT_TO_HISTORY: return pushLastSelectedCatalogElementToHistory(state, action.element); default: return state; } }; exports.rollback = rollback; var _immutable = require("immutable"); var _constants = require("../constants"); var _models = require("../models"); var _layerOperations = require("../utils/layer-operations"); function openCatalog(state) { return rollback(state).set('mode', _constants.MODE_VIEWING_CATALOG); } function newProject(state) { return new _models.State(); } function loadProject(state, sceneJSON) { return new _models.State({ scene: sceneJSON, catalog: state.catalog.toJS() }); } function setProperties(state, properties) { var scene = state.scene; scene = scene.set('layers', scene.layers.map(function (layer) { return (0, _layerOperations.setPropertiesOnSelected)(layer, properties); })); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function updateProperties(state, properties) { var scene = state.scene; scene = scene.set('layers', scene.layers.map(function (layer) { return (0, _layerOperations.updatePropertiesOnSelected)(layer, properties); })); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function setItemsAttributes(state, attributes) { var scene = state.scene; scene = scene.set('layers', scene.layers.map(function (layer) { return (0, _layerOperations.setAttributesOnSelected)(layer, attributes, state.catalog); })); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function setLinesAttributes(state, attributes) { var scene = state.scene; scene = scene.set('layers', scene.layers.map(function (layer) { return (0, _layerOperations.setAttributesOnSelected)(layer, attributes, state.catalog); })); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function setHolesAttributes(state, attributes) { var scene = state.scene; scene = scene.set('layers', scene.layers.map(function (layer) { return (0, _layerOperations.setAttributesOnSelected)(layer, attributes, state.catalog); })); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function unselectAll(state) { var scene = state.scene; scene = scene.update('layers', function (layer) { return layer.map(_layerOperations.unselectAll); }); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function remove(state) { var scene = state.scene; var catalog = state.catalog; scene = scene.updateIn(['layers', scene.selectedLayer], function (layer) { return layer.withMutations(function (layer) { var _layer$selected = layer.selected, selectedLines = _layer$selected.lines, selectedHoles = _layer$selected.holes, selectedItems = _layer$selected.items; (0, _layerOperations.unselectAll)(layer); selectedLines.forEach(function (lineID) { return (0, _layerOperations.removeLine)(layer, lineID); }); selectedHoles.forEach(function (holeID) { return (0, _layerOperations.removeHole)(layer, holeID); }); selectedItems.forEach(function (itemID) { return (0, _layerOperations.removeItem)(layer, itemID); }); (0, _layerOperations.detectAndUpdateAreas)(layer, catalog); }); }); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function undo(state) { var sceneHistory = state.sceneHistory; if (state.scene === sceneHistory.last() && !sceneHistory.size > 1) sceneHistory = sceneHistory.pop(); switch (sceneHistory.size) { case 0: return state; case 1: return state.merge({ mode: _constants.MODE_IDLE, scene: sceneHistory.last() }); default: return state.merge({ mode: _constants.MODE_IDLE, scene: sceneHistory.last(), sceneHistory: sceneHistory.pop() }); } } function rollback(state) { var sceneHistory = state.sceneHistory; if (sceneHistory.isEmpty()) return state; var scene = sceneHistory.last().update('layers', function (layer) { return layer.map(_layerOperations.unselectAll); }); return state.merge({ mode: _constants.MODE_IDLE, scene: scene, sceneHistory: state.sceneHistory.push(scene), snapElements: new _immutable.List(), activeSnapElement: null, drawingSupport: new _immutable.Map(), draggingSupport: new _immutable.Map(), rotatingSupport: new _immutable.Map() }); } function setProjectProperties(state, properties) { var scene = state.scene.merge(properties); return state.merge({ mode: _constants.MODE_IDLE, scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function openProjectConfigurator(state) { return state.merge({ mode: _constants.MODE_CONFIGURING_PROJECT }); } function initCatalog(state, catalog) { return state.set('catalog', new _models.Catalog(catalog)); } function updateMouseCoord(state, coords) { return state.set('mouse', new _immutable.Map(coords)); } function updateZoomScale(state, scale) { return state.set('zoom', scale); } function toggleSnap(state, mask) { return state.set('snapMask', mask); } function throwError(state, error) { return state.set('errors', state.get('errors').push({ date: Date.now(), error: error })); } var throwWarning = function throwWarning(state, warning) { return state.set('warnings', state.get('warnings').push({ date: Date.now(), warning: warning })); }; var copyProperties = function copyProperties(state, properties) { return state.set('clipboardProperties', properties.toJS()); }; var pasteProperties = function pasteProperties(state) { return updateProperties(state, state.get('clipboardProperties')); }; var pushLastSelectedCatalogElementToHistory = function pushLastSelectedCatalogElementToHistory(state, element) { var currHistory = state.selectedElementsHistory; var previousPosition = currHistory.findIndex(function (el) { return el.name === element.name; }); if (previousPosition !== -1) { currHistory = currHistory.splice(previousPosition, 1); } currHistory = currHistory.splice(0, 0, element); return state.set('selectedElementsHistory', currHistory); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9wcm9qZWN0LXJlZHVjZXIuanMiXSwibmFtZXMiOlsic3RhdGUiLCJhY3Rpb24iLCJ0eXBlIiwibmV3UHJvamVjdCIsImxvYWRQcm9qZWN0Iiwic2NlbmVKU09OIiwib3BlbkNhdGFsb2ciLCJzZXRJbiIsIm5ld1BhZ2UiLCJ1cGRhdGVJbiIsInBhdGgiLCJwdXNoIiwib2xkUGFnZSIsImNhdGFsb2ciLCJwYWdlSW5kZXgiLCJmaW5kSW5kZXgiLCJwYWdlIiwidGFrZSIsInNldCIsInVuc2VsZWN0QWxsIiwic2V0UHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJzZXRJdGVtc0F0dHJpYnV0ZXMiLCJpdGVtc0F0dHJpYnV0ZXMiLCJzZXRMaW5lc0F0dHJpYnV0ZXMiLCJsaW5lc0F0dHJpYnV0ZXMiLCJzZXRIb2xlc0F0dHJpYnV0ZXMiLCJob2xlc0F0dHJpYnV0ZXMiLCJyZW1vdmUiLCJ1bmRvIiwicm9sbGJhY2siLCJzZXRQcm9qZWN0UHJvcGVydGllcyIsIm9wZW5Qcm9qZWN0Q29uZmlndXJhdG9yIiwiaW5pdENhdGFsb2ciLCJ1cGRhdGVNb3VzZUNvb3JkIiwiY29vcmRzIiwidXBkYXRlWm9vbVNjYWxlIiwic2NhbGUiLCJ0b2dnbGVTbmFwIiwibWFzayIsInRocm93RXJyb3IiLCJlcnJvciIsInRocm93V2FybmluZyIsIndhcm5pbmciLCJjb3B5UHJvcGVydGllcyIsInBhc3RlUHJvcGVydGllcyIsInB1c2hMYXN0U2VsZWN0ZWRDYXRhbG9nRWxlbWVudFRvSGlzdG9yeSIsImVsZW1lbnQiLCJzY2VuZSIsInRvSlMiLCJsYXllcnMiLCJtYXAiLCJsYXllciIsIm1lcmdlIiwic2NlbmVIaXN0b3J5IiwidXBkYXRlUHJvcGVydGllcyIsImF0dHJpYnV0ZXMiLCJ1cGRhdGUiLCJzZWxlY3RlZExheWVyIiwid2l0aE11dGF0aW9ucyIsInNlbGVjdGVkIiwic2VsZWN0ZWRMaW5lcyIsImxpbmVzIiwic2VsZWN0ZWRIb2xlcyIsImhvbGVzIiwic2VsZWN0ZWRJdGVtcyIsIml0ZW1zIiwiZm9yRWFjaCIsImxpbmVJRCIsImhvbGVJRCIsIml0ZW1JRCIsImxhc3QiLCJzaXplIiwicG9wIiwibW9kZSIsImlzRW1wdHkiLCJzbmFwRWxlbWVudHMiLCJhY3RpdmVTbmFwRWxlbWVudCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwiZ2V0IiwiZGF0ZSIsIkRhdGUiLCJub3ciLCJjdXJySGlzdG9yeSIsInNlbGVjdGVkRWxlbWVudHNIaXN0b3J5IiwicHJldmlvdXNQb3NpdGlvbiIsImVsIiwibmFtZSIsInNwbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O2tCQW9EZSxVQUFVQSxLQUFWLEVBQWlCQyxNQUFqQixFQUF5Qjs7QUFFdEMsVUFBUUEsT0FBT0MsSUFBZjtBQUNFO0FBQ0UsYUFBT0MsV0FBV0gsS0FBWCxDQUFQOztBQUVGO0FBQ0UsYUFBT0ksWUFBWUosS0FBWixFQUFtQkMsT0FBT0ksU0FBMUIsQ0FBUDs7QUFFRjtBQUNFLGFBQU9DLFlBQVlOLEtBQVosQ0FBUDs7QUFFRjtBQUNFLGFBQU9BLE1BQU1PLEtBQU4sQ0FBWSxDQUFDLFNBQUQsRUFBWSxNQUFaLENBQVosRUFBaUNOLE9BQU9PLE9BQXhDLEVBQ0pDLFFBREksQ0FDSyxDQUFDLFNBQUQsRUFBWSxNQUFaLENBREwsRUFDMEI7QUFBQSxlQUFRQyxLQUFLQyxJQUFMLENBQVVWLE9BQU9XLE9BQWpCLENBQVI7QUFBQSxPQUQxQixDQUFQOztBQUdGO0FBQ0UsVUFBSUYsT0FBT1YsTUFBTWEsT0FBTixDQUFjSCxJQUF6QjtBQUNBLFVBQUlJLFlBQVlkLE1BQU1hLE9BQU4sQ0FBY0gsSUFBZCxDQUFtQkssU0FBbkIsQ0FBNkI7QUFBQSxlQUFRQyxTQUFTZixPQUFPTyxPQUF4QjtBQUFBLE9BQTdCLENBQWhCO0FBQ0EsYUFBT1IsTUFBTU8sS0FBTixDQUFZLENBQUMsU0FBRCxFQUFZLE1BQVosQ0FBWixFQUFpQ04sT0FBT08sT0FB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QUFWLEVBQXNCdEUsSUFBdEIsQ0FBMkI7QUFDeEZ1RSxVQUFNQyxLQUFLQyxHQUFMLEVBRGtGO0FBRXhGekM7QUFGd0YsR0FBM0IsQ0FBdEIsQ0FBcEI7QUFBQSxDQUFyQjs7QUFLQSxJQUFNQyxpQkFBaUIsU0FBakJBLGNBQWlCLENBQUM1QyxLQUFELEVBQVFxQixVQUFSO0FBQUEsU0FBdUJyQixNQUFNa0IsR0FBTixDQUFVLHFCQUFWLEVBQWlDRyxXQUFXNEIsSUFBWCxFQUFqQyxDQUF2QjtBQUFBLENBQXZCOztBQUVBLElBQU1KLGtCQUFrQixTQUFsQkEsZUFBa0IsQ0FBQzdDLEtBQUQ7QUFBQSxTQUFXdUQsaUJBQWlCdkQsS0FBakIsRUFBd0JBLE1BQU1pRixHQUFOLENBQVUscUJBQVYsQ0FBeEIsQ0FBWDtBQUFBLENBQXhCOztBQUVBLElBQU1uQywwQ0FBMEMsU0FBMUNBLHVDQUEwQyxDQUFFOUMsS0FBRixFQUFTK0MsT0FBVCxFQUFzQjtBQUNwRSxNQUFJc0MsY0FBY3JGLE1BQU1zRix1QkFBeEI7O0FBRUEsTUFBSUMsbUJBQW1CRixZQUFZdEUsU0FBWixDQUF1QjtBQUFBLFdBQU15RSxHQUFHQyxJQUFILEtBQVkxQyxRQUFRMEMsSUFBMUI7QUFBQSxHQUF2QixDQUF2QjtBQUNBLE1BQUlGLHFCQUFxQixDQUFDLENBQTFCLEVBQ0E7QUFDRUYsa0JBQWNBLFlBQVlLLE1BQVosQ0FBb0JILGdCQUFwQixFQUFzQyxDQUF0QyxDQUFkO0FBQ0Q7QUFDREYsZ0JBQWNBLFlBQVlLLE1BQVosQ0FBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsRUFBMEIzQyxPQUExQixDQUFkOztBQUVBLFNBQU8vQyxNQUFNa0IsR0FBTixDQUFVLHlCQUFWLEVBQXFDbUUsV0FBckMsQ0FBUDtBQUNELENBWEQiLCJmaWxlIjoicHJvamVjdC1yZWR1Y2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXEsIE1hcCwgTGlzdH0gZnJvbSBcImltbXV0YWJsZVwiO1xuaW1wb3J0IHtcbiAgTE9BRF9QUk9KRUNULFxuICBORVdfUFJPSkVDVCxcbiAgT1BFTl9DQVRBTE9HLFxuICBNT0RFX1ZJRVdJTkdfQ0FUQUxPRyxcbiAgTU9ERV9DT05GSUdVUklOR19QUk9KRUNULFxuICBTRUxFQ1RfVE9PTF9FRElULFxuICBNT0RFX0lETEUsXG4gIFVOU0VMRUNUX0FMTCxcbiAgU0VUX1BST1BFUlRJRVMsXG4gIFNFVF9JVEVNU19BVFRSSUJVVEVTLFxuICBTRVRfTElORVNfQVRUUklCVVRFUyxcbiAgU0VUX0hPTEVTX0FUVFJJQlVURVMsXG4gIFJFTU9WRSxcbiAgVU5ETyxcbiAgUk9MTEJBQ0ssXG4gIFNFVF9QUk9KRUNUX1BST1BFUlRJRVMsXG4gIE9QRU5fUFJPSkVDVF9DT05GSUdVUkFUT1IsXG4gIElOSVRfQ0FUQUxPRyxcbiAgVVBEQVRFX01PVVNFX0NPT1JEUyxcbiAgVVBEQVRFX1pPT01fU0NBTEUsXG4gIFRPR0dMRV9TTkFQLFxuICBDSEFOR0VfQ0FUQUxPR19QQUdFLFxuICBHT19CQUNLX1RPX0NBVEFMT0dfUEFHRSxcbiAgVEhST1dfRVJST1IsXG4gIFRIUk9XX1dBUk5JTkcsXG4gIENPUFlfUFJPUEVSVElFUyxcbiAgUEFTVEVfUFJPUEVSVElFUyxcbiAgUFVTSF9MQVNUX1NFTEVDVEVEX0NBVEFMT0dfRUxFTUVOVF9UT19ISVNUT1JZXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7U3RhdGUsIFNjZW5lLCBHdWlkZSwgQ2F0YWxvZ30gZnJvbSBcIi4uL21vZGVsc1wiO1xuXG5pbXBvcnQge1xuICByZW1vdmVMaW5lLFxuICByZW1vdmVIb2xlLFxuICBkZXRlY3RBbmRVcGRhdGVBcmVhcyxcbiAgc2V0UHJvcGVydGllcyBhcyBzZXRQcm9wZXJ0aWVzT3AsXG4gIHNldEl0ZW1zQXR0cmlidXRlcyBhcyBzZXRJdGVtc0F0dHJpYnV0ZXNPcCxcbiAgc2V0TGluZXNBdHRyaWJ1dGVzIGFzIHNldExpbmVzQXR0cmlidXRlc09wLFxuICBzZXRIb2xlc0F0dHJpYnV0ZXMgYXMgc2V0SG9sZXNBdHRyaWJ1dGVzT3AsXG4gIHNlbGVjdCxcbiAgdW5zZWxlY3QsXG4gIHVuc2VsZWN0QWxsIGFzIHVuc2VsZWN0QWxsT3AsXG4gIHJlbW92ZUl0ZW0sXG4gIGxvYWRMYXllckZyb21KU09OLFxuICBzZXRQcm9wZXJ0aWVzT25TZWxlY3RlZCxcbiAgdXBkYXRlUHJvcGVydGllc09uU2VsZWN0ZWQsXG4gIHNldEF0dHJpYnV0ZXNPblNlbGVjdGVkXG59IGZyb20gJy4uL3V0aWxzL2xheWVyLW9wZXJhdGlvbnMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIE5FV19QUk9KRUNUOlxuICAgICAgcmV0dXJuIG5ld1Byb2plY3Qoc3RhdGUpO1xuXG4gICAgY2FzZSBMT0FEX1BST0pFQ1Q6XG4gICAgICByZXR1cm4gbG9hZFByb2plY3Qoc3RhdGUsIGFjdGlvbi5zY2VuZUpTT04pO1xuXG4gICAgY2FzZSBPUEVOX0NBVEFMT0c6XG4gICAgICByZXR1cm4gb3BlbkNhdGFsb2coc3RhdGUpO1xuXG4gICAgY2FzZSBDSEFOR0VfQ0FUQUxPR19QQUdFOlxuICAgICAgcmV0dXJuIHN0YXRlLnNldEluKFsnY2F0YWxvZycsICdwYWdlJ10sIGFjdGlvbi5uZXdQYWdlKVxuICAgICAgICAudXBkYXRlSW4oWydjYXRhbG9nJywgJ3BhdGgnXSwgcGF0aCA9PiBwYXRoLnB1c2goYWN0aW9uLm9sZFBhZ2UpKTtcblxuICAgIGNhc2UgR09fQkFDS19UT19DQVRBTE9HX1BBR0U6XG4gICAgICBsZXQgcGF0aCA9IHN0YXRlLmNhdGFsb2cucGF0aDtcbiAgICAgIGxldCBwYWdlSW5kZXggPSBzdGF0ZS5jYXRhbG9nLnBhdGguZmluZEluZGV4KHBhZ2UgPT4gcGFnZSA9PT0gYWN0aW9uLm5ld1BhZ2UpO1xuICAgICAgcmV0dXJuIHN0YXRlLnNldEluKFsnY2F0YWxvZycsICdwYWdlJ10sIGFjdGlvbi5uZXdQYWdlKVxuICAgICAgICAudXBkYXRlSW4oWydjYXRhbG9nJywgJ3BhdGgnXSwgcGF0aCA9PiBwYXRoLnRha2UocGFnZUluZGV4KSk7XG5cbiAgICBjYXNlIFNFTEVDVF9UT09MX0VESVQ6XG4gICAgICByZXR1cm4gc3RhdGUuc2V0KCdtb2RlJywgTU9ERV9JRExFKTtcblxuICAgIGNhc2UgVU5TRUxFQ1RfQUxMOlxuICAgICAgcmV0dXJuIHVuc2VsZWN0QWxsKHN0YXRlKTtcblxuICAgIGNhc2UgU0VUX1BST1BFUlRJRVM6XG4gICAgICByZXR1cm4gc2V0UHJvcGVydGllcyhzdGF0ZSwgYWN0aW9uLnByb3BlcnRpZXMpO1xuXG4gICAgY2FzZSBTRVRfSVRFTVNfQVRUUklCVVRFUzpcbiAgICAgIHJldHVybiBzZXRJdGVtc0F0dHJpYnV0ZXMoc3RhdGUsIGFjdGlvbi5pdGVtc0F0dHJpYnV0ZXMpO1xuXG4gICAgY2FzZSBTRVRfTElORVNfQVRUUklCVVRFUzpcbiAgICAgIHJldHVybiBzZXRMaW5lc0F0dHJpYnV0ZXMoc3RhdGUsIGFjdGlvbi5saW5lc0F0dHJpYnV0ZXMpO1xuXG4gICAgY2FzZSBTRVRfSE9MRVNfQVRUUklCVVRFUzpcbiAgICAgIHJldHVybiBzZXRIb2xlc0F0dHJpYnV0ZXMoc3RhdGUsIGFjdGlvbi5ob2xlc0F0dHJpYnV0ZXMpO1xuXG4gICAgY2FzZSBSRU1PVkU6XG4gICAgICByZXR1cm4gcmVtb3ZlKHN0YXRlKTtcblxuICAgIGNhc2UgVU5ETzpcbiAgICAgIHJldHVybiB1bmRvKHN0YXRlKTtcblxuICAgIGNhc2UgUk9MTEJBQ0s6XG4gICAgICByZXR1cm4gcm9sbGJhY2soc3RhdGUpO1xuXG4gICAgY2FzZSBTRVRfUFJPSkVDVF9QUk9QRVJUSUVTOlxuICAgICAgcmV0dXJuIHNldFByb2plY3RQcm9wZXJ0aWVzKHN0YXRlLCBhY3Rpb24ucHJvcGVydGllcyk7XG5cbiAgICBjYXNlIE9QRU5fUFJPSkVDVF9DT05GSUdVUkFUT1I6XG4gICAgICByZXR1cm4gb3BlblByb2plY3RDb25maWd1cmF0b3Ioc3RhdGUpO1xuXG4gICAgY2FzZSBJTklUX0NBVEFMT0c6XG4gICAgICByZXR1cm4gaW5pdENhdGFsb2coc3RhdGUsIGFjdGlvbi5jYXRhbG9nKTtcblxuICAgIGNhc2UgVVBEQVRFX01PVVNFX0NPT1JEUzpcbiAgICAgIHJldHVybiB1cGRhdGVNb3VzZUNvb3JkKHN0YXRlLCBhY3Rpb24uY29vcmRzKTtcblxuICAgIGNhc2UgVVBEQVRFX1pPT01fU0NBTEU6XG4gICAgICByZXR1cm4gdXBkYXRlWm9vbVNjYWxlKHN0YXRlLCBhY3Rpb24uc2NhbGUpO1xuXG4gICAgY2FzZSBUT0dHTEVfU05BUDpcbiAgICAgIHJldHVybiB0b2dnbGVTbmFwKHN0YXRlLCBhY3Rpb24ubWFzayk7XG5cbiAgICBjYXNlIFRIUk9XX0VSUk9SOlxuICAgICAgcmV0dXJuIHRocm93RXJyb3Ioc3RhdGUsIGFjdGlvbi5lcnJvcik7XG5cbiAgICBjYXNlIFRIUk9XX1dBUk5JTkc6XG4gICAgICByZXR1cm4gdGhyb3dXYXJuaW5nKHN0YXRlLCBhY3Rpb24ud2FybmluZyk7XG5cbiAgICBjYXNlIENPUFlfUFJPUEVSVElFUzpcbiAgICAgIHJldHVybiBjb3B5UHJvcGVydGllcyhzdGF0ZSwgYWN0aW9uLnByb3BlcnRpZXMpO1xuXG4gICAgY2FzZSBQQVNURV9QUk9QRVJUSUVTOlxuICAgICAgcmV0dXJuIHBhc3RlUHJvcGVydGllcyhzdGF0ZSk7XG5cbiAgICBjYXNlIFBVU0hfTEFTVF9TRUxFQ1RFRF9DQVRBTE9HX0VMRU1FTlRfVE9fSElTVE9SWTpcbiAgICAgIHJldHVybiBwdXNoTGFzdFNlbGVjdGVkQ2F0YWxvZ0VsZW1lbnRUb0hpc3Rvcnkoc3RhdGUsIGFjdGlvbi5lbGVtZW50KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgfVxufVxuXG5mdW5jdGlvbiBvcGVuQ2F0YWxvZyhzdGF0ZSkge1xuICByZXR1cm4gcm9sbGJhY2soc3RhdGUpXG4gICAgLnNldCgnbW9kZScsIE1PREVfVklFV0lOR19DQVRBTE9HKTtcbn1cblxuZnVuY3Rpb24gbmV3UHJvamVjdChzdGF0ZSkge1xuICByZXR1cm4gbmV3IFN0YXRlKCk7XG59XG5cbmZ1bmN0aW9uIGxvYWRQcm9qZWN0KHN0YXRlLCBzY2VuZUpTT04pIHtcbiAgcmV0dXJuIG5ldyBTdGF0ZSh7c2NlbmU6IHNjZW5lSlNPTiwgY2F0YWxvZzogc3RhdGUuY2F0YWxvZy50b0pTKCl9KTtcbn1cblxuZnVuY3Rpb24gc2V0UHJvcGVydGllcyhzdGF0ZSwgcHJvcGVydGllcykge1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZTtcbiAgc2NlbmUgPSBzY2VuZS5zZXQoJ2xheWVycycsIHNjZW5lLmxheWVycy5tYXAobGF5ZXIgPT4gc2V0UHJvcGVydGllc09uU2VsZWN0ZWQobGF5ZXIsIHByb3BlcnRpZXMpKSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhzdGF0ZSwgcHJvcGVydGllcykge1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZTtcbiAgc2NlbmUgPSBzY2VuZS5zZXQoJ2xheWVycycsIHNjZW5lLmxheWVycy5tYXAobGF5ZXIgPT4gdXBkYXRlUHJvcGVydGllc09uU2VsZWN0ZWQobGF5ZXIsIHByb3BlcnRpZXMpKSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0SXRlbXNBdHRyaWJ1dGVzKHN0YXRlLCBhdHRyaWJ1dGVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuICBzY2VuZSA9IHNjZW5lLnNldCgnbGF5ZXJzJywgc2NlbmUubGF5ZXJzLm1hcChsYXllciA9PiBzZXRBdHRyaWJ1dGVzT25TZWxlY3RlZChsYXllciwgYXR0cmlidXRlcywgc3RhdGUuY2F0YWxvZykpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0TGluZXNBdHRyaWJ1dGVzKHN0YXRlLCBhdHRyaWJ1dGVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuXG4gIHNjZW5lID0gc2NlbmUuc2V0KCdsYXllcnMnLCBzY2VuZS5sYXllcnMubWFwKGxheWVyID0+IHNldEF0dHJpYnV0ZXNPblNlbGVjdGVkKGxheWVyLCBhdHRyaWJ1dGVzLCBzdGF0ZS5jYXRhbG9nKSkpO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldEhvbGVzQXR0cmlidXRlcyhzdGF0ZSwgYXR0cmlidXRlcykge1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZTtcbiAgc2NlbmUgPSBzY2VuZS5zZXQoJ2xheWVycycsIHNjZW5lLmxheWVycy5tYXAobGF5ZXIgPT4gc2V0QXR0cmlidXRlc09uU2VsZWN0ZWQobGF5ZXIsIGF0dHJpYnV0ZXMsIHN0YXRlLmNhdGFsb2cpKSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVuc2VsZWN0QWxsKHN0YXRlKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuXG4gIHNjZW5lID0gc2NlbmUudXBkYXRlKCdsYXllcnMnLCBsYXllciA9PiBsYXllci5tYXAodW5zZWxlY3RBbGxPcCkpO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKHN0YXRlKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuICBsZXQgY2F0YWxvZyA9IHN0YXRlLmNhdGFsb2c7XG5cbiAgc2NlbmUgPSBzY2VuZS51cGRhdGVJbihbJ2xheWVycycsIHNjZW5lLnNlbGVjdGVkTGF5ZXJdLCBsYXllciA9PiBsYXllci53aXRoTXV0YXRpb25zKGxheWVyID0+IHtcbiAgICBsZXQge2xpbmVzOiBzZWxlY3RlZExpbmVzLCBob2xlczogc2VsZWN0ZWRIb2xlcywgaXRlbXM6IHNlbGVjdGVkSXRlbXN9ID0gbGF5ZXIuc2VsZWN0ZWQ7XG4gICAgdW5zZWxlY3RBbGxPcChsYXllcik7XG4gICAgc2VsZWN0ZWRMaW5lcy5mb3JFYWNoKGxpbmVJRCA9PiByZW1vdmVMaW5lKGxheWVyLCBsaW5lSUQpKTtcbiAgICBzZWxlY3RlZEhvbGVzLmZvckVhY2goaG9sZUlEID0+IHJlbW92ZUhvbGUobGF5ZXIsIGhvbGVJRCkpO1xuICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChpdGVtSUQgPT4gcmVtb3ZlSXRlbShsYXllciwgaXRlbUlEKSk7XG4gICAgZGV0ZWN0QW5kVXBkYXRlQXJlYXMobGF5ZXIsIGNhdGFsb2cpO1xuICB9KSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KVxufVxuXG5mdW5jdGlvbiB1bmRvKHN0YXRlKSB7XG4gIGxldCBzY2VuZUhpc3RvcnkgPSBzdGF0ZS5zY2VuZUhpc3Rvcnk7XG5cbiAgaWYgKHN0YXRlLnNjZW5lID09PSBzY2VuZUhpc3RvcnkubGFzdCgpICYmICFzY2VuZUhpc3Rvcnkuc2l6ZSA+IDEpXG4gICAgc2NlbmVIaXN0b3J5ID0gc2NlbmVIaXN0b3J5LnBvcCgpO1xuXG4gIHN3aXRjaCAoc2NlbmVIaXN0b3J5LnNpemUpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gc3RhdGU7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgICAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgICAgIHNjZW5lOiBzY2VuZUhpc3RvcnkubGFzdCgpLFxuICAgICAgfSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICAgICAgbW9kZTogTU9ERV9JRExFLFxuICAgICAgICBzY2VuZTogc2NlbmVIaXN0b3J5Lmxhc3QoKSxcbiAgICAgICAgc2NlbmVIaXN0b3J5OiBzY2VuZUhpc3RvcnkucG9wKClcbiAgICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2xsYmFjayhzdGF0ZSkge1xuICBsZXQgc2NlbmVIaXN0b3J5ID0gc3RhdGUuc2NlbmVIaXN0b3J5O1xuXG4gIGlmIChzY2VuZUhpc3RvcnkuaXNFbXB0eSgpKSByZXR1cm4gc3RhdGU7XG5cbiAgbGV0IHNjZW5lID0gc2NlbmVIaXN0b3J5XG4gICAgLmxhc3QoKVxuICAgIC51cGRhdGUoJ2xheWVycycsIGxheWVyID0+IGxheWVyLm1hcCh1bnNlbGVjdEFsbE9wKSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSksXG4gICAgc25hcEVsZW1lbnRzOiBuZXcgTGlzdCgpLFxuICAgIGFjdGl2ZVNuYXBFbGVtZW50OiBudWxsLFxuICAgIGRyYXdpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gICAgZHJhZ2dpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gICAgcm90YXRpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRQcm9qZWN0UHJvcGVydGllcyhzdGF0ZSwgcHJvcGVydGllcykge1xuICBsZXQgc2NlbmUgPSBzdGF0ZS5zY2VuZS5tZXJnZShwcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgc2NlbmUsXG4gICAgc2NlbmVIaXN0b3J5OiBzdGF0ZS5zY2VuZUhpc3RvcnkucHVzaChzY2VuZSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9wZW5Qcm9qZWN0Q29uZmlndXJhdG9yKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9DT05GSUdVUklOR19QUk9KRUNULFxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5pdENhdGFsb2coc3RhdGUsIGNhdGFsb2cpIHtcbiAgcmV0dXJuIHN0YXRlLnNldCgnY2F0YWxvZycsIG5ldyBDYXRhbG9nKGNhdGFsb2cpKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW91c2VDb29yZChzdGF0ZSwgY29vcmRzKSB7XG4gIHJldHVybiBzdGF0ZS5zZXQoJ21vdXNlJywgbmV3IE1hcChjb29yZHMpKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlWm9vbVNjYWxlKHN0YXRlLCBzY2FsZSkge1xuICByZXR1cm4gc3RhdGUuc2V0KCd6b29tJywgc2NhbGUpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVTbmFwKHN0YXRlLCBtYXNrKSB7XG4gIHJldHVybiBzdGF0ZS5zZXQoJ3NuYXBNYXNrJywgbWFzayk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIGVycm9yKSB7XG4gIHJldHVybiBzdGF0ZS5zZXQoJ2Vycm9ycycsIHN0YXRlLmdldCgnZXJyb3JzJykucHVzaCh7XG4gICAgZGF0ZTogRGF0ZS5ub3coKSxcbiAgICBlcnJvclxuICB9KSk7XG59XG5cbmNvbnN0IHRocm93V2FybmluZyA9IChzdGF0ZSwgd2FybmluZykgPT4gc3RhdGUuc2V0KCd3YXJuaW5ncycsIHN0YXRlLmdldCgnd2FybmluZ3MnKS5wdXNoKHtcbiAgZGF0ZTogRGF0ZS5ub3coKSxcbiAgd2FybmluZ1xufSkpO1xuXG5jb25zdCBjb3B5UHJvcGVydGllcyA9IChzdGF0ZSwgcHJvcGVydGllcykgPT4gc3RhdGUuc2V0KCdjbGlwYm9hcmRQcm9wZXJ0aWVzJywgcHJvcGVydGllcy50b0pTKCkpO1xuXG5jb25zdCBwYXN0ZVByb3BlcnRpZXMgPSAoc3RhdGUpID0+IHVwZGF0ZVByb3BlcnRpZXMoc3RhdGUsIHN0YXRlLmdldCgnY2xpcGJvYXJkUHJvcGVydGllcycpKTtcblxuY29uc3QgcHVzaExhc3RTZWxlY3RlZENhdGFsb2dFbGVtZW50VG9IaXN0b3J5ID0gKCBzdGF0ZSwgZWxlbWVudCApID0+IHtcbiAgbGV0IGN1cnJIaXN0b3J5ID0gc3RhdGUuc2VsZWN0ZWRFbGVtZW50c0hpc3Rvcnk7XG5cbiAgbGV0IHByZXZpb3VzUG9zaXRpb24gPSBjdXJySGlzdG9yeS5maW5kSW5kZXgoIGVsID0+IGVsLm5hbWUgPT09IGVsZW1lbnQubmFtZSApO1xuICBpZiggcHJldmlvdXNQb3NpdGlvbiAhPT0gLTEgKVxuICB7XG4gICAgY3Vyckhpc3RvcnkgPSBjdXJySGlzdG9yeS5zcGxpY2UoIHByZXZpb3VzUG9zaXRpb24sIDEgKTtcbiAgfVxuICBjdXJySGlzdG9yeSA9IGN1cnJIaXN0b3J5LnNwbGljZSggMCwgMCwgZWxlbWVudCApO1xuXG4gIHJldHVybiBzdGF0ZS5zZXQoJ3NlbGVjdGVkRWxlbWVudHNIaXN0b3J5JywgY3Vyckhpc3RvcnkpO1xufTtcbiJdfQ==