UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

183 lines (181 loc) 24 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ENTER, ESCAPE } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { BehaviorSubject, fromEvent, Observable } from 'rxjs'; import { filter, switchMap, take, takeUntil, withLatestFrom } from 'rxjs/operators'; import { NzDestroyService } from 'ng-zorro-antd/core/services'; import { NzAutosizeDirective } from 'ng-zorro-antd/input'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/i18n"; import * as i2 from "ng-zorro-antd/core/services"; import * as i3 from "@angular/common"; import * as i4 from "ng-zorro-antd/input"; import * as i5 from "ng-zorro-antd/core/trans-button"; import * as i6 from "ng-zorro-antd/icon"; import * as i7 from "ng-zorro-antd/tooltip"; import * as i8 from "ng-zorro-antd/core/outlet"; export class NzTextEditComponent { constructor(ngZone, host, cdr, i18n, destroy$) { this.ngZone = ngZone; this.host = host; this.cdr = cdr; this.i18n = i18n; this.destroy$ = destroy$; this.editing = false; this.icon = 'edit'; this.startEditing = new EventEmitter(); this.endEditing = new EventEmitter(true); this.nativeElement = this.host.nativeElement; // We could've saved the textarea within some private property (e.g. `_textarea`) and have a getter, // but having subject makes the code more reactive and cancellable (e.g. event listeners will be // automatically removed and re-added through the `switchMap` below). this.textarea$ = new BehaviorSubject(null); } set textarea(textarea) { if (textarea) { this.textarea$.next(textarea); } } ngOnInit() { this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => { this.locale = this.i18n.getLocaleData('Text'); this.cdr.markForCheck(); }); const textarea$ = this.textarea$.pipe(filter((textarea) => textarea !== null)); textarea$ .pipe(switchMap(textarea => // Caretaker note: we explicitly should call `subscribe()` within the root zone. // `runOutsideAngular(() => fromEvent(...))` will just create an observable within the root zone, // but `addEventListener` is called when the `fromEvent` is subscribed. new Observable(subscriber => this.ngZone.runOutsideAngular(() => fromEvent(textarea.nativeElement, 'keydown').subscribe(subscriber)))), takeUntil(this.destroy$)) .subscribe(event => { // Caretaker note: adding modifier at the end (for instance `(keydown.esc)`) will tell Angular to add // an event listener through the `KeyEventsPlugin`, which always runs `ngZone.runGuarded()` internally. // We're interested only in escape and enter keyboard buttons, otherwise Angular will run change detection // on any `keydown` event. if (event.keyCode !== ESCAPE && event.keyCode !== ENTER) { return; } this.ngZone.run(() => { if (event.keyCode === ESCAPE) { this.onCancel(); } else { this.onEnter(event); } this.cdr.markForCheck(); }); }); textarea$ .pipe(switchMap(textarea => new Observable(subscriber => this.ngZone.runOutsideAngular(() => fromEvent(textarea.nativeElement, 'input').subscribe(subscriber)))), takeUntil(this.destroy$)) .subscribe(event => { this.currentText = event.target.value; }); } onClick() { this.beforeText = this.text; this.currentText = this.beforeText; this.editing = true; this.startEditing.emit(); this.focusAndSetValue(); } confirm() { this.editing = false; this.endEditing.emit(this.currentText); } onEnter(event) { event.stopPropagation(); event.preventDefault(); this.confirm(); } onCancel() { this.currentText = this.beforeText; this.confirm(); } focusAndSetValue() { this.ngZone.onStable .pipe(take(1), withLatestFrom(this.textarea$), takeUntil(this.destroy$)) .subscribe(([, textarea]) => { if (textarea) { textarea.nativeElement.focus(); textarea.nativeElement.value = this.currentText || ''; this.autosizeDirective.resizeToFitContent(); this.cdr.markForCheck(); } }); } } NzTextEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzTextEditComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NzI18nService }, { token: i2.NzDestroyService }], target: i0.ɵɵFactoryTarget.Component }); NzTextEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: NzTextEditComponent, selector: "nz-text-edit", inputs: { text: "text", icon: "icon", tooltip: "tooltip" }, outputs: { startEditing: "startEditing", endEditing: "endEditing" }, providers: [NzDestroyService], viewQueries: [{ propertyName: "textarea", first: true, predicate: ["textarea"], descendants: true }, { propertyName: "autosizeDirective", first: true, predicate: NzAutosizeDirective, descendants: true }], exportAs: ["nzTextEdit"], ngImport: i0, template: ` <ng-template [ngIf]="editing" [ngIfElse]="notEditing"> <textarea #textarea nz-input nzAutosize (blur)="confirm()"></textarea> <button nz-trans-button class="ant-typography-edit-content-confirm" (click)="confirm()"> <i nz-icon nzType="enter"></i> </button> </ng-template> <ng-template #notEditing> <button nz-tooltip nz-trans-button class="ant-typography-edit" [nzTooltipTitle]="tooltip === null ? null : tooltip || locale?.edit" (click)="onClick()" > <ng-container *nzStringTemplateOutlet="icon; let icon"> <i nz-icon [nzType]="icon"></i> </ng-container> </button> </ng-template> `, isInline: true, directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i4.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { type: i5.NzTransButtonDirective, selector: "button[nz-trans-button]" }, { type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i7.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i8.NzStringTemplateOutletDirective, selector: "[nzStringTemplateOutlet]", inputs: ["nzStringTemplateOutletContext", "nzStringTemplateOutlet"], exportAs: ["nzStringTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzTextEditComponent, decorators: [{ type: Component, args: [{ selector: 'nz-text-edit', exportAs: 'nzTextEdit', template: ` <ng-template [ngIf]="editing" [ngIfElse]="notEditing"> <textarea #textarea nz-input nzAutosize (blur)="confirm()"></textarea> <button nz-trans-button class="ant-typography-edit-content-confirm" (click)="confirm()"> <i nz-icon nzType="enter"></i> </button> </ng-template> <ng-template #notEditing> <button nz-tooltip nz-trans-button class="ant-typography-edit" [nzTooltipTitle]="tooltip === null ? null : tooltip || locale?.edit" (click)="onClick()" > <ng-container *nzStringTemplateOutlet="icon; let icon"> <i nz-icon [nzType]="icon"></i> </ng-container> </button> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, providers: [NzDestroyService] }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NzI18nService }, { type: i2.NzDestroyService }]; }, propDecorators: { text: [{ type: Input }], icon: [{ type: Input }], tooltip: [{ type: Input }], startEditing: [{ type: Output }], endEditing: [{ type: Output }], textarea: [{ type: ViewChild, args: ['textarea', { static: false }] }], autosizeDirective: [{ type: ViewChild, args: [NzAutosizeDirective, { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvdHlwb2dyYXBoeS90ZXh0LWVkaXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUcvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7OztBQWdDMUQsTUFBTSxPQUFPLG1CQUFtQjtJQTBCOUIsWUFDVSxNQUFjLEVBQ2QsSUFBNkIsRUFDN0IsR0FBc0IsRUFDdEIsSUFBbUIsRUFDbkIsUUFBMEI7UUFKMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQXlCO1FBQzdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUE5QnBDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFJUCxTQUFJLEdBQWEsTUFBTSxDQUFDO1FBRWQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3hDLGVBQVUsR0FBRyxJQUFJLFlBQVks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Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7O2dIQWxJVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix3S0FGbkIsQ0FBQyxnQkFBZ0IsQ0FBQyxvS0FpQmxCLG1CQUFtQiwwRUExQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQ7MkZBTVUsbUJBQW1CO2tCQTlCL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsbUJBQW1CLEVBQUUsS0FBSztvQkFDMUIsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQzlCO2lOQUtVLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNhLFlBQVk7c0JBQTlCLE1BQU07Z0JBQ1ksVUFBVTtzQkFBNUIsTUFBTTtnQkFFSCxRQUFRO3NCQURYLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFNVyxpQkFBaUI7c0JBQW5FLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRU5URVIsIEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpEZXN0cm95U2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBOelRTVHlwZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlLCBOelRleHRJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcbmltcG9ydCB7IE56QXV0b3NpemVEaXJlY3RpdmUgfSBmcm9tICduZy16b3Jyby1hbnRkL2lucHV0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotdGV4dC1lZGl0JyxcbiAgZXhwb3J0QXM6ICduelRleHRFZGl0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiZWRpdGluZ1wiIFtuZ0lmRWxzZV09XCJub3RFZGl0aW5nXCI+XG4gICAgICA8dGV4dGFyZWEgI3RleHRhcmVhIG56LWlucHV0IG56QXV0b3NpemUgKGJsdXIpPVwiY29uZmlybSgpXCI+PC90ZXh0YXJlYT5cbiAgICAgIDxidXR0b24gbnotdHJhbnMtYnV0dG9uIGNsYXNzPVwiYW50LXR5cG9ncmFwaHktZWRpdC1jb250ZW50LWNvbmZpcm1cIiAoY2xpY2spPVwiY29uZmlybSgpXCI+XG4gICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZW50ZXJcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub3RFZGl0aW5nPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBuei10b29sdGlwXG4gICAgICAgIG56LXRyYW5zLWJ1dHRvblxuICAgICAgICBjbGFzcz1cImFudC10eXBvZ3JhcGh5LWVkaXRcIlxuICAgICAgICBbbnpUb29sdGlwVGl0bGVdPVwidG9vbHRpcCA9PT0gbnVsbCA/IG51bGwgOiB0b29sdGlwIHx8IGxvY2FsZT8uZWRpdFwiXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbjsgbGV0IGljb25cIj5cbiAgICAgICAgICA8aSBuei1pY29uIFtuelR5cGVdPVwiaWNvblwiPjwvaT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIHByb3ZpZGVyczogW056RGVzdHJveVNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE56VGV4dEVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBlZGl0aW5nID0gZmFsc2U7XG4gIGxvY2FsZSE6IE56VGV4dEkxOG5JbnRlcmZhY2U7XG5cbiAgQElucHV0KCkgdGV4dD86IHN0cmluZztcbiAgQElucHV0KCkgaWNvbjogTnpUU1R5cGUgPSAnZWRpdCc7XG4gIEBJbnB1dCgpIHRvb2x0aXA/OiBudWxsIHwgTnpUU1R5cGU7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzdGFydEVkaXRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBlbmRFZGl0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KHRydWUpO1xuICBAVmlld0NoaWxkKCd0ZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZXQgdGV4dGFyZWEodGV4dGFyZWE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGV4dGFyZWEpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEkLm5leHQodGV4dGFyZWEpO1xuICAgIH1cbiAgfVxuICBAVmlld0NoaWxkKE56QXV0b3NpemVEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSBhdXRvc2l6ZURpcmVjdGl2ZSE6IE56QXV0b3NpemVEaXJlY3RpdmU7XG5cbiAgYmVmb3JlVGV4dD86IHN0cmluZztcbiAgY3VycmVudFRleHQ/OiBzdHJpbmc7XG4gIG5hdGl2ZUVsZW1lbnQgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudDtcblxuICAvLyBXZSBjb3VsZCd2ZSBzYXZlZCB0aGUgdGV4dGFyZWEgd2l0aGluIHNvbWUgcHJpdmF0ZSBwcm9wZXJ0eSAoZS5nLiBgX3RleHRhcmVhYCkgYW5kIGhhdmUgYSBnZXR0ZXIsXG4gIC8vIGJ1dCBoYXZpbmcgc3ViamVjdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWN0aXZlIGFuZCBjYW5jZWxsYWJsZSAoZS5nLiBldmVudCBsaXN0ZW5lcnMgd2lsbCBiZVxuICAvLyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYW5kIHJlLWFkZGVkIHRocm91Z2ggdGhlIGBzd2l0Y2hNYXBgIGJlbG93KS5cbiAgcHJpdmF0ZSB0ZXh0YXJlYSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4gfCBudWxsPihudWxsKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaTE4bjogTnpJMThuU2VydmljZSxcbiAgICBwcml2YXRlIGRlc3Ryb3kkOiBOekRlc3Ryb3lTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnVGV4dCcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZXh0YXJlYSQ6IE9ic2VydmFibGU8RWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50Pj4gPSB0aGlzLnRleHRhcmVhJC5waXBlKFxuICAgICAgZmlsdGVyKCh0ZXh0YXJlYSk6IHRleHRhcmVhIGlzIEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4gPT4gdGV4dGFyZWEgIT09IG51bGwpXG4gICAgKTtcblxuICAgIHRleHRhcmVhJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICB0ZXh0YXJlYSA9PlxuICAgICAgICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IHdlIGV4cGxpY2l0bHkgc2hvdWxkIGNhbGwgYHN1YnNjcmliZSgpYCB3aXRoaW4gdGhlIHJvb3Qgem9uZS5cbiAgICAgICAgICAgIC8vIGBydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBmcm9tRXZlbnQoLi4uKSlgIHdpbGwganVzdCBjcmVhdGUgYW4gb2JzZXJ2YWJsZSB3aXRoaW4gdGhlIHJvb3Qgem9uZSxcbiAgICAgICAgICAgIC8vIGJ1dCBgYWRkRXZlbnRMaXN0ZW5lcmAgaXMgY2FsbGVkIHdoZW4gdGhlIGBmcm9tRXZlbnRgIGlzIHN1YnNjcmliZWQuXG4gICAgICAgICAgICBuZXcgT2JzZXJ2YWJsZTxLZXlib2FyZEV2ZW50PihzdWJzY3JpYmVyID0+XG4gICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KHRleHRhcmVhLm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJykuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IGFkZGluZyBtb2RpZmllciBhdCB0aGUgZW5kIChmb3IgaW5zdGFuY2UgYChrZXlkb3duLmVzYylgKSB3aWxsIHRlbGwgQW5ndWxhciB0byBhZGRcbiAgICAgICAgLy8gYW4gZXZlbnQgbGlzdGVuZXIgdGhyb3VnaCB0aGUgYEtleUV2ZW50c1BsdWdpbmAsIHdoaWNoIGFsd2F5cyBydW5zIGBuZ1pvbmUucnVuR3VhcmRlZCgpYCBpbnRlcm5hbGx5LlxuICAgICAgICAvLyBXZSdyZSBpbnRlcmVzdGVkIG9ubHkgaW4gZXNjYXBlIGFuZCBlbnRlciBrZXlib2FyZCBidXR0b25zLCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIC8vIG9uIGFueSBga2V5ZG93bmAgZXZlbnQuXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9PSBFU0NBUEUgJiYgZXZlbnQua2V5Q29kZSAhPT0gRU5URVIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFU0NBUEUpIHtcbiAgICAgICAgICAgIHRoaXMub25DYW5jZWwoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkVudGVyKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0ZXh0YXJlYSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgdGV4dGFyZWEgPT5cbiAgICAgICAgICAgIG5ldyBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+KHN1YnNjcmliZXIgPT5cbiAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4odGV4dGFyZWEubmF0aXZlRWxlbWVudCwgJ2lucHV0Jykuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50VGV4dCA9IChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWU7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5iZWZvcmVUZXh0ID0gdGhpcy50ZXh0O1xuICAgIHRoaXMuY3VycmVudFRleHQgPSB0aGlzLmJlZm9yZVRleHQ7XG4gICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0RWRpdGluZy5lbWl0KCk7XG4gICAgdGhpcy5mb2N1c0FuZFNldFZhbHVlKCk7XG4gIH1cblxuICBjb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZW5kRWRpdGluZy5lbWl0KHRoaXMuY3VycmVudFRleHQpO1xuICB9XG5cbiAgb25FbnRlcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY29uZmlybSgpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VGV4dCA9IHRoaXMuYmVmb3JlVGV4dDtcbiAgICB0aGlzLmNvbmZpcm0oKTtcbiAgfVxuXG4gIGZvY3VzQW5kU2V0VmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSksIHdpdGhMYXRlc3RGcm9tKHRoaXMudGV4dGFyZWEkKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoWywgdGV4dGFyZWFdKSA9PiB7XG4gICAgICAgIGlmICh0ZXh0YXJlYSkge1xuICAgICAgICAgIHRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICB0ZXh0YXJlYS5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5jdXJyZW50VGV4dCB8fCAnJztcbiAgICAgICAgICB0aGlzLmF1dG9zaXplRGlyZWN0aXZlLnJlc2l6ZVRvRml0Q29udGVudCgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19