UNPKG

ng-zorro-antd-mobile

Version:

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

577 lines 47.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Input, Output, Component, ViewChild, forwardRef, TemplateRef, HostBinding, EventEmitter, HostListener, ViewContainerRef, ViewEncapsulation, ElementRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** * @record */ export function Indicator() { } if (false) { /** @type {?|undefined} */ Indicator.prototype.activate; /** @type {?|undefined} */ Indicator.prototype.deactivate; /** @type {?|undefined} */ Indicator.prototype.release; /** @type {?|undefined} */ Indicator.prototype.finish; } var PullToRefreshComponent = /** @class */ (function () { function PullToRefreshComponent(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._endRreach = 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 = false; this.refreshDown = true; } Object.defineProperty(PullToRefreshComponent.prototype, "direction", { get: /** * @return {?} */ function () { return this._direction; }, set: /** * @param {?} value * @return {?} */ function (value) { this._direction = value; this.refreshUp = this._direction === 'up' || this._direction === ''; this.refreshDown = this._direction === 'down' || this._direction === ''; }, enumerable: true, configurable: true }); Object.defineProperty(PullToRefreshComponent.prototype, "headerIndicator", { get: /** * @return {?} */ function () { return this._headerIndicator; }, set: /** * @param {?} value * @return {?} */ function (value) { Object.assign(this._headerIndicator, value); }, enumerable: true, configurable: true }); Object.defineProperty(PullToRefreshComponent.prototype, "footerIndicator", { get: /** * @return {?} */ function () { return this._footerIndicator; }, set: /** * @param {?} value * @return {?} */ function (value) { Object.assign(this._footerIndicator, value); }, enumerable: true, configurable: true }); /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchstart = /** * @param {?} e * @return {?} */ function (e) { this._startTime = Date.now(); if (this._direction === 'down' || (this._direction === '' && !this._endRreach)) { 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 = document.getElementsByTagName('pulltorefresh')[0].clientHeight; } this.transtionCls = ''; }; /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchmove = /** * @param {?} e * @return {?} */ function (e) { if (this._direction === 'down' || (this._direction === '' && !this._endRreach)) { if (this.ele.nativeElement.scrollTop > 0) { return; } /** @type {?} */ var distanceY = e.changedTouches[0].clientY - this.startY; if (distanceY < 0) { // 滚动 this.state.drag = false; } else { // 下拉 this.state.drag = true; } 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 { /** @type {?} */ var 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 )' }; } }; /** * @param {?} e * @return {?} */ PullToRefreshComponent.prototype.touchend = /** * @param {?} e * @return {?} */ function (e) { var _this = this; if (!this.startY || this.state.drag === false) { return; } /** @type {?} */ var distanceY = e.changedTouches[0].clientY - this.startY; if (Math.abs(distanceY) >= this.distanceToRefresh) { this.state.currentState = 'release'; if (this._direction === 'down' || (this._direction === '' && !this._endRreach)) { this.translateY(this.distanceToRefresh + 1); } else { this.translateY(-this.distanceToRefresh - 1); } if (this._ngModelOnChange) { this._ngModelOnChange(this.state); } setTimeout((/** * @return {?} */ function () { _this.state.currentState = 'finish'; if (_this._ngModelOnChange) { _this._ngModelOnChange(_this.state); } if (_this._direction === 'down' || (_this._direction === '' && !_this._endRreach)) { _this.onRefresh.emit('down'); } else { _this.translateY(-_this.distanceToRefresh - 1); _this.onRefresh.emit('up'); } setTimeout((/** * @return {?} */ function () { _this.state.currentState = 'deactivate'; if (_this._ngModelOnChange) { _this._ngModelOnChange(_this.state); } _this.translateY(0); }), 0); }), 500); } else { this.translateY(0); } }; /** * @param {?} evt * @return {?} */ PullToRefreshComponent.prototype.touchcancel = /** * @param {?} evt * @return {?} */ function (evt) { this.translateY(0); }; /** * @param {?} evt * @return {?} */ PullToRefreshComponent.prototype.scroll = /** * @param {?} evt * @return {?} */ function (evt) { var _this = this; this._endTime = Date.now(); /** @type {?} */ var contentOffset = evt.target.scrollTop; /** @type {?} */ var offset = contentOffset - this._lastcontentOffset; this._lastcontentOffset = contentOffset; if (this._direction === '') { if (offset > 0 && contentOffset > 0 && evt.target.scrollTop + this.ele.nativeElement.clientHeight === evt.target.scrollHeight) { setTimeout((/** * @return {?} */ function () { _this._endRreach = true; }), 500); } else { this._endRreach = false; } } if (!this.endReachedRefresh) { return; } if (this._direction === 'down' && offset > 0 && 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((/** * @return {?} */ function () { if (_this._direction === '') { _this._endRreach = true; } if (_this.endReachedRefresh) { _this.onRefresh.emit('endReachedRefresh'); } if (_this.refreshing) { _this.state.currentState = 'finish'; if (_this._ngModelOnChange) { _this._ngModelOnChange(_this.state); } } }), 500); } else { setTimeout((/** * @return {?} */ function () { if (_this._direction === '') { _this._endRreach = false; } if (_this.refreshing) { _this.state.currentState = 'finish'; if (_this._ngModelOnChange) { _this._ngModelOnChange(_this.state); } } }), 500); } }; /** * @param {?} value * @return {?} */ PullToRefreshComponent.prototype.isTemplateRef = /** * @param {?} value * @return {?} */ function (value) { if (value) { return value instanceof TemplateRef; } }; /** * @param {?} distanceY * @return {?} */ PullToRefreshComponent.prototype.translateY = /** * @param {?} distanceY * @return {?} */ function (distanceY) { this.transtionCls = 'am-pull-to-refresh-transition'; this.style = { '-webkit-transform': 'translate3d( 0, ' + distanceY + 'px, 0 )', transform: 'translate3d( 0, ' + distanceY + 'px, 0 )' }; }; /** * @param {?} value * @return {?} */ PullToRefreshComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value !== null) { this.state = value; } }; /** * @param {?} fn * @return {?} */ PullToRefreshComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this._ngModelOnChange = fn; }; /** * @param {?} fn * @return {?} */ PullToRefreshComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this._ngModelOnTouched = fn; }; PullToRefreshComponent.decorators = [ { type: Component, args: [{ selector: 'PullToRefresh, nzm-pull-to-refresh', template: "<div class=\"am-pull-to-refresh-content-wrapper\">\n <div class=\"am-pull-to-refresh-content\" [ngClass]=\"transtionCls\" [ngStyle]=\"style\">\n <div\n *ngIf=\"direction === 'down' || direction === ''\"\n class=\"am-pull-to-refresh-indicator am-pull-to-refresh-header-indicator\"\n >\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\n *ngIf=\"direction === 'up' || direction === ''\"\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>\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return PullToRefreshComponent; })), multi: true } ] }] } ]; /** @nocollapse */ PullToRefreshComponent.ctorParameters = function () { return [ { type: ElementRef } ]; }; PullToRefreshComponent.propDecorators = { _pullToRefresh: [{ type: ViewChild, args: ['pullToRefresh', { read: ViewContainerRef },] }], 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', ['$event'],] }], scroll: [{ type: HostListener, args: ['scroll', ['$event'],] }] }; return PullToRefreshComponent; }()); export { PullToRefreshComponent }; if (false) { /** @type {?} */ PullToRefreshComponent.prototype.transtionCls; /** @type {?} */ PullToRefreshComponent.prototype.style; /** @type {?} */ PullToRefreshComponent.prototype.startY; /** @type {?} */ PullToRefreshComponent.prototype.state; /** * @type {?} * @private */ PullToRefreshComponent.prototype._headerIndicator; /** * @type {?} * @private */ PullToRefreshComponent.prototype._footerIndicator; /** * @type {?} * @private */ PullToRefreshComponent.prototype._startTime; /** * @type {?} * @private */ PullToRefreshComponent.prototype._endTime; /** * @type {?} * @private */ PullToRefreshComponent.prototype._endRreach; /** * @type {?} * @private */ PullToRefreshComponent.prototype._direction; /** * @type {?} * @private */ PullToRefreshComponent.prototype._clientHeight; /** * @type {?} * @private */ PullToRefreshComponent.prototype._currentContentHeight; /** * @type {?} * @private */ PullToRefreshComponent.prototype._lastcontentOffset; /** * @type {?} * @private */ PullToRefreshComponent.prototype._ngModelOnChange; /** * @type {?} * @private */ PullToRefreshComponent.prototype._ngModelOnTouched; /** * @type {?} * @private */ PullToRefreshComponent.prototype._pullToRefresh; /** @type {?} */ PullToRefreshComponent.prototype.distanceToRefresh; /** @type {?} */ PullToRefreshComponent.prototype.damping; /** @type {?} */ PullToRefreshComponent.prototype.endReachedRefresh; /** @type {?} */ PullToRefreshComponent.prototype.refreshing; /** @type {?} */ PullToRefreshComponent.prototype.onRefresh; /** @type {?} */ PullToRefreshComponent.prototype.refresh; /** @type {?} */ PullToRefreshComponent.prototype.container; /** @type {?} */ PullToRefreshComponent.prototype.refreshUp; /** @type {?} */ PullToRefreshComponent.prototype.refreshDown; /** * @type {?} * @private */ PullToRefreshComponent.prototype.ele; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFDekUsK0JBS0M7OztJQUpDLDZCQUFlOztJQUNmLCtCQUFpQjs7SUFDakIsNEJBQWM7O0lBQ2QsMkJBQWE7O0FBR2Y7SUFvU0UsZ0NBQW9CLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBdlJuQyxpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQUN2QixVQUFLLEdBQVc7WUFDZCxtQkFBbUIsRUFBRSx3QkFBd0I7WUFDN0MsU0FBUyxFQUFFLHdCQUF3QjtTQUNwQyxDQUFDO1FBRUYsVUFBSyxHQUFRO1lBQ1gsWUFBWSxFQUFFLFlBQVk7WUFDMUIsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO1FBRU0scUJBQWdCLEdBQWM7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsT0FBTyxFQUFFLFFBQVE7WUFDakIsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDO1FBRU0scUJBQWdCLEdBQWM7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsT0FBTyxFQUFFLFFBQVE7WUFDakIsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDO1FBRU0sZUFBVSxHQUFH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QTBDOzs7OztJQUMxQyxvREFBdUM7Ozs7O0lBQ3ZDLGtEQUFnRDs7Ozs7SUFDaEQsbURBQW9DOzs7OztJQUVwQyxnREFDeUM7O0lBRXpDLG1EQUMrQjs7SUFDL0IseUNBQ3NCOztJQUN0QixtREFDbUM7O0lBQ25DLDRDQUM0Qjs7SUF3QjVCLDJDQUNrRDs7SUFFbEQseUNBQ3dCOztJQUN4QiwyQ0FDMEI7O0lBQzFCLDJDQUMyQjs7SUFDM0IsNkNBQzRCOzs7OztJQXdNaEIscUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBIb3N0QmluZGluZyxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuZXhwb3J0IGludGVyZmFjZSBJbmRpY2F0b3Ige1xuICBhY3RpdmF0ZT86IGFueTtcbiAgZGVhY3RpdmF0ZT86IGFueTtcbiAgcmVsZWFzZT86IGFueTtcbiAgZmluaXNoPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQdWxsVG9SZWZyZXNoLCBuem0tcHVsbC10by1yZWZyZXNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUHVsbFRvUmVmcmVzaENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBQdWxsVG9SZWZyZXNoQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICB0cmFuc3Rpb25DbHM6IGFueSA9IHt9O1xuICBzdHlsZTogb2JqZWN0ID0ge1xuICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgMCwgMCApJyxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgMCwgMCApJ1xuICB9O1xuICBzdGFydFk6IG51bWJlcjtcbiAgc3RhdGU6IGFueSA9IHtcbiAgICBjdXJyZW50U3RhdGU6ICdkZWFjdGl2YXRlJyxcbiAgICBkcmFnOiBmYWxzZVxuICB9O1xuXG4gIHByaXZhdGUgX2hlYWRlckluZGljYXRvcjogSW5kaWNhdG9yID0ge1xuICAgIGFjdGl2YXRlOiAn5p2+5byA56uL5Y2z5Yi35pawJyxcbiAgICBkZWFjdGl2YXRlOiAn5LiL5ouJ5Y+v5Lul5Yi35pawJyxcbiAgICByZWxlYXNlOiAn5Yi35paw5Lit44CC44CC44CCJyxcbiAgICBmaW5pc2g6ICflrozmiJDliLfmlrAnXG4gIH07XG5cbiAgcHJpdmF0ZSBfZm9vdGVySW5kaWNhdG9yOiBJbmRpY2F0b3IgPSB7XG4gICAgYWN0aXZhdGU6ICfmnb7lvIDnq4vljbPliLfmlrAnLFxuICAgIGRlYWN0aXZhdGU6ICfkuIrmi4nlj6/ku6XliLfmlrAnLFxuICAgIHJlbGVhc2U6ICfliLfmlrDkuK3jgILjgILjgIInLFxuICAgIGZpbmlzaDogJ+WujOaIkOWIt+aWsCdcbiAgfTtcblxuICBwcml2YXRlIF9zdGFydFRpbWUgPSAwO1xuICBwcml2YXRlIF9lbmRUaW1lID0gMDtcbiAgcHJpdmF0ZSBfZW5kUnJlYWNoID0gZmFsc2U7XG4gIHByaXZhdGUgX2RpcmVjdGlvbjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2NsaWVudEhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudENvbnRlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3Rjb250ZW50T2Zmc2V0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9uZ01vZGVsT25DaGFuZ2U6ICh2YWx1ZTogb2JqZWN0KSA9PiB7fTtcbiAgcHJpdmF0ZSBfbmdNb2RlbE9uVG91Y2hlZDogKCkgPT4ge307XG5cbiAgQFZpZXdDaGlsZCgncHVsbFRvUmVmcmVzaCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBwcml2YXRlIF9wdWxsVG9SZWZyZXNoOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9SZWZyZXNoOiBudW1iZXIgPSAyNTsgLy/op6blj5HliLfmlrDot53nprtcbiAgQElucHV0KClcbiAgZGFtcGluZzogbnVtYmVyID0gMTAwOyAvLyDkuIvmi4nnmoTmnIDlpKfot53nprtcbiAgQElucHV0KClcbiAgZW5kUmVhY2hlZFJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgZGlyZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgfVxuICBzZXQgZGlyZWN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnJlZnJlc2hVcCA9IHRoaXMuX2RpcmVjdGlvbiA9PT0gJ3VwJyB8fCB0aGlzLl9kaXJlY3Rpb24gPT09ICcnO1xuICAgIHRoaXMucmVmcmVzaERvd24gPSB0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCB0aGlzLl9kaXJlY3Rpb24gPT09ICcnO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBoZWFkZXJJbmRpY2F0b3IoKTogSW5kaWNhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVySW5kaWNhdG9yO1xuICB9XG4gIHNldCBoZWFkZXJJbmRpY2F0b3IodmFsdWU6IEluZGljYXRvcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5faGVhZGVySW5kaWNhdG9yLCB2YWx1ZSk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGZvb3RlckluZGljYXRvcigpOiBJbmRpY2F0b3Ige1xuICAgIHJldHVybiB0aGlzLl9mb290ZXJJbmRpY2F0b3I7XG4gIH1cbiAgc2V0IGZvb3RlckluZGljYXRvcih2YWx1ZTogSW5kaWNhdG9yKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9mb290ZXJJbmRpY2F0b3IsIHZhbHVlKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25SZWZyZXNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXB1bGwtdG8tcmVmcmVzaCcpXG4gIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN1cGVyLWNvbnRhaW5lcicpXG4gIGNvbnRhaW5lcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLXVwJylcbiAgcmVmcmVzaFVwOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLWRvd24nKVxuICByZWZyZXNoRG93bjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHRvdWNoc3RhcnQoZSkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8ICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnICYmICF0aGlzLl9lbmRScmVhY2gpKSB7XG4gICAgICBpZiAodGhpcy5lbGUubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPiAwKSB7XG4gICAgICAgIHRoaXMuc3RhcnRZID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0WSA9IGUgJiYgZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydFkgPSBlICYmIGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICB0aGlzLl9jbGllbnRIZWlnaHQgPSB0aGlzLl9wdWxsVG9SZWZyZXNoLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGVudEhlaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwdWxsdG9yZWZyZXNoJylbMF0uY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLnRyYW5zdGlvbkNscyA9ICcnO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gIHRvdWNobW92ZShlKSB7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8ICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnICYmICF0aGlzLl9lbmRScmVhY2gpKSB7XG4gICAgICBpZiAodGhpcy5lbGUubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICAgIGlmIChkaXN0YW5jZVkgPCAwKSB7XG4gICAgICAgIC8vIOa7muWKqFxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4i+aLiVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGUuZHJhZykge1xuICAgICAgICAvLyDnpoHmraLmu5rliqhcbiAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGFtcGluZykge1xuICAgICAgICAvL+W9k+i2hei/h+iuvuWumumYiOWAvOaYr++8jOe8k+aFouWinuWKoFxuICAgICAgICBkaXN0YW5jZVkgPSAoZGlzdGFuY2VZIC8gKGRpc3RhbmNlWSArIHRoaXMuZGFtcGluZykpICogdGhpcy5kYW1waW5nICogMjtcbiAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2VZIDwgMCkge1xuICAgICAgICBkaXN0YW5jZVkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGRpc3RhbmNlWSA+IHRoaXMuZGlzdGFuY2VUb1JlZnJlc2gpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RhdGUgPSAnYWN0aXZhdGUnO1xuICAgICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKScsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZGlzdGFuY2VZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgICAvL+WQkeS4iuaLieWKqOeahOaXtuWAme+8jOWmguaenOW9k+WJjeeql+WPo+WGheWuueayoeaciea7muWIsOacgOWQju+8jOWImeS4jeWunueOsOaLluWKqOeahOWKqOS9nO+8m+WQkeS4i+a7muWKqOS4jeWunueOsOaLluWKqOWKqOS9nFxuICAgICAgaWYgKFxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0Y29udGVudE9mZnNldCkgPD0gdGhpcy5fY2xpZW50SGVpZ2h0IC0gdGhpcy5fY3VycmVudENvbnRlbnRIZWlnaHQgLSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoIHx8XG4gICAgICAgIGRpc3RhbmNlWSA+IDBcbiAgICAgICkge1xuICAgICAgICAvLyDmu5rliqhcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDkuIrmi4lcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLmRyYWcpIHtcbiAgICAgICAgLy8g56aB5q2i5rua5YqoXG4gICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8v5aaC5p6c5ruR5Yqo5Yiw5bqV6YOo5LqG77yM5ruR5Yqo6Led56a76ZqP552A5ouJ5Yqo55qE6Led56a75aKe5Yqg57yT5oWi5aKe5YqgXG4gICAgICBkaXN0YW5jZVkgPSAtKGRpc3RhbmNlWSAvIChkaXN0YW5jZVkgLSB0aGlzLmRhbXBpbmcpKSAqIHRoaXMuZGFtcGluZztcbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpID4gdGhpcy5kaXN0YW5jZVRvUmVmcmVzaCkge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdhY3RpdmF0ZSc7XG4gICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgdG91Y2hlbmQoZSkge1xuICAgIGlmICghdGhpcy5zdGFydFkgfHwgdGhpcy5zdGF0ZS5kcmFnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VZKSA+PSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdyZWxlYXNlJztcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCAodGhpcy5fZGlyZWN0aW9uID09PSAnJyAmJiAhdGhpcy5fZW5kUnJlYWNoKSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVkodGhpcy5kaXN0YW5jZVRvUmVmcmVzaCArIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVZKC10aGlzLmRpc3RhbmNlVG9SZWZyZXNoIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdmaW5pc2gnO1xuICAgICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCAodGhpcy5fZGlyZWN0aW9uID09PSAnJyAmJiAhdGhpcy5fZW5kUnJlYWNoKSkge1xuICAgICAgICAgIHRoaXMub25SZWZyZXNoLmVtaXQoJ2Rvd24nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVkoLXRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggLSAxKTtcbiAgICAgICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCd1cCcpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2RlYWN0aXZhdGUnO1xuICAgICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVZKDApO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlWSgwKTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCBbJyRldmVudCddKVxuICB0b3VjaGNhbmNlbChldnQpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZVkoMCk7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgc2Nyb2xsKGV2dCkge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNvbnRlbnRPZmZzZXQgPSBldnQudGFyZ2V0LnNjcm9sbFRvcDtcbiAgICBjb25zdCBvZmZzZXQgPSBjb250ZW50T2Zmc2V0IC0gdGhpcy5fbGFzdGNvbnRlbnRPZmZzZXQ7XG4gICAgdGhpcy5fbGFzdGNvbnRlbnRPZmZzZXQgPSBjb250ZW50T2Zmc2V0O1xuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG9mZnNldCA+IDAgJiZcbiAgICAgICAgY29udGVudE9mZnNldCA+IDAgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxUb3AgKyB0aGlzLmVsZS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA9PT0gZXZ0LnRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgICkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbmRScmVhY2ggPSB0cnVlO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZW5kUnJlYWNoID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmRSZWFjaGVkUmVmcmVzaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyAmJlxuICAgICAgb2Zmc2V0ID4gMCAmJlxuICAgICAgY29udGVudE9mZnNldCA+IDAgJiZcbiAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wICsgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPiBldnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIHRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggJiZcbiAgICAgIHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUgPj0gMTAwXG4gICAgKSB7XG4gICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aGlzLl9lbmRUaW1lO1xuICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdyZWxlYXNlJztcbiAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5fZW5kUnJlYWNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbmRSZWFjaGVkUmVmcmVzaCkge1xuICAgICAgICAgIHRoaXMub25SZWZyZXNoLmVtaXQoJ2VuZFJlYWNoZWRSZWZyZXNoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2ZpbmlzaCc7XG4gICAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgNTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5fZW5kUnJlYWNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2ZpbmlzaCc7XG4gICAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgNTAwKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZTogRWxlbWVudFJlZikge31cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVZKGRpc3RhbmNlWSkge1xuICAgIHRoaXMudHJhbnN0aW9uQ2xzID0gJ2FtLXB1bGwtdG8tcmVmcmVzaC10cmFuc2l0aW9uJztcbiAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICB9O1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0YXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IG9iamVjdCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMuX25nTW9kZWxPblRvdWNoZWQgPSBmbjtcbiAgfVxufVxuIl19