rapid-text-editor 1.0.11 → 1.0.12

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.
@@ -637,7 +637,7 @@ export class RapidTextEditorComponent {
637
637
  }
638
638
  }
639
639
  RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
640
- RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "app-rich-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
640
+ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "rapid-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
641
641
  {
642
642
  provide: NG_VALUE_ACCESSOR,
643
643
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -646,7 +646,7 @@ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
646
646
  ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri!important;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%;border-collapse:collapse;margin:5px}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
647
647
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, decorators: [{
648
648
  type: Component,
649
- args: [{ selector: 'app-rich-text-editor', providers: [
649
+ args: [{ selector: 'rapid-text-editor', providers: [
650
650
  {
651
651
  provide: NG_VALUE_ACCESSOR,
652
652
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -668,4 +668,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
668
668
  type: ViewChild,
669
669
  args: ['tableDialog']
670
670
  }] } });
671
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFpQm5DLFlBQW9CLE1BQWlCLEVBQVUsRUFBYyxFQUFTLFFBQW1CLEVBQVUsS0FBaUI7UUFBaEcsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQWYzRyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxXQUFNLEdBQVcsT0FBTyxDQUFDO1FBQ3pCLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDdEIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRzdDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQ25DLFNBQUksR0FBVyxDQUFDLENBQUM7UUFDakIsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osbUJBQWMsR0FBYSxFQUFFLENBQUM7UUE0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QTREO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkIsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtJQUNuRixDQUFDOztzSEFseUJVLHdCQUF3QjswR0FBeEIsd0JBQXdCLDRLQVR4QjtRQUNUO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRiw0UENkSCx3OExBcUpBOzRGRHBJYSx3QkFBd0I7a0JBYnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDOzRCQUN2RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjswS0FLUSxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDZ0MsTUFBTTtzQkFBNUMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNYLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgVGVtcGxhdGVSZWYsIGZvcndhcmRSZWYsIEV2ZW50RW1pdHRlciwgQWZ0ZXJWaWV3SW5pdCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1yaWNoLXRleHQtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxuICBcclxufSlcclxuZXhwb3J0IGNsYXNzIFJhcGlkVGV4dEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbnRlbnRDYXB0dXJlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSBcIjMwMHB4XCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIGNvbnNvbGUubG9nKCdCdWlsZCAtMScpXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnRDYXB0dXJlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZW5hYmxlZC4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZGlzYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snaGVpZ2h0J10gfHwgY2hhbmdlc1snd2lkdGgnXSkge1xyXG4gICAgICB0aGlzLmFwcGx5RGltZW5zaW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseURpbWVuc2lvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3JFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kaW1lbnNpb24nKTtcclxuICAgIGlmICh0aGlzLmhlaWdodCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWR0aCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICd3aWR0aCcsIHRoaXMud2lkdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGVudCA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhcHR1cmVkIENvbnRlbnQgKENoaWxkKTonLCB0aGlzLmVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldENvbnRlbnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICAvL1R3byBXYXkgRGF0YSBCaW5kaW5nIEZ1bmN0aW9uYWxpdHlcclxuXHJcbiAgc2VsZWN0ZWRIZWFkOiBhbnkgPSAnUCc7XHJcbiAgc2VsZWN0ZWRGb250OiBhbnkgPSAnMTQnO1xyXG5cclxuICBwdWJsaWMgb25DaGFuZ2UgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpXHJcbiAgICB9LCAwKTtcclxuICAgIGlmKHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID09ICc8YnI+JyB8fCB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnJyl7XHJcbiAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgdGhpcy5zZWxlY3RlZEZvbnQgPSAnMTQnOyBcclxuICAgIH1cclxuICB9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcblxyXG4gIC8vIENhbGxlZCBieSBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgdmFsdWUgcHJvZ3JhbW1hdGljYWxseVxyXG4gIHdyaXRlVmFsdWUoY29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQgfHwgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZWdpc3RlcnMgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrIHRvIG5vdGlmeSBBbmd1bGFyIG9mIGNvbnRlbnQgY2hhbmdlc1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8vIFJlZ2lzdGVycyB0aGUgb25Ub3VjaGVkIGNhbGxiYWNrIGZvciBibHVyIGV2ZW50c1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcblxyXG4gIG9uQmx1cigpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRGb250U2l6ZShldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuXHJcbiAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgLy8gSWYgaW5zaWRlIGFuIGV4aXN0aW5nIHNwYW4sIHVwZGF0ZSBpdFxyXG4gIGNvbnN0IHBhcmVudCA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50O1xyXG4gIGlmIChcclxuICAgIHBhcmVudCAmJlxyXG4gICAgcGFyZW50LmNsYXNzTGlzdCAmJlxyXG4gICAgQXJyYXkuZnJvbShwYXJlbnQuY2xhc3NMaXN0KS5zb21lKChjOiBzdHJpbmcpID0+IGMuc3RhcnRzV2l0aCgnZnMtJykpXHJcbiAgKSB7XHJcblxyXG4gICAgcGFyZW50LnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICBwYXJlbnQuY2xhc3NOYW1lID0gYGZzLSR7c2l6ZX1gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICByYW5nZS5zdXJyb3VuZENvbnRlbnRzKHNwYW4pO1xyXG4gIH1cclxufVxyXG5cclxuICBzZXRIZWFkaW5nKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3QgdGFnID0gc2VsZWN0LnZhbHVlO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAvLyBHZXQgZWRpdG9yIHJlZmVyZW5jZVxyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIG5ldyBlbGVtZW50IChoZWFkaW5nIG9yIHBhcmFncmFwaClcclxuICAgIGNvbnN0IG5ld0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcblxyXG4gICAgLy8gQXBwbHkgc3R5bGVzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCB0YWdcclxuICAgIHN3aXRjaCAodGFnKSB7XHJcbiAgICAgIGNhc2UgJ0gxJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzMycHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDInOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjhweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMyc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyNHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g0JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDUnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMThweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g2JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdQJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBhbnkgc2VsZWN0ZWQgdGV4dCwgb3IgdXNlIGEgemVyby13aWR0aCBzcGFjZSBpZiBub25lIGlzIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgbmV3RWxlbS50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0VsZW0uaW5uZXJIVE1MID0gJ1xcdTIwMEInOyAvLyBaZXJvLXdpZHRoIHNwYWNlIHRvIGtlZXAgY3Vyc29yIHZpc2libGVcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWxldGUgdGhlIHNlbGVjdGVkIGNvbnRlbnQgYW5kIGluc2VydCBuZXcgaGVhZGluZy9wYXJhZ3JhcGhcclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICByYW5nZS5pbnNlcnROb2RlKG5ld0VsZW0pO1xyXG5cclxuICAgIC8vIFNldCB0aGUgY3Vyc29yIGF0IHRoZSBlbmQgb2YgdGhlIGluc2VydGVkIG5vZGVcclxuICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIG5ld1JhbmdlLnNldFN0YXJ0KG5ld0VsZW0sIG5ld0VsZW0uY2hpbGROb2Rlcy5sZW5ndGgpO1xyXG4gICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuXHJcbiAgICAvLyBSZWZvY3VzIHRoZSBlZGl0b3JcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBmb3JtYXQoY29tbWFuZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgJycpO1xyXG4gIH1cclxuXHJcbiAgLy9JbWFnZSBTZWN0aW9uXHJcblxyXG4gIGFsbG93RHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgaW1hZ2UgZHJhZyBzdGFydFxyXG4gIGRyYWcoZXZlbnQ6IERyYWdFdmVudCwgaW1hZ2VVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKFwidGV4dFwiLCBpbWFnZVVybCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZHJvcCBldmVudCBpbiB0aGUgZWRpdG9yXHJcbiAgZHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgLy8gY29uc3QgaW1hZ2VVcmwgPSBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0XCIpO1xyXG4gICAgLy8gaWYgKGltYWdlVXJsKSB7XHJcbiAgICAvLyAgIHRoaXMuaW5zZXJ0SW1hZ2VJbkVkaXRvcihpbWFnZVVybCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBpbnNlcnRJbWFnZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBmaWxlczogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcblxyXG4gIC8vICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcignTm8gZmlsZXMgc2VsZWN0ZWQuJyk7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBBcnJheS5mcm9tKGZpbGVzKS5mb3JFYWNoKChmaWxlKSA9PiB7XHJcbiAgLy8gICAgIC8vIENoZWNrIGZpbGUgdHlwZVxyXG4gIC8vICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJyAmJiAhZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSB0eXBlOicsIGZpbGUudHlwZSk7XHJcbiAgLy8gICAgICAgcmV0dXJuO1xyXG4gIC8vICAgICB9XHJcblxyXG4gIC8vICAgICAvLyBSZWFkIHRoZSBpbWFnZSBmaWxlXHJcbiAgLy8gICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gIC8vICAgICAgIC8vIEFkZCBpbWFnZSB0byB0aGUgdXBsb2FkZWQgaW1hZ2VzIGxpc3RcclxuICAvLyAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnB1c2goaW1hZ2VVcmwpO1xyXG5cclxuICAvLyAgICAgICAvLyBDYWxsIGluc2VydEltYWdlSW5FZGl0b3IgdG8gYWRkIHRoZSBpbWFnZSB0byB0aGUgZWRpdG9yXHJcbiAgLy8gICAgICAgdGhpcy5pbnNlcnRJbWFnZUluRWRpdG9yKGltYWdlVXJsKTtcclxuICAvLyAgICAgfTtcclxuICAvLyAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgLy8gICB9KTtcclxuICAvLyB9IC0+IGZvciBQTkdcclxuXHJcbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy51cGxvYWRlZEltYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW1hZ2VJbkVkaXRvcihpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZWRpdG9yJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgaW1hZ2UgZWxlbWVudFxyXG4gICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuXHJcbiAgICAvLyBDcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCB0aGUgaW1hZ2UgdG8gYWxsb3cgcmVzaXppbmdcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7ICAvLyBFbnN1cmVzIHRoZSB3cmFwcGVyIG9ubHkgdGFrZXMgdXAgc3BhY2UgZm9yIHRoZSBpbWFnZVxyXG4gICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSAnNXB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7IC8vIE9wdGlvbmFsIGJvcmRlciB0byBpbmRpY2F0ZSB0aGUgaW1hZ2UgYXJlYVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgaW1hZ2UgdG8gdGhlIHdyYXBwZXJcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTtcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHdyYXBwZXIgdG8gdGhlIGVkaXRvclxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG5cclxuICAgIC8vIE1ha2UgdGhlIGltYWdlIHJlc2l6YWJsZVxyXG4gICAgdGhpcy5tYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlciwgaW1nKTtcclxuXHJcbiAgICAvLyBPcHRpb25hbGx5LCBhZGQgYSB0ZXh0IG5vZGUgdG8gbWFpbnRhaW4gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGVuZGluZyB0aGUgaW1hZ2VcclxuICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTsgIC8vIEludmlzaWJsZSBjaGFyYWN0ZXIgdG8gbWFpbnRhaW4gcG9zaXRpb25cclxuICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFrZUltYWdlUmVzaXphYmxlKHdyYXBwZXI6IEhUTUxFbGVtZW50LCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgIGxldCBzdGFydFkgPSAwO1xyXG4gICAgbGV0IHN0YXJ0V2lkdGggPSAwO1xyXG4gICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAvLyBDcmVhdGUgcmVzaXplIGhhbmRsZXMgZm9yIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICBjdXJzb3I6IHN0cmluZyxcclxuICAgICAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICApID0+IHtcclxuICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS53aWR0aCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmhlaWdodCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgaGFuZGxlLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcclxuICAgICAgT2JqZWN0LmFzc2lnbihoYW5kbGUuc3R5bGUsIHBvc2l0aW9uU3R5bGVzKTtcclxuXHJcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICBpc1Jlc2l6aW5nID0gdHJ1ZTtcclxuICAgICAgICBzdGFydFggPSByZXNpemVFdmVudC5jbGllbnRYO1xyXG4gICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgc3RhcnRXaWR0aCA9IGltZy5vZmZzZXRXaWR0aDtcclxuICAgICAgICBzdGFydEhlaWdodCA9IGltZy5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzUmVzaXppbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gbW92ZUV2ZW50LmNsaWVudFggLSBzdGFydFg7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICByZXNpemVDYWxsYmFjayhkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIHJlc2l6aW5nIGhhbmRsZXMgdG8gdGhlIHdyYXBwZXIgZm9yIHRoZSBpbWFnZVxyXG4gICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAnbnctcmVzaXplJyxcclxuICAgICAgeyB0b3A6ICctNXB4JywgbGVmdDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggLSBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCAtIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICB7IGJvdHRvbTogJy01cHgnLCByaWdodDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCArIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaW5zZXJ0SW1hZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0Py5maWxlcykge1xyXG4gICAgICBBcnJheS5mcm9tKGlucHV0LmZpbGVzKS5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGltYWdlVXJsID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEltYWdlcy5wdXNoKGltYWdlVXJsKTsgLy8gU3RvcmUgaW1hZ2UgVVJMIGluIHRoZSBhcnJheVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNvbnZlcnRJbWFnZShmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJykge1xyXG4gICAgICAgIHJlc29sdmUoZmlsZSk7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBpZiBpdCdzIG5vdCBhIFBOR1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgIGlmICghY3R4KSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjYW52YXMudG9CbG9iKFxyXG4gICAgICAgICAgICBibG9iID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QganBnRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnBuZyQvLCAnLmpwZycpLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoanBnRmlsZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb252ZXJ0IFBORyB0byBKUEcnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAnaW1hZ2UvanBlZycsXHJcbiAgICAgICAgICAgIDAuOTUgLy8gUXVhbGl0eSBmYWN0b3IgZm9yIEpQRUdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgdGhlIGZpbGUnKSk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICAvLyBpbnNlcnRJbWFnZUJ5RHJhZyhpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZWRpdG9yJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoIWVkaXRvcikge1xyXG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAvLyAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAvLyAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAvLyAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAvLyAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgLy8gICBpbWcuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG5cclxuICAvLyAgIGVkaXRvci5hcHBlbmRDaGlsZChpbWcpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIGluc2VydEltYWdlVG9FZGl0b3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB3cmFwcGVyLmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5ib3JkZXIgPSAnMXB4IGRhc2hlZCAjY2NjJztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLm1hcmdpbiA9ICcxMHB4JztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSAnNXB4JztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLmJvcmRlckJsb2NrQ29sb3IgPSAnIzAwN0JGRic7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG5cclxuXHJcbiAgICAgICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRZID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICAgICAgY3Vyc29yOiBzdHJpbmcsXHJcbiAgICAgICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUud2lkdGggPSAnMTBweCc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaXNSZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBpbWcub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpc1Jlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgcmVzaXplQ2FsbGJhY2soZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAgICAgJ253LXJlc2l6ZScsXHJcbiAgICAgICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoIC0gZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICAgICAgeyBib3R0b206ICctNXB4JywgcmlnaHQ6ICctNXB4JyB9LFxyXG4gICAgICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gYCR7c3RhcnRIZWlnaHQgKyBkZWx0YVl9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG5cclxuICAgICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUyMDBCJyk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgb3BlblRhYmxlRGlhbG9nKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnJvd3MgPSAxO1xyXG4gICAgdGhpcy5jb2xzID0gMTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMudGFibGVEaWFsb2csIHtcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IGAke2V2ZW50LmNsaWVudFl9cHhgLFxyXG4gICAgICAgIGxlZnQ6IGAke2V2ZW50LmNsaWVudFh9cHhgLFxyXG4gICAgICB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShyZXN1bHQucm93cywgcmVzdWx0LmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByZXZpZXcoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29scyA9IGNvbHM7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0aW9uKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIGRpYWxvZ1JlZjogYW55KSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xJbmRleDtcclxuICAgIHRoaXMucm93cyA9IHJvd0luZGV4O1xyXG4gICAgZGlhbG9nUmVmLmNsb3NlKHsgcm93czogdGhpcy5yb3dzLCBjb2xzOiB0aGlzLmNvbHMgfSk7IC8vIENsb3NlIGRpYWxvZyB3aXRoIHNlbGVjdGlvblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBtYWtlRmlyc3RSb3dIZWFkZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCB0YWJsZSB0byB0aGUgc2VsZWN0aW9uXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZmluZENsb3Nlc3RUYWJsZShzZWxlY3RlZE5vZGUpO1xyXG5cclxuICAgIGlmICghdGFibGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnZlcnQgdGhlIGZpcnN0IHJvdyBjZWxscyB0byBoZWFkZXIgY2VsbHNcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gdGFibGUucm93c1swXTtcclxuICAgIGlmIChmaXJzdFJvdykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldO1xyXG4gICAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICB0aC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTDtcclxuICAgICAgICB0aC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICB0aC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0YxRjFGMCc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSAnY29sbGFwc2UnO1xyXG4gICAgICAgIHRoLnN0eWxlLnBhZGRpbmcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5wYWRkaW5nOyAvLyBSZXRhaW4gcGFkZGluZ1xyXG4gICAgICAgIHRoLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkud2lkdGg7IC8vIFJldGFpbiB3aWR0aFxyXG4gICAgICAgIHRoLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLmhlaWdodDtcclxuICAgICAgICBmaXJzdFJvdy5yZXBsYWNlQ2hpbGQodGgsIGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRDbG9zZXN0VGFibGUobm9kZTogTm9kZSk6IEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsIHtcclxuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50KSB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAnVEFCTEUnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIGluc2VydFRhYmxlKHJvd3M6IHN0cmluZywgY29sczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dDb3VudCA9IHBhcnNlSW50KHJvd3MsIDEwKTtcclxuICAgIGNvbnN0IGNvbENvdW50ID0gcGFyc2VJbnQoY29scywgMTApO1xyXG5cclxuICAgIGlmIChpc05hTihyb3dDb3VudCkgfHwgaXNOYU4oY29sQ291bnQpIHx8IHJvd0NvdW50IDwgMSB8fCBjb2xDb3VudCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gRW5zdXJlIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBBcHBlbmQgdGhlIHRhYmxlIGF0IHRoZSBlbmQgaWYgc2VsZWN0aW9uIGlzIG91dHNpZGUgZWRpdG9yXHJcbiAgICAgIHRoaXMuYXBwZW5kVGFibGUoZWRpdG9yLCByb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvY2VlZCB0byBpbnNlcnQgdGhlIHRhYmxlIGlmIHNlbGVjdGlvbiBpcyB2YWxpZFxyXG4gICAgY29uc3QgdGFibGVIVE1MID0gdGhpcy5jcmVhdGVUYWJsZUhUTUwocm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIGNvbnRlbnRcclxuXHJcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0ZW1wRGl2LmlubmVySFRNTCA9IHRhYmxlSFRNTDtcclxuXHJcbiAgICByYW5nZS5pbnNlcnROb2RlKHRlbXBEaXYuZmlyc3RDaGlsZCEpOyAvLyBJbnNlcnQgdGhlIHRhYmxlXHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjZWxsIG9mIHRoZSBuZXcgdGFibGVcclxuICAgIHRoaXMuc2V0Q3Vyc29yVG9GaXJzdENlbGwodGVtcERpdi5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIGZ1bmN0aW9uOiBDcmVhdGUgdGFibGUgSFRNTFxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50OiBudW1iZXIsIGNvbENvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhYmxlSFRNTCA9ICc8dGFibGUgYm9yZGVyPVwiMVwiIHN0eWxlPVwiXCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbWluLXdpZHRoOiAxLjVlbTsgaGVpZ2h0OiAyZW07IHBhZGRpbmc6IC40ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEhlbHBlciBmdW5jdGlvbjogQXBwZW5kIGEgdGFibGUgYXQgdGhlIGVuZCBvZiB0aGUgZWRpdG9yXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcblxyXG4gICAgLy8gU2V0IGN1cnNvciBpbnNpZGUgdGhlIGZpcnN0IGNlbGwgb2YgdGhlIG5ldyB0YWJsZVxyXG4gICAgY29uc3QgbGFzdEluc2VydGVkVGFibGUgPSBlZGl0b3IucXVlcnlTZWxlY3RvcigndGFibGU6bGFzdC1jaGlsZCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy5zZXRDdXJzb3JUb0ZpcnN0Q2VsbChsYXN0SW5zZXJ0ZWRUYWJsZSk7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBmdW5jdGlvbjogQ2hlY2sgaWYgc2VsZWN0aW9uIGlzIGluc2lkZSB0aGUgZWRpdG9yXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAvLyBUcmF2ZXJzZSB1cCB0byBzZWUgaWYgdGhlIG5vZGUgYmVsb25ncyB0byB0aGUgZWRpdG9yXHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBpZiAobm9kZSA9PT0gZWRpdG9yKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBIZWxwZXIgZnVuY3Rpb246IE1vdmUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjZWxsXHJcbiAgLy8gcHJpdmF0ZSBzZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZTogSFRNTEVsZW1lbnQpIHtcclxuICAvLyAgIGNvbnN0IGZpcnN0Q2VsbCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gIC8vICAgaWYgKGZpcnN0Q2VsbCkge1xyXG4gIC8vICAgICBjb25zdCBuZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgLy8gICAgIG5ld1JhbmdlLnNldFN0YXJ0KGZpcnN0Q2VsbCwgMCk7IC8vIFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNlbGxcclxuICAvLyAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgIHNlbGVjdGlvbiEucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgLy8gICAgIHNlbGVjdGlvbiEuYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgICAvLyBFbnN1cmUgdGhlIGNlbGwgaXMgY29udGVudGVkaXRhYmxlXHJcbiAgICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuXHJcbiAgICAgICAgLy8gRm9jdXMgdGhlIGNlbGxcclxuICAgICAgICBmaXJzdENlbGwuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgcmFuZ2UgYW5kIHBsYWNlIHRoZSBjdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjZWxsXHJcbiAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIG5ld1JhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhmaXJzdENlbGwpOyAvLyBTZWxlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBjZWxsXHJcbiAgICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcblxyXG4gICAgLy8gRm9yIGRlbW9uc3RyYXRpb24sIHlvdSBjYW4gbG9nIGl0IG9yIHByb2Nlc3MgaXQgYXMgbmVlZGVkXHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG5cclxuICAgIC8vIEV4YW1wbGU6IFlvdSBjb3VsZCBzZW5kIHRoaXMgZGF0YSB0byBhIHNlcnZlciBvciB1c2UgaXQgZWxzZXdoZXJlIGluIHlvdXIgYXBwbGljYXRpb25cclxuICAgIC8vIHRoaXMueW91clNlcnZpY2Uuc3VibWl0Q29udGVudCh7IGNvbnRlbnQgfSk7IC8vIFJlcGxhY2Ugd2l0aCB5b3VyIHNlcnZpY2UgY2FsbFxyXG4gIH1cclxuXHJcbiB9XHJcbiIsIjxkaXYgY2xhc3M9XCJkaW1lbnNpb25cIj5cclxuXHJcblxyXG48ZGl2IGNsYXNzPVwicmljaC10ZXh0LWVkaXRvclwiPlxyXG4gIDwhLS0gVG9vbGJhciAtLT5cclxuICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiPlxyXG5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSGVhZFwiIChjaGFuZ2UpPVwic2V0SGVhZGluZygkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkgxXCIgc3R5bGU9XCJmb250LXNpemU6IDMycHg7IGZvbnQtd2VpZ2h0OiBib2xkO1wiPkgxPC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSDJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI+SDI8L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg0XCIgc3R5bGU9XCJmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiBib2xkO1wiPkg0PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSDVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IDYwMDtcIj5INTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuXHJcblxyXG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIChjaGFuZ2UpPVwib25DaGFuZ2UobnVsbClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiIChjaGFuZ2UpPVwic2V0Rm9udFNpemUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEyXCI+MTJweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEzXCI+MTNweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE0XCIgc2VsZWN0ZWQ+MTRweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE2XCI+MTZweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE4XCI+MThweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwXCI+MjBweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI0XCI+MjRweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI4XCI+MjhweDwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkJvbGRcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfYm9sZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkl0YWxpY1wiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9pdGFsaWM8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbmRlcmxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfdW5kZXJsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAgKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJTdHJpa2V0aHJvdWdoXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+c3RyaWtldGhyb3VnaF9zPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJBbGlnbiBMZWZ0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlDZW50ZXInKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQ2VudGVyXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeVJpZ2h0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIFJpZ2h0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJKdXN0aWZ5XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiVW5vcmRlcmVkIExpc3RcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0T3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiT3JkZXJlZCBMaXN0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfbnVtYmVyZWQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b24gY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiSW5zZXJ0IEltYWdlXCIgdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImluc2VydEltYWdlVG9FZGl0b3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9wYWNpdHk6IDA7IGN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIj5pbnNlcnRfcGhvdG9fb3V0bGluZWQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblRhYmxlRGlhbG9nKCRldmVudClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiQ2hvb3NlIHRhYmxlIHJvd3MgYW5kIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5ib3JkZXJfYWxsPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1iLTFcIiAoY2xpY2spPVwibWFrZUZpcnN0Um93SGVhZGVyKClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiTWFrZSBIZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgICBwYWdlX2hlYWRlclxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEVkaXRhYmxlIEFyZWEgLS0+XHJcbiAgIDwhLS0gKGtleXByZXNzKT1cIm9uQ29udGVudENoYW5nZSgpXCIgbmVlZCB0byBiZSBpbmNsdWRlZCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZWRpdG9yXCIgaWQ9XCJlZGl0b3JcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgI2VkaXRvciAgKGlucHV0KT1cInN1Ym1pdENvbnRlbnQoKVwiIChibHVyKT1cIm9uQmx1cigpXCIgKGRyb3ApPVwiZHJvcCgkZXZlbnQpXCIgKGRyYWdvdmVyKT1cImFsbG93RHJvcCgkZXZlbnQpXCIgPlxyXG4gICAgICA8IS0tIFlvdXIgY29udGVudCBnb2VzIGhlcmUgLS0+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJzdWJtaXRcIiAoY2xpY2spPVwic3VibWl0Q29udGVudCgpXCI+U3VibWl0PC9idXR0b24+IC0tPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGFibGVEaWFsb2cgbGV0LWRpYWxvZ1JlZj1cImRpYWxvZ1JlZlwiPlxyXG48aDIgbWF0LWRpYWxvZy10aXRsZT5DaG9vc2UgVGFibGUgU2l6ZTwvaDI+XHJcbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIGdyaWQ7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2dyaWQtaXRlbSc6IHRydWUsXHJcbiAgICAgICAgJ2hpZ2hsaWdodGVkJzogaSAlIDcgPCBjb2xzICYmIE1hdGguZmxvb3IoaSAvIDcpIDwgcm93c1xyXG4gICAgICB9XCJcclxuICAgICAgKG1vdXNlZW50ZXIpPVwidXBkYXRlUHJldmlldyhpICUgNyArIDEsIE1hdGguZmxvb3IoaSAvIDcpICsgMSlcIlxyXG4gICAgICAoY2xpY2spPVwidXBkYXRlU2VsZWN0aW9uKGkgJSA3ICsgMSwgTWF0aC5mbG9vcihpIC8gNykgKyAxLCBkaWFsb2dSZWYpXCJcclxuICAgID48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8cD57eyByb3dzIH19IHgge3sgY29scyB9fSA8L3A+XHJcbjwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSA8ZGl2PlxyXG4gIDxpbnB1dCBjbGFzcz1cIm10LTJcIiB0eXBlPVwiZmlsZVwiIHBsYWNlaG9sZGVyPVwiVXBsb2FkIHlvdXIgaW1hZ2VzIGhlcmUuLi5cIiAoY2hhbmdlKT1cImluc2VydEltYWdlKCRldmVudClcIiBhY2NlcHQ9XCJpbWFnZS9wbmcsaW1hZ2UvKlwiIG11bHRpcGxlICAvPlxyXG4gIDxkaXYgY2xhc3M9XCJ1cGxvYWRlZC1pbWFnZXNcIiAqbmdJZj1cInVwbG9hZGVkSW1hZ2VzLmxlbmd0aCA+IDBcIj5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGltYWdlVXJsIG9mIHVwbG9hZGVkSW1hZ2VzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCI+XHJcbiAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybFwiIGFsdD1cIlVwbG9hZGVkIEltYWdlXCJcclxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIiAgd2lkdGg9XCIxMDBweFwiIGhlaWdodD1cIjEwMHB4XCJcclxuICAgICAgICAgIChkcmFnc3RhcnQpPVwiZHJhZygkZXZlbnQsIGltYWdlVXJsKVwiIC8+XHJcbiAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImNvbG9yOiByZWQ7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVwiIChjbGljayk9XCJyZW1vdmVJbWFnZShpKVwiPmNhbmNlbDwvbWF0LWljb24+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIl19
671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFpQm5DLFlBQW9CLE1BQWlCLEVBQVUsRUFBYyxFQUFTLFFBQW1CLEVBQVUsS0FBaUI7UUFBaEcsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQWYzRyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxXQUFNLEdBQVcsT0FBTyxDQUFDO1FBQ3pCLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDdEIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRzdDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQ25DLFNBQUksR0FBVyxDQUFDLENBQUM7UUFDakIsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osbUJBQWMsR0FBYSxFQUFFLENBQUM7UUE0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QTREO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkIsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtJQUNuRixDQUFDOztzSEFseUJVLHdCQUF3QjswR0FBeEIsd0JBQXdCLHlLQVR4QjtRQUNUO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRiw0UENkSCx3OExBcUpBOzRGRHBJYSx3QkFBd0I7a0JBYnBDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUF5QixDQUFDOzRCQUN2RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjswS0FLUSxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFDZ0MsTUFBTTtzQkFBNUMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNYLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgVGVtcGxhdGVSZWYsIGZvcndhcmRSZWYsIEV2ZW50RW1pdHRlciwgQWZ0ZXJWaWV3SW5pdCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3JhcGlkLXRleHQtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxuICBcclxufSlcclxuZXhwb3J0IGNsYXNzIFJhcGlkVGV4dEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbnRlbnRDYXB0dXJlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSBcIjMwMHB4XCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIGNvbnNvbGUubG9nKCdCdWlsZCAtMScpXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnRDYXB0dXJlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZW5hYmxlZC4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZGlzYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snaGVpZ2h0J10gfHwgY2hhbmdlc1snd2lkdGgnXSkge1xyXG4gICAgICB0aGlzLmFwcGx5RGltZW5zaW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseURpbWVuc2lvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3JFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kaW1lbnNpb24nKTtcclxuICAgIGlmICh0aGlzLmhlaWdodCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWR0aCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICd3aWR0aCcsIHRoaXMud2lkdGgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGVudCA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhcHR1cmVkIENvbnRlbnQgKENoaWxkKTonLCB0aGlzLmVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldENvbnRlbnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICAvL1R3byBXYXkgRGF0YSBCaW5kaW5nIEZ1bmN0aW9uYWxpdHlcclxuXHJcbiAgc2VsZWN0ZWRIZWFkOiBhbnkgPSAnUCc7XHJcbiAgc2VsZWN0ZWRGb250OiBhbnkgPSAnMTQnO1xyXG5cclxuICBwdWJsaWMgb25DaGFuZ2UgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2codGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpXHJcbiAgICB9LCAwKTtcclxuICAgIGlmKHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID09ICc8YnI+JyB8fCB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnJyl7XHJcbiAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgdGhpcy5zZWxlY3RlZEZvbnQgPSAnMTQnOyBcclxuICAgIH1cclxuICB9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcblxyXG4gIC8vIENhbGxlZCBieSBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgdmFsdWUgcHJvZ3JhbW1hdGljYWxseVxyXG4gIHdyaXRlVmFsdWUoY29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQgfHwgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZWdpc3RlcnMgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrIHRvIG5vdGlmeSBBbmd1bGFyIG9mIGNvbnRlbnQgY2hhbmdlc1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8vIFJlZ2lzdGVycyB0aGUgb25Ub3VjaGVkIGNhbGxiYWNrIGZvciBibHVyIGV2ZW50c1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcblxyXG4gIG9uQmx1cigpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRGb250U2l6ZShldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuXHJcbiAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgLy8gSWYgaW5zaWRlIGFuIGV4aXN0aW5nIHNwYW4sIHVwZGF0ZSBpdFxyXG4gIGNvbnN0IHBhcmVudCA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50O1xyXG4gIGlmIChcclxuICAgIHBhcmVudCAmJlxyXG4gICAgcGFyZW50LmNsYXNzTGlzdCAmJlxyXG4gICAgQXJyYXkuZnJvbShwYXJlbnQuY2xhc3NMaXN0KS5zb21lKChjOiBzdHJpbmcpID0+IGMuc3RhcnRzV2l0aCgnZnMtJykpXHJcbiAgKSB7XHJcblxyXG4gICAgcGFyZW50LnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICBwYXJlbnQuY2xhc3NOYW1lID0gYGZzLSR7c2l6ZX1gO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICByYW5nZS5zdXJyb3VuZENvbnRlbnRzKHNwYW4pO1xyXG4gIH1cclxufVxyXG5cclxuICBzZXRIZWFkaW5nKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3QgdGFnID0gc2VsZWN0LnZhbHVlO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAvLyBHZXQgZWRpdG9yIHJlZmVyZW5jZVxyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIG5ldyBlbGVtZW50IChoZWFkaW5nIG9yIHBhcmFncmFwaClcclxuICAgIGNvbnN0IG5ld0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcblxyXG4gICAgLy8gQXBwbHkgc3R5bGVzIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCB0YWdcclxuICAgIHN3aXRjaCAodGFnKSB7XHJcbiAgICAgIGNhc2UgJ0gxJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzMycHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDInOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjhweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMyc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyNHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g0JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDUnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMThweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g2JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdQJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBhbnkgc2VsZWN0ZWQgdGV4dCwgb3IgdXNlIGEgemVyby13aWR0aCBzcGFjZSBpZiBub25lIGlzIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgbmV3RWxlbS50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0VsZW0uaW5uZXJIVE1MID0gJ1xcdTIwMEInOyAvLyBaZXJvLXdpZHRoIHNwYWNlIHRvIGtlZXAgY3Vyc29yIHZpc2libGVcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWxldGUgdGhlIHNlbGVjdGVkIGNvbnRlbnQgYW5kIGluc2VydCBuZXcgaGVhZGluZy9wYXJhZ3JhcGhcclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICByYW5nZS5pbnNlcnROb2RlKG5ld0VsZW0pO1xyXG5cclxuICAgIC8vIFNldCB0aGUgY3Vyc29yIGF0IHRoZSBlbmQgb2YgdGhlIGluc2VydGVkIG5vZGVcclxuICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIG5ld1JhbmdlLnNldFN0YXJ0KG5ld0VsZW0sIG5ld0VsZW0uY2hpbGROb2Rlcy5sZW5ndGgpO1xyXG4gICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuXHJcbiAgICAvLyBSZWZvY3VzIHRoZSBlZGl0b3JcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBmb3JtYXQoY29tbWFuZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgJycpO1xyXG4gIH1cclxuXHJcbiAgLy9JbWFnZSBTZWN0aW9uXHJcblxyXG4gIGFsbG93RHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgaW1hZ2UgZHJhZyBzdGFydFxyXG4gIGRyYWcoZXZlbnQ6IERyYWdFdmVudCwgaW1hZ2VVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKFwidGV4dFwiLCBpbWFnZVVybCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZHJvcCBldmVudCBpbiB0aGUgZWRpdG9yXHJcbiAgZHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgLy8gY29uc3QgaW1hZ2VVcmwgPSBldmVudC5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0XCIpO1xyXG4gICAgLy8gaWYgKGltYWdlVXJsKSB7XHJcbiAgICAvLyAgIHRoaXMuaW5zZXJ0SW1hZ2VJbkVkaXRvcihpbWFnZVVybCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBpbnNlcnRJbWFnZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBmaWxlczogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XHJcblxyXG4gIC8vICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcignTm8gZmlsZXMgc2VsZWN0ZWQuJyk7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBBcnJheS5mcm9tKGZpbGVzKS5mb3JFYWNoKChmaWxlKSA9PiB7XHJcbiAgLy8gICAgIC8vIENoZWNrIGZpbGUgdHlwZVxyXG4gIC8vICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJyAmJiAhZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSB0eXBlOicsIGZpbGUudHlwZSk7XHJcbiAgLy8gICAgICAgcmV0dXJuO1xyXG4gIC8vICAgICB9XHJcblxyXG4gIC8vICAgICAvLyBSZWFkIHRoZSBpbWFnZSBmaWxlXHJcbiAgLy8gICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gIC8vICAgICAgIC8vIEFkZCBpbWFnZSB0byB0aGUgdXBsb2FkZWQgaW1hZ2VzIGxpc3RcclxuICAvLyAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnB1c2goaW1hZ2VVcmwpO1xyXG5cclxuICAvLyAgICAgICAvLyBDYWxsIGluc2VydEltYWdlSW5FZGl0b3IgdG8gYWRkIHRoZSBpbWFnZSB0byB0aGUgZWRpdG9yXHJcbiAgLy8gICAgICAgdGhpcy5pbnNlcnRJbWFnZUluRWRpdG9yKGltYWdlVXJsKTtcclxuICAvLyAgICAgfTtcclxuICAvLyAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgLy8gICB9KTtcclxuICAvLyB9IC0+IGZvciBQTkdcclxuXHJcbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy51cGxvYWRlZEltYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW1hZ2VJbkVkaXRvcihpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZWRpdG9yJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgaW1hZ2UgZWxlbWVudFxyXG4gICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuXHJcbiAgICAvLyBDcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCB0aGUgaW1hZ2UgdG8gYWxsb3cgcmVzaXppbmdcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7ICAvLyBFbnN1cmVzIHRoZSB3cmFwcGVyIG9ubHkgdGFrZXMgdXAgc3BhY2UgZm9yIHRoZSBpbWFnZVxyXG4gICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSAnNXB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7IC8vIE9wdGlvbmFsIGJvcmRlciB0byBpbmRpY2F0ZSB0aGUgaW1hZ2UgYXJlYVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgaW1hZ2UgdG8gdGhlIHdyYXBwZXJcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTtcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHdyYXBwZXIgdG8gdGhlIGVkaXRvclxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG5cclxuICAgIC8vIE1ha2UgdGhlIGltYWdlIHJlc2l6YWJsZVxyXG4gICAgdGhpcy5tYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlciwgaW1nKTtcclxuXHJcbiAgICAvLyBPcHRpb25hbGx5LCBhZGQgYSB0ZXh0IG5vZGUgdG8gbWFpbnRhaW4gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGVuZGluZyB0aGUgaW1hZ2VcclxuICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTsgIC8vIEludmlzaWJsZSBjaGFyYWN0ZXIgdG8gbWFpbnRhaW4gcG9zaXRpb25cclxuICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFrZUltYWdlUmVzaXphYmxlKHdyYXBwZXI6IEhUTUxFbGVtZW50LCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgIGxldCBzdGFydFkgPSAwO1xyXG4gICAgbGV0IHN0YXJ0V2lkdGggPSAwO1xyXG4gICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAvLyBDcmVhdGUgcmVzaXplIGhhbmRsZXMgZm9yIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICBjdXJzb3I6IHN0cmluZyxcclxuICAgICAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICApID0+IHtcclxuICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS53aWR0aCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmhlaWdodCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgaGFuZGxlLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcclxuICAgICAgT2JqZWN0LmFzc2lnbihoYW5kbGUuc3R5bGUsIHBvc2l0aW9uU3R5bGVzKTtcclxuXHJcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICBpc1Jlc2l6aW5nID0gdHJ1ZTtcclxuICAgICAgICBzdGFydFggPSByZXNpemVFdmVudC5jbGllbnRYO1xyXG4gICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgc3RhcnRXaWR0aCA9IGltZy5vZmZzZXRXaWR0aDtcclxuICAgICAgICBzdGFydEhlaWdodCA9IGltZy5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzUmVzaXppbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gbW92ZUV2ZW50LmNsaWVudFggLSBzdGFydFg7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICByZXNpemVDYWxsYmFjayhkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIHJlc2l6aW5nIGhhbmRsZXMgdG8gdGhlIHdyYXBwZXIgZm9yIHRoZSBpbWFnZVxyXG4gICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAnbnctcmVzaXplJyxcclxuICAgICAgeyB0b3A6ICctNXB4JywgbGVmdDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggLSBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCAtIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICB7IGJvdHRvbTogJy01cHgnLCByaWdodDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCArIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaW5zZXJ0SW1hZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKGlucHV0Py5maWxlcykge1xyXG4gICAgICBBcnJheS5mcm9tKGlucHV0LmZpbGVzKS5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGltYWdlVXJsID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlZEltYWdlcy5wdXNoKGltYWdlVXJsKTsgLy8gU3RvcmUgaW1hZ2UgVVJMIGluIHRoZSBhcnJheVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNvbnZlcnRJbWFnZShmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJykge1xyXG4gICAgICAgIHJlc29sdmUoZmlsZSk7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBpZiBpdCdzIG5vdCBhIFBOR1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgIGlmICghY3R4KSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjYW52YXMudG9CbG9iKFxyXG4gICAgICAgICAgICBibG9iID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QganBnRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnBuZyQvLCAnLmpwZycpLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoanBnRmlsZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb252ZXJ0IFBORyB0byBKUEcnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAnaW1hZ2UvanBlZycsXHJcbiAgICAgICAgICAgIDAuOTUgLy8gUXVhbGl0eSBmYWN0b3IgZm9yIEpQRUdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgdGhlIGZpbGUnKSk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICAvLyBpbnNlcnRJbWFnZUJ5RHJhZyhpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZWRpdG9yJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgLy8gICBpZiAoIWVkaXRvcikge1xyXG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAvLyAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAvLyAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAvLyAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAvLyAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgLy8gICBpbWcuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG5cclxuICAvLyAgIGVkaXRvci5hcHBlbmRDaGlsZChpbWcpO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIGluc2VydEltYWdlVG9FZGl0b3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB3cmFwcGVyLmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5ib3JkZXIgPSAnMXB4IGRhc2hlZCAjY2NjJztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLm1hcmdpbiA9ICcxMHB4JztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSAnNXB4JztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLmJvcmRlckJsb2NrQ29sb3IgPSAnIzAwN0JGRic7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG5cclxuXHJcbiAgICAgICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRZID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICAgICAgY3Vyc29yOiBzdHJpbmcsXHJcbiAgICAgICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUud2lkdGggPSAnMTBweCc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaXNSZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBpbWcub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpc1Jlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgcmVzaXplQ2FsbGJhY2soZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAgICAgJ253LXJlc2l6ZScsXHJcbiAgICAgICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoIC0gZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICAgICAgeyBib3R0b206ICctNXB4JywgcmlnaHQ6ICctNXB4JyB9LFxyXG4gICAgICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gYCR7c3RhcnRIZWlnaHQgKyBkZWx0YVl9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG5cclxuICAgICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUyMDBCJyk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgb3BlblRhYmxlRGlhbG9nKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnJvd3MgPSAxO1xyXG4gICAgdGhpcy5jb2xzID0gMTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMudGFibGVEaWFsb2csIHtcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IGAke2V2ZW50LmNsaWVudFl9cHhgLFxyXG4gICAgICAgIGxlZnQ6IGAke2V2ZW50LmNsaWVudFh9cHhgLFxyXG4gICAgICB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShyZXN1bHQucm93cywgcmVzdWx0LmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByZXZpZXcoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29scyA9IGNvbHM7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0aW9uKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIGRpYWxvZ1JlZjogYW55KSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xJbmRleDtcclxuICAgIHRoaXMucm93cyA9IHJvd0luZGV4O1xyXG4gICAgZGlhbG9nUmVmLmNsb3NlKHsgcm93czogdGhpcy5yb3dzLCBjb2xzOiB0aGlzLmNvbHMgfSk7IC8vIENsb3NlIGRpYWxvZyB3aXRoIHNlbGVjdGlvblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBtYWtlRmlyc3RSb3dIZWFkZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCB0YWJsZSB0byB0aGUgc2VsZWN0aW9uXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZmluZENsb3Nlc3RUYWJsZShzZWxlY3RlZE5vZGUpO1xyXG5cclxuICAgIGlmICghdGFibGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnZlcnQgdGhlIGZpcnN0IHJvdyBjZWxscyB0byBoZWFkZXIgY2VsbHNcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gdGFibGUucm93c1swXTtcclxuICAgIGlmIChmaXJzdFJvdykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldO1xyXG4gICAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICB0aC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTDtcclxuICAgICAgICB0aC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICB0aC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0YxRjFGMCc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSAnY29sbGFwc2UnO1xyXG4gICAgICAgIHRoLnN0eWxlLnBhZGRpbmcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5wYWRkaW5nOyAvLyBSZXRhaW4gcGFkZGluZ1xyXG4gICAgICAgIHRoLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkud2lkdGg7IC8vIFJldGFpbiB3aWR0aFxyXG4gICAgICAgIHRoLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLmhlaWdodDtcclxuICAgICAgICBmaXJzdFJvdy5yZXBsYWNlQ2hpbGQodGgsIGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRDbG9zZXN0VGFibGUobm9kZTogTm9kZSk6IEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsIHtcclxuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50KSB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAnVEFCTEUnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIGluc2VydFRhYmxlKHJvd3M6IHN0cmluZywgY29sczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dDb3VudCA9IHBhcnNlSW50KHJvd3MsIDEwKTtcclxuICAgIGNvbnN0IGNvbENvdW50ID0gcGFyc2VJbnQoY29scywgMTApO1xyXG5cclxuICAgIGlmIChpc05hTihyb3dDb3VudCkgfHwgaXNOYU4oY29sQ291bnQpIHx8IHJvd0NvdW50IDwgMSB8fCBjb2xDb3VudCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gRW5zdXJlIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICAvLyBBcHBlbmQgdGhlIHRhYmxlIGF0IHRoZSBlbmQgaWYgc2VsZWN0aW9uIGlzIG91dHNpZGUgZWRpdG9yXHJcbiAgICAgIHRoaXMuYXBwZW5kVGFibGUoZWRpdG9yLCByb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvY2VlZCB0byBpbnNlcnQgdGhlIHRhYmxlIGlmIHNlbGVjdGlvbiBpcyB2YWxpZFxyXG4gICAgY29uc3QgdGFibGVIVE1MID0gdGhpcy5jcmVhdGVUYWJsZUhUTUwocm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIGNvbnRlbnRcclxuXHJcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0ZW1wRGl2LmlubmVySFRNTCA9IHRhYmxlSFRNTDtcclxuXHJcbiAgICByYW5nZS5pbnNlcnROb2RlKHRlbXBEaXYuZmlyc3RDaGlsZCEpOyAvLyBJbnNlcnQgdGhlIHRhYmxlXHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjZWxsIG9mIHRoZSBuZXcgdGFibGVcclxuICAgIHRoaXMuc2V0Q3Vyc29yVG9GaXJzdENlbGwodGVtcERpdi5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIGZ1bmN0aW9uOiBDcmVhdGUgdGFibGUgSFRNTFxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50OiBudW1iZXIsIGNvbENvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhYmxlSFRNTCA9ICc8dGFibGUgYm9yZGVyPVwiMVwiIHN0eWxlPVwiXCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbWluLXdpZHRoOiAxLjVlbTsgaGVpZ2h0OiAyZW07IHBhZGRpbmc6IC40ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEhlbHBlciBmdW5jdGlvbjogQXBwZW5kIGEgdGFibGUgYXQgdGhlIGVuZCBvZiB0aGUgZWRpdG9yXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcblxyXG4gICAgLy8gU2V0IGN1cnNvciBpbnNpZGUgdGhlIGZpcnN0IGNlbGwgb2YgdGhlIG5ldyB0YWJsZVxyXG4gICAgY29uc3QgbGFzdEluc2VydGVkVGFibGUgPSBlZGl0b3IucXVlcnlTZWxlY3RvcigndGFibGU6bGFzdC1jaGlsZCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgdGhpcy5zZXRDdXJzb3JUb0ZpcnN0Q2VsbChsYXN0SW5zZXJ0ZWRUYWJsZSk7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIC8vIEhlbHBlciBmdW5jdGlvbjogQ2hlY2sgaWYgc2VsZWN0aW9uIGlzIGluc2lkZSB0aGUgZWRpdG9yXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAvLyBUcmF2ZXJzZSB1cCB0byBzZWUgaWYgdGhlIG5vZGUgYmVsb25ncyB0byB0aGUgZWRpdG9yXHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBpZiAobm9kZSA9PT0gZWRpdG9yKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBIZWxwZXIgZnVuY3Rpb246IE1vdmUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjZWxsXHJcbiAgLy8gcHJpdmF0ZSBzZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZTogSFRNTEVsZW1lbnQpIHtcclxuICAvLyAgIGNvbnN0IGZpcnN0Q2VsbCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gIC8vICAgaWYgKGZpcnN0Q2VsbCkge1xyXG4gIC8vICAgICBjb25zdCBuZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgLy8gICAgIG5ld1JhbmdlLnNldFN0YXJ0KGZpcnN0Q2VsbCwgMCk7IC8vIFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNlbGxcclxuICAvLyAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgIHNlbGVjdGlvbiEucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgLy8gICAgIHNlbGVjdGlvbiEuYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RyOmZpcnN0LWNoaWxkIHRkOmZpcnN0LWNoaWxkLCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgICAvLyBFbnN1cmUgdGhlIGNlbGwgaXMgY29udGVudGVkaXRhYmxlXHJcbiAgICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuXHJcbiAgICAgICAgLy8gRm9jdXMgdGhlIGNlbGxcclxuICAgICAgICBmaXJzdENlbGwuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgcmFuZ2UgYW5kIHBsYWNlIHRoZSBjdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjZWxsXHJcbiAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIG5ld1JhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhmaXJzdENlbGwpOyAvLyBTZWxlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBjZWxsXHJcbiAgICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcblxyXG4gICAgLy8gRm9yIGRlbW9uc3RyYXRpb24sIHlvdSBjYW4gbG9nIGl0IG9yIHByb2Nlc3MgaXQgYXMgbmVlZGVkXHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG5cclxuICAgIC8vIEV4YW1wbGU6IFlvdSBjb3VsZCBzZW5kIHRoaXMgZGF0YSB0byBhIHNlcnZlciBvciB1c2UgaXQgZWxzZXdoZXJlIGluIHlvdXIgYXBwbGljYXRpb25cclxuICAgIC8vIHRoaXMueW91clNlcnZpY2Uuc3VibWl0Q29udGVudCh7IGNvbnRlbnQgfSk7IC8vIFJlcGxhY2Ugd2l0aCB5b3VyIHNlcnZpY2UgY2FsbFxyXG4gIH1cclxuXHJcbiB9XHJcbiIsIjxkaXYgY2xhc3M9XCJkaW1lbnNpb25cIj5cclxuXHJcblxyXG48ZGl2IGNsYXNzPVwicmljaC10ZXh0LWVkaXRvclwiPlxyXG4gIDwhLS0gVG9vbGJhciAtLT5cclxuICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiPlxyXG5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSGVhZFwiIChjaGFuZ2UpPVwic2V0SGVhZGluZygkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkgxXCIgc3R5bGU9XCJmb250LXNpemU6IDMycHg7IGZvbnQtd2VpZ2h0OiBib2xkO1wiPkgxPC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSDJcIiBzdHlsZT1cImZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGQ7XCI+SDI8L29wdGlvbj5cclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg0XCIgc3R5bGU9XCJmb250LXNpemU6IDIwcHg7IGZvbnQtd2VpZ2h0OiBib2xkO1wiPkg0PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSDVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IDYwMDtcIj5INTwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuXHJcblxyXG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIChjaGFuZ2UpPVwib25DaGFuZ2UobnVsbClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiIChjaGFuZ2UpPVwic2V0Rm9udFNpemUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEyXCI+MTJweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEzXCI+MTNweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE0XCIgc2VsZWN0ZWQ+MTRweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE2XCI+MTZweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE4XCI+MThweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIwXCI+MjBweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI0XCI+MjRweDwvb3B0aW9uPlxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI4XCI+MjhweDwvb3B0aW9uPlxyXG4gICAgICAgIDwvc2VsZWN0PlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkJvbGRcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfYm9sZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkl0YWxpY1wiPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9pdGFsaWM8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbmRlcmxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfdW5kZXJsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAgKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJTdHJpa2V0aHJvdWdoXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+c3RyaWtldGhyb3VnaF9zPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJBbGlnbiBMZWZ0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlDZW50ZXInKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQ2VudGVyXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeVJpZ2h0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIFJpZ2h0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJKdXN0aWZ5XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiVW5vcmRlcmVkIExpc3RcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0T3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiT3JkZXJlZCBMaXN0XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfbnVtYmVyZWQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b24gY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiSW5zZXJ0IEltYWdlXCIgdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImluc2VydEltYWdlVG9FZGl0b3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9wYWNpdHk6IDA7IGN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIj5pbnNlcnRfcGhvdG9fb3V0bGluZWQ8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblRhYmxlRGlhbG9nKCRldmVudClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiQ2hvb3NlIHRhYmxlIHJvd3MgYW5kIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbj5ib3JkZXJfYWxsPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1iLTFcIiAoY2xpY2spPVwibWFrZUZpcnN0Um93SGVhZGVyKClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiTWFrZSBIZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgICBwYWdlX2hlYWRlclxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEVkaXRhYmxlIEFyZWEgLS0+XHJcbiAgIDwhLS0gKGtleXByZXNzKT1cIm9uQ29udGVudENoYW5nZSgpXCIgbmVlZCB0byBiZSBpbmNsdWRlZCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZWRpdG9yXCIgaWQ9XCJlZGl0b3JcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgI2VkaXRvciAgKGlucHV0KT1cInN1Ym1pdENvbnRlbnQoKVwiIChibHVyKT1cIm9uQmx1cigpXCIgKGRyb3ApPVwiZHJvcCgkZXZlbnQpXCIgKGRyYWdvdmVyKT1cImFsbG93RHJvcCgkZXZlbnQpXCIgPlxyXG4gICAgICA8IS0tIFlvdXIgY29udGVudCBnb2VzIGhlcmUgLS0+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJzdWJtaXRcIiAoY2xpY2spPVwic3VibWl0Q29udGVudCgpXCI+U3VibWl0PC9idXR0b24+IC0tPlxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdGFibGVEaWFsb2cgbGV0LWRpYWxvZ1JlZj1cImRpYWxvZ1JlZlwiPlxyXG48aDIgbWF0LWRpYWxvZy10aXRsZT5DaG9vc2UgVGFibGUgU2l6ZTwvaDI+XHJcbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIGdyaWQ7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2dyaWQtaXRlbSc6IHRydWUsXHJcbiAgICAgICAgJ2hpZ2hsaWdodGVkJzogaSAlIDcgPCBjb2xzICYmIE1hdGguZmxvb3IoaSAvIDcpIDwgcm93c1xyXG4gICAgICB9XCJcclxuICAgICAgKG1vdXNlZW50ZXIpPVwidXBkYXRlUHJldmlldyhpICUgNyArIDEsIE1hdGguZmxvb3IoaSAvIDcpICsgMSlcIlxyXG4gICAgICAoY2xpY2spPVwidXBkYXRlU2VsZWN0aW9uKGkgJSA3ICsgMSwgTWF0aC5mbG9vcihpIC8gNykgKyAxLCBkaWFsb2dSZWYpXCJcclxuICAgID48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8cD57eyByb3dzIH19IHgge3sgY29scyB9fSA8L3A+XHJcbjwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSA8ZGl2PlxyXG4gIDxpbnB1dCBjbGFzcz1cIm10LTJcIiB0eXBlPVwiZmlsZVwiIHBsYWNlaG9sZGVyPVwiVXBsb2FkIHlvdXIgaW1hZ2VzIGhlcmUuLi5cIiAoY2hhbmdlKT1cImluc2VydEltYWdlKCRldmVudClcIiBhY2NlcHQ9XCJpbWFnZS9wbmcsaW1hZ2UvKlwiIG11bHRpcGxlICAvPlxyXG4gIDxkaXYgY2xhc3M9XCJ1cGxvYWRlZC1pbWFnZXNcIiAqbmdJZj1cInVwbG9hZGVkSW1hZ2VzLmxlbmd0aCA+IDBcIj5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGltYWdlVXJsIG9mIHVwbG9hZGVkSW1hZ2VzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJpbWFnZS1wcmV2aWV3XCI+XHJcbiAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybFwiIGFsdD1cIlVwbG9hZGVkIEltYWdlXCJcclxuICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIiAgd2lkdGg9XCIxMDBweFwiIGhlaWdodD1cIjEwMHB4XCJcclxuICAgICAgICAgIChkcmFnc3RhcnQpPVwiZHJhZygkZXZlbnQsIGltYWdlVXJsKVwiIC8+XHJcbiAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImNvbG9yOiByZWQ7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVwiIChjbGljayk9XCJyZW1vdmVJbWFnZShpKVwiPmNhbmNlbDwvbWF0LWljb24+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIl19
@@ -656,7 +656,7 @@ class RapidTextEditorComponent {
656
656
  }
657
657
  }
658
658
  RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
659
- RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "app-rich-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
659
+ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "rapid-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
660
660
  {
661
661
  provide: NG_VALUE_ACCESSOR,
662
662
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -665,7 +665,7 @@ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
665
665
  ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri!important;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%;border-collapse:collapse;margin:5px}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
666
666
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, decorators: [{
667
667
  type: Component,
668
- args: [{ selector: 'app-rich-text-editor', providers: [
668
+ args: [{ selector: 'rapid-text-editor', providers: [
669
669
  {
670
670
  provide: NG_VALUE_ACCESSOR,
671
671
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -1 +1 @@
1
- {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-rich-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"300px\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef,private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const editorElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.height) {\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n if (this.width) {\r\n this.renderer.setStyle(editorElement, 'width', this.width);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n\r\n\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n //Two Way Data Binding Functionality\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n setTimeout(() => {\r\n console.log(this.editor.nativeElement.innerHTML)\r\n }, 0);\r\n if(this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == ''){\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14'; \r\n }\r\n };\r\n private onTouched = () => {};\r\n\r\n // Called by Angular to update the value programmatically\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n // Registers the onChange callback to notify Angular of content changes\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Registers the onTouched callback for blur events\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // If inside an existing span, update it\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n}\r\n\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // Get editor reference\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n\r\n // Create the new element (heading or paragraph)\r\n const newElem = document.createElement(tag);\r\n\r\n // Apply styles based on the selected tag\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n\r\n // Get any selected text, or use a zero-width space if none is selected\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n\r\n // Delete the selected content and insert new heading/paragraph\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n\r\n // Set the cursor at the end of the inserted node\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n // Refocus the editor\r\n editor.focus();\r\n }\r\n\r\n\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n // const imageUrl = event.dataTransfer?.getData(\"text\");\r\n // if (imageUrl) {\r\n // this.insertImageInEditor(imageUrl);\r\n // }\r\n }\r\n\r\n // insertImage(event: any): void {\r\n // const files: FileList = event.target.files;\r\n\r\n // if (!files || files.length === 0) {\r\n // console.error('No files selected.');\r\n // return;\r\n // }\r\n\r\n // Array.from(files).forEach((file) => {\r\n // // Check file type\r\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\r\n // console.error('Unsupported file type:', file.type);\r\n // return;\r\n // }\r\n\r\n // // Read the image file\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imageUrl = e.target.result;\r\n\r\n // // Add image to the uploaded images list\r\n // this.uploadedImages.push(imageUrl);\r\n\r\n // // Call insertImageInEditor to add the image to the editor\r\n // this.insertImageInEditor(imageUrl);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // });\r\n // } -> for PNG\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n // insertImageByDrag(imageUrl: string): void {\r\n // const editor = document.querySelector('.editor') as HTMLElement;\r\n // if (!editor) {\r\n // console.error('Editor element not found.');\r\n // return;\r\n // }\r\n\r\n // const img = document.createElement('img');\r\n // img.src = imageUrl;\r\n // img.style.maxWidth = '100%';\r\n // img.style.display = 'block';\r\n // img.style.width = '300px';\r\n // img.style.height = 'auto';\r\n\r\n // editor.appendChild(img);\r\n // }\r\n\r\n\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n\r\n\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n\r\n\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n\r\n\r\n editor.appendChild(wrapper);\r\n\r\n\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n\r\n if (!table) {\r\n return;\r\n }\r\n\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Ensure selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n // Append the table at the end if selection is outside editor\r\n this.appendTable(editor, rowCount, colCount);\r\n return;\r\n }\r\n\r\n // Proceed to insert the table if selection is valid\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const range = selection.getRangeAt(0);\r\n range.deleteContents(); // Remove any selected content\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n\r\n range.insertNode(tempDiv.firstChild!); // Insert the table\r\n\r\n // Move the cursor to the first cell of the new table\r\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Create table HTML\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n\r\n // Helper function: Append a table at the end of the editor\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n\r\n // Set cursor inside the first cell of the new table\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Check if selection is inside the editor\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n\r\n // Traverse up to see if the node belongs to the editor\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n // Helper function: Move cursor to the first cell\r\n // private setCursorToFirstCell(table: HTMLElement) {\r\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\r\n\r\n // if (firstCell) {\r\n // const newRange = document.createRange();\r\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\r\n // newRange.collapse(true);\r\n\r\n // const selection = window.getSelection();\r\n // selection!.removeAllRanges();\r\n // selection!.addRange(newRange);\r\n // }\r\n // }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n\r\n if (firstCell) {\r\n // Ensure the cell is contenteditable\r\n firstCell.setAttribute('contenteditable', 'true');\r\n\r\n // Focus the cell\r\n firstCell.focus();\r\n\r\n // Create a range and place the cursor at the start of the cell\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n\r\n // For demonstration, you can log it or process it as needed\r\n this.onChange(content);\r\n\r\n // Example: You could send this data to a server or use it elsewhere in your application\r\n // this.yourService.submitContent({ content }); // Replace with your service call\r\n }\r\n\r\n }\r\n","<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"300px\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef,private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const editorElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.height) {\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n if (this.width) {\r\n this.renderer.setStyle(editorElement, 'width', this.width);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n\r\n\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n //Two Way Data Binding Functionality\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n setTimeout(() => {\r\n console.log(this.editor.nativeElement.innerHTML)\r\n }, 0);\r\n if(this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == ''){\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14'; \r\n }\r\n };\r\n private onTouched = () => {};\r\n\r\n // Called by Angular to update the value programmatically\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n // Registers the onChange callback to notify Angular of content changes\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Registers the onTouched callback for blur events\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // If inside an existing span, update it\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n}\r\n\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // Get editor reference\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n\r\n // Create the new element (heading or paragraph)\r\n const newElem = document.createElement(tag);\r\n\r\n // Apply styles based on the selected tag\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n\r\n // Get any selected text, or use a zero-width space if none is selected\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n\r\n // Delete the selected content and insert new heading/paragraph\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n\r\n // Set the cursor at the end of the inserted node\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n // Refocus the editor\r\n editor.focus();\r\n }\r\n\r\n\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n // const imageUrl = event.dataTransfer?.getData(\"text\");\r\n // if (imageUrl) {\r\n // this.insertImageInEditor(imageUrl);\r\n // }\r\n }\r\n\r\n // insertImage(event: any): void {\r\n // const files: FileList = event.target.files;\r\n\r\n // if (!files || files.length === 0) {\r\n // console.error('No files selected.');\r\n // return;\r\n // }\r\n\r\n // Array.from(files).forEach((file) => {\r\n // // Check file type\r\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\r\n // console.error('Unsupported file type:', file.type);\r\n // return;\r\n // }\r\n\r\n // // Read the image file\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imageUrl = e.target.result;\r\n\r\n // // Add image to the uploaded images list\r\n // this.uploadedImages.push(imageUrl);\r\n\r\n // // Call insertImageInEditor to add the image to the editor\r\n // this.insertImageInEditor(imageUrl);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // });\r\n // } -> for PNG\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n // insertImageByDrag(imageUrl: string): void {\r\n // const editor = document.querySelector('.editor') as HTMLElement;\r\n // if (!editor) {\r\n // console.error('Editor element not found.');\r\n // return;\r\n // }\r\n\r\n // const img = document.createElement('img');\r\n // img.src = imageUrl;\r\n // img.style.maxWidth = '100%';\r\n // img.style.display = 'block';\r\n // img.style.width = '300px';\r\n // img.style.height = 'auto';\r\n\r\n // editor.appendChild(img);\r\n // }\r\n\r\n\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n\r\n\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n\r\n\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n\r\n\r\n editor.appendChild(wrapper);\r\n\r\n\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n\r\n if (!table) {\r\n return;\r\n }\r\n\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Ensure selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n // Append the table at the end if selection is outside editor\r\n this.appendTable(editor, rowCount, colCount);\r\n return;\r\n }\r\n\r\n // Proceed to insert the table if selection is valid\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const range = selection.getRangeAt(0);\r\n range.deleteContents(); // Remove any selected content\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n\r\n range.insertNode(tempDiv.firstChild!); // Insert the table\r\n\r\n // Move the cursor to the first cell of the new table\r\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Create table HTML\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n\r\n // Helper function: Append a table at the end of the editor\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n\r\n // Set cursor inside the first cell of the new table\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Check if selection is inside the editor\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n\r\n // Traverse up to see if the node belongs to the editor\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n // Helper function: Move cursor to the first cell\r\n // private setCursorToFirstCell(table: HTMLElement) {\r\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\r\n\r\n // if (firstCell) {\r\n // const newRange = document.createRange();\r\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\r\n // newRange.collapse(true);\r\n\r\n // const selection = window.getSelection();\r\n // selection!.removeAllRanges();\r\n // selection!.addRange(newRange);\r\n // }\r\n // }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n\r\n if (firstCell) {\r\n // Ensure the cell is contenteditable\r\n firstCell.setAttribute('contenteditable', 'true');\r\n\r\n // Focus the cell\r\n firstCell.focus();\r\n\r\n // Create a range and place the cursor at the start of the cell\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n\r\n // For demonstration, you can log it or process it as needed\r\n this.onChange(content);\r\n\r\n // Example: You could send this data to a server or use it elsewhere in your application\r\n // this.yourService.submitContent({ content }); // Replace with your service call\r\n }\r\n\r\n }\r\n","<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -654,7 +654,7 @@ class RapidTextEditorComponent {
654
654
  }
655
655
  }
656
656
  RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
657
- RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "app-rich-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
657
+ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "rapid-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
658
658
  {
659
659
  provide: NG_VALUE_ACCESSOR,
660
660
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -663,7 +663,7 @@ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0
663
663
  ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri!important;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%;border-collapse:collapse;margin:5px}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
664
664
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, decorators: [{
665
665
  type: Component,
666
- args: [{ selector: 'app-rich-text-editor', providers: [
666
+ args: [{ selector: 'rapid-text-editor', providers: [
667
667
  {
668
668
  provide: NG_VALUE_ACCESSOR,
669
669
  useExisting: forwardRef(() => RapidTextEditorComponent),
@@ -1 +1 @@
1
- {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-rich-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"300px\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef,private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const editorElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.height) {\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n if (this.width) {\r\n this.renderer.setStyle(editorElement, 'width', this.width);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n\r\n\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n //Two Way Data Binding Functionality\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n setTimeout(() => {\r\n console.log(this.editor.nativeElement.innerHTML)\r\n }, 0);\r\n if(this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == ''){\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14'; \r\n }\r\n };\r\n private onTouched = () => {};\r\n\r\n // Called by Angular to update the value programmatically\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n // Registers the onChange callback to notify Angular of content changes\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Registers the onTouched callback for blur events\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // If inside an existing span, update it\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n}\r\n\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // Get editor reference\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n\r\n // Create the new element (heading or paragraph)\r\n const newElem = document.createElement(tag);\r\n\r\n // Apply styles based on the selected tag\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n\r\n // Get any selected text, or use a zero-width space if none is selected\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n\r\n // Delete the selected content and insert new heading/paragraph\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n\r\n // Set the cursor at the end of the inserted node\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n // Refocus the editor\r\n editor.focus();\r\n }\r\n\r\n\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n // const imageUrl = event.dataTransfer?.getData(\"text\");\r\n // if (imageUrl) {\r\n // this.insertImageInEditor(imageUrl);\r\n // }\r\n }\r\n\r\n // insertImage(event: any): void {\r\n // const files: FileList = event.target.files;\r\n\r\n // if (!files || files.length === 0) {\r\n // console.error('No files selected.');\r\n // return;\r\n // }\r\n\r\n // Array.from(files).forEach((file) => {\r\n // // Check file type\r\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\r\n // console.error('Unsupported file type:', file.type);\r\n // return;\r\n // }\r\n\r\n // // Read the image file\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imageUrl = e.target.result;\r\n\r\n // // Add image to the uploaded images list\r\n // this.uploadedImages.push(imageUrl);\r\n\r\n // // Call insertImageInEditor to add the image to the editor\r\n // this.insertImageInEditor(imageUrl);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // });\r\n // } -> for PNG\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n // insertImageByDrag(imageUrl: string): void {\r\n // const editor = document.querySelector('.editor') as HTMLElement;\r\n // if (!editor) {\r\n // console.error('Editor element not found.');\r\n // return;\r\n // }\r\n\r\n // const img = document.createElement('img');\r\n // img.src = imageUrl;\r\n // img.style.maxWidth = '100%';\r\n // img.style.display = 'block';\r\n // img.style.width = '300px';\r\n // img.style.height = 'auto';\r\n\r\n // editor.appendChild(img);\r\n // }\r\n\r\n\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n\r\n\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n\r\n\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n\r\n\r\n editor.appendChild(wrapper);\r\n\r\n\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n\r\n if (!table) {\r\n return;\r\n }\r\n\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Ensure selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n // Append the table at the end if selection is outside editor\r\n this.appendTable(editor, rowCount, colCount);\r\n return;\r\n }\r\n\r\n // Proceed to insert the table if selection is valid\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const range = selection.getRangeAt(0);\r\n range.deleteContents(); // Remove any selected content\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n\r\n range.insertNode(tempDiv.firstChild!); // Insert the table\r\n\r\n // Move the cursor to the first cell of the new table\r\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Create table HTML\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n\r\n // Helper function: Append a table at the end of the editor\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n\r\n // Set cursor inside the first cell of the new table\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Check if selection is inside the editor\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n\r\n // Traverse up to see if the node belongs to the editor\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n // Helper function: Move cursor to the first cell\r\n // private setCursorToFirstCell(table: HTMLElement) {\r\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\r\n\r\n // if (firstCell) {\r\n // const newRange = document.createRange();\r\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\r\n // newRange.collapse(true);\r\n\r\n // const selection = window.getSelection();\r\n // selection!.removeAllRanges();\r\n // selection!.addRange(newRange);\r\n // }\r\n // }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n\r\n if (firstCell) {\r\n // Ensure the cell is contenteditable\r\n firstCell.setAttribute('contenteditable', 'true');\r\n\r\n // Focus the cell\r\n firstCell.focus();\r\n\r\n // Create a range and place the cursor at the start of the cell\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n\r\n // For demonstration, you can log it or process it as needed\r\n this.onChange(content);\r\n\r\n // Example: You could send this data to a server or use it elsewhere in your application\r\n // this.yourService.submitContent({ content }); // Replace with your service call\r\n }\r\n\r\n }\r\n","<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"300px\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef,private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const editorElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.height) {\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n if (this.width) {\r\n this.renderer.setStyle(editorElement, 'width', this.width);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n\r\n\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n //Two Way Data Binding Functionality\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n setTimeout(() => {\r\n console.log(this.editor.nativeElement.innerHTML)\r\n }, 0);\r\n if(this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == ''){\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14'; \r\n }\r\n };\r\n private onTouched = () => {};\r\n\r\n // Called by Angular to update the value programmatically\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n // Registers the onChange callback to notify Angular of content changes\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Registers the onTouched callback for blur events\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // If inside an existing span, update it\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n}\r\n\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n\r\n // Get editor reference\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n\r\n // Create the new element (heading or paragraph)\r\n const newElem = document.createElement(tag);\r\n\r\n // Apply styles based on the selected tag\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n\r\n // Get any selected text, or use a zero-width space if none is selected\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n\r\n // Delete the selected content and insert new heading/paragraph\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n\r\n // Set the cursor at the end of the inserted node\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n // Refocus the editor\r\n editor.focus();\r\n }\r\n\r\n\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n // const imageUrl = event.dataTransfer?.getData(\"text\");\r\n // if (imageUrl) {\r\n // this.insertImageInEditor(imageUrl);\r\n // }\r\n }\r\n\r\n // insertImage(event: any): void {\r\n // const files: FileList = event.target.files;\r\n\r\n // if (!files || files.length === 0) {\r\n // console.error('No files selected.');\r\n // return;\r\n // }\r\n\r\n // Array.from(files).forEach((file) => {\r\n // // Check file type\r\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\r\n // console.error('Unsupported file type:', file.type);\r\n // return;\r\n // }\r\n\r\n // // Read the image file\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imageUrl = e.target.result;\r\n\r\n // // Add image to the uploaded images list\r\n // this.uploadedImages.push(imageUrl);\r\n\r\n // // Call insertImageInEditor to add the image to the editor\r\n // this.insertImageInEditor(imageUrl);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // });\r\n // } -> for PNG\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n // insertImageByDrag(imageUrl: string): void {\r\n // const editor = document.querySelector('.editor') as HTMLElement;\r\n // if (!editor) {\r\n // console.error('Editor element not found.');\r\n // return;\r\n // }\r\n\r\n // const img = document.createElement('img');\r\n // img.src = imageUrl;\r\n // img.style.maxWidth = '100%';\r\n // img.style.display = 'block';\r\n // img.style.width = '300px';\r\n // img.style.height = 'auto';\r\n\r\n // editor.appendChild(img);\r\n // }\r\n\r\n\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n\r\n\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n\r\n\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n\r\n\r\n editor.appendChild(wrapper);\r\n\r\n\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n\r\n if (!table) {\r\n return;\r\n }\r\n\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n\r\n // Ensure selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n // Append the table at the end if selection is outside editor\r\n this.appendTable(editor, rowCount, colCount);\r\n return;\r\n }\r\n\r\n // Proceed to insert the table if selection is valid\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const range = selection.getRangeAt(0);\r\n range.deleteContents(); // Remove any selected content\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n\r\n range.insertNode(tempDiv.firstChild!); // Insert the table\r\n\r\n // Move the cursor to the first cell of the new table\r\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Create table HTML\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n\r\n // Helper function: Append a table at the end of the editor\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n\r\n // Set cursor inside the first cell of the new table\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n // Helper function: Check if selection is inside the editor\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n\r\n // Traverse up to see if the node belongs to the editor\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n // Helper function: Move cursor to the first cell\r\n // private setCursorToFirstCell(table: HTMLElement) {\r\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\r\n\r\n // if (firstCell) {\r\n // const newRange = document.createRange();\r\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\r\n // newRange.collapse(true);\r\n\r\n // const selection = window.getSelection();\r\n // selection!.removeAllRanges();\r\n // selection!.addRange(newRange);\r\n // }\r\n // }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n\r\n if (firstCell) {\r\n // Ensure the cell is contenteditable\r\n firstCell.setAttribute('contenteditable', 'true');\r\n\r\n // Focus the cell\r\n firstCell.focus();\r\n\r\n // Create a range and place the cursor at the start of the cell\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n\r\n // For demonstration, you can log it or process it as needed\r\n this.onChange(content);\r\n\r\n // Example: You could send this data to a server or use it elsewhere in your application\r\n // this.yourService.submitContent({ content }); // Replace with your service call\r\n }\r\n\r\n }\r\n","<div class=\"dimension\">\r\n\r\n\r\n<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n\r\n\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\" (change)=\"setFontSize($event)\">\r\n <option value=\"12\">12px</option>\r\n <option value=\"13\">13px</option>\r\n <option value=\"14\" selected>14px</option>\r\n <option value=\"16\">16px</option>\r\n <option value=\"18\">18px</option>\r\n <option value=\"20\">20px</option>\r\n <option value=\"24\">24px</option>\r\n <option value=\"28\">28px</option>\r\n </select>\r\n\r\n\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n\r\n\r\n\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\"\r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n\r\n\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n\r\n\r\n\r\n </div>\r\n\r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here -->\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n\r\n\r\n<ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n<h2 mat-dialog-title>Choose Table Size</h2>\r\n<mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n</mat-dialog-content>\r\n</ng-template>\r\n\r\n<!-- <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\"\r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n\r\n </div>\r\n </div>\r\n</div> -->\r\n\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -59,5 +59,5 @@ export declare class RapidTextEditorComponent implements ControlValueAccessor, O
59
59
  insertPageBreak(): void;
60
60
  submitContent(): void;
61
61
  static ɵfac: i0.ɵɵFactoryDeclaration<RapidTextEditorComponent, never>;
62
- static ɵcmp: i0.ɵɵComponentDeclaration<RapidTextEditorComponent, "app-rich-text-editor", never, { "contentCapture": "contentCapture"; "height": "height"; "width": "width"; }, { "contentChange": "contentChange"; }, never, never>;
62
+ static ɵcmp: i0.ɵɵComponentDeclaration<RapidTextEditorComponent, "rapid-text-editor", never, { "contentCapture": "contentCapture"; "height": "height"; "width": "width"; }, { "contentChange": "contentChange"; }, never, never>;
63
63
  }
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "rapid-text-editor",
3
- "version": "1.0.11",
4
- "description": "Rapid Text Editor",
3
+ "version": "1.0.12",
5
4
  "peerDependencies": {
6
5
  "@angular/common": "^13.0.0 || 13.x",
7
6
  "@angular/core": "^13.0.0 || 13.x"