@plait/draw 0.77.2 → 0.78.0-next.0

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.
Files changed (156) hide show
  1. package/fesm2022/plait-draw.mjs +21 -14
  2. package/fesm2022/plait-draw.mjs.map +1 -1
  3. package/package.json +1 -3
  4. package/transforms/image.d.ts +6 -0
  5. package/utils/hit.d.ts +1 -1
  6. package/esm2022/arrow-line.component.mjs +0 -165
  7. package/esm2022/constants/default.mjs +0 -7
  8. package/esm2022/constants/geometry.mjs +0 -272
  9. package/esm2022/constants/image.mjs +0 -2
  10. package/esm2022/constants/index.mjs +0 -9
  11. package/esm2022/constants/line.mjs +0 -12
  12. package/esm2022/constants/pointer.mjs +0 -23
  13. package/esm2022/constants/swimlane.mjs +0 -25
  14. package/esm2022/constants/text.mjs +0 -2
  15. package/esm2022/constants/theme.mjs +0 -28
  16. package/esm2022/engines/basic-shapes/cloud.mjs +0 -146
  17. package/esm2022/engines/basic-shapes/comment.mjs +0 -56
  18. package/esm2022/engines/basic-shapes/cross.mjs +0 -33
  19. package/esm2022/engines/basic-shapes/diamond.mjs +0 -16
  20. package/esm2022/engines/basic-shapes/ellipse.mjs +0 -53
  21. package/esm2022/engines/basic-shapes/hexagon.mjs +0 -27
  22. package/esm2022/engines/basic-shapes/left-arrow.mjs +0 -30
  23. package/esm2022/engines/basic-shapes/octagon.mjs +0 -29
  24. package/esm2022/engines/basic-shapes/parallelogram.mjs +0 -26
  25. package/esm2022/engines/basic-shapes/pentagon-arrow.mjs +0 -27
  26. package/esm2022/engines/basic-shapes/pentagon.mjs +0 -30
  27. package/esm2022/engines/basic-shapes/polygon.mjs +0 -56
  28. package/esm2022/engines/basic-shapes/process-arrow.mjs +0 -26
  29. package/esm2022/engines/basic-shapes/rectangle.mjs +0 -26
  30. package/esm2022/engines/basic-shapes/right-arrow.mjs +0 -28
  31. package/esm2022/engines/basic-shapes/round-comment.mjs +0 -82
  32. package/esm2022/engines/basic-shapes/round-rectangle.mjs +0 -58
  33. package/esm2022/engines/basic-shapes/star.mjs +0 -39
  34. package/esm2022/engines/basic-shapes/trapezoid.mjs +0 -26
  35. package/esm2022/engines/basic-shapes/triangle.mjs +0 -34
  36. package/esm2022/engines/basic-shapes/two-way-arrow.mjs +0 -25
  37. package/esm2022/engines/flowchart/database.mjs +0 -84
  38. package/esm2022/engines/flowchart/delay.mjs +0 -44
  39. package/esm2022/engines/flowchart/display.mjs +0 -74
  40. package/esm2022/engines/flowchart/document.mjs +0 -81
  41. package/esm2022/engines/flowchart/hard-disk.mjs +0 -84
  42. package/esm2022/engines/flowchart/internal-storage.mjs +0 -47
  43. package/esm2022/engines/flowchart/manual-input.mjs +0 -33
  44. package/esm2022/engines/flowchart/manual-loop.mjs +0 -26
  45. package/esm2022/engines/flowchart/merge.mjs +0 -34
  46. package/esm2022/engines/flowchart/multi-document.mjs +0 -143
  47. package/esm2022/engines/flowchart/note-curly-left.mjs +0 -86
  48. package/esm2022/engines/flowchart/note-curly-right.mjs +0 -89
  49. package/esm2022/engines/flowchart/note-square.mjs +0 -46
  50. package/esm2022/engines/flowchart/off-page.mjs +0 -32
  51. package/esm2022/engines/flowchart/or.mjs +0 -20
  52. package/esm2022/engines/flowchart/predefined-process.mjs +0 -47
  53. package/esm2022/engines/flowchart/preparation.mjs +0 -27
  54. package/esm2022/engines/flowchart/stored-data.mjs +0 -79
  55. package/esm2022/engines/flowchart/summing-junction.mjs +0 -23
  56. package/esm2022/engines/flowchart/terminal.mjs +0 -68
  57. package/esm2022/engines/index.mjs +0 -130
  58. package/esm2022/engines/table/table.mjs +0 -101
  59. package/esm2022/engines/uml/activity-class.mjs +0 -47
  60. package/esm2022/engines/uml/actor.mjs +0 -119
  61. package/esm2022/engines/uml/assembly.mjs +0 -105
  62. package/esm2022/engines/uml/combined-fragment.mjs +0 -66
  63. package/esm2022/engines/uml/component-box.mjs +0 -61
  64. package/esm2022/engines/uml/component.mjs +0 -117
  65. package/esm2022/engines/uml/container.mjs +0 -44
  66. package/esm2022/engines/uml/deletion.mjs +0 -54
  67. package/esm2022/engines/uml/note.mjs +0 -58
  68. package/esm2022/engines/uml/package.mjs +0 -105
  69. package/esm2022/engines/uml/provided-interface.mjs +0 -92
  70. package/esm2022/engines/uml/required-interface.mjs +0 -81
  71. package/esm2022/engines/uml/template.mjs +0 -47
  72. package/esm2022/generators/arrow-line-auto-complete.generator.mjs +0 -46
  73. package/esm2022/generators/arrow-line.generator.mjs +0 -13
  74. package/esm2022/generators/geometry-shape.generator.mjs +0 -29
  75. package/esm2022/generators/index.mjs +0 -7
  76. package/esm2022/generators/line-active.generator.mjs +0 -84
  77. package/esm2022/generators/single-text.generator.mjs +0 -16
  78. package/esm2022/generators/table.generator.mjs +0 -25
  79. package/esm2022/generators/text.generator.mjs +0 -131
  80. package/esm2022/generators/vector-line-generator.mjs +0 -13
  81. package/esm2022/geometry.component.mjs +0 -145
  82. package/esm2022/image.component.mjs +0 -67
  83. package/esm2022/interfaces/arrow-line.mjs +0 -70
  84. package/esm2022/interfaces/element.mjs +0 -9
  85. package/esm2022/interfaces/engine.mjs +0 -2
  86. package/esm2022/interfaces/geometry.mjs +0 -82
  87. package/esm2022/interfaces/image.mjs +0 -2
  88. package/esm2022/interfaces/index.mjs +0 -92
  89. package/esm2022/interfaces/line.mjs +0 -2
  90. package/esm2022/interfaces/options.mjs +0 -2
  91. package/esm2022/interfaces/swimlane.mjs +0 -13
  92. package/esm2022/interfaces/table.mjs +0 -13
  93. package/esm2022/interfaces/text.mjs +0 -2
  94. package/esm2022/interfaces/vector-line.mjs +0 -10
  95. package/esm2022/plait-draw.mjs +0 -5
  96. package/esm2022/plugins/with-arrow-line-auto-complete-reaction.mjs +0 -43
  97. package/esm2022/plugins/with-arrow-line-auto-complete.mjs +0 -76
  98. package/esm2022/plugins/with-arrow-line-bound-reaction.mjs +0 -53
  99. package/esm2022/plugins/with-arrow-line-create.mjs +0 -51
  100. package/esm2022/plugins/with-arrow-line-resize.mjs +0 -158
  101. package/esm2022/plugins/with-arrow-line-text-move.mjs +0 -53
  102. package/esm2022/plugins/with-arrow-line-text.mjs +0 -73
  103. package/esm2022/plugins/with-draw-fragment.mjs +0 -98
  104. package/esm2022/plugins/with-draw-hotkey.mjs +0 -45
  105. package/esm2022/plugins/with-draw-resize.mjs +0 -269
  106. package/esm2022/plugins/with-draw-rotate.mjs +0 -132
  107. package/esm2022/plugins/with-draw.mjs +0 -144
  108. package/esm2022/plugins/with-geometry-create.mjs +0 -182
  109. package/esm2022/plugins/with-swimlane-create.mjs +0 -127
  110. package/esm2022/plugins/with-swimlane.mjs +0 -21
  111. package/esm2022/plugins/with-table-resize.mjs +0 -135
  112. package/esm2022/plugins/with-table.mjs +0 -109
  113. package/esm2022/plugins/with-vector-line-create.mjs +0 -85
  114. package/esm2022/plugins/with-vector-line-resize.mjs +0 -61
  115. package/esm2022/public-api.mjs +0 -11
  116. package/esm2022/table.component.mjs +0 -162
  117. package/esm2022/transforms/arrow-line.mjs +0 -66
  118. package/esm2022/transforms/common.mjs +0 -36
  119. package/esm2022/transforms/geometry-text.mjs +0 -59
  120. package/esm2022/transforms/geometry.mjs +0 -43
  121. package/esm2022/transforms/image.mjs +0 -22
  122. package/esm2022/transforms/index.mjs +0 -36
  123. package/esm2022/transforms/multi-text-geometry-text.mjs +0 -15
  124. package/esm2022/transforms/swimlane.mjs +0 -164
  125. package/esm2022/transforms/table-text.mjs +0 -44
  126. package/esm2022/transforms/table.mjs +0 -36
  127. package/esm2022/transforms/vector-line.mjs +0 -13
  128. package/esm2022/utils/arrow-line/arrow-line-arrow.mjs +0 -123
  129. package/esm2022/utils/arrow-line/arrow-line-basic.mjs +0 -205
  130. package/esm2022/utils/arrow-line/arrow-line-common.mjs +0 -162
  131. package/esm2022/utils/arrow-line/arrow-line-resize.mjs +0 -309
  132. package/esm2022/utils/arrow-line/elbow.mjs +0 -114
  133. package/esm2022/utils/arrow-line/index.mjs +0 -6
  134. package/esm2022/utils/clipboard.mjs +0 -55
  135. package/esm2022/utils/common.mjs +0 -184
  136. package/esm2022/utils/geometry.mjs +0 -178
  137. package/esm2022/utils/hit.mjs +0 -242
  138. package/esm2022/utils/index.mjs +0 -17
  139. package/esm2022/utils/line.mjs +0 -64
  140. package/esm2022/utils/memorize.mjs +0 -93
  141. package/esm2022/utils/multi-text-geometry.mjs +0 -61
  142. package/esm2022/utils/polygon.mjs +0 -30
  143. package/esm2022/utils/position/arrow-line.mjs +0 -20
  144. package/esm2022/utils/position/geometry.mjs +0 -30
  145. package/esm2022/utils/position/line.mjs +0 -51
  146. package/esm2022/utils/selected.mjs +0 -39
  147. package/esm2022/utils/shape.mjs +0 -11
  148. package/esm2022/utils/snap-resizing.mjs +0 -185
  149. package/esm2022/utils/style/index.mjs +0 -2
  150. package/esm2022/utils/style/stroke.mjs +0 -21
  151. package/esm2022/utils/swimlane.mjs +0 -124
  152. package/esm2022/utils/table-selected.mjs +0 -21
  153. package/esm2022/utils/table.mjs +0 -172
  154. package/esm2022/utils/uml.mjs +0 -90
  155. package/esm2022/utils/vector-line.mjs +0 -71
  156. package/esm2022/vector-line.component.mjs +0 -55
@@ -1,205 +0,0 @@
1
- import { idCreator, PlaitBoard, createG, RectangleClient, findElements, drawLinearPath, createMask, createRect, distanceBetweenPointAndPoint, catmullRomFitting, setStrokeLinecap } from '@plait/core';
2
- import { pointsOnBezierCurves } from 'points-on-curve';
3
- import { getPointOnPolyline, getPointByVectorComponent, removeDuplicatePoints, getExtendPoint, getStrokeLineDash, StrokeStyle } from '@plait/common';
4
- import { ArrowLineMarkerType, ArrowLineShape, PlaitArrowLine, PlaitDrawElement } from '../../interfaces';
5
- import { getStrokeColorByElement, getStrokeStyleByElement } from '../style/stroke';
6
- import { getEngine } from '../../engines';
7
- import { getElementShape } from '../shape';
8
- import { DefaultLineStyle, LINE_TEXT_SPACE } from '../../constants/line';
9
- import { LINE_SNAPPING_CONNECTOR_BUFFER } from '../../constants';
10
- import { getLineMemorizedLatest } from '../memorize';
11
- import { alignPoints } from './arrow-line-resize';
12
- import { getArrowLineHandleRefPair } from './arrow-line-common';
13
- import { getElbowPoints } from './elbow';
14
- import { drawArrowLineArrow } from './arrow-line-arrow';
15
- import { getSnappingRef, getSnappingShape, getStrokeWidthByElement } from '../common';
16
- import { ArrowLineShapeGenerator } from '../../generators/arrow-line.generator';
17
- export const createArrowLineElement = (shape, points, source, target, texts, options) => {
18
- return {
19
- id: idCreator(),
20
- type: 'arrow-line',
21
- shape,
22
- source,
23
- texts: texts ? texts : [],
24
- target,
25
- opacity: 1,
26
- points,
27
- ...options
28
- };
29
- };
30
- export const getArrowLinePoints = (board, element) => {
31
- switch (element.shape) {
32
- case ArrowLineShape.elbow: {
33
- return getElbowPoints(board, element);
34
- }
35
- case ArrowLineShape.curve: {
36
- return getCurvePoints(board, element);
37
- }
38
- default: {
39
- const points = PlaitArrowLine.getPoints(board, element);
40
- const handleRefPair = getArrowLineHandleRefPair(board, element);
41
- points[0] = handleRefPair.source.point;
42
- points[points.length - 1] = handleRefPair.target.point;
43
- return points;
44
- }
45
- }
46
- };
47
- export const getCurvePoints = (board, element) => {
48
- if (element.points.length === 2) {
49
- const handleRefPair = getArrowLineHandleRefPair(board, element);
50
- const { source, target } = handleRefPair;
51
- const sourceBoundElement = handleRefPair.source.boundElement;
52
- const targetBoundElement = handleRefPair.target.boundElement;
53
- let curvePoints = [source.point];
54
- const sumDistance = distanceBetweenPointAndPoint(...source.point, ...target.point);
55
- const offset = 12 + sumDistance / 3;
56
- if (sourceBoundElement) {
57
- curvePoints.push(getPointByVectorComponent(source.point, source.vector, offset));
58
- }
59
- if (targetBoundElement) {
60
- curvePoints.push(getPointByVectorComponent(target.point, target.vector, offset));
61
- }
62
- const isSingleBound = (sourceBoundElement && !targetBoundElement) || (!sourceBoundElement && targetBoundElement);
63
- if (isSingleBound) {
64
- curvePoints.push(target.point);
65
- const points = Q2C(curvePoints);
66
- return pointsOnBezierCurves(points);
67
- }
68
- if (!sourceBoundElement && !targetBoundElement) {
69
- curvePoints.push(getPointByVectorComponent(source.point, source.vector, offset));
70
- curvePoints.push(getPointByVectorComponent(target.point, target.vector, offset));
71
- }
72
- curvePoints.push(target.point);
73
- return pointsOnBezierCurves(curvePoints);
74
- }
75
- else {
76
- let dataPoints = PlaitArrowLine.getPoints(board, element);
77
- dataPoints = removeDuplicatePoints(dataPoints);
78
- const points = catmullRomFitting(dataPoints);
79
- return pointsOnBezierCurves(points);
80
- }
81
- };
82
- export const drawArrowLine = (board, element) => {
83
- const strokeWidth = getStrokeWidthByElement(element);
84
- const strokeColor = getStrokeColorByElement(board, element);
85
- const strokeStyle = getStrokeStyleByElement(board, element);
86
- const strokeLineDash = getStrokeLineDash(strokeStyle, strokeWidth);
87
- const options = { stroke: strokeColor, strokeWidth, strokeLineDash };
88
- const lineG = createG();
89
- let points = getArrowLinePoints(board, element);
90
- let line;
91
- if (element.shape === ArrowLineShape.curve) {
92
- line = PlaitBoard.getRoughSVG(board).curve(points, options);
93
- }
94
- else {
95
- line = drawLinearPath(points, options);
96
- }
97
- const id = idCreator();
98
- line.setAttribute('mask', `url(#${id})`);
99
- if (element.strokeStyle === StrokeStyle.dotted) {
100
- setStrokeLinecap(line, 'round');
101
- }
102
- lineG.appendChild(line);
103
- const { mask, maskTargetFillRect } = drawArrowLineMask(board, element, id);
104
- lineG.appendChild(mask);
105
- line.appendChild(maskTargetFillRect);
106
- const arrow = drawArrowLineArrow(element, points, { stroke: strokeColor, strokeWidth });
107
- arrow && lineG.appendChild(arrow);
108
- return lineG;
109
- };
110
- export const getHitConnection = (board, point, hitElement) => {
111
- let rectangle = RectangleClient.getRectangleByPoints(hitElement.points);
112
- const ref = getSnappingRef(board, hitElement, point);
113
- const connectionPoint = ref.connectorPoint || ref.edgePoint;
114
- return [(connectionPoint[0] - rectangle.x) / rectangle.width, (connectionPoint[1] - rectangle.y) / rectangle.height];
115
- };
116
- export const getHitConnectorPoint = (point, hitElement) => {
117
- const rectangle = RectangleClient.getRectangleByPoints(hitElement.points);
118
- const shape = getElementShape(hitElement);
119
- const connectorPoints = getEngine(shape).getConnectorPoints(rectangle);
120
- return connectorPoints.find((connectorPoint) => {
121
- return distanceBetweenPointAndPoint(...connectorPoint, ...point) <= LINE_SNAPPING_CONNECTOR_BUFFER;
122
- });
123
- };
124
- export const getArrowLineTextRectangle = (board, element, index) => {
125
- const text = element.texts[index];
126
- const elbowPoints = getArrowLinePoints(board, element);
127
- const point = getPointOnPolyline(elbowPoints, text.position);
128
- return {
129
- x: point[0] - text.width / 2,
130
- y: point[1] - text.height / 2,
131
- width: text.width,
132
- height: text.height
133
- };
134
- };
135
- export const getArrowLines = (board) => {
136
- return findElements(board, {
137
- match: (element) => PlaitDrawElement.isArrowLine(element),
138
- recursion: (element) => PlaitDrawElement.isDrawElement(element)
139
- });
140
- };
141
- // quadratic Bezier to cubic Bezier
142
- export const Q2C = (points) => {
143
- const result = [];
144
- const numSegments = points.length / 3;
145
- for (let i = 0; i < numSegments; i++) {
146
- const start = points[i];
147
- const qControl = points[i + 1];
148
- const end = points[i + 2];
149
- const startDistance = distanceBetweenPointAndPoint(...start, ...qControl);
150
- const endDistance = distanceBetweenPointAndPoint(...end, ...qControl);
151
- const cControl1 = getExtendPoint(start, qControl, (startDistance * 2) / 3);
152
- const cControl2 = getExtendPoint(end, qControl, (endDistance * 2) / 3);
153
- result.push(start, cControl1, cControl2, end);
154
- }
155
- return result;
156
- };
157
- export const handleArrowLineCreating = (board, lineShape, sourcePoint, movingPoint, sourceElement, lineShapeG) => {
158
- const hitElement = getSnappingShape(board, movingPoint);
159
- const targetConnection = hitElement ? getHitConnection(board, movingPoint, hitElement) : undefined;
160
- const sourceConnection = sourceElement ? getHitConnection(board, sourcePoint, sourceElement) : undefined;
161
- const targetBoundId = hitElement ? hitElement.id : undefined;
162
- const lineGenerator = new ArrowLineShapeGenerator(board);
163
- const memorizedLatest = getLineMemorizedLatest();
164
- let sourceMarker, targetMarker;
165
- sourceMarker = memorizedLatest.source;
166
- targetMarker = memorizedLatest.target;
167
- sourceMarker && delete memorizedLatest.source;
168
- targetMarker && delete memorizedLatest.target;
169
- const temporaryLineElement = createArrowLineElement(lineShape, [sourcePoint, movingPoint], { marker: sourceMarker || ArrowLineMarkerType.none, connection: sourceConnection, boundId: sourceElement?.id }, { marker: targetMarker || ArrowLineMarkerType.arrow, connection: targetConnection, boundId: targetBoundId }, [], {
170
- strokeWidth: DefaultLineStyle.strokeWidth,
171
- ...memorizedLatest
172
- });
173
- const linePoints = getArrowLinePoints(board, temporaryLineElement);
174
- const otherPoint = linePoints[0];
175
- temporaryLineElement.points[1] = alignPoints(otherPoint, movingPoint);
176
- lineGenerator.processDrawing(temporaryLineElement, lineShapeG);
177
- PlaitBoard.getElementTopHost(board).append(lineShapeG);
178
- return temporaryLineElement;
179
- };
180
- function drawArrowLineMask(board, element, id) {
181
- const mask = createMask();
182
- mask.setAttribute('id', id);
183
- const points = getArrowLinePoints(board, element);
184
- let rectangle = RectangleClient.getRectangleByPoints(points);
185
- rectangle = RectangleClient.getOutlineRectangle(rectangle, -30);
186
- const maskFillRect = createRect(rectangle, {
187
- fill: 'white'
188
- });
189
- mask.appendChild(maskFillRect);
190
- const texts = element.texts;
191
- texts.forEach((text, index) => {
192
- let textRectangle = getArrowLineTextRectangle(board, element, index);
193
- textRectangle = RectangleClient.inflate(textRectangle, LINE_TEXT_SPACE * 2);
194
- const rect = createRect(textRectangle, {
195
- fill: 'black'
196
- });
197
- mask.appendChild(rect);
198
- });
199
- // open line
200
- const maskTargetFillRect = createRect(rectangle);
201
- maskTargetFillRect.setAttribute('opacity', '0');
202
- maskTargetFillRect.setAttribute('fill', 'none');
203
- return { mask, maskTargetFillRect };
204
- }
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3ctbGluZS1iYXNpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2Fycm93LWxpbmUvYXJyb3ctbGluZS1iYXNpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULFVBQVUsRUFDVixPQUFPLEVBQ1AsZUFBZSxFQUNmLFlBQVksRUFFWixjQUFjLEVBQ2QsVUFBVSxFQUNWLFVBQVUsRUFDViw0QkFBNEIsRUFDNUIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixXQUFXLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVILG1CQUFtQixFQUNuQixjQUFjLEVBRWQsY0FBYyxFQUNkLGdCQUFnQixFQUVuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxx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QU8sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQb2ludCxcbiAgICBpZENyZWF0b3IsXG4gICAgUGxhaXRCb2FyZCxcbiAgICBjcmVhdGVHLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBmaW5kRWxlbWVudHMsXG4gICAgUGxhaXRFbGVtZW50LFxuICAgIGRyYXdMaW5lYXJQYXRoLFxuICAgIGNyZWF0ZU1hc2ssXG4gICAgY3JlYXRlUmVjdCxcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50LFxuICAgIGNhdG11bGxSb21GaXR0aW5nLFxuICAgIHNldFN0cm9rZUxpbmVjYXBcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgcG9pbnRzT25CZXppZXJDdXJ2ZXMgfSBmcm9tICdwb2ludHMtb24tY3VydmUnO1xuaW1wb3J0IHtcbiAgICBnZXRQb2ludE9uUG9seWxpbmUsXG4gICAgZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudCxcbiAgICByZW1vdmVEdXBsaWNhdGVQb2ludHMsXG4gICAgZ2V0RXh0ZW5kUG9pbnQsXG4gICAgZ2V0U3Ryb2tlTGluZURhc2gsXG4gICAgU3Ryb2tlU3R5bGVcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFycm93TGluZUhhbmRsZSxcbiAgICBBcnJvd0xpbmVNYXJrZXJUeXBlLFxuICAgIEFycm93TGluZVNoYXBlLFxuICAgIEFycm93TGluZVRleHQsXG4gICAgUGxhaXRBcnJvd0xpbmUsXG4gICAgUGxhaXREcmF3RWxlbWVudCxcbiAgICBQbGFpdFNoYXBlRWxlbWVudFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldFN0cm9rZUNvbG9yQnlFbGVtZW50LCBnZXRTdHJva2VTdHlsZUJ5RWxlbWVudCB9IGZyb20gJy4uL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi8uLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldEVsZW1lbnRTaGFwZSB9IGZyb20gJy4uL3NoYXBlJztcbmltcG9ydCB7IERlZmF1bHRMaW5lU3R5bGUsIExJTkVfVEVYVF9TUEFDRSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IExJTkVfU05BUFBJTkdfQ09OTkVDVE9SX0JVRkZFUiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRMaW5lTWVtb3JpemVkTGF0ZXN0IH0gZnJvbSAnLi4vbWVtb3JpemUnO1xuaW1wb3J0IHsgYWxpZ25Qb2ludHMgfSBmcm9tICcuL2Fycm93LWxpbmUtcmVzaXplJztcbmltcG9ydCB7IGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIgfSBmcm9tICcuL2Fycm93LWxpbmUtY29tbW9uJztcbmltcG9ydCB7IGdldEVsYm93UG9pbnRzIH0gZnJvbSAnLi9lbGJvdyc7XG5pbXBvcnQgeyBkcmF3QXJyb3dMaW5lQXJyb3cgfSBmcm9tICcuL2Fycm93LWxpbmUtYXJyb3cnO1xuaW1wb3J0IHsgZ2V0U25hcHBpbmdSZWYsIGdldFNuYXBwaW5nU2hhcGUsIGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IEFycm93TGluZVNoYXBlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9ycy9hcnJvdy1saW5lLmdlbmVyYXRvcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBcnJvd0xpbmVFbGVtZW50ID0gKFxuICAgIHNoYXBlOiBBcnJvd0xpbmVTaGFwZSxcbiAgICBwb2ludHM6IFtQb2ludCwgUG9pbnRdLFxuICAgIHNvdXJjZTogQXJyb3dMaW5lSGFuZGxlLFxuICAgIHRhcmdldDogQXJyb3dMaW5lSGFuZGxlLFxuICAgIHRleHRzPzogQXJyb3dMaW5lVGV4dFtdLFxuICAgIG9wdGlvbnM/OiBQaWNrPFBsYWl0QXJyb3dMaW5lLCAnc3Ryb2tlQ29sb3InIHwgJ3N0cm9rZVdpZHRoJz5cbik6IFBsYWl0QXJyb3dMaW5lID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgIHR5cGU6ICdhcnJvdy1saW5lJyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdGV4dHM6IHRleHRzID8gdGV4dHMgOiBbXSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFycm93TGluZVBvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRBcnJvd0xpbmUpID0+IHtcbiAgICBzd2l0Y2ggKGVsZW1lbnQuc2hhcGUpIHtcbiAgICAgICAgY2FzZSBBcnJvd0xpbmVTaGFwZS5lbGJvdzoge1xuICAgICAgICAgICAgcmV0dXJuIGdldEVsYm93UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEFycm93TGluZVNoYXBlLmN1cnZlOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q3VydmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IFBsYWl0QXJyb3dMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0QXJyb3dMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBwb2ludHNbMF0gPSBoYW5kbGVSZWZQYWlyLnNvdXJjZS5wb2ludDtcbiAgICAgICAgICAgIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0gPSBoYW5kbGVSZWZQYWlyLnRhcmdldC5wb2ludDtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VydmVQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0QXJyb3dMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHsgc291cmNlLCB0YXJnZXQgfSA9IGhhbmRsZVJlZlBhaXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZUJvdW5kRWxlbWVudCA9IGhhbmRsZVJlZlBhaXIuc291cmNlLmJvdW5kRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0Qm91bmRFbGVtZW50ID0gaGFuZGxlUmVmUGFpci50YXJnZXQuYm91bmRFbGVtZW50O1xuICAgICAgICBsZXQgY3VydmVQb2ludHM6IFBvaW50W10gPSBbc291cmNlLnBvaW50XTtcbiAgICAgICAgY29uc3Qgc3VtRGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnNvdXJjZS5wb2ludCwgLi4udGFyZ2V0LnBvaW50KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMTIgKyBzdW1EaXN0YW5jZSAvIDM7XG4gICAgICAgIGlmIChzb3VyY2VCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudChzb3VyY2UucG9pbnQsIHNvdXJjZS52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXRCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudCh0YXJnZXQucG9pbnQsIHRhcmdldC52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2luZ2xlQm91bmQgPSAoc291cmNlQm91bmRFbGVtZW50ICYmICF0YXJnZXRCb3VuZEVsZW1lbnQpIHx8ICghc291cmNlQm91bmRFbGVtZW50ICYmIHRhcmdldEJvdW5kRWxlbWVudCk7XG4gICAgICAgIGlmIChpc1NpbmdsZUJvdW5kKSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKHRhcmdldC5wb2ludCk7XG4gICAgICAgICAgICBjb25zdCBwb2ludHMgPSBRMkMoY3VydmVQb2ludHMpO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50c09uQmV6aWVyQ3VydmVzKHBvaW50cykgYXMgUG9pbnRbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNvdXJjZUJvdW5kRWxlbWVudCAmJiAhdGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3JDb21wb25lbnQoc291cmNlLnBvaW50LCBzb3VyY2UudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudCh0YXJnZXQucG9pbnQsIHRhcmdldC52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnZlUG9pbnRzLnB1c2godGFyZ2V0LnBvaW50KTtcbiAgICAgICAgcmV0dXJuIHBvaW50c09uQmV6aWVyQ3VydmVzKGN1cnZlUG9pbnRzKSBhcyBQb2ludFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBkYXRhUG9pbnRzID0gUGxhaXRBcnJvd0xpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgZGF0YVBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhkYXRhUG9pbnRzKTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gY2F0bXVsbFJvbUZpdHRpbmcoZGF0YVBvaW50cyk7XG4gICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhwb2ludHMpIGFzIFBvaW50W107XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRyYXdBcnJvd0xpbmUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IGdldFN0cm9rZUNvbG9yQnlFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VTdHlsZSA9IGdldFN0cm9rZVN0eWxlQnlFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldFN0cm9rZUxpbmVEYXNoKHN0cm9rZVN0eWxlLCBzdHJva2VXaWR0aCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGgsIHN0cm9rZUxpbmVEYXNoIH07XG4gICAgY29uc3QgbGluZUcgPSBjcmVhdGVHKCk7XG4gICAgbGV0IHBvaW50cyA9IGdldEFycm93TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgbGV0IGxpbmU7XG4gICAgaWYgKGVsZW1lbnQuc2hhcGUgPT09IEFycm93TGluZVNoYXBlLmN1cnZlKSB7XG4gICAgICAgIGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5jdXJ2ZShwb2ludHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmUgPSBkcmF3TGluZWFyUGF0aChwb2ludHMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGlkQ3JlYXRvcigpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtpZH0pYCk7XG4gICAgaWYgKGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFN0cm9rZVN0eWxlLmRvdHRlZCkge1xuICAgICAgICBzZXRTdHJva2VMaW5lY2FwKGxpbmUsICdyb3VuZCcpO1xuICAgIH1cbiAgICBsaW5lRy5hcHBlbmRDaGlsZChsaW5lKTtcblxuICAgIGNvbnN0IHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH0gPSBkcmF3QXJyb3dMaW5lTWFzayhib2FyZCwgZWxlbWVudCBhcyBQbGFpdEFycm93TGluZSwgaWQpO1xuICAgIGxpbmVHLmFwcGVuZENoaWxkKG1hc2spO1xuICAgIGxpbmUuYXBwZW5kQ2hpbGQobWFza1RhcmdldEZpbGxSZWN0KTtcbiAgICBjb25zdCBhcnJvdyA9IGRyYXdBcnJvd0xpbmVBcnJvdyhlbGVtZW50IGFzIFBsYWl0QXJyb3dMaW5lLCBwb2ludHMsIHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGggfSk7XG4gICAgYXJyb3cgJiYgbGluZUcuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIHJldHVybiBsaW5lRztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRDb25uZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50KTogUG9pbnQgPT4ge1xuICAgIGxldCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoaGl0RWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IHJlZiA9IGdldFNuYXBwaW5nUmVmKGJvYXJkLCBoaXRFbGVtZW50LCBwb2ludCk7XG4gICAgY29uc3QgY29ubmVjdGlvblBvaW50ID0gcmVmLmNvbm5lY3RvclBvaW50IHx8IHJlZi5lZGdlUG9pbnQ7XG4gICAgcmV0dXJuIFsoY29ubmVjdGlvblBvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAoY29ubmVjdGlvblBvaW50WzFdIC0gcmVjdGFuZ2xlLnkpIC8gcmVjdGFuZ2xlLmhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0Q29ubmVjdG9yUG9pbnQgPSAocG9pbnQ6IFBvaW50LCBoaXRFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhoaXRFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRFbGVtZW50U2hhcGUoaGl0RWxlbWVudCk7XG4gICAgY29uc3QgY29ubmVjdG9yUG9pbnRzID0gZ2V0RW5naW5lKHNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlKTtcbiAgICByZXR1cm4gY29ubmVjdG9yUG9pbnRzLmZpbmQoKGNvbm5lY3RvclBvaW50KSA9PiB7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLmNvbm5lY3RvclBvaW50LCAuLi5wb2ludCkgPD0gTElORV9TTkFQUElOR19DT05ORUNUT1JfQlVGRkVSO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFycm93TGluZVRleHRSZWN0YW5nbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lLCBpbmRleDogbnVtYmVyKTogUmVjdGFuZ2xlQ2xpZW50ID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gZWxlbWVudC50ZXh0c1tpbmRleF07XG4gICAgY29uc3QgZWxib3dQb2ludHMgPSBnZXRBcnJvd0xpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRPblBvbHlsaW5lKGVsYm93UG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb2ludFswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgeTogcG9pbnRbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJvd0xpbmVzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4gUGxhaXREcmF3RWxlbWVudC5pc0Fycm93TGluZShlbGVtZW50KSxcbiAgICAgICAgcmVjdXJzaW9uOiAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiBQbGFpdERyYXdFbGVtZW50LmlzRHJhd0VsZW1lbnQoZWxlbWVudClcbiAgICB9KSBhcyBQbGFpdEFycm93TGluZVtdO1xufTtcblxuLy8gcXVhZHJhdGljIEJlemllciB0byBjdWJpYyBCZXppZXJcbmV4cG9ydCBjb25zdCBRMkMgPSAocG9pbnRzOiBQb2ludFtdKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSBwb2ludHMubGVuZ3RoIC8gMztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNlZ21lbnRzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IHFDb250cm9sID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3QgZW5kID0gcG9pbnRzW2kgKyAyXTtcbiAgICAgICAgY29uc3Qgc3RhcnREaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc3RhcnQsIC4uLnFDb250cm9sKTtcbiAgICAgICAgY29uc3QgZW5kRGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLmVuZCwgLi4ucUNvbnRyb2wpO1xuICAgICAgICBjb25zdCBjQ29udHJvbDEgPSBnZXRFeHRlbmRQb2ludChzdGFydCwgcUNvbnRyb2wsIChzdGFydERpc3RhbmNlICogMikgLyAzKTtcbiAgICAgICAgY29uc3QgY0NvbnRyb2wyID0gZ2V0RXh0ZW5kUG9pbnQoZW5kLCBxQ29udHJvbCwgKGVuZERpc3RhbmNlICogMikgLyAzKTtcbiAgICAgICAgcmVzdWx0LnB1c2goc3RhcnQsIGNDb250cm9sMSwgY0NvbnRyb2wyLCBlbmQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUFycm93TGluZUNyZWF0aW5nID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGxpbmVTaGFwZTogQXJyb3dMaW5lU2hhcGUsXG4gICAgc291cmNlUG9pbnQ6IFBvaW50LFxuICAgIG1vdmluZ1BvaW50OiBQb2ludCxcbiAgICBzb3VyY2VFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCB8IG51bGwsXG4gICAgbGluZVNoYXBlRzogU1ZHR0VsZW1lbnRcbikgPT4ge1xuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBnZXRTbmFwcGluZ1NoYXBlKGJvYXJkLCBtb3ZpbmdQb2ludCk7XG4gICAgY29uc3QgdGFyZ2V0Q29ubmVjdGlvbiA9IGhpdEVsZW1lbnQgPyBnZXRIaXRDb25uZWN0aW9uKGJvYXJkLCBtb3ZpbmdQb2ludCwgaGl0RWxlbWVudCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc291cmNlQ29ubmVjdGlvbiA9IHNvdXJjZUVsZW1lbnQgPyBnZXRIaXRDb25uZWN0aW9uKGJvYXJkLCBzb3VyY2VQb2ludCwgc291cmNlRWxlbWVudCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0Qm91bmRJZCA9IGhpdEVsZW1lbnQgPyBoaXRFbGVtZW50LmlkIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxpbmVHZW5lcmF0b3IgPSBuZXcgQXJyb3dMaW5lU2hhcGVHZW5lcmF0b3IoYm9hcmQpO1xuICAgIGNvbnN0IG1lbW9yaXplZExhdGVzdCA9IGdldExpbmVNZW1vcml6ZWRMYXRlc3QoKTtcbiAgICBsZXQgc291cmNlTWFya2VyLCB0YXJnZXRNYXJrZXI7XG4gICAgc291cmNlTWFya2VyID0gbWVtb3JpemVkTGF0ZXN0LnNvdXJjZTtcbiAgICB0YXJnZXRNYXJrZXIgPSBtZW1vcml6ZWRMYXRlc3QudGFyZ2V0O1xuICAgIHNvdXJjZU1hcmtlciAmJiBkZWxldGUgbWVtb3JpemVkTGF0ZXN0LnNvdXJjZTtcbiAgICB0YXJnZXRNYXJrZXIgJiYgZGVsZXRlIG1lbW9yaXplZExhdGVzdC50YXJnZXQ7XG4gICAgY29uc3QgdGVtcG9yYXJ5TGluZUVsZW1lbnQgPSBjcmVhdGVBcnJvd0xpbmVFbGVtZW50KFxuICAgICAgICBsaW5lU2hhcGUsXG4gICAgICAgIFtzb3VyY2VQb2ludCwgbW92aW5nUG9pbnRdLFxuICAgICAgICB7IG1hcmtlcjogc291cmNlTWFya2VyIHx8IEFycm93TGluZU1hcmtlclR5cGUubm9uZSwgY29ubmVjdGlvbjogc291cmNlQ29ubmVjdGlvbiwgYm91bmRJZDogc291cmNlRWxlbWVudD8uaWQgfSxcbiAgICAgICAgeyBtYXJrZXI6IHRhcmdldE1hcmtlciB8fCBBcnJvd0xpbmVNYXJrZXJUeXBlLmFycm93LCBjb25uZWN0aW9uOiB0YXJnZXRDb25uZWN0aW9uLCBib3VuZElkOiB0YXJnZXRCb3VuZElkIH0sXG4gICAgICAgIFtdLFxuICAgICAgICB7XG4gICAgICAgICAgICBzdHJva2VXaWR0aDogRGVmYXVsdExpbmVTdHlsZS5zdHJva2VXaWR0aCxcbiAgICAgICAgICAgIC4uLm1lbW9yaXplZExhdGVzdFxuICAgICAgICB9XG4gICAgKTtcbiAgICBjb25zdCBsaW5lUG9pbnRzID0gZ2V0QXJyb3dMaW5lUG9pbnRzKGJvYXJkLCB0ZW1wb3JhcnlMaW5lRWxlbWVudCk7XG4gICAgY29uc3Qgb3RoZXJQb2ludCA9IGxpbmVQb2ludHNbMF07XG4gICAgdGVtcG9yYXJ5TGluZUVsZW1lbnQucG9pbnRzWzFdID0gYWxpZ25Qb2ludHMob3RoZXJQb2ludCwgbW92aW5nUG9pbnQpO1xuICAgIGxpbmVHZW5lcmF0b3IucHJvY2Vzc0RyYXdpbmcodGVtcG9yYXJ5TGluZUVsZW1lbnQsIGxpbmVTaGFwZUcpO1xuICAgIFBsYWl0Qm9hcmQuZ2V0RWxlbWVudFRvcEhvc3QoYm9hcmQpLmFwcGVuZChsaW5lU2hhcGVHKTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5TGluZUVsZW1lbnQ7XG59O1xuXG5mdW5jdGlvbiBkcmF3QXJyb3dMaW5lTWFzayhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRBcnJvd0xpbmUsIGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXNrID0gY3JlYXRlTWFzaygpO1xuICAgIG1hc2suc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcbiAgICBjb25zdCBwb2ludHMgPSBnZXRBcnJvd0xpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGxldCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKTtcbiAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0T3V0bGluZVJlY3RhbmdsZShyZWN0YW5nbGUsIC0zMCk7XG4gICAgY29uc3QgbWFza0ZpbGxSZWN0ID0gY3JlYXRlUmVjdChyZWN0YW5nbGUsIHtcbiAgICAgICAgZmlsbDogJ3doaXRlJ1xuICAgIH0pO1xuICAgIG1hc2suYXBwZW5kQ2hpbGQobWFza0ZpbGxSZWN0KTtcblxuICAgIGNvbnN0IHRleHRzID0gZWxlbWVudC50ZXh0cztcbiAgICB0ZXh0cy5mb3JFYWNoKCh0ZXh0LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdGV4dFJlY3RhbmdsZSA9IGdldEFycm93TGluZVRleHRSZWN0YW5nbGUoYm9hcmQsIGVsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgdGV4dFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHRleHRSZWN0YW5nbGUsIExJTkVfVEVYVF9TUEFDRSAqIDIpO1xuICAgICAgICBjb25zdCByZWN0ID0gY3JlYXRlUmVjdCh0ZXh0UmVjdGFuZ2xlLCB7XG4gICAgICAgICAgICBmaWxsOiAnYmxhY2snXG4gICAgICAgIH0pO1xuICAgICAgICBtYXNrLmFwcGVuZENoaWxkKHJlY3QpO1xuICAgIH0pO1xuICAgIC8vIG9wZW4gbGluZVxuICAgIGNvbnN0IG1hc2tUYXJnZXRGaWxsUmVjdCA9IGNyZWF0ZVJlY3QocmVjdGFuZ2xlKTtcbiAgICBtYXNrVGFyZ2V0RmlsbFJlY3Quc2V0QXR0cmlidXRlKCdvcGFjaXR5JywgJzAnKTtcbiAgICBtYXNrVGFyZ2V0RmlsbFJlY3Quc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICByZXR1cm4geyBtYXNrLCBtYXNrVGFyZ2V0RmlsbFJlY3QgfTtcbn1cbiJdfQ==
@@ -1,162 +0,0 @@
1
- import { PlaitBoard, getElementById, RectangleClient, Direction, hasValidAngle, rotatePointsByElement, findElements, Path } from '@plait/core';
2
- import { getDirectionFactor, rotateVectorAnti90, getDirectionByVector, getOppositeDirection, getDirectionByPointOfRectangle, getSourceAndTargetOuterRectangle, getNextPoint, rotateVector } from '@plait/common';
3
- import { BasicShapes, ArrowLineHandleKey, ArrowLineMarkerType, PlaitArrowLine, PlaitDrawElement } from '../../interfaces';
4
- import { getEngine } from '../../engines';
5
- import { getElementShape } from '../shape';
6
- import { getSourceAndTargetRectangle } from './elbow';
7
- import { getStrokeWidthByElement } from '../common';
8
- import { getArrowLinePoints, getHitConnection } from './arrow-line-basic';
9
- export const getArrowLineHandleRefPair = (board, element) => {
10
- const strokeWidth = getStrokeWidthByElement(element);
11
- const sourceBoundElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
12
- const targetBoundElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
13
- let sourcePoint = sourceBoundElement ? getConnectionPoint(sourceBoundElement, element.source.connection) : element.points[0];
14
- let targetPoint = targetBoundElement
15
- ? getConnectionPoint(targetBoundElement, element.target.connection)
16
- : element.points[element.points.length - 1];
17
- let sourceDirection = getDirectionByVector([targetPoint[0] - sourcePoint[0], targetPoint[1] - sourcePoint[1]]) || Direction.right;
18
- let targetDirection = getOppositeDirection(sourceDirection);
19
- const sourceFactor = getDirectionFactor(sourceDirection);
20
- const targetFactor = getDirectionFactor(targetDirection);
21
- const sourceHandleRef = {
22
- key: ArrowLineHandleKey.source,
23
- point: sourcePoint,
24
- direction: sourceDirection,
25
- vector: [sourceFactor.x, sourceFactor.y]
26
- };
27
- const targetHandleRef = {
28
- key: ArrowLineHandleKey.target,
29
- point: targetPoint,
30
- direction: targetDirection,
31
- vector: [targetFactor.x, targetFactor.y]
32
- };
33
- if (sourceBoundElement) {
34
- const connectionOffset = PlaitArrowLine.isSourceMarkOrTargetMark(element, ArrowLineMarkerType.none, ArrowLineHandleKey.source)
35
- ? 0
36
- : strokeWidth;
37
- const sourceVector = getVectorByConnection(sourceBoundElement, element.source.connection);
38
- sourceHandleRef.vector = sourceVector;
39
- sourceHandleRef.boundElement = sourceBoundElement;
40
- if (hasValidAngle(sourceBoundElement)) {
41
- const direction = getDirectionByVector(rotateVector(sourceVector, sourceBoundElement.angle));
42
- sourceDirection = direction ? direction : sourceDirection;
43
- }
44
- else {
45
- const direction = getDirectionByVector(sourceVector);
46
- sourceDirection = direction ? direction : sourceDirection;
47
- }
48
- sourceHandleRef.direction = sourceDirection;
49
- sourcePoint = getConnectionPoint(sourceBoundElement, element.source.connection, sourceDirection, connectionOffset);
50
- sourceHandleRef.point = rotatePointsByElement(sourcePoint, sourceBoundElement) || sourcePoint;
51
- }
52
- if (targetBoundElement) {
53
- const connectionOffset = PlaitArrowLine.isSourceMarkOrTargetMark(element, ArrowLineMarkerType.none, ArrowLineHandleKey.target)
54
- ? 0
55
- : strokeWidth;
56
- const targetVector = getVectorByConnection(targetBoundElement, element.target.connection);
57
- targetHandleRef.vector = targetVector;
58
- targetHandleRef.boundElement = targetBoundElement;
59
- if (hasValidAngle(targetBoundElement)) {
60
- const direction = getDirectionByVector(rotateVector(targetVector, targetBoundElement.angle));
61
- targetDirection = direction ? direction : targetDirection;
62
- }
63
- else {
64
- const direction = getDirectionByVector(targetVector);
65
- targetDirection = direction ? direction : targetDirection;
66
- }
67
- targetHandleRef.direction = targetDirection;
68
- targetPoint = getConnectionPoint(targetBoundElement, element.target.connection, targetDirection, connectionOffset);
69
- targetHandleRef.point = rotatePointsByElement(targetPoint, targetBoundElement) || targetPoint;
70
- }
71
- return { source: sourceHandleRef, target: targetHandleRef };
72
- };
73
- export const getConnectionPoint = (geometry, connection, direction, delta) => {
74
- const rectangle = RectangleClient.getRectangleByPoints(geometry.points);
75
- if (direction && delta) {
76
- const directionFactor = getDirectionFactor(direction);
77
- const point = RectangleClient.getConnectionPoint(rectangle, connection);
78
- return [point[0] + directionFactor.x * delta, point[1] + directionFactor.y * delta];
79
- }
80
- else {
81
- return RectangleClient.getConnectionPoint(rectangle, connection);
82
- }
83
- };
84
- export const getVectorByConnection = (boundElement, connection) => {
85
- const rectangle = RectangleClient.getRectangleByPoints(boundElement.points);
86
- const shape = getElementShape(boundElement);
87
- const engine = getEngine(shape);
88
- let vector = [0, 0];
89
- const direction = getDirectionByPointOfRectangle(connection);
90
- if (direction && boundElement.shape !== BasicShapes.ellipse) {
91
- const factor = getDirectionFactor(direction);
92
- return [factor.x, factor.y];
93
- }
94
- if (engine.getEdgeByConnectionPoint) {
95
- const edge = engine.getEdgeByConnectionPoint(rectangle, connection);
96
- if (edge) {
97
- const lineVector = [edge[1][0] - edge[0][0], edge[1][1] - edge[0][1]];
98
- return rotateVectorAnti90(lineVector);
99
- }
100
- }
101
- if (engine.getTangentVectorByConnectionPoint) {
102
- const lineVector = engine.getTangentVectorByConnectionPoint(rectangle, connection);
103
- if (lineVector) {
104
- return rotateVectorAnti90(lineVector);
105
- }
106
- }
107
- return vector;
108
- };
109
- export const getElbowLineRouteOptions = (board, element, handleRefPair) => {
110
- handleRefPair = handleRefPair ?? getArrowLineHandleRefPair(board, element);
111
- const { sourceRectangle, targetRectangle } = getSourceAndTargetRectangle(board, element, handleRefPair);
112
- const { sourceOuterRectangle, targetOuterRectangle } = getSourceAndTargetOuterRectangle(sourceRectangle, targetRectangle);
113
- const sourcePoint = handleRefPair.source.point;
114
- const targetPoint = handleRefPair.target.point;
115
- const nextSourcePoint = getNextPoint(sourcePoint, sourceOuterRectangle, handleRefPair.source.direction);
116
- const nextTargetPoint = getNextPoint(targetPoint, targetOuterRectangle, handleRefPair.target.direction);
117
- return {
118
- sourcePoint,
119
- nextSourcePoint,
120
- sourceRectangle,
121
- sourceOuterRectangle,
122
- targetPoint,
123
- nextTargetPoint,
124
- targetRectangle,
125
- targetOuterRectangle
126
- };
127
- };
128
- export const collectArrowLineUpdatedRefsByGeometry = (board, element, refs) => {
129
- const lines = findElements(board, {
130
- match: (element) => {
131
- if (PlaitDrawElement.isArrowLine(element)) {
132
- return element.source.boundId === element.id || element.target.boundId === element.id;
133
- }
134
- return false;
135
- },
136
- recursion: element => true
137
- });
138
- if (lines.length) {
139
- lines.forEach(line => {
140
- const isSourceBound = line.source.boundId === element.id;
141
- const handle = isSourceBound ? 'source' : 'target';
142
- const object = { ...line[handle] };
143
- const linePoints = getArrowLinePoints(board, line);
144
- const point = isSourceBound ? linePoints[0] : linePoints[linePoints.length - 1];
145
- object.connection = getHitConnection(board, point, element);
146
- const path = PlaitBoard.findPath(board, line);
147
- const index = refs.findIndex(obj => Path.equals(obj.path, path));
148
- if (index === -1) {
149
- refs.push({
150
- property: {
151
- [handle]: object
152
- },
153
- path
154
- });
155
- }
156
- else {
157
- refs[index].property = { ...refs[index].property, [handle]: object };
158
- }
159
- });
160
- }
161
- };
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3ctbGluZS1jb21tb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9hcnJvdy1saW5lL2Fycm93LWxpbmUtY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGVBQWUsRUFFZixTQUFTLEVBRVQsYUFBYSxFQUNiLHFCQUFxQixFQUNyQixZQUFZLEVBRVosSUFBSSxFQUNQLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsa0JBQWtCLEVBR2xCLG1CQUFtQixFQUNuQixjQUFjLEVBR2QsZ0JBQWdCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQXVCLEVBQTBCLEVBQUU7SUFDNUcsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENB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QUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNOLFFBQVEsRUFBRTt3QkFDTixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU07cUJBQ25CO29CQUNELElBQUk7aUJBQ1AsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQb2ludCxcbiAgICBQbGFpdEJvYXJkLFxuICAgIGdldEVsZW1lbnRCeUlkLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBQb2ludE9mUmVjdGFuZ2xlLFxuICAgIERpcmVjdGlvbixcbiAgICBWZWN0b3IsXG4gICAgaGFzVmFsaWRBbmdsZSxcbiAgICByb3RhdGVQb2ludHNCeUVsZW1lbnQsXG4gICAgZmluZEVsZW1lbnRzLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQYXRoXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIHJvdGF0ZVZlY3RvckFudGk5MCxcbiAgICBnZXREaXJlY3Rpb25CeVZlY3RvcixcbiAgICBnZXRPcHBvc2l0ZURpcmVjdGlvbixcbiAgICBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUsXG4gICAgZ2V0U291cmNlQW5kVGFyZ2V0T3V0ZXJSZWN0YW5nbGUsXG4gICAgZ2V0TmV4dFBvaW50LFxuICAgIHJvdGF0ZVZlY3RvclxufSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQmFzaWNTaGFwZXMsXG4gICAgQXJyb3dMaW5lSGFuZGxlS2V5LFxuICAgIEFycm93TGluZUhhbmRsZVJlZixcbiAgICBBcnJvd0xpbmVIYW5kbGVSZWZQYWlyLFxuICAgIEFycm93TGluZU1hcmtlclR5cGUsXG4gICAgUGxhaXRBcnJvd0xpbmUsXG4gICAgUGxhaXRHZW9tZXRyeSxcbiAgICBQbGFpdFNoYXBlRWxlbWVudCxcbiAgICBQbGFpdERyYXdFbGVtZW50XG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBnZXRFbGVtZW50U2hhcGUgfSBmcm9tICcuLi9zaGFwZSc7XG5pbXBvcnQgeyBnZXRTb3VyY2VBbmRUYXJnZXRSZWN0YW5nbGUgfSBmcm9tICcuL2VsYm93JztcbmltcG9ydCB7IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IGdldEFycm93TGluZVBvaW50cywgZ2V0SGl0Q29ubmVjdGlvbiB9IGZyb20gJy4vYXJyb3ctbGluZS1iYXNpYyc7XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJvd0xpbmVIYW5kbGVSZWZQYWlyID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEFycm93TGluZSk6IEFycm93TGluZUhhbmRsZVJlZlBhaXIgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc291cmNlQm91bmRFbGVtZW50ID0gZWxlbWVudC5zb3VyY2UuYm91bmRJZCA/IGdldEVsZW1lbnRCeUlkPFBsYWl0U2hhcGVFbGVtZW50Pihib2FyZCwgZWxlbWVudC5zb3VyY2UuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0Qm91bmRFbGVtZW50ID0gZWxlbWVudC50YXJnZXQuYm91bmRJZCA/IGdldEVsZW1lbnRCeUlkPFBsYWl0U2hhcGVFbGVtZW50Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHNvdXJjZVBvaW50ID0gc291cmNlQm91bmRFbGVtZW50ID8gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpIDogZWxlbWVudC5wb2ludHNbMF07XG4gICAgbGV0IHRhcmdldFBvaW50ID0gdGFyZ2V0Qm91bmRFbGVtZW50XG4gICAgICAgID8gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpXG4gICAgICAgIDogZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKFt0YXJnZXRQb2ludFswXSAtIHNvdXJjZVBvaW50WzBdLCB0YXJnZXRQb2ludFsxXSAtIHNvdXJjZVBvaW50WzFdXSkgfHwgRGlyZWN0aW9uLnJpZ2h0O1xuICAgIGxldCB0YXJnZXREaXJlY3Rpb24gPSBnZXRPcHBvc2l0ZURpcmVjdGlvbihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHRhcmdldEZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXREaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUhhbmRsZVJlZjogQXJyb3dMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IEFycm93TGluZUhhbmRsZUtleS5zb3VyY2UsXG4gICAgICAgIHBvaW50OiBzb3VyY2VQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uOiBzb3VyY2VEaXJlY3Rpb24sXG4gICAgICAgIHZlY3RvcjogW3NvdXJjZUZhY3Rvci54LCBzb3VyY2VGYWN0b3IueV1cbiAgICB9O1xuICAgIGNvbnN0IHRhcmdldEhhbmRsZVJlZjogQXJyb3dMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IEFycm93TGluZUhhbmRsZUtleS50YXJnZXQsXG4gICAgICAgIHBvaW50OiB0YXJnZXRQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uOiB0YXJnZXREaXJlY3Rpb24sXG4gICAgICAgIHZlY3RvcjogW3RhcmdldEZhY3Rvci54LCB0YXJnZXRGYWN0b3IueV1cbiAgICB9O1xuICAgIGlmIChzb3VyY2VCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbk9mZnNldCA9IFBsYWl0QXJyb3dMaW5lLmlzU291cmNlTWFya09yVGFyZ2V0TWFyayhcbiAgICAgICAgICAgIGVsZW1lbnQgYXMgUGxhaXRBcnJvd0xpbmUsXG4gICAgICAgICAgICBBcnJvd0xpbmVNYXJrZXJUeXBlLm5vbmUsXG4gICAgICAgICAgICBBcnJvd0xpbmVIYW5kbGVLZXkuc291cmNlXG4gICAgICAgIClcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3Qgc291cmNlVmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYudmVjdG9yID0gc291cmNlVmVjdG9yO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYuYm91bmRFbGVtZW50ID0gc291cmNlQm91bmRFbGVtZW50O1xuICAgICAgICBpZiAoaGFzVmFsaWRBbmdsZShzb3VyY2VCb3VuZEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihyb3RhdGVWZWN0b3Ioc291cmNlVmVjdG9yLCBzb3VyY2VCb3VuZEVsZW1lbnQuYW5nbGUhKSk7XG4gICAgICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihzb3VyY2VWZWN0b3IpO1xuICAgICAgICAgICAgc291cmNlRGlyZWN0aW9uID0gZGlyZWN0aW9uID8gZGlyZWN0aW9uIDogc291cmNlRGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5kaXJlY3Rpb24gPSBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZVBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEsIHNvdXJjZURpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5wb2ludCA9IHJvdGF0ZVBvaW50c0J5RWxlbWVudChzb3VyY2VQb2ludCwgc291cmNlQm91bmRFbGVtZW50KSB8fCBzb3VyY2VQb2ludDtcbiAgICB9XG4gICAgaWYgKHRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uT2Zmc2V0ID0gUGxhaXRBcnJvd0xpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKFxuICAgICAgICAgICAgZWxlbWVudCBhcyBQbGFpdEFycm93TGluZSxcbiAgICAgICAgICAgIEFycm93TGluZU1hcmtlclR5cGUubm9uZSxcbiAgICAgICAgICAgIEFycm93TGluZUhhbmRsZUtleS50YXJnZXRcbiAgICAgICAgKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHN0cm9rZVdpZHRoO1xuICAgICAgICBjb25zdCB0YXJnZXRWZWN0b3IgPSBnZXRWZWN0b3JCeUNvbm5lY3Rpb24odGFyZ2V0Qm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISk7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi52ZWN0b3IgPSB0YXJnZXRWZWN0b3I7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSB0YXJnZXRCb3VuZEVsZW1lbnQ7XG4gICAgICAgIGlmIChoYXNWYWxpZEFuZ2xlKHRhcmdldEJvdW5kRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKHJvdGF0ZVZlY3Rvcih0YXJnZXRWZWN0b3IsIHRhcmdldEJvdW5kRWxlbWVudC5hbmdsZSEpKTtcbiAgICAgICAgICAgIHRhcmdldERpcmVjdGlvbiA9IGRpcmVjdGlvbiA/IGRpcmVjdGlvbiA6IHRhcmdldERpcmVjdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKHRhcmdldFZlY3Rvcik7XG4gICAgICAgICAgICB0YXJnZXREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0SGFuZGxlUmVmLmRpcmVjdGlvbiA9IHRhcmdldERpcmVjdGlvbjtcbiAgICAgICAgdGFyZ2V0UG9pbnQgPSBnZXRDb25uZWN0aW9uUG9pbnQodGFyZ2V0Qm91bmRFbGVtZW50LCBlbGVtZW50LnRhcmdldC5jb25uZWN0aW9uISwgdGFyZ2V0RGlyZWN0aW9uLCBjb25uZWN0aW9uT2Zmc2V0KTtcbiAgICAgICAgdGFyZ2V0SGFuZGxlUmVmLnBvaW50ID0gcm90YXRlUG9pbnRzQnlFbGVtZW50KHRhcmdldFBvaW50LCB0YXJnZXRCb3VuZEVsZW1lbnQpIHx8IHRhcmdldFBvaW50O1xuICAgIH1cbiAgICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZUhhbmRsZVJlZiwgdGFyZ2V0OiB0YXJnZXRIYW5kbGVSZWYgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uUG9pbnQgPSAoZ2VvbWV0cnk6IFBsYWl0U2hhcGVFbGVtZW50LCBjb25uZWN0aW9uOiBQb2ludCwgZGlyZWN0aW9uPzogRGlyZWN0aW9uLCBkZWx0YT86IG51bWJlcik6IFBvaW50ID0+IHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZ2VvbWV0cnkucG9pbnRzKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSArIGRpcmVjdGlvbkZhY3Rvci54ICogZGVsdGEsIHBvaW50WzFdICsgZGlyZWN0aW9uRmFjdG9yLnkgKiBkZWx0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmVjdG9yQnlDb25uZWN0aW9uID0gKGJvdW5kRWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsIGNvbm5lY3Rpb246IFBvaW50T2ZSZWN0YW5nbGUpOiBWZWN0b3IgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhib3VuZEVsZW1lbnQucG9pbnRzKTtcbiAgICBjb25zdCBzaGFwZSA9IGdldEVsZW1lbnRTaGFwZShib3VuZEVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShzaGFwZSk7XG4gICAgbGV0IHZlY3RvcjogVmVjdG9yID0gWzAsIDBdO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnRPZlJlY3RhbmdsZShjb25uZWN0aW9uKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGJvdW5kRWxlbWVudC5zaGFwZSAhPT0gQmFzaWNTaGFwZXMuZWxsaXBzZSkge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoZGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtmYWN0b3IueCwgZmFjdG9yLnldO1xuICAgIH1cbiAgICBpZiAoZW5naW5lLmdldEVkZ2VCeUNvbm5lY3Rpb25Qb2ludCkge1xuICAgICAgICBjb25zdCBlZGdlID0gZW5naW5lLmdldEVkZ2VCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoZWRnZSkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZlY3RvciA9IFtlZGdlWzFdWzBdIC0gZWRnZVswXVswXSwgZWRnZVsxXVsxXSAtIGVkZ2VbMF1bMV1dIGFzIFZlY3RvcjtcbiAgICAgICAgICAgIHJldHVybiByb3RhdGVWZWN0b3JBbnRpOTAobGluZVZlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZ2luZS5nZXRUYW5nZW50VmVjdG9yQnlDb25uZWN0aW9uUG9pbnQpIHtcbiAgICAgICAgY29uc3QgbGluZVZlY3RvciA9IGVuZ2luZS5nZXRUYW5nZW50VmVjdG9yQnlDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGxpbmVWZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiByb3RhdGVWZWN0b3JBbnRpOTAobGluZVZlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlY3Rvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0QXJyb3dMaW5lLCBoYW5kbGVSZWZQYWlyPzogQXJyb3dMaW5lSGFuZGxlUmVmUGFpcikgPT4ge1xuICAgIGhhbmRsZVJlZlBhaXIgPSBoYW5kbGVSZWZQYWlyID8/IGdldEFycm93TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHsgc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGUgfSA9IGdldFNvdXJjZUFuZFRhcmdldFJlY3RhbmdsZShib2FyZCwgZWxlbWVudCwgaGFuZGxlUmVmUGFpcik7XG4gICAgY29uc3QgeyBzb3VyY2VPdXRlclJlY3RhbmdsZSwgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUgfSA9IGdldFNvdXJjZUFuZFRhcmdldE91dGVyUmVjdGFuZ2xlKHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IGhhbmRsZVJlZlBhaXIuc291cmNlLnBvaW50O1xuICAgIGNvbnN0IHRhcmdldFBvaW50ID0gaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQ7XG4gICAgY29uc3QgbmV4dFNvdXJjZVBvaW50ID0gZ2V0TmV4dFBvaW50KHNvdXJjZVBvaW50LCBzb3VyY2VPdXRlclJlY3RhbmdsZSwgaGFuZGxlUmVmUGFpci5zb3VyY2UuZGlyZWN0aW9uKTtcbiAgICBjb25zdCBuZXh0VGFyZ2V0UG9pbnQgPSBnZXROZXh0UG9pbnQodGFyZ2V0UG9pbnQsIHRhcmdldE91dGVyUmVjdGFuZ2xlLCBoYW5kbGVSZWZQYWlyLnRhcmdldC5kaXJlY3Rpb24pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZVBvaW50LFxuICAgICAgICBuZXh0U291cmNlUG9pbnQsXG4gICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUsXG4gICAgICAgIHRhcmdldFBvaW50LFxuICAgICAgICBuZXh0VGFyZ2V0UG9pbnQsXG4gICAgICAgIHRhcmdldFJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0T3V0ZXJSZWN0YW5nbGVcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RBcnJvd0xpbmVVcGRhdGVkUmVmc0J5R2VvbWV0cnkgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsXG4gICAgcmVmczogeyBwcm9wZXJ0eTogUGFydGlhbDxQbGFpdEFycm93TGluZT47IHBhdGg6IFBhdGggfVtdXG4pID0+IHtcbiAgICBjb25zdCBsaW5lcyA9IGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNBcnJvd0xpbmUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zb3VyY2UuYm91bmRJZCA9PT0gZWxlbWVudC5pZCB8fCBlbGVtZW50LnRhcmdldC5ib3VuZElkID09PSBlbGVtZW50LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICByZWN1cnNpb246IGVsZW1lbnQgPT4gdHJ1ZVxuICAgIH0pIGFzIFBsYWl0QXJyb3dMaW5lW107XG4gICAgaWYgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNTb3VyY2VCb3VuZCA9IGxpbmUuc291cmNlLmJvdW5kSWQgPT09IGVsZW1lbnQuaWQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBpc1NvdXJjZUJvdW5kID8gJ3NvdXJjZScgOiAndGFyZ2V0JztcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHsgLi4ubGluZVtoYW5kbGVdIH07XG4gICAgICAgICAgICBjb25zdCBsaW5lUG9pbnRzID0gZ2V0QXJyb3dMaW5lUG9pbnRzKGJvYXJkLCBsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gaXNTb3VyY2VCb3VuZCA/IGxpbmVQb2ludHNbMF0gOiBsaW5lUG9pbnRzW2xpbmVQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBvYmplY3QuY29ubmVjdGlvbiA9IGdldEhpdENvbm5lY3Rpb24oYm9hcmQsIHBvaW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBQbGFpdEJvYXJkLmZpbmRQYXRoKGJvYXJkLCBsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVmcy5maW5kSW5kZXgob2JqID0+IFBhdGguZXF1YWxzKG9iai5wYXRoLCBwYXRoKSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoYW5kbGVdOiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWZzW2luZGV4XS5wcm9wZXJ0eSA9IHsgLi4ucmVmc1tpbmRleF0ucHJvcGVydHksIFtoYW5kbGVdOiBvYmplY3QgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiJdfQ==