ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
503 lines • 44 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,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;
}
export class PullToRefreshComponent {
/**
* @param {?} ele
*/
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 === '';
}
/**
* @return {?}
*/
get direction() {
return this._direction;
}
/**
* @param {?} value
* @return {?}
*/
set direction(value) {
this._direction = value;
this.refreshUp = this._direction === 'up' || this._direction === '';
this.refreshDown = this._direction === 'down' || this._direction === '';
}
/**
* @return {?}
*/
get headerIndicator() {
return this._headerIndicator;
}
/**
* @param {?} value
* @return {?}
*/
set headerIndicator(value) {
Object.assign(this._headerIndicator, value);
}
/**
* @return {?}
*/
get footerIndicator() {
return this._footerIndicator;
}
/**
* @param {?} value
* @return {?}
*/
set footerIndicator(value) {
Object.assign(this._footerIndicator, value);
}
/**
* @param {?} e
* @return {?}
*/
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 = document.getElementsByTagName('pulltorefresh')[0].clientHeight;
}
this.transtionCls = '';
}
/**
* @param {?} e
* @return {?}
*/
touchmove(e) {
if (this._direction === 'down' || (this._direction === '' && !this._endReach)) {
if (this.ele.nativeElement.scrollTop > 0) {
return;
}
/** @type {?} */
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 {
/** @type {?} */
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 )'
};
}
}
/**
* @param {?} e
* @return {?}
*/
touchend(e) {
if (!this.startY || this.state.drag === false) {
return;
}
/** @type {?} */
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((/**
* @return {?}
*/
() => {
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((/**
* @return {?}
*/
() => {
this.state.currentState = 'deactivate';
if (this._ngModelOnChange) {
this._ngModelOnChange(this.state);
}
this.translateY(0);
}), 0);
}), 500);
}
else {
this.translateY(0);
}
}
/**
* @return {?}
*/
touchcancel() {
this.translateY(0);
}
/**
* @param {?} evt
* @return {?}
*/
scroll(evt) {
this._endTime = Date.now();
/** @type {?} */
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((/**
* @return {?}
*/
() => {
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((/**
* @return {?}
*/
() => {
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 {?}
*/
() => {
if (this.refreshing) {
this.state.currentState = 'finish';
if (this._ngModelOnChange) {
this._ngModelOnChange(this.state);
}
}
}), 500);
}
}
/**
* @param {?} value
* @return {?}
*/
isTemplateRef(value) {
return value instanceof TemplateRef;
}
/**
* @param {?} distanceY
* @return {?}
*/
translateY(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 {?}
*/
writeValue(value) {
if (value !== null) {
this.state = value;
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this._ngModelOnChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(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=\"refreshDown\"\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=\"refreshUp\"\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 {?}
*/
() => PullToRefreshComponent)),
multi: true
}
]
}] }
];
/** @nocollapse */
PullToRefreshComponent.ctorParameters = () => [
{ type: ElementRef }
];
PullToRefreshComponent.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'],] }]
};
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._endReach;
/**
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicHVsbC10by1yZWZyZXNoL3B1bGwtdG8tcmVmcmVzaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFDekUsK0JBS0M7OztJQUpDLDZCQUFlOztJQUNmLCtCQUFpQjs7SUFDakIsNEJBQWM7O0lBQ2QsMkJBQWE7O0FBZWYsTUFBTSxPQUFPLHNCQUFzQjs7OztJQXdRakMsWUFBb0IsR0FBZTtRQUFmLFFBQUcsR0FBSCxHQUFHLENBQVk7UUF2UW5DLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLFVBQUssR0FBVztZQUNkLG1CQUFtQixFQUFFLHdCQUF3QjtZQUM3QyxTQUFTLEVBQUUsd0JBQXdCO1NBQ3BDLENBQUM7UUFFRixVQUFLLEdBQVE7WUFDWCxZQUFZLEVBQUUsWUFBWTtZQUMxQixJQUFJLEVBQUUsS0FBSztTQUNaLENBQUM7UUFFTSxxQkFBZ0IsR0FBYztZQUNwQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsUUFBUTtZQUNwQixPQUFPLEVBQUUsUUFBUTtZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUM7UUFFTSxxQkFBZ0IsR0FBYztZQUNwQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsUUFBUTtZQUNwQixPQUFPLEVBQUUsUUFBUTtZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNm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QkFPTCxLQUFLO3dCQU9MLE1BQU07c0JBR04sV0FBVyxTQUFDLDBCQUEwQjt3QkFFdEMsV0FBVyxTQUFDLHVCQUF1Qjt3QkFFbkMsV0FBVyxTQUFDLDZCQUE2QjswQkFFekMsV0FBVyxTQUFDLCtCQUErQjt5QkFHM0MsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkFpQnJDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7dUJBbUVwQyxZQUFZLFNBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDOzBCQXVDbkMsWUFBWSxTQUFDLGFBQWE7cUJBSTFCLFlBQVksU0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUFoTmxDLDhDQUF1Qjs7SUFDdkIsdUNBR0U7O0lBQ0Ysd0NBQWU7O0lBQ2YsdUNBR0U7Ozs7O0lBRUYsa0RBS0U7Ozs7O0lBRUYsa0RBS0U7Ozs7O0lBRUYsNENBQStCOzs7OztJQUMvQiwwQ0FBNkI7Ozs7O0lBQzdCLDJDQUFtQzs7Ozs7SUFDbkMsNENBQWdDOzs7OztJQUNoQywrQ0FBa0M7Ozs7O0lBQ2xDLHVEQUEwQzs7Ozs7SUFDMUMsb0RBQXVDOzs7OztJQUN2QyxrREFBZ0Q7Ozs7O0lBQ2hELG1EQUFvQzs7Ozs7SUFFcEMsZ0RBQ3lDOztJQUV6QyxtREFDK0I7O0lBQy9CLHlDQUNzQjs7SUFDdEIsbURBQ21DOztJQUNuQyw0Q0FDNEI7O0lBd0I1QiwyQ0FDa0Q7O0lBRWxELHlDQUN3Qjs7SUFDeEIsMkNBQzBCOztJQUMxQiwyQ0FDd0U7O0lBQ3hFLDZDQUM0RTs7Ozs7SUF3TGhFLHFDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElucHV0LFxuICBPdXRwdXQsXG4gIENvbXBvbmVudCxcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmV4cG9ydCBpbnRlcmZhY2UgSW5kaWNhdG9yIHtcbiAgYWN0aXZhdGU/OiBhbnk7XG4gIGRlYWN0aXZhdGU/OiBhbnk7XG4gIHJlbGVhc2U/OiBhbnk7XG4gIGZpbmlzaD86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUHVsbFRvUmVmcmVzaCwgbnptLXB1bGwtdG8tcmVmcmVzaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdWxsLXRvLXJlZnJlc2guY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFB1bGxUb1JlZnJlc2hDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUHVsbFRvUmVmcmVzaENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgdHJhbnN0aW9uQ2xzOiBhbnkgPSB7fTtcbiAgc3R5bGU6IG9iamVjdCA9IHtcbiAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlM2QoIDAsIDAsIDAgKScsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsIDAsIDAgKSdcbiAgfTtcbiAgc3RhcnRZOiBudW1iZXI7XG4gIHN0YXRlOiBhbnkgPSB7XG4gICAgY3VycmVudFN0YXRlOiAnZGVhY3RpdmF0ZScsXG4gICAgZHJhZzogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIF9oZWFkZXJJbmRpY2F0b3I6IEluZGljYXRvciA9IHtcbiAgICBhY3RpdmF0ZTogJ+advuW8gOeri+WNs+WIt+aWsCcsXG4gICAgZGVhY3RpdmF0ZTogJ+S4i+aLieWPr+S7peWIt+aWsCcsXG4gICAgcmVsZWFzZTogJ+WIt+aWsOS4reOAguOAguOAgicsXG4gICAgZmluaXNoOiAn5a6M5oiQ5Yi35pawJ1xuICB9O1xuXG4gIHByaXZhdGUgX2Zvb3RlckluZGljYXRvcjogSW5kaWNhdG9yID0ge1xuICAgIGFjdGl2YXRlOiAn5p2+5byA56uL5Y2z5Yi35pawJyxcbiAgICBkZWFjdGl2YXRlOiAn5LiK5ouJ5Y+v5Lul5Yi35pawJyxcbiAgICByZWxlYXNlOiAn5Yi35paw5Lit44CC44CC44CCJyxcbiAgICBmaW5pc2g6ICflrozmiJDliLfmlrAnXG4gIH07XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9lbmRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9lbmRSZWFjaDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kaXJlY3Rpb246IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9jbGllbnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2N1cnJlbnRDb250ZW50SGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9sYXN0Q29udGVudE9mZnNldDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbmdNb2RlbE9uQ2hhbmdlOiAodmFsdWU6IG9iamVjdCkgPT4ge307XG4gIHByaXZhdGUgX25nTW9kZWxPblRvdWNoZWQ6ICgpID0+IHt9O1xuXG4gIEBWaWV3Q2hpbGQoJ3B1bGxUb1JlZnJlc2gnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF9wdWxsVG9SZWZyZXNoOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9SZWZyZXNoOiBudW1iZXIgPSAyNTsgLy/op6blj5HliLfmlrDot53nprtcbiAgQElucHV0KClcbiAgZGFtcGluZzogbnVtYmVyID0gMTAwOyAvLyDkuIvmi4nnmoTmnIDlpKfot53nprtcbiAgQElucHV0KClcbiAgZW5kUmVhY2hlZFJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBnZXQgZGlyZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgfVxuICBzZXQgZGlyZWN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnJlZnJlc2hVcCA9IHRoaXMuX2RpcmVjdGlvbiA9PT0gJ3VwJyB8fCB0aGlzLl9kaXJlY3Rpb24gPT09ICcnO1xuICAgIHRoaXMucmVmcmVzaERvd24gPSB0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCB0aGlzLl9kaXJlY3Rpb24gPT09ICcnO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBoZWFkZXJJbmRpY2F0b3IoKTogSW5kaWNhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVySW5kaWNhdG9yO1xuICB9XG4gIHNldCBoZWFkZXJJbmRpY2F0b3IodmFsdWU6IEluZGljYXRvcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5faGVhZGVySW5kaWNhdG9yLCB2YWx1ZSk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGZvb3RlckluZGljYXRvcigpOiBJbmRpY2F0b3Ige1xuICAgIHJldHVybiB0aGlzLl9mb290ZXJJbmRpY2F0b3I7XG4gIH1cbiAgc2V0IGZvb3RlckluZGljYXRvcih2YWx1ZTogSW5kaWNhdG9yKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9mb290ZXJJbmRpY2F0b3IsIHZhbHVlKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25SZWZyZXNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXB1bGwtdG8tcmVmcmVzaCcpXG4gIHJlZnJlc2g6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN1cGVyLWNvbnRhaW5lcicpXG4gIGNvbnRhaW5lcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLXVwJylcbiAgcmVmcmVzaFVwOiBib29sZWFuID0gdGhpcy5fZGlyZWN0aW9uID09PSAndXAnIHx8IHRoaXMuX2RpcmVjdGlvbiA9PT0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tcHVsbC10by1yZWZyZXNoLWRvd24nKVxuICByZWZyZXNoRG93bjogYm9vbGVhbiA9IHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8IHRoaXMuX2RpcmVjdGlvbiA9PT0gJyc7XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHRvdWNoc3RhcnQoZSkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8ICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnICYmICF0aGlzLl9lbmRSZWFjaCkpIHtcbiAgICAgIGlmICh0aGlzLmVsZS5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA+IDApIHtcbiAgICAgICAgdGhpcy5zdGFydFkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhcnRZID0gZSAmJiBlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0WSA9IGUgJiYgZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdICYmIGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIHRoaXMuX2NsaWVudEhlaWdodCA9IHRoaXMuX3B1bGxUb1JlZnJlc2guZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMuX2N1cnJlbnRDb250ZW50SGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3B1bGx0b3JlZnJlc2gnKVswXS5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMudHJhbnN0aW9uQ2xzID0gJyc7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgdG91Y2htb3ZlKGUpIHtcbiAgICBpZiAodGhpcy5fZGlyZWN0aW9uID09PSAnZG93bicgfHwgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJycgJiYgIXRoaXMuX2VuZFJlYWNoKSkge1xuICAgICAgaWYgKHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgZGlzdGFuY2VZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgICB0aGlzLnN0YXRlLmRyYWcgPSBkaXN0YW5jZVkgPj0gMDtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmRyYWcpIHtcbiAgICAgICAgLy8g56aB5q2i5rua5YqoXG4gICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkaXN0YW5jZVkgPiB0aGlzLmRhbXBpbmcpIHtcbiAgICAgICAgLy/lvZPotoXov4forr7lrprpmIjlgLzmmK/vvIznvJPmhaLlop7liqBcbiAgICAgICAgZGlzdGFuY2VZID0gKGRpc3RhbmNlWSAvIChkaXN0YW5jZVkgKyB0aGlzLmRhbXBpbmcpKSAqIHRoaXMuZGFtcGluZyAqIDI7XG4gICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlWSA8IDApIHtcbiAgICAgICAgZGlzdGFuY2VZID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChkaXN0YW5jZVkgPiB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2FjdGl2YXRlJztcbiAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknLFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGRpc3RhbmNlWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgICAgLy/lkJHkuIrmi4nliqjnmoTml7blgJnvvIzlpoLmnpzlvZPliY3nqpflj6PlhoXlrrnmsqHmnInmu5rliLDmnIDlkI7vvIzliJnkuI3lrp7njrDmi5bliqjnmoTliqjkvZzvvJvlkJHkuIvmu5rliqjkuI3lrp7njrDmi5bliqjliqjkvZxcbiAgICAgIGlmIChcbiAgICAgICAgTWF0aC5hYnModGhpcy5fbGFzdENvbnRlbnRPZmZzZXQpIDwgdGhpcy5fY2xpZW50SGVpZ2h0IC0gdGhpcy5fY3VycmVudENvbnRlbnRIZWlnaHQgLSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoIHx8XG4gICAgICAgIGRpc3RhbmNlWSA+IDBcbiAgICAgICkge1xuICAgICAgICAvLyDmu5rliqhcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDkuIrmi4lcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLmRyYWcpIHtcbiAgICAgICAgLy8g56aB5q2i5rua5YqoXG4gICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8v5aaC5p6c5ruR5Yqo5Yiw5bqV6YOo5LqG77yM5ruR5Yqo6Led56a76ZqP552A5ouJ5Yqo55qE6Led56a75aKe5Yqg57yT5oWi5aKe5YqgXG4gICAgICBkaXN0YW5jZVkgPSAtKGRpc3RhbmNlWSAvIChkaXN0YW5jZVkgLSB0aGlzLmRhbXBpbmcpKSAqIHRoaXMuZGFtcGluZztcbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpID4gdGhpcy5kaXN0YW5jZVRvUmVmcmVzaCkge1xuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdhY3RpdmF0ZSc7XG4gICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoIDAsICcgKyBkaXN0YW5jZVkgKyAncHgsIDAgKSdcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgdG91Y2hlbmQoZSkge1xuICAgIGlmICghdGhpcy5zdGFydFkgfHwgdGhpcy5zdGF0ZS5kcmFnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXN0YW5jZVkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VZKSA+PSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoKSB7XG4gICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdyZWxlYXNlJztcbiAgICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICdkb3duJyB8fCAodGhpcy5fZGlyZWN0aW9uID09PSAnJyAmJiAhdGhpcy5fZW5kUmVhY2gpKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlWSh0aGlzLmRpc3RhbmNlVG9SZWZyZXNoICsgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVkoLXRoaXMuZGlzdGFuY2VUb1JlZnJlc2ggLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2ZpbmlzaCc7XG4gICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8ICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnICYmICF0aGlzLl9lbmRSZWFjaCkpIHtcbiAgICAgICAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KCdkb3duJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVZKC10aGlzLmRpc3RhbmNlVG9SZWZyZXNoIC0gMSk7XG4gICAgICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgndXAnKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdkZWFjdGl2YXRlJztcbiAgICAgICAgICBpZiAodGhpcy5fbmdNb2RlbE9uQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlWSgwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9LCA1MDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVkoMCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJylcbiAgdG91Y2hjYW5jZWwoKSB7XG4gICAgdGhpcy50cmFuc2xhdGVZKDApO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pXG4gIHNjcm9sbChldnQpIHtcbiAgICB0aGlzLl9lbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBjb250ZW50T2Zmc2V0ID0gZXZ0LnRhcmdldC5zY3JvbGxUb3A7XG4gICAgdGhpcy5fbGFzdENvbnRlbnRPZmZzZXQgPSBjb250ZW50T2Zmc2V0O1xuICAgIGlmICh0aGlzLl9kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnRPZmZzZXQgPiAwICYmXG4gICAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wICsgdGhpcy5lbGUubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPT09IGV2dC50YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZW5kUmVhY2ggPSB0cnVlO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZW5kUmVhY2ggPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmVuZFJlYWNoZWRSZWZyZXNoIHx8IHRoaXMuX2RpcmVjdGlvbiAhPT0gJ2Rvd24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbnRlbnRPZmZzZXQgPiAwICYmXG4gICAgICBldnQudGFyZ2V0LnNjcm9sbFRvcCArIHRoaXMuZWxlLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ID4gZXZ0LnRhcmdldC5zY3JvbGxIZWlnaHQgLSB0aGlzLmRpc3RhbmNlVG9SZWZyZXNoICYmXG4gICAgICB0aGlzLl9lbmRUaW1lIC0gdGhpcy5fc3RhcnRUaW1lID49IDEwMFxuICAgICkge1xuICAgICAgdGhpcy5fc3RhcnRUaW1lID0gdGhpcy5fZW5kVGltZTtcbiAgICAgIGlmICh0aGlzLnJlZnJlc2hpbmcpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RhdGUgPSAncmVsZWFzZSc7XG4gICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9uZ01vZGVsT25DaGFuZ2UodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5lbmRSZWFjaGVkUmVmcmVzaCkge1xuICAgICAgICAgIHRoaXMub25SZWZyZXNoLmVtaXQoJ2VuZFJlYWNoZWRSZWZyZXNoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFN0YXRlID0gJ2ZpbmlzaCc7XG4gICAgICAgICAgaWYgKHRoaXMuX25nTW9kZWxPbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuc3RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgNTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hpbmcpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGF0ZSA9ICdmaW5pc2gnO1xuICAgICAgICAgIGlmICh0aGlzLl9uZ01vZGVsT25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGU6IEVsZW1lbnRSZWYpIHt9XG5cbiAgaXNUZW1wbGF0ZVJlZih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbiAgdHJhbnNsYXRlWShkaXN0YW5jZVkpIHtcbiAgICB0aGlzLnRyYW5zdGlvbkNscyA9ICdhbS1wdWxsLXRvLXJlZnJlc2gtdHJhbnNpdGlvbic7XG4gICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGUzZCggMCwgJyArIGRpc3RhbmNlWSArICdweCwgMCApJyxcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCAwLCAnICsgZGlzdGFuY2VZICsgJ3B4LCAwICknXG4gICAgfTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBvYmplY3QpID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25Ub3VjaGVkID0gZm47XG4gIH1cbn1cbiJdfQ==