UNPKG

react-planner-viewer

Version:

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

238 lines (194 loc) 22.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.SNAP_MASK = exports.SNAP_GRID = exports.SNAP_SEGMENT = exports.SNAP_LINE = exports.SNAP_POINT = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); exports.nearestSnap = nearestSnap; exports.addPointSnap = addPointSnap; exports.addLineSnap = addLineSnap; exports.addLineSegmentSnap = addLineSegmentSnap; exports.addGridSnap = addGridSnap; var _immutable = require('immutable'); var _geometry = require('./geometry'); var Geometry = _interopRequireWildcard(_geometry); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var SNAP_POINT = exports.SNAP_POINT = 'SNAP_POINT'; var SNAP_LINE = exports.SNAP_LINE = 'SNAP_LINE'; var SNAP_SEGMENT = exports.SNAP_SEGMENT = 'SNAP_SEGMENT'; var SNAP_GRID = exports.SNAP_GRID = 'SNAP_GRID'; var SNAP_MASK = exports.SNAP_MASK = new _immutable.Map({ SNAP_POINT: true, SNAP_LINE: true, SNAP_SEGMENT: true, SNAP_GRID: false }); var PointSnap = function (_Record) { _inherits(PointSnap, _Record); function PointSnap() { _classCallCheck(this, PointSnap); return _possibleConstructorReturn(this, (PointSnap.__proto__ || Object.getPrototypeOf(PointSnap)).apply(this, arguments)); } _createClass(PointSnap, [{ key: 'nearestPoint', value: function nearestPoint(x, y) { return { x: this.x, y: this.y, distance: Geometry.pointsDistance(this.x, this.y, x, y) }; } }, { key: 'isNear', value: function isNear(x, y, distance) { return ~(this.x - x) + 1 < distance && ~(this.y - y) + 1 < distance; } }]); return PointSnap; }((0, _immutable.Record)({ type: 'point', x: -1, y: -1, radius: 1, priority: 1, related: new _immutable.List() })); var LineSnap = function (_Record2) { _inherits(LineSnap, _Record2); function LineSnap() { _classCallCheck(this, LineSnap); return _possibleConstructorReturn(this, (LineSnap.__proto__ || Object.getPrototypeOf(LineSnap)).apply(this, arguments)); } _createClass(LineSnap, [{ key: 'nearestPoint', value: function nearestPoint(x, y) { return _extends({}, Geometry.closestPointFromLine(this.a, this.b, this.c, x, y), { distance: Geometry.distancePointFromLine(this.a, this.b, this.c, x, y) }); } }, { key: 'isNear', value: function isNear(x, y, distance) { return true; } }]); return LineSnap; }((0, _immutable.Record)({ type: 'line', a: -1, b: -1, c: -1, radius: 1, priority: 1, related: new _immutable.List() })); var LineSegmentSnap = function (_Record3) { _inherits(LineSegmentSnap, _Record3); function LineSegmentSnap() { _classCallCheck(this, LineSegmentSnap); return _possibleConstructorReturn(this, (LineSegmentSnap.__proto__ || Object.getPrototypeOf(LineSegmentSnap)).apply(this, arguments)); } _createClass(LineSegmentSnap, [{ key: 'nearestPoint', value: function nearestPoint(x, y) { return _extends({}, Geometry.closestPointFromLineSegment(this.x1, this.y1, this.x2, this.y2, x, y), { distance: Geometry.distancePointFromLineSegment(this.x1, this.y1, this.x2, this.y2, x, y) }); } }, { key: 'isNear', value: function isNear(x, y, distance) { return true; } }]); return LineSegmentSnap; }((0, _immutable.Record)({ type: 'line-segment', x1: -1, y1: -1, x2: -1, y2: -1, radius: 1, priority: 1, related: new _immutable.List() })); var GridSnap = function (_Record4) { _inherits(GridSnap, _Record4); function GridSnap() { _classCallCheck(this, GridSnap); return _possibleConstructorReturn(this, (GridSnap.__proto__ || Object.getPrototypeOf(GridSnap)).apply(this, arguments)); } _createClass(GridSnap, [{ key: 'nearestPoint', value: function nearestPoint(x, y) { return { x: this.x, y: this.y, distance: Geometry.pointsDistance(this.x, this.y, x, y) }; } }, { key: 'isNear', value: function isNear(x, y, distance) { return ~(this.x - x) + 1 < distance && ~(this.y - y) + 1 < distance; } }]); return GridSnap; }((0, _immutable.Record)({ type: 'grid', x: -1, y: -1, radius: 1, priority: 1, related: new _immutable.List() })); function nearestSnap(snapElements, x, y, snapMask) { var filter = { 'point': snapMask.get(SNAP_POINT), 'line': snapMask.get(SNAP_LINE), 'line-segment': snapMask.get(SNAP_SEGMENT), 'grid': snapMask.get(SNAP_GRID) }; return snapElements.valueSeq().filter(function (el) { return filter[el.type] && el.isNear(x, y, el.radius); }).map(function (snap) { return { snap: snap, point: snap.nearestPoint(x, y) }; }).filter(function (_ref) { var radius = _ref.snap.radius, distance = _ref.point.distance; return distance < radius; }).min(function (_ref2, _ref3) { var p1 = _ref2.snap.priority, d1 = _ref2.point.distance; var p2 = _ref3.snap.priority, d2 = _ref3.point.distance; return p1 === p2 ? d1 < d2 ? -1 : 1 : p1 > p2 ? -1 : 1; }); } function addPointSnap(snapElements, x, y, radius, priority, related) { related = new _immutable.List([related]); return snapElements.push(new PointSnap({ x: x, y: y, radius: radius, priority: priority, related: related })); } function addLineSnap(snapElements, a, b, c, radius, priority, related) { related = new _immutable.List([related]); return snapElements.withMutations(function (snapElements) { var alreadyPresent = snapElements.some(function (lineSnap) { return lineSnap.type === 'line' && a === lineSnap.a && b === lineSnap.b && c === lineSnap.c; }); if (alreadyPresent) return snapElements; var intersections = snapElements.valueSeq().filter(function (snap) { return snap.type === 'line'; }).map(function (snap) { return Geometry.intersectionFromTwoLines(snap.a, snap.b, snap.c, a, b, c); }).filter(function (intersection) { return intersection !== undefined; }).forEach(function (_ref4) { var x = _ref4.x, y = _ref4.y; return addPointSnap(snapElements, x, y, 20, 40); }); snapElements.push(new LineSnap({ a: a, b: b, c: c, radius: radius, priority: priority, related: related })); }); } function addLineSegmentSnap(snapElements, x1, y1, x2, y2, radius, priority, related) { related = new _immutable.List([related]); return snapElements.push(new LineSegmentSnap({ x1: x1, y1: y1, x2: x2, y2: y2, radius: radius, priority: priority, related: related })); } function addGridSnap(snapElements, x, y, radius, priority, related) { related = new _immutable.List([related]); return snapElements.push(new GridSnap({ x: x, y: y, radius: radius, priority: priority, related: related })); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbmFwLmpzIl0sIm5hbWVzIjpbIm5lYXJlc3RTbmFwIiwiYWRkUG9pbnRTbmFwIiwiYWRkTGluZVNuYXAiLCJhZGRMaW5lU2VnbWVudFNuYXAiLCJhZGRHcmlkU25hcCIsIkdlb21ldHJ5IiwiU05BUF9QT0lOVCIsIlNOQVBfTElORSIsIlNOQVBfU0VHTUVOVCIsIlNOQVBfR1JJRCIsIlNOQVBfTUFTSyIsIlBvaW50U25hcCIsIngiLCJ5IiwiZGlzdGFuY2UiLCJwb2ludHNEaXN0YW5jZSIsInR5cGUiLCJyYWRpdXMiLCJwcmlvcml0eSIsInJlbGF0ZWQiLCJMaW5lU25hcCIsImNsb3Nlc3RQb2ludEZyb21MaW5lIiwiYSIsImIiLCJjIiwiZGlzdGFuY2VQb2ludEZyb21MaW5lIiwiTGluZVNlZ21lbnRTbmFwIiwiY2xvc2VzdFBvaW50RnJvbUxpbmVTZWdtZW50IiwieDEiLCJ5MSIsIngyIiwieTIiLCJkaXN0YW5jZVBvaW50RnJvbUxpbmVTZWdtZW50IiwiR3JpZFNuYXAiLCJzbmFwRWxlbWVudHMiLCJzbmFwTWFzayIsImZpbHRlciIsImdldCIsInZhbHVlU2VxIiwiZWwiLCJpc05lYXIiLCJtYXAiLCJzbmFwIiwicG9pbnQiLCJuZWFyZXN0UG9pbnQiLCJtaW4iLCJwMSIsImQxIiwicDIiLCJkMiIsInB1c2giLCJ3aXRoTXV0YXRpb25zIiwiYWxyZWFkeVByZXNlbnQiLCJzb21lIiwibGluZVNuYXAiLCJpbnRlcnNlY3Rpb25zIiwiaW50ZXJzZWN0aW9uRnJvbVR3b0xpbmVzIiwiaW50ZXJzZWN0aW9uIiwidW5kZWZpbmVkIiwiZm9yRWFjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUE2RWdCQSxXLEdBQUFBLFc7UUFzQkFDLFksR0FBQUEsWTtRQUtBQyxXLEdBQUFBLFc7UUF1QkFDLGtCLEdBQUFBLGtCO1FBS0FDLFcsR0FBQUEsVzs7QUFwSWhCOztBQUNBOztJQUFZQyxROzs7Ozs7Ozs7O0FBRUwsSUFBTUMsa0NB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U2hCLGtCQUFULENBQTRCK0IsWUFBNUIsRUFBMENOLEVBQTFDLEVBQThDQyxFQUE5QyxFQUFrREMsRUFBbEQsRUFBc0RDLEVBQXRELEVBQTBEZCxNQUExRCxFQUFrRUMsUUFBbEUsRUFBNEVDLE9BQTVFLEVBQXFGO0FBQzFGQSxZQUFVLG9CQUFTLENBQUNBLE9BQUQsQ0FBVCxDQUFWO0FBQ0EsU0FBT2UsYUFBYWdCLElBQWIsQ0FBa0IsSUFBSXhCLGVBQUosQ0FBb0IsRUFBQ0UsTUFBRCxFQUFLQyxNQUFMLEVBQVNDLE1BQVQsRUFBYUMsTUFBYixFQUFpQmQsY0FBakIsRUFBeUJDLGtCQUF6QixFQUFtQ0MsZ0JBQW5DLEVBQXBCLENBQWxCLENBQVA7QUFDRDs7QUFFTSxTQUFTZixXQUFULENBQXFCOEIsWUFBckIsRUFBbUN0QixDQUFuQyxFQUFzQ0MsQ0FBdEMsRUFBeUNJLE1BQXpDLEVBQWlEQyxRQUFqRCxFQUEyREMsT0FBM0QsRUFBb0U7QUFDekVBLFlBQVUsb0JBQVMsQ0FBQ0EsT0FBRCxDQUFULENBQVY7QUFDQSxTQUFPZSxhQUFhZ0IsSUFBYixDQUFrQixJQUFJakIsUUFBSixDQUFhLEVBQUNyQixJQUFELEVBQUlDLElBQUosRUFBT0ksY0FBUCxFQUFlQyxrQkFBZixFQUF5QkMsZ0JBQXpCLEVBQWIsQ0FBbEIsQ0FBUDtBQUNEIiwiZmlsZSI6InNuYXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01hcCwgTGlzdCwgUmVjb3JkfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0ICogYXMgR2VvbWV0cnkgZnJvbSAnLi9nZW9tZXRyeSc7XG5cbmV4cG9ydCBjb25zdCBTTkFQX1BPSU5UID0gJ1NOQVBfUE9JTlQnO1xuZXhwb3J0IGNvbnN0IFNOQVBfTElORSA9ICdTTkFQX0xJTkUnO1xuZXhwb3J0IGNvbnN0IFNOQVBfU0VHTUVOVCA9ICdTTkFQX1NFR01FTlQnO1xuZXhwb3J0IGNvbnN0IFNOQVBfR1JJRCA9ICdTTkFQX0dSSUQnO1xuXG5leHBvcnQgY29uc3QgU05BUF9NQVNLID0gbmV3IE1hcCh7XG4gIFNOQVBfUE9JTlQgOiB0cnVlLFxuICBTTkFQX0xJTkUgOiB0cnVlLFxuICBTTkFQX1NFR01FTlQgOiB0cnVlLFxuICBTTkFQX0dSSUQgOiBmYWxzZVxufSk7XG5cbmNsYXNzIFBvaW50U25hcCBleHRlbmRzIFJlY29yZCh7XG4gIHR5cGU6ICdwb2ludCcsXG4gIHg6IC0xLCB5OiAtMSxcbiAgcmFkaXVzOiAxLCBwcmlvcml0eTogMSxcbiAgcmVsYXRlZDogbmV3IExpc3QoKVxufSkge1xuICBuZWFyZXN0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLngsXG4gICAgICB5OiB0aGlzLnksXG4gICAgICBkaXN0YW5jZTogR2VvbWV0cnkucG9pbnRzRGlzdGFuY2UodGhpcy54LCB0aGlzLnksIHgsIHkpXG4gICAgfTtcbiAgfVxuICBpc05lYXIoeCx5LGRpc3RhbmNlKXsgcmV0dXJuIH4odGhpcy54IC0geCkgKyAxIDwgZGlzdGFuY2UgJiYgfih0aGlzLnkgLSB5KSArIDEgPCBkaXN0YW5jZTsgfVxufVxuXG5jbGFzcyBMaW5lU25hcCBleHRlbmRzIFJlY29yZCh7XG4gIHR5cGU6ICdsaW5lJyxcbiAgYTogLTEsIGI6IC0xLCBjOiAtMSxcbiAgcmFkaXVzOiAxLCBwcmlvcml0eTogMSxcbiAgcmVsYXRlZDogbmV3IExpc3QoKVxufSkge1xuICBuZWFyZXN0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5HZW9tZXRyeS5jbG9zZXN0UG9pbnRGcm9tTGluZSh0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB4LCB5KSxcbiAgICAgIGRpc3RhbmNlOiBHZW9tZXRyeS5kaXN0YW5jZVBvaW50RnJvbUxpbmUodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgeCwgeSlcbiAgICB9O1xuICB9XG4gIGlzTmVhcih4LHksZGlzdGFuY2UpeyByZXR1cm4gdHJ1ZTsgfVxufVxuXG5jbGFzcyBMaW5lU2VnbWVudFNuYXAgZXh0ZW5kcyBSZWNvcmQoe1xuICB0eXBlOiAnbGluZS1zZWdtZW50JyxcbiAgeDE6IC0xLCB5MTogLTEsIHgyOiAtMSwgeTI6IC0xLFxuICByYWRpdXM6IDEsIHByaW9yaXR5OiAxLFxuICByZWxhdGVkOiBuZXcgTGlzdCgpXG59KSB7XG4gIG5lYXJlc3RQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkdlb21ldHJ5LmNsb3Nlc3RQb2ludEZyb21MaW5lU2VnbWVudCh0aGlzLngxLCB0aGlzLnkxLCB0aGlzLngyLCB0aGlzLnkyLCB4LCB5KSxcbiAgICAgIGRpc3RhbmNlOiBHZW9tZXRyeS5kaXN0YW5jZVBvaW50RnJvbUxpbmVTZWdtZW50KHRoaXMueDEsIHRoaXMueTEsIHRoaXMueDIsIHRoaXMueTIsIHgsIHkpXG4gICAgfTtcbiAgfVxuICBpc05lYXIoeCx5LGRpc3RhbmNlKXsgcmV0dXJuIHRydWU7IH1cbn1cblxuY2xhc3MgR3JpZFNuYXAgZXh0ZW5kcyBSZWNvcmQoe1xuICB0eXBlOiAnZ3JpZCcsXG4gIHg6IC0xLCB5OiAtMSxcbiAgcmFkaXVzOiAxLCBwcmlvcml0eTogMSxcbiAgcmVsYXRlZDogbmV3IExpc3QoKVxufSkge1xuICBuZWFyZXN0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLngsXG4gICAgICB5OiB0aGlzLnksXG4gICAgICBkaXN0YW5jZTogR2VvbWV0cnkucG9pbnRzRGlzdGFuY2UodGhpcy54LCB0aGlzLnksIHgsIHkpXG4gICAgfTtcbiAgfVxuICBpc05lYXIoeCx5LGRpc3RhbmNlKXsgcmV0dXJuIH4odGhpcy54IC0geCkgKyAxIDwgZGlzdGFuY2UgJiYgfih0aGlzLnkgLSB5KSArIDEgPCBkaXN0YW5jZTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdFNuYXAoc25hcEVsZW1lbnRzLCB4LCB5LCBzbmFwTWFzaykge1xuXG4gIGxldCBmaWx0ZXIgPSB7XG4gICAgJ3BvaW50Jzogc25hcE1hc2suZ2V0KFNOQVBfUE9JTlQpLFxuICAgICdsaW5lJzogc25hcE1hc2suZ2V0KFNOQVBfTElORSksXG4gICAgJ2xpbmUtc2VnbWVudCc6IHNuYXBNYXNrLmdldChTTkFQX1NFR01FTlQpLFxuICAgICdncmlkJzogc25hcE1hc2suZ2V0KFNOQVBfR1JJRClcbiAgfTtcblxuICByZXR1cm4gc25hcEVsZW1lbnRzXG4gIC52YWx1ZVNlcSgpXG4gIC5maWx0ZXIoICggZWwgKSA9PiBmaWx0ZXJbZWwudHlwZV0gJiYgZWwuaXNOZWFyKHgseSwgZWwucmFkaXVzKSApXG4gIC5tYXAoc25hcCA9PiB7IHJldHVybiB7c25hcCwgcG9pbnQ6IHNuYXAubmVhcmVzdFBvaW50KHgsIHkpfSB9KVxuICAuZmlsdGVyKCh7c25hcDoge3JhZGl1c30sIHBvaW50OiB7ZGlzdGFuY2V9fSkgPT4gZGlzdGFuY2UgPCByYWRpdXMpXG4gIC5taW4oXG4gICAgKFxuICAgICAge3NuYXA6IHsgcHJpb3JpdHkgOiBwMSB9LCBwb2ludDogeyBkaXN0YW5jZSA6IGQxIH19LFxuICAgICAge3NuYXA6IHsgcHJpb3JpdHkgOiBwMiB9LCBwb2ludDogeyBkaXN0YW5jZSA6IGQyIH19XG4gICAgKSA9PiBwMSA9PT0gcDIgPyAoIGQxIDwgZDIgPyAtMSA6IDEgKSA6ICggcDEgPiBwMiA/IC0xIDogMSApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRQb2ludFNuYXAoc25hcEVsZW1lbnRzLCB4LCB5LCByYWRpdXMsIHByaW9yaXR5LCByZWxhdGVkKSB7XG4gIHJlbGF0ZWQgPSBuZXcgTGlzdChbcmVsYXRlZF0pO1xuICByZXR1cm4gc25hcEVsZW1lbnRzLnB1c2gobmV3IFBvaW50U25hcCh7eCwgeSwgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExpbmVTbmFwKHNuYXBFbGVtZW50cywgYSwgYiwgYywgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZCkge1xuICByZWxhdGVkID0gbmV3IExpc3QoW3JlbGF0ZWRdKTtcblxuICByZXR1cm4gc25hcEVsZW1lbnRzLndpdGhNdXRhdGlvbnMoc25hcEVsZW1lbnRzID0+IHtcblxuICAgIGxldCBhbHJlYWR5UHJlc2VudCA9IHNuYXBFbGVtZW50cy5zb21lKGxpbmVTbmFwID0+XG4gICAgbGluZVNuYXAudHlwZSA9PT0gJ2xpbmUnICYmXG4gICAgYSA9PT0gbGluZVNuYXAuYSAmJlxuICAgIGIgPT09IGxpbmVTbmFwLmIgJiZcbiAgICBjID09PSBsaW5lU25hcC5jKTtcbiAgICBpZiAoYWxyZWFkeVByZXNlbnQpIHJldHVybiBzbmFwRWxlbWVudHM7XG5cbiAgICBsZXQgaW50ZXJzZWN0aW9ucyA9IHNuYXBFbGVtZW50c1xuICAgICAgLnZhbHVlU2VxKClcbiAgICAgIC5maWx0ZXIoc25hcCA9PiBzbmFwLnR5cGUgPT09ICdsaW5lJylcbiAgICAgIC5tYXAoc25hcCA9PiBHZW9tZXRyeS5pbnRlcnNlY3Rpb25Gcm9tVHdvTGluZXMoc25hcC5hLCBzbmFwLmIsIHNuYXAuYywgYSwgYiwgYykpXG4gICAgICAuZmlsdGVyKGludGVyc2VjdGlvbiA9PiBpbnRlcnNlY3Rpb24gIT09IHVuZGVmaW5lZClcbiAgICAgIC5mb3JFYWNoKCh7eCwgeX0pID0+IGFkZFBvaW50U25hcChzbmFwRWxlbWVudHMsIHgsIHksIDIwLCA0MCkpO1xuXG4gICAgc25hcEVsZW1lbnRzLnB1c2gobmV3IExpbmVTbmFwKHthLCBiLCBjLCByYWRpdXMsIHByaW9yaXR5LCByZWxhdGVkfSkpO1xuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGluZVNlZ21lbnRTbmFwKHNuYXBFbGVtZW50cywgeDEsIHkxLCB4MiwgeTIsIHJhZGl1cywgcHJpb3JpdHksIHJlbGF0ZWQpIHtcbiAgcmVsYXRlZCA9IG5ldyBMaXN0KFtyZWxhdGVkXSk7XG4gIHJldHVybiBzbmFwRWxlbWVudHMucHVzaChuZXcgTGluZVNlZ21lbnRTbmFwKHt4MSwgeTEsIHgyLCB5MiwgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEdyaWRTbmFwKHNuYXBFbGVtZW50cywgeCwgeSwgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZCkge1xuICByZWxhdGVkID0gbmV3IExpc3QoW3JlbGF0ZWRdKTtcbiAgcmV0dXJuIHNuYXBFbGVtZW50cy5wdXNoKG5ldyBHcmlkU25hcCh7eCwgeSwgcmFkaXVzLCBwcmlvcml0eSwgcmVsYXRlZH0pKTtcbn1cbiJdfQ==