ets-fe-ng-sdk 17.0.310 → 17.0.312

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.
@@ -72,11 +72,11 @@ export class FileUploadComponent {
72
72
  inp.click();
73
73
  }
74
74
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: FileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: FileUploadComponent, isStandalone: true, selector: "app-file-upload", inputs: { help: { classPropertyName: "help", publicName: "help", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, mediaWidth: { classPropertyName: "mediaWidth", publicName: "mediaWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, useWebcam: { classPropertyName: "useWebcam", publicName: "useWebcam", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, useDocumentModal: { classPropertyName: "useDocumentModal", publicName: "useDocumentModal", isSignal: false, isRequired: false, transformFunction: null }, listFiles: { classPropertyName: "listFiles", publicName: "listFiles", isSignal: true, isRequired: false, transformFunction: null }, _accept: { classPropertyName: "_accept", publicName: "accept", isSignal: false, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: false, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { mediaWidth: "mediaWidthChange", fileChange: "fileChange", filesChange: "filesChange" }, ngImport: i0, template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); acceptFiles($event)\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: i1.ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop"], outputs: ["modalOpen", "modalClose"] }, { kind: "directive", type: i2.ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: WebcamMediaComponent, selector: "lib-webcam-media", inputs: ["isVideo", "useAudio", "fileName", "fileNameFactory", "fileType", "extraClass", "recordingNotificationInterval", "isBackground", "width"], outputs: ["closed", "recorderStopped", "recorderErrored", "recorderStarted", "recordingState", "recordingChanged", "widthChange"] }] }); }
75
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: FileUploadComponent, isStandalone: true, selector: "app-file-upload", inputs: { help: { classPropertyName: "help", publicName: "help", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, mediaWidth: { classPropertyName: "mediaWidth", publicName: "mediaWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, useWebcam: { classPropertyName: "useWebcam", publicName: "useWebcam", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, useDocumentModal: { classPropertyName: "useDocumentModal", publicName: "useDocumentModal", isSignal: false, isRequired: false, transformFunction: null }, listFiles: { classPropertyName: "listFiles", publicName: "listFiles", isSignal: true, isRequired: false, transformFunction: null }, _accept: { classPropertyName: "_accept", publicName: "accept", isSignal: false, isRequired: false, transformFunction: null }, file: { classPropertyName: "file", publicName: "file", isSignal: false, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { mediaWidth: "mediaWidthChange", fileChange: "fileChange", filesChange: "filesChange" }, ngImport: i0, template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" [showFooter]=\"false\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); $event ? acceptFiles($event) : null\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: i1.ModalComponent, selector: "modal-comp", inputs: ["header", "bodyTemplateRef", "footerTemplateRef", "showHeader", "loading", "isFullscreen", "showFooter", "width", "minWidth", "height", "maxHeight", "icon", "data", "disableClose", "hasBackdrop"], outputs: ["modalOpen", "modalClose"] }, { kind: "directive", type: i2.ModalBodyDirective, selector: "[modalBody]" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: WebcamMediaComponent, selector: "lib-webcam-media", inputs: ["isVideo", "useAudio", "fileName", "fileNameFactory", "fileType", "extraClass", "recordingNotificationInterval", "isBackground", "width"], outputs: ["closed", "recorderStopped", "recorderErrored", "recorderStarted", "recordingState", "recordingChanged", "widthChange"] }] }); }
76
76
  }
77
77
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: FileUploadComponent, decorators: [{
78
78
  type: Component,
79
- args: [{ selector: 'app-file-upload', standalone: true, imports: [NgIf, NgClass, NgFor, BtnComponent, ModalComponents, MatMenuModule, WebcamMediaComponent], template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); acceptFiles($event)\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"] }]
79
+ args: [{ selector: 'app-file-upload', standalone: true, imports: [NgIf, NgClass, NgFor, BtnComponent, ModalComponents, MatMenuModule, WebcamMediaComponent], template: "@if (listFiles()) {\n <div [ngClass]=\"{ meta: mini() }\" class=\"{{ class() }} form-label mb-2 hide-scroll\">\n @for (item of files; track item) {\n <div class=\"row align-items-start mb-1\">\n <div class=\"col\">\n <div class=\"hide-scroll file-name\">\n {{ item?.name }}\n </div>\n </div>\n <div class=\"col-auto text-end\">\n <span class=\"text-danger pointer p-1 fa fa-close\" (click)=\"removeFile($index)\"></span>\n </div>\n </div>\n }\n </div>\n}\n<!-- <input type=\"file\" style=\"display: none;\" accept=\"{{accept}}\" (change)=\"onUpload($event)\" #uploadInput [multiple]=\"multiple\"> -->\n<app-btn\n icon=\"upload\"\n (mclick)=\"useWebcam() ? null : openDialog()\"\n [type]=\"file ? 'primary' : 'secondary'\"\n [disabled]=\"disabled\"\n [help]=\"help\"\n [text]=\"label\"\n [matMenuTriggerFor]=\"useWebcam() ? menu : null\" />\n\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"openDialog()\">Upload</button>\n <button mat-menu-item (click)=\"webcamModal.open()\">Use Camera</button>\n</mat-menu>\n\n<modal-comp #webcamModal width=\"1080px\" [showFooter]=\"false\" header=\"Webcam\">\n <ng-template modalBody>\n <lib-webcam-media [fileName]=\"fileName()\" [width]=\"mediaWidth()\" (closed)=\"webcamModal.close(); $event ? acceptFiles($event) : null\" />\n </ng-template>\n</modal-comp>\n", styles: [".meta,.file-name{height:23px}.meta{overflow-y:auto}.file-name{overflow:auto}\n"] }]
80
80
  }], ctorParameters: () => [], propDecorators: { help: [{
81
81
  type: Input
82
82
  }], label: [{
@@ -99,4 +99,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
99
99
  }], filesChange: [{
100
100
  type: Output
101
101
  }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXRzLWZlLW5nLXNkay9zcmMvbGliL1NoYXJlZC9jb21wb25lbnRzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxlQUFlLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7OztBQVM5RSxNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixJQUFxQixPQUFPLENBQUMsQ0FBUztRQUNwQyxRQUFRLENBQUMsRUFBRTtZQUNULEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDO2dCQUNyQyxNQUFNO1lBRVI7Z0JBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU07U0FDVDtJQUNILENBQUM7SUFT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LGNBR2YsSUFBSSxXQUNQLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDLGVBQWUsRUFBQyxhQUFhLEVBQUMsb0JBQW9CLENBQUM7d0RBR3ZGLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBUUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHZSxPQUFPO3NCQUEzQixLQUFLO3VCQUFDLFFBQVE7Z0JBWU4sSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0UsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIGlucHV0LCBtb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJZiwgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9TZXJ2aWNlcy91dGlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IE1vZGFsQ29tcG9uZW50cyBmcm9tICcuLi9tb2RhbC1jb21wb25lbnRzL21vZGFsLmNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgV2ViY2FtTWVkaWFDb21wb25lbnQgfSBmcm9tICcuLi93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgQnRuQ29tcG9uZW50LE1vZGFsQ29tcG9uZW50cyxNYXRNZW51TW9kdWxlLFdlYmNhbU1lZGlhQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGhlbHA6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgbWVkaWFXaWR0aCA9IG1vZGVsPG51bWJlcj4oMTA4MCk7IFxuICBjbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgdXNlV2ViY2FtID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKipcbiAgICogT25seSB1c2VmdWwgaWYgdXNpbmcgdGhlIHdlYmNhbSBvcHRpb25cbiAgICovXG4gIGZpbGVOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIG1pbmkgPSBpbnB1dCh0cnVlKTtcbiAgQElucHV0KCkgdXNlRG9jdW1lbnRNb2RhbDogYm9vbGVhbjtcbiAgbGlzdEZpbGVzID0gaW5wdXQodHJ1ZSk7XG4gIGFjY2VwdDogc3RyaW5nO1xuICBASW5wdXQoJ2FjY2VwdCcpIHNldCBfYWNjZXB0KHY6IHN0cmluZykge1xuICAgIHN3aXRjaCAodikge1xuICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICB0aGlzLmFjY2VwdCA9ICcucG5nLC5qcGcsLmRvY3gsLnBkZic7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmFjY2VwdCA9IHY7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvLyBAVmlld0NoaWxkKCd1cGxvYWRJbnB1dCcpIHVwbG9hZElucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBASW5wdXQoKSBmaWxlOiBGaWxlO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgQElucHV0KCkgZmlsZXM6IEZpbGVbXTtcbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgcHVibGljIHVTID0gaW5qZWN0KFV0aWxpdHlTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIGdldCBpc1NpbmdsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMubXVsdGlwbGU7XG4gIH1cbiAgcHJvdGVjdGVkIGFjY2VwdEZpbGVzKC4uLmZpbGVzOiBGaWxlW10pIHtcbiAgICB0aGlzLmZpbGVzID0gZmlsZXM7XG4gICAgdGhpcy5maWxlID0gZmlsZXMgPyBmaWxlc1swXSA6IG51bGw7XG4gICAgdGhpcy5lbWl0RmlsZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW1pdEZpbGVzKCkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gICAgZWxzZSB0aGlzLmZpbGVDaGFuZ2UuZW1pdCh0aGlzLmZpbGUpO1xuICB9XG5cbiAgb25VcGxvYWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbTxGaWxlPihldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMuYWNjZXB0RmlsZXMoLi4uZmlsZXMpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZmlsZSA9IHRoaXMuZmlsZXMgPyB0aGlzLmZpbGVzWzBdIDogbnVsbDtcblxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHRoaXMuZmlsZSk7XG4gICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICB9XG4gIG9wZW5EaWFsb2coKSB7XG4gICAgY29uc3QgaW5wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnAudHlwZSA9ICdmaWxlJztcbiAgICBpbnAuYWNjZXB0ID0gdGhpcy5hY2NlcHQ7XG4gICAgaW5wLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICBpbnAub25jaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5vblVwbG9hZChlKTtcbiAgICAgIGlucC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIC8vIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wKTtcbiAgICBpbnAuY2xpY2soKTtcbiAgfVxufVxuIiwiQGlmIChsaXN0RmlsZXMoKSkge1xuICA8ZGl2IFtuZ0NsYXNzXT1cInsgbWV0YTogbWluaSgpIH1cIiBjbGFzcz1cInt7IGNsYXNzKCkgfX0gZm9ybS1sYWJlbCBtYi0yIGhpZGUtc2Nyb2xsXCI+XG4gICAgQGZvciAoaXRlbSBvZiBmaWxlczsgdHJhY2sgaXRlbSkge1xuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydCBtYi0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZS1zY3JvbGwgZmlsZS1uYW1lXCI+XG4gICAgICAgICAgICB7eyBpdGVtPy5uYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gdGV4dC1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyIHBvaW50ZXIgcC0xIGZhIGZhLWNsb3NlXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoJGluZGV4KVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPCEtLSA8aW5wdXQgdHlwZT1cImZpbGVcIiAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGFjY2VwdD1cInt7YWNjZXB0fX1cIiAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIiAjdXBsb2FkSW5wdXQgW211bHRpcGxlXT1cIm11bHRpcGxlXCI+IC0tPlxuPGFwcC1idG5cbiAgaWNvbj1cInVwbG9hZFwiXG4gIChtY2xpY2spPVwidXNlV2ViY2FtKCkgPyBudWxsIDogb3BlbkRpYWxvZygpXCJcbiAgW3R5cGVdPVwiZmlsZSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2hlbHBdPVwiaGVscFwiXG4gIFt0ZXh0XT1cImxhYmVsXCJcbiAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInVzZVdlYmNhbSgpID8gbWVudSA6IG51bGxcIiAvPlxuXG48bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+VXBsb2FkPC9idXR0b24+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwid2ViY2FtTW9kYWwub3BlbigpXCI+VXNlIENhbWVyYTwvYnV0dG9uPlxuPC9tYXQtbWVudT5cblxuPG1vZGFsLWNvbXAgI3dlYmNhbU1vZGFsIHdpZHRoPVwiMTA4MHB4XCIgaGVhZGVyPVwiV2ViY2FtXCI+XG4gIDxuZy10ZW1wbGF0ZSBtb2RhbEJvZHk+XG4gICAgPGxpYi13ZWJjYW0tbWVkaWEgW2ZpbGVOYW1lXT1cImZpbGVOYW1lKClcIiBbd2lkdGhdPVwibWVkaWFXaWR0aCgpXCIgKGNsb3NlZCk9XCJ3ZWJjYW1Nb2RhbC5jbG9zZSgpOyBhY2NlcHRGaWxlcygkZXZlbnQpXCIgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbW9kYWwtY29tcD5cbiJdfQ==
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXRzLWZlLW5nLXNkay9zcmMvbGliL1NoYXJlZC9jb21wb25lbnRzL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxlQUFlLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7OztBQVM5RSxNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixJQUFxQixPQUFPLENBQUMsQ0FBUztRQUNwQyxRQUFRLENBQUMsRUFBRTtZQUNULEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDO2dCQUNyQyxNQUFNO1lBRVI7Z0JBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU07U0FDVDtJQUNILENBQUM7SUFT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LGNBR2YsSUFBSSxXQUNQLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDLGVBQWUsRUFBQyxhQUFhLEVBQUMsb0JBQW9CLENBQUM7d0RBR3ZGLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBUUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHZSxPQUFPO3NCQUEzQixLQUFLO3VCQUFDLFFBQVE7Z0JBWU4sSUFBSTtzQkFBWixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0UsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIGlucHV0LCBtb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJZiwgTmdDbGFzcywgTmdGb3IgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9TZXJ2aWNlcy91dGlsaXR5LnNlcnZpY2UnO1xuaW1wb3J0IE1vZGFsQ29tcG9uZW50cyBmcm9tICcuLi9tb2RhbC1jb21wb25lbnRzL21vZGFsLmNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgV2ViY2FtTWVkaWFDb21wb25lbnQgfSBmcm9tICcuLi93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmLCBOZ0NsYXNzLCBOZ0ZvciwgQnRuQ29tcG9uZW50LE1vZGFsQ29tcG9uZW50cyxNYXRNZW51TW9kdWxlLFdlYmNhbU1lZGlhQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGhlbHA6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgbWVkaWFXaWR0aCA9IG1vZGVsPG51bWJlcj4oMTA4MCk7IFxuICBjbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgdXNlV2ViY2FtID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKipcbiAgICogT25seSB1c2VmdWwgaWYgdXNpbmcgdGhlIHdlYmNhbSBvcHRpb25cbiAgICovXG4gIGZpbGVOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW47XG4gIG1pbmkgPSBpbnB1dCh0cnVlKTtcbiAgQElucHV0KCkgdXNlRG9jdW1lbnRNb2RhbDogYm9vbGVhbjtcbiAgbGlzdEZpbGVzID0gaW5wdXQodHJ1ZSk7XG4gIGFjY2VwdDogc3RyaW5nO1xuICBASW5wdXQoJ2FjY2VwdCcpIHNldCBfYWNjZXB0KHY6IHN0cmluZykge1xuICAgIHN3aXRjaCAodikge1xuICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICB0aGlzLmFjY2VwdCA9ICcucG5nLC5qcGcsLmRvY3gsLnBkZic7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmFjY2VwdCA9IHY7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvLyBAVmlld0NoaWxkKCd1cGxvYWRJbnB1dCcpIHVwbG9hZElucHV0UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBASW5wdXQoKSBmaWxlOiBGaWxlO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgQElucHV0KCkgZmlsZXM6IEZpbGVbXTtcbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgcHVibGljIHVTID0gaW5qZWN0KFV0aWxpdHlTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIGdldCBpc1NpbmdsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMubXVsdGlwbGU7XG4gIH1cbiAgcHJvdGVjdGVkIGFjY2VwdEZpbGVzKC4uLmZpbGVzOiBGaWxlW10pIHtcbiAgICB0aGlzLmZpbGVzID0gZmlsZXM7XG4gICAgdGhpcy5maWxlID0gZmlsZXMgPyBmaWxlc1swXSA6IG51bGw7XG4gICAgdGhpcy5lbWl0RmlsZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW1pdEZpbGVzKCkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gICAgZWxzZSB0aGlzLmZpbGVDaGFuZ2UuZW1pdCh0aGlzLmZpbGUpO1xuICB9XG5cbiAgb25VcGxvYWQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbTxGaWxlPihldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIHRoaXMuYWNjZXB0RmlsZXMoLi4uZmlsZXMpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZmlsZSA9IHRoaXMuZmlsZXMgPyB0aGlzLmZpbGVzWzBdIDogbnVsbDtcblxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHRoaXMuZmlsZSk7XG4gICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICB9XG4gIG9wZW5EaWFsb2coKSB7XG4gICAgY29uc3QgaW5wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnAudHlwZSA9ICdmaWxlJztcbiAgICBpbnAuYWNjZXB0ID0gdGhpcy5hY2NlcHQ7XG4gICAgaW5wLm11bHRpcGxlID0gdGhpcy5tdWx0aXBsZTtcbiAgICBpbnAub25jaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5vblVwbG9hZChlKTtcbiAgICAgIGlucC5yZW1vdmUoKTtcbiAgICB9O1xuICAgIC8vIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW5wKTtcbiAgICBpbnAuY2xpY2soKTtcbiAgfVxufVxuIiwiQGlmIChsaXN0RmlsZXMoKSkge1xuICA8ZGl2IFtuZ0NsYXNzXT1cInsgbWV0YTogbWluaSgpIH1cIiBjbGFzcz1cInt7IGNsYXNzKCkgfX0gZm9ybS1sYWJlbCBtYi0yIGhpZGUtc2Nyb2xsXCI+XG4gICAgQGZvciAoaXRlbSBvZiBmaWxlczsgdHJhY2sgaXRlbSkge1xuICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1zdGFydCBtYi0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZS1zY3JvbGwgZmlsZS1uYW1lXCI+XG4gICAgICAgICAgICB7eyBpdGVtPy5uYW1lIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gdGV4dC1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyIHBvaW50ZXIgcC0xIGZhIGZhLWNsb3NlXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoJGluZGV4KVwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPCEtLSA8aW5wdXQgdHlwZT1cImZpbGVcIiAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGFjY2VwdD1cInt7YWNjZXB0fX1cIiAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIiAjdXBsb2FkSW5wdXQgW211bHRpcGxlXT1cIm11bHRpcGxlXCI+IC0tPlxuPGFwcC1idG5cbiAgaWNvbj1cInVwbG9hZFwiXG4gIChtY2xpY2spPVwidXNlV2ViY2FtKCkgPyBudWxsIDogb3BlbkRpYWxvZygpXCJcbiAgW3R5cGVdPVwiZmlsZSA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2hlbHBdPVwiaGVscFwiXG4gIFt0ZXh0XT1cImxhYmVsXCJcbiAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInVzZVdlYmNhbSgpID8gbWVudSA6IG51bGxcIiAvPlxuXG48bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+VXBsb2FkPC9idXR0b24+XG4gIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwid2ViY2FtTW9kYWwub3BlbigpXCI+VXNlIENhbWVyYTwvYnV0dG9uPlxuPC9tYXQtbWVudT5cblxuPG1vZGFsLWNvbXAgI3dlYmNhbU1vZGFsIHdpZHRoPVwiMTA4MHB4XCIgW3Nob3dGb290ZXJdPVwiZmFsc2VcIiBoZWFkZXI9XCJXZWJjYW1cIj5cbiAgPG5nLXRlbXBsYXRlIG1vZGFsQm9keT5cbiAgICA8bGliLXdlYmNhbS1tZWRpYSBbZmlsZU5hbWVdPVwiZmlsZU5hbWUoKVwiIFt3aWR0aF09XCJtZWRpYVdpZHRoKClcIiAoY2xvc2VkKT1cIndlYmNhbU1vZGFsLmNsb3NlKCk7ICRldmVudCA/IGFjY2VwdEZpbGVzKCRldmVudCkgOiBudWxsXCIgLz5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbW9kYWwtY29tcD5cbiJdfQ==
@@ -1,8 +1,9 @@
1
1
  import { CommonModule } from '@angular/common';
2
2
  import { Component, EventEmitter, Output, computed, input, model, signal, viewChild, } from '@angular/core';
3
3
  import { BtnComponent } from '../btn/btn.component';
4
- import { filter, map, Observable, tap, timer } from 'rxjs';
4
+ import { map, Observable } from 'rxjs';
5
5
  import { toSignal } from '@angular/core/rxjs-interop';
6
+ import { LoaderComponent } from '../loader/loader.component';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@angular/common";
8
9
  export class WebcamMediaComponent {
@@ -55,81 +56,81 @@ export class WebcamMediaComponent {
55
56
  // will be set by the startup() function.
56
57
  this.canvas = signal(undefined);
57
58
  this.mediaFile = signal(undefined);
58
- this.photoSrc = signal(undefined);
59
- this.videoSrc = signal(undefined);
59
+ this.mediaFileLink = computed(() => (this.mediaFile() ? URL.createObjectURL(this.mediaFile()) : undefined));
60
60
  this.stream = signal(undefined);
61
61
  this.isRecording = toSignal(this.recordingState.pipe(map((r) => r == 'recording' || r == 'paused')));
62
62
  this.recordedBlobs = [];
63
- this.recordedTime = signal(0);
63
+ /**In Milliseconds */
64
+ this.recordedTimeMS = signal(0);
65
+ this.recordedTime = computed(() => Math.round(this.recordedTimeMS() / 1000));
66
+ this.loading = signal(false);
64
67
  this.startRecording = (stream = this.stream()) => {
65
68
  if (!this.isVideo())
66
69
  return;
67
70
  this.recorder = new MediaRecorder(stream);
68
71
  this.recordedBlobs = [];
69
- this.recordedTime.set(0);
70
- const lengths = [];
72
+ this.recordedTimeMS.set(0);
73
+ const startTime = Date.now();
71
74
  this.recorder.ondataavailable = (event) => {
72
75
  this.recordedBlobs.push(event.data);
76
+ this.recordedTimeMS.set(Date.now() - startTime);
73
77
  this.mediaFile.set(new File(this.recordedBlobs, this.computedFileName(), { type: this.computedFileType() }));
74
- lengths.push([this.mediaFile().size, event.data.size]);
78
+ this.recordingChanged.emit(this.mediaFile());
75
79
  };
76
80
  // this.recorder.ondataavailable = (event) => {
77
81
  // this.recordedBlobs = [event.data];
78
82
  // lengths.push(event.data.size);
79
83
  // };
80
84
  // this.recorder.ondataavailable = (event) => this.recordedBlobs.push(event.data);
81
- this.recorder.start();
82
- let notifSub;
83
- const startTimer = () => {
84
- let lastDateTime = Date.now();
85
- notifSub = timer(1000, 1000)
86
- .pipe(tap(() => this.recordedTime.update((t) => (t += 1))), tap(() => console.log(Date.now(), this.computedRecordingNotificationInterval(), this.recordingNotificationInterval())), filter(() => Date.now() - lastDateTime > this.computedRecordingNotificationInterval()), tap(() => this.recorder.requestData()))
87
- .subscribe((r) => {
88
- lastDateTime = Date.now();
89
- this.recordingChanged.emit(this.mediaFile());
90
- });
91
- };
85
+ this.recorder.start(this.computedRecordingNotificationInterval());
92
86
  this.recorder.onstart = (e) => {
93
87
  this.recordingState.emit(this.recorder.state);
94
88
  this.recorderStarted.emit(e);
95
- startTimer();
96
89
  };
97
90
  this.recorder.onstop = (e) => {
98
91
  this.recordingState.emit(this.recorder.state);
99
92
  this.recorderStopped.emit(e);
100
- console.log('new length', lengths);
101
- notifSub?.unsubscribe();
102
93
  };
103
94
  this.recorder.onpause = (e) => {
104
95
  this.recordingState.emit(this.recorder.state);
105
- notifSub?.unsubscribe();
106
96
  };
107
97
  this.recorder.onresume = (e) => {
108
98
  this.recordingState.emit(this.recorder.state);
109
- startTimer();
110
99
  };
111
100
  this.recorder.onerror = (e) => {
112
101
  this.recordingState.emit(this.recorder.state);
113
102
  this.recorderErrored.emit(e);
114
- notifSub?.unsubscribe();
115
103
  };
116
104
  };
105
+ this.extractImg = new Observable((sub) => this.canvas().toBlob((blob) => {
106
+ if (blob) {
107
+ this.mediaFile.set(new File([blob], this.computedFileName()));
108
+ sub.next(this.mediaFile());
109
+ sub.complete();
110
+ }
111
+ else
112
+ sub.error(`No ${this.subject()} file generated`);
113
+ }, this.computedFileType(), 1));
117
114
  }
118
115
  ngAfterViewInit() {
119
116
  this.startUpWebcam();
120
117
  }
121
118
  ngOnDestroy() {
122
119
  this.sub?.unsubscribe();
120
+ this.closeWebcam();
123
121
  }
124
122
  /**
125
123
  * Start the webcam stream
126
124
  */
127
125
  startUpWebcam() {
126
+ this.loading.set(true);
128
127
  this.clear();
129
128
  navigator.mediaDevices
130
129
  .getUserMedia({ video: true, audio: this.useAudio() })
131
130
  .then((stream) => {
132
131
  this.streaming.set(true);
132
+ this.loading.set(false);
133
+ // stream.onaddtrack = () => this.loading.set(false);
133
134
  this.canvas.set(document.createElement('canvas'));
134
135
  this.canvas()?.setAttribute('width', this.width() + 'px');
135
136
  this.canvas()?.setAttribute('height', this.height() + 'px');
@@ -147,15 +148,7 @@ export class WebcamMediaComponent {
147
148
  */
148
149
  save() {
149
150
  if (this.isPicture())
150
- new Observable((sub) => this.canvas().toBlob((blob) => {
151
- if (blob) {
152
- this.mediaFile.set(new File([blob], this.computedFileName()));
153
- sub.next(this.mediaFile());
154
- sub.complete();
155
- }
156
- else
157
- sub.error(`No ${this.subject()} file generated`);
158
- }, this.computedFileType(), 1)).subscribe(() => {
151
+ this.extractImg.subscribe(() => {
159
152
  this.closed.emit(this.mediaFile());
160
153
  this.closeWebcam();
161
154
  });
@@ -182,11 +175,18 @@ export class WebcamMediaComponent {
182
175
  context.fillStyle = '#AAA';
183
176
  context.fillRect(0, 0, this.canvas().width, this.canvas().height);
184
177
  const data = this.canvas().toDataURL(this.computedFileType());
185
- this.photoSrc.set(data);
178
+ this.mediaFile.set(undefined);
179
+ // this.photoSrc.set(data);
186
180
  this.streaming.set(true);
187
181
  this.preview.set(false);
188
182
  }
189
183
  }
184
+ retake() {
185
+ if (!this.stream())
186
+ this.startUpWebcam();
187
+ else
188
+ this.clear();
189
+ }
190
190
  /**
191
191
  * Shutdown the webcam stream
192
192
  */
@@ -223,8 +223,9 @@ export class WebcamMediaComponent {
223
223
  return canvas;
224
224
  });
225
225
  context.drawImage(this.recordingVideoRefEl(), 0, 0, width, height);
226
- const data = this.canvas().toDataURL('image/png');
227
- this.photoSrc.set(data);
226
+ this.extractImg.subscribe();
227
+ // const data = this.canvas()!.toDataURL('image/png');
228
+ // this.photoSrc.set(data);
228
229
  }
229
230
  else
230
231
  this.clear();
@@ -245,11 +246,11 @@ export class WebcamMediaComponent {
245
246
  this.recorder.pause();
246
247
  }
247
248
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: WebcamMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
248
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: WebcamMediaComponent, isStandalone: true, selector: "lib-webcam-media", inputs: { isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null }, useAudio: { classPropertyName: "useAudio", publicName: "useAudio", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, fileNameFactory: { classPropertyName: "fileNameFactory", publicName: "fileNameFactory", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, extraClass: { classPropertyName: "extraClass", publicName: "extraClass", isSignal: true, isRequired: false, transformFunction: null }, recordingNotificationInterval: { classPropertyName: "recordingNotificationInterval", publicName: "recordingNotificationInterval", isSignal: true, isRequired: false, transformFunction: null }, isBackground: { classPropertyName: "isBackground", publicName: "isBackground", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", recorderStopped: "recorderStopped", recorderErrored: "recorderErrored", recorderStarted: "recorderStarted", recordingState: "recordingState", recordingChanged: "recordingChanged", width: "widthChange" }, viewQueries: [{ propertyName: "streamingVideoTemplate", first: true, predicate: ["streamVideoTemp"], descendants: true, isSignal: true }, { propertyName: "recordingVideoRef", first: true, predicate: ["recordingVideoTag"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\" row row-cols-lg-auto g-3 justify-content-start\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn text=\"{{isPaused()?'Play': 'Pause'}} Recording\" (mclick)=\"pauseRecording()\" type=\"outline\" [icon]=\"isPaused()?'play':'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n</ng-template>\n\n@if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"photoSrc()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFile()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"clear()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }] }); }
249
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: WebcamMediaComponent, isStandalone: true, selector: "lib-webcam-media", inputs: { isVideo: { classPropertyName: "isVideo", publicName: "isVideo", isSignal: true, isRequired: false, transformFunction: null }, useAudio: { classPropertyName: "useAudio", publicName: "useAudio", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, fileNameFactory: { classPropertyName: "fileNameFactory", publicName: "fileNameFactory", isSignal: true, isRequired: false, transformFunction: null }, fileType: { classPropertyName: "fileType", publicName: "fileType", isSignal: true, isRequired: false, transformFunction: null }, extraClass: { classPropertyName: "extraClass", publicName: "extraClass", isSignal: true, isRequired: false, transformFunction: null }, recordingNotificationInterval: { classPropertyName: "recordingNotificationInterval", publicName: "recordingNotificationInterval", isSignal: true, isRequired: false, transformFunction: null }, isBackground: { classPropertyName: "isBackground", publicName: "isBackground", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", recorderStopped: "recorderStopped", recorderErrored: "recorderErrored", recorderStarted: "recorderStarted", recordingState: "recordingState", recordingChanged: "recordingChanged", width: "widthChange" }, viewQueries: [{ propertyName: "streamingVideoTemplate", first: true, predicate: ["streamVideoTemp"], descendants: true, isSignal: true }, { propertyName: "recordingVideoRef", first: true, predicate: ["recordingVideoTag"], descendants: true, isSignal: true }], ngImport: i0, template: "<loader [loading]=\"loading()\">\n <div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\"row row-cols-lg-auto g-3 justify-content-center\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn\n text=\"{{ isPaused() ? 'Play' : 'Pause' }} Recording\"\n (mclick)=\"pauseRecording()\"\n type=\"outline\"\n [icon]=\"isPaused() ? 'play' : 'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n </ng-template>\n\n @if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFileLink()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" controls autoplay [src]=\"mediaFileLink()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto justify-content-center g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"retake()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n }\n</loader>\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "disabled", "form", "forms", "help", "iconBtn", "loading", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid"], outputs: ["mclick"] }, { kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height"] }] }); }
249
250
  }
250
251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: WebcamMediaComponent, decorators: [{
251
252
  type: Component,
252
- args: [{ selector: 'lib-webcam-media', standalone: true, imports: [CommonModule, BtnComponent], template: "<div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\" row row-cols-lg-auto g-3 justify-content-start\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn text=\"{{isPaused()?'Play': 'Pause'}} Recording\" (mclick)=\"pauseRecording()\" type=\"outline\" [icon]=\"isPaused()?'play':'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n<ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n</ng-template>\n\n@if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"photoSrc()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFile()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"clear()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n}\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"] }]
253
+ args: [{ selector: 'lib-webcam-media', standalone: true, imports: [CommonModule, BtnComponent, LoaderComponent], template: "<loader [loading]=\"loading()\">\n <div class=\"\" [hidden]=\"streaming() != true || isBackground()\">\n <ng-container *ngTemplateOutlet=\"streamVideoTemp\" />\n\n @if (!isBackground()) {\n <div class=\"wm-buttons\">\n <div class=\"row row-cols-lg-auto g-3 justify-content-center\">\n @if (!isRecording()) {\n <div>\n <app-btn [text]=\"isPicture() ? 'Take Picture' : 'Record Video'\" (mclick)=\"isPicture() ? takePicture() : startRecording()\" />\n </div>\n } @else {\n <div>\n <app-btn\n text=\"{{ isPaused() ? 'Play' : 'Pause' }} Recording\"\n (mclick)=\"pauseRecording()\"\n type=\"outline\"\n [icon]=\"isPaused() ? 'play' : 'pause'\" />\n </div>\n <div>\n <app-btn [text]=\"'Stop Recording'\" (mclick)=\"stopRecording()\" type=\"danger\" icon=\"stop\" />\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <ng-template #streamVideoTemp>\n <div class=\"wm-recording-video-cont\">\n <video #recordingVideoTag [srcObject]=\"stream()\" autoplay class=\"wm-recording-video {{ extraClass() }}\"></video>\n @if (isRecording()) {\n <div class=\"wm-recordingDot\"></div>\n }\n </div>\n </ng-template>\n\n @if (computedPreview()) {\n <div class=\"wm-preview\">\n <div>\n @if (isPicture()) {\n <img class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" [src]=\"mediaFileLink()\" />\n } @else {\n <video class=\"w-100\" [style.width.px]=\"width()\" [style.height.px]=\"height()\" controls autoplay [src]=\"mediaFileLink()\"></video>\n }\n </div>\n <div class=\"mt-3 row row-cols-lg-auto justify-content-center g-3\">\n <div>\n <app-btn text=\"Retake {{ subject() }}\" type=\"outline\" (mclick)=\"retake()\" />\n </div>\n <div>\n <app-btn (mclick)=\"save()\" text=\"Done\" type=\"primary\" icon=\"save\" />\n </div>\n <div>\n <app-btn (mclick)=\"cancel()\" text=\"Cancel\" type=\"danger\" icon=\"cancel\" />\n </div>\n </div>\n </div>\n }\n</loader>\n", styles: [":host{display:block}:host .wm-recording-video{width:100%}:host .wm-preview image,:host .wm-preview video{object-fit:contain}:host .wm-recording-video-cont{position:relative}@keyframes wmAnimateDot{0%{background-color:transparent}50%{background-color:#ff000086}}:host .wm-recordingDot{animation-name:wmAnimateDot;animation-duration:1s;animation-iteration-count:infinite;border-radius:5px;--dimen: 20px;width:var(--dimen);height:var(--dimen);position:absolute;top:10px;right:10px}:host .wm-buttons{margin-top:var(--space-16)}\n"] }]
253
254
  }], propDecorators: { closed: [{
254
255
  type: Output
255
256
  }], recorderStopped: [{
@@ -263,4 +264,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImpor
263
264
  }], recordingChanged: [{
264
265
  type: Output
265
266
  }] } });
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1lZGlhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBRU4sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUEwQixNQUFNLEVBQXVCLEdBQUcsRUFBRSxVQUFVLEVBQW9CLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTdEQsTUFBTSxPQUFPLG9CQUFvQjtJQVBqQztRQVFZLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDcEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7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QkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQzs4QkFLM0IsTUFBTTtzQkFBZixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIGludGVydmFsLCBtYXAsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd2ViY2FtLW1lZGlhJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnRuQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL3dlYmNhbS1tZWRpYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi93ZWJjYW0tbWVkaWEuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJjYW1NZWRpYUNvbXBvbmVudCB7XG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRlclN0b3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVjb3JkZXJFcnJvcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGVyU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRpbmdTdGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkaW5nU3RhdGU+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRpbmdDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlIHwgdW5kZWZpbmVkPigpO1xuXG4gIGlzVmlkZW8gPSBpbnB1dDxib29sZWFuPigpO1xuICB1c2VBdWRpbyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIGZpbGVOYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuICBmaWxlTmFtZUZhY3RvcnkgPSBpbnB1dDwoY29tcDogV2ViY2FtTWVkaWFDb21wb25lbnQpID0+IHN0cmluZz4oKTtcbiAgZmlsZVR5cGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGV4dHJhQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBTZWNvbmRzXG4gICAqL1xuICByZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCA9IGlucHV0PG51bWJlcj4oNSk7XG4gIGlzQmFja2dyb3VuZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb21wdXRlZFJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiAodGhpcy5yZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCgpIHx8IDUpICogMTAwMCk7XG4gIGlzUGljdHVyZSA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLmlzVmlkZW8oKSk7XG5cbiAgc3ViamVjdCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzUGljdHVyZSgpID8gJ0ltYWdlJyA6ICdWaWRlbycpKTtcblxuICBpc1BhdXNlZCA9IHRvU2lnbmFsKHRoaXMucmVjb3JkaW5nU3RhdGUucGlwZShtYXAoKHIpID0+IHIgPT0gJ3BhdXNlZCcpKSk7XG5cbiAgY29tcHV0ZWRGaWxlVHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmdCA9IHRoaXMuZmlsZVR5cGUoKSxcbiAgICAgIGlzcCA9IHRoaXMuaXNQaWN0dXJlKCk7XG4gICAgcmV0dXJuIGZ0IHx8IChpc3AgPyAnaW1hZ2UvanBlZycgOiAndmlkZW8vbXA0Jyk7XG4gIH0pO1xuICBjb21wdXRlZEZpbGVFeHRlbnNpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKT8uc3BsaXQoJy8nKVsxXSk7XG4gIGNvbXB1dGVkRmlsZU5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZmYgPSB0aGlzLmZpbGVOYW1lRmFjdG9yeSgpLFxuICAgICAgZm4gPSB0aGlzLmZpbGVOYW1lKCkgfHwgZmY/Lih0aGlzKSxcbiAgICAgIGZ4ID0gdGhpcy5jb21wdXRlZEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHN1YmplY3QgPSB0aGlzLnN1YmplY3QoKTtcbiAgICByZXR1cm4gZm4/LmluY2x1ZGVzKCcuJyArIGZ4KSA/IGZuIDogYCR7Zm4gfHwgc3ViamVjdH0uJHtmeH1gO1xuICB9KTtcblxuICBzdHJlYW1pbmdWaWRlb1RlbXBsYXRlID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPGFueT4+KCdzdHJlYW1WaWRlb1RlbXAnKTtcbiAgcmVjb3JkaW5nVmlkZW9SZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50Pj4oJ3JlY29yZGluZ1ZpZGVvVGFnJyk7XG4gIHJlY29yZGluZ1ZpZGVvUmVmRWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlY29yZGluZ1ZpZGVvUmVmKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gIHN0cmVhbWluZyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcmV2aWV3ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29tcHV0ZWRQcmV2aWV3ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gIXRoaXMuaXNCYWNrZ3JvdW5kKCkgJiYgdGhpcy5wcmV2aWV3KCkpO1xuXG4gIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjYXB0dXJlZCBwaG90by4gV2Ugd2lsbCBzZXQgdGhlXG4gIC8vIHdpZHRoIHRvIHRoZSB2YWx1ZSBkZWZpbmVkIGhlcmUsIGJ1dCB0aGUgaGVpZ2h0IHdpbGwgYmVcbiAgLy8gY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBpbnB1dCBzdHJlYW0uXG5cbiAgd2lkdGggPSBtb2RlbDxudW1iZXI+KDEwODApOyAvLyBXZSB3aWxsIHNjYWxlIHRoZSBwaG90byB3aWR0aCB0byB0aGlzXG4gIGhlaWdodCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCgpO1xuICAgIHJldHVybiB3aWR0aCAvICg0IC8gMyk7XG4gIH0pOyAvLyBUaGlzIHdpbGwgYmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGlucHV0IHN0cmVhbVxuXG4gIC8vIFRoZSB2YXJpb3VzIEhUTUwgZWxlbWVudHMgd2UgbmVlZCB0byBjb25maWd1cmUgb3IgY29udHJvbC4gVGhlc2VcbiAgLy8gd2lsbCBiZSBzZXQgYnkgdGhlIHN0YXJ0dXAoKSBmdW5jdGlvbi5cblxuICBwcm90ZWN0ZWQgY2FudmFzID0gc2lnbmFsPEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBtZWRpYUZpbGUgPSBzaWduYWw8RmlsZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcGhvdG9TcmMgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICB2aWRlb1NyYyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgc3RyZWFtID0gc2lnbmFsPE1lZGlhU3RyZWFtPih1bmRlZmluZWQpO1xuXG4gIHN1YjogU3Vic2NyaXB0aW9uO1xuICByZWNvcmRlcjogTWVkaWFSZWNvcmRlcjtcbiAgaXNSZWNvcmRpbmcgPSB0b1NpZ25hbDxib29sZWFuPih0aGlzLnJlY29yZGluZ1N0YXRlLnBpcGUobWFwKChyKSA9PiByID09ICdyZWNvcmRpbmcnIHx8IHIgPT0gJ3BhdXNlZCcpKSk7XG4gIHJlY29yZGVkQmxvYnM6IEJsb2JbXSA9IFtdO1xuXG4gIHJlY29yZGVkVGltZSA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VXBXZWJjYW0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSB3ZWJjYW0gc3RyZWFtXG4gICAqL1xuICBzdGFydFVwV2ViY2FtKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUsIGF1ZGlvOiB0aGlzLnVzZUF1ZGlvKCkgfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpO1xuICAgICAgICB0aGlzLmNhbnZhcygpPy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy53aWR0aCgpICsgJ3B4Jyk7XG4gICAgICAgIHRoaXMuY2FudmFzKCk/LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQoKSArICdweCcpO1xuICAgICAgICB0aGlzLnN0cmVhbS5zZXQoc3RyZWFtKTtcbiAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQ6YCwgZXJyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlIHRoYXQgdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSB3ZWJjYW0gY29tcG9uZW50LlxuICAgKlxuICAgKiBBbnkgbWVkaWEgb2J0YWluZWQgd2lsbCBiZSBlbWl0dGVkXG4gICAqL1xuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmlzUGljdHVyZSgpKVxuICAgICAgbmV3IE9ic2VydmFibGU8RmlsZT4oKHN1YikgPT5cbiAgICAgICAgdGhpcy5jYW52YXMoKSEudG9CbG9iKFxuICAgICAgICAgIChibG9iKSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUoW2Jsb2JdLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSkpO1xuICAgICAgICAgICAgICBzdWIubmV4dCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgICAgICAgICAgc3ViLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Ugc3ViLmVycm9yKGBObyAke3RoaXMuc3ViamVjdCgpfSBmaWxlIGdlbmVyYXRlZGApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5jb21wdXRlZEZpbGVUeXBlKCksXG4gICAgICAgICAgMSxcbiAgICAgICAgKSxcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZVdlYmNhbSgpO1xuICAgICAgfSk7XG4gICAgZWxzZSB7IFxuICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGUgdGhhdCB0aGUgdXNlciBpcyBkb25lIHdpdGggdGhlIHdlYmNhbSBjb21wb25lbnQuXG4gICAqXG4gICAqIEFueSBtZWRpYSBvYnRhaW5lZCB3aWxsIGJlIGRlbGV0ZWRcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KG51bGwpO1xuICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbWVkaWEgdGFrZW4gYW5kIGNsb3NlIHByZXZpZXdcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmNhbnZhcygpKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMoKT8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGNvbnRleHQhLmZpbGxTdHlsZSA9ICcjQUFBJztcbiAgICAgIGNvbnRleHQhLmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzKCkhLndpZHRoLCB0aGlzLmNhbnZhcygpIS5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5jYW52YXMoKSEudG9EYXRhVVJMKHRoaXMuY29tcHV0ZWRGaWxlVHlwZSgpKTtcbiAgICAgIHRoaXMucGhvdG9TcmMuc2V0KGRhdGEpO1xuICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5wcmV2aWV3LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3duIHRoZSB3ZWJjYW0gc3RyZWFtXG4gICAqL1xuICBjbG9zZVdlYmNhbSgpIHtcbiAgICB0aGlzLnN0cmVhbSgpXG4gICAgICA/LmdldFRyYWNrcygpXG4gICAgICAuZm9yRWFjaCgoeCkgPT4geC5zdG9wKCkpO1xuICAgIHRoaXMuc3RyZWFtLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuc3RyZWFtaW5nLnNldCh1bmRlZmluZWQpO1xuICAgIC8vIHRoaXMuc3RyZWFtLnNldCh0aGlzLnN0cmVhbSgpPy5nZXRUcmFja3NbMF0uc3RvcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGEgcGhvdG8gYnkgZmV0Y2hpbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHZpZGVvXG4gICAqIGFuZCBkcmF3aW5nIGl0IGludG8gYSBjYW52YXMsIHRoZW4gY29udmVydGluZyB0aGF0IHRvIGEgUE5HXG4gICAqIGZvcm1hdCBkYXRhIFVSTC5cbiAgICpcbiAgICogQnkgZHJhd2luZyBpdCBvbiBhbiBvZmZzY3JlZW4gY2FudmFzIGFuZCB0aGVuXG4gICAqIGRyYXdpbmcgdGhhdCB0byB0aGUgc2NyZWVuLCB3ZSBjYW4gY2hhbmdlIGl0cyBzaXplIGFuZC9vciBhcHBseVxuICAgKiBvdGhlciBjaGFuZ2VzIGJlZm9yZSBkcmF3aW5nIGl0LlxuICAgKi9cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgaWYgKCF0aGlzLmlzUGljdHVyZSgpKSByZXR1cm47XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FudmFzKCkhLmdldENvbnRleHQoJzJkJyksXG4gICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSxcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgaWYgKHdpZHRoICYmIGhlaWdodCAmJiBjb250ZXh0KSB7XG4gICAgICB0aGlzLmNhbnZhcy51cGRhdGUoKGNhbnZhcykgPT4ge1xuICAgICAgICBpZiAoY2FudmFzKSBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYW52YXMudXBkYXRlKChjYW52YXMpID0+IHtcbiAgICAgICAgaWYgKGNhbnZhcykgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICAgIH0pO1xuICAgICAgY29udGV4dC5kcmF3SW1hZ2UodGhpcy5yZWNvcmRpbmdWaWRlb1JlZkVsKCkhLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICB0aGlzLnBob3RvU3JjLnNldChkYXRhKTtcbiAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICB9XG5cbiAgc3RhcnRSZWNvcmRpbmcgPSAoc3RyZWFtID0gdGhpcy5zdHJlYW0oKSkgPT4ge1xuICAgIGlmICghdGhpcy5pc1ZpZGVvKCkpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtKTtcblxuICAgIHRoaXMucmVjb3JkZWRCbG9icyA9IFtdO1xuICAgIHRoaXMucmVjb3JkZWRUaW1lLnNldCgwKTtcbiAgICBjb25zdCBsZW5ndGhzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRlZEJsb2JzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUodGhpcy5yZWNvcmRlZEJsb2JzLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSwgeyB0eXBlOiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSB9KSk7XG4gICAgICBsZW5ndGhzLnB1c2goW3RoaXMubWVkaWFGaWxlKCkuc2l6ZSwgZXZlbnQuZGF0YS5zaXplXSk7XG4gICAgfTtcbiAgICAvLyB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4ge1xuICAgIC8vICAgdGhpcy5yZWNvcmRlZEJsb2JzID0gW2V2ZW50LmRhdGFdO1xuICAgIC8vICAgbGVuZ3Rocy5wdXNoKGV2ZW50LmRhdGEuc2l6ZSk7XG4gICAgLy8gfTtcbiAgICAvLyB0aGlzLnJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4gdGhpcy5yZWNvcmRlZEJsb2JzLnB1c2goZXZlbnQuZGF0YSk7XG5cbiAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KCk7XG4gICAgbGV0IG5vdGlmU3ViOiBTdWJzY3JpcHRpb247XG4gICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpID0+IHtcbiAgICAgIGxldCBsYXN0RGF0ZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbm90aWZTdWIgPSB0aW1lcigxMDAwLCAxMDAwKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZWNvcmRlZFRpbWUudXBkYXRlKCh0KSA9PiAodCArPSAxKSkpLFxuICAgICAgICAgIHRhcCgoKSA9PiBjb25zb2xlLmxvZyhEYXRlLm5vdygpLCB0aGlzLmNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwoKSwgdGhpcy5yZWNvcmRpbmdOb3RpZmljYXRpb25JbnRlcnZhbCgpKSksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IERhdGUubm93KCkgLSBsYXN0RGF0ZVRpbWUgPiB0aGlzLmNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMucmVjb3JkZXIucmVxdWVzdERhdGEoKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocikgPT4ge1xuICAgICAgICAgIGxhc3REYXRlVGltZSA9IERhdGUubm93KCk7IFxuICAgICAgICAgIHRoaXMucmVjb3JkaW5nQ2hhbmdlZC5lbWl0KHRoaXMubWVkaWFGaWxlKCkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25zdGFydCA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICB0aGlzLnJlY29yZGVyU3RhcnRlZC5lbWl0KGUpO1xuICAgICAgc3RhcnRUaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbnN0b3AgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgICAgdGhpcy5yZWNvcmRlclN0b3BwZWQuZW1pdChlKTtcbiAgICAgIGNvbnNvbGUubG9nKCduZXcgbGVuZ3RoJywgbGVuZ3Rocyk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25wYXVzZSA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25yZXN1bWUgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgICAgc3RhcnRUaW1lcigpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJFcnJvcmVkLmVtaXQoZSk7XG4gICAgICBub3RpZlN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICB9O1xuXG4gIHN0b3BSZWNvcmRpbmcoKSB7XG4gICAgaWYgKHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB0aGlzLnJlY29yZGVyLnN0b3AoKTtcblxuICAgIHRoaXMucHJldmlldy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHBhdXNlUmVjb3JkaW5nKCkge1xuICAgIC8vIGRlYnVnZ2VyO1xuICAgIGlmICh0aGlzLnJlY29yZGVyLnN0YXRlID09PSAncGF1c2VkJykgdGhpcy5yZWNvcmRlci5yZXN1bWUoKTtcbiAgICBlbHNlIHRoaXMucmVjb3JkZXIucGF1c2UoKTtcbiAgfVxuIFxufVxuIiwiPGRpdiBjbGFzcz1cIlwiIFtoaWRkZW5dPVwic3RyZWFtaW5nKCkgIT0gdHJ1ZSB8fCBpc0JhY2tncm91bmQoKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RyZWFtVmlkZW9UZW1wXCIgLz5cblxuICBAaWYgKCFpc0JhY2tncm91bmQoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3bS1idXR0b25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiICByb3cgcm93LWNvbHMtbGctYXV0byBnLTMganVzdGlmeS1jb250ZW50LXN0YXJ0XCI+XG4gICAgICAgIEBpZiAoIWlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiaXNQaWN0dXJlKCkgPyAnVGFrZSBQaWN0dXJlJyA6ICdSZWNvcmQgVmlkZW8nXCIgKG1jbGljayk9XCJpc1BpY3R1cmUoKSA/IHRha2VQaWN0dXJlKCkgOiBzdGFydFJlY29yZGluZygpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxhcHAtYnRuIHRleHQ9XCJ7e2lzUGF1c2VkKCk/J1BsYXknOiAnUGF1c2UnfX0gUmVjb3JkaW5nXCIgKG1jbGljayk9XCJwYXVzZVJlY29yZGluZygpXCIgdHlwZT1cIm91dGxpbmVcIiBbaWNvbl09XCJpc1BhdXNlZCgpPydwbGF5JzoncGF1c2UnXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiJ1N0b3AgUmVjb3JkaW5nJ1wiIChtY2xpY2spPVwic3RvcFJlY29yZGluZygpXCIgdHlwZT1cImRhbmdlclwiIGljb249XCJzdG9wXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3N0cmVhbVZpZGVvVGVtcD5cbiAgPGRpdiBjbGFzcz1cIndtLXJlY29yZGluZy12aWRlby1jb250XCI+XG4gICAgPHZpZGVvICNyZWNvcmRpbmdWaWRlb1RhZyBbc3JjT2JqZWN0XT1cInN0cmVhbSgpXCIgYXV0b3BsYXkgY2xhc3M9XCJ3bS1yZWNvcmRpbmctdmlkZW8ge3sgZXh0cmFDbGFzcygpIH19XCI+PC92aWRlbz5cbiAgICBAaWYgKGlzUmVjb3JkaW5nKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ3bS1yZWNvcmRpbmdEb3RcIj48L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuQGlmIChjb21wdXRlZFByZXZpZXcoKSkge1xuICA8ZGl2IGNsYXNzPVwid20tcHJldmlld1wiPlxuICAgIDxkaXY+XG4gICAgICBAaWYgKGlzUGljdHVyZSgpKSB7XG4gICAgICAgIDxpbWcgY2xhc3M9XCJ3LTEwMFwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQoKVwiIFtzcmNdPVwicGhvdG9TcmMoKVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHZpZGVvIGNsYXNzPVwidy0xMDBcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGgoKVwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0KClcIiBbc3JjXT1cIm1lZGlhRmlsZSgpXCI+PC92aWRlbz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMyByb3cgcm93LWNvbHMtbGctYXV0byBnLTNcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxhcHAtYnRuIHRleHQ9XCJSZXRha2Uge3sgc3ViamVjdCgpIH19XCIgdHlwZT1cIm91dGxpbmVcIiAobWNsaWNrKT1cImNsZWFyKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YXBwLWJ0biAobWNsaWNrKT1cInNhdmUoKVwiIHRleHQ9XCJEb25lXCIgdHlwZT1cInByaW1hcnlcIiBpY29uPVwic2F2ZVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxhcHAtYnRuIChtY2xpY2spPVwiY2FuY2VsKClcIiB0ZXh0PVwiQ2FuY2VsXCIgdHlwZT1cImRhbmdlclwiIGljb249XCJjYW5jZWxcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLW1lZGlhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9TaGFyZWQvY29tcG9uZW50cy93ZWJjYW0tbWVkaWEvd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBRU4sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUF1RCxHQUFHLEVBQUUsVUFBVSxFQUFnQyxNQUFNLE1BQU0sQ0FBQztBQUMxSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFTN0QsTUFBTSxPQUFPLG9CQUFvQjtJQVBqQztRQVFZLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2xDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDNUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDcEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFFbEUsWUFBTyxHQUFHLEtBQUssRUFBVyxDQUFDO1FBQzNCLGFBQVEsR0FBRyxLQUFLLEVBQVcsQ0FBQztRQUM1QixhQUFRLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDM0Isb0JBQWUsR0FBRyxLQUFLLEVBQTBDLENBQUM7UUFDbEUsYUFBUSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQzNCLGVBQVUsR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUM3Qjs7V0FFRztRQUNILGtDQUE2QixHQUFHLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNqRCxpQkFBWSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVyQywwQ0FBcUMsR0FBRyxRQUFRLENBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuSCxjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFNUMsWUFBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWpFLGFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpFLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUN4QixHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBQ0gsMEJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUMvQixFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUNsQyxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQ2pDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0IsT0FBTyxFQUFFLEVBQUUsUUFBUSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCwyQkFBc0IsR0FBRyxTQUFTLENBQW1CLGlCQUFpQixDQUFDLENBQUM7UUFDeEUsc0JBQWlCLEdBQUcsU0FBUyxDQUErQixtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pGLHdCQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUU5RSxjQUFTLEdBQUcsTUFBTSxDQUFzQixTQUFTLENBQUMsQ0FBQztRQUNuRCxZQUFPLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLG9CQUFlLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWxGLDhEQUE4RDtRQUM5RCwwREFBMEQ7UUFDMUQsNERBQTREO1FBRTVELFVBQUssR0FBRyxLQUFLLENBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyx3Q0FBd0M7UUFDckUsV0FBTSxHQUFHLFFBQVEsQ0FBUyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO1FBRXRELG1FQUFtRTtRQUNuRSx5Q0FBeUM7UUFFL0IsV0FBTSxHQUFHLE1BQU0sQ0FBZ0MsU0FBUyxDQUFDLENBQUM7UUFDcEUsY0FBUyxHQUFHLE1BQU0sQ0FBbUIsU0FBUyxDQUFDLENBQUM7UUFDaEQsa0JBQWEsR0FBRyxRQUFRLENBQXFCLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTNILFdBQU0sR0FBRyxNQUFNLENBQWMsU0FBUyxDQUFDLENBQUM7UUFJeEMsZ0JBQVcsR0FBRyxRQUFRLENBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFFM0IscUJBQXFCO1FBQ3JCLG1CQUFjLEdBQUcsTUFBTSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsUUFBUSxDQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEYsWUFBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQWdJakMsbUJBQWMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxPQUFPO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQztZQUNGLCtDQUErQztZQUMvQyx1Q0FBdUM7WUFDdkMsbUNBQW1DO1lBQ25DLEtBQUs7WUFDTCxrRkFBa0Y7WUFFbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztZQUVsRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBZUYsZUFBVSxHQUFHLElBQUksVUFBVSxDQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDaEI7O2dCQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsQ0FBQyxFQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUN2QixDQUFDLENBQ0YsQ0FDRixDQUFDO0tBQ0g7SUFqTUMsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixTQUFTLENBQUMsWUFBWTthQUNuQixZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzthQUNyRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixZQUFZO1FBQ2QsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FBQzthQUNBO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELE9BQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQzVCLE9BQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUIsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7WUFDcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsRUFBRSxTQUFTLEVBQUU7YUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLHVEQUF1RDtJQUN6RCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1FBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQzdDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ3BCLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM1QixJQUFJLE1BQU07b0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2pDLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxNQUFNO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUNuQyxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixzREFBc0Q7WUFDdEQsMkJBQTJCO1NBQzVCOztZQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBMkNELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLFdBQVc7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osWUFBWTtRQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7O1lBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQzs4R0FoUVUsb0JBQW9CO2tHQUFwQixvQkFBb0Isd3lEQzFCakMsZ3RFQTREQSxza0JEdENZLFlBQVksc01BQUUsWUFBWSw2YkFBRSxlQUFlOzsyRkFJMUMsb0JBQW9CO2tCQVBoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQzs4QkFLNUMsTUFBTTtzQkFBZixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmcm9tRXZlbnQsIGludGVydmFsLCBtYXAsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbG9hZGVyL2xvYWRlci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd2ViY2FtLW1lZGlhJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQnRuQ29tcG9uZW50LCBMb2FkZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vd2ViY2FtLW1lZGlhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3dlYmNhbS1tZWRpYS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdlYmNhbU1lZGlhQ29tcG9uZW50IHtcbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGVyU3RvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWNvcmRlckVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVjb3JkZXJTdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGluZ1N0YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmRpbmdTdGF0ZT4oKTtcbiAgQE91dHB1dCgpIHJlY29yZGluZ0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGUgfCB1bmRlZmluZWQ+KCk7XG5cbiAgaXNWaWRlbyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHVzZUF1ZGlvID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgZmlsZU5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGZpbGVOYW1lRmFjdG9yeSA9IGlucHV0PChjb21wOiBXZWJjYW1NZWRpYUNvbXBvbmVudCkgPT4gc3RyaW5nPigpO1xuICBmaWxlVHlwZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgZXh0cmFDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFNlY29uZHNcbiAgICovXG4gIHJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsID0gaW5wdXQ8bnVtYmVyPig1KTtcbiAgaXNCYWNrZ3JvdW5kID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbXB1dGVkUmVjb3JkaW5nTm90aWZpY2F0aW9uSW50ZXJ2YWwgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+ICh0aGlzLnJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsKCkgfHwgNSkgKiAxMDAwKTtcbiAgaXNQaWN0dXJlID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXNWaWRlbygpKTtcblxuICBzdWJqZWN0ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXNQaWN0dXJlKCkgPyAnSW1hZ2UnIDogJ1ZpZGVvJykpO1xuXG4gIGlzUGF1c2VkID0gdG9TaWduYWwodGhpcy5yZWNvcmRpbmdTdGF0ZS5waXBlKG1hcCgocikgPT4gciA9PSAncGF1c2VkJykpKTtcblxuICBjb21wdXRlZEZpbGVUeXBlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGZ0ID0gdGhpcy5maWxlVHlwZSgpLFxuICAgICAgaXNwID0gdGhpcy5pc1BpY3R1cmUoKTtcbiAgICByZXR1cm4gZnQgfHwgKGlzcCA/ICdpbWFnZS9qcGVnJyA6ICd2aWRlby9tcDQnKTtcbiAgfSk7XG4gIGNvbXB1dGVkRmlsZUV4dGVuc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWRGaWxlVHlwZSgpPy5zcGxpdCgnLycpWzFdKTtcbiAgY29tcHV0ZWRGaWxlTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmZiA9IHRoaXMuZmlsZU5hbWVGYWN0b3J5KCksXG4gICAgICBmbiA9IHRoaXMuZmlsZU5hbWUoKSB8fCBmZj8uKHRoaXMpLFxuICAgICAgZnggPSB0aGlzLmNvbXB1dGVkRmlsZUV4dGVuc2lvbigpLFxuICAgICAgc3ViamVjdCA9IHRoaXMuc3ViamVjdCgpO1xuICAgIHJldHVybiBmbj8uaW5jbHVkZXMoJy4nICsgZngpID8gZm4gOiBgJHtmbiB8fCBzdWJqZWN0fS4ke2Z4fWA7XG4gIH0pO1xuXG4gIHN0cmVhbWluZ1ZpZGVvVGVtcGxhdGUgPSB2aWV3Q2hpbGQ8VGVtcGxhdGVSZWY8YW55Pj4oJ3N0cmVhbVZpZGVvVGVtcCcpO1xuICByZWNvcmRpbmdWaWRlb1JlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+PigncmVjb3JkaW5nVmlkZW9UYWcnKTtcbiAgcmVjb3JkaW5nVmlkZW9SZWZFbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVjb3JkaW5nVmlkZW9SZWYoKT8ubmF0aXZlRWxlbWVudCk7XG5cbiAgc3RyZWFtaW5nID0gc2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByZXZpZXcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb21wdXRlZFByZXZpZXcgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhdGhpcy5pc0JhY2tncm91bmQoKSAmJiB0aGlzLnByZXZpZXcoKSk7XG5cbiAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNhcHR1cmVkIHBob3RvLiBXZSB3aWxsIHNldCB0aGVcbiAgLy8gd2lkdGggdG8gdGhlIHZhbHVlIGRlZmluZWQgaGVyZSwgYnV0IHRoZSBoZWlnaHQgd2lsbCBiZVxuICAvLyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IHN0cmVhbS5cblxuICB3aWR0aCA9IG1vZGVsPG51bWJlcj4oMTA4MCk7IC8vIFdlIHdpbGwgc2NhbGUgdGhlIHBob3RvIHdpZHRoIHRvIHRoaXNcbiAgaGVpZ2h0ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoKCk7XG4gICAgcmV0dXJuIHdpZHRoIC8gKDQgLyAzKTtcbiAgfSk7IC8vIFRoaXMgd2lsbCBiZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyZWFtXG5cbiAgLy8gVGhlIHZhcmlvdXMgSFRNTCBlbGVtZW50cyB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSBvciBjb250cm9sLiBUaGVzZVxuICAvLyB3aWxsIGJlIHNldCBieSB0aGUgc3RhcnR1cCgpIGZ1bmN0aW9uLlxuXG4gIHByb3RlY3RlZCBjYW52YXMgPSBzaWduYWw8SFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIG1lZGlhRmlsZSA9IHNpZ25hbDxGaWxlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBtZWRpYUZpbGVMaW5rID0gY29tcHV0ZWQ8c3RyaW5nIHwgdW5kZWZpbmVkPigoKSA9PiAodGhpcy5tZWRpYUZpbGUoKSA/IFVSTC5jcmVhdGVPYmplY3RVUkwodGhpcy5tZWRpYUZpbGUoKSkgOiB1bmRlZmluZWQpKTtcblxuICBzdHJlYW0gPSBzaWduYWw8TWVkaWFTdHJlYW0+KHVuZGVmaW5lZCk7XG5cbiAgc3ViOiBTdWJzY3JpcHRpb247XG4gIHJlY29yZGVyOiBNZWRpYVJlY29yZGVyO1xuICBpc1JlY29yZGluZyA9IHRvU2lnbmFsPGJvb2xlYW4+KHRoaXMucmVjb3JkaW5nU3RhdGUucGlwZShtYXAoKHIpID0+IHIgPT0gJ3JlY29yZGluZycgfHwgciA9PSAncGF1c2VkJykpKTtcbiAgcmVjb3JkZWRCbG9iczogQmxvYltdID0gW107XG5cbiAgLyoqSW4gTWlsbGlzZWNvbmRzICovXG4gIHJlY29yZGVkVGltZU1TID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHJlY29yZGVkVGltZSA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gTWF0aC5yb3VuZCh0aGlzLnJlY29yZGVkVGltZU1TKCkgLyAxMDAwKSk7XG4gIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VXBXZWJjYW0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2xvc2VXZWJjYW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgd2ViY2FtIHN0cmVhbVxuICAgKi9cbiAgc3RhcnRVcFdlYmNhbSgpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzXG4gICAgICAuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUsIGF1ZGlvOiB0aGlzLnVzZUF1ZGlvKCkgfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgLy8gc3RyZWFtLm9uYWRkdHJhY2sgPSAoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpKTtcbiAgICAgICAgdGhpcy5jYW52YXMoKT8uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMud2lkdGgoKSArICdweCcpO1xuICAgICAgICB0aGlzLmNhbnZhcygpPy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KCkgKyAncHgnKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uc2V0KHN0cmVhbSk7XG4gICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFuIGVycm9yIG9jY3VycmVkOmAsIGVycik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIGlzIGRvbmUgd2l0aCB0aGUgd2ViY2FtIGNvbXBvbmVudC5cbiAgICpcbiAgICogQW55IG1lZGlhIG9idGFpbmVkIHdpbGwgYmUgZW1pdHRlZFxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc1BpY3R1cmUoKSlcbiAgICAgIHRoaXMuZXh0cmFjdEltZy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHRoaXMubWVkaWFGaWxlKCkpO1xuICAgICAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gICAgICB9KTtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQodGhpcy5tZWRpYUZpbGUoKSk7XG4gICAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlIHRoYXQgdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSB3ZWJjYW0gY29tcG9uZW50LlxuICAgKlxuICAgKiBBbnkgbWVkaWEgb2J0YWluZWQgd2lsbCBiZSBkZWxldGVkXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbG9zZWQuZW1pdChudWxsKTtcbiAgICB0aGlzLmNsb3NlV2ViY2FtKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIG1lZGlhIHRha2VuIGFuZCBjbG9zZSBwcmV2aWV3XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jYW52YXMoKSkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FudmFzKCk/LmdldENvbnRleHQoJzJkJyk7XG4gICAgICBjb250ZXh0IS5maWxsU3R5bGUgPSAnI0FBQSc7XG4gICAgICBjb250ZXh0IS5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcygpIS53aWR0aCwgdGhpcy5jYW52YXMoKSEuaGVpZ2h0KTtcblxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCh0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQodW5kZWZpbmVkKTtcbiAgICAgIC8vIHRoaXMucGhvdG9TcmMuc2V0KGRhdGEpO1xuICAgICAgdGhpcy5zdHJlYW1pbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5wcmV2aWV3LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0YWtlKCkge1xuICAgIGlmICghdGhpcy5zdHJlYW0oKSkgdGhpcy5zdGFydFVwV2ViY2FtKCk7XG4gICAgZWxzZSB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2h1dGRvd24gdGhlIHdlYmNhbSBzdHJlYW1cbiAgICovXG4gIGNsb3NlV2ViY2FtKCkge1xuICAgIHRoaXMuc3RyZWFtKClcbiAgICAgID8uZ2V0VHJhY2tzKClcbiAgICAgIC5mb3JFYWNoKCh4KSA9PiB4LnN0b3AoKSk7XG4gICAgdGhpcy5zdHJlYW0uc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KHVuZGVmaW5lZCk7XG4gICAgLy8gdGhpcy5zdHJlYW0uc2V0KHRoaXMuc3RyZWFtKCk/LmdldFRyYWNrc1swXS5zdG9wKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmUgYSBwaG90byBieSBmZXRjaGluZyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgdmlkZW9cbiAgICogYW5kIGRyYXdpbmcgaXQgaW50byBhIGNhbnZhcywgdGhlbiBjb252ZXJ0aW5nIHRoYXQgdG8gYSBQTkdcbiAgICogZm9ybWF0IGRhdGEgVVJMLlxuICAgKlxuICAgKiBCeSBkcmF3aW5nIGl0IG9uIGFuIG9mZnNjcmVlbiBjYW52YXMgYW5kIHRoZW5cbiAgICogZHJhd2luZyB0aGF0IHRvIHRoZSBzY3JlZW4sIHdlIGNhbiBjaGFuZ2UgaXRzIHNpemUgYW5kL29yIGFwcGx5XG4gICAqIG90aGVyIGNoYW5nZXMgYmVmb3JlIGRyYXdpbmcgaXQuXG4gICAqL1xuICB0YWtlUGljdHVyZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNQaWN0dXJlKCkpIHJldHVybjtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMoKSEuZ2V0Q29udGV4dCgnMmQnKSxcbiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLFxuICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTtcbiAgICBpZiAod2lkdGggJiYgaGVpZ2h0ICYmIGNvbnRleHQpIHtcbiAgICAgIHRoaXMuY2FudmFzLnVwZGF0ZSgoY2FudmFzKSA9PiB7XG4gICAgICAgIGlmIChjYW52YXMpIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNhbnZhcy51cGRhdGUoKGNhbnZhcykgPT4ge1xuICAgICAgICBpZiAoY2FudmFzKSBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgfSk7XG4gICAgICBjb250ZXh0LmRyYXdJbWFnZSh0aGlzLnJlY29yZGluZ1ZpZGVvUmVmRWwoKSEsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5leHRyYWN0SW1nLnN1YnNjcmliZSgpO1xuICAgICAgLy8gY29uc3QgZGF0YSA9IHRoaXMuY2FudmFzKCkhLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAvLyB0aGlzLnBob3RvU3JjLnNldChkYXRhKTtcbiAgICB9IGVsc2UgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5zdHJlYW1pbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICB9XG5cbiAgc3RhcnRSZWNvcmRpbmcgPSAoc3RyZWFtID0gdGhpcy5zdHJlYW0oKSkgPT4ge1xuICAgIGlmICghdGhpcy5pc1ZpZGVvKCkpIHJldHVybjtcbiAgICB0aGlzLnJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtKTtcblxuICAgIHRoaXMucmVjb3JkZWRCbG9icyA9IFtdO1xuICAgIHRoaXMucmVjb3JkZWRUaW1lTVMuc2V0KDApO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkZWRCbG9icy5wdXNoKGV2ZW50LmRhdGEpO1xuICAgICAgdGhpcy5yZWNvcmRlZFRpbWVNUy5zZXQoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICB0aGlzLm1lZGlhRmlsZS5zZXQobmV3IEZpbGUodGhpcy5yZWNvcmRlZEJsb2JzLCB0aGlzLmNvbXB1dGVkRmlsZU5hbWUoKSwgeyB0eXBlOiB0aGlzLmNvbXB1dGVkRmlsZVR5cGUoKSB9KSk7XG4gICAgICB0aGlzLnJlY29yZGluZ0NoYW5nZWQuZW1pdCh0aGlzLm1lZGlhRmlsZSgpKTtcbiAgICB9O1xuICAgIC8vIHRoaXMucmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgLy8gICB0aGlzLnJlY29yZGVkQmxvYnMgPSBbZXZlbnQuZGF0YV07XG4gICAgLy8gICBsZW5ndGhzLnB1c2goZXZlbnQuZGF0YS5zaXplKTtcbiAgICAvLyB9O1xuICAgIC8vIHRoaXMucmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB0aGlzLnJlY29yZGVkQmxvYnMucHVzaChldmVudC5kYXRhKTtcblxuICAgIHRoaXMucmVjb3JkZXIuc3RhcnQodGhpcy5jb21wdXRlZFJlY29yZGluZ05vdGlmaWNhdGlvbkludGVydmFsKCkpO1xuXG4gICAgdGhpcy5yZWNvcmRlci5vbnN0YXJ0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJTdGFydGVkLmVtaXQoZSk7XG4gICAgfTtcbiAgICB0aGlzLnJlY29yZGVyLm9uc3RvcCA9IChlKSA9PiB7XG4gICAgICB0aGlzLnJlY29yZGluZ1N0YXRlLmVtaXQodGhpcy5yZWNvcmRlci5zdGF0ZSk7XG4gICAgICB0aGlzLnJlY29yZGVyU3RvcHBlZC5lbWl0KGUpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbnBhdXNlID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICB9O1xuICAgIHRoaXMucmVjb3JkZXIub25yZXN1bWUgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5yZWNvcmRpbmdTdGF0ZS5lbWl0KHRoaXMucmVjb3JkZXIuc3RhdGUpO1xuICAgIH07XG4gICAgdGhpcy5yZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgIHRoaXMucmVjb3JkaW5nU3RhdGUuZW1pdCh0aGlzLnJlY29yZGVyLnN0YXRlKTtcbiAgICAgIHRoaXMucmVjb3JkZXJFcnJvcmVkLmVtaXQoZSk7XG4gICAgfTtcbiAgfTtcblxuICBzdG9wUmVjb3JkaW5nKCkge1xuICAgIGlmICh0aGlzLnJlY29yZGVyLnN0YXRlID09PSAncmVjb3JkaW5nJykgdGhpcy5yZWNvcmRlci5zdG9wKCk7XG5cbiAgICB0aGlzLnByZXZpZXcuc2V0KHRydWUpO1xuICAgIHRoaXMuc3RyZWFtaW5nLnNldChmYWxzZSk7XG4gIH1cblxuICBwYXVzZVJlY29yZGluZygpIHtcbiAgICAvLyBkZWJ1Z2dlcjtcbiAgICBpZiAodGhpcy5yZWNvcmRlci5zdGF0ZSA9PT0gJ3BhdXNlZCcpIHRoaXMucmVjb3JkZXIucmVzdW1lKCk7XG4gICAgZWxzZSB0aGlzLnJlY29yZGVyLnBhdXNlKCk7XG4gIH1cblxuICBleHRyYWN0SW1nID0gbmV3IE9ic2VydmFibGU8RmlsZT4oKHN1YikgPT5cbiAgICB0aGlzLmNhbnZhcygpIS50b0Jsb2IoXG4gICAgICAoYmxvYikgPT4ge1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIHRoaXMubWVkaWFGaWxlLnNldChuZXcgRmlsZShbYmxvYl0sIHRoaXMuY29tcHV0ZWRGaWxlTmFtZSgpKSk7XG4gICAgICAgICAgc3ViLm5leHQodGhpcy5tZWRpYUZpbGUoKSk7XG4gICAgICAgICAgc3ViLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSBzdWIuZXJyb3IoYE5vICR7dGhpcy5zdWJqZWN0KCl9IGZpbGUgZ2VuZXJhdGVkYCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5jb21wdXRlZEZpbGVUeXBlKCksXG4gICAgICAxLFxuICAgICksXG4gICk7XG59XG4iLCI8bG9hZGVyIFtsb2FkaW5nXT1cImxvYWRpbmcoKVwiPlxuICA8ZGl2IGNsYXNzPVwiXCIgW2hpZGRlbl09XCJzdHJlYW1pbmcoKSAhPSB0cnVlIHx8IGlzQmFja2dyb3VuZCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0cmVhbVZpZGVvVGVtcFwiIC8+XG5cbiAgICBAaWYgKCFpc0JhY2tncm91bmQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cIndtLWJ1dHRvbnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyByb3ctY29scy1sZy1hdXRvIGctMyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGFwcC1idG4gW3RleHRdPVwiaXNQaWN0dXJlKCkgPyAnVGFrZSBQaWN0dXJlJyA6ICdSZWNvcmQgVmlkZW8nXCIgKG1jbGljayk9XCJpc1BpY3R1cmUoKSA/IHRha2VQaWN0dXJlKCkgOiBzdGFydFJlY29yZGluZygpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICB0ZXh0PVwie3sgaXNQYXVzZWQoKSA/ICdQbGF5JyA6ICdQYXVzZScgfX0gUmVjb3JkaW5nXCJcbiAgICAgICAgICAgICAgICAobWNsaWNrKT1cInBhdXNlUmVjb3JkaW5nKClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJpc1BhdXNlZCgpID8gJ3BsYXknIDogJ3BhdXNlJ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxhcHAtYnRuIFt0ZXh0XT1cIidTdG9wIFJlY29yZGluZydcIiAobWNsaWNrKT1cInN0b3BSZWNvcmRpbmcoKVwiIHR5cGU9XCJkYW5nZXJcIiBpY29uPVwic3RvcFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI3N0cmVhbVZpZGVvVGVtcD5cbiAgICA8ZGl2IGNsYXNzPVwid20tcmVjb3JkaW5nLXZpZGVvLWNvbnRcIj5cbiAgICAgIDx2aWRlbyAjcmVjb3JkaW5nVmlkZW9UYWcgW3NyY09iamVjdF09XCJzdHJlYW0oKVwiIGF1dG9wbGF5IGNsYXNzPVwid20tcmVjb3JkaW5nLXZpZGVvIHt7IGV4dHJhQ2xhc3MoKSB9fVwiPjwvdmlkZW8+XG4gICAgICBAaWYgKGlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndtLXJlY29yZGluZ0RvdFwiPjwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIEBpZiAoY29tcHV0ZWRQcmV2aWV3KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwid20tcHJldmlld1wiPlxuICAgICAgPGRpdj5cbiAgICAgICAgQGlmIChpc1BpY3R1cmUoKSkge1xuICAgICAgICAgIDxpbWcgY2xhc3M9XCJ3LTEwMFwiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCgpXCIgW3N0eWxlLmhlaWdodC5weF09XCJoZWlnaHQoKVwiIFtzcmNdPVwibWVkaWFGaWxlTGluaygpXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHZpZGVvIGNsYXNzPVwidy0xMDBcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGgoKVwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0KClcIiBjb250cm9scyBhdXRvcGxheSBbc3JjXT1cIm1lZGlhRmlsZUxpbmsoKVwiPjwvdmlkZW8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgcm93IHJvdy1jb2xzLWxnLWF1dG8ganVzdGlmeS1jb250ZW50LWNlbnRlciBnLTNcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8YXBwLWJ0biB0ZXh0PVwiUmV0YWtlIHt7IHN1YmplY3QoKSB9fVwiIHR5cGU9XCJvdXRsaW5lXCIgKG1jbGljayk9XCJyZXRha2UoKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxhcHAtYnRuIChtY2xpY2spPVwic2F2ZSgpXCIgdGV4dD1cIkRvbmVcIiB0eXBlPVwicHJpbWFyeVwiIGljb249XCJzYXZlXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGFwcC1idG4gKG1jbGljayk9XCJjYW5jZWwoKVwiIHRleHQ9XCJDYW5jZWxcIiB0eXBlPVwiZGFuZ2VyXCIgaWNvbj1cImNhbmNlbFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbjwvbG9hZGVyPlxuIl19