UNPKG

react-planner-viewer

Version:

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

889 lines (711 loc) 101 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /** lines features **/ exports.addLine = addLine; exports.replaceLineVertex = replaceLineVertex; exports.showHeatMap = showHeatMap; exports.addTooltips = addTooltips; exports.removeLine = removeLine; exports.splitLine = splitLine; exports.addLinesFromPoints = addLinesFromPoints; exports.addLineAvoidingIntersections = addLineAvoidingIntersections; exports.addVertex = addVertex; exports.removeVertex = removeVertex; exports.mergeEqualsVertices = mergeEqualsVertices; exports.select = select; exports.unselect = unselect; exports.setPropertiesOnSelected = setPropertiesOnSelected; exports.updatePropertiesOnSelected = updatePropertiesOnSelected; exports.setAttributesOnSelected = setAttributesOnSelected; exports.unselectAll = unselectAll; exports.addArea = addArea; exports.removeArea = removeArea; exports.detectAndUpdateAreas = detectAndUpdateAreas; exports.addHole = addHole; exports.removeHole = removeHole; exports.addItem = addItem; exports.removeItem = removeItem; var _immutable = require('immutable'); var _models = require('../models'); var _idBroker = require('./id-broker'); var _idBroker2 = _interopRequireDefault(_idBroker); var _nameGenerator = require('./name-generator'); var _nameGenerator2 = _interopRequireDefault(_nameGenerator); var _geometry = require('./geometry'); var Geometry = _interopRequireWildcard(_geometry); var _graphInnerCycles = require('./graph-inner-cycles'); var _graphInnerCycles2 = _interopRequireDefault(_graphInnerCycles); var _color = require('color'); var _color2 = _interopRequireDefault(_color); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _chromaJs = require('chroma-js'); var _chromaJs2 = _interopRequireDefault(_chromaJs); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var flatten = function flatten(list) { return list.reduce(function (a, b) { return a.concat(Array.isArray(b) ? flatten(b) : b); }, []); }; function addLine(layer, type, x0, y0, x1, y1, catalog) { var properties = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; var line = void 0; layer = layer.withMutations(function (layer) { var lineID = _idBroker2.default.acquireID(); var v0 = void 0, v1 = void 0; var _addVertex = addVertex(layer, x0, y0, 'lines', lineID); layer = _addVertex.layer; v0 = _addVertex.vertex; var _addVertex2 = addVertex(layer, x1, y1, 'lines', lineID); layer = _addVertex2.layer; v1 = _addVertex2.vertex; line = catalog.factoryElement(type, { id: lineID, name: _nameGenerator2.default.generateName('lines', catalog.getIn(['elements', type, 'info', 'title'])), vertices: new _immutable.List([v0.id, v1.id]), type: type }, properties); layer.setIn(['lines', lineID], line); }); return { layer: layer, line: line }; } function replaceLineVertex(layer, lineID, vertexIndex, x, y) { var line = layer.getIn(['lines', lineID]); var vertex = void 0; layer = layer.withMutations(function (layer) { return layer.withMutations(function (layer) { var vertexID = line.vertices.get(vertexIndex); unselect(layer, 'vertices', vertexID); removeVertex(layer, vertexID, 'lines', line.id); var _addVertex3 = addVertex(layer, x, y, 'lines', line.id); layer = _addVertex3.layer; vertex = _addVertex3.vertex; line = line.setIn(['vertices', vertexIndex], vertex.id); layer.setIn(['lines', lineID], line); }); }); return { layer: layer, line: line, vertex: vertex }; } function showHeatMap(layer, heatMapValues, colors) { var maxValue = _lodash2.default.chain(heatMapValues).map('value').max().value(); var minValue = _lodash2.default.chain(heatMapValues).map('value').min().value(); if (maxValue === minValue) { minValue = 0; } layer.areas.forEach(function (area) { var foundArea = heatMapValues.find(function (heatMapArea) { return heatMapArea.name === area.getIn(['properties', 'name']); }); var areaID = area.get('id'); if (foundArea !== undefined) { var normalisedValue = foundArea.value - minValue; var normalisedMaxValue = maxValue - minValue; var valuePerOne = normalisedValue / normalisedMaxValue; var scale = _chromaJs2.default.scale(colors); var areaColor = scale(valuePerOne).hex(); layer.setIn(['areas', areaID, 'showHeatMap'], true); layer.setIn(['areas', areaID, 'heatMapText'], foundArea.value); layer.setIn(['areas', areaID, 'heatMapColor'], areaColor); } else { layer.setIn(['areas', areaID, 'showHeatMap'], false); } }); return { layer: layer }; } function addTooltips(layer, tooltips) { layer.areas.forEach(function (area) { var foundTooltip = tooltips.find(function (tooltip) { return tooltip.name === area.getIn(['properties', 'name']); }); var areaID = area.get('id'); if (foundTooltip !== undefined) { layer.setIn(['areas', areaID, 'tooltip'], foundTooltip); } else { layer.setIn(['areas', areaID, 'tooltip'], {}); } }); return { layer: layer }; } function removeLine(layer, lineID) { var line = layer.getIn(['lines', lineID]); layer = layer.withMutations(function (layer) { unselect(layer, 'lines', lineID); line.holes.forEach(function (holeID) { return removeHole(layer, holeID); }); layer.deleteIn(['lines', line.id]); line.vertices.forEach(function (vertexID) { return removeVertex(layer, vertexID, 'lines', line.id); }); }); return { layer: layer, line: line }; } function splitLine(layer, lineID, x, y, catalog) { var line0 = void 0, line1 = void 0; layer = layer.withMutations(function (layer) { var line = layer.getIn(['lines', lineID]); var v0 = layer.vertices.get(line.vertices.get(0)); var v1 = layer.vertices.get(line.vertices.get(1)); var x0 = v0.x, y0 = v0.y; var x1 = v1.x, y1 = v1.y; var _addLine = addLine(layer, line.type, x0, y0, x, y, catalog, line.properties); line0 = _addLine.line; var _addLine2 = addLine(layer, line.type, x1, y1, x, y, catalog, line.properties); line1 = _addLine2.line; var splitPointOffset = Geometry.pointPositionOnLineSegment(x0, y0, x1, y1, x, y); var minVertex = Geometry.minVertex(v0, v1); line.holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var holeOffset = hole.offset; if (minVertex.x === x1 && minVertex.y === y1) { splitPointOffset = 1 - splitPointOffset; holeOffset = 1 - hole.offset; } if (holeOffset < splitPointOffset) { var offset = holeOffset / splitPointOffset; if (minVertex.x === x1 && minVertex.y === y1) { offset = 1 - offset; } addHole(layer, hole.type, line0.id, offset, catalog, hole.properties); } else { var _offset = (holeOffset - splitPointOffset) / (1 - splitPointOffset); if (minVertex.x === x1 && minVertex.y === y1) { _offset = 1 - _offset; } addHole(layer, hole.type, line1.id, _offset, catalog, hole.properties); } }); removeLine(layer, lineID); }); return { layer: layer, lines: new _immutable.List([line0, line1]) }; } function addLinesFromPoints(layer, type, points, catalog, properties, holes) { points = new _immutable.List(points).sort(function (_ref, _ref2) { var x1 = _ref.x, y1 = _ref.y; var x2 = _ref2.x, y2 = _ref2.y; return x1 === x2 ? y1 - y2 : x1 - x2; }); var pointsPair = points.zip(points.skip(1)).filterNot(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), _ref4$ = _ref4[0], x1 = _ref4$.x, y1 = _ref4$.y, _ref4$2 = _ref4[1], x2 = _ref4$2.x, y2 = _ref4$2.y; return x1 === x2 && y1 === y2; }); var lines = new _immutable.List().withMutations(function (lines) { layer = layer.withMutations(function (layer) { pointsPair.forEach(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), _ref6$ = _ref6[0], x1 = _ref6$.x, y1 = _ref6$.y, _ref6$2 = _ref6[1], x2 = _ref6$2.x, y2 = _ref6$2.y; var _addLine3 = addLine(layer, type, x1, y1, x2, y2, catalog, properties), line = _addLine3.line; if (holes) { holes.forEach(function (holeWithOffsetPoint) { var _holeWithOffsetPoint$ = holeWithOffsetPoint.offsetPosition, xp = _holeWithOffsetPoint$.x, yp = _holeWithOffsetPoint$.y; if (Geometry.isPointOnLineSegment(x1, y1, x2, y2, xp, yp)) { var newOffset = Geometry.pointPositionOnLineSegment(x1, y1, x2, y2, xp, yp); if (newOffset >= 0 && newOffset <= 1) { addHole(layer, holeWithOffsetPoint.hole.type, line.id, newOffset, catalog, holeWithOffsetPoint.hole.properties); } } }); } lines.push(line); }); }); }); return { layer: layer, lines: lines }; } function addLineAvoidingIntersections(layer, type, x0, y0, x1, y1, catalog, oldProperties, oldHoles) { var points = [{ x: x0, y: y0 }, { x: x1, y: y1 }]; layer = layer.withMutations(function (layer) { var lines = layer.lines, vertices = layer.vertices; lines.forEach(function (line) { var _line$vertices$map$to = line.vertices.map(function (vertexID) { return vertices.get(vertexID); }).toArray(), _line$vertices$map$to2 = _slicedToArray(_line$vertices$map$to, 2), v0 = _line$vertices$map$to2[0], v1 = _line$vertices$map$to2[1]; var hasCommonEndpoint = Geometry.samePoints(v0, points[0]) || Geometry.samePoints(v0, points[1]) || Geometry.samePoints(v1, points[0]) || Geometry.samePoints(v1, points[1]); var intersection = Geometry.intersectionFromTwoLineSegment(points[0], points[1], v0, v1); if (intersection.type === 'colinear') { if (!oldHoles) { oldHoles = []; } var orderedVertices = Geometry.orderVertices(points); layer.lines.get(line.id).holes.forEach(function (holeID) { var hole = layer.holes.get(holeID); var oldLineLength = Geometry.pointsDistance(v0.x, v0.y, v1.x, v1.y); var alpha = Math.atan2(orderedVertices[1].y - orderedVertices[0].y, orderedVertices[1].x - orderedVertices[0].x); var offset = hole.offset; if (orderedVertices[1].x === line.vertices.get(1).x && orderedVertices[1].y === line.vertices(1).y) { offset = 1 - offset; } var xp = oldLineLength * offset * Math.cos(alpha) + v0.x; var yp = oldLineLength * offset * Math.sin(alpha) + v0.y; oldHoles.push({ hole: hole, offsetPosition: { x: xp, y: yp } }); }); removeLine(layer, line.id); points.push(v0, v1); } if (intersection.type === 'intersecting' && !hasCommonEndpoint) { splitLine(layer, line.id, intersection.point.x, intersection.point.y, catalog); points.push(intersection.point); } }); addLinesFromPoints(layer, type, points, catalog, oldProperties, oldHoles); }); return { layer: layer }; } /** vertices features **/ function addVertex(layer, x, y, relatedPrototype, relatedID) { var vertex = layer.vertices.find(function (vertex) { return Geometry.samePoints(vertex, { x: x, y: y }); }); if (vertex) { vertex = vertex.update(relatedPrototype, function (related) { return related.push(relatedID); }); } else { vertex = new _models.Vertex(_defineProperty({ id: _idBroker2.default.acquireID(), name: 'Vertex', x: x, y: y }, relatedPrototype, new _immutable.List([relatedID]))); } layer = layer.setIn(['vertices', vertex.id], vertex); return { layer: layer, vertex: vertex }; } function removeVertex(layer, vertexID, relatedPrototype, relatedID) { var vertex = layer.vertices.get(vertexID); vertex = vertex.update(relatedPrototype, function (related) { var index = related.findIndex(function (ID) { return relatedID === ID; }); return related.delete(index); }); layer = vertex.areas.size || vertex.lines.size ? layer.setIn(['vertices', vertex.id], vertex) : layer.deleteIn(['vertices', vertex.id]); return { layer: layer, vertex: vertex }; } function mergeEqualsVertices(layer, vertexID) { //1. find vertices to remove var vertex = layer.getIn(['vertices', vertexID]); var doubleVertices = layer.vertices.filter(function (v) { return v.id !== vertexID && Geometry.samePoints(vertex, v); }); if (doubleVertices.isEmpty()) return layer; //2. remove double vertices var vertices = void 0, lines = void 0, areas = void 0; vertices = layer.vertices.withMutations(function (vertices) { lines = layer.lines.withMutations(function (lines) { areas = layer.areas.withMutations(function (areas) { doubleVertices.forEach(function (doubleVertex) { doubleVertex.lines.forEach(function (lineID) { var line = lines.get(lineID); line = line.update('vertices', function (vertices) { return vertices.map(function (v) { return v === doubleVertex.id ? vertexID : v; }); }); lines.set(lineID, line); vertices.updateIn([vertexID, 'lines'], function (l) { return l.push(lineID); }); }); doubleVertex.areas.forEach(function (areaID) { var area = areas.get(areaID); area = area.update('vertices', function (vertices) { return vertices.map(function (v) { return v === doubleVertex.id ? vertexID : v; }); }); areas.set(areaID, area); vertices.updateIn([vertexID, 'areas'], function (area) { return area.push(areaID); }); }); vertices.remove(doubleVertex.id); }); }); }); }); //3. update layer return layer.merge({ vertices: vertices, lines: lines, areas: areas }); } function select(layer, prototype, ID) { return layer.withMutations(function (layer) { layer.setIn([prototype, ID, 'selected'], true); layer.updateIn(['selected', prototype], function (elements) { return elements.push(ID); }); }); } function unselect(layer, prototype, ID) { return layer.withMutations(function (layer) { var ids = layer.getIn(['selected', prototype]); ids = ids.remove(ids.indexOf(ID)); var selected = ids.some(function (key) { return key === ID; }); layer.setIn(['selected', prototype], ids); layer.setIn([prototype, ID, 'selected'], selected); }); } function opSetProperties(layer, prototype, ID, properties) { properties = (0, _immutable.fromJS)(properties); layer.mergeIn([prototype, ID, 'properties'], properties); } function opUpdateProperties(layer, prototype, ID, properties) { (0, _immutable.fromJS)(properties).forEach(function (v, k) { if (layer.hasIn([prototype, ID, 'properties', k])) layer.mergeIn([prototype, ID, 'properties', k], v); }); } function opSetItemsAttributes(layer, prototype, ID, itemsAttributes) { itemsAttributes = (0, _immutable.fromJS)(itemsAttributes); layer.mergeIn([prototype, ID], itemsAttributes); } function opSetLinesAttributes(layer, prototype, ID, linesAttributes, catalog) { var lAttr = linesAttributes.toJS(); var vertexOne = lAttr.vertexOne, vertexTwo = lAttr.vertexTwo, lineLength = lAttr.lineLength; delete lAttr['vertexOne']; delete lAttr['vertexTwo']; delete lAttr['lineLength']; layer = layer.mergeIn([prototype, ID], (0, _immutable.fromJS)(lAttr)) //all the others attributes .mergeIn(['vertices', vertexOne.id], { x: vertexOne.x, y: vertexOne.y }).mergeIn(['vertices', vertexTwo.id], { x: vertexTwo.x, y: vertexTwo.y }).mergeDeepIn([prototype, ID, 'misc'], new _immutable.Map({ '_unitLength': lineLength._unit })); layer = mergeEqualsVertices(layer, vertexOne.id); //check if second vertex has different coordinates than the first if (vertexOne.x != vertexTwo.x && vertexOne.y != vertexTwo.y) layer = mergeEqualsVertices(layer, vertexTwo.id); detectAndUpdateAreas(layer, catalog); } function opSetHolesAttributes(layer, prototype, ID, holesAttributes) { var hAttr = holesAttributes.toJS(); var offsetA = hAttr.offsetA, offsetB = hAttr.offsetB, offset = hAttr.offset; delete hAttr['offsetA']; delete hAttr['offsetB']; delete hAttr['offset']; var misc = new _immutable.Map({ _unitA: offsetA._unit, _unitB: offsetB._unit }); layer.mergeIn([prototype, ID], (0, _immutable.fromJS)(hAttr)) //all the others attributes .mergeDeepIn([prototype, ID], new _immutable.Map({ offset: offset, misc: misc })); } function setPropertiesOnSelected(layer, properties) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opSetProperties(layer, 'lines', lineID, properties); }); selected.holes.forEach(function (holeID) { return opSetProperties(layer, 'holes', holeID, properties); }); selected.areas.forEach(function (areaID) { return opSetProperties(layer, 'areas', areaID, properties); }); selected.items.forEach(function (itemID) { return opSetProperties(layer, 'items', itemID, properties); }); }); } function updatePropertiesOnSelected(layer, properties) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opUpdateProperties(layer, 'lines', lineID, properties); }); selected.holes.forEach(function (holeID) { return opUpdateProperties(layer, 'holes', holeID, properties); }); selected.areas.forEach(function (areaID) { return opUpdateProperties(layer, 'areas', areaID, properties); }); selected.items.forEach(function (itemID) { return opUpdateProperties(layer, 'items', itemID, properties); }); }); } function setAttributesOnSelected(layer, attributes, catalog) { return layer.withMutations(function (layer) { var selected = layer.selected; selected.lines.forEach(function (lineID) { return opSetLinesAttributes(layer, 'lines', lineID, attributes, catalog); }); selected.holes.forEach(function (holeID) { return opSetHolesAttributes(layer, 'holes', holeID, attributes, catalog); }); selected.items.forEach(function (itemID) { return opSetItemsAttributes(layer, 'items', itemID, attributes, catalog); }); //selected.areas.forEach(areaID => opSetItemsAttributes(layer, 'areas', areaID, attributes, catalog)); }); } function unselectAll(layer) { var selected = layer.get('selected'); return layer.withMutations(function (layer) { layer.selected.forEach(function (ids, prototype) { ids.forEach(function (id) { return unselect(layer, prototype, id); }); }); }); } /** areas features **/ function addArea(layer, type, verticesCoords, catalog) { var area = void 0; layer = layer.withMutations(function (layer) { var areaID = _idBroker2.default.acquireID(); var vertices = verticesCoords.map(function (v) { return addVertex(layer, v.x, v.y, 'areas', areaID).vertex.id; }); area = catalog.factoryElement(type, { id: areaID, name: _nameGenerator2.default.generateName('areas', catalog.getIn(['elements', type, 'info', 'title'])), type: type, prototype: 'areas', vertices: vertices }); layer.setIn(['areas', areaID], area); }); return { layer: layer, area: area }; } function removeArea(layer, areaID) { var area = layer.getIn(['areas', areaID]); layer = layer.withMutations(function (layer) { unselect(layer, 'areas', areaID); layer.deleteIn(['areas', area.id]); area.vertices.forEach(function (vertexID) { return removeVertex(layer, vertexID, 'areas', area.id); }); }); return { layer: layer, area: area }; } var sameSet = function sameSet(set1, set2) { return set1.size === set2.size && set1.isSuperset(set2) && set1.isSubset(set2); }; //https://github.com/MartyWallace/PolyK function ContainsPoint(polygon, pointX, pointY) { var n = polygon.length >> 1; var ax = void 0, lup = void 0; var ay = polygon[2 * n - 3] - pointY; var bx = polygon[2 * n - 2] - pointX; var by = polygon[2 * n - 1] - pointY; if (bx === 0 && by === 0) return false; // point on edge // let lup = by > ay; for (var ii = 0; ii < n; ii++) { ax = bx; ay = by; bx = polygon[2 * ii] - pointX; by = polygon[2 * ii + 1] - pointY; if (bx === 0 && by === 0) return false; // point on edge if (ay === by) continue; lup = by > ay; } var depth = 0; for (var i = 0; i < n; i++) { ax = bx; ay = by; bx = polygon[2 * i] - pointX; by = polygon[2 * i + 1] - pointY; if (ay < 0 && by < 0) continue; // both 'up' or both 'down' if (ay > 0 && by > 0) continue; // both 'up' or both 'down' if (ax < 0 && bx < 0) continue; // both points on the left if (ay === by && Math.min(ax, bx) < 0) return true; if (ay === by) continue; var lx = ax + (bx - ax) * -ay / (by - ay); if (lx === 0) return false; // point on edge if (lx > 0) depth++; if (ay === 0 && lup && by > ay) depth--; // hit vertex, both up if (ay === 0 && !lup && by < ay) depth--; // hit vertex, both down lup = by > ay; } return (depth & 1) === 1; } function detectAndUpdateAreas(layer, catalog) { var verticesArray = []; //array with vertices coords var linesArray = void 0; //array with edges var vertexID_to_verticesArrayIndex = {}; var verticesArrayIndex_to_vertexID = {}; layer.vertices.forEach(function (vertex) { var verticesCount = verticesArray.push([vertex.x, vertex.y]); var latestVertexIndex = verticesCount - 1; vertexID_to_verticesArrayIndex[vertex.id] = latestVertexIndex; verticesArrayIndex_to_vertexID[latestVertexIndex] = vertex.id; }); linesArray = layer.lines.map(function (line) { return line.vertices.map(function (vertexID) { return vertexID_to_verticesArrayIndex[vertexID]; }).toArray(); }); var innerCyclesByVerticesArrayIndex = (0, _graphInnerCycles2.default)(verticesArray, linesArray); var innerCyclesByVerticesID = innerCyclesByVerticesArrayIndex.map(function (cycle) { return cycle.map(function (vertexIndex) { return verticesArrayIndex_to_vertexID[vertexIndex]; }); }); // All area vertices should be ordered in counterclockwise order innerCyclesByVerticesID = innerCyclesByVerticesID.map(function (area) { return (0, _graphInnerCycles.isClockWiseOrder)(area.map(function (vertexID) { return layer.vertices.get(vertexID); })) ? area.reverse() : area; }); var areaIDs = []; layer = layer.withMutations(function (layer) { //remove areas layer.areas.forEach(function (area) { var areaInUse = innerCyclesByVerticesID.some(function (vertices) { return sameSet(vertices, area.vertices); }); if (!areaInUse) removeArea(layer, area.id); }); //add new areas innerCyclesByVerticesID.forEach(function (cycle, ind) { var areaInUse = layer.areas.find(function (area) { return sameSet(area.vertices, cycle); }); if (areaInUse) { areaIDs[ind] = areaInUse.id; layer.setIn(['areas', areaIDs[ind], 'holes'], new _immutable.List()); } else { var areaVerticesCoords = cycle.map(function (vertexId) { return layer.vertices.get(vertexId); }); var _addArea = addArea(layer, 'area', areaVerticesCoords, catalog), area = _addArea.area; areaIDs[ind] = area.id; } }); // Build a relationship between areas and their coordinates var verticesCoordsForArea = areaIDs.map(function (id) { var vertices = layer.areas.get(id).vertices.map(function (vertexID) { return layer.vertices.get(vertexID); }); return { id: id, vertices: vertices }; }); // Find all holes for an area var i = void 0, j = void 0; for (i = 0; i < verticesCoordsForArea.length; i++) { var holesList = new _immutable.List(); // The holes for this area var areaVerticesList = verticesCoordsForArea[i].vertices.flatten().toArray(); for (j = 0; j < verticesCoordsForArea.length; j++) { if (i !== j) { var isHole = ContainsPoint(areaVerticesList, verticesCoordsForArea[j].vertices.get(0).get(0), verticesCoordsForArea[j].vertices.get(0).get(1)); if (isHole) { holesList = holesList.push(verticesCoordsForArea[j].id); } } } layer.setIn(['areas', verticesCoordsForArea[i].id, 'holes'], holesList); } // Remove holes which are already holes for other areas areaIDs.forEach(function (areaID) { var doubleHoles = new Set(); var areaHoles = layer.getIn(['areas', areaID, 'holes']); areaHoles.forEach(function (areaHoleID) { var holesOfholes = layer.getIn(['areas', areaHoleID, 'holes']); holesOfholes.forEach(function (holeID) { var holeIndex = areaHoles.indexOf(holeID); if (holeIndex !== -1) { doubleHoles.add(holeID); } }); }); doubleHoles.forEach(function (doubleHoleID) { var holeIndex = areaHoles.indexOf(doubleHoleID); areaHoles = areaHoles.remove(holeIndex); }); layer.setIn(['areas', areaID, 'holes'], areaHoles); }); }); return { layer: layer }; } /** holes features **/ function addHole(layer, type, lineID, offset, catalog) { var properties = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; var hole = void 0; layer = layer.withMutations(function (layer) { var holeID = _idBroker2.default.acquireID(); hole = catalog.factoryElement(type, { id: holeID, name: _nameGenerator2.default.generateName('holes', catalog.getIn(['elements', type, 'info', 'title'])), type: type, offset: offset, line: lineID }, properties); layer.setIn(['holes', holeID], hole); layer.updateIn(['lines', lineID, 'holes'], function (holes) { return holes.push(holeID); }); }); return { layer: layer, hole: hole }; } function removeHole(layer, holeID) { var hole = layer.getIn(['holes', holeID]); layer = layer.withMutations(function (layer) { unselect(layer, 'holes', holeID); layer.deleteIn(['holes', hole.id]); layer.updateIn(['lines', hole.line, 'holes'], function (holes) { var index = holes.findIndex(function (ID) { return holeID === ID; }); return holes.remove(index); }); }); return { layer: layer, hole: hole }; } /** items features **/ function addItem(layer, type, x, y, width, height, rotation, catalog) { var item = void 0; layer = layer.withMutations(function (layer) { var itemID = _idBroker2.default.acquireID(); item = catalog.factoryElement(type, { id: itemID, name: _nameGenerator2.default.generateName('items', catalog.getIn(['elements', type, 'info', 'title'])), type: type, height: height, width: width, x: x, y: y, rotation: rotation }); layer.setIn(['items', itemID], item); }); return { layer: layer, item: item }; } function removeItem(layer, itemID) { var item = layer.getIn(['items', itemID]); layer = layer.withMutations(function (layer) { unselect(layer, 'items', itemID); layer.deleteIn(['items', item.id]); }); return { layer: layer, item: item }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sYXllci1vcGVyYXRpb25zLmpzIl0sIm5hbWVzIjpbImFkZExpbmUiLCJyZXBsYWNlTGluZVZlcnRleCIsInNob3dIZWF0TWFwIiwiYWRkVG9vbHRpcHMiLCJyZW1vdmVMaW5lIiwic3BsaXRMaW5lIiwiYWRkTGluZXNGcm9tUG9pbnRzIiwiYWRkTGluZUF2b2lkaW5nSW50ZXJzZWN0aW9ucyIsImFkZFZlcnRleCIsInJlbW92ZVZlcnRleCIsIm1lcmdlRXF1YWxzVmVydGljZXMiLCJzZWxlY3QiLCJ1bnNlbGVjdCIsInNldFByb3BlcnRpZXNPblNlbGVjdGVkIiwidXBkYXRlUHJvcGVydGllc09uU2VsZWN0ZWQiLCJzZXRBdHRyaWJ1dGVzT25TZWxlY3RlZCIsInVuc2VsZWN0QWxsIiwiYWRkQXJlYSIsInJlbW92ZUFyZWEiLCJkZXRlY3RBbmRVcGRhdGVBcmVhcyIsImFkZEhvbGUiLCJyZW1vdmVIb2xlIiwiYWRkSXRlbSIsInJlbW92ZUl0ZW0iLCJHZW9tZXRyeSIsImZsYXR0ZW4iLCJsaXN0IiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJBcnJheSIsImlzQXJyYXkiLCJsYXllciIsInR5cGUiLCJ4MCIsInkwIiwieDEiLCJ5MSIsImNhdGFsb2ciLCJwcm9wZXJ0aWVzIiwibGluZSIsIndpdGhNdXRhdGlvbnMiLCJsaW5lSUQiLCJhY3F1aXJlSUQiLCJ2MCIsInYxIiwidmVydGV4IiwiZmFjdG9yeUVsZW1lbnQiLCJpZCIsIm5hbWUiLCJnZW5lcmF0ZU5hbWUiLCJnZXRJbiIsInZlcnRpY2VzIiwic2V0SW4iLCJ2ZXJ0ZXhJbmRleCIsIngiLCJ5IiwidmVydGV4SUQiLCJnZXQiLCJoZWF0TWFwVmFsdWVzIiwiY29sb3JzIiwibWF4VmFsdWUiLCJjaGFpbiIsIm1hcCIsIm1heCIsInZhbHVlIiwibWluVmFsdWUiLCJtaW4iLCJhcmVhcyIsImZvckVhY2giLCJmb3VuZEFyZWEiLCJmaW5kIiwiaGVhdE1hcEFyZWEiLCJhcmVhIiwiYXJlYUlEIiwidW5kZWZpbmVkIiwibm9ybWFsaXNlZFZhbHVlIiwibm9ybWFsaXNlZE1heFZhbHVlIiwidmFsdWVQZXJPbmUiLCJzY2FsZSIsImFyZWFDb2xvciIsImhleCIsInRvb2x0aXBzIiwiZm91bmRUb29sdGlwIiwidG9vbHRpcCIsImhvbGVzIiwiaG9sZUlEIiwiZGVsZXRlSW4iLCJsaW5lMCIsImxpbmUxIiwic3BsaXRQb2ludE9mZnNldCIsInBvaW50UG9zaXRpb25PbkxpbmVTZWdtZW50IiwibWluVmVydGV4IiwiaG9sZSIsImhvbGVPZmZzZXQiLCJvZmZzZXQiLCJsaW5lcyIsInBvaW50cyIsInNvcnQiLCJ4MiIsInkyIiwicG9pbnRzUGFpciIsInppcCIsInNraXAiLCJmaWx0ZXJOb3QiLCJob2xlV2l0aE9mZnNldFBvaW50Iiwib2Zmc2V0UG9zaXRpb24iLCJ4cCIsInlwIiwiaXNQb2ludE9uTGluZVNlZ21lbnQiLCJuZXdPZmZzZXQiLCJwdXNoIiwib2xkUHJvcGVydGllcyIsIm9sZEhvbGVzIiwidG9BcnJheSIsImhhc0NvbW1vbkVuZHBvaW50Iiwic2FtZVBvaW50cyIsImludGVyc2VjdGlvbiIsImludGVyc2VjdGlvbkZyb21Ud29MaW5lU2VnbWVudCIsIm9yZGVyZWRWZXJ0aWNlcyIsIm9yZGVyVmVydGljZXMiLCJvbGRMaW5lTGVuZ3RoIiwicG9pbnRzRGlzdGFuY2UiLCJhbHBoYSIsIk1hdGgiLCJhdGFuMiIsImNvcyIsInNpbiIsInBvaW50IiwicmVsYXRlZFByb3RvdHlwZSIsInJlbGF0ZWRJRCIsInVwZGF0ZSIsInJlbGF0ZWQiLCJpbmRleCIsImZpbmRJbmRleCIsIklEIiwiZGVsZXRlIiwic2l6ZSIsImRvdWJsZVZlcnRpY2VzIiwiZmlsdGVyIiwidiIsImlzRW1wdHkiLCJkb3VibGVWZXJ0ZXgiLCJzZXQiLCJ1cGRhdGVJbiIsImwiLCJyZW1vdmUiLCJtZXJnZSIsInByb3RvdHlwZSIsImVsZW1lbnRzIiwiaWRzIiwiaW5kZXhPZiIsInNlbGVjdGVkIiwic29tZSIsImtleSIsIm9wU2V0UHJvcGVydGllcyIsIm1lcmdlSW4iLCJvcFVwZGF0ZVByb3BlcnRpZXMiLCJrIiwiaGFzSW4iLCJvcFNldEl0ZW1zQXR0cmlidXRlcyIsIml0ZW1zQXR0cmlidXRlcyIsIm9wU2V0TGluZXNBdHRyaWJ1dGVzIiwibGluZXNBdHRyaWJ1dGVzIiwibEF0dHIiLCJ0b0pTIiwidmVydGV4T25lIiwidmVydGV4VHdvIiwibGluZUxlbmd0aCIsIm1lcmdlRGVlcEluIiwiX3VuaXQiLCJvcFNldEhvbGVzQXR0cmlidXRlcyIsImhvbGVzQXR0cmlidXRlcyIsImhBdHRyIiwib2Zmc2V0QSIsIm9mZnNldEIiLCJtaXNjIiwiX3VuaXRBIiwiX3VuaXRCIiwiaXRlbXMiLCJpdGVtSUQiLCJhdHRyaWJ1dGVzIiwidmVydGljZXNDb29yZHMiLCJzYW1lU2V0Iiwic2V0MSIsInNldDIiLCJpc1N1cGVyc2V0IiwiaXNTdWJzZXQiLCJDb250YWluc1BvaW50IiwicG9seWdvbiIsInBvaW50WCIsInBvaW50WSIsIm4iLCJsZW5ndGgiLCJheCIsImx1cCIsImF5IiwiYngiLCJieSIsImlpIiwiZGVwdGgiLCJpIiwibHgiLCJ2ZXJ0aWNlc0FycmF5IiwibGluZXNBcnJheSIsInZlcnRleElEX3RvX3ZlcnRpY2VzQXJyYXlJbmRleCIsInZlcnRpY2VzQXJyYXlJbmRleF90b192ZXJ0ZXhJRCIsInZlcnRpY2VzQ291bnQiLCJsYXRlc3RWZXJ0ZXhJbmRleCIsImlubmVyQ3ljbGVzQnlWZXJ0aWNlc0FycmF5SW5kZXgiLCJpbm5lckN5Y2xlc0J5VmVydGljZXNJRCIsImN5Y2xlIiwicmV2ZXJzZSIsImFyZWFJRHMiLCJhcmVhSW5Vc2UiLCJpbmQiLCJhcmVhVmVydGljZXNDb29yZHMiLCJ2ZXJ0ZXhJZCIsInZlcnRpY2VzQ29vcmRzRm9yQXJlYSIsImoiLCJob2xlc0xpc3QiLCJhcmVhVmVydGljZXNMaXN0IiwiaXNIb2xlIiwiZG91YmxlSG9sZXMiLCJTZXQiLCJhcmVhSG9sZXMiLCJhcmVhSG9sZUlEIiwiaG9sZXNPZmhvbGVzIiwiaG9sZUluZGV4IiwiYWRkIiwiZG91YmxlSG9sZUlEIiwid2lkdGgiLCJoZWlnaHQiLCJyb3RhdGlvbiIsIml0ZW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozt5cEJBQUE7OztRQWFnQkEsTyxHQUFBQSxPO1FBdUJBQyxpQixHQUFBQSxpQjtRQWNBQyxXLEdBQUFBLFc7UUF3QkFDLFcsR0FBQUEsVztRQVlBQyxVLEdBQUFBLFU7UUFhQUMsUyxHQUFBQSxTO1FBOENBQyxrQixHQUFBQSxrQjtRQXlDQUMsNEIsR0FBQUEsNEI7UUFnRUFDLFMsR0FBQUEsUztRQW1CQUMsWSxHQUFBQSxZO1FBZUFDLG1CLEdBQUFBLG1CO1FBNkNBQyxNLEdBQUFBLE07UUFRQUMsUSxHQUFBQSxRO1FBa0VBQyx1QixHQUFBQSx1QjtRQVVBQywwQixHQUFBQSwwQjtRQVVBQyx1QixHQUFBQSx1QjtRQVVBQyxXLEdBQUFBLFc7UUFXQUMsTyxHQUFBQSxPO1FBc0JBQyxVLEdBQUFBLFU7UUEyREFDLG9CLEdBQUFBLG9CO1FBbUdBQyxPLEdBQUFBLE87UUFxQkFDLFUsR0FBQUEsVTtRQWVBQyxPLEdBQUFBLE87UUF1QkFDLFUsR0FBQUEsVTs7QUExcUJoQjs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0lBQVlDLFE7O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQSxJQUFNQyxVQUFVLFNBQVZBLE9BQVU7QUFBQSxTQUFRQyxLQUFLQyxNQUFMLENBQVksVUFBQ0MsQ0FBRCxFQUFJQyxDQUFKO0FBQUEsV0FBVUQsRUFBRUUsTUFBRixDQUFTQyxNQUFNQyxPQUFOLENBQWNILENBQWQsSUFBbUJKLFFBQVFJLENBQVIsQ0FBbkIsR0FBZ0NBLENBQXpDLENBQVY7QUFBQSxHQUFaLEVBQW1FLEVBQW5FLENBQVI7QUFBQSxDQUFoQjs7QUFFTyxTQUFTN0IsT0FBVCxDQUFpQmlDLEtBQWpCLEVBQXdCQyxJQUF4QixFQUE4QkMsRUFBOUIsRUFBa0NDLEVBQWxDLEVBQXNDQyxFQUF0QyxFQUEwQ0MsRUFBMUMsRUFBOENDLE9BQTlDLEVBQXdFO0FBQUEsTUFBakJDLFVBQWlCLHVFQUFKLEVBQUk7O0FBQzdFLE1BQUlDLGFBQUo7O0FBRUFSLFVBQVFBLE1BQU1TLGFBQU4sQ0FBb0IsaUJBQVM7QUFDbkMsUUFBSUMsU0FBUyxtQkFBU0MsU0FBVCxFQUFiOztBQUVBLFFBQUlDLFdBQUo7QUFBQSxRQUFRQyxXQUFSOztBQUhtQyxxQkFJWnRDLFVBQVV5QixLQUFWLEVBQWlCRSxFQUFqQixFQUFxQkMsRUFBckIsRUFBeUIsT0FBekIsRUFBa0NPLE1BQWxDLENBSlk7O0FBSWpDVixTQUppQyxjQUlqQ0EsS0FKaUM7QUFJbEJZLE1BSmtCLGNBSTFCRSxNQUowQjs7QUFBQSxzQkFLWnZDLFVBQVV5QixLQUFWLEVBQWlCSSxFQUFqQixFQUFxQkMsRUFBckIsRUFBeUIsT0FBekIsRUFBa0NLLE1BQWxDLENBTFk7O0FBS2pDVixTQUxpQyxlQUtqQ0EsS0FMaUM7QUFLbEJhLE1BTGtCLGVBSzFCQyxNQUwwQjs7O0FBT25DTixXQUFPRixRQUFRUyxjQUFSLENBQXVCZCxJQUF2QixFQUE2QjtBQUNsQ2UsVUFBSU4sTUFEOEI7QUFFbENPLFlBQU0sd0JBQWNDLFlBQWQsQ0FBMkIsT0FBM0IsRUFBb0NaLFFBQVFhLEtBQVIsQ0FBYyxDQUFDLFVBQUQsRUFBYWxCLElBQWIsRUFBbUIsTUFBbkIsRUFBMkIsT0FBM0IsQ0FBZCxDQUFwQyxDQUY0QjtBQUdsQ21CLGdCQUFVLG9CQUFTLENBQUNSLEdBQUdJLEVBQUosRUFBUUgsR0FBR0csRUFBWCxDQUFULENBSHdCO0FBSWxDZjtBQUprQyxLQUE3QixFQUtKTSxVQUxJLENBQVA7O0FBT0FQLFVBQU1xQixLQUFOLENBQVksQ0FBQyxPQUFELEVBQVVYLE1BQVYsQ0FBWixFQUErQkYsSUFBL0I7QUFDRCxHQWZPLENBQVI7O0FBaUJBLFNBQU8sRUFBQ1IsWUFBRCxFQUFRUSxVQUFSLEVBQVA7QUFDRDs7QUFFTSxTQUFTeEMsaUJBQVQsQ0FBMkJnQyxLQUEzQixFQUFrQ1UsTUFBbEMsRUFBMENZLFdBQTFDLEVBQXVEQyxDQUF2RCxFQUEwREMsQ0FBMUQsRUFBNkQ7QUFDbEUsTUFBSWhCLE9BQU9SLE1BQU1tQixLQUFOLENBQVksQ0FBQyxPQUFELEVBQVVULE1BQVYsQ0FBWixDQUFYO0FBQ0EsTUFBSUksZUFBSjs7QUFFQWQsVUFBUUEsTUFBTVMsYUFBTixDQUFvQjtBQUFBLFdBQVNULE1BQU1TLGFBQU4sQ0FBb0IsaUJBQVM7QUFDaEUsVUFBSWdCLFdBQVdqQixLQUFLWSxRQUFMLENBQWNNLEdBQWQsQ0FBa0JKLFdBQWxCLENBQWY7QUFDQTNDLGVBQVNxQixLQUFULEVBQWdCLFVBQWhCLEVBQTRCeUIsUUFBNUI7QUFDQWpELG1CQUFhd0IsS0FBYixFQUFvQnlCLFFBQXBCLEVBQThCLE9BQTlCLEVBQXVDakIsS0FBS1EsRUFBNUM7O0FBSGdFLHdCQUk3Q3pDLFVBQVV5QixLQUFWLEVBQWlCdUIsQ0FBakIsRUFBb0JDLENBQXBCLEVBQXVCLE9BQXZCLEVBQWdDaEIsS0FBS1EsRUFBckMsQ0FKNkM7O0FBSTlEaEIsV0FKOEQsZUFJOURBLEtBSjhEO0FBSXZEYyxZQUp1RCxlQUl2REEsTUFKdUQ7O0FBS2hFTixhQUFPQSxLQUFLYSxLQUFMLENBQVcsQ0FBQyxVQUFELEVBQWFDLFdBQWIsQ0FBWCxFQUFzQ1IsT0FBT0UsRUFBN0MsQ0FBUDtBQUNBaEIsWUFBTXFCLEtBQU4sQ0FBWSxDQUFDLE9BQUQsRUFBVVgsTUFBVixDQUFaLEVBQStCRixJQUEvQjtBQUNELEtBUG9DLENBQVQ7QUFBQSxHQUFwQixDQUFSO0FBUUEsU0FBTyxFQUFDUixZQUFELEVBQVFRLFVBQVIsRUFBY00sY0FBZCxFQUFQO0FBQ0Q7QUFDTSxTQUFTN0MsV0FBVCxDQUFxQitCLEtBQXJCLEVBQTRCMkIsYUFBNUIsRUFBMkNDLE1BQTNDLEVBQW1EO0FBQ3hELE1BQU1DLFdBQVcsaUJBQUVDLEtBQUYsQ0FBUUgsYUFBUixFQUF1QkksR0FBdkIsQ0FBMkIsT0FBM0IsRUFBb0NDLEdBQXBDLEdBQTBDQyxLQUExQyxFQUFqQjtBQUNBLE1BQUlDLFdBQVcsaUJBQUVKLEtBQUYsQ0FBUUgsYUFBUixFQUF1QkksR0FBdkIsQ0FBMkIsT0FBM0IsRUFBb0NJLEdBQXBDLEdBQTBDRixLQUExQyxFQUFmO0FBQ0EsTUFBR0osYUFBYUssUUFBaEIsRUFBeUI7QUFBQ0EsZUFBVyxDQUFYO0FBQWE7QUFDdkNsQyxRQUFNb0MsS0FBTixDQUFZQyxPQUFaLENBQW9CLGdCQUFRO0FBQzFCLFFBQU1DLFlBQVlYLGNBQWNZLElBQWQsQ0FBbUI7QUFBQSxhQUFlQyxZQUFZdkIsSUFBWixLQUFxQndCLEtBQUt0QixLQUFMLENBQVcsQ0FBQyxZQUFELEVBQWMsTUFBZCxDQUFYLENBQXBDO0FBQUEsS0FBbkIsQ0FBbEI7QUFDQSxRQUFNdUIsU0FBU0QsS0FBS2YsR0FBTCxDQUFTLElBQVQsQ0FBZjtBQUNBLFFBQUdZLGNBQWNLLFNBQWpCLEVBQTJCO0FBQ3pCLFVBQU1DLGtCQUFrQk4sVUFBVUwsS0FBVixHQUFrQkMsUUFBMUM7QUFDQSxVQUFNVyxxQkFBcUJoQixXQUFXSyxRQUF0QztBQUNBLFVBQU1ZLGNBQWNGLGtCQUFnQkMsa0JBQXBDO0FBQ0EsVUFBTUUsUUFBUSxtQkFBT0EsS0FBUCxDQUFhbkIsTUFBYixDQUFkO0FBQ0EsVUFBTW9CLFlBQVlELE1BQU1ELFdBQU4sRUFBbUJHLEdBQW5CLEVBQWxCOztBQUVBakQsWUFBTXFCLEtBQU4sQ0FBWSxDQUFDLE9BQUQsRUFBVXFCLE1BQVYsRUFBa0IsYUFBbEIsQ0FBWixFQUE4QyxJQUE5QztBQUNBMUMsWUFBTXFCLEtBQU4sQ0FBWSxDQUFDLE9BQUQsRUFBVXFCLE1BQVYsRUFBa0IsYUFBbEIsQ0FBWixFQUE4Q0osVUFBVUwsS0FBeEQ7QUFDQWpDLFlBQU1xQixLQUFOLENBQVksQ0FBQyxPQUFELEVBQVVxQixNQUFWLEVBQWtCLGNBQWxCLENBQVosRUFBK0NNLFNBQS9DO0FBQ0QsS0FWRCxNQVVNO0FBQ0poRCxZQUFNcUIsS0FBTixDQUFZLENBQUMsT0FBRCxFQUFVcUIsTUFBVixFQUFrQixhQUFsQixDQUFaLEVBQThDLEtBQTlDO0FBQ0Q7QUFDRixHQWhCRDtBQWlCQSxTQUFPLEVBQUMxQyxZQUFELEVBQVA7QUFDRDs7QUFFTSxTQUFTOUIsV0FBVCxDQUFxQjhCLEtBQXJCLEVBQTRCa0QsUUFBNUIsRUFBc0M7QUFDM0NsRCxRQUFNb0MsS0FBTixDQUFZQyxPQUFaLENBQW9CLGdCQUFRO0FBQzFCLFFBQU1jLGVBQWVELFNBQVNYLElBQVQsQ0FBYztBQUFBLGFBQVdhLFFBQVFuQyxJQUFSLEtBQWlCd0IsS0FBS3RCLEtBQUwsQ0FBVyxDQUFDLFlBQUQsRUFBYyxNQUFkLENBQVgsQ0FBNUI7QUFBQSxLQUFkLENBQXJCO0FBQ0EsUUFBTXVCLFNBQVNELEtBQUtmLEdBQUwsQ0FBUyxJQUFULENBQWY7QUFDQSxRQUFHeUIsaUJBQWlCUixTQUFwQixFQUErQjtBQUM3QjNDLFlBQU1xQixLQUFOLENBQVksQ0FBQyxPQUFELEVBQVVxQixNQUFWLEVBQWtCLFNBQWxCLENBQVosRUFBMENTLFlBQTFDO0FBQ0QsS0FGRCxNQUVNO0FBQ0puRCxZQUFNcUIsS0FBTixDQUFZLENBQUMsT0FBRCxFQUFVcUIsTUFBVixFQUFrQixTQUFsQixDQUFaLEVBQTBDLEVBQTFDO0FBQ0Q7QUFDRixHQVJEO0FBU0EsU0FBTyxFQUFDMUMsWUFBRCxFQUFQO0FBQ0Q7QUFDTSxTQUFTN0IsVUFBVCxDQUFvQjZCLEtBQXBCLEVBQTJCVSxNQUEzQixFQUFtQztBQUN4QyxNQUFJRixPQUFPUixNQUFNbUIsS0FBTixDQUFZLENBQUMsT0FBRCxFQUFVVCxNQUFWLENBQVosQ0FBWDs7QUFFQVYsVUFBUUEsTUFBTVMsYUFBTixDQUFvQixpQkFBUztBQUNuQzlCLGFBQVNxQixLQUFULEVBQWdCLE9BQWhCLEVBQXlCVSxNQUF6QjtBQUNBRixTQUFLNkMsS0FBTCxDQUFXaEIsT0FBWCxDQUFtQjtBQUFBLGFBQVVqRCxXQUFXWSxLQUFYLEVBQWtCc0QsTUFBbEIsQ0FBVjtBQUFBLEtBQW5CO0FBQ0F0RCxVQUFNdUQsUUFBTixDQUFlLENBQUMsT0FBRCxFQUFVL0MsS0FBS1EsRUFBZixDQUFmO0FBQ0FSLFNBQUtZLFFBQUwsQ0FBY2lCLE9BQWQsQ0FBc0I7QUFBQSxhQUFZN0QsYUFBYXdCLEtBQWIsRUFBb0J5QixRQUFwQixFQUE4QixPQUE5QixFQUF1Q2pCLEtBQUtRLEVBQTVDLENBQVo7QUFBQSxLQUF0QjtBQUNELEdBTE8sQ0FBUjs7QUFPQSxTQUFPLEVBQUNoQixZQUFELEVBQVFRLFVBQVIsRUFBUDtBQUNEOztBQUVNLFNBQVNwQyxTQUFULENBQW1CNEIsS0FBbkIsRUFBMEJVLE1BQTFCLEVBQWtDYSxDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0NsQixPQUF4QyxFQUFpRDtBQUN0RCxNQUFJa0QsY0FBSjtBQUFBLE1BQVdDLGNBQVg7O0FBRUF6RCxVQUFRQSxNQUFNUyxhQUFOLENBQW9CLGlCQUFTO0FBQ25DLFFBQUlELE9BQU9SLE1BQU1tQixLQUFOLENBQVksQ0FBQyxPQUFELEVBQVVULE1BQVYsQ0FBWixDQUFYO0FBQ0EsUUFBSUUsS0FBS1osTUFBTW9CLFFBQU4sQ0FBZU0sR0FBZixDQUFtQmxCLEtBQUtZLFFBQUwsQ0FBY00sR0FBZCxDQUFrQixDQUFsQixDQUFuQixDQUFUO0FBQ0EsUUFBSWIsS0FBS2IsTUFBTW9CLFFBQU4sQ0FBZU0sR0FBZixDQUFtQmxCLEtBQUtZLFFBQUwsQ0FBY00sR0FBZCxDQUFrQixDQUFsQixDQUFuQixDQUFUO0FBSG1DLFFBSTNCeEIsRUFKMkIsR0FJZFUsRUFKYyxDQUk5QlcsQ0FKOEI7QUFBQSxRQUlwQnBCLEVBSm9CLEdBSWRTLEVBSmMsQ0FJdkJZLENBSnVCO0FBQUEsUUFLM0JwQixFQUwyQixHQUtkUyxFQUxjLENBSzlCVSxDQUw4QjtBQUFBLFFBS3BCbEIsRUFMb0IsR0FLZFEsRUFMYyxDQUt2QlcsQ0FMdUI7O0FBQUEsbUJBT2xCekQsUUFBUWlDLEtBQVIsRUFBZVEsS0FBS1AsSUFBcEIsRUFBMEJDLEVBQTFCLEVBQThCQyxFQUE5QixFQUFrQ29CLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3Q2xCLE9BQXhDLEVBQWlERSxLQUFLRCxVQUF0RCxDQVBrQjs7QUFPM0JpRCxTQVAyQixZQU9qQ2hELElBUGlDOztBQUFBLG9CQVFsQnpDLFFBQVFpQyxLQUFSLEVBQWVRLEtBQUtQLElBQXBCLEVBQTBCRyxFQUExQixFQUE4QkMsRUFBOUIsRUFBa0NrQixDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0NsQixPQUF4QyxFQUFpREUsS0FBS0QsVUFBdEQsQ0FSa0I7O0FBUTNCa0QsU0FSMkIsYUFRakNqRCxJQVJpQzs7O0FBVW5DLFFBQUlrRCxtQkFBbUJuRSxTQUFTb0UsMEJBQVQsQ0FBb0N6RCxFQUFwQyxFQUF3Q0MsRUFBeEMsRUFBNENDLEVBQTVDLEVBQWdEQyxFQUFoRCxFQUFvRGtCLENBQXBELEVBQXVEQyxDQUF2RCxDQUF2QjtBQUNBLFFBQUlvQyxZQUFZckUsU0FBU3FFLFNBQVQsQ0FBbUJoRCxFQUFuQixFQUF1QkMsRUFBdkIsQ0FBaEI7O0FBRUFMLFNBQUs2QyxLQUFMLENBQVdoQixPQUFYLENBQW1CLGtCQUFVO0FBQzNCLFVBQUl3QixPQUFPN0QsTUFBTXFELEtBQU4sQ0FBWTNCLEdBQVosQ0FBZ0I0QixNQUFoQixDQUFYOztBQUVBLFVBQUlRLGFBQWFELEtBQUtFLE1BQXRCO0FBQ0EsVUFBSUgsVUFBVXJDLENBQVYsS0FBZ0JuQixFQUFoQixJQUFzQndELFVBQVVwQyxDQUFWLEtBQWdCbkIsRUFBMUMsRUFBOEM7QUFDNUNxRCwyQkFBbUIsSUFBSUEsZ0JBQXZCO0FBQ0FJLHFCQUFhLElBQUlELEtBQUtFLE1BQXRCO0FBQ0Q7O0FBRUQsVUFBSUQsYUFBYUosZ0JBQWpCLEVBQW1DO0FBQ2pDLFlBQUlLLFNBQVNELGFBQWFKLGdCQUExQjtBQUNBLFlBQUlFLFVBQVVyQyxDQUFWLEtBQWdCbkIsRUFBaEIsSUFBc0J3RCxVQUFVcEMsQ0FBVixLQUFnQm5CLEVBQTFDLEVBQThDO0FBQzVDMEQsbUJBQVMsSUFBSUEsTUFBYjtBQUNEO0FBQ0Q1RSxnQkFBUWEsS0FBUixFQUFlNkQsS0FBSzVELElBQXBCLEVBQTBCdUQsTUFBTXhDLEVBQWhDLEVBQW9DK0MsTUFBcEMsRUFBNEN6RCxPQUE1QyxFQUFxRHVELEtBQUt0RCxVQUExRDtBQUNELE9BTkQsTUFNTztBQUNMLFlBQUl3RCxVQUFTLENBQUNELGFBQWFKLGdCQUFkLEtBQW1DLElBQUlBLGdCQUF2QyxDQUFiO0FBQ0EsWUFBSUUsVUFBVXJDLENBQVYsS0FBZ0JuQixFQUFoQixJQUFzQndELFVBQVVwQyxDQUFWLEtBQWdCbkIsRUFBMUMsRUFBOEM7QUFDNUMwRCxvQkFBUyxJQUFJQSxPQUFiO0FBQ0Q7QUFDRDVFLGdCQUFRYSxLQUFSLEVBQWU2RCxLQUFLNUQsSUFBcEIsRUFBMEJ3RCxNQUFNekMsRUFBaEMsRUFBb0MrQyxPQUFwQyxFQUE0Q3pELE9BQTVDLEVBQXFEdUQsS0FBS3RELFVBQTFEO0FBQ0Q7QUFDRixLQXRCRDs7QUF3QkFwQyxlQUFXNkIsS0FBWCxFQUFrQlUsTUFBbEI7QUFDRCxHQXRDTyxDQUFSOztBQXdDQSxTQUFPLEVBQUNWLFlBQUQsRUFBUWdFLE9BQU8sb0JBQVMsQ0FBQ1IsS0FBRCxFQUFRQyxLQUFSLENBQVQsQ0FBZixFQUFQO0FBQ0Q7O0FBRU0sU0FBU3BGLGtCQUFULENBQTRCMkIsS0FBNUIsRUFBbUNDLElBQW5DLEVBQXlDZ0UsTUFBekMsRUFBaUQzRCxPQUFqRCxFQUEwREMsVUFBMUQsRUFBc0U4QyxLQUF0RSxFQUE2RTtBQUNsRlksV0FBUyxvQkFBU0EsTUFBVCxFQUNOQyxJQURNLENBQ0QsdUJBQW9DO0FBQUEsUUFBL0I5RCxFQUErQixRQUFsQ21CLENBQWtDO0FBQUEsUUFBeEJsQixFQUF3QixRQUEzQm1CLENBQTJCO0FBQUEsUUFBZjJDLEVBQWUsU0FBbEI1QyxDQUFrQjtBQUFBLFFBQVI2QyxFQUFRLFNBQVg1QyxDQUFXOztBQUN4QyxXQUFPcEIsT0FBTytELEVBQVAsR0FBWTlELEtBQUsrRCxFQUFqQixHQUFzQmhFLEtBQUsrRCxFQUFsQztBQUNELEdBSE0sQ0FBVDs7QUFLQSxNQUFJRSxhQUFhSixPQUFPSyxHQUFQLENBQVdMLE9BQU9NLElBQVAsQ0FBWSxDQUFaLENBQVgsRUFDZEMsU0FEYyxDQUNKLGlCQUFzQztBQUFBO0FBQUE7QUFBQSxRQUFoQ3BFLEVBQWdDLFVBQW5DbUIsQ0FBbUM7QUFBQSxRQUF6QmxCLEVBQXlCLFVBQTVCbUIsQ0FBNEI7QUFBQTtBQUFBLFFBQWhCMkMsRUFBZ0IsV0FBbkI1QyxDQUFtQjtBQUFBLFFBQVQ2QyxFQUFTLFdBQVo1QyxDQUFZOztBQUMvQyxXQUFPcEIsT0FBTytELEVBQVAsSUFBYTlELE9BQU8rRCxFQUEzQjtBQUNELEdBSGMsQ0FBakI7O0FBS0EsTUFBSUosUUFBUyxxQkFBRCxDQUFhdkQsYUFBYixDQUEyQixpQkFBUztBQUM5Q1QsWUFBUUEsTUFBTVMsYUFBTixDQUFvQixpQkFBUztBQUNuQzRELGlCQUFXaEMsT0FBWCxDQUFtQixpQkFBc0M7QUFBQTtBQUFBO0FBQUEsWUFBaENqQyxFQUFnQyxVQUFuQ21CLENBQW1DO0FBQUEsWUFBekJsQixFQUF5QixVQUE1Qm1CLENBQTRCO0FBQUE7QUFBQSxZQUFoQjJDLEVBQWdCLFdBQW5CNUMsQ0FBbUI7QUFBQSxZQUFUNkMsRUFBUyxXQUFaNUMsQ0FBWTs7QUFBQSx3QkFDMUN6RCxRQUFRaUMsS0FBUixFQUFlQyxJQUFmLEVBQXFCRyxFQUFyQixFQUF5QkMsRUFBekIsRUFBNkI4RCxFQUE3QixFQUFpQ0MsRUFBakMsRUFBcUM5RCxPQUFyQyxFQUE4Q0MsVUFBOUMsQ0FEMEM7QUFBQSxZQUNsREMsSUFEa0QsYUFDbERBLElBRGtEOztBQUV2RCxZQUFJNkMsS0FBSixFQUFXO0FBQ1RBLGdCQUFNaEIsT0FBTixDQUFjLCtCQUF1QjtBQUFBLHdDQUVkb0Msb0JBQW9CQyxjQUZOO0FBQUEsZ0JBRTNCQyxFQUYyQix5QkFFOUJwRCxDQUY4QjtBQUFBLGdCQUVwQnFELEVBRm9CLHlCQUV2QnBELENBRnVCOzs7QUFJbkMsZ0JBQUlqQyxTQUFTc0Ysb0JBQVQsQ0FBOEJ6RSxFQUE5QixFQUFrQ0MsRUFBbEMsRUFBc0M4RCxFQUF0QyxFQUEwQ0MsRUFBMUMsRUFBOENPLEVBQTlDLEVBQWtEQyxFQUFsRCxDQUFKLEVBQTJEOztBQUV6RCxrQkFBSUUsWUFBWXZGLFNBQVNvRSwwQkFBVCxDQUFvQ3ZELEVBQXBDLEVBQXdDQyxFQUF4QyxFQUE0QzhELEVBQTVDLEVBQWdEQyxFQUFoRCxFQUFvRE8sRUFBcEQsRUFBd0RDLEVBQXhELENBQWhCOztBQUVBLGtCQUFJRSxhQUFhLENBQWIsSUFBa0JBLGFBQWEsQ0FBbkMsRUFBc0M7O0FBRXBDM0Ysd0JBQVFhLEtBQVIsRUFBZXlFLG9CQUFvQlosSUFBcEIsQ0FBeUI1RCxJQUF4QyxFQUE4Q08sS0FBS1EsRUFBbkQsRUFBdUQ4RCxTQUF2RCxFQUFrRXhFLE9BQWxFLEVBQ0VtRSxvQkFBb0JaLElBQXBCLENBQXlCdEQsVUFEM0I7QUFFRDtBQUNGO0FBQ0YsV0FkRDtBQWVEOztBQUVEeUQsY0FBTWUsSUFBTixDQUFXdkUsSUFBWDtBQUNELE9BckJEO0FBc0JELEtBdkJPLENBQVI7QUF3QkQsR0F6QlcsQ0FBWjs7QUEyQkEsU0FBTyxFQUFDUixZQUFELEVBQVFnRSxZQUFSLEVBQVA7QUFDRDs7QUFFTSxTQUFTMUYsNEJBQVQsQ0FBc0MwQixLQUF0QyxFQUE2Q0MsSUFBN0MsRUFBbURDLEVBQW5ELEVBQXVEQyxFQUF2RCxFQUEyREMsRUFBM0QsRUFBK0RDLEVBQS9ELEVBQW1FQyxPQUFuRSxFQUE0RTBFLGFBQTVFLEVBQTJGQyxRQUEzRixFQUFxRzs7QUFFMUcsTUFBSWhCLFNBQVMsQ0FBQyxFQUFDMUMsR0FBR3JCLEVBQUosRUFBUXNCLEdBQUdyQixFQUFYLEVBQUQsRUFBaUIsRUFBQ29CLEdBQUduQixFQUFKLEVBQVFvQixHQUFHbkIsRUFBWCxFQUFqQixDQUFiOztBQUVBTCxVQUFRQSxNQUFNUyxhQUFOLENBQW9CLGlCQUFTO0FBQUEsUUFDOUJ1RCxLQUQ4QixHQUNYaEUsS0FEVyxDQUM5QmdFLEtBRDhCO0FBQUEsUUFDdkI1QyxRQUR1QixHQUNYcEIsS0FEVyxDQUN2Qm9CLFFBRHVCOztBQUVuQzRDLFVBQU0zQixPQUFOLENBQWMsZ0JBQVE7QUFBQSxrQ0FDTDdCLEtBQUtZLFFBQUwsQ0FBY1csR0FBZCxDQUFrQjtBQUFBLGVBQVlYLFNBQVNNLEdBQVQsQ0FBYUQsUUFBYixDQUFaO0FBQUEsT0FBbEIsRUFBc0R5RCxPQUF0RCxFQURLO0FBQUE7QUFBQSxVQUNmdEUsRUFEZTtBQUFBLFVBQ1hDLEVBRFc7O0FBR3BCLFVBQUlzRSxvQkFDRDVGLFNBQVM2RixVQUFULENBQW9CeEUsRUFBcEIsRUFBd0JxRCxPQUFPLENBQVAsQ0FBeEIsS0FDSTFFLFNBQVM2RixVQUFULENBQW9CeEUsRUFBcEIsRUFBd0JxRCxPQUFPLENBQVAsQ0FBeEIsQ0FESixJQUVJMUUsU0FBUzZGLFVBQVQsQ0FBb0J2RSxFQUFwQixFQUF3Qm9ELE9BQU8sQ0FBUCxDQUF4QixDQUZKLElBR0kxRSxTQUFTNkYsVUFBVCxDQUFvQnZFLEVBQXBCLEVBQXdCb0QsT0FBTyxDQUFQLENBQXhCLENBSlA7O0FBT0EsVUFBSW9CLGVBQWU5RixTQUFTK0YsOEJBQVQsQ0FDakJyQixPQUFPLENBQVAsQ0FEaUIsRUFDTkEsT0FBTyxDQUFQLENBRE0sRUFDS3JELEVBREwsRUFDU0MsRUFEVCxDQUFuQjs7QUFJQSxVQUFJd0UsYUFBYXBGLElBQWIsS0FBc0IsVUFBMUIsRUFBc0M7QUFDcEMsWUFBSSxDQUFDZ0YsUUFBTCxFQUFlO0FBQ2JBLHFCQUFXLEVBQVg7QUFDRDs7QUFFRCxZQUFJTSxrQkFBa0JoRyxTQUFTaUcsYUFBVCxDQUF1QnZCLE1BQXZCLENBQXRCOztBQUVBakUsY0FBTWdFLEtBQU4sQ0FBWXRDLEdBQVosQ0FBZ0JsQixLQUFLUSxFQUFyQixFQUF5QnFDLEtBQXpCLENBQStCaEIsT0FBL0IsQ0FBdUMsa0JBQVU7QUFDL0MsY0FBSXdCLE9BQU83RCxNQUFNcUQsS0FBTixDQUFZM0IsR0FBWixDQUFnQjRCLE1BQWhCLENBQVg7QUFDQSxjQUFJbUMsZ0JBQWdCbEcsU0FBU21HLGNBQVQsQ0FBd0I5RSxHQUFHVyxDQUEzQixFQUE4QlgsR0FBR1ksQ0FBakMsRUFBb0NYLEdBQUdVLENBQXZDLEVBQTBDVixHQUFHVyxDQUE3QyxDQUFwQjs7QUFFQSxjQUFJbUUsUUFBUUMsS0FBS0MsS0FBTCxDQUFXTixnQkFBZ0IsQ0FBaEIsRUFBbUIvRCxDQUFuQixHQUF1QitELGdCQUFnQixDQUFoQixFQUFtQi9ELENBQXJELEVBQ1YrRCxnQkFBZ0IsQ0FBaEIsRUFBbUJoRSxDQUFuQixHQUF1QmdFLGdCQUFnQixDQUFoQixFQUFtQmhFLENBRGhDLENBQVo7O0FBR0EsY0FBSXdDLFNBQVNGLEtBQUtFLE1BQWxCOztBQUVBLGNBQUl3QixnQkFBZ0IsQ0FBaEIsRUFBbUJoRSxDQUFuQixLQUF5QmYsS0FBS1ksUUFBTCxDQUFjTSxHQUFkLENBQWtCLENBQWxCLEVBQXFCSCxDQUE5QyxJQUNDZ0UsZ0JBQWdCLENBQWhCLEVBQW1CL0QsQ0FBbkIsS0FBeUJoQixLQUFLWSxRQUFMLENBQWMsQ0FBZCxFQUFpQkksQ0FEL0MsRUFDa0Q7QUFDaER1QyxxQkFBUyxJQUFJQSxNQUFiO0FBQ0Q7O0FBRUQsY0FBSVksS0FBS2MsZ0JBQWdCMUIsTUFBaEIsR0FBeUI2QixLQUFLRSxHQUFMLENBQVNILEtBQVQsQ0FBekIsR0FBMkMvRSxHQUFHVyxDQUF2RDtBQUNBLGNBQUlxRCxLQUFLYSxnQkFBZ0IxQixNQUFoQixHQUF5QjZCLEtBQUtHLEdBQUwsQ0FBU0osS0FBVCxDQUF6QixHQUEyQy9FLEdBQUdZLENBQXZEOztBQUVBeUQsbUJBQVNGLElBQVQsQ0FBYyxFQUFDbEIsVUFBRCxFQUFPYSxnQkFBZ0IsRUFBQ25ELEdBQUdvRCxFQUFKLEVBQVFuRCxHQUFHb0QsRUFBWCxFQUF2QixFQUFkO0FBQ0QsU0FsQkQ7O0FBb0JBekcsbUJBQVc2QixLQUFYLEVBQWtCUSxLQUFLUSxFQUF2QjtBQUNBaUQsZUFBT2MsSUFBUCxDQUFZbkUsRUFBWixFQUFnQkMsRUFBaEI7QUFDRDs7QUFFRCxVQUFJd0UsYUFBYXBGLElBQWIsS0FBc0IsY0FBdEIsSUFBeUMsQ0FBQ2tGLGlCQUE5QyxFQUFrRTtBQUNoRS9HLGtCQUFVNEIsS0FBVixFQUFpQlEsS0FBS1EsRUFBdEIsRUFBMEJxRSxhQUFhVyxLQUFiLENBQW1CekUsQ0FBN0MsRUFBZ0Q4RCxhQUFhVyxLQUFiLENBQW1CeEUsQ0FBbkUsRUFBc0VsQixPQUF0RTtBQUNBMkQsZUFBT2MsSUFBUCxDQUFZTSxhQUFhVyxLQUF6QjtBQUNEO0FBRUYsS0FsREQ7QUFtREEzSCx1QkFBbUIyQixLQUFuQixFQUEwQkMsSUFBMUIsRUFBZ0NnRSxNQUFoQyxFQUF3QzNELE9BQXhDLEVBQWlEMEUsYUFBakQsRUFBZ0VDLFFBQWhFO0FBQ0QsR0F0RE8sQ0FBUjs7QUF3REEsU0FBTyxFQUFDakYsWUFBRCxFQUFQO0FBQ0Q7O0FBRUQ7QUFDTyxTQUFTekIsU0FBVCxDQUFtQnlCLEtBQW5CLEVBQTBCdUIsQ0FBMUIsRUFBNkJDLENBQTdCLEVBQWdDeUUsZ0JBQWhDLEVBQWtEQyxTQUFsRCxFQUE2RDtBQUNsRSxNQUFJcEYsU0FBU2QsTUFBTW9CLFFBQU4sQ0FBZW1CLElBQWYsQ0FBb0I7QUFBQSxXQUFVaEQsU0FBUzZGLFVBQVQsQ0FBb0J0RSxNQUFwQixFQUE0QixFQUFDUyxJQUFELEVBQUlDLElBQUosRUFBNUIsQ0FBVjtBQUFBLEdBQXBCLENBQWI7O0FBRUEsTUFBSVYsTUFBSixFQUFZO0FBQ1ZBLGFBQVNBLE9BQU9xRixNQUFQLENBQWNGLGdCQUFkLEVBQWdDO0FBQUEsYUFBV0csUUFBUXJCLElBQVIsQ0FBYW1CLFNBQWIsQ0FBWDtBQUFBLEtBQWhDLENBQVQ7QUFDRCxHQUZELE1BR0s7QUFDSHBGLGFBQVM7QUFDUEUsVUFBSSxtQkFBU0wsU0FBVCxFQURHO0FBRVBNLFlBQU0sUUFGQztBQUdQTSxVQUhPLEVBR0pDO0FBSEksT0FJTnlFLGdCQUpNLEVBSWEsb0JBQVMsQ0FBQ0MsU0FBRCxDQUFULENBSmIsRUFBVDtBQU1EOztBQUVEbEcsVUFBUUEsTUFBTXFCLEtBQU4sQ0FBWSxDQUFDLFVBQUQsRUFBYVAsT0FBT0UsRUFBcEIsQ0FBWixFQUFxQ0YsTUFBckMsQ0FBUjtBQUNBLFNBQU8sRUFBQ2QsWUFBRCxFQUFRYyxjQUFSLEVBQVA7QUFDRDs7QUFFTSxTQUFTdEMsWUFBVCxDQUFzQndCLEtBQXRCLEVBQTZCeUIsUUFBN0IsRUFBdUN3RSxnQkFBdkMsRUFBeURDLFNBQXpELEVBQW9FO0FBQ3pFLE1BQUlwRixTQUFTZCxNQUFNb0IsUUFBTixDQUFlTSxHQUFmLENBQW1CRCxRQUFuQixDQUFiO0FBQ0FYLFdBQVNBLE9BQU9xRixNQUFQLENBQWNGLGdCQUFkLEVBQWdDLG1CQUFXO0FBQ2xELFFBQUlJLFFBQVFELFFBQVFFLFNBQVIsQ0FBa0I7QUFBQSxhQUFNSixjQUFjSyxFQUFwQjtBQUFBLEtBQWxCLENBQVo7QUFDQSxXQUFPSCxRQUFRSSxNQUFSLENBQWVILEtBQWYsQ0FBUDtBQUNELEdBSFEsQ0FBVDs7QUFLQXJHLFVBQ0VjLE9BQU9zQixLQUFQLENBQWFxRSxJQUFiLElBQXFCM0YsT0FBT2tELEtBQVAsQ0FBYXlDLElBQWxDLEdBQ0F6RyxNQUFNcUIsS0FBTixDQUFZLENBQUMsVUFBRCxFQUFhUCxPQUFPRSxFQUFwQixDQUFaLEVBQXFDRixNQUFyQyxDQURBLEdBRUFkLE1BQU11RCxRQUFOLENBQWUsQ0FBQyxVQUFELEVBQWF6QyxPQUFPRSxFQUFwQixDQUFmLENBSEY7O0FBS0EsU0FBTyxFQUFDaEIsWUFBRCxFQUFRYyxjQUFSLEVBQVA7QUFDRDs7QUFFTSxTQUFTckMsbUJBQVQsQ0FBNkJ1QixLQUE3QixFQUFvQ3lCLFFBQXBDLEVBQThDOztBQUVuRDtBQUNBLE1BQUlYLFNBQVNkLE1BQU1tQixLQUFOLENBQVksQ0FBQyxVQUFELEVBQWFNLFFBQWIsQ0FBWixDQUFiOztBQUVBLE1BQUlpRixpQkFBaUIxRyxNQUFNb0IsUUFBTixDQUNsQnVGLE1BRGtCLENBQ1g7QUFBQSxXQUFLQyxFQUFFNUYsRUFBRixLQUFTUyxRQUFULElBQXFCbEMsU0FBUzZGLFVBQVQsQ0FBb0J0RSxNQUFwQixFQUE0QjhGLENBQTVCLENBQTFCO0FBQUEsR0FEVyxDQUFyQjs7QUFHQSxNQUFJRixlQUFlRyxPQUFmLEVBQUosRUFBOEIsT0FBTzdHLEtBQVA7O0FBRTlCO0FBQ0EsTUFBSW9CLGlCQUFKO0FBQUEsTUFBYzRDLGNBQWQ7QUFBQSxNQUFxQjVCLGNBQXJCO0FBQ0FoQixhQUFXcEIsTUFBTW9CLFFBQU4sQ0FBZVgsYUFBZixDQUE2QixvQkFBWTtBQUNsRHVELFlBQVFoRSxNQUFNZ0UsS0FBTixDQUFZdkQsYUFBWixDQUEwQixpQkFBUztBQUN6QzJCLGNBQVFwQyxNQUFNb0MsS0FBTixDQUFZM0IsYUFBWixDQUEwQixpQkFBUzs7QUFFekNpRyx1QkFBZXJFLE9BQWYsQ0F