ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
674 lines • 41.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, EventEmitter, ElementRef, HostBinding, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var RangeComponent = /** @class */ (function () {
function RangeComponent(_elf) {
this._elf = _elf;
this.prefixCls = 'am-slider';
this.offset = [];
this.length = [];
this._min = 0;
this._max = 100;
this._step = 1;
this._defaultValue = [0, 0, 0];
this._disabled = false;
this._marks = {};
this._dots = false;
this._included = true;
this._count = 1;
this._allowCross = true;
this._handleStyle = [];
this._trackStyle = [];
this.onChange = new EventEmitter();
this.onAfterChange = new EventEmitter();
this.amWrapper = true;
this._ngModelOnChange = (/**
* @return {?}
*/
function () { });
this._ngModelOnTouched = (/**
* @return {?}
*/
function () { });
}
Object.defineProperty(RangeComponent.prototype, "min", {
get: /**
* @return {?}
*/
function () {
return this._min;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._min = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "max", {
get: /**
* @return {?}
*/
function () {
return this._max;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._max = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "step", {
get: /**
* @return {?}
*/
function () {
return this._step;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._step = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.setValue(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "defaultValue", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._defaultValue = value;
this._value = this._defaultValue;
this.setValue(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "disabled", {
get: /**
* @return {?}
*/
function () {
return this._disabled;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "marks", {
get: /**
* @return {?}
*/
function () {
return this._marks;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._marks = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "dots", {
get: /**
* @return {?}
*/
function () {
return this._dots;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._dots = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "included", {
get: /**
* @return {?}
*/
function () {
return this._included;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._included = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "count", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._count = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "allowCross", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._allowCross = value;
this.setValueBound();
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "pushable", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._pushable = value;
if (this.verifyPushable()) {
this.setValueBound();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "handleStyle", {
get: /**
* @return {?}
*/
function () {
return this._handleStyle;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._handleStyle = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "trackStyle", {
get: /**
* @return {?}
*/
function () {
return this._trackStyle;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._trackStyle = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(RangeComponent.prototype, "railStyle", {
get: /**
* @return {?}
*/
function () {
return this._railStyle;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._railStyle = value;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
RangeComponent.prototype.setCls = /**
* @return {?}
*/
function () {
var _a;
this.sliderCls = (_a = {},
_a[this.prefixCls + "-disabled"] = this._disabled,
_a);
};
/**
* @return {?}
*/
RangeComponent.prototype.initialValue = /**
* @return {?}
*/
function () {
/** @type {?} */
var minTemp = this._min;
if (!this.verifyPushable()) {
this._pushable = 0;
console.log('pushable设置无效,已大于有些value间隔,被强制设为0');
}
/** @type {?} */
var initialValue = Array.apply(null, Array(this._count + 1)).map((/**
* @return {?}
*/
function () {
return minTemp;
}));
this._defaultValue = this._defaultValue !== undefined ? this._defaultValue : initialValue;
this._value = this._value !== undefined ? this._value : this._defaultValue;
// 验证count值
this._count = this._value.length - 1;
// 验证value区间
for (var i = 0; i < this._value.length; i++) {
if (this._value[i] < this._min) {
this._value[i] = this._min;
}
else if (this._value[i] > this._max) {
this._value[i] = this._max;
}
}
if (this._count > 0) {
this.upperBound = Math.max.apply(Math, tslib_1.__spread(this._value));
this.lowerBound = Math.min.apply(Math, tslib_1.__spread(this._value));
}
};
/**
* @param {?} e
* @param {?} i
* @return {?}
*/
RangeComponent.prototype.handleChange = /**
* @param {?} e
* @param {?} i
* @return {?}
*/
function (e, i) {
/** @type {?} */
var temp = tslib_1.__spread(this._value);
temp[i] = e;
this.upperBound = Math.max.apply(Math, tslib_1.__spread(temp));
this.lowerBound = Math.min.apply(Math, tslib_1.__spread(temp));
this.setTrackStyle(temp);
this.onChange.emit(temp);
};
/**
* @param {?} e
* @param {?} i
* @return {?}
*/
RangeComponent.prototype.handleAfterChange = /**
* @param {?} e
* @param {?} i
* @return {?}
*/
function (e, i) {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
_this._value[i] = e;
_this.upperBound = Math.max.apply(Math, tslib_1.__spread(_this._value));
_this.lowerBound = Math.min.apply(Math, tslib_1.__spread(_this._value));
_this.setTrackStyle(_this._value);
_this.onAfterChange.emit(_this._value);
_this._ngModelOnChange(_this._value);
_this.setValueBound();
}), 0);
};
/**
* @param {?} value
* @return {?}
*/
RangeComponent.prototype.setTrackStyle = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value && value.length === this._count + 1) {
value.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a - b; }));
for (var i = 0; i < this._count; i++) {
this.offset[i] = (value[i] * 100) / (this._max - this._min);
this.length[i] = ((value[i + 1] - value[i]) * 100) / (this._max - this._min);
}
}
};
/**
* @return {?}
*/
RangeComponent.prototype.setValueBound = /**
* @return {?}
*/
function () {
this.maxBound = [];
this.minBound = [];
if ((this._allowCross && this._pushable === undefined) || this._handleCount <= 1) {
for (var i = 0; i < this._handleCount; i++) {
this.maxBound[i] = this._max;
this.minBound[i] = this._min;
}
}
else {
if (this._pushable === undefined) {
this._pushable = 0;
}
for (var i = 0; i < this._handleCount; i++) {
this.maxBound[i] = i === this._handleCount - 1 ? this._max : this._value[i + 1] - this._pushable;
this.minBound[i] = i === 0 ? this._min : this._value[i - 1] + this._pushable;
}
}
};
/**
* @return {?}
*/
RangeComponent.prototype.verifyPushable = /**
* @return {?}
*/
function () {
for (var i = 1; i < this._handleCount; i++) {
/** @type {?} */
var diff = this._value[i] - this._value[i - 1];
if (diff < this._pushable) {
return false;
}
}
return true;
};
/**
* @param {?} value
* @return {?}
*/
RangeComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.setValue(value, true);
};
/**
* @param {?} value
* @param {?=} isWriteValue
* @return {?}
*/
RangeComponent.prototype.setValue = /**
* @param {?} value
* @param {?=} isWriteValue
* @return {?}
*/
function (value, isWriteValue) {
if (isWriteValue === void 0) { isWriteValue = false; }
if (value) {
this._value = value;
this._handleCount = this._value.length + 1;
this.initialValue();
this.setValueBound();
this.setCls();
this.setTrackStyle(this._value);
if (isWriteValue) {
this._ngModelOnChange(this._value);
}
else {
this.onAfterChange.emit(this._value);
}
}
};
/**
* @param {?} fn
* @return {?}
*/
RangeComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this._ngModelOnChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
RangeComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this._ngModelOnTouched = fn;
};
/**
* @return {?}
*/
RangeComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.initialValue();
this.setValueBound();
this._handleCount = this._count + 1;
this.setCls();
/** @type {?} */
var sliderCoords = this._elf.nativeElement.getElementsByClassName('am-slider')[0].getBoundingClientRect();
this.sliderLength = sliderCoords.width;
this.sliderStart = sliderCoords.left;
};
RangeComponent.decorators = [
{ type: Component, args: [{
selector: 'Range , nzm-range',
template: "<div class=\"am-slider\" [ngClass]=\"sliderCls\">\n <div class=\"am-slider-rail\" [ngStyle]=\"railStyle\"></div>\n <SliderTrack\n *ngFor=\"let off of offset; let i = index\"\n [className]=\"'am-slider-track'\"\n [included]=\"included\"\n [style]=\"trackStyle[i]\"\n [offset]=\"off\"\n [length]=\"length[i]\"\n ></SliderTrack>\n <SliderSteps\n [max]=\"max\"\n [min]=\"min\"\n [dots]=\"dots\"\n [step]=\"step\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderSteps>\n <SliderHandle\n *ngFor=\"let val of value; let i = index\"\n [max]=\"max\"\n [min]=\"min\"\n [maxBound]=\"maxBound[i]\"\n [minBound]=\"minBound[i]\"\n [value]=\"val\"\n [step]=\"step\"\n [disabled]=\"disabled\"\n [sliderLength]=\"sliderLength\"\n [sliderStart]=\"sliderStart\"\n [handleStyle]=\"handleStyle[i]\"\n (onChange)=\"handleChange($event, i)\"\n (onAfterChange)=\"handleAfterChange($event, i)\"\n ></SliderHandle>\n <SliderMarks\n [max]=\"max\"\n [min]=\"min\"\n [marks]=\"marks\"\n [upperBound]=\"upperBound\"\n [lowerBound]=\"lowerBound\"\n ></SliderMarks>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return RangeComponent; })),
multi: true
}
]
}] }
];
/** @nocollapse */
RangeComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
RangeComponent.propDecorators = {
min: [{ type: Input }],
max: [{ type: Input }],
step: [{ type: Input }],
value: [{ type: Input }],
defaultValue: [{ type: Input }],
disabled: [{ type: Input }],
marks: [{ type: Input }],
dots: [{ type: Input }],
included: [{ type: Input }],
count: [{ type: Input }],
allowCross: [{ type: Input }],
pushable: [{ type: Input }],
handleStyle: [{ type: Input }],
trackStyle: [{ type: Input }],
railStyle: [{ type: Input }],
onChange: [{ type: Output }],
onAfterChange: [{ type: Output }],
amWrapper: [{ type: HostBinding, args: ['class.am-slider-wrapper',] }]
};
return RangeComponent;
}());
export { RangeComponent };
if (false) {
/** @type {?} */
RangeComponent.prototype.prefixCls;
/** @type {?} */
RangeComponent.prototype.offset;
/** @type {?} */
RangeComponent.prototype.length;
/** @type {?} */
RangeComponent.prototype.upperBound;
/** @type {?} */
RangeComponent.prototype.lowerBound;
/** @type {?} */
RangeComponent.prototype.maxBound;
/** @type {?} */
RangeComponent.prototype.minBound;
/** @type {?} */
RangeComponent.prototype.sliderCls;
/** @type {?} */
RangeComponent.prototype.sliderLength;
/** @type {?} */
RangeComponent.prototype.sliderStart;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._min;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._max;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._step;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._value;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._defaultValue;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._marks;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._dots;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._included;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._count;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._allowCross;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._pushable;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._handleStyle;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._trackStyle;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._railStyle;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._handleCount;
/** @type {?} */
RangeComponent.prototype.onChange;
/** @type {?} */
RangeComponent.prototype.onAfterChange;
/** @type {?} */
RangeComponent.prototype.amWrapper;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._ngModelOnChange;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._ngModelOnTouched;
/**
* @type {?}
* @private
*/
RangeComponent.prototype._elf;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJyYW5nZS9yYW5nZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RTtJQXNKRSx3QkFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQTFJcEMsY0FBUyxHQUFXLFdBQVcsQ0FBQztRQUNoQyxXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFTWCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsU0FBSSxHQUFHLEdBQUcsQ0FBQztRQUNYLFVBQUssR0FBRyxDQUFDLENBQUM7UUFFVixrQkFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUF3R3pCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUd4QyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRWxCLHFCQUFnQjs7O1FBQThCLGNBQU8sQ0FBQyxFQUFD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Q0FBb0I7Ozs7O0lBQ3BCLCtCQUFzQjs7Ozs7SUFDdEIsbUNBQXlCOzs7OztJQUN6QixnQ0FBbUI7Ozs7O0lBQ25CLHFDQUEyQjs7Ozs7SUFDM0IsbUNBQWtCOzs7OztJQUNsQixzQ0FBMEI7Ozs7O0lBQzFCLHFDQUF5Qjs7Ozs7SUFDekIsb0NBQW1COzs7OztJQUNuQixzQ0FBcUI7O0lBcUdyQixrQ0FDbUM7O0lBQ25DLHVDQUN3Qzs7SUFFeEMsbUNBQzBCOzs7OztJQUUxQiwwQ0FBK0Q7Ozs7O0lBQy9ELDJDQUE4RDs7Ozs7SUFFbEQsOEJBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnUmFuZ2UgLCBuem0tcmFuZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNsaWRlcic7XG4gIG9mZnNldDogYW55W10gPSBbXTtcbiAgbGVuZ3RoOiBhbnlbXSA9IFtdO1xuICB1cHBlckJvdW5kOiBudW1iZXI7XG4gIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgbWF4Qm91bmQ6IG51bWJlcltdO1xuICBtaW5Cb3VuZDogbnVtYmVyW107XG4gIHNsaWRlckNsczogb2JqZWN0O1xuICBzbGlkZXJMZW5ndGg6IG51bWJlcjtcbiAgc2xpZGVyU3RhcnQ6IG51bWJlcjtcblxuICBwcml2YXRlIF9taW4gPSAwO1xuICBwcml2YXRlIF9tYXggPSAxMDA7XG4gIHByaXZhdGUgX3N0ZXAgPSAxO1xuICBwcml2YXRlIF92YWx1ZTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlID0gWzAsIDAsIDBdO1xuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9tYXJrcyA9IHt9O1xuICBwcml2YXRlIF9kb3RzID0gZmFsc2U7XG4gIHByaXZhdGUgX2luY2x1ZGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfY291bnQgPSAxO1xuICBwcml2YXRlIF9hbGxvd0Nyb3NzID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfcHVzaGFibGU7XG4gIHByaXZhdGUgX2hhbmRsZVN0eWxlID0gW107XG4gIHByaXZhdGUgX3RyYWNrU3R5bGUgPSBbXTtcbiAgcHJpdmF0ZSBfcmFpbFN0eWxlO1xuICBwcml2YXRlIF9oYW5kbGVDb3VudDtcblxuICBASW5wdXQoKVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IFtudW1iZXJdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBbbnVtYmVyXSkge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1hcmtzKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX21hcmtzO1xuICB9XG4gIHNldCBtYXJrcyh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5fbWFya3MgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZG90cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZG90cztcbiAgfVxuICBzZXQgZG90cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RvdHMgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgaW5jbHVkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkO1xuICB9XG4gIHNldCBpbmNsdWRlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2luY2x1ZGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGNvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhbGxvd0Nyb3NzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fYWxsb3dDcm9zcyA9IHZhbHVlO1xuICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBwdXNoYWJsZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcHVzaGFibGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy52ZXJpZnlQdXNoYWJsZSgpKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlU3R5bGU7XG4gIH1cbiAgc2V0IGhhbmRsZVN0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX2hhbmRsZVN0eWxlID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRyYWNrU3R5bGUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl90cmFja1N0eWxlO1xuICB9XG4gIHNldCB0cmFja1N0eWxlKHZhbHVlOiBhbnlbXSkge1xuICAgIHRoaXMuX3RyYWNrU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcmFpbFN0eWxlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmFpbFN0eWxlO1xuICB9XG4gIHNldCByYWlsU3R5bGUodmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy5fcmFpbFN0eWxlID0gdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkFmdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1zbGlkZXItd3JhcHBlcicpXG4gIGFtV3JhcHBlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbmdNb2RlbE9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcltdKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgX25nTW9kZWxPblRvdWNoZWQ6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmKSB7fVxuXG4gIHNldENscygpIHtcbiAgICB0aGlzLnNsaWRlckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tZGlzYWJsZWRgXTogdGhpcy5fZGlzYWJsZWRcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbFZhbHVlKCkge1xuICAgIGNvbnN0IG1pblRlbXAgPSB0aGlzLl9taW47XG4gICAgaWYgKCF0aGlzLnZlcmlmeVB1c2hhYmxlKCkpIHtcbiAgICAgIHRoaXMuX3B1c2hhYmxlID0gMDtcbiAgICAgIGNvbnNvbGUubG9nKCdwdXNoYWJsZeiuvue9ruaXoOaViO+8jOW3suWkp+S6juacieS6m3ZhbHVl6Ze06ZqU77yM6KKr5by65Yi26K6+5Li6MCcpO1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBBcnJheS5hcHBseShudWxsLCBBcnJheSh0aGlzLl9jb3VudCArIDEpKS5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbWluVGVtcDtcbiAgICB9KTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IGluaXRpYWxWYWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQgPyB0aGlzLl92YWx1ZSA6IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAvLyDpqozor4Fjb3VudOWAvFxuICAgIHRoaXMuX2NvdW50ID0gdGhpcy5fdmFsdWUubGVuZ3RoIC0gMTtcbiAgICAvLyDpqozor4F2YWx1ZeWMuumXtFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSA8IHRoaXMuX21pbikge1xuICAgICAgICB0aGlzLl92YWx1ZVtpXSA9IHRoaXMuX21pbjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdmFsdWVbaV0gPiB0aGlzLl9tYXgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVbaV0gPSB0aGlzLl9tYXg7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb3VudCA+IDApIHtcbiAgICAgIHRoaXMudXBwZXJCb3VuZCA9IE1hdGgubWF4KC4uLnRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMubG93ZXJCb3VuZCA9IE1hdGgubWluKC4uLnRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDaGFuZ2UoZSwgaSkge1xuICAgIGxldCB0ZW1wID0gWy4uLnRoaXMuX3ZhbHVlXTtcbiAgICB0ZW1wW2ldID0gZTtcbiAgICB0aGlzLnVwcGVyQm91bmQgPSBNYXRoLm1heCguLi50ZW1wKTtcbiAgICB0aGlzLmxvd2VyQm91bmQgPSBNYXRoLm1pbiguLi50ZW1wKTtcbiAgICB0aGlzLnNldFRyYWNrU3R5bGUodGVtcCk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRlbXApO1xuICB9XG5cbiAgaGFuZGxlQWZ0ZXJDaGFuZ2UoZSwgaSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWVbaV0gPSBlO1xuICAgICAgdGhpcy51cHBlckJvdW5kID0gTWF0aC5tYXgoLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5sb3dlckJvdW5kID0gTWF0aC5taW4oLi4udGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5zZXRUcmFja1N0eWxlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuX25nTW9kZWxPbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlQm91bmQoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHNldFRyYWNrU3R5bGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID09PSB0aGlzLl9jb3VudCArIDEpIHtcbiAgICAgIHZhbHVlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm9mZnNldFtpXSA9ICh2YWx1ZVtpXSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgICAgdGhpcy5sZW5ndGhbaV0gPSAoKHZhbHVlW2kgKyAxXSAtIHZhbHVlW2ldKSAqIDEwMCkgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZUJvdW5kKCkge1xuICAgIHRoaXMubWF4Qm91bmQgPSBbXTtcbiAgICB0aGlzLm1pbkJvdW5kID0gW107XG4gICAgaWYgKCh0aGlzLl9hbGxvd0Nyb3NzICYmIHRoaXMuX3B1c2hhYmxlID09PSB1bmRlZmluZWQpIHx8IHRoaXMuX2hhbmRsZUNvdW50IDw9IDEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLm1heEJvdW5kW2ldID0gdGhpcy5fbWF4O1xuICAgICAgICB0aGlzLm1pbkJvdW5kW2ldID0gdGhpcy5fbWluO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fcHVzaGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9wdXNoYWJsZSA9IDA7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2hhbmRsZUNvdW50OyBpKyspIHtcbiAgICAgICAgdGhpcy5tYXhCb3VuZFtpXSA9IGkgPT09IHRoaXMuX2hhbmRsZUNvdW50IC0gMSA/IHRoaXMuX21heCA6IHRoaXMuX3ZhbHVlW2kgKyAxXSAtIHRoaXMuX3B1c2hhYmxlO1xuICAgICAgICB0aGlzLm1pbkJvdW5kW2ldID0gaSA9PT0gMCA/IHRoaXMuX21pbiA6IHRoaXMuX3ZhbHVlW2kgLSAxXSArIHRoaXMuX3B1c2hhYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmlmeVB1c2hhYmxlKCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5faGFuZGxlQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgZGlmZiA9IHRoaXMuX3ZhbHVlW2ldIC0gdGhpcy5fdmFsdWVbaSAtIDFdO1xuICAgICAgaWYgKGRpZmYgPCB0aGlzLl9wdXNoYWJsZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBudW1iZXJbXSwgaXNXcml0ZVZhbHVlID0gZmFsc2UpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9oYW5kbGVDb3VudCA9IHRoaXMuX3ZhbHVlLmxlbmd0aCArIDE7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5zZXRWYWx1ZUJvdW5kKCk7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgdGhpcy5zZXRUcmFja1N0eWxlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmIChpc1dyaXRlVmFsdWUpIHtcbiAgICAgICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BZnRlckNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlcltdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fbmdNb2RlbE9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9uZ01vZGVsT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSgpO1xuICAgIHRoaXMuc2V0VmFsdWVCb3VuZCgpO1xuICAgIHRoaXMuX2hhbmRsZUNvdW50ID0gdGhpcy5fY291bnQgKyAxO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gICAgY29uc3Qgc2xpZGVyQ29vcmRzID0gdGhpcy5fZWxmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYW0tc2xpZGVyJylbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5zbGlkZXJMZW5ndGggPSBzbGlkZXJDb29yZHMud2lkdGg7XG4gICAgdGhpcy5zbGlkZXJTdGFydCA9IHNsaWRlckNvb3Jkcy5sZWZ0O1xuICB9XG59XG4iXX0=