@tft/crispr-forms 13.0.3 → 13.0.4
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/esm2020/lib/material/image-upload-field/image-upload-field.component.mjs +37 -20
- package/esm2020/lib/models/image-upload-field.config.mjs +1 -1
- package/fesm2015/tft-crispr-forms.mjs +37 -19
- package/fesm2015/tft-crispr-forms.mjs.map +1 -1
- package/fesm2020/tft-crispr-forms.mjs +36 -19
- package/fesm2020/tft-crispr-forms.mjs.map +1 -1
- package/lib/material/image-upload-field/image-upload-field.component.d.ts +8 -2
- package/lib/models/image-upload-field.config.d.ts +6 -0
- package/package.json +1 -1
- package/tft-crispr-forms-13.0.4.tgz +0 -0
- package/tft-crispr-forms-13.0.3.tgz +0 -0
|
@@ -29,7 +29,6 @@ import * as i10 from "@angular/common";
|
|
|
29
29
|
import * as i11 from "../file-upload/file-dropzone.directive";
|
|
30
30
|
const ImageUploadFieldMixin = crisprControlMixin(CrisprFieldComponent);
|
|
31
31
|
export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
32
|
-
// ngControl: NgControl = null;
|
|
33
32
|
constructor(ngControl, domSanitizer, cdr) {
|
|
34
33
|
super();
|
|
35
34
|
this.ngControl = ngControl;
|
|
@@ -50,24 +49,28 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
50
49
|
minCompressionThresholdMb: .6,
|
|
51
50
|
useWebWorker: true,
|
|
52
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* The url mapped from initial input value, consumers can us mapInputValueToUrl in config to transform their input value into a src url for the image element
|
|
54
|
+
*/
|
|
55
|
+
// inputValueUrl: string | undefined;
|
|
53
56
|
this.inputImageFileSubject = new Subject();
|
|
54
57
|
this.inputImageFile$ = this.inputImageFileSubject.asObservable().pipe(shareReplay(1));
|
|
55
58
|
this.compressedFile$ = this.inputImageFile$.pipe(switchMap(async (file) => {
|
|
56
|
-
if (!file)
|
|
59
|
+
if (!file || !(file instanceof File))
|
|
57
60
|
return null;
|
|
58
|
-
if (typeof file === 'string')
|
|
59
|
-
return file;
|
|
60
61
|
const { compressImage, targetCompressedImageFileSizeMb, minCompressionThresholdMb, maxWidthOrHeight, useWebWorker } = this.config;
|
|
61
62
|
const fileSizeMb = convertBytesToMb(file.size);
|
|
62
|
-
const shouldCompress = compressImage
|
|
63
|
+
const shouldCompress = compressImage
|
|
64
|
+
&& targetCompressedImageFileSizeMb < fileSizeMb
|
|
65
|
+
&& minCompressionThresholdMb < fileSizeMb;
|
|
63
66
|
if (shouldCompress) {
|
|
64
67
|
const options = {
|
|
65
68
|
// Use maxWidthOrHeight if it was provided, else use target compressed size
|
|
66
69
|
...(maxWidthOrHeight ? { maxWidthOrHeight } : { maxSizeMB: targetCompressedImageFileSizeMb }),
|
|
67
70
|
useWebWorker,
|
|
68
71
|
maxIterations: 30,
|
|
69
|
-
onProgress: (
|
|
70
|
-
this.progress =
|
|
72
|
+
onProgress: (progress) => {
|
|
73
|
+
this.progress = progress;
|
|
71
74
|
this.cdr.detectChanges();
|
|
72
75
|
}
|
|
73
76
|
};
|
|
@@ -75,23 +78,27 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
75
78
|
}
|
|
76
79
|
else
|
|
77
80
|
return file;
|
|
78
|
-
}), map((
|
|
79
|
-
if (!
|
|
80
|
-
return
|
|
81
|
-
const { type, name, lastModified } =
|
|
82
|
-
return new File([
|
|
81
|
+
}), map((compressedFile) => {
|
|
82
|
+
if (!compressedFile)
|
|
83
|
+
return compressedFile;
|
|
84
|
+
const { type, name, lastModified } = compressedFile;
|
|
85
|
+
return new File([compressedFile], this.config.fileName || name, {
|
|
83
86
|
type,
|
|
84
87
|
lastModified
|
|
85
88
|
});
|
|
86
89
|
}), tap(file => {
|
|
87
|
-
|
|
90
|
+
// only set the value if there is a file because resetToInitialValue sets the control value
|
|
91
|
+
// to initial value and clears the compressed image, so setting it to null here would undo that
|
|
92
|
+
if (file) {
|
|
93
|
+
this.control.setValue(file);
|
|
94
|
+
}
|
|
88
95
|
if (file || this.value) {
|
|
89
96
|
this.control.markAsTouched();
|
|
90
97
|
setTimeout(() => {
|
|
91
98
|
this.cdr.detectChanges();
|
|
92
99
|
}, 100);
|
|
93
100
|
}
|
|
94
|
-
}),
|
|
101
|
+
}), shareReplay(1));
|
|
95
102
|
this.compressedImageUrlString$ = this.compressedFile$.pipe(switchMap(async (file) => {
|
|
96
103
|
if (!file)
|
|
97
104
|
return null;
|
|
@@ -107,11 +114,18 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
107
114
|
}
|
|
108
115
|
ngOnInit() {
|
|
109
116
|
super.ngOnInit();
|
|
117
|
+
// this.inputValueUrl = this.value && this.config.mapInputValueToUrl?.(this.value) || this.value;
|
|
110
118
|
this.imageSrcUrl$ = combineLatest([
|
|
111
119
|
this.compressedImageUrlString$.pipe(startWith(null)),
|
|
112
|
-
this.control.valueChanges.pipe(startWith(this.value))
|
|
120
|
+
this.control.valueChanges.pipe(startWith(this.value), map((controlValue) => {
|
|
121
|
+
if (!controlValue)
|
|
122
|
+
return null;
|
|
123
|
+
if (controlValue instanceof File)
|
|
124
|
+
return null;
|
|
125
|
+
return this.config.mapInputValueToUrl?.(controlValue) || controlValue;
|
|
126
|
+
}))
|
|
113
127
|
]).pipe(map(([compressedImageUrlString, controlUrl]) => {
|
|
114
|
-
return compressedImageUrlString ||
|
|
128
|
+
return compressedImageUrlString || controlUrl || null;
|
|
115
129
|
}));
|
|
116
130
|
this.disabled$ = this.config.disabledCallback
|
|
117
131
|
? this.config.disabledCallback(this.group, this.config)
|
|
@@ -120,6 +134,10 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
120
134
|
filesChanged(files) {
|
|
121
135
|
if (files && files.length > 0) {
|
|
122
136
|
const imageFile = files[0];
|
|
137
|
+
// We clear the control here so that it is invalid while compressing
|
|
138
|
+
// the input pipeline will take care of resetting it
|
|
139
|
+
this.control.patchValue(null);
|
|
140
|
+
// this.control.setErrors({compressing: {loadingMessage: 'Please wait while file compresses'}});
|
|
123
141
|
this.control.markAsTouched();
|
|
124
142
|
this.inputImageFileSubject.next(imageFile);
|
|
125
143
|
}
|
|
@@ -132,8 +150,8 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
132
150
|
this.isUploaded = false;
|
|
133
151
|
}
|
|
134
152
|
resetToInitialValue(initialValue) {
|
|
135
|
-
this.inputImageFileSubject.next(
|
|
136
|
-
|
|
153
|
+
this.inputImageFileSubject.next(null);
|
|
154
|
+
this.control.patchValue(initialValue);
|
|
137
155
|
this.isUploaded = false;
|
|
138
156
|
}
|
|
139
157
|
writeValue(value) { }
|
|
@@ -212,7 +230,6 @@ export function maxFileSizeValidator(maxFileSize) {
|
|
|
212
230
|
const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);
|
|
213
231
|
if (maxFileSize > actualFileSize)
|
|
214
232
|
return null;
|
|
215
|
-
// control.setErrors({maxFileSize: { maxFileSize, actualFileSize }} )
|
|
216
233
|
return { maxFileSize: { maxFileSize, actualFileSize } };
|
|
217
234
|
};
|
|
218
235
|
}
|
|
@@ -230,4 +247,4 @@ export function allowedFileExtValidator(allowedFileExtensions, onlyAllowFiles =
|
|
|
230
247
|
return { allowedExtension: { allowedFileExtensions, actualExtension } };
|
|
231
248
|
};
|
|
232
249
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwvaW1hZ2UtdXBsb2FkLWZpZWxkL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL21hdGVyaWFsL2ltYWdlLXVwbG9hZC1maWVsZC9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFFVCx1QkFBdUIsRUFDdkIsUUFBUSxFQUNSLElBQUksRUFDSixpQkFBaUIsRUFDakIsUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBcUMsU0FBUyxFQUFFLG1CQUFtQixFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUs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LENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksV0FBVyxHQUFHLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QyxxRUFBcUU7UUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsRUFBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMscUJBQStCLEVBQUUsY0FBYyxHQUFHLElBQUk7SUFDNUYsT0FBTyxDQUFDLE9BQW9CLEVBQTJCLEVBQUU7UUFDdkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxZQUFZLFlBQVksSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDdkcsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0UsSUFBRyxrQkFBa0IsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxFQUFDLGdCQUFnQixFQUFFLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLEVBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBPbkluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE5nTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gJ2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkRmllbGRNb2R1bGUgfSBmcm9tICcuLi9maWxlLXVwbG9hZCc7XG5pbXBvcnQgeyBjcmlzcHJDb250cm9sTWl4aW4sIENyaXNwckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RzJztcbmltcG9ydCB7IEZpZWxkQ29udGFpbmVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZmllbGQtY29udGFpbmVyL2ZpZWxkLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcnO1xuaW1wb3J0IHsgY29udmVydEJ5dGVzVG9NYiB9IGZyb20gJy4vaW1hZ2UtY29tcHJlc3Npb24uaGVscGVycyc7XG5pbXBvcnQgeyBTZWxlY3RlZEZpbGVNb2R1bGUgfSBmcm9tICcuLi9zZWxlY3RlZC1maWxlL3NlbGVjdGVkLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uSGFuZGxlck1vZHVsZSB9IGZyb20gJ0B0ZnQvZm9ybS12YWxpZGF0aW9uLWhhbmRsZXInO1xuXG5jb25zdCBJbWFnZVVwbG9hZEZpZWxkTWl4aW4gPSBjcmlzcHJDb250cm9sTWl4aW48SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4oQ3Jpc3ByRmllbGRDb21wb25lbnQpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcmlzcHItaW1hZ2UtdXBsb2FkLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudCBleHRlbmRzIEltYWdlVXBsb2FkRmllbGRNaXhpbiBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIG9uQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGRlZmF1bHRDb25maWc6IFBhcnRpYWw8SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4gPSB7XG4gICAgLy8gYWxsb3dNdWx0aXBsZUZpbGVzOiBmYWxzZSxcbiAgICBhY2NlcHRlZFR5cGVzOiAnaW1hZ2UvKicsXG4gICAgZHJvcFpvbmVUZXh0OiAnRFJPUCBGSUxFIEhFUkUnLFxuICAgIHNlbGVjdEZpbGVzQnV0dG9uVHlwZTogJ2J1dHRvbicsXG4gICAgc2VsZWN0QnV0dG9uVGV4dDogJ1NFTEVDVCcsXG4gICAgc2hvd0NsZWFyRmlsZXNCdXR0b246IHRydWUsXG4gICAgY2xlYXJGaWxlc0J1dHRvblRleHQ6ICdDTEVBUicsXG4gICAgcmVzZXRGaWxlc0J1dHRvblRleHQ6ICdSRVNFVCcsXG4gICAgaW1hZ2VQcmV2aWV3SGVpZ2h0OiAnMjUwcHgnLFxuICAgIGNvbXByZXNzSW1hZ2U6IGZhbHNlLFxuICAgIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWI6IC40LFxuICAgIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWI6IC42LFxuICAgIHVzZVdlYldvcmtlcjogdHJ1ZSxcbiAgfVxuXG4gIHByb2dyZXNzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaW5wdXRJbWFnZUZpbGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8RmlsZSB8IHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaW5wdXRJbWFnZUZpbGUkID0gdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb21wcmVzc2VkRmlsZSQ6IE9ic2VydmFibGU8RmlsZT4gPSB0aGlzLmlucHV0SW1hZ2VGaWxlJC5waXBlKFxuICAgIHN3aXRjaE1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgaWYgKCFmaWxlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHJldHVybiBmaWxlXG4gICAgICBjb25zdCB7IGNvbXByZXNzSW1hZ2UsIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWIsIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWIsIG1heFdpZHRoT3JIZWlnaHQsIHVzZVdlYldvcmtlciB9ID0gdGhpcy5jb25maWc7XG4gICAgICBjb25zdCBmaWxlU2l6ZU1iID0gY29udmVydEJ5dGVzVG9NYihmaWxlLnNpemUpO1xuICAgICAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb21wcmVzc0ltYWdlICYmIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWIgPCBmaWxlU2l6ZU1iICYmIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWIgPCBmaWxlU2l6ZU1iXG4gICAgICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAvLyBVc2UgbWF4V2lkdGhPckhlaWdodCBpZiBpdCB3YXMgcHJvdmlkZWQsIGVsc2UgdXNlIHRhcmdldCBjb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAuLi4obWF4V2lkdGhPckhlaWdodCA/IHttYXhXaWR0aE9ySGVpZ2h0fSA6IHsgbWF4U2l6ZU1COiB0YXJnZXRDb21wcmVzc2VkSW1hZ2VGaWxlU2l6ZU1ifSksXG4gICAgICAgICAgdXNlV2ViV29ya2VyLFxuICAgICAgICAgIG1heEl0ZXJhdGlvbnM6IDMwLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6IChwOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgaW1hZ2VDb21wcmVzc2lvbihmaWxlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSByZXR1cm4gIGZpbGU7XG4gICAgfSksXG4gICAgbWFwKChjb21wcmVzc2VkRmlsZU9yU3RyaW5nOiBGaWxlIHwgc3RyaW5nKSA9PiB7XG4gICAgICBpZighY29tcHJlc3NlZEZpbGVPclN0cmluZyB8fCB0eXBlb2YgY29tcHJlc3NlZEZpbGVPclN0cmluZyA9PT0gJ3N0cmluZycpIHJldHVybiBjb21wcmVzc2VkRmlsZU9yU3RyaW5nO1xuICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBsYXN0TW9kaWZpZWQgfSA9IGNvbXByZXNzZWRGaWxlT3JTdHJpbmdcbiAgICAgIHJldHVybiBuZXcgRmlsZShbY29tcHJlc3NlZEZpbGVPclN0cmluZ10sIHRoaXMuY29uZmlnLmZpbGVOYW1lIHx8IG5hbWUsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbGFzdE1vZGlmaWVkXG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoZmlsZSA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsZSk7XG4gICAgICBpZiAoZmlsZSB8fCB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSwgMTAwKVxuICAgICAgfVxuICAgIH0pLFxuICAgIG1hcChmaWxlID0+IHR5cGVvZiBmaWxlID09PSAnc3RyaW5nJyA/IG51bGwgOiBmaWxlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApXG5cbiAgY29tcHJlc3NlZEltYWdlVXJsU3RyaW5nJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMuY29tcHJlc3NlZEZpbGUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBpZighZmlsZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBjb21wcmVzc2VkU3RyaW5nSW1hZ2UgPSBhd2FpdCBpbWFnZUNvbXByZXNzaW9uLmdldERhdGFVcmxGcm9tRmlsZShmaWxlKTtcbiAgICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoY29tcHJlc3NlZFN0cmluZ0ltYWdlKSBhcyBzdHJpbmdcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKVxuXG4gIC8vIFRoaXMgaXMgd2hhdCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGltYWdlIHByZXZpZXdcbiAgaW1hZ2VTcmNVcmwkOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+O1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dFJlZjogRWxlbWVudFJlZlxuXG4gIHNlbGVjdGVkRmlsZXM6IEZpbGVMaXN0O1xuXG4gIGlzVXBsb2FkZWQgPSBmYWxzZTtcblxuICBkaXNhYmxlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgLy8gbmdDb250cm9sOiBOZ0NvbnRyb2wgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xuICAgICAgLy8gU2V0dGluZyB0aGUgdmFsdWUgYWNjZXNzb3IgZGlyZWN0bHkgKGluc3RlYWQgb2YgdXNpbmdcbiAgICAgIC8vIHRoZSBwcm92aWRlcnMpIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBhIGNpcmN1bGFyIGltcG9ydC5cbiAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuaW1hZ2VTcmNVcmwkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNvbXByZXNzZWRJbWFnZVVybFN0cmluZyQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgICAgdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLnZhbHVlKSlcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbY29tcHJlc3NlZEltYWdlVXJsU3RyaW5nLCBjb250cm9sVXJsXSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcHJlc3NlZEltYWdlVXJsU3RyaW5nIHx8IHR5cGVvZiBjb250cm9sVXJsID09PSAnc3RyaW5nJyAmJiBjb250cm9sVXJsIHx8IG51bGw7XG4gICAgICB9KVxuICAgIClcbiAgICB0aGlzLmRpc2FibGVkJCA9IHRoaXMuY29uZmlnLmRpc2FibGVkQ2FsbGJhY2tcbiAgICA/IHRoaXMuY29uZmlnLmRpc2FibGVkQ2FsbGJhY2sodGhpcy5ncm91cCwgdGhpcy5jb25maWcpXG4gICAgOiBvZihmYWxzZSk7XG4gIH1cblxuICBmaWxlc0NoYW5nZWQoZmlsZXM6IEZpbGVMaXN0KTogdm9pZCB7XG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgKSB7XG4gICAgICBjb25zdCBpbWFnZUZpbGUgPSBmaWxlc1swXTtcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmlucHV0SW1hZ2VGaWxlU3ViamVjdC5uZXh0KGltYWdlRmlsZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGaWxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmZpbGVJbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJydcbiAgICB0aGlzLmNvbnRyb2wucGF0Y2hWYWx1ZShudWxsKTtcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaXNVcGxvYWRlZCA9IGZhbHNlO1xuICB9XG5cbiAgcmVzZXRUb0luaXRpYWxWYWx1ZShpbml0aWFsVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJbWFnZUZpbGVTdWJqZWN0Lm5leHQoaW5pdGlhbFZhbHVlKTtcbiAgICAvLyB0aGlzLmZpbGVJbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gaW5pdGlhbFZhbHVlXG4gICAgdGhpcy5pc1VwbG9hZGVkID0gZmFsc2U7XG4gIH1cblxuICB3cml0ZVZhbHVlKCB2YWx1ZTogbnVsbCApIHsgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoIGZuOiAoKSA9PiB2b2lkICkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCBmbjogKCkgPT4gdm9pZCApIHsgfVxufVxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGaWVsZENvbnRhaW5lck1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBTZWxlY3RlZEZpbGVNb2R1bGUsXG4gICAgRmlsZVVwbG9hZEZpZWxkTW9kdWxlLFxuICAgIEZvcm1WYWxpZGF0aW9uSGFuZGxlck1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgICBJbWFnZVVwbG9hZEZpZWxkQ29tcG9uZW50XG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgICAgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlVXBsb2FkRmllbGRNb2R1bGUgeyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhGaWxlU2l6ZVZhbGlkYXRvcihtYXhGaWxlU2l6ZTogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gKGNvbnRyb2w6IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCEoY29udHJvbFZhbHVlIGluc3RhbmNlb2YgRmlsZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBhY3R1YWxGaWxlU2l6ZSA9ICtjb252ZXJ0Qnl0ZXNUb01iKGNvbnRyb2xWYWx1ZS5zaXplKS50b1ByZWNpc2lvbigzKTtcbiAgICBpZiAobWF4RmlsZVNpemUgPiBhY3R1YWxGaWxlU2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgLy8gY29udHJvbC5zZXRFcnJvcnMoe21heEZpbGVTaXplOiB7IG1heEZpbGVTaXplLCBhY3R1YWxGaWxlU2l6ZSB9fSApXG4gICAgcmV0dXJuIHttYXhGaWxlU2l6ZTogeyBtYXhGaWxlU2l6ZSwgYWN0dWFsRmlsZVNpemUgfX07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93ZWRGaWxlRXh0VmFsaWRhdG9yKGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogc3RyaW5nW10sIG9ubHlBbGxvd0ZpbGVzID0gdHJ1ZSk6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IGlzRmlsZSA9IGNvbnRyb2xWYWx1ZSBpbnN0YW5jZW9mIEZpbGU7XG4gICAgaWYgKCFvbmx5QWxsb3dGaWxlcyAmJiAhaXNGaWxlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBhY3R1YWxFeHRlbnNpb24gPSBpc0ZpbGUgPyBjb250cm9sVmFsdWUubmFtZS5zcGxpdCgnLicpLnBvcCgpLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAnTm90IGEgZmlsZSc7XG4gICAgY29uc3QgaXNBbGxvd2VkRXh0ZW5zaW9uID0gYWxsb3dlZEZpbGVFeHRlbnNpb25zLmluY2x1ZGVzKGFjdHVhbEV4dGVuc2lvbik7XG4gICAgaWYoaXNBbGxvd2VkRXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHthbGxvd2VkRXh0ZW5zaW9uOiB7IGFsbG93ZWRGaWxlRXh0ZW5zaW9ucywgYWN0dWFsRXh0ZW5zaW9uIH19O1xuICB9XG59XG4iLCI8Y3Jpc3ByLWZpZWxkLWNvbnRhaW5lclxuICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gIFtncm91cF09XCJncm91cFwiPlxuXG4gIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICBbY29sb3JdPVwiY29uZmlnLmNvbG9yXCJcbiAgICBbYXBwZWFyYW5jZV09XCJjb25maWcuYXBwZWFyYW5jZVwiXG4gICAgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxuICAgIDxtYXQtbGFiZWw+e3tjb25maWcubGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbmZpZy5jb250cm9sTmFtZVwiIG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIvPlxuICAgIDxpbnB1dFxuICAgICAgI2ZpbGVJbnB1dFxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgW2FjY2VwdF09XCJjb25maWcuYWNjZXB0ZWRUeXBlc1wiXG4gICAgICAoY2hhbmdlKT1cImZpbGVzQ2hhbmdlZCgkZXZlbnQudGFyZ2V0LmZpbGVzKVwiLz5cbiAgICA8ZGl2IGNsYXNzPVwidWktY29udGFpbmVyXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCIgW3N0eWxlLmhlaWdodF09XCJjb25maWcuaW1hZ2VQcmV2aWV3SGVpZ2h0XCI+XG4gICAgICAgIDxjcmlzcHItc2VsZWN0ZWQtZmlsZVxuICAgICAgICAgICpuZ0lmPVwiKHByb2dyZXNzIDwgMTAwKSAmJiBpbnB1dEltYWdlRmlsZSQgfCBhc3luYyBhcyBmaWxlOyBlbHNlIGRyb3B6b25lT3JQcmV2aWV3XCJcbiAgICAgICAgICBbY29sb3JdPVwiY29uZmlnLmNvbG9yID09PSAncHJpbWFyeScgPyAnYWNjZW50JyA6ICdwcmltYXJ5J1wiXG4gICAgICAgICAgW2ZpbGVOYW1lXT1cIidDb21wcmVzc2luZzogJyArIGZpbGUubmFtZVwiXG4gICAgICAgICAgW3Nob3dQcm9ncmVzc109XCJ0cnVlXCJcbiAgICAgICAgICBbcHJvZ3Jlc3NdPVwicHJvZ3Jlc3NcIj5cbiAgICAgICAgPC9jcmlzcHItc2VsZWN0ZWQtZmlsZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2Ryb3B6b25lT3JQcmV2aWV3PlxuICAgICAgICAgIDwhLS0gPGltZyAqbmdJZj1cIihpbml0aWFsVXJsU3RyaW5nJCB8IGFzeW5jKSBhcyBpbml0aWFsVXJsU3RyaW5nO1wiIFtzcmNdPVwiaW5pdGlhbFVybFN0cmluZ1wiIGFsdD1cIlwiPiAtLT5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaW1hZ2VTcmNVcmwkIHwgYXN5bmMgYXMgc3JjVXJsOyBlbHNlIG5vSW1hZ2VcIiBbc3JjXT1cInNyY1VybFwiIGFsdD1cIlwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JbWFnZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgIFtjcmlzcHJGaWxlRHJvcHpvbmVdPVwiIShkaXNhYmxlZCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAoZmlsZURyb3ApPVwiZmlsZXNDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZHJvcC1pY29uXCIgaW5saW5lPVwidHJ1ZVwiPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC1oMlwiPnt7Y29uZmlnLmRyb3Bab25lVGV4dH19PC9oMj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgPCEtLSA8L25nLXRlbXBsYXRlPiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCIgKm5nSWY9XCJ0cnVlXCI+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWxlSW5wdXQoKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYylcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgU2VsZWN0ZWQgRmlsZShzKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgIHt7Y29uZmlnLmNsZWFyRmlsZXNCdXR0b25UZXh0fX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwidmFsdWVcIlxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwicmVzZXRUb0luaXRpYWxWYWx1ZSh2YWx1ZSlcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIoZGlzYWJsZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIFNlbGVjdGVkIEZpbGUocylcIj5cbiAgICAgICAgICA8bWF0LWljb24+cmVwbGF5PC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2NvbmZpZy5yZXNldEZpbGVzQnV0dG9uVGV4dH19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbmZpZy5jb250cm9sTmFtZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgIGNhbWVyYVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuPC9jcmlzcHItZmllbGQtY29udGFpbmVyPlxuIl19
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwvaW1hZ2UtdXBsb2FkLWZpZWxkL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL21hdGVyaWFsL2ltYWdlLXVwbG9hZC1maWVsZC9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFFVCx1QkFBdUIsRUFDdkIsUUFBUSxFQUNSLElBQUksRUFDSixpQkFBaUIsRUFDakIsUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBcUMsU0FBUyxFQUFFLG1CQUFtQixFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUs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cUJBQXFCLEVBQUUsZUFBZSxFQUFFLEVBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBPbkluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE5nTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gJ2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkRmllbGRNb2R1bGUgfSBmcm9tICcuLi9maWxlLXVwbG9hZCc7XG5pbXBvcnQgeyBjcmlzcHJDb250cm9sTWl4aW4sIENyaXNwckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RzJztcbmltcG9ydCB7IEZpZWxkQ29udGFpbmVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZmllbGQtY29udGFpbmVyL2ZpZWxkLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcnO1xuaW1wb3J0IHsgY29udmVydEJ5dGVzVG9NYiB9IGZyb20gJy4vaW1hZ2UtY29tcHJlc3Npb24uaGVscGVycyc7XG5pbXBvcnQgeyBTZWxlY3RlZEZpbGVNb2R1bGUgfSBmcm9tICcuLi9zZWxlY3RlZC1maWxlL3NlbGVjdGVkLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uSGFuZGxlck1vZHVsZSB9IGZyb20gJ0B0ZnQvZm9ybS12YWxpZGF0aW9uLWhhbmRsZXInO1xuXG5jb25zdCBJbWFnZVVwbG9hZEZpZWxkTWl4aW4gPSBjcmlzcHJDb250cm9sTWl4aW48SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4oQ3Jpc3ByRmllbGRDb21wb25lbnQpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcmlzcHItaW1hZ2UtdXBsb2FkLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudCBleHRlbmRzIEltYWdlVXBsb2FkRmllbGRNaXhpbiBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIG9uQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGRlZmF1bHRDb25maWc6IFBhcnRpYWw8SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4gPSB7XG4gICAgLy8gYWxsb3dNdWx0aXBsZUZpbGVzOiBmYWxzZSxcbiAgICBhY2NlcHRlZFR5cGVzOiAnaW1hZ2UvKicsXG4gICAgZHJvcFpvbmVUZXh0OiAnRFJPUCBGSUxFIEhFUkUnLFxuICAgIHNlbGVjdEZpbGVzQnV0dG9uVHlwZTogJ2J1dHRvbicsXG4gICAgc2VsZWN0QnV0dG9uVGV4dDogJ1NFTEVDVCcsXG4gICAgc2hvd0NsZWFyRmlsZXNCdXR0b246IHRydWUsXG4gICAgY2xlYXJGaWxlc0J1dHRvblRleHQ6ICdDTEVBUicsXG4gICAgcmVzZXRGaWxlc0J1dHRvblRleHQ6ICdSRVNFVCcsXG4gICAgaW1hZ2VQcmV2aWV3SGVpZ2h0OiAnMjUwcHgnLFxuICAgIGNvbXByZXNzSW1hZ2U6IGZhbHNlLFxuICAgIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWI6IC40LFxuICAgIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWI6IC42LFxuICAgIHVzZVdlYldvcmtlcjogdHJ1ZSxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdXJsIG1hcHBlZCBmcm9tIGluaXRpYWwgaW5wdXQgdmFsdWUsIGNvbnN1bWVycyBjYW4gdXMgbWFwSW5wdXRWYWx1ZVRvVXJsIGluIGNvbmZpZyB0byB0cmFuc2Zvcm0gdGhlaXIgaW5wdXQgdmFsdWUgaW50byBhIHNyYyB1cmwgZm9yIHRoZSBpbWFnZSBlbGVtZW50XG4gICAqL1xuICAvLyBpbnB1dFZhbHVlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBpbnB1dEltYWdlRmlsZVN1YmplY3QgPSBuZXcgU3ViamVjdDxGaWxlIHwgbnVsbD4oKTtcbiAgaW5wdXRJbWFnZUZpbGUkID0gdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcbiAgLyoqXG4gICAqIHRoZSBjb21wcmVzc2lvbiBwcm9ncmVzc1xuICAgKi9cbiAgcHJvZ3Jlc3M6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb21wcmVzc2VkRmlsZSQ6IE9ic2VydmFibGU8RmlsZT4gPSB0aGlzLmlucHV0SW1hZ2VGaWxlJC5waXBlKFxuICAgIHN3aXRjaE1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgaWYgKCFmaWxlIHx8ICEoZmlsZSBpbnN0YW5jZW9mIEZpbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHsgY29tcHJlc3NJbWFnZSwgdGFyZ2V0Q29tcHJlc3NlZEltYWdlRmlsZVNpemVNYiwgbWluQ29tcHJlc3Npb25UaHJlc2hvbGRNYiwgbWF4V2lkdGhPckhlaWdodCwgdXNlV2ViV29ya2VyIH0gPSB0aGlzLmNvbmZpZztcbiAgICAgIGNvbnN0IGZpbGVTaXplTWIgPSBjb252ZXJ0Qnl0ZXNUb01iKGZpbGUuc2l6ZSk7XG4gICAgICBjb25zdCBzaG91bGRDb21wcmVzcyA9IGNvbXByZXNzSW1hZ2VcbiAgICAgICAgJiYgdGFyZ2V0Q29tcHJlc3NlZEltYWdlRmlsZVNpemVNYiA8IGZpbGVTaXplTWJcbiAgICAgICAgJiYgbWluQ29tcHJlc3Npb25UaHJlc2hvbGRNYiA8IGZpbGVTaXplTWJcbiAgICAgIGlmIChzaG91bGRDb21wcmVzcykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgIC8vIFVzZSBtYXhXaWR0aE9ySGVpZ2h0IGlmIGl0IHdhcyBwcm92aWRlZCwgZWxzZSB1c2UgdGFyZ2V0IGNvbXByZXNzZWQgc2l6ZVxuICAgICAgICAgIC4uLihtYXhXaWR0aE9ySGVpZ2h0ID8ge21heFdpZHRoT3JIZWlnaHR9IDogeyBtYXhTaXplTUI6IHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWJ9KSxcbiAgICAgICAgICB1c2VXZWJXb3JrZXIsXG4gICAgICAgICAgbWF4SXRlcmF0aW9uczogMzAsXG4gICAgICAgICAgb25Qcm9ncmVzczogKHByb2dyZXNzOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2UgcmV0dXJuICBmaWxlO1xuICAgIH0pLFxuICAgIG1hcCgoY29tcHJlc3NlZEZpbGU6IEZpbGUpID0+IHtcbiAgICAgIGlmKCFjb21wcmVzc2VkRmlsZSkgcmV0dXJuIGNvbXByZXNzZWRGaWxlO1xuICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBsYXN0TW9kaWZpZWQgfSA9IGNvbXByZXNzZWRGaWxlXG4gICAgICByZXR1cm4gbmV3IEZpbGUoW2NvbXByZXNzZWRGaWxlXSwgdGhpcy5jb25maWcuZmlsZU5hbWUgfHwgbmFtZSwge1xuICAgICAgICB0eXBlLFxuICAgICAgICBsYXN0TW9kaWZpZWRcbiAgICAgIH0pO1xuICAgIH0pLFxuICAgIHRhcChmaWxlID0+IHtcbiAgICAgIC8vIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZiB0aGVyZSBpcyBhIGZpbGUgYmVjYXVzZSByZXNldFRvSW5pdGlhbFZhbHVlIHNldHMgdGhlIGNvbnRyb2wgdmFsdWVcbiAgICAgIC8vIHRvIGluaXRpYWwgdmFsdWUgYW5kIGNsZWFycyB0aGUgY29tcHJlc3NlZCBpbWFnZSwgc28gc2V0dGluZyBpdCB0byBudWxsIGhlcmUgd291bGQgdW5kbyB0aGF0XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZSB8fCB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSwgMTAwKVxuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gIClcblxuICBjb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmckOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+ID0gdGhpcy5jb21wcmVzc2VkRmlsZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGlmKCFmaWxlKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRTdHJpbmdJbWFnZSA9IGF3YWl0IGltYWdlQ29tcHJlc3Npb24uZ2V0RGF0YVVybEZyb21GaWxlKGZpbGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChjb21wcmVzc2VkU3RyaW5nSW1hZ2UpIGFzIHN0cmluZ1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICApXG5cbiAgLy8gVGhpcyBpcyB3aGF0IGlzIGRpc3BsYXllZCBieSB0aGUgaW1hZ2UgcHJldmlld1xuICBpbWFnZVNyY1VybCQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD47XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0UmVmOiBFbGVtZW50UmVmXG5cbiAgc2VsZWN0ZWRGaWxlczogRmlsZUxpc3Q7XG5cbiAgaXNVcGxvYWRlZCA9IGZhbHNlO1xuXG4gIGRpc2FibGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xuICAgICAgLy8gU2V0dGluZyB0aGUgdmFsdWUgYWNjZXNzb3IgZGlyZWN0bHkgKGluc3RlYWQgb2YgdXNpbmdcbiAgICAgIC8vIHRoZSBwcm92aWRlcnMpIHRvIGF2b2lkIHJ1bm5pbmcgaW50byBhIGNpcmN1bGFyIGltcG9ydC5cbiAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIC8vIHRoaXMuaW5wdXRWYWx1ZVVybCA9IHRoaXMudmFsdWUgJiYgdGhpcy5jb25maWcubWFwSW5wdXRWYWx1ZVRvVXJsPy4odGhpcy52YWx1ZSkgfHwgdGhpcy52YWx1ZTtcbiAgICB0aGlzLmltYWdlU3JjVXJsJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmckLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMudmFsdWUpLFxuICAgICAgICBtYXAoKGNvbnRyb2xWYWx1ZSk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgaWYoIWNvbnRyb2xWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYoY29udHJvbFZhbHVlIGluc3RhbmNlb2YgRmlsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLm1hcElucHV0VmFsdWVUb1VybD8uKGNvbnRyb2xWYWx1ZSkgfHwgY29udHJvbFZhbHVlIGFzIHN0cmluZ1xuICAgICAgICB9KVxuICAgICAgKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtjb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmcsIGNvbnRyb2xVcmxdKSA9PiB7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmcgfHwgY29udHJvbFVybCB8fCBudWxsO1xuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5kaXNhYmxlZCQgPSB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrXG4gICAgPyB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrKHRoaXMuZ3JvdXAsIHRoaXMuY29uZmlnKVxuICAgIDogb2YoZmFsc2UpO1xuICB9XG5cbiAgZmlsZXNDaGFuZ2VkKGZpbGVzOiBGaWxlTGlzdCk6IHZvaWQge1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwICkge1xuICAgICAgY29uc3QgaW1hZ2VGaWxlID0gZmlsZXNbMF07XG4gICAgICAvLyBXZSBjbGVhciB0aGUgY29udHJvbCBoZXJlIHNvIHRoYXQgaXQgaXMgaW52YWxpZCB3aGlsZSBjb21wcmVzc2luZ1xuICAgICAgLy8gdGhlIGlucHV0IHBpcGVsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIHJlc2V0dGluZyBpdFxuICAgICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUobnVsbCk7XG4gICAgICAvLyB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHtjb21wcmVzc2luZzoge2xvYWRpbmdNZXNzYWdlOiAnUGxlYXNlIHdhaXQgd2hpbGUgZmlsZSBjb21wcmVzc2VzJ319KTtcbiAgICAgIHRoaXMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmlucHV0SW1hZ2VGaWxlU3ViamVjdC5uZXh0KGltYWdlRmlsZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGaWxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmZpbGVJbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJydcbiAgICB0aGlzLmNvbnRyb2wucGF0Y2hWYWx1ZShudWxsKTtcbiAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaXNVcGxvYWRlZCA9IGZhbHNlO1xuICB9XG5cbiAgcmVzZXRUb0luaXRpYWxWYWx1ZShpbml0aWFsVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJbWFnZUZpbGVTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUoaW5pdGlhbFZhbHVlKVxuICAgIHRoaXMuaXNVcGxvYWRlZCA9IGZhbHNlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSggdmFsdWU6IG51bGwgKSB7IH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKCBmbjogKCkgPT4gdm9pZCApIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCggZm46ICgpID0+IHZvaWQgKSB7IH1cbn1cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRmllbGRDb250YWluZXJNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgU2VsZWN0ZWRGaWxlTW9kdWxlLFxuICAgIEZpbGVVcGxvYWRGaWVsZE1vZHVsZSxcbiAgICBGb3JtVmFsaWRhdGlvbkhhbmRsZXJNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgICAgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgIEltYWdlVXBsb2FkRmllbGRDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVVwbG9hZEZpZWxkTW9kdWxlIHsgfVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4RmlsZVNpemVWYWxpZGF0b3IobWF4RmlsZVNpemU6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghKGNvbnRyb2xWYWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmlsZVNpemUgPSArY29udmVydEJ5dGVzVG9NYihjb250cm9sVmFsdWUuc2l6ZSkudG9QcmVjaXNpb24oMyk7XG4gICAgaWYgKG1heEZpbGVTaXplID4gYWN0dWFsRmlsZVNpemUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7bWF4RmlsZVNpemU6IHsgbWF4RmlsZVNpemUsIGFjdHVhbEZpbGVTaXplIH19O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd2VkRmlsZUV4dFZhbGlkYXRvcihhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdLCBvbmx5QWxsb3dGaWxlcyA9IHRydWUpOiBWYWxpZGF0b3JGbiB7XG4gIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBpc0ZpbGUgPSBjb250cm9sVmFsdWUgaW5zdGFuY2VvZiBGaWxlO1xuICAgIGlmICghb25seUFsbG93RmlsZXMgJiYgIWlzRmlsZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYWN0dWFsRXh0ZW5zaW9uID0gaXNGaWxlID8gY29udHJvbFZhbHVlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJ05vdCBhIGZpbGUnO1xuICAgIGNvbnN0IGlzQWxsb3dlZEV4dGVuc2lvbiA9IGFsbG93ZWRGaWxlRXh0ZW5zaW9ucy5pbmNsdWRlcyhhY3R1YWxFeHRlbnNpb24pO1xuICAgIGlmKGlzQWxsb3dlZEV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7YWxsb3dlZEV4dGVuc2lvbjogeyBhbGxvd2VkRmlsZUV4dGVuc2lvbnMsIGFjdHVhbEV4dGVuc2lvbiB9fTtcbiAgfVxufVxuIiwiPGNyaXNwci1maWVsZC1jb250YWluZXJcbiAgW2NvbmZpZ109XCJjb25maWdcIlxuICBbZ3JvdXBdPVwiZ3JvdXBcIj5cblxuICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImFsd2F5c1wiXG4gICAgW2NvbG9yXT1cImNvbmZpZy5jb2xvclwiXG4gICAgW2FwcGVhcmFuY2VdPVwiY29uZmlnLmFwcGVhcmFuY2VcIlxuICAgIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cbiAgICA8bWF0LWxhYmVsPnt7Y29uZmlnLmxhYmVsfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJjb25maWcuY29udHJvbE5hbWVcIiBtYXRJbnB1dCB0eXBlPVwidGV4dFwiLz5cbiAgICA8aW5wdXRcbiAgICAgICNmaWxlSW5wdXRcbiAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgIFthY2NlcHRdPVwiY29uZmlnLmFjY2VwdGVkVHlwZXNcIlxuICAgICAgKGNoYW5nZSk9XCJmaWxlc0NoYW5nZWQoJGV2ZW50LnRhcmdldC5maWxlcylcIi8+XG4gICAgPGRpdiBjbGFzcz1cInVpLWNvbnRhaW5lclwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtcHJldmlld1wiIFtzdHlsZS5oZWlnaHRdPVwiY29uZmlnLmltYWdlUHJldmlld0hlaWdodFwiPlxuICAgICAgICA8Y3Jpc3ByLXNlbGVjdGVkLWZpbGVcbiAgICAgICAgICAqbmdJZj1cIihwcm9ncmVzcyA8IDEwMCkgJiYgaW5wdXRJbWFnZUZpbGUkIHwgYXN5bmMgYXMgZmlsZTsgZWxzZSBkcm9wem9uZU9yUHJldmlld1wiXG4gICAgICAgICAgW2NvbG9yXT1cImNvbmZpZy5jb2xvciA9PT0gJ3ByaW1hcnknID8gJ2FjY2VudCcgOiAncHJpbWFyeSdcIlxuICAgICAgICAgIFtmaWxlTmFtZV09XCInQ29tcHJlc3Npbmc6ICcgKyBmaWxlLm5hbWVcIlxuICAgICAgICAgIFtzaG93UHJvZ3Jlc3NdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Byb2dyZXNzXT1cInByb2dyZXNzXCI+XG4gICAgICAgIDwvY3Jpc3ByLXNlbGVjdGVkLWZpbGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkcm9wem9uZU9yUHJldmlldz5cbiAgICAgICAgICA8IS0tIDxpbWcgKm5nSWY9XCIoaW5pdGlhbFVybFN0cmluZyQgfCBhc3luYykgYXMgaW5pdGlhbFVybFN0cmluZztcIiBbc3JjXT1cImluaXRpYWxVcmxTdHJpbmdcIiBhbHQ9XCJcIj4gLS0+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImltYWdlU3JjVXJsJCB8IGFzeW5jIGFzIHNyY1VybDsgZWxzZSBub0ltYWdlXCIgW3NyY109XCJzcmNVcmxcIiBhbHQ9XCJcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vSW1hZ2U+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1jb250YWluZXJcIlxuICAgICAgICAgICAgICBbY3Jpc3ByRmlsZURyb3B6b25lXT1cIiEoZGlzYWJsZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgKGZpbGVEcm9wKT1cImZpbGVzQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyb3AtaWNvblwiIGlubGluZT1cInRydWVcIj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJtYXQtaDJcIj57e2NvbmZpZy5kcm9wWm9uZVRleHR9fTwvaDI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cblxuXG5cbiAgICAgIDwhLS0gPC9uZy10ZW1wbGF0ZT4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiICpuZ0lmPVwidHJ1ZVwiPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsZUlucHV0KClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIoZGlzYWJsZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIFNlbGVjdGVkIEZpbGUocylcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2NvbmZpZy5jbGVhckZpbGVzQnV0dG9uVGV4dH19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInZhbHVlXCJcbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0VG9Jbml0aWFsVmFsdWUodmFsdWUpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBTZWxlY3RlZCBGaWxlKHMpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlcGxheTwvbWF0LWljb24+XG4gICAgICAgICAge3tjb25maWcucmVzZXRGaWxlc0J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYylcIlxuICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb25maWcuY29udHJvbE5hbWVcIj5cbiAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICBjYW1lcmFcbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbjwvY3Jpc3ByLWZpZWxkLWNvbnRhaW5lcj5cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENyaXNwckNvbnRyb2xDb25maWcsIENvbnRyb2xUeXBlLCBCdXR0b25UeXBlLCBNYXRGaWVsZFByb3BlcnRpZXMsIEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnID0gQ3Jpc3ByQ29udHJvbENvbmZpZyAmIE1hdEZpZWxkUHJvcGVydGllcyAmIHtcbiAgY29udHJvbFR5cGU6IENvbnRyb2xUeXBlLklNQUdFX1VQTE9BRDtcbiAgbGFiZWw6IHN0cmluZztcbiAgZmlsZXNDaGFuZ2VkPzogKHBhcmVudEdyb3VwOiBGb3JtR3JvdXAsIGZpbGU6IEZpbGUpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0eXBlcyB0byBhY2NlcHQuIFRoZSBvbnVzIGlzIG9uIHRoZSBjb25zdW1pbmcgZGV2ZWxvcGVyIHRvIGxpbWl0IHRoZXNlIHRvIGZpbGUgdHlwZXMgY29tcGF0aWJsZSB3aXRoIHVzYWdlLlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2FjY2VwdFxuICAgKi9cbiAgYWNjZXB0ZWRUeXBlczogc3RyaW5nO1xuICBmaWxlTmFtZT86IHN0cmluZztcblxuICBzaG93Q2xlYXJGaWxlc0J1dHRvbj86IGJvb2xlYW47XG4gIHNlbGVjdEZpbGVzQnV0dG9uVHlwZT86IEJ1dHRvblR5cGU7XG4gIHNlbGVjdEJ1dHRvblRleHQ/
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENyaXNwckNvbnRyb2xDb25maWcsIENvbnRyb2xUeXBlLCBCdXR0b25UeXBlLCBNYXRGaWVsZFByb3BlcnRpZXMsIEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnID0gQ3Jpc3ByQ29udHJvbENvbmZpZyAmIE1hdEZpZWxkUHJvcGVydGllcyAmIHtcbiAgY29udHJvbFR5cGU6IENvbnRyb2xUeXBlLklNQUdFX1VQTE9BRDtcbiAgbGFiZWw6IHN0cmluZztcbiAgZmlsZXNDaGFuZ2VkPzogKHBhcmVudEdyb3VwOiBGb3JtR3JvdXAsIGZpbGU6IEZpbGUpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0eXBlcyB0byBhY2NlcHQuIFRoZSBvbnVzIGlzIG9uIHRoZSBjb25zdW1pbmcgZGV2ZWxvcGVyIHRvIGxpbWl0IHRoZXNlIHRvIGZpbGUgdHlwZXMgY29tcGF0aWJsZSB3aXRoIHVzYWdlLlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2FjY2VwdFxuICAgKi9cbiAgYWNjZXB0ZWRUeXBlczogc3RyaW5nO1xuICBmaWxlTmFtZT86IHN0cmluZztcblxuICBzaG93Q2xlYXJGaWxlc0J1dHRvbj86IGJvb2xlYW47XG4gIHNlbGVjdEZpbGVzQnV0dG9uVHlwZT86IEJ1dHRvblR5cGU7XG4gIHNlbGVjdEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gIGNsZWFyRmlsZXNCdXR0b25UZXh0Pzogc3RyaW5nO1xuICByZXNldEZpbGVzQnV0dG9uVGV4dD86IHN0cmluZztcbiAgZHJvcFpvbmVUZXh0Pzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgdGhlIGlucHV0IHZhbHVlIG9mIHRoZSBjb250cm9sIGlzIG5vdCBhIHN0cmluZyBvZiB0aGUgc3JjXG4gICAqIHVybCB0byB0aGUgaW1hZ2UsIHRoaXMgZnVuY3Rpb24gYWxsb3dzIGNvbnN1bWVycyB0byBtYXAgdGhlaXJcbiAgICogaW5wdXQgdmFsdWUgaW50byBvbmVcbiAgICovXG4gIG1hcElucHV0VmFsdWVUb1VybD86IChpbnB1dFZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGZpZWxkIGNvbXByZXNzIHRoZSBpbWFnZSBhZnRlciBsb2FkaW5nIGl0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzc0ltYWdlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZVxuICAgKi9cbiAgdGFyZ2V0Q29tcHJlc3NlZEltYWdlRmlsZVNpemVNYj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGZpbGUgc2l6ZSBpbiBNQiByZXF1aXJlZCB0byB0cmlnZ2VyIGNvbXByZXNzaW9uLiBVc2VmdWwgZm9yIHByZXZlbnRpbmcgY29tcHJlc3Npb24gb24gZmlsZXMgbmVhciB0aGUgdGFyZ2V0IGNvbXByZXNzaW9uIHNpemUuXG4gICAqIEBkZWZhdWx0IC43XG4gICAqL1xuICBtaW5Db21wcmVzc2lvblRocmVzaG9sZE1iPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gaGVpZ2h0IG9yIHdpZHRoIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSBydW5zIGNvbXByZXNzaW9uIHVzaW5nIGEgd2ViIHdvcmtlciwgb3RoZXJ3aXNlIGNvbXByZXNzaW9uIGhhcHBlbnMgb24gdGhlIG1haW4gdGhyZWFkLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICB1c2VXZWJXb3JrZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBwcmV2aWV3IGNvbnRhaW5lclxuICAgKi9cbiAgIGltYWdlUHJldmlld0hlaWdodD86IHN0cmluZztcbn1cbiJdfQ==
|
|
@@ -1137,7 +1137,6 @@ function convertBytesToMb(bytes) {
|
|
|
1137
1137
|
|
|
1138
1138
|
const ImageUploadFieldMixin = crisprControlMixin(CrisprFieldComponent);
|
|
1139
1139
|
class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
1140
|
-
// ngControl: NgControl = null;
|
|
1141
1140
|
constructor(ngControl, domSanitizer, cdr) {
|
|
1142
1141
|
super();
|
|
1143
1142
|
this.ngControl = ngControl;
|
|
@@ -1158,42 +1157,50 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
1158
1157
|
minCompressionThresholdMb: .6,
|
|
1159
1158
|
useWebWorker: true,
|
|
1160
1159
|
};
|
|
1160
|
+
/**
|
|
1161
|
+
* The url mapped from initial input value, consumers can us mapInputValueToUrl in config to transform their input value into a src url for the image element
|
|
1162
|
+
*/
|
|
1163
|
+
// inputValueUrl: string | undefined;
|
|
1161
1164
|
this.inputImageFileSubject = new Subject();
|
|
1162
1165
|
this.inputImageFile$ = this.inputImageFileSubject.asObservable().pipe(shareReplay(1));
|
|
1163
1166
|
this.compressedFile$ = this.inputImageFile$.pipe(switchMap((file) => __awaiter(this, void 0, void 0, function* () {
|
|
1164
|
-
if (!file)
|
|
1167
|
+
if (!file || !(file instanceof File))
|
|
1165
1168
|
return null;
|
|
1166
|
-
if (typeof file === 'string')
|
|
1167
|
-
return file;
|
|
1168
1169
|
const { compressImage, targetCompressedImageFileSizeMb, minCompressionThresholdMb, maxWidthOrHeight, useWebWorker } = this.config;
|
|
1169
1170
|
const fileSizeMb = convertBytesToMb(file.size);
|
|
1170
|
-
const shouldCompress = compressImage
|
|
1171
|
+
const shouldCompress = compressImage
|
|
1172
|
+
&& targetCompressedImageFileSizeMb < fileSizeMb
|
|
1173
|
+
&& minCompressionThresholdMb < fileSizeMb;
|
|
1171
1174
|
if (shouldCompress) {
|
|
1172
|
-
const options = Object.assign(Object.assign({}, (maxWidthOrHeight ? { maxWidthOrHeight } : { maxSizeMB: targetCompressedImageFileSizeMb })), { useWebWorker, maxIterations: 30, onProgress: (
|
|
1173
|
-
this.progress =
|
|
1175
|
+
const options = Object.assign(Object.assign({}, (maxWidthOrHeight ? { maxWidthOrHeight } : { maxSizeMB: targetCompressedImageFileSizeMb })), { useWebWorker, maxIterations: 30, onProgress: (progress) => {
|
|
1176
|
+
this.progress = progress;
|
|
1174
1177
|
this.cdr.detectChanges();
|
|
1175
1178
|
} });
|
|
1176
1179
|
return yield imageCompression(file, options);
|
|
1177
1180
|
}
|
|
1178
1181
|
else
|
|
1179
1182
|
return file;
|
|
1180
|
-
})), map((
|
|
1181
|
-
if (!
|
|
1182
|
-
return
|
|
1183
|
-
const { type, name, lastModified } =
|
|
1184
|
-
return new File([
|
|
1183
|
+
})), map((compressedFile) => {
|
|
1184
|
+
if (!compressedFile)
|
|
1185
|
+
return compressedFile;
|
|
1186
|
+
const { type, name, lastModified } = compressedFile;
|
|
1187
|
+
return new File([compressedFile], this.config.fileName || name, {
|
|
1185
1188
|
type,
|
|
1186
1189
|
lastModified
|
|
1187
1190
|
});
|
|
1188
1191
|
}), tap(file => {
|
|
1189
|
-
|
|
1192
|
+
// only set the value if there is a file because resetToInitialValue sets the control value
|
|
1193
|
+
// to initial value and clears the compressed image, so setting it to null here would undo that
|
|
1194
|
+
if (file) {
|
|
1195
|
+
this.control.setValue(file);
|
|
1196
|
+
}
|
|
1190
1197
|
if (file || this.value) {
|
|
1191
1198
|
this.control.markAsTouched();
|
|
1192
1199
|
setTimeout(() => {
|
|
1193
1200
|
this.cdr.detectChanges();
|
|
1194
1201
|
}, 100);
|
|
1195
1202
|
}
|
|
1196
|
-
}),
|
|
1203
|
+
}), shareReplay(1));
|
|
1197
1204
|
this.compressedImageUrlString$ = this.compressedFile$.pipe(switchMap((file) => __awaiter(this, void 0, void 0, function* () {
|
|
1198
1205
|
if (!file)
|
|
1199
1206
|
return null;
|
|
@@ -1209,11 +1216,19 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
1209
1216
|
}
|
|
1210
1217
|
ngOnInit() {
|
|
1211
1218
|
super.ngOnInit();
|
|
1219
|
+
// this.inputValueUrl = this.value && this.config.mapInputValueToUrl?.(this.value) || this.value;
|
|
1212
1220
|
this.imageSrcUrl$ = combineLatest([
|
|
1213
1221
|
this.compressedImageUrlString$.pipe(startWith(null)),
|
|
1214
|
-
this.control.valueChanges.pipe(startWith(this.value))
|
|
1222
|
+
this.control.valueChanges.pipe(startWith(this.value), map((controlValue) => {
|
|
1223
|
+
var _a, _b;
|
|
1224
|
+
if (!controlValue)
|
|
1225
|
+
return null;
|
|
1226
|
+
if (controlValue instanceof File)
|
|
1227
|
+
return null;
|
|
1228
|
+
return ((_b = (_a = this.config).mapInputValueToUrl) === null || _b === void 0 ? void 0 : _b.call(_a, controlValue)) || controlValue;
|
|
1229
|
+
}))
|
|
1215
1230
|
]).pipe(map(([compressedImageUrlString, controlUrl]) => {
|
|
1216
|
-
return compressedImageUrlString ||
|
|
1231
|
+
return compressedImageUrlString || controlUrl || null;
|
|
1217
1232
|
}));
|
|
1218
1233
|
this.disabled$ = this.config.disabledCallback
|
|
1219
1234
|
? this.config.disabledCallback(this.group, this.config)
|
|
@@ -1222,6 +1237,10 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
1222
1237
|
filesChanged(files) {
|
|
1223
1238
|
if (files && files.length > 0) {
|
|
1224
1239
|
const imageFile = files[0];
|
|
1240
|
+
// We clear the control here so that it is invalid while compressing
|
|
1241
|
+
// the input pipeline will take care of resetting it
|
|
1242
|
+
this.control.patchValue(null);
|
|
1243
|
+
// this.control.setErrors({compressing: {loadingMessage: 'Please wait while file compresses'}});
|
|
1225
1244
|
this.control.markAsTouched();
|
|
1226
1245
|
this.inputImageFileSubject.next(imageFile);
|
|
1227
1246
|
}
|
|
@@ -1234,8 +1253,8 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
|
|
|
1234
1253
|
this.isUploaded = false;
|
|
1235
1254
|
}
|
|
1236
1255
|
resetToInitialValue(initialValue) {
|
|
1237
|
-
this.inputImageFileSubject.next(
|
|
1238
|
-
|
|
1256
|
+
this.inputImageFileSubject.next(null);
|
|
1257
|
+
this.control.patchValue(initialValue);
|
|
1239
1258
|
this.isUploaded = false;
|
|
1240
1259
|
}
|
|
1241
1260
|
writeValue(value) { }
|
|
@@ -1316,7 +1335,6 @@ function maxFileSizeValidator(maxFileSize) {
|
|
|
1316
1335
|
const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);
|
|
1317
1336
|
if (maxFileSize > actualFileSize)
|
|
1318
1337
|
return null;
|
|
1319
|
-
// control.setErrors({maxFileSize: { maxFileSize, actualFileSize }} )
|
|
1320
1338
|
return { maxFileSize: { maxFileSize, actualFileSize } };
|
|
1321
1339
|
};
|
|
1322
1340
|
}
|