UNPKG

ng-zorro-antd-mobile

Version:

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

332 lines 46 kB
import { Input, Output, Component, ViewChild, forwardRef, TemplateRef, HostBinding, EventEmitter, HostListener, ViewContainerRef, ViewEncapsulation, ElementRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class PullToRefreshComponent { get direction() { return this._direction; } set direction(value) { this._direction = value; this.refreshUp = this._direction === 'up' || this._direction === ''; this.refreshDown = this._direction === 'down' || this._direction === ''; } get headerIndicator() { return this._headerIndicator; } set headerIndicator(value) { Object.assign(this._headerIndicator, value); } get footerIndicator() { return this._footerIndicator; } set footerIndicator(value) { Object.assign(this._footerIndicator, value); } touchstart(e) { this._startTime = Date.now(); if (this._direction === 'down' || (this._direction === '' && !this._endReach)) { if (this.ele.nativeElement.scrollTop > 0) { this.startY = undefined; return; } this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY; this.state.drag = undefined; } else { this.startY = e && e.changedTouches && e.changedTouches[0] && e.changedTouches[0].clientY; this._clientHeight = this._pullToRefresh.element.nativeElement.clientHeight; this._currentContentHeight = this.ele.nativeElement.clientHeight; } this.transtionCls = ''; } touchmove(e) { if (this._direction === 'down' || (this._direction === '' && !this._endReach)) { if (this.ele.nativeElement.scrollTop > 0) { return; } let distanceY = e.changedTouches[0].clientY - this.startY; this.state.drag = distanceY >= 0; if (this.state.drag) { // 禁止滚动 if (e.cancelable) { e.preventDefault(); } } else { return; } if (distanceY > this.damping) { //当超过设定阈值是,缓慢增加 distanceY = (distanceY / (distanceY + this.damping)) * this.damping * 2; } else if (distanceY < 0) { distanceY = 0; } if (distanceY > this.distanceToRefresh) { this.state.currentState = 'activate'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } } this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; } else { let distanceY = e.changedTouches[0].clientY - this.startY; //向上拉动的时候,如果当前窗口内容没有滚到最后,则不实现拖动的动作;向下滚动不实现拖动动作 if (Math.abs(this._lastContentOffset) < this._clientHeight - this._currentContentHeight - this.distanceToRefresh || distanceY > 0) { // 滚动 this.state.drag = false; } else { // 上拉 this.state.drag = true; } if (this.state.drag) { // 禁止滚动 if (e.cancelable) { e.preventDefault(); } } else { return; } //如果滑动到底部了,滑动距离随着拉动的距离增加缓慢增加 distanceY = -(distanceY / (distanceY - this.damping)) * this.damping; if (Math.abs(distanceY) > this.distanceToRefresh) { this.state.currentState = 'activate'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } } this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; } } touchend(e) { if (!this.startY || this.state.drag === false) { return; } const distanceY = e.changedTouches[0].clientY - this.startY; if (Math.abs(distanceY) >= this.distanceToRefresh) { this.state.currentState = 'release'; if (this._direction === 'down' || (this._direction === '' && !this._endReach)) { this.translateY(this.distanceToRefresh + 1); } else { this.translateY(-this.distanceToRefresh - 1); } if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } setTimeout(() => { this.state.currentState = 'finish'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } if (this._direction === 'down' || (this._direction === '' && !this._endReach)) { this.onRefresh.emit('down'); } else { this.translateY(-this.distanceToRefresh - 1); this.onRefresh.emit('up'); } setTimeout(() => { this.state.currentState = 'deactivate'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } this.translateY(0); }, 0); }, 500); } else { this.translateY(0); } } touchcancel() { this.translateY(0); } scroll(evt) { this._endTime = Date.now(); const contentOffset = evt.target.scrollTop; this._lastContentOffset = contentOffset; if (this._direction === '') { if (contentOffset > 0 && evt.target.scrollTop + this.ele.nativeElement.clientHeight === evt.target.scrollHeight) { setTimeout(() => { this._endReach = true; }, 100); } else { this._endReach = false; } } if (!this.endReachedRefresh || this._direction !== 'down') { return; } if (contentOffset > 0 && evt.target.scrollTop + this.ele.nativeElement.clientHeight > evt.target.scrollHeight - this.distanceToRefresh && this._endTime - this._startTime >= 100) { this._startTime = this._endTime; if (this.refreshing) { this.state.currentState = 'release'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } } setTimeout(() => { if (this.endReachedRefresh) { this.onRefresh.emit('endReachedRefresh'); } if (this.refreshing) { this.state.currentState = 'finish'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } } }, 500); } else { setTimeout(() => { if (this.refreshing) { this.state.currentState = 'finish'; if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } } }, 500); } } constructor(ele) { this.ele = ele; this.transtionCls = {}; this.style = { '-webkit-transform': 'translate3d( 0, 0, 0 )', transform: 'translate3d( 0, 0, 0 )' }; this.state = { currentState: 'deactivate', drag: false }; this._headerIndicator = { activate: '松开立即刷新', deactivate: '下拉可以刷新', release: '刷新中。。。', finish: '完成刷新' }; this._footerIndicator = { activate: '松开立即刷新', deactivate: '上拉可以刷新', release: '刷新中。。。', finish: '完成刷新' }; this._startTime = 0; this._endTime = 0; this._endReach = false; this._direction = ''; this._clientHeight = 0; this._currentContentHeight = 0; this._lastContentOffset = 0; this.distanceToRefresh = 25; //触发刷新距离 this.damping = 100; // 下拉的最大距离 this.endReachedRefresh = false; this.refreshing = false; this.onRefresh = new EventEmitter(); this.refresh = true; this.container = true; this.refreshUp = this._direction === 'up' || this._direction === ''; this.refreshDown = this._direction === 'down' || this._direction === ''; } isTemplateRef(value) { return value instanceof TemplateRef; } translateY(distanceY) { this.transtionCls = 'am-pull-to-refresh-transition'; this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; } writeValue(value) { if (value !== null) { this.state = value; } } registerOnChange(fn) { this._ngModelOnChange = fn; } registerOnTouched(fn) { this._ngModelOnTouched = fn; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PullToRefreshComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: PullToRefreshComponent, selector: "PullToRefresh, nzm-pull-to-refresh", inputs: { distanceToRefresh: "distanceToRefresh", damping: "damping", endReachedRefresh: "endReachedRefresh", refreshing: "refreshing", direction: "direction", headerIndicator: "headerIndicator", footerIndicator: "footerIndicator" }, outputs: { onRefresh: "onRefresh" }, host: { listeners: { "touchstart": "touchstart($event)", "touchmove": "touchmove($event)", "touchend": "touchend($event)", "touchcancel": "touchcancel()", "scroll": "scroll($event)" }, properties: { "class.am-pull-to-refresh": "this.refresh", "class.super-container": "this.container", "class.am-pull-to-refresh-up": "this.refreshUp", "class.am-pull-to-refresh-down": "this.refreshDown" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PullToRefreshComponent), multi: true } ], viewQueries: [{ propertyName: "_pullToRefresh", first: true, predicate: ["pullToRefresh"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: "<div class=\"am-pull-to-refresh-content-wrapper\">\n <div class=\"am-pull-to-refresh-content\" [ngClass]=\"transtionCls\" [ngStyle]=\"style\">\n <div *ngIf=\"refreshDown\" class=\"am-pull-to-refresh-indicator am-pull-to-refresh-header-indicator\">\n <ng-template\n *ngIf=\"isTemplateRef(headerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"headerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(headerIndicator[state.currentState])\">{{\n headerIndicator[state.currentState]\n }}</ng-container>\n </div>\n <div #pullToRefresh>\n <ng-content></ng-content>\n <div\n *ngIf=\"direction === 'down' && endReachedRefresh\"\n class=\"am-pull-to-refresh-indicator am-pull-to-refresh-footer-indicator\"\n >\n <ng-template\n *ngIf=\"isTemplateRef(footerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"footerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(footerIndicator[state.currentState])\">{{\n footerIndicator[state.currentState]\n }}</ng-container>\n </div>\n </div>\n <div *ngIf=\"refreshUp\" class=\"am-pull-to-refresh-indicator am-pull-to-refresh-footer-indicator\">\n <ng-template\n *ngIf=\"isTemplateRef(footerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"footerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(footerIndicator[state.currentState])\">{{\n footerIndicator[state.currentState]\n }}</ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: PullToRefreshComponent, decorators: [{ type: Component, args: [{ selector: 'PullToRefresh, nzm-pull-to-refresh', encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PullToRefreshComponent), multi: true } ], template: "<div class=\"am-pull-to-refresh-content-wrapper\">\n <div class=\"am-pull-to-refresh-content\" [ngClass]=\"transtionCls\" [ngStyle]=\"style\">\n <div *ngIf=\"refreshDown\" class=\"am-pull-to-refresh-indicator am-pull-to-refresh-header-indicator\">\n <ng-template\n *ngIf=\"isTemplateRef(headerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"headerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(headerIndicator[state.currentState])\">{{\n headerIndicator[state.currentState]\n }}</ng-container>\n </div>\n <div #pullToRefresh>\n <ng-content></ng-content>\n <div\n *ngIf=\"direction === 'down' && endReachedRefresh\"\n class=\"am-pull-to-refresh-indicator am-pull-to-refresh-footer-indicator\"\n >\n <ng-template\n *ngIf=\"isTemplateRef(footerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"footerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(footerIndicator[state.currentState])\">{{\n footerIndicator[state.currentState]\n }}</ng-container>\n </div>\n </div>\n <div *ngIf=\"refreshUp\" class=\"am-pull-to-refresh-indicator am-pull-to-refresh-footer-indicator\">\n <ng-template\n *ngIf=\"isTemplateRef(footerIndicator[state.currentState])\"\n [ngTemplateOutlet]=\"footerIndicator[state.currentState]\"\n ></ng-template>\n <ng-container *ngIf=\"!isTemplateRef(footerIndicator[state.currentState])\">{{\n footerIndicator[state.currentState]\n }}</ng-container>\n </div>\n </div>\n</div>\n" }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { _pullToRefresh: [{ type: ViewChild, args: ['pullToRefresh', { read: ViewContainerRef, static: true }] }], distanceToRefresh: [{ type: Input }], damping: [{ type: Input }], endReachedRefresh: [{ type: Input }], refreshing: [{ type: Input }], direction: [{ type: Input }], headerIndicator: [{ type: Input }], footerIndicator: [{ type: Input }], onRefresh: [{ type: Output }], refresh: [{ type: HostBinding, args: ['class.am-pull-to-refresh'] }], container: [{ type: HostBinding, args: ['class.super-container'] }], refreshUp: [{ type: HostBinding, args: ['class.am-pull-to-refresh-up'] }], refreshDown: [{ type: HostBinding, args: ['class.am-pull-to-refresh-down'] }], touchstart: [{ type: HostListener, args: ['touchstart', ['$event']] }], touchmove: [{ type: HostListener, args: ['touchmove', ['$event']] }], touchend: [{ type: HostListener, args: ['touchend', ['$event']] }], touchcancel: [{ type: HostListener, args: ['touchcancel'] }], scroll: [{ type: HostListener, args: ['scroll', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvcHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3B1bGwtdG8tcmVmcmVzaC9wdWxsLXRvLXJlZnJlc2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBb0J6RSxNQUFNLE9BQU8sc0JBQXNCO0lBK0NqQyxJQUNJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEtBQWE7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUNJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksZUFBZSxDQUFDLEtBQWdCO1FBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFF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O3NCQURoQixLQUFLO2dCQUdOLE9BQU87c0JBRE4sS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxLQUFLO2dCQUdGLFNBQVM7c0JBRFosS0FBSztnQkFVRixlQUFlO3NCQURsQixLQUFLO2dCQVFGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBUU4sU0FBUztzQkFEUixNQUFNO2dCQUlQLE9BQU87c0JBRE4sV0FBVzt1QkFBQywwQkFBMEI7Z0JBR3ZDLFNBQVM7c0JBRFIsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBR3BDLFNBQVM7c0JBRFIsV0FBVzt1QkFBQyw2QkFBNkI7Z0JBRzFDLFdBQVc7c0JBRFYsV0FBVzt1QkFBQywrQkFBK0I7Z0JBSTVDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0J0QyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9FckMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF3Q3BDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxhQUFhO2dCQUszQixNQUFNO3NCQURMLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBIb3N0QmluZGluZyxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuZXhwb3J0IGludGVyZmFjZSBJbmRpY2F0b3Ige1xuICBhY3RpdmF0ZT86IGFueTtcbiAgZGVhY3RpdmF0ZT86IGFueTtcbiAgcmVsZWFzZT86IGFueTtcbiAgZmluaXNoPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQdWxsVG9SZWZyZXNoLCBuem0tcHVsbC10by1yZWZyZXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHVsbFRvUmVmcmVzaENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBQdWxsVG9SZWZyZXNoQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICB0cmFuc3Rpb25DbHM6IGFueSA9IHt9O1xuICBzdHlsZTogb2JqZWN0ID0ge1xuICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgMCwgMCApJyxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgMCwgMCApJ1xuICB9O1xuICBzdGFydFk6IG51bWJlcjtcbiAgc3RhdGU6IGFueSA9IHtcbiAgICBjdXJyZW50U3RhdGU6ICdkZWFjdGl2YXRlJyxcbiAgICBkcmFnOiBmYWxzZVxuICB9O1xuXG4gIHByaXZhdGUgX2hlYWRlckluZGljYXRvcjogSW5kaWNhdG9yID0ge1xuICAgIGFjdGl2YXRlOiAn5p2+5byA56uL5Y2z5Yi35pawJyxcbiAgICBkZWFjdGl2YXRlOiAn5LiL5ouJ5Y+v5Lul5Yi35pawJyxcbiAgICByZWxlYXNlOiAn5Yi35paw5Lit44CC44CC44CCJyxcbiAgICBmaW5pc2g6ICflrozmiJDliLfmlrAnXG4gIH07XG5cbiAgcHJpdmF0ZSBfZm9vdGVySW5kaWNhdG9yOiBJbmRpY2F0b3IgPSB7XG4gICAgYWN0aXZhdGU6ICfmnb7lvIDnq4vljbPliLfmlrAnLFxuICAgIGRlYWN0aXZhdGU6ICfkuIrmi4nlj6/ku6XliLfmlrAnLFxuICAgIHJlbGVhc2U6ICfliLfmlrDkuK3jgILjgILjgIInLFxuICAgIGZpbmlzaDogJ+WujOaIkOWIt+aWsCdcbiAgfTtcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2VuZFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2VuZFJlYWNoOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2RpcmVjdGlvbjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2NsaWVudEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudENvbnRlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50T2Zmc2V0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9uZ01vZGVsT25DaGFuZ2U6ICh2YWx1ZTogb2JqZWN0KSA9PiB7fTtcbiAgcHJpdmF0ZSBfbmdNb2RlbE9uVG91Y2hlZDogKCkgPT4ge307XG5cbiAgQFZpZXdDaGlsZCgncHVsbFRvUmVmcmVzaCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3B1bGxUb1JlZnJlc2g6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQElucHV0KClcbiAgZGlzdGFuY2VUb1JlZnJlc2g6IG51bWJlciA9IDI1OyAvL+inpuWPkeWIt+aWsOi3neemu1xuICBASW5wdXQoKVxuICBkYW1waW5nOiBudW1iZXIgPSAxMDA7IC8vIOS4i+aLieeahOacgOWkp+i3neemu1xuICBASW5wdXQoKVxuICBlbmRSZWFjaGVkUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICByZWZyZXNoaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGdldCBkaXJlY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICB9XG4gIHNldCBkaXJlY3Rpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RpcmVjdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMucmVmcmVzaFVwID0gdGhpcy5fZGlyZWN0aW9uID09PSAndXAnIHx8IHRoaXMuX2RpcmVjdGlvbiA9PT0gJyc7XG4gICAgdGhpcy5yZWZyZXNoRG93biA9IHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8IHRoaXMuX2RpcmVjdGlvbiA9PT0gJyc7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhlYWRlckluZGljYXRvcigpOiBJbmRpY2F0b3Ige1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJJbmRpY2F0b3I7XG4gIH1cbiAgc2V0IGhlYWRlckluZGljYXRvcih2YWx1ZTogSW5kaWNhdG9yKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9oZWFkZXJJbmRpY2F0b3IsIHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZm9vdGVySW5kaWNhdG9yKCk6IEluZGljYXRvciB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvb3RlckluZGljYXRvcjtcbiAgfVxuICBzZXQgZm9vdGVySW5kaWNhdG9yKHZhbHVlOiBJbmRpY2F0b3IpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2Zvb3RlckluZGljYXRvciwgdmFsdWUpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvblJlZnJlc2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoJylcbiAgcmVmcmVzaDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3VwZXItY29udGFpbmVyJylcbiAgY29udGFpbmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wdWxsLXRvLXJlZnJlc2gtdXAnKVxuICByZWZyZXNoVXA6IGJvb2xlYW4gPSB0aGlzLl9kaXJlY3Rpb24gPT09ICd1cCcgfHwgdGhpcy5fZGlyZWN0aW9uID09PSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1wdWxsLXRvLXJlZnJlc2gtZG93bicpXG4gIHJlZnJlc2hEb3duOiBib29sZWFuID0gdGhpcy5fZGlyZWN0aW9uID09PSAnZG93bicgfHwgdGhpcy5fZGlyZWN0aW9uID09PSAnJztcblxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgdG91Y2hzdGFydChlKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGlyZWN0aW9uID09PSAnZG93bicgfHwgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJycgJiYgIXRoaXMuX2VuZFJlYWNoKSkge1xuICAgICAgaWYgKHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID4gMCkge1xuICAgICAgICB0aGlzLnN0YXJ0WSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGFydFkgPSBlICYmIGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB0aGlzLnN0YXRlLmRyYWcgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnRZID0gZSAmJiBlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgdGhpcy5fY2xpZW50SGVpZ2h0ID0gdGhpcy5fcHVsbFRvUmVmcmVzaC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnRIZWlnaHQgPSB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgdGhpcy50cmFuc3Rpb25DbHMgPSAnJztcbiAgfVxuICBASG9zdExpc3RlbmVyKCd0b3VjaG1vdmUnLCBbJyRldmVudCddKVxuICB0b3VjaG1vdmUoZSkge1xuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCAodGhpcy5fZGlyZWN0aW9uID09PSAnJyAmJiAhdGhpcy5fZW5kUmVhY2gpKSB7XG4gICAgICBpZiAodGhpcy5lbGUubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZyA9IGRpc3RhbmNlWSA+PSAwO1xuICAgICAgaWYgKHRoaXMuc3RhdGUuZHJhZykge1xuICAgICAgICAvLyDnpoHmraLmu5rliqhcbiAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGFtcGluZykge1xuICAgICAgICAvL+W9k+i2hei/h+iuvuWumumYiOWAvOaYr++8jOe8k+aFouWinuWKoFxuICAgICAgICBkaXN0YW5jZVkgPSAoZGlzdGFuY2VZIC8gKGRpc3RhbmNlWSArIHRoaXMuZGFtcGluZykpICogdGhpcy5kYW1waW5nICogMjtcbiAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2VZIDwgMCkge1xuICAgICAgICBkaXN0YW5jZVkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RhdGUgPSAnYWN0aXZhdGUnO1xuICAgICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZGlzdGFuY2VZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgICAvL+WQkeS4iuaLieWKqOeahOaXtuWAme+8jOWmguaenOW9k+WJjeeql+WPo+WGheWuueayoeaciea7muWIsOacgOWQju+8jOWImeS4jeWunueOsOaLluWKqOeahOWKqOS9nO+8m+WQkeS4i+a7muWKqOS4jeWunueOsOaLluWKqOWKqOS9nFxuICAgICAgaWYgKFxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0Q29udGVudE9mZnNldCkgPCB0aGlzLl9jbGllbnRIZWlnaHQgLSB0aGlzLl9jdXJyZW50Q29udGVudEhlaWdodCAtIHRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggfHxcbiAgICAgICAgZGlzdGFuY2VZID4gMFxuICAgICAgKSB7XG4gICAgICAgIC8vIOa7muWKqFxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4iuaLiVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGUuZHJhZykge1xuICAgICAgICAvLyDnpoHmraLmu5rliqhcbiAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy/lpoLmnpzmu5HliqjliLDlupXpg6jkuobvvIzmu5Hliqjot53nprvpmo/nnYDmi4nliqjnmoTot53nprvlop7liqDnvJPmhaLlop7liqBcbiAgICAgIGRpc3RhbmNlWSA9IC0oZGlzdGFuY2VZIC8gKGRpc3RhbmNlWSAtIHRoaXMuZGFtcGluZykpICogdGhpcy5kYW1waW5nO1xuICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlWSkgPiB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2FjdGl2YXRlJztcbiAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hlbmQnLCBbJyRldmVudCddKVxuICB0b3VjaGVuZChlKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0WSB8fCB0aGlzLnN0YXRlLmRyYWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpc3RhbmNlWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpID49IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ3JlbGVhc2UnO1xuICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8ICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnICYmICF0aGlzLl9lbmRSZWFjaCkpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVZKHRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggKyAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlWSgtdGhpcy5kaXN0YW5jZVRvUmVmcmVzaCAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RhdGUgPSAnZmluaXNoJztcbiAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uID09PSAnZG93bicgfHwgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJycgJiYgIXRoaXMuX2VuZFJlYWNoKSkge1xuICAgICAgICAgIHRoaXMub25SZWZyZXNoLmVtaXQoJ2Rvd24nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVkoLXRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggLSAxKTtcbiAgICAgICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCd1cCcpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2RlYWN0aXZhdGUnO1xuICAgICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVZKDApO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlWSgwKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hjYW5jZWwnKVxuICB0b3VjaGNhbmNlbCgpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZVkoMCk7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgc2Nyb2xsKGV2dCkge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNvbnRlbnRPZmZzZXQgPSBldnQudGFyZ2V0LnNjcm9sbFRvcDtcbiAgICB0aGlzLl9sYXN0Q29udGVudE9mZnNldCA9IGNvbnRlbnRPZmZzZXQ7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJycpIHtcbiAgICAgIGlmIChjb250ZW50T2Zmc2V0ID4gMCAmJiBldnQudGFyZ2V0LnNjcm9sbFRvcCArIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSBldnQudGFyZ2V0LnNjcm9sbEhlaWdodCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbmRSZWFjaCA9IHRydWU7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9lbmRSZWFjaCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZW5kUmVhY2hlZFJlZnJlc2ggfHwgdGhpcy5fZGlyZWN0aW9uICE9PSAnZG93bicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29udGVudE9mZnNldCA+IDAgJiZcbiAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wICsgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPiBldnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIHRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggJiZcbiAgICAgIHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUgPj0gMTAwXG4gICAgKSB7XG4gICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aGlzLl9lbmRUaW1lO1xuICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdyZWxlYXNlJztcbiAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVuZFJlYWNoZWRSZWZyZXNoKSB7XG4gICAgICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgnZW5kUmVhY2hlZFJlZnJlc2gnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoaW5nKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RhdGUgPSAnZmluaXNoJztcbiAgICAgICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCA1MDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2ZpbmlzaCc7XG4gICAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgNTAwKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZTogRWxlbWVudFJlZikge31cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICB0cmFuc2xhdGVZKGRpc3RhbmNlWSkge1xuICAgIHRoaXMudHJhbnN0aW9uQ2xzID0gJ2FtLXB1bGwtdG8tcmVmcmVzaC10cmFuc2l0aW9uJztcbiAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICB9O1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0YXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IG9iamVjdCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMuX25nTW9kZWxPblRvdWNoZWQgPSBmbjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFtLXB1bGwtdG8tcmVmcmVzaC1jb250ZW50LXdyYXBwZXJcIj5cbiAgPGRpdiBjbGFzcz1cImFtLXB1bGwtdG8tcmVmcmVzaC1jb250ZW50XCIgW25nQ2xhc3NdPVwidHJhbnN0aW9uQ2xzXCIgW25nU3R5bGVdPVwic3R5bGVcIj5cbiAgICA8ZGl2ICpuZ0lmPVwicmVmcmVzaERvd25cIiBjbGFzcz1cImFtLXB1bGwtdG8tcmVmcmVzaC1pbmRpY2F0b3IgYW0tcHVsbC10by1yZWZyZXNoLWhlYWRlci1pbmRpY2F0b3JcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAqbmdJZj1cImlzVGVtcGxhdGVSZWYoaGVhZGVySW5kaWNhdG9yW3N0YXRlLmN1cnJlbnRTdGF0ZV0pXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVySW5kaWNhdG9yW3N0YXRlLmN1cnJlbnRTdGF0ZV1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGVSZWYoaGVhZGVySW5kaWNhdG9yW3N0YXRlLmN1cnJlbnRTdGF0ZV0pXCI+e3tcbiAgICAgICAgaGVhZGVySW5kaWNhdG9yW3N0YXRlLmN1cnJlbnRTdGF0ZV1cbiAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAjcHVsbFRvUmVmcmVzaD5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJkaXJlY3Rpb24gPT09ICdkb3duJyAmJiBlbmRSZWFjaGVkUmVmcmVzaFwiXG4gICAgICAgIGNsYXNzPVwiYW0tcHVsbC10by1yZWZyZXNoLWluZGljYXRvciBhbS1wdWxsLXRvLXJlZnJlc2gtZm9vdGVyLWluZGljYXRvclwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICpuZ0lmPVwiaXNUZW1wbGF0ZVJlZihmb290ZXJJbmRpY2F0b3Jbc3RhdGUuY3VycmVudFN0YXRlXSlcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdXCJcbiAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZVJlZihmb290ZXJJbmRpY2F0b3Jbc3RhdGUuY3VycmVudFN0YXRlXSlcIj57e1xuICAgICAgICAgIGZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdXG4gICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwicmVmcmVzaFVwXCIgY2xhc3M9XCJhbS1wdWxsLXRvLXJlZnJlc2gtaW5kaWNhdG9yIGFtLXB1bGwtdG8tcmVmcmVzaC1mb290ZXItaW5kaWNhdG9yXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKGZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdKVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdXCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlUmVmKGZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdKVwiPnt7XG4gICAgICAgIGZvb3RlckluZGljYXRvcltzdGF0ZS5jdXJyZW50U3RhdGVdXG4gICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19