UNPKG

react-planner-viewer

Version:

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

324 lines (255 loc) 35.6 kB
import { Seq, Map, List } from "immutable"; import { LOAD_PROJECT, NEW_PROJECT, OPEN_CATALOG, MODE_VIEWING_CATALOG, MODE_CONFIGURING_PROJECT, SELECT_TOOL_EDIT, MODE_IDLE, UNSELECT_ALL, SET_PROPERTIES, SET_ITEMS_ATTRIBUTES, SET_LINES_ATTRIBUTES, SET_HOLES_ATTRIBUTES, REMOVE, UNDO, ROLLBACK, SET_PROJECT_PROPERTIES, OPEN_PROJECT_CONFIGURATOR, INIT_CATALOG, UPDATE_MOUSE_COORDS, UPDATE_ZOOM_SCALE, TOGGLE_SNAP, CHANGE_CATALOG_PAGE, GO_BACK_TO_CATALOG_PAGE, THROW_ERROR, THROW_WARNING, COPY_PROPERTIES, PASTE_PROPERTIES, PUSH_LAST_SELECTED_CATALOG_ELEMENT_TO_HISTORY } from '../constants'; import { State, Scene, Guide, Catalog } from "../models"; import { removeLine, removeHole, detectAndUpdateAreas, setProperties as setPropertiesOp, setItemsAttributes as setItemsAttributesOp, setLinesAttributes as setLinesAttributesOp, setHolesAttributes as setHolesAttributesOp, select, unselect, unselectAll as unselectAllOp, removeItem, loadLayerFromJSON, setPropertiesOnSelected, updatePropertiesOnSelected, setAttributesOnSelected } from '../utils/layer-operations'; export default function (state, action) { switch (action.type) { case NEW_PROJECT: return newProject(state); case LOAD_PROJECT: return loadProject(state, action.sceneJSON); case OPEN_CATALOG: return openCatalog(state); case CHANGE_CATALOG_PAGE: return state.setIn(['catalog', 'page'], action.newPage).updateIn(['catalog', 'path'], function (path) { return path.push(action.oldPage); }); case 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 SELECT_TOOL_EDIT: return state.set('mode', MODE_IDLE); case UNSELECT_ALL: return unselectAll(state); case SET_PROPERTIES: return setProperties(state, action.properties); case SET_ITEMS_ATTRIBUTES: return setItemsAttributes(state, action.itemsAttributes); case SET_LINES_ATTRIBUTES: return setLinesAttributes(state, action.linesAttributes); case SET_HOLES_ATTRIBUTES: return setHolesAttributes(state, action.holesAttributes); case REMOVE: return remove(state); case UNDO: return undo(state); case ROLLBACK: return rollback(state); case SET_PROJECT_PROPERTIES: return setProjectProperties(state, action.properties); case OPEN_PROJECT_CONFIGURATOR: return openProjectConfigurator(state); case INIT_CATALOG: return initCatalog(state, action.catalog); case UPDATE_MOUSE_COORDS: return updateMouseCoord(state, action.coords); case UPDATE_ZOOM_SCALE: return updateZoomScale(state, action.scale); case TOGGLE_SNAP: return toggleSnap(state, action.mask); case THROW_ERROR: return throwError(state, action.error); case THROW_WARNING: return throwWarning(state, action.warning); case COPY_PROPERTIES: return copyProperties(state, action.properties); case PASTE_PROPERTIES: return pasteProperties(state); case PUSH_LAST_SELECTED_CATALOG_ELEMENT_TO_HISTORY: return pushLastSelectedCatalogElementToHistory(state, action.element); default: return state; } } function openCatalog(state) { return rollback(state).set('mode', MODE_VIEWING_CATALOG); } function newProject(state) { return new State(); } function loadProject(state, sceneJSON) { return new 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 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 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 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 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 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(unselectAllOp); }); 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; unselectAllOp(layer); selectedLines.forEach(function (lineID) { return removeLine(layer, lineID); }); selectedHoles.forEach(function (holeID) { return removeHole(layer, holeID); }); selectedItems.forEach(function (itemID) { return removeItem(layer, itemID); }); 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: MODE_IDLE, scene: sceneHistory.last() }); default: return state.merge({ mode: MODE_IDLE, scene: sceneHistory.last(), sceneHistory: sceneHistory.pop() }); } } export function rollback(state) { var sceneHistory = state.sceneHistory; if (sceneHistory.isEmpty()) return state; var scene = sceneHistory.last().update('layers', function (layer) { return layer.map(unselectAllOp); }); return state.merge({ mode: MODE_IDLE, scene: scene, sceneHistory: state.sceneHistory.push(scene), snapElements: new List(), activeSnapElement: null, drawingSupport: new Map(), draggingSupport: new Map(), rotatingSupport: new Map() }); } function setProjectProperties(state, properties) { var scene = state.scene.merge(properties); return state.merge({ mode: MODE_IDLE, scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } function openProjectConfigurator(state) { return state.merge({ mode: MODE_CONFIGURING_PROJECT }); } function initCatalog(state, catalog) { return state.set('catalog', new Catalog(catalog)); } function updateMouseCoord(state, coords) { return state.set('mouse', new 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9wcm9qZWN0LXJlZHVjZXIuanMiXSwibmFtZXMiOlsiU2VxIiwiTWFwIiwiTGlzdCIsIkxPQURfUFJPSkVDVCIsIk5FV19QUk9KRUNUIiwiT1BFTl9DQVRBTE9HIiwiTU9ERV9WSUVXSU5HX0NBVEFMT0ciLCJNT0RFX0NPTkZJR1VSSU5HX1BST0pFQ1QiLCJTRUxFQ1RfVE9PTF9FRElUIiwiTU9ERV9JRExFIiwiVU5TRUxFQ1RfQUxMIiwiU0VUX1BST1BFUlRJRVMiLCJTRVRfSVRFTVNfQVRUUklCVVRFUyIsIlNFVF9MSU5FU19BVFRSSUJVVEVTIiwiU0VUX0hPTEVTX0FUVFJJQlVURVMiLCJSRU1PVkUiLCJVTkRPIiwiUk9MTEJBQ0siLCJTRVRfUFJPSkVDVF9QUk9QRVJUSUVTIiwiT1BFTl9QUk9KRUNUX0NPTkZJR1VSQVRPUiIsIklOSVRfQ0FUQUxPRyIsIlVQREFURV9NT1VTRV9DT09SRFMiLCJVUERBVEVfWk9PTV9TQ0FMRSIsIlRPR0dMRV9TTkFQIiwiQ0hBTkdFX0NBVEFMT0dfUEFHRSIsIkdPX0JBQ0tfVE9fQ0FUQUxPR19QQUdFIiwiVEhST1dfRVJST1IiLCJUSFJPV19XQVJOSU5HIiwiQ09QWV9QUk9QRVJUSUVTIiwiUEFTVEVfUFJPUEVSVElFUyIsIlBVU0hfTEFTVF9TRUxFQ1RFRF9DQVRBTE9HX0VMRU1FTlRfVE9fSElTVE9SWSIsIlN0YXRlIiwiU2NlbmUiLCJHdWlkZSIsIkNhdGFsb2ciLCJyZW1vdmVMaW5lIiwicmVtb3ZlSG9sZSIsImRldGVjdEFuZFVwZGF0ZUFyZWFzIiwic2V0UHJvcGVydGllcyIsInNldFByb3BlcnRpZXNPcCIsInNldEl0ZW1zQXR0cmlidXRlcyIsInNldEl0ZW1zQXR0cmlidXRlc09wIiwic2V0TGluZXNBdHRyaWJ1dGVzIiwic2V0TGluZXNBdHRyaWJ1dGVzT3AiLCJzZXRIb2xlc0F0dHJpYnV0ZXMiLCJzZXRIb2xlc0F0dHJpYnV0ZXNPcCIsInNlbGVjdCIsInVuc2VsZWN0IiwidW5zZWxlY3RBbGwiLCJ1bnNlbGVjdEFsbE9wIiwicmVtb3ZlSXRlbSIsImxvYWRMYXllckZyb21KU09OIiwic2V0UHJvcGVydGllc09uU2VsZWN0ZWQiLCJ1cGRhdGVQcm9wZXJ0aWVzT25TZWxlY3RlZCIsInNldEF0dHJpYnV0ZXNPblNlbGVjdGVkIiwic3RhdGUiLCJhY3Rpb24iLCJ0eXBlIiwibmV3UHJvamVjdCIsImxvYWRQcm9qZWN0Iiwic2NlbmVKU09OIiwib3BlbkNhdGFsb2ciLCJzZXRJbiIsIm5ld1BhZ2UiLCJ1cGRhdGVJbiIsInBhdGgiLCJwdXNoIiwib2xkUGFnZSIsImNhdGFsb2ciLCJwYWdlSW5kZXgiLCJmaW5kSW5kZXgiLCJwYWdlIiwidGFrZSIsInNldCIsInByb3BlcnRpZXMiLCJpdGVtc0F0dHJpYnV0ZXMiLCJsaW5lc0F0dHJpYnV0ZXMiLCJob2xlc0F0dHJpYnV0ZXMiLCJyZW1vdmUiLCJ1bmRvIiwicm9sbGJhY2siLCJzZXRQcm9qZWN0UHJvcGVydGllcyIsIm9wZW5Qcm9qZWN0Q29uZmlndXJhdG9yIiwiaW5pdENhdGFsb2ciLCJ1cGRhdGVNb3VzZUNvb3JkIiwiY29vcmRzIiwidXBkYXRlWm9vbVNjYWxlIiwic2NhbGUiLCJ0b2dnbGVTbmFwIiwibWFzayIsInRocm93RXJyb3IiLCJlcnJvciIsInRocm93V2FybmluZyIsIndhcm5pbmciLCJjb3B5UHJvcGVydGllcyIsInBhc3RlUHJvcGVydGllcyIsInB1c2hMYXN0U2VsZWN0ZWRDYXRhbG9nRWxlbWVudFRvSGlzdG9yeSIsImVsZW1lbnQiLCJzY2VuZSIsInRvSlMiLCJsYXllcnMiLCJtYXAiLCJsYXllciIsIm1lcmdlIiwic2NlbmVIaXN0b3J5IiwidXBkYXRlUHJvcGVydGllcyIsImF0dHJpYnV0ZXMiLCJ1cGRhdGUiLCJzZWxlY3RlZExheWVyIiwid2l0aE11dGF0aW9ucyIsInNlbGVjdGVkIiwic2VsZWN0ZWRMaW5lcyIsImxpbmVzIiwic2VsZWN0ZWRIb2xlcyIsImhvbGVzIiwic2VsZWN0ZWRJdGVtcyIsIml0ZW1zIiwiZm9yRWFjaCIsImxpbmVJRCIsImhvbGVJRCIsIml0ZW1JRCIsImxhc3QiLCJzaXplIiwicG9wIiwibW9kZSIsImlzRW1wdHkiLCJzbmFwRWxlbWVudHMiLCJhY3RpdmVTbmFwRWxlbWVudCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwiZ2V0IiwiZGF0ZSIsIkRhdGUiLCJub3ciLCJjdXJySGlzdG9yeSIsInNlbGVjdGVkRWxlbWVudHNIaXN0b3J5IiwicHJldmlvdXNQb3NpdGlvbiIsImVsIiwibmFtZSIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUUEsR0FBUixFQUFhQyxHQUFiLEVBQWtCQyxJQUFsQixRQUE2QixXQUE3QjtBQUNBLFNBQ0VDLFlBREYsRUFFRUMsV0FGRixFQUdFQyxZQUhGLEVBSUVDLG9CQUpGLEVBS0VDLHdCQUxGLEVBTUVDLGdCQU5GLEVBT0VDLFNBUEYsRUFRRUMsWUFSRixFQVNFQyxjQVRGLEVBVUVDLG9CQVZGLEVBV0VDLG9CQVhGLEVBWUVDLG9CQVpGLEVBYUVDLE1BYkYsRUFjRUMsSUFkRixFQWVFQyxRQWZGLEVBZ0JFQyxzQkFoQkYsRUFpQkVDLHlCQWpCRixFQWtCRUMsWUFsQkYsRUFtQkVDLG1CQW5CRixFQW9CRUMsaUJBcEJGLEVBcUJFQyxXQXJCRixFQXNCRUMsbUJBdEJGLEVBdUJFQyx1QkF2QkYsRUF3QkVDLFdBeEJGLEVBeUJFQyxhQXpCRixFQTBCRUMsZUExQkYsRUEyQkVDLGdCQTNCRixFQTRCRUMsNkNBNUJGLFFBNkJPLGNBN0JQOztBQStCQSxTQUFRQyxLQUFSLEVBQWVDLEtBQWYsRUFBc0JDLEtBQXRCLEVBQTZCQyxPQUE3QixRQUEyQyxXQUEzQzs7QUFFQSxTQUNFQyxVQURGLEVBRUVDLFVBRkYsRUFHRUMsb0JBSEYsRUFJRUMsaUJBQWlCQyxlQUpuQixFQUtFQyxzQkFBc0JDLG9CQUx4QixFQU1FQyxzQkFBc0JDLG9CQU54QixFQU9FQyxzQkFBc0JDLG9CQVB4QixF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QWQ7QUFDRDtBQUNERixnQkFBY0EsWUFBWUssTUFBWixDQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQjNDLE9BQTFCLENBQWQ7O0FBRUEsU0FBTzFDLE1BQU1rQixHQUFOLENBQVUseUJBQVYsRUFBcUM4RCxXQUFyQyxDQUFQO0FBQ0QsQ0FYRCIsImZpbGUiOiJwcm9qZWN0LXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcSwgTWFwLCBMaXN0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQge1xuICBMT0FEX1BST0pFQ1QsXG4gIE5FV19QUk9KRUNULFxuICBPUEVOX0NBVEFMT0csXG4gIE1PREVfVklFV0lOR19DQVRBTE9HLFxuICBNT0RFX0NPTkZJR1VSSU5HX1BST0pFQ1QsXG4gIFNFTEVDVF9UT09MX0VESVQsXG4gIE1PREVfSURMRSxcbiAgVU5TRUxFQ1RfQUxMLFxuICBTRVRfUFJPUEVSVElFUyxcbiAgU0VUX0lURU1TX0FUVFJJQlVURVMsXG4gIFNFVF9MSU5FU19BVFRSSUJVVEVTLFxuICBTRVRfSE9MRVNfQVRUUklCVVRFUyxcbiAgUkVNT1ZFLFxuICBVTkRPLFxuICBST0xMQkFDSyxcbiAgU0VUX1BST0pFQ1RfUFJPUEVSVElFUyxcbiAgT1BFTl9QUk9KRUNUX0NPTkZJR1VSQVRPUixcbiAgSU5JVF9DQVRBTE9HLFxuICBVUERBVEVfTU9VU0VfQ09PUkRTLFxuICBVUERBVEVfWk9PTV9TQ0FMRSxcbiAgVE9HR0xFX1NOQVAsXG4gIENIQU5HRV9DQVRBTE9HX1BBR0UsXG4gIEdPX0JBQ0tfVE9fQ0FUQUxPR19QQUdFLFxuICBUSFJPV19FUlJPUixcbiAgVEhST1dfV0FSTklORyxcbiAgQ09QWV9QUk9QRVJUSUVTLFxuICBQQVNURV9QUk9QRVJUSUVTLFxuICBQVVNIX0xBU1RfU0VMRUNURURfQ0FUQUxPR19FTEVNRU5UX1RPX0hJU1RPUllcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtTdGF0ZSwgU2NlbmUsIEd1aWRlLCBDYXRhbG9nfSBmcm9tIFwiLi4vbW9kZWxzXCI7XG5cbmltcG9ydCB7XG4gIHJlbW92ZUxpbmUsXG4gIHJlbW92ZUhvbGUsXG4gIGRldGVjdEFuZFVwZGF0ZUFyZWFzLFxuICBzZXRQcm9wZXJ0aWVzIGFzIHNldFByb3BlcnRpZXNPcCxcbiAgc2V0SXRlbXNBdHRyaWJ1dGVzIGFzIHNldEl0ZW1zQXR0cmlidXRlc09wLFxuICBzZXRMaW5lc0F0dHJpYnV0ZXMgYXMgc2V0TGluZXNBdHRyaWJ1dGVzT3AsXG4gIHNldEhvbGVzQXR0cmlidXRlcyBhcyBzZXRIb2xlc0F0dHJpYnV0ZXNPcCxcbiAgc2VsZWN0LFxuICB1bnNlbGVjdCxcbiAgdW5zZWxlY3RBbGwgYXMgdW5zZWxlY3RBbGxPcCxcbiAgcmVtb3ZlSXRlbSxcbiAgbG9hZExheWVyRnJvbUpTT04sXG4gIHNldFByb3BlcnRpZXNPblNlbGVjdGVkLFxuICB1cGRhdGVQcm9wZXJ0aWVzT25TZWxlY3RlZCxcbiAgc2V0QXR0cmlidXRlc09uU2VsZWN0ZWRcbn0gZnJvbSAnLi4vdXRpbHMvbGF5ZXItb3BlcmF0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG5cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgTkVXX1BST0pFQ1Q6XG4gICAgICByZXR1cm4gbmV3UHJvamVjdChzdGF0ZSk7XG5cbiAgICBjYXNlIExPQURfUFJPSkVDVDpcbiAgICAgIHJldHVybiBsb2FkUHJvamVjdChzdGF0ZSwgYWN0aW9uLnNjZW5lSlNPTik7XG5cbiAgICBjYXNlIE9QRU5fQ0FUQUxPRzpcbiAgICAgIHJldHVybiBvcGVuQ2F0YWxvZyhzdGF0ZSk7XG5cbiAgICBjYXNlIENIQU5HRV9DQVRBTE9HX1BBR0U6XG4gICAgICByZXR1cm4gc3RhdGUuc2V0SW4oWydjYXRhbG9nJywgJ3BhZ2UnXSwgYWN0aW9uLm5ld1BhZ2UpXG4gICAgICAgIC51cGRhdGVJbihbJ2NhdGFsb2cnLCAncGF0aCddLCBwYXRoID0+IHBhdGgucHVzaChhY3Rpb24ub2xkUGFnZSkpO1xuXG4gICAgY2FzZSBHT19CQUNLX1RPX0NBVEFMT0dfUEFHRTpcbiAgICAgIGxldCBwYXRoID0gc3RhdGUuY2F0YWxvZy5wYXRoO1xuICAgICAgbGV0IHBhZ2VJbmRleCA9IHN0YXRlLmNhdGFsb2cucGF0aC5maW5kSW5kZXgocGFnZSA9PiBwYWdlID09PSBhY3Rpb24ubmV3UGFnZSk7XG4gICAgICByZXR1cm4gc3RhdGUuc2V0SW4oWydjYXRhbG9nJywgJ3BhZ2UnXSwgYWN0aW9uLm5ld1BhZ2UpXG4gICAgICAgIC51cGRhdGVJbihbJ2NhdGFsb2cnLCAncGF0aCddLCBwYXRoID0+IHBhdGgudGFrZShwYWdlSW5kZXgpKTtcblxuICAgIGNhc2UgU0VMRUNUX1RPT0xfRURJVDpcbiAgICAgIHJldHVybiBzdGF0ZS5zZXQoJ21vZGUnLCBNT0RFX0lETEUpO1xuXG4gICAgY2FzZSBVTlNFTEVDVF9BTEw6XG4gICAgICByZXR1cm4gdW5zZWxlY3RBbGwoc3RhdGUpO1xuXG4gICAgY2FzZSBTRVRfUFJPUEVSVElFUzpcbiAgICAgIHJldHVybiBzZXRQcm9wZXJ0aWVzKHN0YXRlLCBhY3Rpb24ucHJvcGVydGllcyk7XG5cbiAgICBjYXNlIFNFVF9JVEVNU19BVFRSSUJVVEVTOlxuICAgICAgcmV0dXJuIHNldEl0ZW1zQXR0cmlidXRlcyhzdGF0ZSwgYWN0aW9uLml0ZW1zQXR0cmlidXRlcyk7XG5cbiAgICBjYXNlIFNFVF9MSU5FU19BVFRSSUJVVEVTOlxuICAgICAgcmV0dXJuIHNldExpbmVzQXR0cmlidXRlcyhzdGF0ZSwgYWN0aW9uLmxpbmVzQXR0cmlidXRlcyk7XG5cbiAgICBjYXNlIFNFVF9IT0xFU19BVFRSSUJVVEVTOlxuICAgICAgcmV0dXJuIHNldEhvbGVzQXR0cmlidXRlcyhzdGF0ZSwgYWN0aW9uLmhvbGVzQXR0cmlidXRlcyk7XG5cbiAgICBjYXNlIFJFTU9WRTpcbiAgICAgIHJldHVybiByZW1vdmUoc3RhdGUpO1xuXG4gICAgY2FzZSBVTkRPOlxuICAgICAgcmV0dXJuIHVuZG8oc3RhdGUpO1xuXG4gICAgY2FzZSBST0xMQkFDSzpcbiAgICAgIHJldHVybiByb2xsYmFjayhzdGF0ZSk7XG5cbiAgICBjYXNlIFNFVF9QUk9KRUNUX1BST1BFUlRJRVM6XG4gICAgICByZXR1cm4gc2V0UHJvamVjdFByb3BlcnRpZXMoc3RhdGUsIGFjdGlvbi5wcm9wZXJ0aWVzKTtcblxuICAgIGNhc2UgT1BFTl9QUk9KRUNUX0NPTkZJR1VSQVRPUjpcbiAgICAgIHJldHVybiBvcGVuUHJvamVjdENvbmZpZ3VyYXRvcihzdGF0ZSk7XG5cbiAgICBjYXNlIElOSVRfQ0FUQUxPRzpcbiAgICAgIHJldHVybiBpbml0Q2F0YWxvZyhzdGF0ZSwgYWN0aW9uLmNhdGFsb2cpO1xuXG4gICAgY2FzZSBVUERBVEVfTU9VU0VfQ09PUkRTOlxuICAgICAgcmV0dXJuIHVwZGF0ZU1vdXNlQ29vcmQoc3RhdGUsIGFjdGlvbi5jb29yZHMpO1xuXG4gICAgY2FzZSBVUERBVEVfWk9PTV9TQ0FMRTpcbiAgICAgIHJldHVybiB1cGRhdGVab29tU2NhbGUoc3RhdGUsIGFjdGlvbi5zY2FsZSk7XG5cbiAgICBjYXNlIFRPR0dMRV9TTkFQOlxuICAgICAgcmV0dXJuIHRvZ2dsZVNuYXAoc3RhdGUsIGFjdGlvbi5tYXNrKTtcblxuICAgIGNhc2UgVEhST1dfRVJST1I6XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihzdGF0ZSwgYWN0aW9uLmVycm9yKTtcblxuICAgIGNhc2UgVEhST1dfV0FSTklORzpcbiAgICAgIHJldHVybiB0aHJvd1dhcm5pbmcoc3RhdGUsIGFjdGlvbi53YXJuaW5nKTtcblxuICAgIGNhc2UgQ09QWV9QUk9QRVJUSUVTOlxuICAgICAgcmV0dXJuIGNvcHlQcm9wZXJ0aWVzKHN0YXRlLCBhY3Rpb24ucHJvcGVydGllcyk7XG5cbiAgICBjYXNlIFBBU1RFX1BST1BFUlRJRVM6XG4gICAgICByZXR1cm4gcGFzdGVQcm9wZXJ0aWVzKHN0YXRlKTtcblxuICAgIGNhc2UgUFVTSF9MQVNUX1NFTEVDVEVEX0NBVEFMT0dfRUxFTUVOVF9UT19ISVNUT1JZOlxuICAgICAgcmV0dXJuIHB1c2hMYXN0U2VsZWN0ZWRDYXRhbG9nRWxlbWVudFRvSGlzdG9yeShzdGF0ZSwgYWN0aW9uLmVsZW1lbnQpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICB9XG59XG5cbmZ1bmN0aW9uIG9wZW5DYXRhbG9nKHN0YXRlKSB7XG4gIHJldHVybiByb2xsYmFjayhzdGF0ZSlcbiAgICAuc2V0KCdtb2RlJywgTU9ERV9WSUVXSU5HX0NBVEFMT0cpO1xufVxuXG5mdW5jdGlvbiBuZXdQcm9qZWN0KHN0YXRlKSB7XG4gIHJldHVybiBuZXcgU3RhdGUoKTtcbn1cblxuZnVuY3Rpb24gbG9hZFByb2plY3Qoc3RhdGUsIHNjZW5lSlNPTikge1xuICByZXR1cm4gbmV3IFN0YXRlKHtzY2VuZTogc2NlbmVKU09OLCBjYXRhbG9nOiBzdGF0ZS5jYXRhbG9nLnRvSlMoKX0pO1xufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0aWVzKHN0YXRlLCBwcm9wZXJ0aWVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuICBzY2VuZSA9IHNjZW5lLnNldCgnbGF5ZXJzJywgc2NlbmUubGF5ZXJzLm1hcChsYXllciA9PiBzZXRQcm9wZXJ0aWVzT25TZWxlY3RlZChsYXllciwgcHJvcGVydGllcykpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KVxufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKHN0YXRlLCBwcm9wZXJ0aWVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuICBzY2VuZSA9IHNjZW5lLnNldCgnbGF5ZXJzJywgc2NlbmUubGF5ZXJzLm1hcChsYXllciA9PiB1cGRhdGVQcm9wZXJ0aWVzT25TZWxlY3RlZChsYXllciwgcHJvcGVydGllcykpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzZXRJdGVtc0F0dHJpYnV0ZXMoc3RhdGUsIGF0dHJpYnV0ZXMpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG4gIHNjZW5lID0gc2NlbmUuc2V0KCdsYXllcnMnLCBzY2VuZS5sYXllcnMubWFwKGxheWVyID0+IHNldEF0dHJpYnV0ZXNPblNlbGVjdGVkKGxheWVyLCBhdHRyaWJ1dGVzLCBzdGF0ZS5jYXRhbG9nKSkpO1xuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRMaW5lc0F0dHJpYnV0ZXMoc3RhdGUsIGF0dHJpYnV0ZXMpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG5cbiAgc2NlbmUgPSBzY2VuZS5zZXQoJ2xheWVycycsIHNjZW5lLmxheWVycy5tYXAobGF5ZXIgPT4gc2V0QXR0cmlidXRlc09uU2VsZWN0ZWQobGF5ZXIsIGF0dHJpYnV0ZXMsIHN0YXRlLmNhdGFsb2cpKSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0SG9sZXNBdHRyaWJ1dGVzKHN0YXRlLCBhdHRyaWJ1dGVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lO1xuICBzY2VuZSA9IHNjZW5lLnNldCgnbGF5ZXJzJywgc2NlbmUubGF5ZXJzLm1hcChsYXllciA9PiBzZXRBdHRyaWJ1dGVzT25TZWxlY3RlZChsYXllciwgYXR0cmlidXRlcywgc3RhdGUuY2F0YWxvZykpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdW5zZWxlY3RBbGwoc3RhdGUpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG5cbiAgc2NlbmUgPSBzY2VuZS51cGRhdGUoJ2xheWVycycsIGxheWVyID0+IGxheWVyLm1hcCh1bnNlbGVjdEFsbE9wKSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KVxufVxuXG5mdW5jdGlvbiByZW1vdmUoc3RhdGUpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG4gIGxldCBjYXRhbG9nID0gc3RhdGUuY2F0YWxvZztcblxuICBzY2VuZSA9IHNjZW5lLnVwZGF0ZUluKFsnbGF5ZXJzJywgc2NlbmUuc2VsZWN0ZWRMYXllcl0sIGxheWVyID0+IGxheWVyLndpdGhNdXRhdGlvbnMobGF5ZXIgPT4ge1xuICAgIGxldCB7bGluZXM6IHNlbGVjdGVkTGluZXMsIGhvbGVzOiBzZWxlY3RlZEhvbGVzLCBpdGVtczogc2VsZWN0ZWRJdGVtc30gPSBsYXllci5zZWxlY3RlZDtcbiAgICB1bnNlbGVjdEFsbE9wKGxheWVyKTtcbiAgICBzZWxlY3RlZExpbmVzLmZvckVhY2gobGluZUlEID0+IHJlbW92ZUxpbmUobGF5ZXIsIGxpbmVJRCkpO1xuICAgIHNlbGVjdGVkSG9sZXMuZm9yRWFjaChob2xlSUQgPT4gcmVtb3ZlSG9sZShsYXllciwgaG9sZUlEKSk7XG4gICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGl0ZW1JRCA9PiByZW1vdmVJdGVtKGxheWVyLCBpdGVtSUQpKTtcbiAgICBkZXRlY3RBbmRVcGRhdGVBcmVhcyhsYXllciwgY2F0YWxvZyk7XG4gIH0pKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHVuZG8oc3RhdGUpIHtcbiAgbGV0IHNjZW5lSGlzdG9yeSA9IHN0YXRlLnNjZW5lSGlzdG9yeTtcblxuICBpZiAoc3RhdGUuc2NlbmUgPT09IHNjZW5lSGlzdG9yeS5sYXN0KCkgJiYgIXNjZW5lSGlzdG9yeS5zaXplID4gMSlcbiAgICBzY2VuZUhpc3RvcnkgPSBzY2VuZUhpc3RvcnkucG9wKCk7XG5cbiAgc3dpdGNoIChzY2VuZUhpc3Rvcnkuc2l6ZSkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBzdGF0ZTtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgICAgIG1vZGU6IE1PREVfSURMRSxcbiAgICAgICAgc2NlbmU6IHNjZW5lSGlzdG9yeS5sYXN0KCksXG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgICAgICBtb2RlOiBNT0RFX0lETEUsXG4gICAgICAgIHNjZW5lOiBzY2VuZUhpc3RvcnkubGFzdCgpLFxuICAgICAgICBzY2VuZUhpc3Rvcnk6IHNjZW5lSGlzdG9yeS5wb3AoKVxuICAgICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvbGxiYWNrKHN0YXRlKSB7XG4gIGxldCBzY2VuZUhpc3RvcnkgPSBzdGF0ZS5zY2VuZUhpc3Rvcnk7XG5cbiAgaWYgKHNjZW5lSGlzdG9yeS5pc0VtcHR5KCkpIHJldHVybiBzdGF0ZTtcblxuICBsZXQgc2NlbmUgPSBzY2VuZUhpc3RvcnlcbiAgICAubGFzdCgpXG4gICAgLnVwZGF0ZSgnbGF5ZXJzJywgbGF5ZXIgPT4gbGF5ZXIubWFwKHVuc2VsZWN0QWxsT3ApKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfSURMRSxcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKSxcbiAgICBzbmFwRWxlbWVudHM6IG5ldyBMaXN0KCksXG4gICAgYWN0aXZlU25hcEVsZW1lbnQ6IG51bGwsXG4gICAgZHJhd2luZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgICBkcmFnZ2luZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgICByb3RhdGluZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFByb2plY3RQcm9wZXJ0aWVzKHN0YXRlLCBwcm9wZXJ0aWVzKSB7XG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lLm1lcmdlKHByb3BlcnRpZXMpO1xuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfSURMRSxcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb3BlblByb2plY3RDb25maWd1cmF0b3Ioc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBtb2RlOiBNT0RFX0NPTkZJR1VSSU5HX1BST0pFQ1QsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0Q2F0YWxvZyhzdGF0ZSwgY2F0YWxvZykge1xuICByZXR1cm4gc3RhdGUuc2V0KCdjYXRhbG9nJywgbmV3IENhdGFsb2coY2F0YWxvZykpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb3VzZUNvb3JkKHN0YXRlLCBjb29yZHMpIHtcbiAgcmV0dXJuIHN0YXRlLnNldCgnbW91c2UnLCBuZXcgTWFwKGNvb3JkcykpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVab29tU2NhbGUoc3RhdGUsIHNjYWxlKSB7XG4gIHJldHVybiBzdGF0ZS5zZXQoJ3pvb20nLCBzY2FsZSk7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZVNuYXAoc3RhdGUsIG1hc2spIHtcbiAgcmV0dXJuIHN0YXRlLnNldCgnc25hcE1hc2snLCBtYXNrKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgZXJyb3IpIHtcbiAgcmV0dXJuIHN0YXRlLnNldCgnZXJyb3JzJywgc3RhdGUuZ2V0KCdlcnJvcnMnKS5wdXNoKHtcbiAgICBkYXRlOiBEYXRlLm5vdygpLFxuICAgIGVycm9yXG4gIH0pKTtcbn1cblxuY29uc3QgdGhyb3dXYXJuaW5nID0gKHN0YXRlLCB3YXJuaW5nKSA9PiBzdGF0ZS5zZXQoJ3dhcm5pbmdzJywgc3RhdGUuZ2V0KCd3YXJuaW5ncycpLnB1c2goe1xuICBkYXRlOiBEYXRlLm5vdygpLFxuICB3YXJuaW5nXG59KSk7XG5cbmNvbnN0IGNvcHlQcm9wZXJ0aWVzID0gKHN0YXRlLCBwcm9wZXJ0aWVzKSA9PiBzdGF0ZS5zZXQoJ2NsaXBib2FyZFByb3BlcnRpZXMnLCBwcm9wZXJ0aWVzLnRvSlMoKSk7XG5cbmNvbnN0IHBhc3RlUHJvcGVydGllcyA9IChzdGF0ZSkgPT4gdXBkYXRlUHJvcGVydGllcyhzdGF0ZSwgc3RhdGUuZ2V0KCdjbGlwYm9hcmRQcm9wZXJ0aWVzJykpO1xuXG5jb25zdCBwdXNoTGFzdFNlbGVjdGVkQ2F0YWxvZ0VsZW1lbnRUb0hpc3RvcnkgPSAoIHN0YXRlLCBlbGVtZW50ICkgPT4ge1xuICBsZXQgY3Vyckhpc3RvcnkgPSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRzSGlzdG9yeTtcblxuICBsZXQgcHJldmlvdXNQb3NpdGlvbiA9IGN1cnJIaXN0b3J5LmZpbmRJbmRleCggZWwgPT4gZWwubmFtZSA9PT0gZWxlbWVudC5uYW1lICk7XG4gIGlmKCBwcmV2aW91c1Bvc2l0aW9uICE9PSAtMSApXG4gIHtcbiAgICBjdXJySGlzdG9yeSA9IGN1cnJIaXN0b3J5LnNwbGljZSggcHJldmlvdXNQb3NpdGlvbiwgMSApO1xuICB9XG4gIGN1cnJIaXN0b3J5ID0gY3Vyckhpc3Rvcnkuc3BsaWNlKCAwLCAwLCBlbGVtZW50ICk7XG5cbiAgcmV0dXJuIHN0YXRlLnNldCgnc2VsZWN0ZWRFbGVtZW50c0hpc3RvcnknLCBjdXJySGlzdG9yeSk7XG59O1xuIl19