ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
390 lines (389 loc) • 30.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, Output, EventEmitter, HostListener, ViewEncapsulation } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
export class SliderHandle {
/**
* @param {?} _elf
* @param {?} _sanitizer
*/
constructor(_elf, _sanitizer) {
this._elf = _elf;
this._sanitizer = _sanitizer;
this._disabled = false;
this._marks = {};
this._isDraging = false;
this.onChange = new EventEmitter();
this.onAfterChange = new EventEmitter();
this.mouseDown = event => {
if (!this._disabled && this.isMouseTarget(event)) {
this._startX = event.clientX;
this._handleStatus = 'start';
this._isDraging = true;
document.addEventListener('mousemove', this.mouseMove, false);
document.addEventListener('mouseup', this.mouseUp, false);
this.pauseEvent(event);
}
};
this.mouseMove = event => {
if (!this._disabled && this._isDraging) {
this.pauseEvent(event);
/** @type {?} */
const pos = event.clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
if (this._oldValue !== this._value) {
this._oldValue = this._value;
this.onChange.emit(this._value);
}
}
};
this.mouseUp = event => {
if (!this._disabled && this._isDraging) {
this._handleStatus = 'end';
this._isDraging = false;
/** @type {?} */
const pos = event.clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
this.onAfterChange.emit(this._value);
}
};
}
/**
* @param {?} value
* @return {?}
*/
set min(value) {
this._min = value;
}
/**
* @param {?} value
* @return {?}
*/
set max(value) {
this._max = value;
}
/**
* @param {?} value
* @return {?}
*/
set minBound(value) {
this._minBound = value;
}
/**
* @param {?} value
* @return {?}
*/
set maxBound(value) {
this._maxBound = value;
}
/**
* @param {?} value
* @return {?}
*/
set step(value) {
this._step = value;
}
/**
* @param {?} value
* @return {?}
*/
set value(value) {
this._value = value;
if (this._value) {
this.left = this.calcOffset(this._value);
}
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
}
/**
* @param {?} value
* @return {?}
*/
set sliderLength(value) {
this._sliderLength = value;
}
/**
* @param {?} value
* @return {?}
*/
set sliderStart(value) {
this._sliderStart = value;
}
/**
* @return {?}
*/
get handleStyle() {
return this._handleStyle;
}
/**
* @param {?} value
* @return {?}
*/
set handleStyle(value) {
this._handleStyle = value;
}
/**
* @param {?} event
* @return {?}
*/
panstart(event) {
event.preventDefault();
if (!this._disabled) {
this._startX = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX;
this._handleStatus = 'start';
this._isDraging = true;
}
}
/**
* @param {?} event
* @return {?}
*/
panmove(event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
/** @type {?} */
const pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
if (this._oldValue !== this._value) {
this._oldValue = this._value;
this.onChange.emit(this._value);
}
}
}
/**
* @param {?} event
* @return {?}
*/
panend(event) {
event.preventDefault();
if (!this._disabled && this._isDraging) {
this._handleStatus = 'end';
this._isDraging = false;
/** @type {?} */
const pos = event.changedTouches[0].clientX;
this._value = Math.round(this.calcValueByPos(pos));
this.left = this.calcOffset(this._value);
this.onAfterChange.emit(this._value);
}
}
/**
* @param {?} pos
* @return {?}
*/
calcValueByPos(pos) {
/** @type {?} */
const offset = pos - this._sliderStart;
/** @type {?} */
let value = this.calcValue(offset);
if (value <= this._minBound) {
value = this._minBound;
}
if (value >= this._maxBound) {
value = this._maxBound;
}
/** @type {?} */
const closestPoint = this.getClosestPoint(value);
return this._step === null ? closestPoint : parseFloat(closestPoint.toFixed(this.getPrecision(this._step)));
}
/**
* @param {?} offset
* @return {?}
*/
calcValue(offset) {
/** @type {?} */
const ratio = Math.abs(Math.max(offset, 0) / this._sliderLength);
/** @type {?} */
const value = ratio * (this._max - this._min) + this._min;
return value;
}
/**
* @param {?} val
* @return {?}
*/
getClosestPoint(val) {
/** @type {?} */
const points = Object.keys(this._marks).map(parseFloat);
if (this._step !== null) {
/** @type {?} */
const closestStep = Math.round((val - this._min) / this._step) * this._step + this._min;
points.push(closestStep);
}
/** @type {?} */
const diffs = points.map(function (point) {
return Math.abs(val - point);
});
return points[diffs.indexOf(Math.min.apply(Math, this.toConsumableArray(diffs)))];
}
/**
* @param {?} step
* @return {?}
*/
getPrecision(step) {
/** @type {?} */
const stepString = step.toString();
/** @type {?} */
let precision = 0;
if (stepString.indexOf('.') >= 0) {
precision = stepString.length - stepString.indexOf('.') - 1;
}
return precision;
}
/**
* @param {?} value
* @return {?}
*/
calcOffset(value) {
/** @type {?} */
const ratio = (value - this._min) / (this._max - this._min);
return ratio * 100;
}
/**
* @param {?} e
* @return {?}
*/
pauseEvent(e) {
e.stopPropagation();
e.preventDefault();
}
/**
* @param {?} event
* @return {?}
*/
isMouseTarget(event) {
/** @type {?} */
let target = event.target;
/** @type {?} */
let parentFound = false;
while (target !== null && !parentFound) {
if (target === this._elf.nativeElement) {
parentFound = true;
}
target = target.parentElement;
}
return parentFound;
}
/**
* @param {?} arr
* @return {?}
*/
toConsumableArray(arr) {
if (Array.isArray(arr)) {
/** @type {?} */
const arr2 = Array(arr.length);
for (let i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
}
}
/**
* @return {?}
*/
ngOnInit() {
/** @type {?} */
const self = this;
this._elf.nativeElement.addEventListener('mousedown', this.mouseDown, false);
this._handleOffsetX = this._elf.nativeElement.getBoundingClientRect().x;
this.left = this.calcOffset(this._value);
this._minBound = this._minBound === undefined ? this._min : this._minBound;
this._maxBound = this._maxBound === undefined ? this._max : this._maxBound;
this.onAfterChange.emit(this._value);
}
/**
* @return {?}
*/
ngOnDestroy() {
document.removeEventListener('mousemove', this.mouseMove, false);
document.removeEventListener('mouseup', this.mouseUp, false);
}
}
SliderHandle.decorators = [
{ type: Component, args: [{
selector: 'SliderHandle, nzm-slider-handle',
template: "<div role=\"slider\"\n class=\"am-slider-handle\"\n [ngStyle]=\"handleStyle\"\n [style.left.%]=\"left\">\n</div>",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
SliderHandle.ctorParameters = () => [
{ type: ElementRef },
{ type: DomSanitizer }
];
SliderHandle.propDecorators = {
min: [{ type: Input }],
max: [{ type: Input }],
minBound: [{ type: Input }],
maxBound: [{ type: Input }],
step: [{ type: Input }],
value: [{ type: Input }],
disabled: [{ type: Input }],
sliderLength: [{ type: Input }],
sliderStart: [{ type: Input }],
handleStyle: [{ type: Input }],
onChange: [{ type: Output }],
onAfterChange: [{ type: Output }],
panstart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
panmove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
panend: [{ type: HostListener, args: ['touchend', ['$event'],] }]
};
if (false) {
/** @type {?} */
SliderHandle.prototype.left;
/** @type {?} */
SliderHandle.prototype._min;
/** @type {?} */
SliderHandle.prototype._max;
/** @type {?} */
SliderHandle.prototype._step;
/** @type {?} */
SliderHandle.prototype._value;
/** @type {?} */
SliderHandle.prototype._disabled;
/** @type {?} */
SliderHandle.prototype._marks;
/** @type {?} */
SliderHandle.prototype._handleStyle;
/** @type {?} */
SliderHandle.prototype._sliderLength;
/** @type {?} */
SliderHandle.prototype._sliderStart;
/** @type {?} */
SliderHandle.prototype._minBound;
/** @type {?} */
SliderHandle.prototype._maxBound;
/** @type {?} */
SliderHandle.prototype._startX;
/** @type {?} */
SliderHandle.prototype._isDraging;
/** @type {?} */
SliderHandle.prototype._handleStatus;
/** @type {?} */
SliderHandle.prototype._handleOffsetX;
/** @type {?} */
SliderHandle.prototype._oldValue;
/** @type {?} */
SliderHandle.prototype.onChange;
/** @type {?} */
SliderHandle.prototype.onAfterChange;
/** @type {?} */
SliderHandle.prototype.mouseDown;
/** @type {?} */
SliderHandle.prototype.mouseMove;
/** @type {?} */
SliderHandle.prototype.mouseUp;
/** @type {?} */
SliderHandle.prototype._elf;
/** @type {?} */
SliderHandle.prototype._sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNsaWRlci9zbGlkZXItaGFuZGxlL3NsaWRlci1oYW5kbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRVosaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU96RCxNQUFNOzs7OztJQTRHSixZQUFvQixJQUFnQixFQUFVLFVBQXdCO1FBQWxELFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFjO3lCQXJHekMsS0FBSztzQkFDVCxFQUFFOzBCQU9HLEtBQUs7d0JBb0R4QixJQUFJLFlBQVksRUFBTzs2QkFFbEIsSUFBSSxZQUFZLEVBQU87eUJBeUMzQixLQUFLLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5RCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFD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RSxLQUFLLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDOUQ7OztZQTNPRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlDQUFpQztnQkFDM0Msd0lBQTZDO2dCQUM3QyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTthQUN0Qzs7OztZQWRDLFVBQVU7WUFRSCxZQUFZOzs7a0JBMkJsQixLQUFLO2tCQUlMLEtBQUs7dUJBSUwsS0FBSzt1QkFJTCxLQUFLO21CQUlMLEtBQUs7b0JBSUwsS0FBSzt1QkFPTCxLQUFLOzJCQUlMLEtBQUs7MEJBSUwsS0FBSzswQkFJTCxLQUFLO3VCQU9MLE1BQU07NEJBRU4sTUFBTTt1QkFJTixZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO3NCQVVyQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO3FCQWFwQyxZQUFZLFNBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1NsaWRlckhhbmRsZSwgbnptLXNsaWRlci1oYW5kbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2xpZGVyLWhhbmRsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVySGFuZGxlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBsZWZ0OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBwcml2YXRlIF9zdGVwOiBudW1iZXI7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX21hcmtzOiBvYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3R5bGU6IG9iamVjdDtcbiAgcHJpdmF0ZSBfc2xpZGVyTGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX3NsaWRlclN0YXJ0OiBudW1iZXI7XG4gIHByaXZhdGUgX21pbkJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX21heEJvdW5kOiBudW1iZXI7XG4gIHByaXZhdGUgX3N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIF9pc0RyYWdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFuZGxlU3RhdHVzOiBzdHJpbmc7XG4gIHByaXZhdGUgX2hhbmRsZU9mZnNldFg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfb2xkVmFsdWU6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbWluQm91bmQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbkJvdW5kID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heEJvdW5kKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZXJMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2xpZGVyU3RhcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NsaWRlclN0YXJ0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGhhbmRsZVN0eWxlKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0eWxlO1xuICB9XG4gIHNldCBoYW5kbGVTdHlsZSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5faGFuZGxlU3R5bGUgPSB2YWx1ZTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQWZ0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiDmiYvlir/mk43kvZwgKi9cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLl9pc0RyYWdpbmcpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAodGhpcy5fb2xkVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX29sZFZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ2VuZCc7XG4gICAgICB0aGlzLl9pc0RyYWdpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBtb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgaWYgKCF0aGlzLl9kaXNhYmxlZCAmJiB0aGlzLmlzTW91c2VUYXJnZXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLl9zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ3N0YXJ0JztcbiAgICAgIHRoaXMuX2lzRHJhZ2luZyA9IHRydWU7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuICAgICAgdGhpcy5wYXVzZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgbW91c2VNb3ZlID0gZXZlbnQgPT4ge1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgdGhpcy5faXNEcmFnaW5nKSB7XG4gICAgICB0aGlzLnBhdXNlRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgcG9zID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5yb3VuZCh0aGlzLmNhbGNWYWx1ZUJ5UG9zKHBvcykpO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICh0aGlzLl9vbGRWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgbW91c2VVcCA9IGV2ZW50ID0+IHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkICYmIHRoaXMuX2lzRHJhZ2luZykge1xuICAgICAgdGhpcy5faGFuZGxlU3RhdHVzID0gJ2VuZCc7XG4gICAgICB0aGlzLl9pc0RyYWdpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLl92YWx1ZSA9IE1hdGgucm91bmQodGhpcy5jYWxjVmFsdWVCeVBvcyhwb3MpKTtcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuY2FsY09mZnNldCh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNhbGNWYWx1ZUJ5UG9zKHBvcykge1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcyAtIHRoaXMuX3NsaWRlclN0YXJ0O1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FsY1ZhbHVlKG9mZnNldCk7XG4gICAgaWYgKHZhbHVlIDw9IHRoaXMuX21pbkJvdW5kKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuX21pbkJvdW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPj0gdGhpcy5fbWF4Qm91bmQpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5fbWF4Qm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IGNsb3Nlc3RQb2ludCA9IHRoaXMuZ2V0Q2xvc2VzdFBvaW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5fc3RlcCA9PT0gbnVsbCA/IGNsb3Nlc3RQb2ludCA6IHBhcnNlRmxvYXQoY2xvc2VzdFBvaW50LnRvRml4ZWQodGhpcy5nZXRQcmVjaXNpb24odGhpcy5fc3RlcCkpKTtcbiAgfVxuXG4gIGNhbGNWYWx1ZShvZmZzZXQpIHtcbiAgICBjb25zdCByYXRpbyA9IE1hdGguYWJzKE1hdGgubWF4KG9mZnNldCwgMCkgLyB0aGlzLl9zbGlkZXJMZW5ndGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcmF0aW8gKiAodGhpcy5fbWF4IC0gdGhpcy5fbWluKSArIHRoaXMuX21pbjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRDbG9zZXN0UG9pbnQodmFsKSB7XG4gICAgY29uc3QgcG9pbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWFya3MpLm1hcChwYXJzZUZsb2F0KTtcbiAgICBpZiAodGhpcy5fc3RlcCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xvc2VzdFN0ZXAgPSBNYXRoLnJvdW5kKCh2YWwgLSB0aGlzLl9taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwICsgdGhpcy5fbWluO1xuICAgICAgcG9pbnRzLnB1c2goY2xvc2VzdFN0ZXApO1xuICAgIH1cbiAgICBjb25zdCBkaWZmcyA9IHBvaW50cy5tYXAoZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh2YWwgLSBwb2ludCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBvaW50c1tkaWZmcy5pbmRleE9mKE1hdGgubWluLmFwcGx5KE1hdGgsIHRoaXMudG9Db25zdW1hYmxlQXJyYXkoZGlmZnMpKSldO1xuICB9XG5cbiAgZ2V0UHJlY2lzaW9uKHN0ZXApIHtcbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC50b1N0cmluZygpO1xuICAgIGxldCBwcmVjaXNpb24gPSAwO1xuICAgIGlmIChzdGVwU3RyaW5nLmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICBwcmVjaXNpb24gPSBzdGVwU3RyaW5nLmxlbmd0aCAtIHN0ZXBTdHJpbmcuaW5kZXhPZignLicpIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHByZWNpc2lvbjtcbiAgfVxuXG4gIGNhbGNPZmZzZXQodmFsdWUpIHtcbiAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMuX21pbikgLyAodGhpcy5fbWF4IC0gdGhpcy5fbWluKTtcbiAgICByZXR1cm4gcmF0aW8gKiAxMDA7XG4gIH1cblxuICBwYXVzZUV2ZW50KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGlzTW91c2VUYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIHdoaWxlICh0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9lbGYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEZvdW5kO1xuICB9XG5cbiAgdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgICAgY29uc3QgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyMltpXSA9IGFycltpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIyO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2VEb3duLCBmYWxzZSk7XG4gICAgdGhpcy5faGFuZGxlT2Zmc2V0WCA9IHRoaXMuX2VsZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLng7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5jYWxjT2Zmc2V0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl9taW5Cb3VuZCA9IHRoaXMuX21pbkJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9taW4gOiB0aGlzLl9taW5Cb3VuZDtcbiAgICB0aGlzLl9tYXhCb3VuZCA9IHRoaXMuX21heEJvdW5kID09PSB1bmRlZmluZWQgPyB0aGlzLl9tYXggOiB0aGlzLl9tYXhCb3VuZDtcbiAgICB0aGlzLm9uQWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLl92YWx1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlTW92ZSwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm1vdXNlVXAsIGZhbHNlKTtcbiAgfVxufVxuIl19