ngx-image-cropper 8.0.0 → 8.1.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.
- package/README.md +46 -43
- package/esm2022/lib/component/cropper.state.mjs +188 -0
- package/esm2022/lib/component/image-cropper.component.mjs +206 -319
- package/esm2022/lib/interfaces/cropper-options.interface.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +2 -2
- package/esm2022/lib/interfaces/move-start.interface.mjs +1 -1
- package/esm2022/lib/services/crop.service.mjs +60 -68
- package/esm2022/lib/services/load-image.service.mjs +20 -25
- package/esm2022/lib/utils/cropper-position.utils.mjs +239 -0
- package/esm2022/lib/utils/keyboard.utils.mjs +1 -1
- package/fesm2022/ngx-image-cropper.mjs +729 -687
- package/fesm2022/ngx-image-cropper.mjs.map +1 -1
- package/lib/component/cropper.state.d.ts +29 -0
- package/lib/component/image-cropper.component.d.ts +56 -64
- package/lib/interfaces/cropper-options.interface.d.ts +5 -5
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/move-start.interface.d.ts +4 -6
- package/lib/services/crop.service.d.ts +6 -9
- package/lib/services/load-image.service.d.ts +5 -8
- package/lib/utils/cropper-position.utils.d.ts +11 -0
- package/lib/utils/keyboard.utils.d.ts +3 -2
- package/package.json +2 -1
- package/esm2022/lib/interfaces/cropper.settings.mjs +0 -54
- package/esm2022/lib/services/cropper-position.service.mjs +0 -210
- package/esm2022/lib/utils/hammer.utils.mjs +0 -2
- package/lib/interfaces/cropper.settings.d.ts +0 -38
- package/lib/services/cropper-position.service.d.ts +0 -15
- package/lib/utils/hammer.utils.d.ts +0 -7
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
export function checkCropperPosition(cropperPosition, cropperState, maintainSize) {
|
|
2
|
+
cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);
|
|
3
|
+
return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);
|
|
4
|
+
}
|
|
5
|
+
export function checkCropperSizeRestriction(cropperPosition, cropperState) {
|
|
6
|
+
let cropperWidth = cropperPosition.x2 - cropperPosition.x1;
|
|
7
|
+
let cropperHeight = cropperPosition.y2 - cropperPosition.y1;
|
|
8
|
+
const centerX = cropperPosition.x1 + cropperWidth / 2;
|
|
9
|
+
const centerY = cropperPosition.y1 + cropperHeight / 2;
|
|
10
|
+
if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {
|
|
11
|
+
cropperWidth = cropperState.maxSize.width > cropperState.options.cropperStaticWidth
|
|
12
|
+
? cropperState.options.cropperStaticWidth
|
|
13
|
+
: cropperState.maxSize.width;
|
|
14
|
+
cropperHeight = cropperState.maxSize.height > cropperState.options.cropperStaticHeight
|
|
15
|
+
? cropperState.options.cropperStaticHeight
|
|
16
|
+
: cropperState.maxSize.height;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize.width));
|
|
20
|
+
cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize.height));
|
|
21
|
+
if (cropperState.options.maintainAspectRatio) {
|
|
22
|
+
if (cropperState.maxSize.width / cropperState.options.aspectRatio < cropperState.maxSize.height) {
|
|
23
|
+
cropperHeight = cropperWidth / cropperState.options.aspectRatio;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
cropperWidth = cropperHeight * cropperState.options.aspectRatio;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const x1 = centerX - cropperWidth / 2;
|
|
31
|
+
const x2 = x1 + cropperWidth;
|
|
32
|
+
const y1 = centerY - cropperHeight / 2;
|
|
33
|
+
const y2 = y1 + cropperHeight;
|
|
34
|
+
return { x1, x2, y1, y2 };
|
|
35
|
+
}
|
|
36
|
+
export function checkCropperWithinMaxSizeBounds(position, cropperState, maintainSize = false) {
|
|
37
|
+
if (position.x1 < 0) {
|
|
38
|
+
position = {
|
|
39
|
+
...position,
|
|
40
|
+
x1: 0,
|
|
41
|
+
x2: position.x2 - (maintainSize ? position.x1 : 0)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (position.y1 < 0) {
|
|
45
|
+
position = {
|
|
46
|
+
...position,
|
|
47
|
+
y2: position.y2 - (maintainSize ? position.y1 : 0),
|
|
48
|
+
y1: 0
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (position.x2 > cropperState.maxSize.width) {
|
|
52
|
+
position = {
|
|
53
|
+
...position,
|
|
54
|
+
x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize.width) : 0),
|
|
55
|
+
x2: cropperState.maxSize.width
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (position.y2 > cropperState.maxSize.height) {
|
|
59
|
+
position = {
|
|
60
|
+
...position,
|
|
61
|
+
y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize.height) : 0),
|
|
62
|
+
y2: cropperState.maxSize.height
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return position;
|
|
66
|
+
}
|
|
67
|
+
export function moveCropper(event, moveStart) {
|
|
68
|
+
const diffX = getClientX(event) - moveStart.clientX;
|
|
69
|
+
const diffY = getClientY(event) - moveStart.clientY;
|
|
70
|
+
return {
|
|
71
|
+
x1: moveStart.cropper.x1 + diffX,
|
|
72
|
+
y1: moveStart.cropper.y1 + diffY,
|
|
73
|
+
x2: moveStart.cropper.x2 + diffX,
|
|
74
|
+
y2: moveStart.cropper.y2 + diffY
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function resizeCropper(event, moveStart, cropperState) {
|
|
78
|
+
const cropperPosition = { ...cropperState.cropper };
|
|
79
|
+
const moveX = getClientX(event) - moveStart.clientX;
|
|
80
|
+
const moveY = getClientY(event) - moveStart.clientY;
|
|
81
|
+
switch (moveStart.position) {
|
|
82
|
+
case 'left':
|
|
83
|
+
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
|
|
84
|
+
break;
|
|
85
|
+
case 'topleft':
|
|
86
|
+
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
|
|
87
|
+
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
|
|
88
|
+
break;
|
|
89
|
+
case 'top':
|
|
90
|
+
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
|
|
91
|
+
break;
|
|
92
|
+
case 'topright':
|
|
93
|
+
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
|
|
94
|
+
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
|
|
95
|
+
break;
|
|
96
|
+
case 'right':
|
|
97
|
+
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
|
|
98
|
+
break;
|
|
99
|
+
case 'bottomright':
|
|
100
|
+
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
|
|
101
|
+
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
|
|
102
|
+
break;
|
|
103
|
+
case 'bottom':
|
|
104
|
+
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
|
|
105
|
+
break;
|
|
106
|
+
case 'bottomleft':
|
|
107
|
+
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
|
|
108
|
+
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
|
|
109
|
+
break;
|
|
110
|
+
case 'center':
|
|
111
|
+
const scale = 'scale' in event ? event.scale : 1;
|
|
112
|
+
const newWidth = Math.min(Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale), cropperState.cropperScaledMaxWidth);
|
|
113
|
+
const newHeight = Math.min(Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale), cropperState.cropperScaledMaxHeight);
|
|
114
|
+
cropperPosition.x1 = moveStart.clientX - newWidth / 2;
|
|
115
|
+
cropperPosition.x2 = moveStart.clientX + newWidth / 2;
|
|
116
|
+
cropperPosition.y1 = moveStart.clientY - newHeight / 2;
|
|
117
|
+
cropperPosition.y2 = moveStart.clientY + newHeight / 2;
|
|
118
|
+
if (cropperPosition.x1 < 0) {
|
|
119
|
+
cropperPosition.x2 -= cropperPosition.x1;
|
|
120
|
+
cropperPosition.x1 = 0;
|
|
121
|
+
}
|
|
122
|
+
else if (cropperPosition.x2 > cropperState.maxSize.width) {
|
|
123
|
+
cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize.width);
|
|
124
|
+
cropperPosition.x2 = cropperState.maxSize.width;
|
|
125
|
+
}
|
|
126
|
+
if (cropperPosition.y1 < 0) {
|
|
127
|
+
cropperPosition.y2 -= cropperPosition.y1;
|
|
128
|
+
cropperPosition.y1 = 0;
|
|
129
|
+
}
|
|
130
|
+
else if (cropperPosition.y2 > cropperState.maxSize.height) {
|
|
131
|
+
cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize.height);
|
|
132
|
+
cropperPosition.y2 = cropperState.maxSize.height;
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (cropperState.options.maintainAspectRatio) {
|
|
137
|
+
return checkAspectRatio(moveStart.position, cropperPosition, cropperState);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return cropperPosition;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export function checkAspectRatio(position, cropperPosition, cropperState) {
|
|
144
|
+
cropperPosition = { ...cropperPosition };
|
|
145
|
+
let overflowX = 0;
|
|
146
|
+
let overflowY = 0;
|
|
147
|
+
switch (position) {
|
|
148
|
+
case 'top':
|
|
149
|
+
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
|
|
150
|
+
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
|
|
151
|
+
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
152
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
153
|
+
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
154
|
+
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
|
|
155
|
+
}
|
|
156
|
+
break;
|
|
157
|
+
case 'bottom':
|
|
158
|
+
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
|
|
159
|
+
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
|
|
160
|
+
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
|
|
161
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
162
|
+
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
163
|
+
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
case 'topleft':
|
|
167
|
+
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
|
|
168
|
+
overflowX = Math.max(0 - cropperPosition.x1, 0);
|
|
169
|
+
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
170
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
171
|
+
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
172
|
+
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case 'topright':
|
|
176
|
+
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
|
|
177
|
+
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
|
|
178
|
+
overflowY = Math.max(0 - cropperPosition.y1, 0);
|
|
179
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
180
|
+
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
181
|
+
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case 'right':
|
|
185
|
+
case 'bottomright':
|
|
186
|
+
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
|
|
187
|
+
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
|
|
188
|
+
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
|
|
189
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
190
|
+
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
191
|
+
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
case 'left':
|
|
195
|
+
case 'bottomleft':
|
|
196
|
+
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
|
|
197
|
+
overflowX = Math.max(0 - cropperPosition.x1, 0);
|
|
198
|
+
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
|
|
199
|
+
if (overflowX > 0 || overflowY > 0) {
|
|
200
|
+
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
|
|
201
|
+
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
case 'center':
|
|
205
|
+
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
|
|
206
|
+
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
|
|
207
|
+
const overflowX1 = Math.max(0 - cropperPosition.x1, 0);
|
|
208
|
+
const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize.width, 0);
|
|
209
|
+
const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize.height, 0);
|
|
210
|
+
const overflowY2 = Math.max(0 - cropperPosition.y1, 0);
|
|
211
|
+
if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {
|
|
212
|
+
cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;
|
|
213
|
+
cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;
|
|
214
|
+
cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;
|
|
215
|
+
cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;
|
|
216
|
+
}
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
return cropperPosition;
|
|
220
|
+
}
|
|
221
|
+
export function getClientX(event) {
|
|
222
|
+
if ('touches' in event && event.touches[0]) {
|
|
223
|
+
return event.touches[0].clientX;
|
|
224
|
+
}
|
|
225
|
+
else if ('clientX' in event) {
|
|
226
|
+
return event.clientX;
|
|
227
|
+
}
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
export function getClientY(event) {
|
|
231
|
+
if ('touches' in event && event.touches[0]) {
|
|
232
|
+
return event.touches[0].clientY;
|
|
233
|
+
}
|
|
234
|
+
else if ('clientX' in event) {
|
|
235
|
+
return event.clientY;
|
|
236
|
+
}
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvdXRpbHMvY3JvcHBlci1wb3NpdGlvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxZQUEwQixFQUFFLFlBQXFCO0lBQ3RILGVBQWUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsZUFBZ0MsRUFBRSxZQUEwQjtJQUN0RyxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdkQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUU7UUFDdkYsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFRLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQ2xGLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtZQUN6QyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUM7UUFDaEMsYUFBYSxHQUFH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QUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDcEQsUUFBUSxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzFCLEtBQUssTUFBTTtZQUNULGVBQWUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxFQUMzSCxlQUFlLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzNELE1BQU07UUFDUixLQUFLLFNBQVM7WUFDWixlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsRUFDM0gsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMzRCxlQUFlLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDNUgsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxNQUFNO1FBQ1IsS0FBSyxLQUFLO1lBQ1IsZUFBZSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEVBQzVILGVBQWUsQ0FBQyxFQUFF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RUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBNb3ZlU3RhcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENyb3BwZXJTdGF0ZSB9IGZyb20gJy4uL2NvbXBvbmVudC9jcm9wcGVyLnN0YXRlJztcbmltcG9ydCB7IEJhc2ljRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhc2ljLWV2ZW50LmludGVyZmFjZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nyb3BwZXJQb3NpdGlvbihjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG1haW50YWluU2l6ZTogYm9vbGVhbik6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNyb3BwZXJQb3NpdGlvbiA9IGNoZWNrQ3JvcHBlclNpemVSZXN0cmljdGlvbihjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSk7XG4gIHJldHVybiBjaGVja0Nyb3BwZXJXaXRoaW5NYXhTaXplQm91bmRzKGNyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlLCBtYWludGFpblNpemUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyU2l6ZVJlc3RyaWN0aW9uKGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGxldCBjcm9wcGVyV2lkdGggPSBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDE7XG4gIGxldCBjcm9wcGVySGVpZ2h0ID0gY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxO1xuICBjb25zdCBjZW50ZXJYID0gY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlcldpZHRoIC8gMjtcbiAgY29uc3QgY2VudGVyWSA9IGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJIZWlnaHQgLyAyO1xuXG4gIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljSGVpZ2h0ICYmIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNXaWR0aCkge1xuICAgIGNyb3BwZXJXaWR0aCA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCA+IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNXaWR0aFxuICAgICAgPyBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGhcbiAgICAgIDogY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoO1xuICAgIGNyb3BwZXJIZWlnaHQgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0ID4gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodFxuICAgICAgPyBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljSGVpZ2h0XG4gICAgICA6IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgY3JvcHBlcldpZHRoID0gTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCwgTWF0aC5taW4oY3JvcHBlcldpZHRoLCBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoLCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpKTtcbiAgICBjcm9wcGVySGVpZ2h0ID0gTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIE1hdGgubWluKGNyb3BwZXJIZWlnaHQsIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0LCBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KSk7XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGlmIChjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbyA8IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJXaWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JvcHBlcldpZHRoID0gY3JvcHBlckhlaWdodCAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHgxID0gY2VudGVyWCAtIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IHgyID0geDEgKyBjcm9wcGVyV2lkdGg7XG4gIGNvbnN0IHkxID0gY2VudGVyWSAtIGNyb3BwZXJIZWlnaHQgLyAyO1xuICBjb25zdCB5MiA9IHkxICsgY3JvcHBlckhlaWdodDtcbiAgcmV0dXJuIHt4MSwgeDIsIHkxLCB5Mn07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nyb3BwZXJXaXRoaW5NYXhTaXplQm91bmRzKHBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemUgPSBmYWxzZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGlmIChwb3NpdGlvbi54MSA8IDApIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeDE6IDAsXG4gICAgICB4MjogcG9zaXRpb24ueDIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueDEgOiAwKVxuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uLnkxIDwgMCkge1xuICAgIHBvc2l0aW9uID0ge1xuICAgICAgLi4ucG9zaXRpb24sXG4gICAgICB5MjogcG9zaXRpb24ueTIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueTEgOiAwKSxcbiAgICAgIHkxOiAwXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24ueDIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgpIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeDE6IHBvc2l0aW9uLngxIC0gKG1haW50YWluU2l6ZSA/IChwb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCkgOiAwKSxcbiAgICAgIHgyOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGhcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbi55MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeTE6IHBvc2l0aW9uLnkxIC0gKG1haW50YWluU2l6ZSA/IChwb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIDogMCksXG4gICAgICB5MjogY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUNyb3BwZXIoZXZlbnQ6IEV2ZW50IHwgQmFzaWNFdmVudCwgbW92ZVN0YXJ0OiBNb3ZlU3RhcnQpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjb25zdCBkaWZmWCA9IGdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gIGNvbnN0IGRpZmZZID0gZ2V0Q2xpZW50WShldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WTtcblxuICByZXR1cm4ge1xuICAgIHgxOiBtb3ZlU3RhcnQuY3JvcHBlci54MSArIGRpZmZYLFxuICAgIHkxOiBtb3ZlU3RhcnQuY3JvcHBlci55MSArIGRpZmZZLFxuICAgIHgyOiBtb3ZlU3RhcnQuY3JvcHBlci54MiArIGRpZmZYLFxuICAgIHkyOiBtb3ZlU3RhcnQuY3JvcHBlci55MiArIGRpZmZZXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVDcm9wcGVyKGV2ZW50OiBFdmVudCB8IEJhc2ljRXZlbnQsIG1vdmVTdGFydDogTW92ZVN0YXJ0LCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNvbnN0IGNyb3BwZXJQb3NpdGlvbiA9IHsuLi5jcm9wcGVyU3RhdGUuY3JvcHBlcn07XG4gIGNvbnN0IG1vdmVYID0gZ2V0Q2xpZW50WChldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WDtcbiAgY29uc3QgbW92ZVkgPSBnZXRDbGllbnRZKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRZO1xuICBzd2l0Y2ggKG1vdmVTdGFydC5wb3NpdGlvbikge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci55MSArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcHJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLngyICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYm90dG9tcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b21sZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLngxICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IE1hdGgubWF4KE1hdGgubWluKG1vdmVTdGFydC5jcm9wcGVyLnkyICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNvbnN0IHNjYWxlID0gJ3NjYWxlJyBpbiBldmVudCA/IGV2ZW50LnNjYWxlIGFzIG51bWJlciA6IDE7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoLCAoTWF0aC5hYnMobW92ZVN0YXJ0LmNyb3BwZXIueDIgLSBtb3ZlU3RhcnQuY3JvcHBlci54MSkpICogc2NhbGUpLFxuICAgICAgICBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKTtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKFxuICAgICAgICBNYXRoLm1heChjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCwgKE1hdGguYWJzKG1vdmVTdGFydC5jcm9wcGVyLnkyIC0gbW92ZVN0YXJ0LmNyb3BwZXIueTEpKSAqIHNjYWxlKSxcbiAgICAgICAgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gbW92ZVN0YXJ0LmNsaWVudFggLSBuZXdXaWR0aCAvIDI7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBtb3ZlU3RhcnQuY2xpZW50WCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IG1vdmVTdGFydC5jbGllbnRZIC0gbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IG1vdmVTdGFydC5jbGllbnRZICsgbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGlmIChjcm9wcGVyUG9zaXRpb24ueDEgPCAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSBjcm9wcGVyUG9zaXRpb24ueDE7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNyb3BwZXJQb3NpdGlvbi54MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgLT0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS53aWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjcm9wcGVyUG9zaXRpb24ueTEgPCAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSBjcm9wcGVyUG9zaXRpb24ueTE7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGNyb3BwZXJQb3NpdGlvbi55MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxIC09IChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0KTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gY3JvcHBlclN0YXRlLm1heFNpemUhLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICByZXR1cm4gY2hlY2tBc3BlY3RSYXRpbyhtb3ZlU3RhcnQucG9zaXRpb24hLCBjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyb3BwZXJQb3NpdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3BlY3RSYXRpbyhwb3NpdGlvbjogc3RyaW5nLCBjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjcm9wcGVyUG9zaXRpb24gPSB7Li4uY3JvcHBlclBvc2l0aW9ufTtcbiAgbGV0IG92ZXJmbG93WCA9IDA7XG4gIGxldCBvdmVyZmxvd1kgPSAwO1xuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IGNyb3BwZXJQb3NpdGlvbi54MSArIChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyUG9zaXRpb24ueTEpICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogKG92ZXJmbG93WCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcGxlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gY3JvcHBlclBvc2l0aW9uLnkyIC0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KDAgLSBjcm9wcGVyUG9zaXRpb24ueDEsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcHJpZ2h0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICBjYXNlICdib3R0b21yaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdib3R0b21sZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJQb3NpdGlvbi55MSArIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBvdmVyZmxvd1ggPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLngxLCAwKTtcbiAgICAgIG92ZXJmbG93WSA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplIS5oZWlnaHQsIDApO1xuICAgICAgaWYgKG92ZXJmbG93WCA+IDAgfHwgb3ZlcmZsb3dZID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1g7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gb3ZlcmZsb3dZIDogb3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJQb3NpdGlvbi55MSArIChjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyUG9zaXRpb24ueDEpIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICBjb25zdCBvdmVyZmxvd1gxID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi54MSwgMCk7XG4gICAgICBjb25zdCBvdmVyZmxvd1gyID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUhLndpZHRoLCAwKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93WTEgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSEuaGVpZ2h0LCAwKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93WTIgPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLnkxLCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1gxID4gMCB8fCBvdmVyZmxvd1gyID4gMCB8fCBvdmVyZmxvd1kxID4gMCB8fCBvdmVyZmxvd1kyID4gMCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgKz0gKG92ZXJmbG93WTEgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gxID8gKG92ZXJmbG93WTEgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1gxO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLT0gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gyID8gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgOiBvdmVyZmxvd1gyO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKz0gKG92ZXJmbG93WTIgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1gyID8gb3ZlcmZsb3dZMiA6IG92ZXJmbG93WDIgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IChvdmVyZmxvd1kxICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYMSA/IG92ZXJmbG93WTEgOiBvdmVyZmxvd1gxIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gY3JvcHBlclBvc2l0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xpZW50WChldmVudDogRXZlbnQgfCBCYXNpY0V2ZW50IHwgVG91Y2hFdmVudCk6IG51bWJlciB7XG4gIGlmICgndG91Y2hlcycgaW4gZXZlbnQgJiYgZXZlbnQudG91Y2hlc1swXSkge1xuICAgIHJldHVybiBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gIH0gZWxzZSBpZiAoJ2NsaWVudFgnIGluIGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFg7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaWVudFkoZXZlbnQ6IEV2ZW50IHwgQmFzaWNFdmVudCB8IFRvdWNoRXZlbnQpOiBudW1iZXIge1xuICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIGV2ZW50LnRvdWNoZXNbMF0pIHtcbiAgICByZXR1cm4gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICB9IGVsc2UgaWYgKCdjbGllbnRYJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudC5jbGllbnRZO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG4iXX0=
|
|
@@ -37,4 +37,4 @@ export function getEventForKey(key, stepSize) {
|
|
|
37
37
|
return { clientX: stepSize * -1, clientY: 0 };
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL3V0aWxzL2tleWJvYXJkLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFXO0lBQzNDLFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFlBQVk7WUFDZixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFdBQVc7WUFDZCxPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sTUFBTSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFXO0lBQ25ELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxRQUFRLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLFdBQVcsQ0FBQztRQUNqQjtZQUNFLE9BQU8sT0FBTyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBVyxFQUFFLFFBQWdCO0lBQzFELFFBQVEsR0FBRyxFQUFFO1FBQ1gsS0FBSyxTQUFTO1lBQ1osT0FBTyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQzlDLEtBQUssWUFBWTtZQUNmLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUN6QyxLQUFLLFdBQVc7WUFDZCxPQUFPLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFDekMsS0FBSyxXQUFXLENBQUM7UUFDakI7WUFDRSxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUM7S0FDL0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCYXNpY0V2ZW50fSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7UG9zaXRpb259IGZyb20gXCIuLi9pbnRlcmZhY2VzL21vdmUtc3RhcnQuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IFBvc2l0aW9uIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52ZXJ0ZWRQb3NpdGlvbkZvcktleShrZXk6IHN0cmluZyk6IFBvc2l0aW9uIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIHJldHVybiAndG9wJztcbiAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRGb3JLZXkoa2V5OiBzdHJpbmcsIHN0ZXBTaXplOiBudW1iZXIpOiBCYXNpY0V2ZW50IHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgIHJldHVybiB7Y2xpZW50WDogMCwgY2xpZW50WTogc3RlcFNpemUgKiAtMX07XG4gICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICByZXR1cm4ge2NsaWVudFg6IHN0ZXBTaXplLCBjbGllbnRZOiAwfTtcbiAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiAwLCBjbGllbnRZOiBzdGVwU2l6ZX07XG4gICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtjbGllbnRYOiBzdGVwU2l6ZSAqIC0xLCBjbGllbnRZOiAwfTtcbiAgfVxufVxuIl19
|