UNPKG

ng-zorro-antd-mobile

Version:

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

151 lines 25.3 kB
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class SwipeActionComponent { constructor() { this.prefixCls = 'am-swipe'; this.wrapCls = {}; this._swiping = false; this._openedLeft = false; this._openedRight = false; this.left = []; this.right = []; this.autoClose = false; this.disabled = false; this.onOpen = new EventEmitter(); this.onClose = new EventEmitter(); this.onCloseSwipe = ev => { if (!(this._openedLeft || this._openedRight)) { return; } const pNode = ev.target.closest(`.${this.prefixCls}-actions`); if (!pNode) { this.close(); } }; } setClassMap() { this.wrapCls = { [this.prefixCls]: true, [`${this.prefixCls}-swiping`]: this._swiping }; } close() { if (this._openedLeft || this._openedRight) { this.onClose.emit(); } this.setBtnStyle(0); this._openedLeft = false; this._openedRight = false; } setBtnStyle(value) { if (this._btnsLeftWidth === 0 || this._btnsRightWidth === 0) { this._btnsLeftWidth = this.leftBtnRef ? this.leftBtnRef.nativeElement.offsetWidth : 0; this._btnsRightWidth = this.rightBtnRef ? this.rightBtnRef.nativeElement.offsetWidth : 0; } const limit = value > 0 ? this._btnsLeftWidth : -this._btnsRightWidth; const contentLeft = this.getContentEasing(value, limit); this.content.nativeElement.style.left = `${contentLeft}px`; this.cover.nativeElement.style.display = Math.abs(value) > 0 ? 'block' : 'none'; this.cover.nativeElement.style.left = `${contentLeft}px`; } getContentEasing(value, limit) { return Math.abs(value) - Math.abs(limit) > 0 ? limit : value; } onTouchStart(e) { this._startX = e.changedTouches[0].clientX; this._swiping = true; } onTouchMove(e) { const deltaX = e.changedTouches[0].clientX - this._startX; this._needShowRight = deltaX < -5 && this.right.length > 0; this._needShowLeft = deltaX > 5 && this.left.length > 0; if (this.leftBtnRef) { this.leftBtnRef.nativeElement.style.visibility = this._needShowRight ? 'hidden' : 'visible'; } if (this.rightBtnRef) { this.rightBtnRef.nativeElement.style.visibility = this._needShowLeft ? 'hidden' : 'visible'; } this.setBtnStyle(deltaX); } onTouchEnd(e) { const deltaX = e.changedTouches[0].clientX - this._startX; const needOpenRight = this._needShowRight && Math.abs(deltaX) > this._btnsRightWidth / 2; const needOpenLeft = this._needShowLeft && Math.abs(deltaX) > this._btnsLeftWidth / 2; if (needOpenRight) { this.doOpenRight(); } else if (needOpenLeft) { this.doOpenLeft(); } else { this.close(); } this._swiping = false; this._needShowLeft = false; this._needShowRight = false; } doOpenLeft() { this.open(this._btnsLeftWidth, true, false); } doOpenRight() { this.open(-this._btnsRightWidth, false, true); } onBtnClick(ev, btn) { const onPress = btn.onPress; if (onPress) { onPress(ev); } if (this.autoClose) { this.close(); } } open(value, openedLeft, openedRight) { this.onOpen.emit(); this._openedLeft = openedLeft; this._openedRight = openedRight; this.setBtnStyle(value); } ngOnInit() { this.setClassMap(); } ngAfterViewInit() { this._btnsLeftWidth = this.leftBtnRef ? this.leftBtnRef.nativeElement.offsetWidth : 0; this._btnsRightWidth = this.rightBtnRef ? this.rightBtnRef.nativeElement.offsetWidth : 0; document.body.addEventListener('touchstart', this.onCloseSwipe, true); } ngOnDestroy() { document.body.removeEventListener('touchstart', this.onCloseSwipe, true); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SwipeActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: SwipeActionComponent, selector: "SwipeAction, nzm-swipe-action", inputs: { left: "left", right: "right", autoClose: "autoClose", disabled: "disabled" }, outputs: { onOpen: "onOpen", onClose: "onClose" }, viewQueries: [{ propertyName: "leftBtnRef", first: true, predicate: ["leftBtnRef"], descendants: true }, { propertyName: "rightBtnRef", first: true, predicate: ["rightBtnRef"], descendants: true }, { propertyName: "content", first: true, predicate: ["contentRef"], descendants: true }, { propertyName: "cover", first: true, predicate: ["coverRef"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"(left.length != 0 || right.length != 0) && !disabled\" [ngClass]=\"wrapCls\">\n <div class=\"{{ prefixCls }}-cover\" #coverRef></div>\n <div *ngIf=\"left && left.length > 0\" class=\"{{ prefixCls }}-actions {{ prefixCls }}-actions-left\" #leftBtnRef>\n <div\n *ngFor=\"let btn of left\"\n class=\"{{ prefixCls }}-btn {{ btn.className }}\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\"\n >\n <div class=\"{{ prefixCls }}-btn-text\">\n {{ btn.text || 'Click' }}\n </div>\n </div>\n </div>\n <div *ngIf=\"right && right.length > 0\" class=\"{{ prefixCls }}-actions {{ prefixCls }}-actions-right\" #rightBtnRef>\n <div\n *ngFor=\"let btn of right\"\n class=\"{{ prefixCls }}-btn {{ btn.className }}\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\"\n >\n <div class=\"{{ prefixCls }}-btn-text\">\n {{ btn.text || 'Click' }}\n </div>\n </div>\n </div>\n <div\n class=\"{{ prefixCls }}-content\"\n #contentRef\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </div>\n</div>\n<div *ngIf=\"!((left.length != 0 || right.length != 0) && !disabled)\" class=\"{{ prefixCls }}-content\" #contentRef>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n</div>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SwipeActionComponent, decorators: [{ type: Component, args: [{ selector: 'SwipeAction, nzm-swipe-action', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(left.length != 0 || right.length != 0) && !disabled\" [ngClass]=\"wrapCls\">\n <div class=\"{{ prefixCls }}-cover\" #coverRef></div>\n <div *ngIf=\"left && left.length > 0\" class=\"{{ prefixCls }}-actions {{ prefixCls }}-actions-left\" #leftBtnRef>\n <div\n *ngFor=\"let btn of left\"\n class=\"{{ prefixCls }}-btn {{ btn.className }}\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\"\n >\n <div class=\"{{ prefixCls }}-btn-text\">\n {{ btn.text || 'Click' }}\n </div>\n </div>\n </div>\n <div *ngIf=\"right && right.length > 0\" class=\"{{ prefixCls }}-actions {{ prefixCls }}-actions-right\" #rightBtnRef>\n <div\n *ngFor=\"let btn of right\"\n class=\"{{ prefixCls }}-btn {{ btn.className }}\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\"\n >\n <div class=\"{{ prefixCls }}-btn-text\">\n {{ btn.text || 'Click' }}\n </div>\n </div>\n </div>\n <div\n class=\"{{ prefixCls }}-content\"\n #contentRef\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n >\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </div>\n</div>\n<div *ngIf=\"!((left.length != 0 || right.length != 0) && !disabled)\" class=\"{{ prefixCls }}-content\" #contentRef>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n</div>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n" }] }], ctorParameters: () => [], propDecorators: { leftBtnRef: [{ type: ViewChild, args: ['leftBtnRef'] }], rightBtnRef: [{ type: ViewChild, args: ['rightBtnRef'] }], content: [{ type: ViewChild, args: ['contentRef'] }], cover: [{ type: ViewChild, args: ['coverRef'] }], left: [{ type: Input }], right: [{ type: Input }], autoClose: [{ type: Input }], disabled: [{ type: Input }], onOpen: [{ type: Output }], onClose: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGUtYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvc3dpcGUtYWN0aW9uL3N3aXBlLWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3N3aXBlLWFjdGlvbi9zd2lwZS1hY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7QUFPdkIsTUFBTSxPQUFPLG9CQUFvQjtJQW1DL0I7UUFsQ0EsY0FBUyxHQUFXLFVBQVUsQ0FBQztRQUMvQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBRWIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQWlCdEMsU0FBSSxHQUFrQixFQUFFLENBQUM7UUFFekIsVUFBSyxHQUFrQixFQUFFLENBQUM7UUFFMUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUUzQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFCLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFXckQsaUJBQVksR0FBRyxFQUFFLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDNUMsT0FBTzthQUNSO1lBQ0QsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLElBQUksQ0FB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QyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFdBQVc7UUFDVCxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNFLENBQUM7OEdBeEpVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLG1rQkNqQmpDLHNpREE2Q0E7OzJGRDVCYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsK0JBQStCLGlCQUUxQixpQkFBaUIsQ0FBQyxJQUFJO3dEQWdCckMsVUFBVTtzQkFEVCxTQUFTO3VCQUFDLFlBQVk7Z0JBR3ZCLFdBQVc7c0JBRFYsU0FBUzt1QkFBQyxhQUFhO2dCQUd4QixPQUFPO3NCQUROLFNBQVM7dUJBQUMsWUFBWTtnQkFHdkIsS0FBSztzQkFESixTQUFTO3VCQUFDLFVBQVU7Z0JBSXJCLElBQUk7c0JBREgsS0FBSztnQkFHTixLQUFLO3NCQURKLEtBQUs7Z0JBR04sU0FBUztzQkFEUixLQUFLO2dCQUdOLFFBQVE7c0JBRFAsS0FBSztnQkFHTixNQUFNO3NCQURMLE1BQU07Z0JBR1AsT0FBTztzQkFETixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTd2lwZUFjdGlvbiwgbnptLXN3aXBlLWFjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2lwZS1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFN3aXBlQWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zd2lwZSc7XG4gIHdyYXBDbHM6IG9iamVjdCA9IHt9O1xuXG4gIHByaXZhdGUgX3N3aXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlbmVkTGVmdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vcGVuZWRSaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9idG5zTGVmdFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgX2J0bnNSaWdodFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgX25lZWRTaG93TGVmdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbmVlZFNob3dSaWdodDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc3RhcnRYOiBudW1iZXI7XG5cbiAgQFZpZXdDaGlsZCgnbGVmdEJ0blJlZicpXG4gIGxlZnRCdG5SZWY7XG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0QnRuUmVmJylcbiAgcmlnaHRCdG5SZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRSZWYnKVxuICBjb250ZW50O1xuICBAVmlld0NoaWxkKCdjb3ZlclJlZicpXG4gIGNvdmVyO1xuXG4gIEBJbnB1dCgpXG4gIGxlZnQ6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgQElucHV0KClcbiAgcmlnaHQ6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgQElucHV0KClcbiAgYXV0b0Nsb3NlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKVxuICBvbk9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRDbGFzc01hcCgpIHtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbdGhpcy5wcmVmaXhDbHNdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1zd2lwaW5nYF06IHRoaXMuX3N3aXBpbmdcbiAgICB9O1xuICB9XG5cbiAgb25DbG9zZVN3aXBlID0gZXYgPT4ge1xuICAgIGlmICghKHRoaXMuX29wZW5lZExlZnQgfHwgdGhpcy5fb3BlbmVkUmlnaHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBOb2RlID0gZXYudGFyZ2V0LmNsb3Nlc3QoYC4ke3RoaXMucHJlZml4Q2xzfS1hY3Rpb25zYCk7XG4gICAgaWYgKCFwTm9kZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9vcGVuZWRMZWZ0IHx8IHRoaXMuX29wZW5lZFJpZ2h0KSB7XG4gICAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLnNldEJ0blN0eWxlKDApO1xuICAgIHRoaXMuX29wZW5lZExlZnQgPSBmYWxzZTtcbiAgICB0aGlzLl9vcGVuZWRSaWdodCA9IGZhbHNlO1xuICB9XG5cbiAgc2V0QnRuU3R5bGUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5fYnRuc0xlZnRXaWR0aCA9PT0gMCB8fCB0aGlzLl9idG5zUmlnaHRXaWR0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fYnRuc0xlZnRXaWR0aCA9IHRoaXMubGVmdEJ0blJlZiA/IHRoaXMubGVmdEJ0blJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDogMDtcbiAgICAgIHRoaXMuX2J0bnNSaWdodFdpZHRoID0gdGhpcy5yaWdodEJ0blJlZiA/IHRoaXMucmlnaHRCdG5SZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA6IDA7XG4gICAgfVxuICAgIGNvbnN0IGxpbWl0ID0gdmFsdWUgPiAwID8gdGhpcy5fYnRuc0xlZnRXaWR0aCA6IC10aGlzLl9idG5zUmlnaHRXaWR0aDtcbiAgICBjb25zdCBjb250ZW50TGVmdCA9IHRoaXMuZ2V0Q29udGVudEVhc2luZyh2YWx1ZSwgbGltaXQpO1xuICAgIHRoaXMuY29udGVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtjb250ZW50TGVmdH1weGA7XG4gICAgdGhpcy5jb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBNYXRoLmFicyh2YWx1ZSkgPiAwID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB0aGlzLmNvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2NvbnRlbnRMZWZ0fXB4YDtcbiAgfVxuXG4gIGdldENvbnRlbnRFYXNpbmcodmFsdWUsIGxpbWl0KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKSAtIE1hdGguYWJzKGxpbWl0KSA+IDAgPyBsaW1pdCA6IHZhbHVlO1xuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLl9zdGFydFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgdGhpcy5fc3dpcGluZyA9IHRydWU7XG4gIH1cblxuICBvblRvdWNoTW92ZShlKSB7XG4gICAgY29uc3QgZGVsdGFYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRYO1xuICAgIHRoaXMuX25lZWRTaG93UmlnaHQgPSBkZWx0YVggPCAtNSAmJiB0aGlzLnJpZ2h0Lmxlbmd0aCA+IDA7XG4gICAgdGhpcy5fbmVlZFNob3dMZWZ0ID0gZGVsdGFYID4gNSAmJiB0aGlzLmxlZnQubGVuZ3RoID4gMDtcbiAgICBpZiAodGhpcy5sZWZ0QnRuUmVmKSB7XG4gICAgICB0aGlzLmxlZnRCdG5SZWYubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gdGhpcy5fbmVlZFNob3dSaWdodCA/ICdoaWRkZW4nIDogJ3Zpc2libGUnO1xuICAgIH1cbiAgICBpZiAodGhpcy5yaWdodEJ0blJlZikge1xuICAgICAgdGhpcy5yaWdodEJ0blJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSB0aGlzLl9uZWVkU2hvd0xlZnQgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJztcbiAgICB9XG4gICAgdGhpcy5zZXRCdG5TdHlsZShkZWx0YVgpO1xuICB9XG5cbiAgb25Ub3VjaEVuZChlKSB7XG4gICAgY29uc3QgZGVsdGFYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRYO1xuXG4gICAgY29uc3QgbmVlZE9wZW5SaWdodCA9IHRoaXMuX25lZWRTaG93UmlnaHQgJiYgTWF0aC5hYnMoZGVsdGFYKSA+IHRoaXMuX2J0bnNSaWdodFdpZHRoIC8gMjtcbiAgICBjb25zdCBuZWVkT3BlbkxlZnQgPSB0aGlzLl9uZWVkU2hvd0xlZnQgJiYgTWF0aC5hYnMoZGVsdGFYKSA+IHRoaXMuX2J0bnNMZWZ0V2lkdGggLyAyO1xuXG4gICAgaWYgKG5lZWRPcGVuUmlnaHQpIHtcbiAgICAgIHRoaXMuZG9PcGVuUmlnaHQoKTtcbiAgICB9IGVsc2UgaWYgKG5lZWRPcGVuTGVmdCkge1xuICAgICAgdGhpcy5kb09wZW5MZWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fc3dpcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX25lZWRTaG93TGVmdCA9IGZhbHNlO1xuICAgIHRoaXMuX25lZWRTaG93UmlnaHQgPSBmYWxzZTtcbiAgfVxuXG4gIGRvT3BlbkxlZnQoKSB7XG4gICAgdGhpcy5vcGVuKHRoaXMuX2J0bnNMZWZ0V2lkdGgsIHRydWUsIGZhbHNlKTtcbiAgfVxuXG4gIGRvT3BlblJpZ2h0KCkge1xuICAgIHRoaXMub3BlbigtdGhpcy5fYnRuc1JpZ2h0V2lkdGgsIGZhbHNlLCB0cnVlKTtcbiAgfVxuXG4gIG9uQnRuQ2xpY2soZXYsIGJ0bikge1xuICAgIGNvbnN0IG9uUHJlc3MgPSBidG4ub25QcmVzcztcbiAgICBpZiAob25QcmVzcykge1xuICAgICAgb25QcmVzcyhldik7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9DbG9zZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4odmFsdWUsIG9wZW5lZExlZnQsIG9wZW5lZFJpZ2h0KSB7XG4gICAgdGhpcy5vbk9wZW4uZW1pdCgpO1xuICAgIHRoaXMuX29wZW5lZExlZnQgPSBvcGVuZWRMZWZ0O1xuICAgIHRoaXMuX29wZW5lZFJpZ2h0ID0gb3BlbmVkUmlnaHQ7XG4gICAgdGhpcy5zZXRCdG5TdHlsZSh2YWx1ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzTWFwKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fYnRuc0xlZnRXaWR0aCA9IHRoaXMubGVmdEJ0blJlZiA/IHRoaXMubGVmdEJ0blJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDogMDtcbiAgICB0aGlzLl9idG5zUmlnaHRXaWR0aCA9IHRoaXMucmlnaHRCdG5SZWYgPyB0aGlzLnJpZ2h0QnRuUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggOiAwO1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25DbG9zZVN3aXBlLCB0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25DbG9zZVN3aXBlLCB0cnVlKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIihsZWZ0Lmxlbmd0aCAhPSAwIHx8IHJpZ2h0Lmxlbmd0aCAhPSAwKSAmJiAhZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ3cmFwQ2xzXCI+XG4gIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tY292ZXJcIiAjY292ZXJSZWY+PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsZWZ0ICYmIGxlZnQubGVuZ3RoID4gMFwiIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWFjdGlvbnMge3sgcHJlZml4Q2xzIH19LWFjdGlvbnMtbGVmdFwiICNsZWZ0QnRuUmVmPlxuICAgIDxkaXZcbiAgICAgICpuZ0Zvcj1cImxldCBidG4gb2YgbGVmdFwiXG4gICAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS1idG4ge3sgYnRuLmNsYXNzTmFtZSB9fVwiXG4gICAgICBbbmdTdHlsZV09XCJidG4uc3R5bGVcIlxuICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwib25CdG5DbGljaygkZXZlbnQsIGJ0bilcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tYnRuLXRleHRcIj5cbiAgICAgICAge3sgYnRuLnRleHQgfHwgJ0NsaWNrJyB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwicmlnaHQgJiYgcmlnaHQubGVuZ3RoID4gMFwiIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LWFjdGlvbnMge3sgcHJlZml4Q2xzIH19LWFjdGlvbnMtcmlnaHRcIiAjcmlnaHRCdG5SZWY+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IGJ0biBvZiByaWdodFwiXG4gICAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS1idG4ge3sgYnRuLmNsYXNzTmFtZSB9fVwiXG4gICAgICBbbmdTdHlsZV09XCJidG4uc3R5bGVcIlxuICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwib25CdG5DbGljaygkZXZlbnQsIGJ0bilcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tYnRuLXRleHRcIj5cbiAgICAgICAge3sgYnRuLnRleHQgfHwgJ0NsaWNrJyB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tY29udGVudFwiXG4gICAgI2NvbnRlbnRSZWZcbiAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoU3RhcnQoJGV2ZW50KVwiXG4gICAgKHRvdWNobW92ZSk9XCJvblRvdWNoTW92ZSgkZXZlbnQpXCJcbiAgICAodG91Y2hlbmQpPVwib25Ub3VjaEVuZCgkZXZlbnQpXCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50XCI+PC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhKChsZWZ0Lmxlbmd0aCAhPSAwIHx8IHJpZ2h0Lmxlbmd0aCAhPSAwKSAmJiAhZGlzYWJsZWQpXCIgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tY29udGVudFwiICNjb250ZW50UmVmPlxuICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFwiPjwvbmctdGVtcGxhdGU+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19