@libs-ui/components-draw-line 0.2.70 → 0.2.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,7 +34,6 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
34
34
  const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');
35
35
  const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);
36
36
  elements.forEach(item => {
37
- console.log('directionStartX', directionStartX);
38
37
  if (item.start.x === straightLine.endPath.x) {
39
38
  item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));
40
39
  }
@@ -44,34 +43,31 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
44
43
  });
45
44
  }
46
45
  // // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1
47
- const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
46
+ const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
48
47
  const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');
49
48
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
50
- if (elementBlockRoad) {
49
+ const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);
50
+ if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {
51
51
  coordQ1.x1 = straightLine.endPath.x ?? 0;
52
52
  coordQ1.y1 = straightLine.endPath.y ?? 0;
53
53
  coordQ1.x = straightLine.endPath.x ?? 0;
54
54
  coordQ1.y = straightLine.endPath.y ?? 0;
55
55
  }
56
56
  // kiểm tra và vẽ hướng ngang
57
- const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPositionOrigin.x, 'x');
58
- endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);
59
- if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {
60
- endPosition.y -= lineCurve;
61
- }
57
+ const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');
62
58
  const pathHorizontal = [];
63
- const { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionOrigin, obstacleRect, pathHorizontal);
59
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
64
60
  if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
65
- separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });
61
+ separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });
66
62
  return;
67
63
  }
68
64
  const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };
69
- separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
70
65
  separatedPoints.push(...pathHorizontal);
71
- if (endPath.x === endPositionOrigin.x && endPath.y < endPositionOrigin.y) {
66
+ separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
67
+ if (endPath.x === endPosition.x && endPath.y < endPosition.y) {
72
68
  const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);
73
69
  if (itemLast) {
74
- itemLast.end.x = endPositionOrigin.x + 50;
70
+ itemLast.end.x = endPosition.x + 50;
75
71
  endPath.x = itemLast.end.x;
76
72
  }
77
73
  }
@@ -97,21 +93,25 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
97
93
  separatedPointsCheckAndAvoidBlocks = [];
98
94
  }
99
95
  if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
100
- const elements = separatedPointsCheckAndAvoidBlocks.filter(item => item.start.y === endPath.y || item.end.y === endPath.y);
101
- elements.forEach(item => {
102
- if (item.start.y === endPath.y) {
103
- item.start.y -= 10;
104
- }
105
- if (item.end.y === endPath.y) {
106
- item.end.y -= 10;
107
- }
108
- });
96
+ const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));
97
+ const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));
98
+ if (element) {
99
+ element.start.y = endPosition.y;
100
+ element.end.y = endPosition.y;
101
+ }
102
+ if (elementQR) {
103
+ elementQR.end.y = endPosition.y;
104
+ }
109
105
  }
110
106
  separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);
111
107
  if (endPath.y === endPosition.y) {
112
108
  separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });
113
109
  return;
114
110
  }
111
+ if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
112
+ separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });
113
+ return;
114
+ }
115
115
  // // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào
116
116
  const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');
117
117
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
@@ -152,4 +152,4 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
152
152
  return;
153
153
  }
154
154
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jb25uZWN0LWJvdHRvbS1sZWZ0LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9saW5lLWNvbm5lY3QtYm90dG9tLWxlZnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdGLE1BQU0sT0FBTyw4Q0FBOEM7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFnQixFQUFFLFVBQWlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsWUFBcUIsRUFBRSxlQUErQjtRQUMzSSxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNkLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNmLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxNQUFNLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV2SCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQTtZQUMzRSxNQUFNLElBQUksR0FB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LEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU5SixPQUFPO0lBQ1QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBJUG9pbnQsIElQb2ludHMsIElSZWN0IH0gZnJvbSBcIi4uL2RyYXctbGluZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwgfSBmcm9tIFwiLi9jYWxjdWxhdG9yLWJyYW5jaC51dGlsXCI7XG5pbXBvcnQgeyBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbCB9IGZyb20gXCIuL2NhbGN1bGF0b3ItZGlyZXRpb24tZWxlbWVudC51bnRpbFwiO1xuXG5leHBvcnQgY2xhc3MgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbkJvdHRvbUxlZnRFbGVtZW50VXRpbCB7XG4gIHN0YXRpYyBsaW5lTGVmdChwb2ludE5leHQ6IElSZWN0LCBwb2ludFN0YXJ0OiBJUmVjdCwgc3RhcnQ6IElQb2ludCwgbGluZUN1cnZlOiBudW1iZXIsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uT3JpZ2luID0ge1xuICAgICAgeDogcG9pbnROZXh0LngsXG4gICAgICB5OiBwb2ludE5leHQueVxuICAgIH07XG4gICAgY29uc3QgZW5kUG9zaXRpb24gPSBjbG9uZURlZXAoZW5kUG9zaXRpb25PcmlnaW4pO1xuICAgIGNvbnN0IGRpcmVjdGlvblN0YXJ0WSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0YXJ0LnksIGVuZFBvc2l0aW9uT3JpZ2luLnksICd5Jyk7XG5cbiAgICBsZXQgbmV3UG9zaXRpb24gPSBzdGFydDtcblxuICAgIGlmIChkaXJlY3Rpb25TdGFydFkgPT09ICdhYm92ZScpIHtcbiAgICAgIGNvbnN0IHN0YXJ0UUwgPSB7IGx4OiBzdGFydC54IC0gbGluZUN1cnZlLCBseTogKHN0YXJ0LnkgPz8gMCkgKyBsaW5lQ3VydmUgfVxuICAgICAgY29uc3QgbGluZSA9IHtcbiAgICAgICAgc3RhcnQ6IHsgeDogKHN0YXJ0LnggPz8gMCksIHk6IHN0YXJ0LnkgPz8gMCB9LFxuICAgICAgICBlbmQ6IHsgeDogc3RhcnRRTC5seCA/PyAwLCB5OiBzdGFydFFMLmx5ID8/IDAgfVxuICAgICAgfVxuICAgICAgbmV3UG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHBvaW50U3RhcnQueCAtIChsaW5lQ3VydmUgKyAxMCksXG4gICAgICAgIHk6IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WSwgbGluZS5lbmQueSwgbGluZUN1cnZlLCB0cnVlKVxuICAgICAgfVxuXG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBsaW5lLnN0YXJ0LCBlbmQ6IGxpbmUuZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICcxJyB9KTsgLy8gbGluZSB24bq9IMSRaSBraOG7j2kga2jhu5FpIMSR4bqndSB0acOqblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogbGluZS5lbmQsIGVuZDogbmV3UG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7IC8vIGxpbmUgduG6vSDEkWkga2jhu49pIGto4buRaSDEkeG6p3UgdGnDqm5cbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHRo4bqzbmcgxJHhur9uIGVuZCwgbuG6v3UgY8OzIGto4buRaSB0aMOsIHRyw6FuaFxuICAgIGVuZFBvc2l0aW9uT3JpZ2luLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFksIGVuZFBvc2l0aW9uT3JpZ2luLnksIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0KG5ld1Bvc2l0aW9uLnggPz8gMCwgbmV3UG9zaXRpb24ueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uT3JpZ2luLCBkaXJlY3Rpb25TdGFydFksIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvblN0YXJ0WCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0cmFpZ2h0TGluZS5lbmRQYXRoLngsIGVuZFBvc2l0aW9uT3JpZ2luLngsICd4Jyk7XG4gICAgaWYgKGRpcmVjdGlvblN0YXJ0WCA9PT0gJ2NlbnRlcicgJiYgZGlyZWN0aW9uU3RhcnRZID09PSAndW5kZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDApIC0gZW5kUG9zaXRpb25PcmlnaW4ueCkgPCBsaW5lQ3VydmUpIHtcbiAgICAgIGNvbnN0IGxpc3RMaW5lID0gc2VwYXJhdGVkUG9pbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgPT09ICdjaGVja0FuZEF2b2lkQmxvY2tzWUxlZnQnKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gbGlzdExpbmUuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54IHx8IGl0ZW0uZW5kLnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpO1xuICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2RpcmVjdGlvblN0YXJ0WCcsIGRpcmVjdGlvblN0YXJ0WCk7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpIHtcbiAgICAgICAgICBpdGVtLnN0YXJ0LnggPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFgsIGl0ZW0uc3RhcnQueCwgKGxpbmVDdXJ2ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5lbmQueCA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WCwgaXRlbS5lbmQueCwgKGxpbmVDdXJ2ZSkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIC8vIGtp4buDbSB0cmEgbmdheSBraGkgY3VhIGPDsyB2xrDhu5tuZyBhaSBraMO0bmcgcuG7k2kgaOG6tW5nIHbhur0gUTFcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIGVuZFBvc2l0aW9uLngsIHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCwgJ3gnLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuICAgIGNvbnN0IGRpcmVjdGlvbk5leHRYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwLCBlbmRQb3NpdGlvbk9yaWdpbi54LCAneCcpO1xuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIHk6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCB9LFxuICAgICAgYCR7ZGlyZWN0aW9uU3RhcnRZfS0ke2RpcmVjdGlvbk5leHRYfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcblxuICAgIGlmIChlbGVtZW50QmxvY2tSb2FkKSB7XG4gICAgICBjb29yZFExLngxID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwO1xuICAgICAgY29vcmRRMS55MSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICAgIGNvb3JkUTEueCA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMDtcbiAgICAgIGNvb3JkUTEueSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIHbDoCB24bq9IGjGsOG7m25nIG5nYW5nXG4gICAgY29uc3QgZGlyZWN0aW9uWFRvRW5kID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoY29vcmRRMS54ID8/IDAsIGVuZFBvc2l0aW9uT3JpZ2luLngsICd4Jyk7XG5cbiAgICBlbmRQb3NpdGlvbi54ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWFRvRW5kLCBlbmRQb3NpdGlvbi54LCBsaW5lQ3VydmUpO1xuICAgIGlmIChNYXRoLmFicygoY29vcmRRMS55ID8/IDApIC0gZW5kUG9zaXRpb24ueSkgPD0gbGluZUN1cnZlKSB7XG4gICAgICBlbmRQb3NpdGlvbi55IC09IGxpbmVDdXJ2ZTtcbiAgICB9XG4gICAgY29uc3QgcGF0aEhvcml6b250YWw6IElQb2ludHNbXSA9IFtdO1xuICAgIGNvbnN0IHsgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc0xlZnQoY29vcmRRMS54ID8/IDAsIGNvb3JkUTEueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uT3JpZ2luLCBvYnN0YWNsZVJlY3QsIHBhdGhIb3Jpem9udGFsKTtcblxuICAgIGlmIChkaXJlY3Rpb25YVG9FbmQgPT09ICdsZWZ0JyAmJiBlbmRQYXRoLnggPiAoY29vcmRRMS54ID8/IDApKSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBzdHJhaWdodExpbmUuZW5kUGF0aCwgZW5kOiBlbmRQb3NpdGlvbk9yaWdpbiwgbW9kZTogJ3ZlcnRpY2FsJywgaWQ6ICc2YSAnICsgZGlyZWN0aW9uU3RhcnRZIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSB7IHg6IChjb29yZFExLnggPz8gMCksIHk6IGNvb3JkUTEueSA/PyAwIH07XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogc3RyYWlnaHRMaW5lLmVuZFBhdGgsIGVuZDogZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICc2YSAnICsgZGlyZWN0aW9uU3RhcnRZIH0pOyAvLyBnw7NjIGNvbmcgdOG7qyDEkcaw4budbmcgdGjhurNuZyBzYW5nIG5nYW5nXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goLi4ucGF0aEhvcml6b250YWwpXG4gICAgaWYgKGVuZFBhdGgueCA9PT0gZW5kUG9zaXRpb25PcmlnaW4ueCAmJiBlbmRQYXRoLnkgPCBlbmRQb3NpdGlvbk9yaWdpbi55KSB7XG4gICAgICBjb25zdCBpdGVtTGFzdCA9IHBhdGhIb3Jpem9udGFsLmZpbmQoaXRlbSA9PiBpdGVtLmVuZC54ID09PSBlbmRQYXRoLngpO1xuICAgICAgaWYgKGl0ZW1MYXN0KSB7XG4gICAgICAgIGl0ZW1MYXN0LmVuZC54ID0gZW5kUG9zaXRpb25PcmlnaW4ueCArIDUwO1xuICAgICAgICBlbmRQYXRoLnggPSBpdGVtTGFzdC5lbmQueDtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogZW5kUGF0aCwgZW5kOiB7IHg6IHBvaW50TmV4dC54LCB5OiBwb2ludE5leHQueSB9LCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAnbGluZUVuZCcgfSk7XG4gIH1cblxuICBzdGF0aWMgcmlnaHRMZWZ0KGVsZW1lbnROZXh0OiBJUmVjdCwgc3RhcnQ6IElQb2ludCwgbGluZUN1cnZlOiBudW1iZXIsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uID0ge1xuICAgICAgeDogZWxlbWVudE5leHQueCxcbiAgICAgIHk6IGVsZW1lbnROZXh0LnlcbiAgICB9O1xuXG4gICAgLy8gduG6vSAxIMSRxrDhu51uZyB0aOG6s25nIHThu6sgxJFp4buDbSBzdGFydCByYSBuZ2/DoGkgxJHDo1xuICAgIGNvbnN0IGVuZCA9IHsgeDogKHN0YXJ0LnggPz8gMCkgKyAxMCwgeTogKHN0YXJ0LnkgPz8gMCkgKyAxMCB9O1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogKHN0YXJ0LnggPz8gMCksIHk6IHN0YXJ0LnkgPz8gMCB9LCBlbmQ6IGVuZCwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7XG5cbiAgICBjb25zdCBlbmRQb3NpdGlvblggPSBjbG9uZURlZXAoZW5kUG9zaXRpb24pO1xuICAgIGVuZFBvc2l0aW9uWC54IC09IDUwO1xuXG4gICAgbGV0IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3M6IEFycmF5PElQb2ludHM+ID0gW107XG4gICAgbGV0IHsgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2NrcyhlbmQueCA/PyAwLCAoZW5kLnkgPz8gMCksIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb25YLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKE1hdGguYWJzKChzdGFydC54ID8/IDApIC0gZW5kUG9zaXRpb24ueCkgPCAxMCB8fCBlbmQueCA+IGVuZFBhdGgueCkge1xuICAgICAgZW5kUGF0aCA9IHtcbiAgICAgICAgeDogZW5kLngsXG4gICAgICAgIHk6IGVuZC55XG4gICAgICB9O1xuXG4gICAgICBzZXBhcmF0ZWRQb2ludHNDaGVja0FuZEF2b2lkQmxvY2tzID0gW107XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChlbmRQYXRoLnkgPz8gMCkgLSBlbmRQb3NpdGlvbi55KSA8IDE1KSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdGFydC55ID09PSBlbmRQYXRoLnkgfHwgaXRlbS5lbmQueSA9PT0gZW5kUGF0aC55KTtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0LnkgPT09IGVuZFBhdGgueSkge1xuICAgICAgICAgIGl0ZW0uc3RhcnQueSAtPSAxMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5lbmQueSA9PT0gZW5kUGF0aC55KSB7XG4gICAgICAgICAgaXRlbS5lbmQueSAtPSAxMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMuc3BsaWNlKHNlcGFyYXRlZFBvaW50cy5sZW5ndGgsIDAsIC4uLnNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKGVuZFBhdGgueSA9PT0gZW5kUG9zaXRpb24ueSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55IH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAvLyBzYXUga2hpIMSRw6MgxJFpIG5nYW5nIHbDoCB0csOhbmggY8OhYyBraOG7kWksIHRp4bq/cCB0aGVvIGzDoCDEkWkgdGnhur9wIGjGsOG7m25nIGzDqm4geHXhu5FuZyDEkeG7gyB24buBIGto4buRaSBj4bqnbiBu4buRaSB04bubaSwgY+G6p24gY2hlY2sgeGVtIMSRaeG7g20gZW5kIFggbsOzIMSRYW5nIOG7nyBoxrDhu5tuZyBuw6BvXG4gICAgY29uc3QgZGlyZWN0aW9uWSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KGVuZFBhdGgueSwgZW5kUG9zaXRpb24ueSwgJ3knKTtcblxuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55ID8/IDAgfSwgYHJpZ2h0LSR7ZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyA/ICdhYm92ZScgOiAndW5kZXInfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcbiAgICBjb25zdCBlbmRQb3NpdGlvblkgPSBjbG9uZURlZXAoZW5kUG9zaXRpb24pO1xuICAgIGVuZFBvc2l0aW9uWS55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgZW5kUG9zaXRpb25ZLnksIGxpbmVDdXJ2ZSk7XG5cbiAgICAvLyAvLyBj4bqnbiBjaGVjayBraGkgxJFpIHRo4bqzbmcgbMOqbiBjw7Mgdsaw4bubbmcga2jhu5FpIG7DoG8ga2jDtG5nIMSR4buDIHRp4bq/biBsw6puLCBuaMawbmcgY+G6p24gcGjhuqNpIHhlbSB4IGPhu6dhIG7DsyBjw7MgcXXDoSBn4bqnbiBlbmRYIGtow7RuZywgZ+G6p24gcXXDoSB0aMOsIFxuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tCbG9ja3NFbGVtZW50U3RyYWlnaHRZKChlbmRQYXRoLnggPz8gMCkgKyAxMCwgZW5kUGF0aC55ID8/IDAsIGVuZFBvc2l0aW9uWSwgb2JzdGFjbGVSZWN0KTtcbiAgICBpZiAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkpIHtcbiAgICAgIGNvb3JkUTEueCA9IChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWS54ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLndpZHRoID8/IDApICsgbGluZUN1cnZlO1xuICAgIH1cbiAgICBpZiAoTWF0aC5hYnMoKGNvb3JkUTEueCA/PyAwKSAtIGVuZFBvc2l0aW9uLngpIDwgMjAgJiYgZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJykge1xuICAgICAgY29vcmRRMS54ID0gZW5kUG9zaXRpb24ueCArIDIwOyAgLy8gdHLGsOG7nW5nIGjhu6NwIHJpZ2h0IHF1YXkgeHXhu5FuZyBkxrDhu5tpIMSRaeG7g20gZW5kIGtow6EgZ+G6p24gxJFp4buDbSBzdGFydCA9PiBraMO0bmcgxJHhu6cga2hv4bqjbmcgY8OhY2ggcXVheSBtxalpIHTDqm4gdsOgb1xuICAgIH1cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IGVuZFBhdGgueCA/PyAwLCB5OiBlbmRQYXRoLnkgfSwgZW5kOiB7IHg6IGNvb3JkUTEueCA/PyAwLCB5OiAoY29vcmRRMS55ID8/IDApIH0sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnZycgfSk7XG5cbiAgICBsZXQgYXZvaWRCbG9ja3NZTGluZTogSVBvaW50c1tdID0gW107XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1koY29vcmRRMS54ID8/IDAsIGNvb3JkUTEueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uWSwgZGlyZWN0aW9uWSwgb2JzdGFjbGVSZWN0LCBhdm9pZEJsb2Nrc1lMaW5lKTtcbiAgICBpZiAoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiAoY29vcmRRMS55ID8/IDApID4gZW5kUG9zaXRpb25ZLnkpIHtcbiAgICAgIGF2b2lkQmxvY2tzWUxpbmUgPSBbXTtcbiAgICAgIHN0cmFpZ2h0TGluZS5lbmRQYXRoID0geyB4OiBjb29yZFExLnggPz8gMCwgeTogY29vcmRRMS55ID8/IDAgfTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvblkgPT09ICdhYm92ZScgJiYgc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA8PSBlbmRQb3NpdGlvbi55KSB7XG4gICAgICBhdm9pZEJsb2Nrc1lMaW5lID0gW107XG4gICAgICBzdHJhaWdodExpbmUuZW5kUGF0aCA9IHsgeDogY29vcmRRMS54ID8/IDAsIHk6IGNvb3JkUTEueSA/PyAwIH07XG4gICAgfVxuICAgIGlmIChNYXRoLmFicygoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwKSAtIGVuZFBvc2l0aW9uLngpIDwgMTUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXZvaWRCbG9ja3NZTGluZS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggfHwgaXRlbS5lbmQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCk7XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5zdGFydC54ICs9IDMwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5lbmQueCArPSAzMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCguLi5hdm9pZEJsb2Nrc1lMaW5lKTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCwgeTogc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwIH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnLCBpZDogJzQnIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG59Il19
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jb25uZWN0LWJvdHRvbS1sZWZ0LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9saW5lLWNvbm5lY3QtYm90dG9tLWxlZnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdGLE1BQU0sT0FBTyw4Q0FBOEM7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFnQixFQUFFLFVBQWlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsWUFBcUIsRUFBRSxlQUErQjtRQUMzSSxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNkLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNmLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxNQUFNLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV2SCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksR0FB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T0FBTyxHQUFHLHNDQUFzQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsaURBQWlEO1FBQzFPLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QyxZQUFZLENBQUMsQ0FBQyxHQUFHLDRCQUE0QixDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTlHLHFJQUFxSTtRQUNySSxNQUFNLDZCQUE2QixHQUFHLHNDQUFzQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTVLLElBQUksNkJBQTZCLEVBQUUsQ0FBQztZQUNsQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM5RyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM5RSxPQUFPLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsd0dBQXdHO1FBQzFJLENB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QUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTlKLE9BQU87SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwiQGxpYnMtdWkvdXRpbHNcIjtcbmltcG9ydCB7IElQb2ludCwgSVBvaW50cywgSVJlY3QgfSBmcm9tIFwiLi4vZHJhdy1saW5lLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbCB9IGZyb20gXCIuL2NhbGN1bGF0b3ItYnJhbmNoLnV0aWxcIjtcbmltcG9ydCB7IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsIH0gZnJvbSBcIi4vY2FsY3VsYXRvci1kaXJldGlvbi1lbGVtZW50LnVudGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBNb0NhbnZhc0Nvbm5lY3ROYXZpZ2F0aW9uQm90dG9tTGVmdEVsZW1lbnRVdGlsIHtcbiAgc3RhdGljIGxpbmVMZWZ0KHBvaW50TmV4dDogSVJlY3QsIHBvaW50U3RhcnQ6IElSZWN0LCBzdGFydDogSVBvaW50LCBsaW5lQ3VydmU6IG51bWJlciwgb2JzdGFjbGVSZWN0OiBJUmVjdFtdLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+KSB7XG4gICAgY29uc3QgZW5kUG9zaXRpb25PcmlnaW4gPSB7XG4gICAgICB4OiBwb2ludE5leHQueCxcbiAgICAgIHk6IHBvaW50TmV4dC55XG4gICAgfTtcbiAgICBjb25zdCBlbmRQb3NpdGlvbiA9IGNsb25lRGVlcChlbmRQb3NpdGlvbk9yaWdpbik7XG4gICAgY29uc3QgZGlyZWN0aW9uU3RhcnRZID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RhcnQueSwgZW5kUG9zaXRpb25PcmlnaW4ueSwgJ3knKTtcblxuICAgIGxldCBuZXdQb3NpdGlvbiA9IHN0YXJ0O1xuXG4gICAgaWYgKGRpcmVjdGlvblN0YXJ0WSA9PT0gJ2Fib3ZlJykge1xuICAgICAgY29uc3Qgc3RhcnRRTCA9IHsgbHg6IHN0YXJ0LnggLSBsaW5lQ3VydmUsIGx5OiAoc3RhcnQueSA/PyAwKSArIGxpbmVDdXJ2ZSB9O1xuICAgICAgY29uc3QgbGluZSA9IHtcbiAgICAgICAgc3RhcnQ6IHsgeDogKHN0YXJ0LnggPz8gMCksIHk6IHN0YXJ0LnkgPz8gMCB9LFxuICAgICAgICBlbmQ6IHsgeDogc3RhcnRRTC5seCA/PyAwLCB5OiBzdGFydFFMLmx5ID8/IDAgfVxuICAgICAgfTtcblxuICAgICAgbmV3UG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHBvaW50U3RhcnQueCAtIChsaW5lQ3VydmUgKyAxMCksXG4gICAgICAgIHk6IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WSwgbGluZS5lbmQueSwgbGluZUN1cnZlLCB0cnVlKVxuICAgICAgfTtcblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogbGluZS5zdGFydCwgZW5kOiBsaW5lLmVuZCwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7IC8vIGxpbmUgduG6vSDEkWkga2jhu49pIGto4buRaSDEkeG6p3UgdGnDqm5cbiAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IGxpbmUuZW5kLCBlbmQ6IG5ld1Bvc2l0aW9uLCBtb2RlOiAnaG9yaXpvbnRhbC1zaW5nbGUtY3VydmUnLCBpZDogJzEnIH0pOyAvLyBsaW5lIHbhur0gxJFpIGto4buPaSBraOG7kWkgxJHhuqd1IHRpw6puXG4gICAgfVxuXG4gICAgLy8ga2nhu4NtIHRyYSBoxrDhu5tuZyB0aOG6s25nIMSR4bq/biBlbmQsIG7hur91IGPDsyBraOG7kWkgdGjDrCB0csOhbmhcbiAgICBlbmRQb3NpdGlvbk9yaWdpbi55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uU3RhcnRZLCBlbmRQb3NpdGlvbk9yaWdpbi55LCBsaW5lQ3VydmUpO1xuICAgIGNvbnN0IHN0cmFpZ2h0TGluZSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrQW5kQXZvaWRCbG9ja3NZTGVmdChuZXdQb3NpdGlvbi54ID8/IDAsIG5ld1Bvc2l0aW9uLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvbk9yaWdpbiwgZGlyZWN0aW9uU3RhcnRZLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50cyk7XG4gICAgY29uc3QgZGlyZWN0aW9uU3RhcnRYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCwgZW5kUG9zaXRpb25PcmlnaW4ueCwgJ3gnKTtcblxuICAgIGlmIChkaXJlY3Rpb25TdGFydFggPT09ICdjZW50ZXInICYmIGRpcmVjdGlvblN0YXJ0WSA9PT0gJ3VuZGVyJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChNYXRoLmFicygoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwKSAtIGVuZFBvc2l0aW9uT3JpZ2luLngpIDwgbGluZUN1cnZlKSB7XG4gICAgICBjb25zdCBsaXN0TGluZSA9IHNlcGFyYXRlZFBvaW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09PSAnY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0Jyk7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGxpc3RMaW5lLmZpbHRlcihpdGVtID0+IGl0ZW0uc3RhcnQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCB8fCBpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KTtcblxuICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc3RhcnQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCkge1xuICAgICAgICAgIGl0ZW0uc3RhcnQueCA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WCwgaXRlbS5zdGFydC54LCAobGluZUN1cnZlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0uZW5kLnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpIHtcbiAgICAgICAgICBpdGVtLmVuZC54ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uU3RhcnRYLCBpdGVtLmVuZC54LCAobGluZUN1cnZlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC8vIGtp4buDbSB0cmEgbmdheSBraGkgY3VhIGPDsyB2xrDhu5tuZyBhaSBraMO0bmcgcuG7k2kgaOG6tW5nIHbhur0gUTFcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIGVuZFBvc2l0aW9uT3JpZ2luLngsIHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCwgJ3gnLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuICAgIGNvbnN0IGRpcmVjdGlvbk5leHRYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwLCBlbmRQb3NpdGlvbk9yaWdpbi54LCAneCcpO1xuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIHk6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCB9LFxuICAgICAgYCR7ZGlyZWN0aW9uU3RhcnRZfS0ke2RpcmVjdGlvbk5leHRYfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkWCA9IChlbGVtZW50QmxvY2tSb2FkPy54ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWQ/LndpZHRoID8/IDApO1xuXG4gICAgaWYgKGVsZW1lbnRCbG9ja1JvYWQgJiYgTWF0aC5hYnMoKGVsZW1lbnRCbG9ja1JvYWRYKSAtIChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDApKSA8PSBsaW5lQ3VydmUgKiAyKSB7XG4gICAgICBjb29yZFExLngxID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwO1xuICAgICAgY29vcmRRMS55MSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICAgIGNvb3JkUTEueCA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMDtcbiAgICAgIGNvb3JkUTEueSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIHbDoCB24bq9IGjGsOG7m25nIG5nYW5nXG4gICAgY29uc3QgZGlyZWN0aW9uWFRvRW5kID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoY29vcmRRMS54ID8/IDAsIGVuZFBvc2l0aW9uLngsICd4Jyk7XG4gICAgY29uc3QgcGF0aEhvcml6b250YWw6IElQb2ludHNbXSA9IFtdO1xuICAgIGNvbnN0IGVuZFBhdGggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja0FuZEF2b2lkQmxvY2tzTGVmdChjb29yZFExLnggPz8gMCwgY29vcmRRMS55ID8/IDAsIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb24sIG9ic3RhY2xlUmVjdCwgcGF0aEhvcml6b250YWwpO1xuXG4gICAgaWYgKGRpcmVjdGlvblhUb0VuZCA9PT0gJ2xlZnQnICYmIGVuZFBhdGgueCA+IChjb29yZFExLnggPz8gMCkpIHtcbiAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLCBlbmQ6IGVuZFBvc2l0aW9uLCBtb2RlOiAndmVydGljYWwnLCBpZDogJzZhICcgKyBkaXJlY3Rpb25TdGFydFkgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW5kID0geyB4OiAoY29vcmRRMS54ID8/IDApLCB5OiBjb29yZFExLnkgPz8gMCB9O1xuXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goLi4ucGF0aEhvcml6b250YWwpO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLCBlbmQ6IGVuZCwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnNmEgJyArIGRpcmVjdGlvblN0YXJ0WSB9KTsgLy8gZ8OzYyBjb25nIHThu6sgxJHGsOG7nW5nIHRo4bqzbmcgc2FuZyBuZ2FuZ1xuICAgIGlmIChlbmRQYXRoLnggPT09IGVuZFBvc2l0aW9uLnggJiYgZW5kUGF0aC55IDwgZW5kUG9zaXRpb24ueSkge1xuICAgICAgY29uc3QgaXRlbUxhc3QgPSBwYXRoSG9yaXpvbnRhbC5maW5kKGl0ZW0gPT4gaXRlbS5lbmQueCA9PT0gZW5kUGF0aC54KTtcblxuICAgICAgaWYgKGl0ZW1MYXN0KSB7XG4gICAgICAgIGl0ZW1MYXN0LmVuZC54ID0gZW5kUG9zaXRpb24ueCArIDUwO1xuICAgICAgICBlbmRQYXRoLnggPSBpdGVtTGFzdC5lbmQueDtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogZW5kUGF0aCwgZW5kOiB7IHg6IHBvaW50TmV4dC54LCB5OiBwb2ludE5leHQueSB9LCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAnbGluZUVuZCcgfSk7XG4gIH1cblxuICBzdGF0aWMgcmlnaHRMZWZ0KGVsZW1lbnROZXh0OiBJUmVjdCwgc3RhcnQ6IElQb2ludCwgbGluZUN1cnZlOiBudW1iZXIsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uID0ge1xuICAgICAgeDogZWxlbWVudE5leHQueCxcbiAgICAgIHk6IGVsZW1lbnROZXh0LnlcbiAgICB9O1xuXG4gICAgLy8gduG6vSAxIMSRxrDhu51uZyB0aOG6s25nIHThu6sgxJFp4buDbSBzdGFydCByYSBuZ2/DoGkgxJHDo1xuICAgIGNvbnN0IGVuZCA9IHsgeDogKHN0YXJ0LnggPz8gMCkgKyAxMCwgeTogKHN0YXJ0LnkgPz8gMCkgKyAxMCB9O1xuXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiAoc3RhcnQueCA/PyAwKSwgeTogc3RhcnQueSA/PyAwIH0sIGVuZDogZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICcxJyB9KTtcblxuICAgIGNvbnN0IGVuZFBvc2l0aW9uWCA9IGNsb25lRGVlcChlbmRQb3NpdGlvbik7XG5cbiAgICBlbmRQb3NpdGlvblgueCAtPSA1MDtcblxuICAgIGxldCBzZXBhcmF0ZWRQb2ludHNDaGVja0FuZEF2b2lkQmxvY2tzOiBBcnJheTxJUG9pbnRzPiA9IFtdO1xuXG4gICAgbGV0IHsgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2NrcyhlbmQueCA/PyAwLCAoZW5kLnkgPz8gMCksIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb25YLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKE1hdGguYWJzKChzdGFydC54ID8/IDApIC0gZW5kUG9zaXRpb24ueCkgPCAxMCB8fCBlbmQueCA+IGVuZFBhdGgueCkge1xuICAgICAgZW5kUGF0aCA9IHtcbiAgICAgICAgeDogZW5kLngsXG4gICAgICAgIHk6IGVuZC55XG4gICAgICB9O1xuXG4gICAgICBzZXBhcmF0ZWRQb2ludHNDaGVja0FuZEF2b2lkQmxvY2tzID0gW107XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChlbmRQYXRoLnkgPz8gMCkgLSBlbmRQb3NpdGlvbi55KSA8IDE1KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gc2VwYXJhdGVkUG9pbnRzQ2hlY2tBbmRBdm9pZEJsb2Nrcy5maW5kKGl0ZW0gPT4gKGl0ZW0uZW5kLnkgPT09IGVuZFBhdGgueSAmJiBpdGVtLmVuZC54ID09PSBlbmRQYXRoLngpKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRRUiA9IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MuZmluZChpdGVtID0+IChpdGVtLmVuZC55ID09PSBlbGVtZW50Py5zdGFydC55ICYmIGl0ZW0uZW5kLnggPT09IGVsZW1lbnQuc3RhcnQueCkpO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnN0YXJ0LnkgPSBlbmRQb3NpdGlvbi55O1xuICAgICAgICBlbGVtZW50LmVuZC55ID0gZW5kUG9zaXRpb24ueTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50UVIpIHtcbiAgICAgICAgZWxlbWVudFFSLmVuZC55ID0gZW5kUG9zaXRpb24ueTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMuc3BsaWNlKHNlcGFyYXRlZFBvaW50cy5sZW5ndGgsIDAsIC4uLnNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKGVuZFBhdGgueSA9PT0gZW5kUG9zaXRpb24ueSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55IH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsJyB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTWF0aC5hYnMoKGVuZFBhdGgueSA/PyAwKSAtIGVuZFBvc2l0aW9uLnkpIDwgMTUpIHtcbiAgICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogZW5kUGF0aC54ID8/IDAsIHk6IGVuZFBhdGgueSB9LCBlbmQ6IGVuZFBvc2l0aW9uLCBtb2RlOiAndmVydGljYWwnIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gLy8gc2F1IGtoaSDEkcOjIMSRaSBuZ2FuZyB2w6AgdHLDoW5oIGPDoWMga2jhu5FpLCB0aeG6v3AgdGhlbyBsw6AgxJFpIHRp4bq/cCBoxrDhu5tuZyBsw6puIHh14buRbmcgxJHhu4MgduG7gSBraOG7kWkgY+G6p24gbuG7kWkgdOG7m2ksIGPhuqduIGNoZWNrIHhlbSDEkWnhu4NtIGVuZCBYIG7DsyDEkWFuZyDhu58gaMaw4bubbmcgbsOgb1xuICAgIGNvbnN0IGRpcmVjdGlvblkgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChlbmRQYXRoLnksIGVuZFBvc2l0aW9uLnksICd5Jyk7XG5cbiAgICBjb25zdCBjb29yZFExID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuZHJhd0xpbmVRKHsgeDogZW5kUGF0aC54ID8/IDAsIHk6IGVuZFBhdGgueSA/PyAwIH0sIGByaWdodC0ke2RpcmVjdGlvblkgPT09ICdhYm92ZScgPyAnYWJvdmUnIDogJ3VuZGVyJ31gLCBsaW5lQ3VydmUsIGxpbmVDdXJ2ZSk7IC8vIHTDrW5oIMSRb+G6oW4gY29uZyB04burIMSRxrDhu51uZyBuZ2FuZyBzYW5nIMSRxrDhu51uZyB0aOG6s25nXG4gICAgY29uc3QgZW5kUG9zaXRpb25ZID0gY2xvbmVEZWVwKGVuZFBvc2l0aW9uKTtcblxuICAgIGVuZFBvc2l0aW9uWS55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgZW5kUG9zaXRpb25ZLnksIGxpbmVDdXJ2ZSk7XG5cbiAgICAvLyAvLyBj4bqnbiBjaGVjayBraGkgxJFpIHRo4bqzbmcgbMOqbiBjw7Mgdsaw4bubbmcga2jhu5FpIG7DoG8ga2jDtG5nIMSR4buDIHRp4bq/biBsw6puLCBuaMawbmcgY+G6p24gcGjhuqNpIHhlbSB4IGPhu6dhIG7DsyBjw7MgcXXDoSBn4bqnbiBlbmRYIGtow7RuZywgZ+G6p24gcXXDoSB0aMOsIFxuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tCbG9ja3NFbGVtZW50U3RyYWlnaHRZKChlbmRQYXRoLnggPz8gMCkgKyAxMCwgZW5kUGF0aC55ID8/IDAsIGVuZFBvc2l0aW9uWSwgb2JzdGFjbGVSZWN0KTtcblxuICAgIGlmIChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWSkge1xuICAgICAgY29vcmRRMS54ID0gKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLnggPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkud2lkdGggPz8gMCkgKyBsaW5lQ3VydmU7XG4gICAgfVxuICAgIGlmIChNYXRoLmFicygoY29vcmRRMS54ID8/IDApIC0gZW5kUG9zaXRpb24ueCkgPCAyMCAmJiBkaXJlY3Rpb25ZID09PSAndW5kZXInKSB7XG4gICAgICBjb29yZFExLnggPSBlbmRQb3NpdGlvbi54ICsgMjA7IC8vIHRyxrDhu51uZyBo4bujcCByaWdodCBxdWF5IHh14buRbmcgZMaw4bubaSDEkWnhu4NtIGVuZCBraMOhIGfhuqduIMSRaeG7g20gc3RhcnQgPT4ga2jDtG5nIMSR4bunIGtob+G6o25nIGPDoWNoIHF1YXkgbcWpaSB0w6puIHbDoG9cbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55IH0sIGVuZDogeyB4OiBjb29yZFExLnggPz8gMCwgeTogKGNvb3JkUTEueSA/PyAwKSB9LCBtb2RlOiAnaG9yaXpvbnRhbC1zaW5nbGUtY3VydmUnLCBpZDogJ2cnIH0pO1xuXG4gICAgbGV0IGF2b2lkQmxvY2tzWUxpbmU6IElQb2ludHNbXSA9IFtdO1xuICAgIGNvbnN0IHN0cmFpZ2h0TGluZSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrQW5kQXZvaWRCbG9ja3NZKGNvb3JkUTEueCA/PyAwLCBjb29yZFExLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvblksIGRpcmVjdGlvblksIG9ic3RhY2xlUmVjdCwgYXZvaWRCbG9ja3NZTGluZSk7XG5cbiAgICBpZiAoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiAoY29vcmRRMS55ID8/IDApID4gZW5kUG9zaXRpb25ZLnkpIHtcbiAgICAgIGF2b2lkQmxvY2tzWUxpbmUgPSBbXTtcbiAgICAgIHN0cmFpZ2h0TGluZS5lbmRQYXRoID0geyB4OiBjb29yZFExLnggPz8gMCwgeTogY29vcmRRMS55ID8/IDAgfTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvblkgPT09ICdhYm92ZScgJiYgc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA8PSBlbmRQb3NpdGlvbi55KSB7XG4gICAgICBhdm9pZEJsb2Nrc1lMaW5lID0gW107XG4gICAgICBzdHJhaWdodExpbmUuZW5kUGF0aCA9IHsgeDogY29vcmRRMS54ID8/IDAsIHk6IGNvb3JkUTEueSA/PyAwIH07XG4gICAgfVxuICAgIGlmIChNYXRoLmFicygoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwKSAtIGVuZFBvc2l0aW9uLngpIDwgMTUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXZvaWRCbG9ja3NZTGluZS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggfHwgaXRlbS5lbmQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCk7XG5cbiAgICAgIGVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpIHtcbiAgICAgICAgICBpdGVtLnN0YXJ0LnggKz0gMzA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0uZW5kLnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpIHtcbiAgICAgICAgICBpdGVtLmVuZC54ICs9IDMwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCguLi5hdm9pZEJsb2Nrc1lMaW5lKTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCwgeTogc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwIH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnLCBpZDogJzQnIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG59Il19
@@ -107,19 +107,21 @@ class MoCanvasCalculatorDirectionElementUtil {
107
107
  x: Q1.x ?? 0,
108
108
  y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)
109
109
  };
110
- if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)
111
- || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {
112
- L1.y = Q1.y ?? 0;
113
- }
114
- if (Math.abs((L1.y ?? 0) - endY) <= 10) {
115
- L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);
110
+ if (MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
111
+ if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)
112
+ || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {
113
+ L1.y = Q1.y ?? 0;
114
+ }
115
+ if (Math.abs((L1.y ?? 0) - endY) <= 10) {
116
+ L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);
117
+ }
116
118
  }
117
119
  const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);
118
120
  const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
119
121
  const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
120
122
  separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });
121
- separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal', id: key, name: 'lr' });
122
- separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });
123
+ separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y }, mode: 'horizontal', id: key, name: 'lr' });
124
+ separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });
123
125
  return {
124
126
  pathByPassQ: `${pathQ1} ${pathQ2}`,
125
127
  endPath: {
@@ -204,15 +206,12 @@ class MoCanvasCalculatorDirectionElementUtil {
204
206
  return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);
205
207
  }
206
208
  // kiểm tra hướng sang phải là tránh khối
207
- static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
209
+ static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints) {
208
210
  const coordLX = { x: endPosition.x, y: startY };
209
211
  const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
210
212
  if (!elementBlockRoad) {
211
213
  separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });
212
- return {
213
- path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
214
- endPath: coordLX
215
- };
214
+ return coordLX;
216
215
  }
217
216
  const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
218
217
  const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));
@@ -225,14 +224,17 @@ class MoCanvasCalculatorDirectionElementUtil {
225
224
  coordLX.x = startX;
226
225
  startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);
227
226
  }
228
- const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPoints, undefined, coordLX.x);
229
- const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;
227
+ let lineByPassBlock = [];
228
+ let { endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, lineByPassBlock, undefined, coordLX.x);
229
+ if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left' && elementBlockRoad.x + (elementBlockRoad.width) / 2 === endPosition.x && Math.abs(endPosition.y - elementBlockRoad.y) <= 20) { // check xem khối chắn có phải là khối đích hay không?
230
+ lineByPassBlock = [];
231
+ const data = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSideNewMode(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineByPassBlock, undefined, coordLX.x);
232
+ endPath = data.endPath;
233
+ }
234
+ separatedPoints.push(...lineByPassBlock);
230
235
  separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });
231
- const data = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`);
232
- return {
233
- path: data.path,
234
- endPath: data.endPath
235
- };
236
+ const dataEndPath = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
237
+ return dataEndPath;
236
238
  }
237
239
  // kiểm tra hướng sang phải là tránh khối
238
240
  static checkAndAvoidBlocks(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
@@ -247,7 +249,7 @@ class MoCanvasCalculatorDirectionElementUtil {
247
249
  }
248
250
  coordLX.x = toX;
249
251
  }
250
- separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'w' });
252
+ separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'end' });
251
253
  return {
252
254
  path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
253
255
  endPath: coordLX
@@ -325,7 +327,7 @@ class MoCanvasCalculatorDirectionElementUtil {
325
327
  const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);
326
328
  let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);
327
329
  toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);
328
- if (toY > startY) {
330
+ if (toY > startY && MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
329
331
  coordLX.y = toY;
330
332
  }
331
333
  }
@@ -364,6 +366,15 @@ class MoCanvasCalculatorDirectionElementUtil {
364
366
  endPath: data.endPath
365
367
  };
366
368
  }
369
+ static byPassElementOnRightSideNewMode(startX, startY, endY, separatedPoints, key, coordLX) {
370
+ const start = { x: coordLX ?? startX, y: startY };
371
+ const end = { x: (start.x ?? 0) - 20, y: endY };
372
+ separatedPoints.push({ start: start, end: end, mode: 'horizontal', id: key, name: 'q2r' });
373
+ return {
374
+ pathByPassQ: ``,
375
+ endPath: end
376
+ };
377
+ }
367
378
  }
368
379
 
369
380
  class MoCanvasConnectNavigationBottomLeftElementUtil {
@@ -399,7 +410,6 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
399
410
  const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');
400
411
  const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);
401
412
  elements.forEach(item => {
402
- console.log('directionStartX', directionStartX);
403
413
  if (item.start.x === straightLine.endPath.x) {
404
414
  item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));
405
415
  }
@@ -409,34 +419,31 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
409
419
  });
410
420
  }
411
421
  // // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1
412
- const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
422
+ const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
413
423
  const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');
414
424
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
415
- if (elementBlockRoad) {
425
+ const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);
426
+ if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {
416
427
  coordQ1.x1 = straightLine.endPath.x ?? 0;
417
428
  coordQ1.y1 = straightLine.endPath.y ?? 0;
418
429
  coordQ1.x = straightLine.endPath.x ?? 0;
419
430
  coordQ1.y = straightLine.endPath.y ?? 0;
420
431
  }
421
432
  // kiểm tra và vẽ hướng ngang
422
- const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPositionOrigin.x, 'x');
423
- endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);
424
- if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {
425
- endPosition.y -= lineCurve;
426
- }
433
+ const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');
427
434
  const pathHorizontal = [];
428
- const { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionOrigin, obstacleRect, pathHorizontal);
435
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
429
436
  if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
430
- separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });
437
+ separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });
431
438
  return;
432
439
  }
433
440
  const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };
434
- separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
435
441
  separatedPoints.push(...pathHorizontal);
436
- if (endPath.x === endPositionOrigin.x && endPath.y < endPositionOrigin.y) {
442
+ separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
443
+ if (endPath.x === endPosition.x && endPath.y < endPosition.y) {
437
444
  const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);
438
445
  if (itemLast) {
439
- itemLast.end.x = endPositionOrigin.x + 50;
446
+ itemLast.end.x = endPosition.x + 50;
440
447
  endPath.x = itemLast.end.x;
441
448
  }
442
449
  }
@@ -462,21 +469,25 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
462
469
  separatedPointsCheckAndAvoidBlocks = [];
463
470
  }
464
471
  if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
465
- const elements = separatedPointsCheckAndAvoidBlocks.filter(item => item.start.y === endPath.y || item.end.y === endPath.y);
466
- elements.forEach(item => {
467
- if (item.start.y === endPath.y) {
468
- item.start.y -= 10;
469
- }
470
- if (item.end.y === endPath.y) {
471
- item.end.y -= 10;
472
- }
473
- });
472
+ const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));
473
+ const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));
474
+ if (element) {
475
+ element.start.y = endPosition.y;
476
+ element.end.y = endPosition.y;
477
+ }
478
+ if (elementQR) {
479
+ elementQR.end.y = endPosition.y;
480
+ }
474
481
  }
475
482
  separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);
476
483
  if (endPath.y === endPosition.y) {
477
484
  separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });
478
485
  return;
479
486
  }
487
+ if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
488
+ separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });
489
+ return;
490
+ }
480
491
  // // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào
481
492
  const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');
482
493
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
@@ -629,21 +640,18 @@ class MoCanvasConnectNavigationNewElementUtil {
629
640
  endPosition.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endY, (lineCurve * 2));
630
641
  const pathQ = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: (start.x ?? 0) + 10, y: start.y ?? 0 }, `right-${directionStartY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);
631
642
  const startQL = { lx: pathQ.x, ly: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, (pathQ.y ?? 0), ((elementFrom.height ?? 0) / 2), true) };
632
- const dPathStart = `Q ${pathQ.x1} ${pathQ.y1} ${pathQ.x} ${pathQ.y} L ${startQL.lx} ${startQL.ly}`;
633
643
  separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, mode: 'horizontal-single-curve', id: '1' });
634
644
  separatedPoints.push({ start: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, end: { x: startQL.lx ?? 0, y: startQL.ly }, mode: 'horizontal', id: '2' });
635
645
  if (directionStartY === 'center') {
636
646
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
637
- const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong
638
647
  separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });
639
- const { path, endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
648
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
640
649
  const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
641
650
  const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
642
- const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`; // từ ngang sang thẳng phải có đường cong
643
651
  separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });
644
- const lineClose = this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);
652
+ this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);
645
653
  return {
646
- dPath: `${dPathStart} ${pathQ1} ${path} ${pathQ2} ${lineClose}`,
654
+ dPath: ``,
647
655
  };
648
656
  }
649
657
  const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startQL.lx ?? 0, startQL.ly ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);
@@ -684,7 +692,7 @@ class MoCanvasConnectNavigationNewElementUtil {
684
692
  coordQ1.y = straightLine.endPath.y ?? 0;
685
693
  }
686
694
  separatedPoints.push({ start: straightLine.endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });
687
- const { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
695
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
688
696
  const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
689
697
  const directionNextY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPath.x, 'x');
690
698
  const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `${directionNextY}-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
@@ -749,7 +757,7 @@ class MoCanvasConnectNavigationNewElementUtil {
749
757
  const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
750
758
  // từ ngang sang thẳng phải có đường cong
751
759
  separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });
752
- const { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
760
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
753
761
  const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
754
762
  const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
755
763
  // từ ngang sang thẳng phải có đường cong
@@ -803,7 +811,7 @@ class MoCanvasConnectNavigationNewElementUtil {
803
811
  endPosition.y -= lineCurve;
804
812
  }
805
813
  const pathHorizontal = [];
806
- const { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
814
+ const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
807
815
  if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
808
816
  separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });
809
817
  this.closeLineWithLineTopBottom(endPositionOrigin, endPositionOrigin, lineCurve, elementNext, separatedPoints);
@@ -1283,7 +1291,7 @@ class LibsUiComponentsDrawLineDirective {
1283
1291
  };
1284
1292
  const pointEnd = cloneDeep(points.end);
1285
1293
  const arrowElement = points.arrowElement;
1286
- const direction = data.arrowDirection || this.getDirection(points, mode);
1294
+ const direction = data.arrowDirection || this.getDirection(points, data.startEndMode);
1287
1295
  switch (direction) {
1288
1296
  case 'right':
1289
1297
  if (mode.includes('horizontal') || mode.includes('vertical')) {
@@ -1324,7 +1332,7 @@ class LibsUiComponentsDrawLineDirective {
1324
1332
  circleElement.setAttribute('stroke-width', `${circleStyle?.strokeWidth ?? '1px'}`);
1325
1333
  return circleElement;
1326
1334
  }
1327
- getDirection(points, mode) {
1335
+ getDirection(points, startEndMode) {
1328
1336
  let pointStart = { ...points.start };
1329
1337
  if (points.separatedPoints) {
1330
1338
  const lineToEnd = points.separatedPoints.find(item => item.end.x === points.end.x && item.end.y === points.end.y);
@@ -1334,10 +1342,20 @@ class LibsUiComponentsDrawLineDirective {
1334
1342
  }
1335
1343
  const modeHorizontal = pointStart.x < points.end.x ? 'right' : 'left';
1336
1344
  const modeVertical = pointStart.y < points.end.y ? 'bottom' : 'top';
1337
- if (Math.abs(points.end.x - pointStart.x) > Math.abs(points.end.y - pointStart.y)) {
1338
- return modeHorizontal;
1345
+ if (!startEndMode) {
1346
+ if (Math.abs(points.end.x - pointStart.x) > Math.abs(points.end.y - pointStart.y)) {
1347
+ return modeHorizontal;
1348
+ }
1349
+ return modeVertical;
1350
+ }
1351
+ switch (startEndMode) {
1352
+ case 'bottom-left':
1353
+ return modeHorizontal;
1354
+ case 'right-left':
1355
+ return modeHorizontal;
1356
+ case 'bottom-top':
1357
+ return modeVertical;
1339
1358
  }
1340
- return modeVertical;
1341
1359
  }
1342
1360
  initEvent(data) {
1343
1361
  const points = data.points;