@tft/crispr-forms 13.0.1 → 13.0.2

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.
@@ -71,11 +71,18 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
71
71
  this.cdr.detectChanges();
72
72
  }
73
73
  };
74
- const compressedFile = await imageCompression(file, options);
75
- return compressedFile;
74
+ return await imageCompression(file, options);
76
75
  }
77
76
  else
78
77
  return file;
78
+ }), map((compressedFileOrString) => {
79
+ if (!compressedFileOrString || typeof compressedFileOrString === 'string')
80
+ return compressedFileOrString;
81
+ const { type, name, lastModified } = compressedFileOrString;
82
+ return new File([compressedFileOrString], this.config.fileName || name, {
83
+ type,
84
+ lastModified
85
+ });
79
86
  }), tap(file => {
80
87
  this.control.setValue(file);
81
88
  if (file || this.value) {
@@ -89,9 +96,7 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
89
96
  if (!file)
90
97
  return null;
91
98
  const compressedStringImage = await imageCompression.getDataUrlFromFile(file);
92
- return file.type.includes('svg')
93
- ? this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage)
94
- : compressedStringImage;
99
+ return this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage);
95
100
  }), shareReplay(1));
96
101
  this.isUploaded = false;
97
102
  if (this.ngControl != null) {
@@ -138,10 +143,10 @@ export class ImageUploadFieldComponent extends ImageUploadFieldMixin {
138
143
  registerOnTouched(fn) { }
139
144
  }
140
145
  ImageUploadFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: ImageUploadFieldComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
141
- ImageUploadFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: ImageUploadFieldComponent, selector: "crispr-image-upload-field", viewQueries: [{ propertyName: "fileInputRef", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"], components: [{ type: i3.FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i5.SelectedFileComponent, selector: "crispr-selected-file", inputs: ["fileName", "progress", "showProgress", "color"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { type: i4.MatLabel, selector: "mat-label" }, { type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i8.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.FileDropzoneDirective, selector: "[crisprFileDropzone]", inputs: ["crisprFileDropzone"], outputs: ["fileDrop"] }], pipes: { "async": i10.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
146
+ ImageUploadFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: ImageUploadFieldComponent, selector: "crispr-image-upload-field", viewQueries: [{ propertyName: "fileInputRef", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"], components: [{ type: i3.FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i5.SelectedFileComponent, selector: "crispr-selected-file", inputs: ["fileName", "progress", "showProgress", "color"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { type: i4.MatLabel, selector: "mat-label" }, { type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i8.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.FileDropzoneDirective, selector: "[crisprFileDropzone]", inputs: ["crisprFileDropzone"], outputs: ["fileDrop"] }], pipes: { "async": i10.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
142
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: ImageUploadFieldComponent, decorators: [{
143
148
  type: Component,
144
- args: [{ selector: 'crispr-image-upload-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"] }]
149
+ args: [{ selector: 'crispr-image-upload-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"] }]
145
150
  }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
146
151
  type: Optional
147
152
  }, {
@@ -201,13 +206,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
201
206
  export function maxFileSizeValidator(maxFileSize) {
202
207
  return (control) => {
203
208
  const controlValue = control.value;
204
- if (!(controlValue instanceof Blob))
209
+ if (!(controlValue instanceof File)) {
205
210
  return null;
211
+ }
206
212
  const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);
207
213
  if (maxFileSize > actualFileSize)
208
214
  return null;
209
- control.setErrors({ maxFileSize: { maxFileSize, actualFileSize } });
215
+ // control.setErrors({maxFileSize: { maxFileSize, actualFileSize }} )
210
216
  return { maxFileSize: { maxFileSize, actualFileSize } };
211
217
  };
212
218
  }
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwvaW1hZ2UtdXBsb2FkLWZpZWxkL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL21hdGVyaWFsL2ltYWdlLXVwbG9hZC1maWVsZC9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFFVCx1QkFBdUIsRUFDdkIsUUFBUSxFQUNSLElBQUksRUFDSixpQkFBaUIsRUFDakIsUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBcUMsU0FBUyxFQUFFLG1CQUFtQixFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUs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QUFDLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBPbkluaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE5nTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOZ0NvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCBpbWFnZUNvbXByZXNzaW9uIGZyb20gJ2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkRmllbGRNb2R1bGUgfSBmcm9tICcuLi9maWxlLXVwbG9hZCc7XG5pbXBvcnQgeyBjcmlzcHJDb250cm9sTWl4aW4sIENyaXNwckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RzJztcbmltcG9ydCB7IEZpZWxkQ29udGFpbmVyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZmllbGQtY29udGFpbmVyL2ZpZWxkLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcnO1xuaW1wb3J0IHsgY29udmVydEJ5dGVzVG9NYiB9IGZyb20gJy4vaW1hZ2UtY29tcHJlc3Npb24uaGVscGVycyc7XG5pbXBvcnQgeyBTZWxlY3RlZEZpbGVNb2R1bGUgfSBmcm9tICcuLi9zZWxlY3RlZC1maWxlL3NlbGVjdGVkLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uSGFuZGxlck1vZHVsZSB9IGZyb20gJ0B0ZnQvZm9ybS12YWxpZGF0aW9uLWhhbmRsZXInO1xuXG5jb25zdCBJbWFnZVVwbG9hZEZpZWxkTWl4aW4gPSBjcmlzcHJDb250cm9sTWl4aW48SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4oQ3Jpc3ByRmllbGRDb21wb25lbnQpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcmlzcHItaW1hZ2UtdXBsb2FkLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudCBleHRlbmRzIEltYWdlVXBsb2FkRmllbGRNaXhpbiBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIG9uQ2hhbmdlOiAoKSA9PiB2b2lkO1xuXG4gIGRlZmF1bHRDb25maWc6IFBhcnRpYWw8SW1hZ2VVcGxvYWRGaWVsZENvbmZpZz4gPSB7XG4gICAgLy8gYWxsb3dNdWx0aXBsZUZpbGVzOiBmYWxzZSxcbiAgICBhY2NlcHRlZFR5cGVzOiAnaW1hZ2UvKicsXG4gICAgZHJvcFpvbmVUZXh0OiAnRFJPUCBGSUxFIEhFUkUnLFxuICAgIHNlbGVjdEZpbGVzQnV0dG9uVHlwZTogJ2J1dHRvbicsXG4gICAgc2VsZWN0QnV0dG9uVGV4dDogJ1NFTEVDVCcsXG4gICAgc2hvd0NsZWFyRmlsZXNCdXR0b246IHRydWUsXG4gICAgY2xlYXJGaWxlc0J1dHRvblRleHQ6ICdDTEVBUicsXG4gICAgcmVzZXRGaWxlc0J1dHRvblRleHQ6ICdSRVNFVCcsXG4gICAgaW1hZ2VQcmV2aWV3SGVpZ2h0OiAnMjUwcHgnLFxuICAgIGNvbXByZXNzSW1hZ2U6IGZhbHNlLFxuICAgIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWI6IC40LFxuICAgIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWI6IC42LFxuICAgIHVzZVdlYldvcmtlcjogdHJ1ZSxcbiAgfVxuXG4gIHByb2dyZXNzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaW5wdXRJbWFnZUZpbGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8RmlsZSB8IHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaW5wdXRJbWFnZUZpbGUkID0gdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICBzaGFyZVJlcGxheSgxKSxcbiAgKTtcblxuICBjb21wcmVzc2VkRmlsZSQ6IE9ic2VydmFibGU8RmlsZT4gPSB0aGlzLmlucHV0SW1hZ2VGaWxlJC5waXBlKFxuICAgIHN3aXRjaE1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgaWYgKCFmaWxlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHJldHVybiBmaWxlXG4gICAgICBjb25zdCB7IGNvbXByZXNzSW1hZ2UsIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWIsIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWIsIG1heFdpZHRoT3JIZWlnaHQsIHVzZVdlYldvcmtlciB9ID0gdGhpcy5jb25maWc7XG4gICAgICBjb25zdCBmaWxlU2l6ZU1iID0gY29udmVydEJ5dGVzVG9NYihmaWxlLnNpemUpO1xuICAgICAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb21wcmVzc0ltYWdlICYmIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWIgPCBmaWxlU2l6ZU1iICYmIG1pbkNvbXByZXNzaW9uVGhyZXNob2xkTWIgPCBmaWxlU2l6ZU1iXG4gICAgICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAvLyBVc2UgbWF4V2lkdGhPckhlaWdodCBpZiBpdCB3YXMgcHJvdmlkZWQsIGVsc2UgdXNlIHRhcmdldCBjb21wcmVzc2VkIHNpemVcbiAgICAgICAgICAuLi4obWF4V2lkdGhPckhlaWdodCA/IHttYXhXaWR0aE9ySGVpZ2h0fSA6IHsgbWF4U2l6ZU1COiB0YXJnZXRDb21wcmVzc2VkSW1hZ2VGaWxlU2l6ZU1ifSksXG4gICAgICAgICAgdXNlV2ViV29ya2VyLFxuICAgICAgICAgIG1heEl0ZXJhdGlvbnM6IDMwLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6IChwOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IGF3YWl0IGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucylcbiAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRGaWxlO1xuICAgICAgfSBlbHNlIHJldHVybiBmaWxlO1xuICAgIH0pLFxuICAgIHRhcChmaWxlID0+IHtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShmaWxlKTtcbiAgICAgIGlmIChmaWxlIHx8IHRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAxMDApXG4gICAgICB9XG4gICAgfSksXG4gICAgbWFwKGZpbGUgPT4gdHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnID8gbnVsbCA6IGZpbGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gIClcblxuICBjb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmckOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+ID0gdGhpcy5jb21wcmVzc2VkRmlsZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGlmKCFmaWxlKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRTdHJpbmdJbWFnZSA9IGF3YWl0IGltYWdlQ29tcHJlc3Npb24uZ2V0RGF0YVVybEZyb21GaWxlKGZpbGUpO1xuICAgICAgcmV0dXJuIGZpbGUudHlwZS5pbmNsdWRlcygnc3ZnJylcbiAgICAgICAgPyB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoY29tcHJlc3NlZFN0cmluZ0ltYWdlKSBhcyBzdHJpbmdcbiAgICAgICAgOiBjb21wcmVzc2VkU3RyaW5nSW1hZ2U7XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gIClcblxuICAvLyBUaGlzIGlzIHdoYXQgaXMgZGlzcGxheWVkIGJ5IHRoZSBpbWFnZSBwcmV2aWV3XG4gIGltYWdlU3JjVXJsJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcblxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKSBmaWxlSW5wdXRSZWY6IEVsZW1lbnRSZWZcblxuICBzZWxlY3RlZEZpbGVzOiBGaWxlTGlzdDtcblxuICBpc1VwbG9hZGVkID0gZmFsc2U7XG5cbiAgZGlzYWJsZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8vIG5nQ29udHJvbDogTmdDb250cm9sID0gbnVsbDtcbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIC8vIFNldHRpbmcgdGhlIHZhbHVlIGFjY2Vzc29yIGRpcmVjdGx5IChpbnN0ZWFkIG9mIHVzaW5nXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXG4gICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmltYWdlU3JjVXJsJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmckLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy52YWx1ZSkpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NvbXByZXNzZWRJbWFnZVVybFN0cmluZywgY29udHJvbFVybF0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRJbWFnZVVybFN0cmluZyB8fCB0eXBlb2YgY29udHJvbFVybCA9PT0gJ3N0cmluZycgJiYgY29udHJvbFVybCB8fCBudWxsO1xuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5kaXNhYmxlZCQgPSB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrXG4gICAgPyB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrKHRoaXMuZ3JvdXAsIHRoaXMuY29uZmlnKVxuICAgIDogb2YoZmFsc2UpO1xuICB9XG5cbiAgZmlsZXNDaGFuZ2VkKGZpbGVzOiBGaWxlTGlzdCk6IHZvaWQge1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwICkge1xuICAgICAgY29uc3QgaW1hZ2VGaWxlID0gZmlsZXNbMF07XG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QubmV4dChpbWFnZUZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRmlsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJbWFnZUZpbGVTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5maWxlSW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUobnVsbCk7XG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmlzVXBsb2FkZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHJlc2V0VG9Jbml0aWFsVmFsdWUoaW5pdGlhbFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SW1hZ2VGaWxlU3ViamVjdC5uZXh0KGluaXRpYWxWYWx1ZSk7XG4gICAgLy8gdGhpcy5maWxlSW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IGluaXRpYWxWYWx1ZVxuICAgIHRoaXMuaXNVcGxvYWRlZCA9IGZhbHNlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSggdmFsdWU6IG51bGwgKSB7IH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKCBmbjogKCkgPT4gdm9pZCApIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCggZm46ICgpID0+IHZvaWQgKSB7IH1cbn1cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRmllbGRDb250YWluZXJNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgU2VsZWN0ZWRGaWxlTW9kdWxlLFxuICAgIEZpbGVVcGxvYWRGaWVsZE1vZHVsZSxcbiAgICBGb3JtVmFsaWRhdGlvbkhhbmRsZXJNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgICAgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgIEltYWdlVXBsb2FkRmllbGRDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVVwbG9hZEZpZWxkTW9kdWxlIHsgfVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4RmlsZVNpemVWYWxpZGF0b3IobWF4RmlsZVNpemU6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghKGNvbnRyb2xWYWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBhY3R1YWxGaWxlU2l6ZSA9ICtjb252ZXJ0Qnl0ZXNUb01iKGNvbnRyb2xWYWx1ZS5zaXplKS50b1ByZWNpc2lvbigzKTtcbiAgICBpZiAobWF4RmlsZVNpemUgPiBhY3R1YWxGaWxlU2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgY29udHJvbC5zZXRFcnJvcnMoe21heEZpbGVTaXplOiB7IG1heEZpbGVTaXplLCBhY3R1YWxGaWxlU2l6ZSB9fSApXG4gICAgcmV0dXJuIHttYXhGaWxlU2l6ZTogeyBtYXhGaWxlU2l6ZSwgYWN0dWFsRmlsZVNpemUgfX07XG4gIH1cbn1cbiIsIjxjcmlzcHItZmllbGQtY29udGFpbmVyXG4gIFtjb25maWddPVwiY29uZmlnXCJcbiAgW2dyb3VwXT1cImdyb3VwXCI+XG5cbiAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhbHdheXNcIlxuICAgIFtjb2xvcl09XCJjb25maWcuY29sb3JcIlxuICAgIFthcHBlYXJhbmNlXT1cImNvbmZpZy5hcHBlYXJhbmNlXCJcbiAgICBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gICAgPG1hdC1sYWJlbD57e2NvbmZpZy5sYWJlbH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmNvbnRyb2xOYW1lXCIgbWF0SW5wdXQgdHlwZT1cInRleHRcIi8+XG4gICAgPGlucHV0XG4gICAgICAjZmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBbYWNjZXB0XT1cImNvbmZpZy5hY2NlcHRlZFR5cGVzXCJcbiAgICAgIChjaGFuZ2UpPVwiZmlsZXNDaGFuZ2VkKCRldmVudC50YXJnZXQuZmlsZXMpXCIvPlxuICAgIDxkaXYgY2xhc3M9XCJ1aS1jb250YWluZXJcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cImltYWdlLXByZXZpZXdcIiBbc3R5bGUuaGVpZ2h0XT1cImNvbmZpZy5pbWFnZVByZXZpZXdIZWlnaHRcIj5cbiAgICAgICAgPGNyaXNwci1zZWxlY3RlZC1maWxlXG4gICAgICAgICAgKm5nSWY9XCIocHJvZ3Jlc3MgPCAxMDApICYmIGlucHV0SW1hZ2VGaWxlJCB8IGFzeW5jIGFzIGZpbGU7IGVsc2UgZHJvcHpvbmVPclByZXZpZXdcIlxuICAgICAgICAgIFtjb2xvcl09XCJjb25maWcuY29sb3IgPT09ICdwcmltYXJ5JyA/ICdhY2NlbnQnIDogJ3ByaW1hcnknXCJcbiAgICAgICAgICBbZmlsZU5hbWVdPVwiJ0NvbXByZXNzaW5nOiAnICsgZmlsZS5uYW1lXCJcbiAgICAgICAgICBbc2hvd1Byb2dyZXNzXT1cInRydWVcIlxuICAgICAgICAgIFtwcm9ncmVzc109XCJwcm9ncmVzc1wiPlxuICAgICAgICA8L2NyaXNwci1zZWxlY3RlZC1maWxlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZHJvcHpvbmVPclByZXZpZXc+XG4gICAgICAgICAgPCEtLSA8aW1nICpuZ0lmPVwiKGluaXRpYWxVcmxTdHJpbmckIHwgYXN5bmMpIGFzIGluaXRpYWxVcmxTdHJpbmc7XCIgW3NyY109XCJpbml0aWFsVXJsU3RyaW5nXCIgYWx0PVwiXCI+IC0tPlxuICAgICAgICAgIDxpbWcgKm5nSWY9XCJpbWFnZVNyY1VybCQgfCBhc3luYyBhcyBzcmNVcmw7IGVsc2Ugbm9JbWFnZVwiIFtzcmNdPVwic3JjVXJsXCIgYWx0PVwiXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgW2NyaXNwckZpbGVEcm9wem9uZV09XCIhKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIChmaWxlRHJvcCk9XCJmaWxlc0NoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcm9wLWljb25cIiBpbmxpbmU9XCJ0cnVlXCI+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LWgyXCI+e3tjb25maWcuZHJvcFpvbmVUZXh0fX08L2gyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG5cblxuXG4gICAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cInRydWVcIj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbGVJbnB1dCgpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBTZWxlY3RlZCBGaWxlKHMpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAge3tjb25maWcuY2xlYXJGaWxlc0J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJ2YWx1ZVwiXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJyZXNldFRvSW5pdGlhbFZhbHVlKHZhbHVlKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYylcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgU2VsZWN0ZWQgRmlsZShzKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5yZXBsYXk8L21hdC1pY29uPlxuICAgICAgICAgIHt7Y29uZmlnLnJlc2V0RmlsZXNCdXR0b25UZXh0fX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIoZGlzYWJsZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uZmlnLmNvbnRyb2xOYW1lXCI+XG4gICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgY2FtZXJhXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG48L2NyaXNwci1maWVsZC1jb250YWluZXI+XG4iXX0=
219
+ export function allowedFileExtValidator(allowedFileExtensions, onlyAllowFiles = true) {
220
+ return (control) => {
221
+ const controlValue = control.value;
222
+ const isFile = controlValue instanceof File;
223
+ if (!onlyAllowFiles && !isFile)
224
+ return null;
225
+ const actualExtension = isFile ? controlValue.name.split('.').pop() : 'Not a file';
226
+ const isAllowedExtension = allowedFileExtensions.includes(actualExtension);
227
+ if (isAllowedExtension) {
228
+ return null;
229
+ }
230
+ return { allowedExtension: { allowedFileExtensions, actualExtension } };
231
+ };
232
+ }
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwvaW1hZ2UtdXBsb2FkLWZpZWxkL2ltYWdlLXVwbG9hZC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyaXNwci1mb3Jtcy9zcmMvbGliL21hdGVyaWFsL2ltYWdlLXVwbG9hZC1maWVsZC9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFFVCx1QkFBdUIsRUFDdkIsUUFBUSxFQUNSLElBQUksRUFDSixpQkFBaUIsRUFDakIsUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBcUMsU0FBUyxFQUFFLG1CQUFtQixFQUFpQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUs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LENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksV0FBVyxHQUFHLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QyxxRUFBcUU7UUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsRUFBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMscUJBQStCLEVBQUUsY0FBYyxHQUFHLElBQUk7SUFDNUYsT0FBTyxDQUFDLE9BQW9CLEVBQTJCLEVBQUU7UUFDdkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxZQUFZLFlBQVksSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ25GLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNFLElBQUcsa0JBQWtCLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxFQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgT3B0aW9uYWwsXG4gIFNlbGYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBOZ01vZHVsZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTmdDb250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgaW1hZ2VDb21wcmVzc2lvbiBmcm9tICdicm93c2VyLWltYWdlLWNvbXByZXNzaW9uJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEZpZWxkTW9kdWxlIH0gZnJvbSAnLi4vZmlsZS11cGxvYWQnO1xuaW1wb3J0IHsgY3Jpc3ByQ29udHJvbE1peGluLCBDcmlzcHJGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Fic3RyYWN0cyc7XG5pbXBvcnQgeyBGaWVsZENvbnRhaW5lck1vZHVsZSB9IGZyb20gJy4uLy4uL2ZpZWxkLWNvbnRhaW5lci9maWVsZC1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgSW1hZ2VVcGxvYWRGaWVsZENvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9pbWFnZS11cGxvYWQtZmllbGQuY29uZmlnJztcbmltcG9ydCB7IGNvbnZlcnRCeXRlc1RvTWIgfSBmcm9tICcuL2ltYWdlLWNvbXByZXNzaW9uLmhlbHBlcnMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRGaWxlTW9kdWxlIH0gZnJvbSAnLi4vc2VsZWN0ZWQtZmlsZS9zZWxlY3RlZC1maWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvbkhhbmRsZXJNb2R1bGUgfSBmcm9tICdAdGZ0L2Zvcm0tdmFsaWRhdGlvbi1oYW5kbGVyJztcblxuY29uc3QgSW1hZ2VVcGxvYWRGaWVsZE1peGluID0gY3Jpc3ByQ29udHJvbE1peGluPEltYWdlVXBsb2FkRmllbGRDb25maWc+KENyaXNwckZpZWxkQ29tcG9uZW50KTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3Jpc3ByLWltYWdlLXVwbG9hZC1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS11cGxvYWQtZmllbGQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlVXBsb2FkRmllbGRDb21wb25lbnQgZXh0ZW5kcyBJbWFnZVVwbG9hZEZpZWxkTWl4aW4gaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBvbkNoYW5nZTogKCkgPT4gdm9pZDtcblxuICBkZWZhdWx0Q29uZmlnOiBQYXJ0aWFsPEltYWdlVXBsb2FkRmllbGRDb25maWc+ID0ge1xuICAgIC8vIGFsbG93TXVsdGlwbGVGaWxlczogZmFsc2UsXG4gICAgYWNjZXB0ZWRUeXBlczogJ2ltYWdlLyonLFxuICAgIGRyb3Bab25lVGV4dDogJ0RST1AgRklMRSBIRVJFJyxcbiAgICBzZWxlY3RGaWxlc0J1dHRvblR5cGU6ICdidXR0b24nLFxuICAgIHNlbGVjdEJ1dHRvblRleHQ6ICdTRUxFQ1QnLFxuICAgIHNob3dDbGVhckZpbGVzQnV0dG9uOiB0cnVlLFxuICAgIGNsZWFyRmlsZXNCdXR0b25UZXh0OiAnQ0xFQVInLFxuICAgIHJlc2V0RmlsZXNCdXR0b25UZXh0OiAnUkVTRVQnLFxuICAgIGltYWdlUHJldmlld0hlaWdodDogJzI1MHB4JyxcbiAgICBjb21wcmVzc0ltYWdlOiBmYWxzZSxcbiAgICB0YXJnZXRDb21wcmVzc2VkSW1hZ2VGaWxlU2l6ZU1iOiAuNCxcbiAgICBtaW5Db21wcmVzc2lvblRocmVzaG9sZE1iOiAuNixcbiAgICB1c2VXZWJXb3JrZXI6IHRydWUsXG4gIH1cblxuICBwcm9ncmVzczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlucHV0SW1hZ2VGaWxlU3ViamVjdCA9IG5ldyBTdWJqZWN0PEZpbGUgfCBzdHJpbmcgfCBudWxsPigpO1xuXG4gIGlucHV0SW1hZ2VGaWxlJCA9IHRoaXMuaW5wdXRJbWFnZUZpbGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gICk7XG5cbiAgY29tcHJlc3NlZEZpbGUkOiBPYnNlcnZhYmxlPEZpbGU+ID0gdGhpcy5pbnB1dEltYWdlRmlsZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZmlsZVxuICAgICAgY29uc3QgeyBjb21wcmVzc0ltYWdlLCB0YXJnZXRDb21wcmVzc2VkSW1hZ2VGaWxlU2l6ZU1iLCBtaW5Db21wcmVzc2lvblRocmVzaG9sZE1iLCBtYXhXaWR0aE9ySGVpZ2h0LCB1c2VXZWJXb3JrZXIgfSA9IHRoaXMuY29uZmlnO1xuICAgICAgY29uc3QgZmlsZVNpemVNYiA9IGNvbnZlcnRCeXRlc1RvTWIoZmlsZS5zaXplKTtcbiAgICAgIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29tcHJlc3NJbWFnZSAmJiB0YXJnZXRDb21wcmVzc2VkSW1hZ2VGaWxlU2l6ZU1iIDwgZmlsZVNpemVNYiAmJiBtaW5Db21wcmVzc2lvblRocmVzaG9sZE1iIDwgZmlsZVNpemVNYlxuICAgICAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgLy8gVXNlIG1heFdpZHRoT3JIZWlnaHQgaWYgaXQgd2FzIHByb3ZpZGVkLCBlbHNlIHVzZSB0YXJnZXQgY29tcHJlc3NlZCBzaXplXG4gICAgICAgICAgLi4uKG1heFdpZHRoT3JIZWlnaHQgPyB7bWF4V2lkdGhPckhlaWdodH0gOiB7IG1heFNpemVNQjogdGFyZ2V0Q29tcHJlc3NlZEltYWdlRmlsZVNpemVNYn0pLFxuICAgICAgICAgIHVzZVdlYldvcmtlcixcbiAgICAgICAgICBtYXhJdGVyYXRpb25zOiAzMCxcbiAgICAgICAgICBvblByb2dyZXNzOiAocDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gcDtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2UgcmV0dXJuICBmaWxlO1xuICAgIH0pLFxuICAgIG1hcCgoY29tcHJlc3NlZEZpbGVPclN0cmluZzogRmlsZSB8IHN0cmluZykgPT4ge1xuICAgICAgaWYoIWNvbXByZXNzZWRGaWxlT3JTdHJpbmcgfHwgdHlwZW9mIGNvbXByZXNzZWRGaWxlT3JTdHJpbmcgPT09ICdzdHJpbmcnKSByZXR1cm4gY29tcHJlc3NlZEZpbGVPclN0cmluZztcbiAgICAgIGNvbnN0IHsgdHlwZSwgbmFtZSwgbGFzdE1vZGlmaWVkIH0gPSBjb21wcmVzc2VkRmlsZU9yU3RyaW5nXG4gICAgICByZXR1cm4gbmV3IEZpbGUoW2NvbXByZXNzZWRGaWxlT3JTdHJpbmddLCB0aGlzLmNvbmZpZy5maWxlTmFtZSB8fCBuYW1lLCB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGxhc3RNb2RpZmllZFxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdGFwKGZpbGUgPT4ge1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKGZpbGUpO1xuICAgICAgaWYgKGZpbGUgfHwgdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sIDEwMClcbiAgICAgIH1cbiAgICB9KSxcbiAgICBtYXAoZmlsZSA9PiB0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycgPyBudWxsIDogZmlsZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKVxuXG4gIGNvbXByZXNzZWRJbWFnZVVybFN0cmluZyQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPSB0aGlzLmNvbXByZXNzZWRGaWxlJC5waXBlKFxuICAgIHN3aXRjaE1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgaWYoIWZpbGUpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgY29tcHJlc3NlZFN0cmluZ0ltYWdlID0gYXdhaXQgaW1hZ2VDb21wcmVzc2lvbi5nZXREYXRhVXJsRnJvbUZpbGUoZmlsZSk7XG4gICAgICByZXR1cm4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGNvbXByZXNzZWRTdHJpbmdJbWFnZSkgYXMgc3RyaW5nXG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gIClcblxuICAvLyBUaGlzIGlzIHdoYXQgaXMgZGlzcGxheWVkIGJ5IHRoZSBpbWFnZSBwcmV2aWV3XG4gIGltYWdlU3JjVXJsJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcblxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKSBmaWxlSW5wdXRSZWY6IEVsZW1lbnRSZWZcblxuICBzZWxlY3RlZEZpbGVzOiBGaWxlTGlzdDtcblxuICBpc1VwbG9hZGVkID0gZmFsc2U7XG5cbiAgZGlzYWJsZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8vIG5nQ29udHJvbDogTmdDb250cm9sID0gbnVsbDtcbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcbiAgICAgIC8vIFNldHRpbmcgdGhlIHZhbHVlIGFjY2Vzc29yIGRpcmVjdGx5IChpbnN0ZWFkIG9mIHVzaW5nXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXG4gICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmltYWdlU3JjVXJsJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jb21wcmVzc2VkSW1hZ2VVcmxTdHJpbmckLnBpcGUoc3RhcnRXaXRoKG51bGwpKSxcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy52YWx1ZSkpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2NvbXByZXNzZWRJbWFnZVVybFN0cmluZywgY29udHJvbFVybF0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRJbWFnZVVybFN0cmluZyB8fCB0eXBlb2YgY29udHJvbFVybCA9PT0gJ3N0cmluZycgJiYgY29udHJvbFVybCB8fCBudWxsO1xuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5kaXNhYmxlZCQgPSB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrXG4gICAgPyB0aGlzLmNvbmZpZy5kaXNhYmxlZENhbGxiYWNrKHRoaXMuZ3JvdXAsIHRoaXMuY29uZmlnKVxuICAgIDogb2YoZmFsc2UpO1xuICB9XG5cbiAgZmlsZXNDaGFuZ2VkKGZpbGVzOiBGaWxlTGlzdCk6IHZvaWQge1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwICkge1xuICAgICAgY29uc3QgaW1hZ2VGaWxlID0gZmlsZXNbMF07XG4gICAgICB0aGlzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdGhpcy5pbnB1dEltYWdlRmlsZVN1YmplY3QubmV4dChpbWFnZUZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRmlsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJbWFnZUZpbGVTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5maWxlSW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUobnVsbCk7XG4gICAgdGhpcy5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmlzVXBsb2FkZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHJlc2V0VG9Jbml0aWFsVmFsdWUoaW5pdGlhbFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SW1hZ2VGaWxlU3ViamVjdC5uZXh0KGluaXRpYWxWYWx1ZSk7XG4gICAgLy8gdGhpcy5maWxlSW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IGluaXRpYWxWYWx1ZVxuICAgIHRoaXMuaXNVcGxvYWRlZCA9IGZhbHNlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSggdmFsdWU6IG51bGwgKSB7IH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKCBmbjogKCkgPT4gdm9pZCApIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZCggZm46ICgpID0+IHZvaWQgKSB7IH1cbn1cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRmllbGRDb250YWluZXJNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgU2VsZWN0ZWRGaWxlTW9kdWxlLFxuICAgIEZpbGVVcGxvYWRGaWVsZE1vZHVsZSxcbiAgICBGb3JtVmFsaWRhdGlvbkhhbmRsZXJNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgICAgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgIEltYWdlVXBsb2FkRmllbGRDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVVwbG9hZEZpZWxkTW9kdWxlIHsgfVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4RmlsZVNpemVWYWxpZGF0b3IobWF4RmlsZVNpemU6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghKGNvbnRyb2xWYWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYWN0dWFsRmlsZVNpemUgPSArY29udmVydEJ5dGVzVG9NYihjb250cm9sVmFsdWUuc2l6ZSkudG9QcmVjaXNpb24oMyk7XG4gICAgaWYgKG1heEZpbGVTaXplID4gYWN0dWFsRmlsZVNpemUpIHJldHVybiBudWxsO1xuICAgIC8vIGNvbnRyb2wuc2V0RXJyb3JzKHttYXhGaWxlU2l6ZTogeyBtYXhGaWxlU2l6ZSwgYWN0dWFsRmlsZVNpemUgfX0gKVxuICAgIHJldHVybiB7bWF4RmlsZVNpemU6IHsgbWF4RmlsZVNpemUsIGFjdHVhbEZpbGVTaXplIH19O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd2VkRmlsZUV4dFZhbGlkYXRvcihhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdLCBvbmx5QWxsb3dGaWxlcyA9IHRydWUpOiBWYWxpZGF0b3JGbiB7XG4gIHJldHVybiAoY29udHJvbDogRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBpc0ZpbGUgPSBjb250cm9sVmFsdWUgaW5zdGFuY2VvZiBGaWxlO1xuICAgIGlmICghb25seUFsbG93RmlsZXMgJiYgIWlzRmlsZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYWN0dWFsRXh0ZW5zaW9uID0gaXNGaWxlID8gY29udHJvbFZhbHVlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSA6ICdOb3QgYSBmaWxlJztcbiAgICBjb25zdCBpc0FsbG93ZWRFeHRlbnNpb24gPSBhbGxvd2VkRmlsZUV4dGVuc2lvbnMuaW5jbHVkZXMoYWN0dWFsRXh0ZW5zaW9uKTtcbiAgICBpZihpc0FsbG93ZWRFeHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge2FsbG93ZWRFeHRlbnNpb246IHsgYWxsb3dlZEZpbGVFeHRlbnNpb25zLCBhY3R1YWxFeHRlbnNpb24gfX07XG4gIH1cbn1cbiIsIjxjcmlzcHItZmllbGQtY29udGFpbmVyXG4gIFtjb25maWddPVwiY29uZmlnXCJcbiAgW2dyb3VwXT1cImdyb3VwXCI+XG5cbiAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhbHdheXNcIlxuICAgIFtjb2xvcl09XCJjb25maWcuY29sb3JcIlxuICAgIFthcHBlYXJhbmNlXT1cImNvbmZpZy5hcHBlYXJhbmNlXCJcbiAgICBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XG4gICAgPG1hdC1sYWJlbD57e2NvbmZpZy5sYWJlbH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmNvbnRyb2xOYW1lXCIgbWF0SW5wdXQgdHlwZT1cInRleHRcIi8+XG4gICAgPGlucHV0XG4gICAgICAjZmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBbYWNjZXB0XT1cImNvbmZpZy5hY2NlcHRlZFR5cGVzXCJcbiAgICAgIChjaGFuZ2UpPVwiZmlsZXNDaGFuZ2VkKCRldmVudC50YXJnZXQuZmlsZXMpXCIvPlxuICAgIDxkaXYgY2xhc3M9XCJ1aS1jb250YWluZXJcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cImltYWdlLXByZXZpZXdcIiBbc3R5bGUuaGVpZ2h0XT1cImNvbmZpZy5pbWFnZVByZXZpZXdIZWlnaHRcIj5cbiAgICAgICAgPGNyaXNwci1zZWxlY3RlZC1maWxlXG4gICAgICAgICAgKm5nSWY9XCIocHJvZ3Jlc3MgPCAxMDApICYmIGlucHV0SW1hZ2VGaWxlJCB8IGFzeW5jIGFzIGZpbGU7IGVsc2UgZHJvcHpvbmVPclByZXZpZXdcIlxuICAgICAgICAgIFtjb2xvcl09XCJjb25maWcuY29sb3IgPT09ICdwcmltYXJ5JyA/ICdhY2NlbnQnIDogJ3ByaW1hcnknXCJcbiAgICAgICAgICBbZmlsZU5hbWVdPVwiJ0NvbXByZXNzaW5nOiAnICsgZmlsZS5uYW1lXCJcbiAgICAgICAgICBbc2hvd1Byb2dyZXNzXT1cInRydWVcIlxuICAgICAgICAgIFtwcm9ncmVzc109XCJwcm9ncmVzc1wiPlxuICAgICAgICA8L2NyaXNwci1zZWxlY3RlZC1maWxlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZHJvcHpvbmVPclByZXZpZXc+XG4gICAgICAgICAgPCEtLSA8aW1nICpuZ0lmPVwiKGluaXRpYWxVcmxTdHJpbmckIHwgYXN5bmMpIGFzIGluaXRpYWxVcmxTdHJpbmc7XCIgW3NyY109XCJpbml0aWFsVXJsU3RyaW5nXCIgYWx0PVwiXCI+IC0tPlxuICAgICAgICAgIDxpbWcgKm5nSWY9XCJpbWFnZVNyY1VybCQgfCBhc3luYyBhcyBzcmNVcmw7IGVsc2Ugbm9JbWFnZVwiIFtzcmNdPVwic3JjVXJsXCIgYWx0PVwiXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub0ltYWdlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgW2NyaXNwckZpbGVEcm9wem9uZV09XCIhKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIChmaWxlRHJvcCk9XCJmaWxlc0NoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcm9wLWljb25cIiBpbmxpbmU9XCJ0cnVlXCI+Y2xvdWRfdXBsb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LWgyXCI+e3tjb25maWcuZHJvcFpvbmVUZXh0fX08L2gyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG5cblxuXG4gICAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cInRydWVcIj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbGVJbnB1dCgpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiKGRpc2FibGVkJCB8IGFzeW5jKVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBTZWxlY3RlZCBGaWxlKHMpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAge3tjb25maWcuY2xlYXJGaWxlc0J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJ2YWx1ZVwiXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJyZXNldFRvSW5pdGlhbFZhbHVlKHZhbHVlKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIihkaXNhYmxlZCQgfCBhc3luYylcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgU2VsZWN0ZWQgRmlsZShzKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5yZXBsYXk8L21hdC1pY29uPlxuICAgICAgICAgIHt7Y29uZmlnLnJlc2V0RmlsZXNCdXR0b25UZXh0fX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIoZGlzYWJsZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uZmlnLmNvbnRyb2xOYW1lXCI+XG4gICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgY2FtZXJhXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG48L2NyaXNwci1maWVsZC1jb250YWluZXI+XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQtZmllbGQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jcmlzcHItZm9ybXMvc3JjL2xpYi9tb2RlbHMvZmlsZS11cGxvYWQtZmllbGQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVVcGxvYWRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL21hdGVyaWFsL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IEltYWdlVXBsb2FkRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9tYXRlcmlhbC9pbWFnZS11cGxvYWQtZmllbGQnO1xuaW1wb3J0IHsgQ3Jpc3ByQ29udHJvbENvbmZpZywgQ29udHJvbFR5cGUsIEJ1dHRvblR5cGUsIE1hdEZpZWxkUHJvcGVydGllcyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCB0eXBlIEZpbGVVcGxvYWRGaWVsZENvbmZpZyA9IENyaXNwckNvbnRyb2xDb25maWcgJiBNYXRGaWVsZFByb3BlcnRpZXMgJiB7XG4gIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5GSUxFX1VQTE9BRDtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGZpbGVzQ2hhbmdlZD86IChwYXJlbnRHcm91cDogRm9ybUdyb3VwLCBmaWxlczogRmlsZUxpc3QpID0+IHZvaWQ7XG4gIGFsbG93TXVsdGlwbGVGaWxlcz86IGJvb2xlYW47XG4gIHNob3dDbGVhckZpbGVzQnV0dG9uPzogYm9vbGVhbjtcbiAgYWNjZXB0ZWRUeXBlcz86IHN0cmluZztcbiAgc2VsZWN0RmlsZXNCdXR0b25UeXBlPzogQnV0dG9uVHlwZTtcbiAgc2VsZWN0QnV0dG9uVGV4dD86IHN0cmluZztcbiAgY2xlYXJGaWxlc0J1dHRvblRleHQ/OiBzdHJpbmc7XG4gIGRyb3Bab25lVGV4dD86IHN0cmluZztcbiAgLy8gaXNvbGF0ZSBwb3NzaWJsZSBjb25maWd1cmF0aW9ucyByZWdhcmRpbmcgdXBsb2FkIHRvIGZvciB1c2VyIHRvIHByb3Blcmx5IHR5cGUgY29uZmlndXJhdGlvblxufSAmIChFbmFibGVkVXBsb2FkQnV0dG9uQ29uZmlnIHwgRGlzYWJsZWRVcGxvYWRCdXR0b25Db25maWcpO1xuXG4vLyBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIHVwbG9hZEZpbGVzIGNhbGxiYWNrXG5leHBvcnQgaW50ZXJmYWNlIEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcge1xuICB1cGxvYWRGaWxlczogKHBhcmVudEdyb3VwOiBGb3JtR3JvdXAsIGZpbGVzOkZpbGVMaXN0LCB1cGxvYWRDb21wb25lbnQ6IEZpbGVVcGxvYWRGaWVsZENvbXBvbmVudCB8IEltYWdlVXBsb2FkRmllbGRDb21wb25lbnQgKSA9PiBQcm9taXNlPHVua25vd24+IHwgdW5rbm93bjtcbiAgc2hvd1VwbG9hZFByb2dyZXNzPzogYm9vbGVhbjtcbiAgZGlzYWJsZU9uVXBsb2FkPzogYm9vbGVhbjtcbiAgdXBsb2FkQnV0dG9uVHlwZT86IEJ1dHRvblR5cGU7XG4gIHVwbG9hZEJ1dHRvblRleHQ/OiBzdHJpbmc7XG59XG5cbnR5cGUgRGlzYWJsZWRVcGxvYWRCdXR0b25Db25maWcgPSBOZXZlclByb3BzPEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWc+O1xuXG50eXBlIE5ldmVyUHJvcHM8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogbmV2ZXI7IH07XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQtZmllbGQuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jcmlzcHItZm9ybXMvc3JjL2xpYi9tb2RlbHMvZmlsZS11cGxvYWQtZmllbGQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVVcGxvYWRGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL21hdGVyaWFsL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IEltYWdlVXBsb2FkRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9tYXRlcmlhbC9pbWFnZS11cGxvYWQtZmllbGQnO1xuaW1wb3J0IHsgQ3Jpc3ByQ29udHJvbENvbmZpZywgQ29udHJvbFR5cGUsIEJ1dHRvblR5cGUsIE1hdEZpZWxkUHJvcGVydGllcyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCB0eXBlIEZpbGVVcGxvYWRGaWVsZENvbmZpZyA9IENyaXNwckNvbnRyb2xDb25maWcgJiBNYXRGaWVsZFByb3BlcnRpZXMgJiB7XG4gIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5GSUxFX1VQTE9BRDtcbiAgbGFiZWw6IHN0cmluZztcbiAgZmlsZXNDaGFuZ2VkPzogKHBhcmVudEdyb3VwOiBGb3JtR3JvdXAsIGZpbGVzOiBGaWxlTGlzdCkgPT4gdm9pZDtcbiAgYWxsb3dNdWx0aXBsZUZpbGVzPzogYm9vbGVhbjtcbiAgc2hvd0NsZWFyRmlsZXNCdXR0b24/OiBib29sZWFuO1xuICBhY2NlcHRlZFR5cGVzPzogc3RyaW5nO1xuICBzZWxlY3RGaWxlc0J1dHRvblR5cGU/OiBCdXR0b25UeXBlO1xuICBzZWxlY3RCdXR0b25UZXh0Pzogc3RyaW5nO1xuICBjbGVhckZpbGVzQnV0dG9uVGV4dD86IHN0cmluZztcbiAgZHJvcFpvbmVUZXh0Pzogc3RyaW5nO1xuICAvLyBpc29sYXRlIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zIHJlZ2FyZGluZyB1cGxvYWQgdG8gZm9yIHVzZXIgdG8gcHJvcGVybHkgdHlwZSBjb25maWd1cmF0aW9uXG59ICYgKEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcgfCBEaXNhYmxlZFVwbG9hZEJ1dHRvbkNvbmZpZyk7XG5cbi8vIFRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHdlIGFyZSB1c2luZyB0aGUgdXBsb2FkRmlsZXMgY2FsbGJhY2tcbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlZFVwbG9hZEJ1dHRvbkNvbmZpZyB7XG4gIHVwbG9hZEZpbGVzOiAocGFyZW50R3JvdXA6IEZvcm1Hcm91cCwgZmlsZXM6RmlsZUxpc3QsIHVwbG9hZENvbXBvbmVudDogRmlsZVVwbG9hZEZpZWxkQ29tcG9uZW50IHwgSW1hZ2VVcGxvYWRGaWVsZENvbXBvbmVudCApID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuICBzaG93VXBsb2FkUHJvZ3Jlc3M/OiBib29sZWFuO1xuICBkaXNhYmxlT25VcGxvYWQ/OiBib29sZWFuO1xuICB1cGxvYWRCdXR0b25UeXBlPzogQnV0dG9uVHlwZTtcbiAgdXBsb2FkQnV0dG9uVGV4dD86IHN0cmluZztcbn1cblxudHlwZSBEaXNhYmxlZFVwbG9hZEJ1dHRvbkNvbmZpZyA9IE5ldmVyUHJvcHM8RW5hYmxlZFVwbG9hZEJ1dHRvbkNvbmZpZz47XG5cbnR5cGUgTmV2ZXJQcm9wczxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBuZXZlcjsgfTtcbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENyaXNwckNvbnRyb2xDb25maWcsIENvbnRyb2xUeXBlLCBCdXR0b25UeXBlLCBNYXRGaWVsZFByb3BlcnRpZXMsIEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnID0gQ3Jpc3ByQ29udHJvbENvbmZpZyAmIE1hdEZpZWxkUHJvcGVydGllcyAmIHtcbiAgY29udHJvbFR5cGU6IENvbnRyb2xUeXBlLklNQUdFX1VQTE9BRDtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGZpbGVzQ2hhbmdlZD86IChwYXJlbnRHcm91cDogRm9ybUdyb3VwLCBmaWxlOiBGaWxlKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGZpbGUgdHlwZXMgdG8gYWNjZXB0LiBUaGUgb251cyBpcyBvbiB0aGUgY29uc3VtaW5nIGRldmVsb3BlciB0byBsaW1pdCB0aGVzZSB0byBmaWxlIHR5cGVzIGNvbXBhdGlibGUgd2l0aCB1c2FnZS5cbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvQXR0cmlidXRlcy9hY2NlcHRcbiAgICovXG4gIGFjY2VwdGVkVHlwZXM6IHN0cmluZztcbiAgZmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgc2hvd0NsZWFyRmlsZXNCdXR0b24/OiBib29sZWFuO1xuICBzZWxlY3RGaWxlc0J1dHRvblR5cGU/OiBCdXR0b25UeXBlO1xuICBzZWxlY3RCdXR0b25UZXh0Pzogc3RyaW5nO1xuICBjbGVhckZpbGVzQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVzZXRGaWxlc0J1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgZHJvcFpvbmVUZXh0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU2hvdWxkIHRoZSBmaWVsZCBjb21wcmVzcyB0aGUgaW1hZ2UgYWZ0ZXIgbG9hZGluZyBpdFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY29tcHJlc3NJbWFnZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHNpemUgb2YgdGhlIGNvbXByZXNzZWQgaW1hZ2VcbiAgICovXG4gIHRhcmdldENvbXByZXNzZWRJbWFnZUZpbGVTaXplTWI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBmaWxlIHNpemUgaW4gTUIgcmVxdWlyZWQgdG8gdHJpZ2dlciBjb21wcmVzc2lvbi4gVXNlZnVsIGZvciBwcmV2ZW50aW5nIGNvbXByZXNzaW9uIG9uIGZpbGVzIG5lYXIgdGhlIHRhcmdldCBjb21wcmVzc2lvbiBzaXplLlxuICAgKiBAZGVmYXVsdCAuN1xuICAgKi9cbiAgbWluQ29tcHJlc3Npb25UaHJlc2hvbGRNYj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGhlaWdodCBvciB3aWR0aCBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIG1heFdpZHRoT3JIZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgcnVucyBjb21wcmVzc2lvbiB1c2luZyBhIHdlYiB3b3JrZXIsIG90aGVyd2lzZSBjb21wcmVzc2lvbiBoYXBwZW5zIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgdXNlV2ViV29ya2VyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgcHJldmlldyBjb250YWluZXJcbiAgICovXG4gICBpbWFnZVByZXZpZXdIZWlnaHQ/OiBzdHJpbmc7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLWZpZWxkLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3Jpc3ByLWZvcm1zL3NyYy9saWIvbW9kZWxzL2ltYWdlLXVwbG9hZC1maWVsZC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENyaXNwckNvbnRyb2xDb25maWcsIENvbnRyb2xUeXBlLCBCdXR0b25UeXBlLCBNYXRGaWVsZFByb3BlcnRpZXMsIEVuYWJsZWRVcGxvYWRCdXR0b25Db25maWcgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBJbWFnZVVwbG9hZEZpZWxkQ29uZmlnID0gQ3Jpc3ByQ29udHJvbENvbmZpZyAmIE1hdEZpZWxkUHJvcGVydGllcyAmIHtcbiAgY29udHJvbFR5cGU6IENvbnRyb2xUeXBlLklNQUdFX1VQTE9BRDtcbiAgbGFiZWw6IHN0cmluZztcbiAgZmlsZXNDaGFuZ2VkPzogKHBhcmVudEdyb3VwOiBGb3JtR3JvdXAsIGZpbGU6IEZpbGUpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0eXBlcyB0byBhY2NlcHQuIFRoZSBvbnVzIGlzIG9uIHRoZSBjb25zdW1pbmcgZGV2ZWxvcGVyIHRvIGxpbWl0IHRoZXNlIHRvIGZpbGUgdHlwZXMgY29tcGF0aWJsZSB3aXRoIHVzYWdlLlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2FjY2VwdFxuICAgKi9cbiAgYWNjZXB0ZWRUeXBlczogc3RyaW5nO1xuICBmaWxlTmFtZT86IHN0cmluZztcblxuICBzaG93Q2xlYXJGaWxlc0J1dHRvbj86IGJvb2xlYW47XG4gIHNlbGVjdEZpbGVzQnV0dG9uVHlwZT86IEJ1dHRvblR5cGU7XG4gIHNlbGVjdEJ1dHRvblRleHQ/OiBzdHJpbmc7XG4gIGNsZWFyRmlsZXNCdXR0b25UZXh0Pzogc3RyaW5nO1xuICByZXNldEZpbGVzQnV0dG9uVGV4dD86IHN0cmluZztcblxuICBkcm9wWm9uZVRleHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGZpZWxkIGNvbXByZXNzIHRoZSBpbWFnZSBhZnRlciBsb2FkaW5nIGl0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzc0ltYWdlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBpbWFnZVxuICAgKi9cbiAgdGFyZ2V0Q29tcHJlc3NlZEltYWdlRmlsZVNpemVNYj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIGZpbGUgc2l6ZSBpbiBNQiByZXF1aXJlZCB0byB0cmlnZ2VyIGNvbXByZXNzaW9uLiBVc2VmdWwgZm9yIHByZXZlbnRpbmcgY29tcHJlc3Npb24gb24gZmlsZXMgbmVhciB0aGUgdGFyZ2V0IGNvbXByZXNzaW9uIHNpemUuXG4gICAqIEBkZWZhdWx0IC43XG4gICAqL1xuICBtaW5Db21wcmVzc2lvblRocmVzaG9sZE1iPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gaGVpZ2h0IG9yIHdpZHRoIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSBydW5zIGNvbXByZXNzaW9uIHVzaW5nIGEgd2ViIHdvcmtlciwgb3RoZXJ3aXNlIGNvbXByZXNzaW9uIGhhcHBlbnMgb24gdGhlIG1haW4gdGhyZWFkLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICB1c2VXZWJXb3JrZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBwcmV2aWV3IGNvbnRhaW5lclxuICAgKi9cbiAgIGltYWdlUHJldmlld0hlaWdodD86IHN0cmluZztcbn1cbiJdfQ==
@@ -1173,12 +1173,19 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
1173
1173
  this.progress = p;
1174
1174
  this.cdr.detectChanges();
1175
1175
  } });
1176
- const compressedFile = yield imageCompression(file, options);
1177
- return compressedFile;
1176
+ return yield imageCompression(file, options);
1178
1177
  }
1179
1178
  else
1180
1179
  return file;
1181
- })), tap(file => {
1180
+ })), map((compressedFileOrString) => {
1181
+ if (!compressedFileOrString || typeof compressedFileOrString === 'string')
1182
+ return compressedFileOrString;
1183
+ const { type, name, lastModified } = compressedFileOrString;
1184
+ return new File([compressedFileOrString], this.config.fileName || name, {
1185
+ type,
1186
+ lastModified
1187
+ });
1188
+ }), tap(file => {
1182
1189
  this.control.setValue(file);
1183
1190
  if (file || this.value) {
1184
1191
  this.control.markAsTouched();
@@ -1191,9 +1198,7 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
1191
1198
  if (!file)
1192
1199
  return null;
1193
1200
  const compressedStringImage = yield imageCompression.getDataUrlFromFile(file);
1194
- return file.type.includes('svg')
1195
- ? this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage)
1196
- : compressedStringImage;
1201
+ return this.domSanitizer.bypassSecurityTrustResourceUrl(compressedStringImage);
1197
1202
  })), shareReplay(1));
1198
1203
  this.isUploaded = false;
1199
1204
  if (this.ngControl != null) {
@@ -1240,10 +1245,10 @@ class ImageUploadFieldComponent extends ImageUploadFieldMixin {
1240
1245
  registerOnTouched(fn) { }
1241
1246
  }
1242
1247
  ImageUploadFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: ImageUploadFieldComponent, deps: [{ token: i4$1.NgControl, optional: true, self: true }, { token: i2$3.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1243
- ImageUploadFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: ImageUploadFieldComponent, selector: "crispr-image-upload-field", viewQueries: [{ propertyName: "fileInputRef", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"], components: [{ type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: SelectedFileComponent, selector: "crispr-selected-file", inputs: ["fileName", "progress", "showProgress", "color"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { type: i2$1.MatLabel, selector: "mat-label" }, { type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FileDropzoneDirective, selector: "[crisprFileDropzone]", inputs: ["crisprFileDropzone"], outputs: ["fileDrop"] }], pipes: { "async": i2.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
1248
+ ImageUploadFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: ImageUploadFieldComponent, selector: "crispr-image-upload-field", viewQueries: [{ propertyName: "fileInputRef", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"], components: [{ type: FieldContainerComponent, selector: "crispr-field-container", inputs: ["config", "group", "inlineField"] }, { type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: SelectedFileComponent, selector: "crispr-selected-file", inputs: ["fileName", "progress", "showProgress", "color"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.ControlErrorContainerDirective, selector: "[controlErrorContainer], [formGroup]" }, { type: i2$1.MatLabel, selector: "mat-label" }, { type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.ControlErrorsDirective, selector: "[formControl], [formControlName]" }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FileDropzoneDirective, selector: "[crisprFileDropzone]", inputs: ["crisprFileDropzone"], outputs: ["fileDrop"] }], pipes: { "async": i2.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, preserveWhitespaces: true });
1244
1249
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: ImageUploadFieldComponent, decorators: [{
1245
1250
  type: Component,
1246
- args: [{ selector: 'crispr-image-upload-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"] }]
1251
+ args: [{ selector: 'crispr-image-upload-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<crispr-field-container\n [config]=\"config\"\n [group]=\"group\">\n\n <mat-form-field floatLabel=\"always\"\n [color]=\"config.color\"\n [appearance]=\"config.appearance\"\n [formGroup]=\"group\">\n <mat-label>{{config.label}}</mat-label>\n <input [formControlName]=\"config.controlName\" matInput type=\"text\"/>\n <input\n #fileInput\n type=\"file\"\n [accept]=\"config.acceptedTypes\"\n (change)=\"filesChanged($event.target.files)\"/>\n <div class=\"ui-container\">\n\n <div class=\"image-preview\" [style.height]=\"config.imagePreviewHeight\">\n <crispr-selected-file\n *ngIf=\"(progress < 100) && inputImageFile$ | async as file; else dropzoneOrPreview\"\n [color]=\"config.color === 'primary' ? 'accent' : 'primary'\"\n [fileName]=\"'Compressing: ' + file.name\"\n [showProgress]=\"true\"\n [progress]=\"progress\">\n </crispr-selected-file>\n\n <ng-template #dropzoneOrPreview>\n <!-- <img *ngIf=\"(initialUrlString$ | async) as initialUrlString;\" [src]=\"initialUrlString\" alt=\"\"> -->\n <img *ngIf=\"imageSrcUrl$ | async as srcUrl; else noImage\" [src]=\"srcUrl\" alt=\"\">\n <ng-template #noImage>\n <div class=\"drop-container\"\n [crisprFileDropzone]=\"!(disabled$ | async)\"\n (fileDrop)=\"filesChanged($event)\">\n <mat-icon class=\"drop-icon\" inline=\"true\">cloud_upload</mat-icon>\n <h2 class=\"mat-h2\">{{config.dropZoneText}}</h2>\n </div>\n </ng-template>\n\n </ng-template>\n </div>\n\n\n\n <!-- </ng-template> -->\n <div class=\"button-container\" *ngIf=\"true\">\n\n <button\n mat-button\n (click)=\"clearFileInput()\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>delete</mat-icon>\n {{config.clearFilesButtonText}}\n </button>\n\n <button\n *ngIf=\"value\"\n mat-button\n (click)=\"resetToInitialValue(value)\"\n type=\"button\"\n [disabled]=\"(disabled$ | async)\"\n aria-label=\"Remove Selected File(s)\">\n <mat-icon>replay</mat-icon>\n {{config.resetFilesButtonText}}\n </button>\n\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [disabled]=\"(disabled$ | async)\"\n (click)=\"fileInput.click()\"\n [attr.aria-label]=\"config.controlName\">\n <mat-icon>\n camera\n </mat-icon>\n SELECT\n </button>\n </div>\n </div>\n\n </mat-form-field>\n\n</crispr-field-container>\n", styles: [":host ::ng-deep .mat-form-field .mat-form-field-infix{padding-top:0}:host ::ng-deep .mat-form-field .mat-button-wrapper{display:flex;flex-direction:column;align-items:center;padding-top:8px}:host .ui-container{display:flex;flex-direction:column}:host .ui-container .image-preview{display:flex;flex-direction:column;align-content:space-between;justify-content:center;align-items:center;margin:8px 0;flex-grow:1}:host .ui-container .image-preview crispr-selected-file{width:100%}:host .ui-container .image-preview .drop-container{display:flex;box-sizing:border-box;flex-direction:column;align-items:center;border:3px dashed gray;height:100%;width:100%;align-content:center;justify-content:center;border-radius:8px}:host .ui-container .image-preview .drop-container .drop-icon{height:32px;width:32px;font-size:36px}:host .ui-container .image-preview .drop-container .mat-h2{margin:0}:host .ui-container .image-preview img{height:inherit;max-width:100%}:host .ui-container .button-container{display:flex;flex-direction:var(--image-upload-button-container-direction);justify-content:flex-end}:host .ui-container .button-container button{margin-left:8px}:host input{position:absolute;max-height:0;visibility:hidden}\n"] }]
1247
1252
  }], ctorParameters: function () {
1248
1253
  return [{ type: i4$1.NgControl, decorators: [{
1249
1254
  type: Optional
@@ -1305,14 +1310,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
1305
1310
  function maxFileSizeValidator(maxFileSize) {
1306
1311
  return (control) => {
1307
1312
  const controlValue = control.value;
1308
- if (!(controlValue instanceof Blob))
1313
+ if (!(controlValue instanceof File)) {
1309
1314
  return null;
1315
+ }
1310
1316
  const actualFileSize = +convertBytesToMb(controlValue.size).toPrecision(3);
1311
1317
  if (maxFileSize > actualFileSize)
1312
1318
  return null;
1313
- control.setErrors({ maxFileSize: { maxFileSize, actualFileSize } });
1319
+ // control.setErrors({maxFileSize: { maxFileSize, actualFileSize }} )
1314
1320
  return { maxFileSize: { maxFileSize, actualFileSize } };
1315
1321
  };
1322
+ }
1323
+ function allowedFileExtValidator(allowedFileExtensions, onlyAllowFiles = true) {
1324
+ return (control) => {
1325
+ const controlValue = control.value;
1326
+ const isFile = controlValue instanceof File;
1327
+ if (!onlyAllowFiles && !isFile)
1328
+ return null;
1329
+ const actualExtension = isFile ? controlValue.name.split('.').pop() : 'Not a file';
1330
+ const isAllowedExtension = allowedFileExtensions.includes(actualExtension);
1331
+ if (isAllowedExtension) {
1332
+ return null;
1333
+ }
1334
+ return { allowedExtension: { allowedFileExtensions, actualExtension } };
1335
+ };
1316
1336
  }
1317
1337
 
1318
1338
  // TODO: Should we import UI library?
@@ -1493,6 +1513,7 @@ var index$2 = /*#__PURE__*/Object.freeze({
1493
1513
  ImageUploadFieldComponent: ImageUploadFieldComponent,
1494
1514
  ImageUploadFieldModule: ImageUploadFieldModule,
1495
1515
  maxFileSizeValidator: maxFileSizeValidator,
1516
+ allowedFileExtValidator: allowedFileExtValidator,
1496
1517
  FileDropzoneDirective: FileDropzoneDirective,
1497
1518
  FileUploadFieldComponent: FileUploadFieldComponent,
1498
1519
  FileUploadFieldModule: FileUploadFieldModule,
@@ -1879,5 +1900,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
1879
1900
  * Generated bundle index. Do not edit.
1880
1901
  */
1881
1902
 
1882
- export { AbstractAutocompleteComponent, AutocompleteChiplistFieldComponent, AutocompleteFieldComponent, ButtonComponent, CheckboxFieldComponent, ControlType, CrisprFieldComponent, CrisprFormComponent, CrisprFormsModule, DEFAULT_EMPTY_OPTIONS_MESSAGE, DatepickerFieldComponent, DividerComponent, FieldContainerComponent, FieldContainerModule, FileDropzoneDirective, FileUploadFieldComponent, FileUploadFieldModule, HeadingComponent, HeadingModule, ImageUploadFieldComponent, ImageUploadFieldModule, InputFieldComponent, MaterialModule, OptionComponent, RadioFieldComponent, SelectFieldComponent, SliderFieldComponent, TextareaFieldComponent, UnitConversionFieldComponent, buildFormGroupFromConfig, callOptionsIfFunction, checkControlForValues, checkControlsForValues, computeValueFromFields, createControlForType, crisprControlMixin, filterOptionsByLabel, isControlConfig, maxFileSizeValidator, observablifyOptions };
1903
+ export { AbstractAutocompleteComponent, AutocompleteChiplistFieldComponent, AutocompleteFieldComponent, ButtonComponent, CheckboxFieldComponent, ControlType, CrisprFieldComponent, CrisprFormComponent, CrisprFormsModule, DEFAULT_EMPTY_OPTIONS_MESSAGE, DatepickerFieldComponent, DividerComponent, FieldContainerComponent, FieldContainerModule, FileDropzoneDirective, FileUploadFieldComponent, FileUploadFieldModule, HeadingComponent, HeadingModule, ImageUploadFieldComponent, ImageUploadFieldModule, InputFieldComponent, MaterialModule, OptionComponent, RadioFieldComponent, SelectFieldComponent, SliderFieldComponent, TextareaFieldComponent, UnitConversionFieldComponent, allowedFileExtValidator, buildFormGroupFromConfig, callOptionsIfFunction, checkControlForValues, checkControlsForValues, computeValueFromFields, createControlForType, crisprControlMixin, filterOptionsByLabel, isControlConfig, maxFileSizeValidator, observablifyOptions };
1883
1904
  //# sourceMappingURL=tft-crispr-forms.mjs.map