ngx-image-cropper 7.2.1 → 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 +56 -72
- package/esm2022/lib/component/cropper.state.mjs +188 -0
- package/esm2022/lib/component/image-cropper.component.mjs +523 -0
- package/esm2022/lib/interfaces/basic-event.interface.mjs +2 -0
- package/esm2022/lib/interfaces/cropper-options.interface.mjs +2 -0
- package/esm2022/lib/interfaces/index.mjs +2 -0
- package/esm2022/lib/interfaces/move-start.interface.mjs +8 -0
- package/esm2022/lib/services/crop.service.mjs +139 -0
- package/esm2022/lib/services/load-image.service.mjs +196 -0
- package/esm2022/lib/utils/cropper-position.utils.mjs +239 -0
- package/{esm2020 → esm2022}/lib/utils/keyboard.utils.mjs +1 -1
- package/esm2022/public-api.mjs +7 -0
- package/fesm2022/ngx-image-cropper.mjs +1500 -0
- package/fesm2022/ngx-image-cropper.mjs.map +1 -0
- package/index.d.ts +5 -7
- package/lib/component/cropper.state.d.ts +29 -0
- package/lib/component/image-cropper.component.d.ts +58 -65
- package/lib/interfaces/basic-event.interface.d.ts +4 -0
- package/lib/interfaces/cropper-options.interface.d.ts +7 -7
- 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 +5 -3
- package/package.json +10 -18
- package/public-api.d.ts +6 -1
- package/esm2020/index.mjs +0 -8
- package/esm2020/lib/component/image-cropper.component.mjs +0 -635
- package/esm2020/lib/image-cropper.module.mjs +0 -26
- package/esm2020/lib/interfaces/cropper-options.interface.mjs +0 -2
- package/esm2020/lib/interfaces/cropper.settings.mjs +0 -54
- package/esm2020/lib/interfaces/index.mjs +0 -2
- package/esm2020/lib/interfaces/move-start.interface.mjs +0 -8
- package/esm2020/lib/services/crop.service.mjs +0 -147
- package/esm2020/lib/services/cropper-position.service.mjs +0 -200
- package/esm2020/lib/services/load-image.service.mjs +0 -201
- package/esm2020/lib/utils/hammer.utils.mjs +0 -2
- package/esm2020/public-api.mjs +0 -2
- package/fesm2015/ngx-image-cropper.mjs +0 -1484
- package/fesm2015/ngx-image-cropper.mjs.map +0 -1
- package/fesm2020/ngx-image-cropper.mjs +0 -1470
- package/fesm2020/ngx-image-cropper.mjs.map +0 -1
- package/lib/image-cropper.module.d.ts +0 -8
- package/lib/interfaces/cropper.settings.d.ts +0 -38
- package/lib/services/cropper-position.service.d.ts +0 -14
- package/lib/utils/hammer.utils.d.ts +0 -7
- package/ngx-image-cropper.d.ts +0 -5
- /package/{esm2020 → esm2022}/lib/interfaces/cropper-position.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/dimensions.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/exif-transform.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/image-cropped-event.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/image-transform.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/loaded-image.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/blob.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/exif.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/percentage.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/resize.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-image-cropper.mjs +0 -0
|
@@ -1,635 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Inject, Input, isDevMode, Optional, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { HAMMER_LOADER } from '@angular/platform-browser';
|
|
3
|
-
import { CropperSettings } from '../interfaces/cropper.settings';
|
|
4
|
-
import { MoveTypes } from '../interfaces/move-start.interface';
|
|
5
|
-
import { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';
|
|
6
|
-
import { first, takeUntil } from 'rxjs/operators';
|
|
7
|
-
import { fromEvent, merge } from 'rxjs';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../services/crop.service";
|
|
10
|
-
import * as i2 from "../services/cropper-position.service";
|
|
11
|
-
import * as i3 from "../services/load-image.service";
|
|
12
|
-
import * as i4 from "@angular/platform-browser";
|
|
13
|
-
import * as i5 from "@angular/common";
|
|
14
|
-
export class ImageCropperComponent {
|
|
15
|
-
constructor(cropService, cropperPositionService, loadImageService, sanitizer, cd, zone, hammerLoader) {
|
|
16
|
-
this.cropService = cropService;
|
|
17
|
-
this.cropperPositionService = cropperPositionService;
|
|
18
|
-
this.loadImageService = loadImageService;
|
|
19
|
-
this.sanitizer = sanitizer;
|
|
20
|
-
this.cd = cd;
|
|
21
|
-
this.zone = zone;
|
|
22
|
-
this.hammerLoader = hammerLoader;
|
|
23
|
-
this.settings = new CropperSettings();
|
|
24
|
-
this.setImageMaxSizeRetries = 0;
|
|
25
|
-
this.resizedWhileHidden = false;
|
|
26
|
-
this.marginLeft = '0px';
|
|
27
|
-
this.maxSize = {
|
|
28
|
-
width: 0,
|
|
29
|
-
height: 0
|
|
30
|
-
};
|
|
31
|
-
this.moveTypes = MoveTypes;
|
|
32
|
-
this.imageVisible = false;
|
|
33
|
-
this.cropperFrameAriaLabel = this.settings.cropperFrameAriaLabel;
|
|
34
|
-
this.output = this.settings.output;
|
|
35
|
-
this.format = this.settings.format;
|
|
36
|
-
this.transform = {};
|
|
37
|
-
this.maintainAspectRatio = this.settings.maintainAspectRatio;
|
|
38
|
-
this.aspectRatio = this.settings.aspectRatio;
|
|
39
|
-
this.resetCropOnAspectRatioChange = this.settings.resetCropOnAspectRatioChange;
|
|
40
|
-
this.resizeToWidth = this.settings.resizeToWidth;
|
|
41
|
-
this.resizeToHeight = this.settings.resizeToHeight;
|
|
42
|
-
this.cropperMinWidth = this.settings.cropperMinWidth;
|
|
43
|
-
this.cropperMinHeight = this.settings.cropperMinHeight;
|
|
44
|
-
this.cropperMaxHeight = this.settings.cropperMaxHeight;
|
|
45
|
-
this.cropperMaxWidth = this.settings.cropperMaxWidth;
|
|
46
|
-
this.cropperStaticWidth = this.settings.cropperStaticWidth;
|
|
47
|
-
this.cropperStaticHeight = this.settings.cropperStaticHeight;
|
|
48
|
-
this.canvasRotation = this.settings.canvasRotation;
|
|
49
|
-
this.initialStepSize = this.settings.initialStepSize;
|
|
50
|
-
this.roundCropper = this.settings.roundCropper;
|
|
51
|
-
this.onlyScaleDown = this.settings.onlyScaleDown;
|
|
52
|
-
this.imageQuality = this.settings.imageQuality;
|
|
53
|
-
this.autoCrop = this.settings.autoCrop;
|
|
54
|
-
this.backgroundColor = this.settings.backgroundColor;
|
|
55
|
-
this.containWithinAspectRatio = this.settings.containWithinAspectRatio;
|
|
56
|
-
this.hideResizeSquares = this.settings.hideResizeSquares;
|
|
57
|
-
this.allowMoveImage = false;
|
|
58
|
-
this.cropper = {
|
|
59
|
-
x1: -100,
|
|
60
|
-
y1: -100,
|
|
61
|
-
x2: 10000,
|
|
62
|
-
y2: 10000
|
|
63
|
-
};
|
|
64
|
-
this.alignImage = this.settings.alignImage;
|
|
65
|
-
this.disabled = false;
|
|
66
|
-
this.hidden = false;
|
|
67
|
-
this.imageCropped = new EventEmitter();
|
|
68
|
-
this.startCropImage = new EventEmitter();
|
|
69
|
-
this.imageLoaded = new EventEmitter();
|
|
70
|
-
this.cropperReady = new EventEmitter();
|
|
71
|
-
this.loadImageFailed = new EventEmitter();
|
|
72
|
-
this.transformChange = new EventEmitter();
|
|
73
|
-
this.reset();
|
|
74
|
-
}
|
|
75
|
-
ngOnChanges(changes) {
|
|
76
|
-
this.onChangesUpdateSettings(changes);
|
|
77
|
-
this.onChangesInputImage(changes);
|
|
78
|
-
if (this.loadedImage?.original.image.complete && (changes['containWithinAspectRatio'] || changes['canvasRotation'])) {
|
|
79
|
-
this.loadImageService
|
|
80
|
-
.transformLoadedImage(this.loadedImage, this.settings)
|
|
81
|
-
.then((res) => this.setLoadedImage(res))
|
|
82
|
-
.catch((err) => this.loadImageError(err));
|
|
83
|
-
}
|
|
84
|
-
if (changes['cropper'] || changes['maintainAspectRatio'] || changes['aspectRatio']) {
|
|
85
|
-
this.setMaxSize();
|
|
86
|
-
this.setCropperScaledMinSize();
|
|
87
|
-
this.setCropperScaledMaxSize();
|
|
88
|
-
if (this.maintainAspectRatio &&
|
|
89
|
-
(this.resetCropOnAspectRatioChange || !this.aspectRatioIsCorrect()) &&
|
|
90
|
-
(changes['maintainAspectRatio'] || changes['aspectRatio'])) {
|
|
91
|
-
this.resetCropperPosition();
|
|
92
|
-
}
|
|
93
|
-
else if (changes['cropper']) {
|
|
94
|
-
this.checkCropperPosition(false);
|
|
95
|
-
this.doAutoCrop();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (changes['transform']) {
|
|
99
|
-
this.transform = this.transform || {};
|
|
100
|
-
this.setCssTransform();
|
|
101
|
-
this.doAutoCrop();
|
|
102
|
-
}
|
|
103
|
-
if (changes['hidden'] && this.resizedWhileHidden && !this.hidden) {
|
|
104
|
-
setTimeout(() => {
|
|
105
|
-
this.onResize();
|
|
106
|
-
this.resizedWhileHidden = false;
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
onChangesUpdateSettings(changes) {
|
|
111
|
-
this.settings.setOptionsFromChanges(changes);
|
|
112
|
-
if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) {
|
|
113
|
-
this.hideResizeSquares = true;
|
|
114
|
-
this.settings.setOptions({
|
|
115
|
-
hideResizeSquares: true,
|
|
116
|
-
cropperMinWidth: this.settings.cropperStaticWidth,
|
|
117
|
-
cropperMinHeight: this.settings.cropperStaticHeight,
|
|
118
|
-
cropperMaxHeight: this.settings.cropperStaticHeight,
|
|
119
|
-
cropperMaxWidth: this.settings.cropperStaticWidth,
|
|
120
|
-
maintainAspectRatio: false
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
onChangesInputImage(changes) {
|
|
125
|
-
if (changes['imageChangedEvent'] || changes['imageURL'] || changes['imageBase64'] || changes['imageFile']) {
|
|
126
|
-
this.reset();
|
|
127
|
-
}
|
|
128
|
-
if (changes['imageChangedEvent'] && this.isValidImageChangedEvent()) {
|
|
129
|
-
this.loadImageFile(this.imageChangedEvent.target.files[0]);
|
|
130
|
-
}
|
|
131
|
-
if (changes['imageURL'] && this.imageURL) {
|
|
132
|
-
this.loadImageFromURL(this.imageURL);
|
|
133
|
-
}
|
|
134
|
-
if (changes['imageBase64'] && this.imageBase64) {
|
|
135
|
-
this.loadBase64Image(this.imageBase64);
|
|
136
|
-
}
|
|
137
|
-
if (changes['imageFile'] && this.imageFile) {
|
|
138
|
-
this.loadImageFile(this.imageFile);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
isValidImageChangedEvent() {
|
|
142
|
-
return this.imageChangedEvent?.target?.files?.length > 0;
|
|
143
|
-
}
|
|
144
|
-
setCssTransform() {
|
|
145
|
-
const translateUnit = this.transform?.translateUnit || '%';
|
|
146
|
-
this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle(`translate(${this.transform.translateH || 0}${translateUnit}, ${this.transform.translateV || 0}${translateUnit})` +
|
|
147
|
-
' scaleX(' + (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) + ')' +
|
|
148
|
-
' scaleY(' + (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) + ')' +
|
|
149
|
-
' rotate(' + (this.transform.rotate || 0) + 'deg)');
|
|
150
|
-
}
|
|
151
|
-
ngOnInit() {
|
|
152
|
-
this.settings.stepSize = this.initialStepSize;
|
|
153
|
-
this.activatePinchGesture();
|
|
154
|
-
}
|
|
155
|
-
reset() {
|
|
156
|
-
this.imageVisible = false;
|
|
157
|
-
this.loadedImage = undefined;
|
|
158
|
-
this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg'
|
|
159
|
-
+ 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU'
|
|
160
|
-
+ 'AAarVyFEAAAAASUVORK5CYII=';
|
|
161
|
-
this.moveStart = {
|
|
162
|
-
active: false,
|
|
163
|
-
type: null,
|
|
164
|
-
position: null,
|
|
165
|
-
x1: 0,
|
|
166
|
-
y1: 0,
|
|
167
|
-
x2: 0,
|
|
168
|
-
y2: 0,
|
|
169
|
-
clientX: 0,
|
|
170
|
-
clientY: 0
|
|
171
|
-
};
|
|
172
|
-
this.maxSize = {
|
|
173
|
-
width: 0,
|
|
174
|
-
height: 0
|
|
175
|
-
};
|
|
176
|
-
this.cropper.x1 = -100;
|
|
177
|
-
this.cropper.y1 = -100;
|
|
178
|
-
this.cropper.x2 = 10000;
|
|
179
|
-
this.cropper.y2 = 10000;
|
|
180
|
-
}
|
|
181
|
-
loadImageFile(file) {
|
|
182
|
-
this.loadImageService
|
|
183
|
-
.loadImageFile(file, this.settings)
|
|
184
|
-
.then((res) => this.setLoadedImage(res))
|
|
185
|
-
.catch((err) => this.loadImageError(err));
|
|
186
|
-
}
|
|
187
|
-
loadBase64Image(imageBase64) {
|
|
188
|
-
this.loadImageService
|
|
189
|
-
.loadBase64Image(imageBase64, this.settings)
|
|
190
|
-
.then((res) => this.setLoadedImage(res))
|
|
191
|
-
.catch((err) => this.loadImageError(err));
|
|
192
|
-
}
|
|
193
|
-
loadImageFromURL(url) {
|
|
194
|
-
this.loadImageService
|
|
195
|
-
.loadImageFromURL(url, this.settings)
|
|
196
|
-
.then((res) => this.setLoadedImage(res))
|
|
197
|
-
.catch((err) => this.loadImageError(err));
|
|
198
|
-
}
|
|
199
|
-
setLoadedImage(loadedImage) {
|
|
200
|
-
this.loadedImage = loadedImage;
|
|
201
|
-
this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.objectUrl);
|
|
202
|
-
this.cd.markForCheck();
|
|
203
|
-
}
|
|
204
|
-
loadImageError(error) {
|
|
205
|
-
console.error(error);
|
|
206
|
-
this.loadImageFailed.emit();
|
|
207
|
-
}
|
|
208
|
-
imageLoadedInView() {
|
|
209
|
-
if (this.loadedImage != null) {
|
|
210
|
-
this.imageLoaded.emit(this.loadedImage);
|
|
211
|
-
this.setImageMaxSizeRetries = 0;
|
|
212
|
-
setTimeout(() => this.checkImageMaxSizeRecursively());
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
checkImageMaxSizeRecursively() {
|
|
216
|
-
if (this.setImageMaxSizeRetries > 40) {
|
|
217
|
-
this.loadImageFailed.emit();
|
|
218
|
-
}
|
|
219
|
-
else if (this.sourceImageLoaded()) {
|
|
220
|
-
this.setMaxSize();
|
|
221
|
-
this.setCropperScaledMinSize();
|
|
222
|
-
this.setCropperScaledMaxSize();
|
|
223
|
-
this.resetCropperPosition();
|
|
224
|
-
this.cropperReady.emit({ ...this.maxSize });
|
|
225
|
-
this.cd.markForCheck();
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
this.setImageMaxSizeRetries++;
|
|
229
|
-
setTimeout(() => this.checkImageMaxSizeRecursively(), 50);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
sourceImageLoaded() {
|
|
233
|
-
return this.sourceImage?.nativeElement?.offsetWidth > 0;
|
|
234
|
-
}
|
|
235
|
-
onResize() {
|
|
236
|
-
if (!this.loadedImage) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
if (this.hidden) {
|
|
240
|
-
this.resizedWhileHidden = true;
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
const oldMaxSize = { ...this.maxSize };
|
|
244
|
-
this.setMaxSize();
|
|
245
|
-
this.resizeCropperPosition(oldMaxSize);
|
|
246
|
-
this.setCropperScaledMinSize();
|
|
247
|
-
this.setCropperScaledMaxSize();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
async activatePinchGesture() {
|
|
251
|
-
// Loads HammerJS via angular APIs if configured
|
|
252
|
-
await this.hammerLoader?.();
|
|
253
|
-
const Hammer = window?.['Hammer'] || null;
|
|
254
|
-
if (Hammer) {
|
|
255
|
-
const hammer = new Hammer(this.wrapper.nativeElement);
|
|
256
|
-
hammer.get('pinch').set({ enable: true });
|
|
257
|
-
hammer.on('pinchmove', this.onPinch.bind(this));
|
|
258
|
-
hammer.on('pinchend', this.pinchStop.bind(this));
|
|
259
|
-
hammer.on('pinchstart', this.startPinch.bind(this));
|
|
260
|
-
}
|
|
261
|
-
else if (isDevMode()) {
|
|
262
|
-
console.warn('[NgxImageCropper] Could not find HammerJS - Pinch Gesture won\'t work');
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
resizeCropperPosition(oldMaxSize) {
|
|
266
|
-
if (oldMaxSize.width !== this.maxSize.width || oldMaxSize.height !== this.maxSize.height) {
|
|
267
|
-
this.cropper.x1 = this.cropper.x1 * this.maxSize.width / oldMaxSize.width;
|
|
268
|
-
this.cropper.x2 = this.cropper.x2 * this.maxSize.width / oldMaxSize.width;
|
|
269
|
-
this.cropper.y1 = this.cropper.y1 * this.maxSize.height / oldMaxSize.height;
|
|
270
|
-
this.cropper.y2 = this.cropper.y2 * this.maxSize.height / oldMaxSize.height;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
resetCropperPosition() {
|
|
274
|
-
this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings, this.maxSize);
|
|
275
|
-
this.doAutoCrop();
|
|
276
|
-
this.imageVisible = true;
|
|
277
|
-
}
|
|
278
|
-
keyboardAccess(event) {
|
|
279
|
-
this.changeKeyboardStepSize(event);
|
|
280
|
-
this.keyboardMoveCropper(event);
|
|
281
|
-
}
|
|
282
|
-
changeKeyboardStepSize(event) {
|
|
283
|
-
const key = +event.key;
|
|
284
|
-
if (key >= 1 && key <= 9) {
|
|
285
|
-
this.settings.stepSize = key;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
keyboardMoveCropper(event) {
|
|
289
|
-
const keyboardWhiteList = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];
|
|
290
|
-
if (!(keyboardWhiteList.includes(event.key))) {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;
|
|
294
|
-
const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);
|
|
295
|
-
const moveEvent = getEventForKey(event.key, this.settings.stepSize);
|
|
296
|
-
event.preventDefault();
|
|
297
|
-
event.stopPropagation();
|
|
298
|
-
this.startMove({ clientX: 0, clientY: 0 }, moveType, position);
|
|
299
|
-
this.handleMouseMove(moveEvent);
|
|
300
|
-
this.handleMouseUp();
|
|
301
|
-
}
|
|
302
|
-
startMove(event, moveType, position = null) {
|
|
303
|
-
if (this.disabled
|
|
304
|
-
|| this.moveStart?.active && this.moveStart?.type === MoveTypes.Pinch
|
|
305
|
-
|| moveType === MoveTypes.Drag && !this.allowMoveImage) {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (event.preventDefault) {
|
|
309
|
-
event.preventDefault();
|
|
310
|
-
}
|
|
311
|
-
this.moveStart = {
|
|
312
|
-
active: true,
|
|
313
|
-
type: moveType,
|
|
314
|
-
position,
|
|
315
|
-
transform: { ...this.transform },
|
|
316
|
-
clientX: this.cropperPositionService.getClientX(event),
|
|
317
|
-
clientY: this.cropperPositionService.getClientY(event),
|
|
318
|
-
...this.cropper
|
|
319
|
-
};
|
|
320
|
-
this.initMouseMove();
|
|
321
|
-
}
|
|
322
|
-
initMouseMove() {
|
|
323
|
-
merge(fromEvent(document, 'mousemove'), fromEvent(document, 'touchmove')).pipe(takeUntil(merge(fromEvent(document, 'mouseup'), fromEvent(document, 'touchend')).pipe(first())))
|
|
324
|
-
.subscribe({
|
|
325
|
-
next: (event) => this.zone.run(() => {
|
|
326
|
-
this.handleMouseMove(event);
|
|
327
|
-
this.cd.markForCheck();
|
|
328
|
-
}),
|
|
329
|
-
complete: () => this.zone.run(() => {
|
|
330
|
-
this.handleMouseUp();
|
|
331
|
-
this.cd.markForCheck();
|
|
332
|
-
})
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
startPinch(event) {
|
|
336
|
-
if (!this.safeImgDataUrl) {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
if (event.preventDefault) {
|
|
340
|
-
event.preventDefault();
|
|
341
|
-
}
|
|
342
|
-
this.moveStart = {
|
|
343
|
-
active: true,
|
|
344
|
-
type: MoveTypes.Pinch,
|
|
345
|
-
position: 'center',
|
|
346
|
-
clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2,
|
|
347
|
-
clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2,
|
|
348
|
-
...this.cropper
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
handleMouseMove(event) {
|
|
352
|
-
if (this.moveStart.active) {
|
|
353
|
-
if (event.stopPropagation) {
|
|
354
|
-
event.stopPropagation();
|
|
355
|
-
}
|
|
356
|
-
if (event.preventDefault) {
|
|
357
|
-
event.preventDefault();
|
|
358
|
-
}
|
|
359
|
-
if (this.moveStart.type === MoveTypes.Move) {
|
|
360
|
-
this.cropperPositionService.move(event, this.moveStart, this.cropper);
|
|
361
|
-
this.checkCropperPosition(true);
|
|
362
|
-
}
|
|
363
|
-
else if (this.moveStart.type === MoveTypes.Resize) {
|
|
364
|
-
if (!this.cropperStaticWidth && !this.cropperStaticHeight) {
|
|
365
|
-
this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);
|
|
366
|
-
}
|
|
367
|
-
this.checkCropperPosition(false);
|
|
368
|
-
}
|
|
369
|
-
else if (this.moveStart.type === MoveTypes.Drag) {
|
|
370
|
-
const diffX = this.cropperPositionService.getClientX(event) - this.moveStart.clientX;
|
|
371
|
-
const diffY = this.cropperPositionService.getClientY(event) - this.moveStart.clientY;
|
|
372
|
-
this.transform = {
|
|
373
|
-
...this.transform,
|
|
374
|
-
translateH: (this.moveStart.transform?.translateH || 0) + diffX,
|
|
375
|
-
translateV: (this.moveStart.transform?.translateV || 0) + diffY
|
|
376
|
-
};
|
|
377
|
-
this.setCssTransform();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
onPinch(event) {
|
|
382
|
-
if (this.moveStart.active) {
|
|
383
|
-
if (event.stopPropagation) {
|
|
384
|
-
event.stopPropagation();
|
|
385
|
-
}
|
|
386
|
-
if (event.preventDefault) {
|
|
387
|
-
event.preventDefault();
|
|
388
|
-
}
|
|
389
|
-
if (this.moveStart.type === MoveTypes.Pinch) {
|
|
390
|
-
this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);
|
|
391
|
-
this.checkCropperPosition(false);
|
|
392
|
-
}
|
|
393
|
-
this.cd.markForCheck();
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
setMaxSize() {
|
|
397
|
-
if (this.sourceImage) {
|
|
398
|
-
const sourceImageStyle = getComputedStyle(this.sourceImage.nativeElement);
|
|
399
|
-
this.maxSize.width = parseFloat(sourceImageStyle.width);
|
|
400
|
-
this.maxSize.height = parseFloat(sourceImageStyle.height);
|
|
401
|
-
this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)');
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
setCropperScaledMinSize() {
|
|
405
|
-
if (this.loadedImage?.transformed?.image) {
|
|
406
|
-
this.setCropperScaledMinWidth();
|
|
407
|
-
this.setCropperScaledMinHeight();
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
this.settings.cropperScaledMinWidth = 20;
|
|
411
|
-
this.settings.cropperScaledMinHeight = 20;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
setCropperScaledMinWidth() {
|
|
415
|
-
this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0
|
|
416
|
-
? Math.max(20, this.cropperMinWidth / this.loadedImage.transformed.image.width * this.maxSize.width)
|
|
417
|
-
: 20;
|
|
418
|
-
}
|
|
419
|
-
setCropperScaledMinHeight() {
|
|
420
|
-
if (this.maintainAspectRatio) {
|
|
421
|
-
this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio);
|
|
422
|
-
}
|
|
423
|
-
else if (this.cropperMinHeight > 0) {
|
|
424
|
-
this.settings.cropperScaledMinHeight = Math.max(20, this.cropperMinHeight / this.loadedImage.transformed.image.height * this.maxSize.height);
|
|
425
|
-
}
|
|
426
|
-
else {
|
|
427
|
-
this.settings.cropperScaledMinHeight = 20;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
setCropperScaledMaxSize() {
|
|
431
|
-
if (this.loadedImage?.transformed?.image) {
|
|
432
|
-
const ratio = this.loadedImage.transformed.size.width / this.maxSize.width;
|
|
433
|
-
this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width;
|
|
434
|
-
this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height;
|
|
435
|
-
if (this.maintainAspectRatio) {
|
|
436
|
-
if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) {
|
|
437
|
-
this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio;
|
|
438
|
-
}
|
|
439
|
-
else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) {
|
|
440
|
-
this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
this.settings.cropperScaledMaxWidth = this.maxSize.width;
|
|
446
|
-
this.settings.cropperScaledMaxHeight = this.maxSize.height;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
checkCropperPosition(maintainSize = false) {
|
|
450
|
-
if (this.cropper.x1 < 0) {
|
|
451
|
-
this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0;
|
|
452
|
-
this.cropper.x1 = 0;
|
|
453
|
-
}
|
|
454
|
-
if (this.cropper.y1 < 0) {
|
|
455
|
-
this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0;
|
|
456
|
-
this.cropper.y1 = 0;
|
|
457
|
-
}
|
|
458
|
-
if (this.cropper.x2 > this.maxSize.width) {
|
|
459
|
-
this.cropper.x1 -= maintainSize ? (this.cropper.x2 - this.maxSize.width) : 0;
|
|
460
|
-
this.cropper.x2 = this.maxSize.width;
|
|
461
|
-
}
|
|
462
|
-
if (this.cropper.y2 > this.maxSize.height) {
|
|
463
|
-
this.cropper.y1 -= maintainSize ? (this.cropper.y2 - this.maxSize.height) : 0;
|
|
464
|
-
this.cropper.y2 = this.maxSize.height;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
handleMouseUp() {
|
|
468
|
-
if (this.moveStart.active) {
|
|
469
|
-
this.moveStart.active = false;
|
|
470
|
-
if (this.moveStart?.type === MoveTypes.Drag) {
|
|
471
|
-
this.transformChange.emit(this.transform);
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
this.doAutoCrop();
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
pinchStop() {
|
|
479
|
-
if (this.moveStart.active) {
|
|
480
|
-
this.moveStart.active = false;
|
|
481
|
-
this.doAutoCrop();
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
doAutoCrop() {
|
|
485
|
-
if (this.autoCrop) {
|
|
486
|
-
void this.crop();
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
crop(output = this.settings.output) {
|
|
490
|
-
if (this.loadedImage?.transformed?.image != null) {
|
|
491
|
-
this.startCropImage.emit();
|
|
492
|
-
if (output === 'blob') {
|
|
493
|
-
return this.cropToBlob();
|
|
494
|
-
}
|
|
495
|
-
else if (output === 'base64') {
|
|
496
|
-
return this.cropToBase64();
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
return null;
|
|
500
|
-
}
|
|
501
|
-
cropToBlob() {
|
|
502
|
-
return new Promise((resolve, reject) => this.zone.run(async () => {
|
|
503
|
-
const result = await this.cropService.crop(this.loadedImage, this.cropper, this.settings, 'blob', this.maxSize);
|
|
504
|
-
if (result) {
|
|
505
|
-
this.imageCropped.emit(result);
|
|
506
|
-
resolve(result);
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
reject('Crop image failed');
|
|
510
|
-
}
|
|
511
|
-
}));
|
|
512
|
-
}
|
|
513
|
-
cropToBase64() {
|
|
514
|
-
const result = this.cropService.crop(this.loadedImage, this.cropper, this.settings, 'base64', this.maxSize);
|
|
515
|
-
if (result) {
|
|
516
|
-
this.imageCropped.emit(result);
|
|
517
|
-
return result;
|
|
518
|
-
}
|
|
519
|
-
return null;
|
|
520
|
-
}
|
|
521
|
-
aspectRatioIsCorrect() {
|
|
522
|
-
const currentCropAspectRatio = (this.cropper.x2 - this.cropper.x1) / (this.cropper.y2 - this.cropper.y1);
|
|
523
|
-
return currentCropAspectRatio === this.aspectRatio;
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
ImageCropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperComponent, deps: [{ token: i1.CropService }, { token: i2.CropperPositionService }, { token: i3.LoadImageService }, { token: i4.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: HAMMER_LOADER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
527
|
-
ImageCropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: ImageCropperComponent, selector: "image-cropper", inputs: { imageChangedEvent: "imageChangedEvent", imageURL: "imageURL", imageBase64: "imageBase64", imageFile: "imageFile", imageAltText: "imageAltText", cropperFrameAriaLabel: "cropperFrameAriaLabel", output: "output", format: "format", transform: "transform", maintainAspectRatio: "maintainAspectRatio", aspectRatio: "aspectRatio", resetCropOnAspectRatioChange: "resetCropOnAspectRatioChange", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", cropperMinWidth: "cropperMinWidth", cropperMinHeight: "cropperMinHeight", cropperMaxHeight: "cropperMaxHeight", cropperMaxWidth: "cropperMaxWidth", cropperStaticWidth: "cropperStaticWidth", cropperStaticHeight: "cropperStaticHeight", canvasRotation: "canvasRotation", initialStepSize: "initialStepSize", roundCropper: "roundCropper", onlyScaleDown: "onlyScaleDown", imageQuality: "imageQuality", autoCrop: "autoCrop", backgroundColor: "backgroundColor", containWithinAspectRatio: "containWithinAspectRatio", hideResizeSquares: "hideResizeSquares", allowMoveImage: "allowMoveImage", cropper: "cropper", alignImage: "alignImage", disabled: "disabled", hidden: "hidden" }, outputs: { imageCropped: "imageCropped", startCropImage: "startCropImage", imageLoaded: "imageLoaded", cropperReady: "cropperReady", loadImageFailed: "loadImageFailed", transformChange: "transformChange" }, host: { listeners: { "window:resize": "onResize()" }, properties: { "style.text-align": "this.alignImage", "class.disabled": "this.disabled", "class.ngx-ix-hidden": "this.hidden" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "sourceImage", first: true, predicate: ["sourceImage"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n [style.background]=\"imageVisible && backgroundColor\"\n #wrapper\n>\n <img\n #sourceImage\n class=\"ngx-ic-source-image\"\n role=\"presentation\"\n *ngIf=\"safeImgDataUrl\"\n [src]=\"safeImgDataUrl\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n [style.transform]=\"safeTransformStyle\"\n [class.ngx-ic-draggable]=\"!disabled && allowMoveImage\"\n [attr.alt]=\"imageAltText\"\n (load)=\"imageLoadedInView()\"\n (mousedown)=\"startMove($event, moveTypes.Drag)\"\n (touchstart)=\"startMove($event, moveTypes.Drag)\"\n (error)=\"loadImageError($event)\"\n >\n <div\n class=\"ngx-ic-overlay\"\n [style.width.px]=\"maxSize.width\"\n [style.height.px]=\"maxSize.height\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n ></div>\n <div class=\"ngx-ic-cropper\"\n *ngIf=\"imageVisible\"\n [class.ngx-ic-round]=\"roundCropper\"\n [attr.aria-label]=\"cropperFrameAriaLabel\"\n [style.top.px]=\"cropper.y1\"\n [style.left.px]=\"cropper.x1\"\n [style.width.px]=\"cropper.x2 - cropper.x1\"\n [style.height.px]=\"cropper.y2 - cropper.y1\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n (keydown)=\"keyboardAccess($event)\"\n tabindex=\"0\"\n >\n <div\n (mousedown)=\"startMove($event, moveTypes.Move)\"\n (touchstart)=\"startMove($event, moveTypes.Move)\"\n class=\"ngx-ic-move\"\n role=\"presentation\">\n </div>\n <ng-container *ngIf=\"!hideResizeSquares\">\n <span class=\"ngx-ic-resize ngx-ic-topleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-top\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-topright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-right\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottom\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-left\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-top\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-right\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-bottom\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-left\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:flex;position:relative;width:100%;max-width:100%;max-height:100%;overflow:hidden;padding:5px;text-align:center}:host>div{width:100%;position:relative}:host>div img.ngx-ic-source-image{max-width:100%;max-height:100%;transform-origin:center}:host>div img.ngx-ic-source-image.ngx-ic-draggable{user-drag:none;-webkit-user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;cursor:grab}:host .ngx-ic-overlay{position:absolute;pointer-events:none;touch-action:none;outline:var(--cropper-overlay-color, white) solid 100vw;top:0;left:0}:host .ngx-ic-cropper{position:absolute;display:flex;color:#53535c;background:transparent;outline:rgba(255,255,255,.3) solid 100vw;outline:var(--cropper-outline-color, rgba(255, 255, 255, .3)) solid 100vw;touch-action:none}@media (orientation: portrait){:host .ngx-ic-cropper{outline-width:100vh}}:host .ngx-ic-cropper:after{position:absolute;content:\"\";inset:0;pointer-events:none;border:dashed 1px;opacity:.75;color:inherit;z-index:1}:host .ngx-ic-cropper .ngx-ic-move{width:100%;cursor:move;border:1px solid rgba(255,255,255,.5)}:host .ngx-ic-cropper:focus .ngx-ic-move{border-color:#1e90ff;border-width:2px}:host .ngx-ic-cropper .ngx-ic-resize{position:absolute;display:inline-block;line-height:6px;padding:8px;opacity:.85;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize .ngx-ic-square{display:inline-block;background:#53535C;width:6px;height:6px;border:1px solid rgba(255,255,255,.5);box-sizing:content-box}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topleft{top:-12px;left:-12px;cursor:nwse-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-top{top:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topright{top:-12px;right:-12px;cursor:nesw-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-right{top:calc(50% - 12px);right:-12px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomright{bottom:-12px;right:-12px;cursor:nwse-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottom{bottom:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomleft{bottom:-12px;left:-12px;cursor:nesw-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-left{top:calc(50% - 12px);left:-12px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar{position:absolute;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-top{top:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-right{top:11px;right:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-bottom{bottom:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-left{top:11px;left:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .ngx-ic-cropper.ngx-ic-round{outline-color:transparent}:host .ngx-ic-cropper.ngx-ic-round:after{border-radius:100%;box-shadow:0 0 0 100vw #ffffff4d;box-shadow:0 0 0 100vw var(--cropper-outline-color, rgba(255, 255, 255, .3))}@media (orientation: portrait){:host .ngx-ic-cropper.ngx-ic-round:after{box-shadow:0 0 0 100vh #ffffff4d;box-shadow:0 0 0 100vh var(--cropper-outline-color, rgba(255, 255, 255, .3))}}:host .ngx-ic-cropper.ngx-ic-round .ngx-ic-move{border-radius:100%}:host.disabled .ngx-ic-cropper .ngx-ic-resize,:host.disabled .ngx-ic-cropper .ngx-ic-resize-bar,:host.disabled .ngx-ic-cropper .ngx-ic-move{display:none}:host.ngx-ix-hidden{display:none}\n"], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
528
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperComponent, decorators: [{
|
|
529
|
-
type: Component,
|
|
530
|
-
args: [{ selector: 'image-cropper', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [style.background]=\"imageVisible && backgroundColor\"\n #wrapper\n>\n <img\n #sourceImage\n class=\"ngx-ic-source-image\"\n role=\"presentation\"\n *ngIf=\"safeImgDataUrl\"\n [src]=\"safeImgDataUrl\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n [style.transform]=\"safeTransformStyle\"\n [class.ngx-ic-draggable]=\"!disabled && allowMoveImage\"\n [attr.alt]=\"imageAltText\"\n (load)=\"imageLoadedInView()\"\n (mousedown)=\"startMove($event, moveTypes.Drag)\"\n (touchstart)=\"startMove($event, moveTypes.Drag)\"\n (error)=\"loadImageError($event)\"\n >\n <div\n class=\"ngx-ic-overlay\"\n [style.width.px]=\"maxSize.width\"\n [style.height.px]=\"maxSize.height\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n ></div>\n <div class=\"ngx-ic-cropper\"\n *ngIf=\"imageVisible\"\n [class.ngx-ic-round]=\"roundCropper\"\n [attr.aria-label]=\"cropperFrameAriaLabel\"\n [style.top.px]=\"cropper.y1\"\n [style.left.px]=\"cropper.x1\"\n [style.width.px]=\"cropper.x2 - cropper.x1\"\n [style.height.px]=\"cropper.y2 - cropper.y1\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n (keydown)=\"keyboardAccess($event)\"\n tabindex=\"0\"\n >\n <div\n (mousedown)=\"startMove($event, moveTypes.Move)\"\n (touchstart)=\"startMove($event, moveTypes.Move)\"\n class=\"ngx-ic-move\"\n role=\"presentation\">\n </div>\n <ng-container *ngIf=\"!hideResizeSquares\">\n <span class=\"ngx-ic-resize ngx-ic-topleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-top\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-topright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-right\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomright\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottom\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomleft\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-left\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-top\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-right\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-bottom\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-left\"\n role=\"presentation\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\n </span>\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:flex;position:relative;width:100%;max-width:100%;max-height:100%;overflow:hidden;padding:5px;text-align:center}:host>div{width:100%;position:relative}:host>div img.ngx-ic-source-image{max-width:100%;max-height:100%;transform-origin:center}:host>div img.ngx-ic-source-image.ngx-ic-draggable{user-drag:none;-webkit-user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;cursor:grab}:host .ngx-ic-overlay{position:absolute;pointer-events:none;touch-action:none;outline:var(--cropper-overlay-color, white) solid 100vw;top:0;left:0}:host .ngx-ic-cropper{position:absolute;display:flex;color:#53535c;background:transparent;outline:rgba(255,255,255,.3) solid 100vw;outline:var(--cropper-outline-color, rgba(255, 255, 255, .3)) solid 100vw;touch-action:none}@media (orientation: portrait){:host .ngx-ic-cropper{outline-width:100vh}}:host .ngx-ic-cropper:after{position:absolute;content:\"\";inset:0;pointer-events:none;border:dashed 1px;opacity:.75;color:inherit;z-index:1}:host .ngx-ic-cropper .ngx-ic-move{width:100%;cursor:move;border:1px solid rgba(255,255,255,.5)}:host .ngx-ic-cropper:focus .ngx-ic-move{border-color:#1e90ff;border-width:2px}:host .ngx-ic-cropper .ngx-ic-resize{position:absolute;display:inline-block;line-height:6px;padding:8px;opacity:.85;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize .ngx-ic-square{display:inline-block;background:#53535C;width:6px;height:6px;border:1px solid rgba(255,255,255,.5);box-sizing:content-box}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topleft{top:-12px;left:-12px;cursor:nwse-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-top{top:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topright{top:-12px;right:-12px;cursor:nesw-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-right{top:calc(50% - 12px);right:-12px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomright{bottom:-12px;right:-12px;cursor:nwse-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottom{bottom:-12px;left:calc(50% - 12px);cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomleft{bottom:-12px;left:-12px;cursor:nesw-resize}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-left{top:calc(50% - 12px);left:-12px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar{position:absolute;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-top{top:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-right{top:11px;right:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-bottom{bottom:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-left{top:11px;left:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}:host .ngx-ic-cropper.ngx-ic-round{outline-color:transparent}:host .ngx-ic-cropper.ngx-ic-round:after{border-radius:100%;box-shadow:0 0 0 100vw #ffffff4d;box-shadow:0 0 0 100vw var(--cropper-outline-color, rgba(255, 255, 255, .3))}@media (orientation: portrait){:host .ngx-ic-cropper.ngx-ic-round:after{box-shadow:0 0 0 100vh #ffffff4d;box-shadow:0 0 0 100vh var(--cropper-outline-color, rgba(255, 255, 255, .3))}}:host .ngx-ic-cropper.ngx-ic-round .ngx-ic-move{border-radius:100%}:host.disabled .ngx-ic-cropper .ngx-ic-resize,:host.disabled .ngx-ic-cropper .ngx-ic-resize-bar,:host.disabled .ngx-ic-cropper .ngx-ic-move{display:none}:host.ngx-ix-hidden{display:none}\n"] }]
|
|
531
|
-
}], ctorParameters: function () { return [{ type: i1.CropService }, { type: i2.CropperPositionService }, { type: i3.LoadImageService }, { type: i4.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
532
|
-
type: Optional
|
|
533
|
-
}, {
|
|
534
|
-
type: Inject,
|
|
535
|
-
args: [HAMMER_LOADER]
|
|
536
|
-
}] }]; }, propDecorators: { wrapper: [{
|
|
537
|
-
type: ViewChild,
|
|
538
|
-
args: ['wrapper', { static: true }]
|
|
539
|
-
}], sourceImage: [{
|
|
540
|
-
type: ViewChild,
|
|
541
|
-
args: ['sourceImage', { static: false }]
|
|
542
|
-
}], imageChangedEvent: [{
|
|
543
|
-
type: Input
|
|
544
|
-
}], imageURL: [{
|
|
545
|
-
type: Input
|
|
546
|
-
}], imageBase64: [{
|
|
547
|
-
type: Input
|
|
548
|
-
}], imageFile: [{
|
|
549
|
-
type: Input
|
|
550
|
-
}], imageAltText: [{
|
|
551
|
-
type: Input
|
|
552
|
-
}], cropperFrameAriaLabel: [{
|
|
553
|
-
type: Input
|
|
554
|
-
}], output: [{
|
|
555
|
-
type: Input
|
|
556
|
-
}], format: [{
|
|
557
|
-
type: Input
|
|
558
|
-
}], transform: [{
|
|
559
|
-
type: Input
|
|
560
|
-
}], maintainAspectRatio: [{
|
|
561
|
-
type: Input
|
|
562
|
-
}], aspectRatio: [{
|
|
563
|
-
type: Input
|
|
564
|
-
}], resetCropOnAspectRatioChange: [{
|
|
565
|
-
type: Input
|
|
566
|
-
}], resizeToWidth: [{
|
|
567
|
-
type: Input
|
|
568
|
-
}], resizeToHeight: [{
|
|
569
|
-
type: Input
|
|
570
|
-
}], cropperMinWidth: [{
|
|
571
|
-
type: Input
|
|
572
|
-
}], cropperMinHeight: [{
|
|
573
|
-
type: Input
|
|
574
|
-
}], cropperMaxHeight: [{
|
|
575
|
-
type: Input
|
|
576
|
-
}], cropperMaxWidth: [{
|
|
577
|
-
type: Input
|
|
578
|
-
}], cropperStaticWidth: [{
|
|
579
|
-
type: Input
|
|
580
|
-
}], cropperStaticHeight: [{
|
|
581
|
-
type: Input
|
|
582
|
-
}], canvasRotation: [{
|
|
583
|
-
type: Input
|
|
584
|
-
}], initialStepSize: [{
|
|
585
|
-
type: Input
|
|
586
|
-
}], roundCropper: [{
|
|
587
|
-
type: Input
|
|
588
|
-
}], onlyScaleDown: [{
|
|
589
|
-
type: Input
|
|
590
|
-
}], imageQuality: [{
|
|
591
|
-
type: Input
|
|
592
|
-
}], autoCrop: [{
|
|
593
|
-
type: Input
|
|
594
|
-
}], backgroundColor: [{
|
|
595
|
-
type: Input
|
|
596
|
-
}], containWithinAspectRatio: [{
|
|
597
|
-
type: Input
|
|
598
|
-
}], hideResizeSquares: [{
|
|
599
|
-
type: Input
|
|
600
|
-
}], allowMoveImage: [{
|
|
601
|
-
type: Input
|
|
602
|
-
}], cropper: [{
|
|
603
|
-
type: Input
|
|
604
|
-
}], alignImage: [{
|
|
605
|
-
type: HostBinding,
|
|
606
|
-
args: ['style.text-align']
|
|
607
|
-
}, {
|
|
608
|
-
type: Input
|
|
609
|
-
}], disabled: [{
|
|
610
|
-
type: HostBinding,
|
|
611
|
-
args: ['class.disabled']
|
|
612
|
-
}, {
|
|
613
|
-
type: Input
|
|
614
|
-
}], hidden: [{
|
|
615
|
-
type: HostBinding,
|
|
616
|
-
args: ['class.ngx-ix-hidden']
|
|
617
|
-
}, {
|
|
618
|
-
type: Input
|
|
619
|
-
}], imageCropped: [{
|
|
620
|
-
type: Output
|
|
621
|
-
}], startCropImage: [{
|
|
622
|
-
type: Output
|
|
623
|
-
}], imageLoaded: [{
|
|
624
|
-
type: Output
|
|
625
|
-
}], cropperReady: [{
|
|
626
|
-
type: Output
|
|
627
|
-
}], loadImageFailed: [{
|
|
628
|
-
type: Output
|
|
629
|
-
}], transformChange: [{
|
|
630
|
-
type: Output
|
|
631
|
-
}], onResize: [{
|
|
632
|
-
type: HostListener,
|
|
633
|
-
args: ['window:resize']
|
|
634
|
-
}] } });
|
|
635
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL2NvbXBvbmVudC9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBSVQsUUFBUSxFQUNSLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFnQixhQUFhLEVBQW9DLE1BQU0sMkJBQTJCLENBQUM7QUFHMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUsvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLHlCQUF5QixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkcsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8scUJBQXFCO0lBdUVoQyxZQUNVLFdBQXdCLEVBQ3hCLHNCQUE4QyxFQUM5QyxnQkFBa0MsRUFDbEMsU0FBdUIsRUFDdkIsRUFBcUIsRUFDckIsSUFBWSxFQUNnQyxZQUFpQztRQU43RSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENB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QzlCLEtBQUs7Z0JBRUcsUUFBUTtzQkFEaEIsV0FBVzt1QkFBQyxnQkFBZ0I7O3NCQUM1QixLQUFLO2dCQUVHLE1BQU07c0JBRGQsV0FBVzt1QkFBQyxxQkFBcUI7O3NCQUNqQyxLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQWtNUCxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIGlzRGV2TW9kZSxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBIQU1NRVJfTE9BREVSLCBIYW1tZXJMb2FkZXIsIFNhZmVTdHlsZSwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBEaW1lbnNpb25zLCBJbWFnZUNyb3BwZWRFdmVudCwgSW1hZ2VUcmFuc2Zvcm0sIExvYWRlZEltYWdlLCBNb3ZlU3RhcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE91dHB1dEZvcm1hdCwgT3V0cHV0VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wcGVyU2V0dGluZ3MgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nyb3BwZXIuc2V0dGluZ3MnO1xuaW1wb3J0IHsgTW92ZVR5cGVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9tb3ZlLXN0YXJ0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Nyb3Auc2VydmljZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY3JvcHBlci1wb3NpdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IExvYWRJbWFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFtbWVyU3RhdGljIH0gZnJvbSAnLi4vdXRpbHMvaGFtbWVyLnV0aWxzJztcbmltcG9ydCB7IGdldEV2ZW50Rm9yS2V5LCBnZXRJbnZlcnRlZFBvc2l0aW9uRm9yS2V5LCBnZXRQb3NpdGlvbkZvcktleSB9IGZyb20gJy4uL3V0aWxzL2tleWJvYXJkLnV0aWxzJztcbmltcG9ydCB7IGZpcnN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltYWdlLWNyb3BwZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLWNyb3BwZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICBwcml2YXRlIHNldHRpbmdzID0gbmV3IENyb3BwZXJTZXR0aW5ncygpO1xuICBwcml2YXRlIHNldEltYWdlTWF4U2l6ZVJldHJpZXMgPSAwO1xuICBwcml2YXRlIG1vdmVTdGFydD86IE1vdmVTdGFydDtcbiAgcHJpdmF0ZSBsb2FkZWRJbWFnZT86IExvYWRlZEltYWdlO1xuICBwcml2YXRlIHJlc2l6ZWRXaGlsZUhpZGRlbiA9IGZhbHNlO1xuXG4gIHNhZmVJbWdEYXRhVXJsPzogU2FmZVVybCB8IHN0cmluZztcbiAgc2FmZVRyYW5zZm9ybVN0eWxlPzogU2FmZVN0eWxlIHwgc3RyaW5nO1xuICBtYXJnaW5MZWZ0OiBTYWZlU3R5bGUgfCBzdHJpbmcgPSAnMHB4JztcbiAgbWF4U2l6ZTogRGltZW5zaW9ucyA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgbW92ZVR5cGVzID0gTW92ZVR5cGVzO1xuICBpbWFnZVZpc2libGUgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCd3cmFwcGVyJywge3N0YXRpYzogdHJ1ZX0pIHdyYXBwZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc291cmNlSW1hZ2UnLCB7c3RhdGljOiBmYWxzZX0pIHNvdXJjZUltYWdlITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQElucHV0KCkgaW1hZ2VDaGFuZ2VkRXZlbnQ/OiBhbnk7XG4gIEBJbnB1dCgpIGltYWdlVVJMPzogc3RyaW5nO1xuICBASW5wdXQoKSBpbWFnZUJhc2U2ND86IHN0cmluZztcbiAgQElucHV0KCkgaW1hZ2VGaWxlPzogRmlsZTtcbiAgQElucHV0KCkgaW1hZ2VBbHRUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBjcm9wcGVyRnJhbWVBcmlhTGFiZWwgPSB0aGlzLnNldHRpbmdzLmNyb3BwZXJGcmFtZUFyaWFMYWJlbDtcbiAgQElucHV0KCkgb3V0cHV0OiAnYmxvYicgfCAnYmFzZTY0JyA9IHRoaXMuc2V0dGluZ3Mub3V0cHV0O1xuICBASW5wdXQoKSBmb3JtYXQ6IE91dHB1dEZvcm1hdCA9IHRoaXMuc2V0dGluZ3MuZm9ybWF0O1xuICBASW5wdXQoKSB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XG4gIEBJbnB1dCgpIG1haW50YWluQXNwZWN0UmF0aW8gPSB0aGlzLnNldHRpbmdzLm1haW50YWluQXNwZWN0UmF0aW87XG4gIEBJbnB1dCgpIGFzcGVjdFJhdGlvID0gdGhpcy5zZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgQElucHV0KCkgcmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZSA9IHRoaXMuc2V0dGluZ3MucmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZTtcbiAgQElucHV0KCkgcmVzaXplVG9XaWR0aCA9IHRoaXMuc2V0dGluZ3MucmVzaXplVG9XaWR0aDtcbiAgQElucHV0KCkgcmVzaXplVG9IZWlnaHQgPSB0aGlzLnNldHRpbmdzLnJlc2l6ZVRvSGVpZ2h0O1xuICBASW5wdXQoKSBjcm9wcGVyTWluV2lkdGggPSB0aGlzLnNldHRpbmdzLmNyb3BwZXJNaW5XaWR0aDtcbiAgQElucHV0KCkgY3JvcHBlck1pbkhlaWdodCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlck1pbkhlaWdodDtcbiAgQElucHV0KCkgY3JvcHBlck1heEhlaWdodCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlck1heEhlaWdodDtcbiAgQElucHV0KCkgY3JvcHBlck1heFdpZHRoID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyTWF4V2lkdGg7XG4gIEBJbnB1dCgpIGNyb3BwZXJTdGF0aWNXaWR0aCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY1dpZHRoO1xuICBASW5wdXQoKSBjcm9wcGVyU3RhdGljSGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljSGVpZ2h0O1xuICBASW5wdXQoKSBjYW52YXNSb3RhdGlvbiA9IHRoaXMuc2V0dGluZ3MuY2FudmFzUm90YXRpb247XG4gIEBJbnB1dCgpIGluaXRpYWxTdGVwU2l6ZSA9IHRoaXMuc2V0dGluZ3MuaW5pdGlhbFN0ZXBTaXplO1xuICBASW5wdXQoKSByb3VuZENyb3BwZXIgPSB0aGlzLnNldHRpbmdzLnJvdW5kQ3JvcHBlcjtcbiAgQElucHV0KCkgb25seVNjYWxlRG93biA9IHRoaXMuc2V0dGluZ3Mub25seVNjYWxlRG93bjtcbiAgQElucHV0KCkgaW1hZ2VRdWFsaXR5ID0gdGhpcy5zZXR0aW5ncy5pbWFnZVF1YWxpdHk7XG4gIEBJbnB1dCgpIGF1dG9Dcm9wID0gdGhpcy5zZXR0aW5ncy5hdXRvQ3JvcDtcbiAgQElucHV0KCkgYmFja2dyb3VuZENvbG9yID0gdGhpcy5zZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7XG4gIEBJbnB1dCgpIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IHRoaXMuc2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvO1xuICBASW5wdXQoKSBoaWRlUmVzaXplU3F1YXJlcyA9IHRoaXMuc2V0dGluZ3MuaGlkZVJlc2l6ZVNxdWFyZXM7XG4gIEBJbnB1dCgpIGFsbG93TW92ZUltYWdlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyb3BwZXI6IENyb3BwZXJQb3NpdGlvbiA9IHtcbiAgICB4MTogLTEwMCxcbiAgICB5MTogLTEwMCxcbiAgICB4MjogMTAwMDAsXG4gICAgeTI6IDEwMDAwXG4gIH07XG4gIEBIb3N0QmluZGluZygnc3R5bGUudGV4dC1hbGlnbicpXG4gIEBJbnB1dCgpIGFsaWduSW1hZ2U6ICdsZWZ0JyB8ICdjZW50ZXInID0gdGhpcy5zZXR0aW5ncy5hbGlnbkltYWdlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5uZ3gtaXgtaGlkZGVuJylcbiAgQElucHV0KCkgaGlkZGVuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGltYWdlQ3JvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VDcm9wcGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBzdGFydENyb3BJbWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGltYWdlTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxMb2FkZWRJbWFnZT4oKTtcbiAgQE91dHB1dCgpIGNyb3BwZXJSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8RGltZW5zaW9ucz4oKTtcbiAgQE91dHB1dCgpIGxvYWRJbWFnZUZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHRyYW5zZm9ybUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VUcmFuc2Zvcm0+KCk7XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNyb3BTZXJ2aWNlOiBDcm9wU2VydmljZSxcbiAgICBwcml2YXRlIGNyb3BwZXJQb3NpdGlvblNlcnZpY2U6IENyb3BwZXJQb3NpdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2FkSW1hZ2VTZXJ2aWNlOiBMb2FkSW1hZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIQU1NRVJfTE9BREVSKSBwcml2YXRlIHJlYWRvbmx5IGhhbW1lckxvYWRlcjogSGFtbWVyTG9hZGVyIHwgbnVsbFxuICApIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZXNVcGRhdGVTZXR0aW5ncyhjaGFuZ2VzKTtcbiAgICB0aGlzLm9uQ2hhbmdlc0lucHV0SW1hZ2UoY2hhbmdlcyk7XG5cbiAgICBpZiAodGhpcy5sb2FkZWRJbWFnZT8ub3JpZ2luYWwuaW1hZ2UuY29tcGxldGUgJiYgKGNoYW5nZXNbJ2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyddIHx8IGNoYW5nZXNbJ2NhbnZhc1JvdGF0aW9uJ10pKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZVNlcnZpY2VcbiAgICAgICAgLnRyYW5zZm9ybUxvYWRlZEltYWdlKHRoaXMubG9hZGVkSW1hZ2UsIHRoaXMuc2V0dGluZ3MpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHRoaXMuc2V0TG9hZGVkSW1hZ2UocmVzKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydjcm9wcGVyJ10gfHwgY2hhbmdlc1snbWFpbnRhaW5Bc3BlY3RSYXRpbyddIHx8IGNoYW5nZXNbJ2FzcGVjdFJhdGlvJ10pIHtcbiAgICAgIHRoaXMuc2V0TWF4U2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8gJiZcbiAgICAgICAgKHRoaXMucmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZSB8fCAhdGhpcy5hc3BlY3RSYXRpb0lzQ29ycmVjdCgpKSAmJlxuICAgICAgICAoY2hhbmdlc1snbWFpbnRhaW5Bc3BlY3RSYXRpbyddIHx8IGNoYW5nZXNbJ2FzcGVjdFJhdGlvJ10pXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5yZXNldENyb3BwZXJQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzWydjcm9wcGVyJ10pIHtcbiAgICAgICAgdGhpcy5jaGVja0Nyb3BwZXJQb3NpdGlvbihmYWxzZSk7XG4gICAgICAgIHRoaXMuZG9BdXRvQ3JvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndHJhbnNmb3JtJ10pIHtcbiAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0gfHwge307XG4gICAgICB0aGlzLnNldENzc1RyYW5zZm9ybSgpO1xuICAgICAgdGhpcy5kb0F1dG9Dcm9wKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoaWRkZW4nXSAmJiB0aGlzLnJlc2l6ZWRXaGlsZUhpZGRlbiAmJiAhdGhpcy5oaWRkZW4pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgIHRoaXMucmVzaXplZFdoaWxlSGlkZGVuID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlc1VwZGF0ZVNldHRpbmdzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnNldHRpbmdzLnNldE9wdGlvbnNGcm9tQ2hhbmdlcyhjaGFuZ2VzKTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNyb3BwZXJTdGF0aWNIZWlnaHQgJiYgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljV2lkdGgpIHtcbiAgICAgIHRoaXMuaGlkZVJlc2l6ZVNxdWFyZXMgPSB0cnVlO1xuICAgICAgdGhpcy5zZXR0aW5ncy5zZXRPcHRpb25zKHtcbiAgICAgICAgaGlkZVJlc2l6ZVNxdWFyZXM6IHRydWUsXG4gICAgICAgIGNyb3BwZXJNaW5XaWR0aDogdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljV2lkdGgsXG4gICAgICAgIGNyb3BwZXJNaW5IZWlnaHQ6IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY0hlaWdodCxcbiAgICAgICAgY3JvcHBlck1heEhlaWdodDogdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljSGVpZ2h0LFxuICAgICAgICBjcm9wcGVyTWF4V2lkdGg6IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY1dpZHRoLFxuICAgICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZXNJbnB1dEltYWdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VDaGFuZ2VkRXZlbnQnXSB8fCBjaGFuZ2VzWydpbWFnZVVSTCddIHx8IGNoYW5nZXNbJ2ltYWdlQmFzZTY0J10gfHwgY2hhbmdlc1snaW1hZ2VGaWxlJ10pIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2ltYWdlQ2hhbmdlZEV2ZW50J10gJiYgdGhpcy5pc1ZhbGlkSW1hZ2VDaGFuZ2VkRXZlbnQoKSkge1xuICAgICAgdGhpcy5sb2FkSW1hZ2VGaWxlKHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQudGFyZ2V0LmZpbGVzWzBdKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2ltYWdlVVJMJ10gJiYgdGhpcy5pbWFnZVVSTCkge1xuICAgICAgdGhpcy5sb2FkSW1hZ2VGcm9tVVJMKHRoaXMuaW1hZ2VVUkwpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VCYXNlNjQnXSAmJiB0aGlzLmltYWdlQmFzZTY0KSB7XG4gICAgICB0aGlzLmxvYWRCYXNlNjRJbWFnZSh0aGlzLmltYWdlQmFzZTY0KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2ltYWdlRmlsZSddICYmIHRoaXMuaW1hZ2VGaWxlKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZUZpbGUodGhpcy5pbWFnZUZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEltYWdlQ2hhbmdlZEV2ZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlQ2hhbmdlZEV2ZW50Py50YXJnZXQ/LmZpbGVzPy5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDc3NUcmFuc2Zvcm0oKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlVW5pdCA9IHRoaXMudHJhbnNmb3JtPy50cmFuc2xhdGVVbml0IHx8ICclJztcbiAgICB0aGlzLnNhZmVUcmFuc2Zvcm1TdHlsZSA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShcbiAgICAgIGB0cmFuc2xhdGUoJHt0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIIHx8IDB9JHt0cmFuc2xhdGVVbml0fSwgJHt0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWIHx8IDB9JHt0cmFuc2xhdGVVbml0fSlgICtcbiAgICAgICcgc2NhbGVYKCcgKyAodGhpcy50cmFuc2Zvcm0uc2NhbGUgfHwgMSkgKiAodGhpcy50cmFuc2Zvcm0uZmxpcEggPyAtMSA6IDEpICsgJyknICtcbiAgICAgICcgc2NhbGVZKCcgKyAodGhpcy50cmFuc2Zvcm0uc2NhbGUgfHwgMSkgKiAodGhpcy50cmFuc2Zvcm0uZmxpcFYgPyAtMSA6IDEpICsgJyknICtcbiAgICAgICcgcm90YXRlKCcgKyAodGhpcy50cmFuc2Zvcm0ucm90YXRlIHx8IDApICsgJ2RlZyknXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3Muc3RlcFNpemUgPSB0aGlzLmluaXRpYWxTdGVwU2l6ZTtcbiAgICB0aGlzLmFjdGl2YXRlUGluY2hHZXN0dXJlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5sb2FkZWRJbWFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNhZmVJbWdEYXRhVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnJ1xuICAgICAgKyAnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVJ1xuICAgICAgKyAnQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG4gICAgdGhpcy5tb3ZlU3RhcnQgPSB7XG4gICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgdHlwZTogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiAwLFxuICAgICAgeTI6IDAsXG4gICAgICBjbGllbnRYOiAwLFxuICAgICAgY2xpZW50WTogMFxuICAgIH07XG4gICAgdGhpcy5tYXhTaXplID0ge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHRoaXMuY3JvcHBlci54MSA9IC0xMDA7XG4gICAgdGhpcy5jcm9wcGVyLnkxID0gLTEwMDtcbiAgICB0aGlzLmNyb3BwZXIueDIgPSAxMDAwMDtcbiAgICB0aGlzLmNyb3BwZXIueTIgPSAxMDAwMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkSW1hZ2VTZXJ2aWNlXG4gICAgICAubG9hZEltYWdlRmlsZShmaWxlLCB0aGlzLnNldHRpbmdzKVxuICAgICAgLnRoZW4oKHJlcykgPT4gdGhpcy5zZXRMb2FkZWRJbWFnZShyZXMpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkSW1hZ2VTZXJ2aWNlXG4gICAgICAubG9hZEJhc2U2NEltYWdlKGltYWdlQmFzZTY0LCB0aGlzLnNldHRpbmdzKVxuICAgICAgLnRoZW4oKHJlcykgPT4gdGhpcy5zZXRMb2FkZWRJbWFnZShyZXMpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZUZyb21VUkwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRJbWFnZVNlcnZpY2VcbiAgICAgIC5sb2FkSW1hZ2VGcm9tVVJMKHVybCwgdGhpcy5zZXR0aW5ncylcbiAgICAgIC50aGVuKChyZXMpID0+IHRoaXMuc2V0TG9hZGVkSW1hZ2UocmVzKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLmxvYWRJbWFnZUVycm9yKGVycikpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMb2FkZWRJbWFnZShsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRlZEltYWdlID0gbG9hZGVkSW1hZ2U7XG4gICAgdGhpcy5zYWZlSW1nRGF0YVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5vYmplY3RVcmwpO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgbG9hZEltYWdlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHRoaXMubG9hZEltYWdlRmFpbGVkLmVtaXQoKTtcbiAgfVxuXG4gIGltYWdlTG9hZGVkSW5WaWV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZEltYWdlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuaW1hZ2VMb2FkZWQuZW1pdCh0aGlzLmxvYWRlZEltYWdlKTtcbiAgICAgIHRoaXMuc2V0SW1hZ2VNYXhTaXplUmV0cmllcyA9IDA7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hlY2tJbWFnZU1heFNpemVSZWN1cnNpdmVseSgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW1hZ2VNYXhTaXplUmVjdXJzaXZlbHkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2V0SW1hZ2VNYXhTaXplUmV0cmllcyA+IDQwKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZUZhaWxlZC5lbWl0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNvdXJjZUltYWdlTG9hZGVkKCkpIHtcbiAgICAgIHRoaXMuc2V0TWF4U2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICAgICAgdGhpcy5yZXNldENyb3BwZXJQb3NpdGlvbigpO1xuICAgICAgdGhpcy5jcm9wcGVyUmVhZHkuZW1pdCh7Li4udGhpcy5tYXhTaXplfSk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEltYWdlTWF4U2l6ZVJldHJpZXMrKztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja0ltYWdlTWF4U2l6ZVJlY3Vyc2l2ZWx5KCksIDUwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNvdXJjZUltYWdlTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUltYWdlPy5uYXRpdmVFbGVtZW50Py5vZmZzZXRXaWR0aCA+IDA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZEltYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhpZGRlbikge1xuICAgICAgdGhpcy5yZXNpemVkV2hpbGVIaWRkZW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvbGRNYXhTaXplID0gey4uLnRoaXMubWF4U2l6ZX07XG4gICAgICB0aGlzLnNldE1heFNpemUoKTtcbiAgICAgIHRoaXMucmVzaXplQ3JvcHBlclBvc2l0aW9uKG9sZE1heFNpemUpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWN0aXZhdGVQaW5jaEdlc3R1cmUoKSB7XG4gICAgLy8gTG9hZHMgSGFtbWVySlMgdmlhIGFuZ3VsYXIgQVBJcyBpZiBjb25maWd1cmVkXG4gICAgYXdhaXQgdGhpcy5oYW1tZXJMb2FkZXI/LigpO1xuXG4gICAgY29uc3QgSGFtbWVyID0gKHdpbmRvdyBhcyB1bmtub3duIGFzIChXaW5kb3cgJiB7IEhhbW1lcj86IEhhbW1lclN0YXRpYyB9KSk/LlsnSGFtbWVyJ10gfHwgbnVsbDtcblxuICAgIGlmIChIYW1tZXIpIHtcbiAgICAgIGNvbnN0IGhhbW1lciA9IG5ldyBIYW1tZXIodGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgaGFtbWVyLmdldCgncGluY2gnKS5zZXQoe2VuYWJsZTogdHJ1ZX0pO1xuICAgICAgaGFtbWVyLm9uKCdwaW5jaG1vdmUnLCB0aGlzLm9uUGluY2guYmluZCh0aGlzKSk7XG4gICAgICBoYW1tZXIub24oJ3BpbmNoZW5kJywgdGhpcy5waW5jaFN0b3AuYmluZCh0aGlzKSk7XG4gICAgICBoYW1tZXIub24oJ3BpbmNoc3RhcnQnLCB0aGlzLnN0YXJ0UGluY2guYmluZCh0aGlzKSk7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbTmd4SW1hZ2VDcm9wcGVyXSBDb3VsZCBub3QgZmluZCBIYW1tZXJKUyAtIFBpbmNoIEdlc3R1cmUgd29uXFwndCB3b3JrJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVDcm9wcGVyUG9zaXRpb24ob2xkTWF4U2l6ZTogRGltZW5zaW9ucyk6IHZvaWQge1xuICAgIGlmIChvbGRNYXhTaXplLndpZHRoICE9PSB0aGlzLm1heFNpemUud2lkdGggfHwgb2xkTWF4U2l6ZS5oZWlnaHQgIT09IHRoaXMubWF4U2l6ZS5oZWlnaHQpIHtcbiAgICAgIHRoaXMuY3JvcHBlci54MSA9IHRoaXMuY3JvcHBlci54MSAqIHRoaXMubWF4U2l6ZS53aWR0aCAvIG9sZE1heFNpemUud2lkdGg7XG4gICAgICB0aGlzLmNyb3BwZXIueDIgPSB0aGlzLmNyb3BwZXIueDIgKiB0aGlzLm1heFNpemUud2lkdGggLyBvbGRNYXhTaXplLndpZHRoO1xuICAgICAgdGhpcy5jcm9wcGVyLnkxID0gdGhpcy5jcm9wcGVyLnkxICogdGhpcy5tYXhTaXplLmhlaWdodCAvIG9sZE1heFNpemUuaGVpZ2h0O1xuICAgICAgdGhpcy5jcm9wcGVyLnkyID0gdGhpcy5jcm9wcGVyLnkyICogdGhpcy5tYXhTaXplLmhlaWdodCAvIG9sZE1heFNpemUuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0Q3JvcHBlclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY3JvcHBlclBvc2l0aW9uU2VydmljZS5yZXNldENyb3BwZXJQb3NpdGlvbih0aGlzLnNvdXJjZUltYWdlLCB0aGlzLmNyb3BwZXIsIHRoaXMuc2V0dGluZ3MsIHRoaXMubWF4U2l6ZSk7XG4gICAgdGhpcy5kb0F1dG9Dcm9wKCk7XG4gICAgdGhpcy5pbWFnZVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAga2V5Ym9hcmRBY2Nlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmNoYW5nZUtleWJvYXJkU3RlcFNpemUoZXZlbnQpO1xuICAgIHRoaXMua2V5Ym9hcmRNb3ZlQ3JvcHBlcihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUtleWJvYXJkU3RlcFNpemUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSArZXZlbnQua2V5O1xuICAgIGlmIChrZXkgPj0gMSAmJiBrZXkgPD0gOSkge1xuICAgICAgdGhpcy5zZXR0aW5ncy5zdGVwU2l6ZSA9IGtleTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGtleWJvYXJkTW92ZUNyb3BwZXIoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGtleWJvYXJkV2hpdGVMaXN0OiBzdHJpbmdbXSA9IFsnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnXTtcbiAgICBpZiAoIShrZXlib2FyZFdoaXRlTGlzdC5pbmNsdWRlcyhldmVudC5rZXkpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb3ZlVHlwZSA9IGV2ZW50LnNoaWZ0S2V5ID8gTW92ZVR5cGVzLlJlc2l6ZSA6IE1vdmVUeXBlcy5Nb3ZlO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gZXZlbnQuYWx0S2V5ID8gZ2V0SW52ZXJ0ZWRQb3NpdGlvbkZvcktleShldmVudC5rZXkpIDogZ2V0UG9zaXRpb25Gb3JLZXkoZXZlbnQua2V5KTtcbiAgICBjb25zdCBtb3ZlRXZlbnQgPSBnZXRFdmVudEZvcktleShldmVudC5rZXksIHRoaXMuc2V0dGluZ3Muc3RlcFNpemUpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zdGFydE1vdmUoe2NsaWVudFg6IDAsIGNsaWVudFk6IDB9LCBtb3ZlVHlwZSwgcG9zaXRpb24pO1xuICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKG1vdmVFdmVudCk7XG4gICAgdGhpcy5oYW5kbGVNb3VzZVVwKCk7XG4gIH1cblxuICBzdGFydE1vdmUoZXZlbnQ6IGFueSwgbW92ZVR5cGU6IE1vdmVUeXBlcywgcG9zaXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWRcbiAgICAgIHx8IHRoaXMubW92ZVN0YXJ0Py5hY3RpdmUgJiYgdGhpcy5tb3ZlU3RhcnQ/LnR5cGUgPT09IE1vdmVUeXBlcy5QaW5jaFxuICAgICAgfHwgbW92ZVR5cGUgPT09IE1vdmVUeXBlcy5EcmFnICYmICF0aGlzLmFsbG93TW92ZUltYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5tb3ZlU3RhcnQgPSB7XG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICB0eXBlOiBtb3ZlVHlwZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgdHJhbnNmb3JtOiB7Li4udGhpcy50cmFuc2Zvcm19LFxuICAgICAgY2xpZW50WDogdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFgoZXZlbnQpLFxuICAgICAgY2xpZW50WTogdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFkoZXZlbnQpLFxuICAgICAgLi4udGhpcy5jcm9wcGVyXG4gICAgfTtcbiAgICB0aGlzLmluaXRNb3VzZU1vdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE1vdXNlTW92ZSgpOiB2b2lkIHtcbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpLFxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2htb3ZlJylcbiAgICApLnBpcGUoXG4gICAgICB0YWtlVW50aWwobWVyZ2UoXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNldXAnKSxcbiAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAndG91Y2hlbmQnKVxuICAgICAgKS5waXBlKGZpcnN0KCkpKVxuICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZXZlbnQpID0+IHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTtcbiAgICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlTW91c2VVcCgpO1xuICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0UGluY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5zYWZlSW1nRGF0YVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMubW92ZVN0YXJ0ID0ge1xuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgdHlwZTogTW92ZVR5cGVzLlBpbmNoLFxuICAgICAgcG9zaXRpb246ICdjZW50ZXInLFxuICAgICAgY2xpZW50WDogdGhpcy5jcm9wcGVyLngxICsgKHRoaXMuY3JvcHBlci54MiAtIHRoaXMuY3JvcHBlci54MSkgLyAyLFxuICAgICAgY2xpZW50WTogdGhpcy5jcm9wcGVyLnkxICsgKHRoaXMuY3JvcHBlci55MiAtIHRoaXMuY3JvcHBlci55MSkgLyAyLFxuICAgICAgLi4udGhpcy5jcm9wcGVyXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTW91c2VNb3ZlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3ZlU3RhcnQhLmFjdGl2ZSkge1xuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubW92ZVN0YXJ0IS50eXBlID09PSBNb3ZlVHlwZXMuTW92ZSkge1xuICAgICAgICB0aGlzLmNyb3BwZXJQb3NpdGlvblNlcnZpY2UubW92ZShldmVudCwgdGhpcy5tb3ZlU3RhcnQhLCB0aGlzLmNyb3BwZXIpO1xuICAgICAgICB0aGlzLmNoZWNrQ3JvcHBlclBvc2l0aW9uKHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1vdmVTdGFydCEudHlwZSA9PT0gTW92ZVR5cGVzLlJlc2l6ZSkge1xuICAgICAgICBpZiAoIXRoaXMuY3JvcHBlclN0YXRpY1dpZHRoICYmICF0aGlzLmNyb3BwZXJTdGF0aWNIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLmNyb3BwZXJQb3NpdGlvblNlcnZpY2UucmVzaXplKGV2ZW50LCB0aGlzLm1vdmVTdGFydCEsIHRoaXMuY3JvcHBlciwgdGhpcy5tYXhTaXplLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrQ3JvcHBlclBvc2l0aW9uKGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tb3ZlU3RhcnQhLnR5cGUgPT09IE1vdmVUeXBlcy5EcmFnKSB7XG4gICAgICAgIGNvbnN0IGRpZmZYID0gdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFgoZXZlbnQpIC0gdGhpcy5tb3ZlU3RhcnQhLmNsaWVudFg7XG4gICAgICAgIGNvbnN0IGRpZmZZID0gdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFkoZXZlbnQpIC0gdGhpcy5tb3ZlU3RhcnQhLmNsaWVudFk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgIHRyYW5zbGF0ZUg6ICh0aGlzLm1vdmVTdGFydCEudHJhbnNmb3JtPy50cmFuc2xhdGVIIHx8IDApICsgZGlmZlgsXG4gICAgICAgICAgdHJhbnNsYXRlVjogKHRoaXMubW92ZVN0YXJ0IS50cmFuc2Zvcm0/LnRyYW5zbGF0ZVYgfHwgMCkgKyBkaWZmWVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldENzc1RyYW5zZm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUGluY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLm1vdmVTdGFydCEuYWN0aXZlKSB7XG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tb3ZlU3RhcnQhLnR5cGUgPT09IE1vdmVUeXBlcy5QaW5jaCkge1xuICAgICAgICB0aGlzLmNyb3BwZXJQb3NpdGlvblNlcnZpY2UucmVzaXplKGV2ZW50LCB0aGlzLm1vdmVTdGFydCEsIHRoaXMuY3JvcHBlciwgdGhpcy5tYXhTaXplLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5jaGVja0Nyb3BwZXJQb3NpdGlvbihmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TWF4U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3VyY2VJbWFnZSkge1xuICAgICAgY29uc3Qgc291cmNlSW1hZ2VTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5zb3VyY2VJbWFnZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIHRoaXMubWF4U2l6ZS53aWR0aCA9IHBhcnNlRmxvYXQoc291cmNlSW1hZ2VTdHlsZS53aWR0aCk7XG4gICAgICB0aGlzLm1heFNpemUuaGVpZ2h0ID0gcGFyc2VGbG9hdChzb3VyY2VJbWFnZVN0eWxlLmhlaWdodCk7XG4gICAgICB0aGlzLm1hcmdpbkxlZnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoJ2NhbGMoNTAlIC0gJyArIHRoaXMubWF4U2l6ZS53aWR0aCAvIDIgKyAncHgpJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWRJbWFnZT8udHJhbnNmb3JtZWQ/LmltYWdlKSB7XG4gICAgICB0aGlzLnNldENyb3BwZXJTY2FsZWRNaW5XaWR0aCgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluSGVpZ2h0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbldpZHRoID0gMjA7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSAyMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENyb3BwZXJTY2FsZWRNaW5XaWR0aCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCA9IHRoaXMuY3JvcHBlck1pbldpZHRoID4gMFxuICAgICAgPyBNYXRoLm1heCgyMCwgdGhpcy5jcm9wcGVyTWluV2lkdGggLyB0aGlzLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5pbWFnZS53aWR0aCAqIHRoaXMubWF4U2l6ZS53aWR0aClcbiAgICAgIDogMjA7XG4gIH1cblxuICBwcml2YXRlIHNldENyb3BwZXJTY2FsZWRNaW5IZWlnaHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0ID0gTWF0aC5tYXgoMjAsIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbldpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3BwZXJNaW5IZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSBNYXRoLm1heChcbiAgICAgICAgMjAsXG4gICAgICAgIHRoaXMuY3JvcHBlck1pbkhlaWdodCAvIHRoaXMubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLmltYWdlLmhlaWdodCAqIHRoaXMubWF4U2l6ZS5oZWlnaHRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbkhlaWdodCA9IDIwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q3JvcHBlclNjYWxlZE1heFNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkSW1hZ2U/LnRyYW5zZm9ybWVkPy5pbWFnZSkge1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLmxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLyB0aGlzLm1heFNpemUud2lkdGg7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCA9IHRoaXMuY3JvcHBlck1heFdpZHRoID4gMjAgPyB0aGlzLmNyb3BwZXJNYXhXaWR0aCAvIHJhdGlvIDogdGhpcy5tYXhTaXplLndpZHRoO1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ID0gdGhpcy5jcm9wcGVyTWF4SGVpZ2h0ID4gMjAgPyB0aGlzLmNyb3BwZXJNYXhIZWlnaHQgLyByYXRpbyA6IHRoaXMubWF4U2l6ZS5oZWlnaHQ7XG4gICAgICBpZiAodGhpcy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCA+IHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW87XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggPCB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoID0gdGhpcy5tYXhTaXplLndpZHRoO1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ID0gdGhpcy5tYXhTaXplLmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQ3JvcHBlclBvc2l0aW9uKG1haW50YWluU2l6ZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY3JvcHBlci54MSA8IDApIHtcbiAgICAgIHRoaXMuY3JvcHBlci54MiAtPSBtYWludGFpblNpemUgPyB0aGlzLmNyb3BwZXIueDEgOiAwO1xuICAgICAgdGhpcy5jcm9wcGVyLngxID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3JvcHBlci55MSA8IDApIHtcbiAgICAgIHRoaXMuY3JvcHBlci55MiAtPSBtYWludGFpblNpemUgPyB0aGlzLmNyb3BwZXIueTEgOiAwO1xuICAgICAgdGhpcy5jcm9wcGVyLnkxID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3JvcHBlci54MiA+IHRoaXMubWF4U2l6ZS53aWR0aCkge1xuICAgICAgdGhpcy5jcm9wcGVyLngxIC09IG1haW50YWluU2l6ZSA/ICh0aGlzLmNyb3BwZXIueDIgLSB0aGlzLm1heFNpemUud2lkdGgpIDogMDtcbiAgICAgIHRoaXMuY3JvcHBlci54MiA9IHRoaXMubWF4U2l6ZS53aWR0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3JvcHBlci55MiA+IHRoaXMubWF4U2l6ZS5oZWlnaHQpIHtcbiAgICAgIHRoaXMuY3JvcHBlci55MSAtPSBtYWludGFpblNpemUgPyAodGhpcy5jcm9wcGVyLnkyIC0gdGhpcy5tYXhTaXplLmhlaWdodCkgOiAwO1xuICAgICAgdGhpcy5jcm9wcGVyLnkyID0gdGhpcy5tYXhTaXplLmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlVXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW92ZVN0YXJ0IS5hY3RpdmUpIHtcbiAgICAgIHRoaXMubW92ZVN0YXJ0IS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLm1vdmVTdGFydD8udHlwZSA9PT0gTW92ZVR5cGVzLkRyYWcpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1DaGFuZ2UuZW1pdCh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvQXV0b0Nyb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwaW5jaFN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW92ZVN0YXJ0IS5hY3RpdmUpIHtcbiAgICAgIHRoaXMubW92ZVN0YXJ0IS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZG9BdXRvQ3JvcCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG9BdXRvQ3JvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvQ3JvcCkge1xuICAgICAgdm9pZCB0aGlzLmNyb3AoKTtcbiAgICB9XG4gIH1cblxuICBjcm9wKCk6IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbDtcbiAgY3JvcChvdXRwdXQ6ICdiYXNlNjQnKTogSW1hZ2VDcm9wcGVkRXZlbnQgfCBudWxsO1xuICBjcm9wKG91dHB1dDogJ2Jsb2InKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBudWxsO1xuICBjcm9wKG91dHB1dDogT3V0cHV0VHlwZSA9IHRoaXMuc2V0dGluZ3Mub3V0cHV0KTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGwge1xuICAgIGlmICh0aGlzLmxvYWRlZEltYWdlPy50cmFuc2Zvcm1lZD8uaW1hZ2UgIT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGFydENyb3BJbWFnZS5lbWl0KCk7XG4gICAgICBpZiAob3V0cHV0ID09PSAnYmxvYicpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYigpO1xuICAgICAgfSBlbHNlIGlmIChvdXRwdXQgPT09ICdiYXNlNjQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyb3BUb0Jhc2U2NCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JvcFRvQmxvYigpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IG51bGwge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB0aGlzLnpvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY3JvcFNlcnZpY2UuY3JvcCh0aGlzLmxvYWRlZEltYWdlISwgdGhpcy5jcm9wcGVyLCB0aGlzLnNldHRpbmdzLCAnYmxvYicsIHRoaXMubWF4U2l6ZSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuaW1hZ2VDcm9wcGVkLmVtaXQocmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KCdDcm9wIGltYWdlIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JvcFRvQmFzZTY0KCk6IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jcm9wU2VydmljZS5jcm9wKHRoaXMubG9hZGVkSW1hZ2UhLCB0aGlzLmNyb3BwZXIsIHRoaXMuc2V0dGluZ3MsICdiYXNlNjQnLCB0aGlzLm1heFNpemUpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuaW1hZ2VDcm9wcGVkLmVtaXQocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3BlY3RSYXRpb0lzQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50Q3JvcEFzcGVjdFJhdGlvID0gKHRoaXMuY3JvcHBlci54MiAtIHRoaXMuY3JvcHBlci54MSkgLyAodGhpcy5jcm9wcGVyLnkyIC0gdGhpcy5jcm9wcGVyLnkxKTtcbiAgICByZXR1cm4gY3VycmVudENyb3BBc3BlY3RSYXRpbyA9PT0gdGhpcy5hc3BlY3RSYXRpbztcbiAgfVxufVxuIiwiPGRpdlxuICBbc3R5bGUuYmFja2dyb3VuZF09XCJpbWFnZVZpc2libGUgJiYgYmFja2dyb3VuZENvbG9yXCJcbiAgI3dyYXBwZXJcbj5cbiAgPGltZ1xuICAgICNzb3VyY2VJbWFnZVxuICAgIGNsYXNzPVwibmd4LWljLXNvdXJjZS1pbWFnZVwiXG4gICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgKm5nSWY9XCJzYWZlSW1nRGF0YVVybFwiXG4gICAgW3NyY109XCJzYWZlSW1nRGF0YVVybFwiXG4gICAgW3N0eWxlLnZpc2liaWxpdHldPVwiaW1hZ2VWaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwic2FmZVRyYW5zZm9ybVN0eWxlXCJcbiAgICBbY2xhc3Mubmd4LWljLWRyYWdnYWJsZV09XCIhZGlzYWJsZWQgJiYgYWxsb3dNb3ZlSW1hZ2VcIlxuICAgIFthdHRyLmFsdF09XCJpbWFnZUFsdFRleHRcIlxuICAgIChsb2FkKT1cImltYWdlTG9hZGVkSW5WaWV3KClcIlxuICAgIChtb3VzZWRvd24pPVwic3RhcnRNb3ZlKCRldmVudCwgbW92ZVR5cGVzLkRyYWcpXCJcbiAgICAodG91Y2hzdGFydCk9XCJzdGFydE1vdmUoJGV2ZW50LCBtb3ZlVHlwZXMuRHJhZylcIlxuICAgIChlcnJvcik9XCJsb2FkSW1hZ2VFcnJvcigkZXZlbnQpXCJcbiAgPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJuZ3gtaWMtb3ZlcmxheVwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cIm1heFNpemUud2lkdGhcIlxuICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibWF4U2l6ZS5oZWlnaHRcIlxuICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCJhbGlnbkltYWdlID09PSAnY2VudGVyJyA/IG1hcmdpbkxlZnQgOiBudWxsXCJcbiAgPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibmd4LWljLWNyb3BwZXJcIlxuICAgICAgICpuZ0lmPVwiaW1hZ2VWaXNpYmxlXCJcbiAgICAgICBbY2xhc3Mubmd4LWljLXJvdW5kXT1cInJvdW5kQ3JvcHBlclwiXG4gICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjcm9wcGVyRnJhbWVBcmlhTGFiZWxcIlxuICAgICAgIFtzdHlsZS50b3AucHhdPVwiY3JvcHBlci55MVwiXG4gICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY3JvcHBlci54MVwiXG4gICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNyb3BwZXIueDIgLSBjcm9wcGVyLngxXCJcbiAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNyb3BwZXIueTIgLSBjcm9wcGVyLnkxXCJcbiAgICAgICBbc3R5bGUubWFyZ2luLWxlZnRdPVwiYWxpZ25JbWFnZSA9PT0gJ2NlbnRlcicgPyBtYXJnaW5MZWZ0IDogbnVsbFwiXG4gICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwiaW1hZ2VWaXNpYmxlID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgICAgIChrZXlkb3duKT1cImtleWJvYXJkQWNjZXNzKCRldmVudClcIlxuICAgICAgIHRhYmluZGV4PVwiMFwiXG4gID5cbiAgICA8ZGl2XG4gICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5Nb3ZlKVwiXG4gICAgICAodG91Y2hzdGFydCk9XCJzdGFydE1vdmUoJGV2ZW50LCBtb3ZlVHlwZXMuTW92ZSlcIlxuICAgICAgY2xhc3M9XCJuZ3gtaWMtbW92ZVwiXG4gICAgICByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRlUmVzaXplU3F1YXJlc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtcmVzaXplIG5neC1pYy10b3BsZWZ0XCJcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydE1vdmUoJGV2ZW50LCBtb3ZlVHlwZXMuUmVzaXplLCAndG9wbGVmdCcpXCJcbiAgICAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICd0b3BsZWZ0JylcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pYy1zcXVhcmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cIm5neC1pYy1yZXNpemUgbmd4LWljLXRvcFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXNxdWFyZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXJlc2l6ZSBuZ3gtaWMtdG9wcmlnaHRcIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICd0b3ByaWdodCcpXCJcbiAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICd0b3ByaWdodCcpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtc3F1YXJlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtcmVzaXplIG5neC1pYy1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXNxdWFyZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXJlc2l6ZSBuZ3gtaWMtYm90dG9tcmlnaHRcIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdib3R0b21yaWdodCcpXCJcbiAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdib3R0b21yaWdodCcpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtc3F1YXJlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtcmVzaXplIG5neC1pYy1ib3R0b21cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pYy1zcXVhcmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cIm5neC1pYy1yZXNpemUgbmd4LWljLWJvdHRvbWxlZnRcIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdib3R0b21sZWZ0JylcIlxuICAgICAgICAgICAgKHRvdWNoc3RhcnQpPVwic3RhcnRNb3ZlKCRldmVudCwgbW92ZVR5cGVzLlJlc2l6ZSwgJ2JvdHRvbWxlZnQnKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXNxdWFyZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXJlc2l6ZSBuZ3gtaWMtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXNxdWFyZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXJlc2l6ZS1iYXIgbmd4LWljLXRvcFwiXG4gICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRNb3ZlKCRldmVudCwgbW92ZVR5cGVzLlJlc2l6ZSwgJ3RvcCcpXCJcbiAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICd0b3AnKVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWMtcmVzaXplLWJhciBuZ3gtaWMtcmlnaHRcIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdyaWdodCcpXCJcbiAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdyaWdodCcpXCI+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cIm5neC1pYy1yZXNpemUtYmFyIG5neC1pYy1ib3R0b21cIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdib3R0b20nKVwiXG4gICAgICAgICAgICAodG91Y2hzdGFydCk9XCJzdGFydE1vdmUoJGV2ZW50LCBtb3ZlVHlwZXMuUmVzaXplLCAnYm90dG9tJylcIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljLXJlc2l6ZS1iYXIgbmd4LWljLWxlZnRcIlxuICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0TW92ZSgkZXZlbnQsIG1vdmVUeXBlcy5SZXNpemUsICdsZWZ0JylcIlxuICAgICAgICAgICAgKHRvdWNoc3RhcnQpPVwic3RhcnRNb3ZlKCRldmVudCwgbW92ZVR5cGVzLlJlc2l6ZSwgJ2xlZnQnKVwiPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|