@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
751 lines • 57.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: input-number.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent } from 'rxjs';
/** @type {?} */
var INPUT_NUMBER_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
// tslint:disable-next-line
useExisting: forwardRef((/**
* @return {?}
*/
function () { return InputNumberComponent; })),
multi: true
};
var InputNumberComponent = /** @class */ (function () {
function InputNumberComponent(cdr, el) {
this.cdr = cdr;
this.el = el;
this.max = 100;
this.min = 0;
this.step = 1;
this.disabled = false;
this.size = '';
this.autoFocus = false;
this.allowEmpty = false;
this.placeholder = '';
this.maxLength = 0;
this.afterValueChanged = new EventEmitter();
this.whileValueChanging = new EventEmitter();
this.disabledInc = false;
this.disabledDec = false;
this.onTouchedCallback = (/**
* @param {?} v
* @return {?}
*/
function (v) {
});
this.onChangeCallback = (/**
* @param {?} v
* @return {?}
*/
function (v) {
});
}
/**
* @param {?} fn
* @return {?}
*/
InputNumberComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* @param {?} fn
* @return {?}
*/
InputNumberComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
InputNumberComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
this.toggleDisabled(isDisabled);
};
/**
* @param {?} newValue
* @return {?}
*/
InputNumberComponent.prototype.writeValue = /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this.lastEmittedValue = newValue;
this.setValue(this.ensureValueInRange(newValue));
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.valueMustBeValid = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
return !isNaN(typeof value !== 'number' ? parseFloat(value) : value);
};
/**
* @private
* @param {?} min
* @param {?} n
* @param {?} max
* @return {?}
*/
InputNumberComponent.prototype.clamp = /**
* @private
* @param {?} min
* @param {?} n
* @param {?} max
* @return {?}
*/
function (min, n, max) {
return Math.max(min, Math.min(n, max));
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.ensureValueInRange = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var safeValue;
if (this.allowEmpty && (value === null || value === undefined)) {
safeValue = value;
}
else if (!this.valueMustBeValid(value)) {
safeValue = this.min;
}
else {
/** @type {?} */
var currentValue = value;
if (!value) {
currentValue = 0;
}
safeValue = this.clamp(this.min, currentValue, this.max);
}
return safeValue;
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.setValue = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
this.valueInput = value;
if (this.disabled) {
return;
}
if (this.allowEmpty && (value === null || value === undefined)) {
this.subscribeDecAction();
this.subscribeIncAction();
}
else {
if (!this.canDecrease()) {
this.unsubscribeDecAction();
}
else {
this.subscribeDecAction();
}
if (!this.canIncrease()) {
this.unsubscribeIncAction();
}
else {
this.subscribeIncAction();
}
}
this.cdr.detectChanges();
};
/**
* @return {?}
*/
InputNumberComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.registerListeners();
this.subscribeActions();
this.toggleDisabled(this.disabled);
this.el.nativeElement.addEventListener('click', this.registerBlurListener.bind(this));
if (this.autoFocus) {
this.el.nativeElement.click();
this.inputElement.nativeElement.focus();
}
};
/**
* @param {?} changes
* @return {?}
*/
InputNumberComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.hasOwnProperty('min') || changes.hasOwnProperty('max')) {
this.checkRangeValues(this.min, this.max);
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.unsubscribeActions();
};
/**
* @return {?}
*/
InputNumberComponent.prototype.registerListeners = /**
* @return {?}
*/
function () {
if (this.incButton && this.incButton.nativeElement) {
this.incListener = fromEvent(this.incButton.nativeElement, 'click');
}
if (this.decButton && this.decButton.nativeElement) {
this.decListener = fromEvent(this.decButton.nativeElement, 'click');
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.subscribeActions = /**
* @return {?}
*/
function () {
this.subscribeIncAction();
this.subscribeDecAction();
};
/**
* @return {?}
*/
InputNumberComponent.prototype.subscribeIncAction = /**
* @return {?}
*/
function () {
if (this.incListener && !this.incAction) {
this.incAction = this.incListener.subscribe(this.increaseValue.bind(this));
this.disabledInc = false;
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.subscribeDecAction = /**
* @return {?}
*/
function () {
if (this.decListener && !this.decAction) {
this.decAction = this.decListener.subscribe(this.decreaseValue.bind(this));
this.disabledDec = false;
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.unsubscribeActions = /**
* @return {?}
*/
function () {
this.unsubscribeIncAction();
this.unsubscribeDecAction();
};
/**
* @return {?}
*/
InputNumberComponent.prototype.unsubscribeIncAction = /**
* @return {?}
*/
function () {
if (this.incListener && this.incAction) {
this.incAction.unsubscribe();
this.incAction = null;
this.disabledInc = true;
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.unsubscribeDecAction = /**
* @return {?}
*/
function () {
if (this.incListener && this.decAction) {
this.decAction.unsubscribe();
this.decAction = null;
this.disabledDec = true;
}
};
/**
* @private
* @return {?}
*/
InputNumberComponent.prototype.increaseValue = /**
* @private
* @return {?}
*/
function () {
if (this.canIncrease()) {
if (this.allowEmpty && (this.value === null || this.value === undefined)) {
this.updateValue(this.min);
}
else {
/** @type {?} */
var decimals = this.getMaxDecimals(this.value);
this.updateValue(parseFloat((this.value + this.step).toFixed(decimals)));
}
}
};
/**
* @private
* @return {?}
*/
InputNumberComponent.prototype.decreaseValue = /**
* @private
* @return {?}
*/
function () {
if (this.canDecrease()) {
if (this.allowEmpty && (this.value === null || this.value === undefined)) {
this.updateValue(this.min);
}
else {
/** @type {?} */
var decimals = this.getMaxDecimals(this.value);
this.updateValue(parseFloat((this.value - this.step).toFixed(decimals)));
}
}
};
/**
* @private
* @return {?}
*/
InputNumberComponent.prototype.canIncrease = /**
* @private
* @return {?}
*/
function () {
if (this.allowEmpty && (this.value === null || this.value === undefined)) {
return (this.min + this.step) <= this.max;
}
else {
return (this.value + this.step) <= this.max;
}
};
/**
* @private
* @return {?}
*/
InputNumberComponent.prototype.canDecrease = /**
* @private
* @return {?}
*/
function () {
if (this.allowEmpty && (this.value === null || this.value === undefined)) {
return (this.min + this.step) <= this.max;
}
else {
return (this.value - this.step) >= this.min;
}
};
/**
* @private
* @param {?} disabled
* @return {?}
*/
InputNumberComponent.prototype.toggleDisabled = /**
* @private
* @param {?} disabled
* @return {?}
*/
function (disabled) {
if (disabled) {
this.unsubscribeActions();
}
else {
this.subscribeActions();
}
};
/**
* @param {?} event
* @return {?}
*/
InputNumberComponent.prototype.ensureValueIsValid = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
/** @type {?} */
var newValue = event.target['value'];
/** @type {?} */
var parseValue = parseFloat((/** @type {?} */ (newValue)));
if (this.allowEmpty && newValue === '') {
this.updateValue(this.ensureValueInRange(null));
}
else if (!isNaN(parseValue)) {
this.updateValue(this.ensureValueInRange(parseValue));
}
else {
this.updateValue(this.ensureValueInRange(this.value));
}
};
/**
* @private
* @param {?} minValue
* @param {?} maxValue
* @return {?}
*/
InputNumberComponent.prototype.checkRangeValues = /**
* @private
* @param {?} minValue
* @param {?} maxValue
* @return {?}
*/
function (minValue, maxValue) {
if (maxValue < minValue) {
throw new Error("max value must be greater than or equal to min value");
}
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.getDecimals = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var valueString = value.toString();
/** @type {?} */
var integerLength = valueString.indexOf('.') + 1;
return integerLength >= 0 ? valueString.length - integerLength : 0;
};
/**
* @private
* @param {?} currentValue
* @return {?}
*/
InputNumberComponent.prototype.getMaxDecimals = /**
* @private
* @param {?} currentValue
* @return {?}
*/
function (currentValue) {
/** @type {?} */
var stepPrecision = this.getDecimals(this.step);
/** @type {?} */
var currentValuePrecision = this.getDecimals((/** @type {?} */ (currentValue)));
if (!currentValue) {
return stepPrecision;
}
if (this.decimalLimit !== undefined && this.decimalLimit !== null) {
return this.decimalLimit;
}
return Math.max(currentValuePrecision, stepPrecision);
};
/**
* @param {?} event
* @return {?}
*/
InputNumberComponent.prototype.protectInput = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var value = event.target['value'];
/** @type {?} */
var input = String.fromCharCode(event.which);
/** @type {?} */
var selectionStart = event.target['selectionStart'];
/** @type {?} */
var selectionEnd = event.target['selectionEnd'];
value = value.substring(0, selectionStart) + input + value.substring(selectionEnd);
if (this.maxLength && value.length > this.maxLength) {
event.preventDefault();
return;
}
if (this.reg && !value.match(new RegExp(this.reg))) {
event.preventDefault();
return;
}
else if (value === '-' || value.match(/^\s*(-|\+)?\d+\.$/) || value.match(/^\s*(-|\+)?\d+\.[0-9]*0$/) || value.match(/^\s*(-|\+)0+$/)) {
// indeterminate state
return;
}
else if (value.match(/^\s*(-|\+)?(\d+|(\d*(\.\d*)))$/)) {
event.preventDefault();
if (this.decimalLimit !== undefined && this.decimalLimit !== null) {
value = parseFloat(value).toFixed(this.decimalLimit);
}
value = parseFloat((/** @type {?} */ (value)));
if (!isNaN(value)) {
this.valueInput = value;
this.notifyWhileValueChanging(value);
// updateValue会使输入游标跳到最后,这里设置输入游标归位
setTimeout((/**
* @return {?}
*/
function () {
event.target['setSelectionRange'](selectionStart + 1, selectionStart + 1);
}), 0);
return;
}
}
else {
event.preventDefault();
}
};
/**
* @private
* @return {?}
*/
InputNumberComponent.prototype.notifyValueChange = /**
* @private
* @return {?}
*/
function () {
this.afterValueChanged.emit(this.value);
this.onChangeCallback(this.value);
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.notifyWhileValueChanging = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.whileValueChanging.emit(value);
};
/**
* @private
* @param {?} value
* @return {?}
*/
InputNumberComponent.prototype.updateValue = /**
* @private
* @param {?} value
* @return {?}
*/
function (value) {
this.setValue(value);
if (this.lastEmittedValue !== value) {
this.lastEmittedValue = value;
this.notifyValueChange();
}
};
/**
* @param {?} event
* @return {?}
*/
InputNumberComponent.prototype.handleBackspace = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.key === 'Backspace') {
/** @type {?} */
var oldValue = event.target['value'];
/** @type {?} */
var selectionStart = event.target['selectionStart'];
/** @type {?} */
var selectionEnd = event.target['selectionEnd'];
/** @type {?} */
var newValue = oldValue.substring(0, selectionStart - 1) + oldValue.substring(selectionEnd);
oldValue = oldValue === '' ? null : this.ensureValueInRange(oldValue);
newValue = newValue === '' ? null : this.ensureValueInRange(newValue);
if (oldValue !== newValue && newValue !== '-') {
this.notifyWhileValueChanging(newValue);
}
}
};
/**
* @return {?}
*/
InputNumberComponent.prototype.registerBlurListener = /**
* @return {?}
*/
function () {
document.addEventListener('click', this.emitBlurEvent.bind(this), {
capture: true,
once: true,
});
};
/**
* @param {?} event
* @return {?}
*/
InputNumberComponent.prototype.emitBlurEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.el.nativeElement !== event.target && !this.el.nativeElement.contains(event.target)) {
this.el.nativeElement.dispatchEvent(new Event('blur', {
bubbles: false
}));
}
};
InputNumberComponent.decorators = [
{ type: Component, args: [{
selector: 'd-input-number',
template: "<div\r\n class=\"input-control-buttons\"\r\n [ngClass]=\"{\r\n disabled: disabled,\r\n 'devui-input-number-lg': size === 'lg',\r\n 'devui-input-number-sm': size === 'sm'\r\n }\"\r\n>\r\n <span class=\"input-control-button input-control-inc\" [ngClass]=\"{ disabled: disabledInc }\" #incButton>\r\n <svg class=\"devui-svg-icon-arrow\" width=\"15px\" height=\"15px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"chevron-up\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\r\n <polygon points=\"11.5 12 8 8.23076923 4.5 12 3 10.3846154 8 5 13 10.3846154\"></polygon>\r\n </g>\r\n </svg>\r\n </span>\r\n <span class=\"input-control-button input-control-dec\" [ngClass]=\"{ disabled: disabledDec }\" #decButton>\r\n <svg class=\"devui-svg-icon-arrow\" width=\"15px\" height=\"15px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"chevron-down\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\r\n <polygon points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\r\n </g>\r\n </svg>\r\n </span>\r\n</div>\r\n<div\r\n class=\"input-container\"\r\n [ngClass]=\"{\r\n 'devui-input-number-lg': size === 'lg',\r\n 'devui-input-number-sm': size === 'sm'\r\n }\"\r\n>\r\n <input\r\n class=\"input-box\"\r\n [(ngModel)]=\"valueInput\"\r\n [ngClass]=\"{ disabled: disabled }\"\r\n [placeholder]=\"placeholder\"\r\n [attr.readonly]=\"disabled ? '' : null\"\r\n (keypress)=\"protectInput($event)\"\r\n (blur)=\"ensureValueIsValid($event)\"\r\n (keydown)=\"handleBackspace($event)\"\r\n #inputElement\r\n />\r\n</div>\r\n",
providers: [INPUT_NUMBER_CONTROL_VALUE_ACCESSOR],
styles: [":host{display:inline-block;position:relative;width:80px}:host .disabled{cursor:not-allowed;opacity:.3}:host:hover .input-box:not(.disabled){border:1px solid #344899;padding-right:26px}:host:hover .input-control-buttons:not(.disabled){border-color:#344899;display:-webkit-box;display:flex}:host:focus-within .input-box:not(.disabled){border:1px solid #344899;padding-right:26px}:host:focus-within .input-control-buttons:not(.disabled){border-color:#344899;display:-webkit-box;display:flex}:host .input-box{box-sizing:border-box;padding:5px 10px;font-size:14px;color:#252b3a;vertical-align:middle;border:1px solid #adb0b8;border-radius:2px;outline:0;width:100%;background-color:#fff;line-height:20px;height:32px}:host .input-control-buttons{position:absolute;right:0;width:25px;height:100%;display:none;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;border:1px solid transparent;border-left-color:#adb0b8;box-sizing:border-box;line-height:100%}:host .input-control-buttons .input-control-button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;height:50%;line-height:50%;border-width:0 1px;cursor:pointer;-webkit-transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}:host .input-control-buttons .input-control-button svg>g{fill:#252b3a}:host .input-control-buttons .input-control-button:not(.disabled):hover>svg>g{fill:#344899}.devui-input-number-lg>.input-box{font-size:18px;line-height:24px;height:46px}.devui-input-number-lg ::ng-deep .devui-svg-icon-arrow{width:16px;height:16px}.devui-input-number-sm>.input-box{font-size:12px;line-height:18px;height:30px}.devui-input-number-sm ::ng-deep .devui-svg-icon-arrow{width:13px;height:13px}.input-container{line-height:100%}"]
}] }
];
/** @nocollapse */
InputNumberComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: ElementRef }
]; };
InputNumberComponent.propDecorators = {
max: [{ type: Input }],
min: [{ type: Input }],
step: [{ type: Input }],
disabled: [{ type: Input }],
size: [{ type: Input }],
decimalLimit: [{ type: Input }],
autoFocus: [{ type: Input }],
allowEmpty: [{ type: Input }],
placeholder: [{ type: Input }],
maxLength: [{ type: Input }],
reg: [{ type: Input }],
afterValueChanged: [{ type: Output }],
whileValueChanging: [{ type: Output }],
incButton: [{ type: ViewChild, args: ['incButton', { static: true },] }],
decButton: [{ type: ViewChild, args: ['decButton', { static: true },] }],
inputElement: [{ type: ViewChild, args: ['inputElement', { static: true },] }]
};
return InputNumberComponent;
}());
export { InputNumberComponent };
if (false) {
/** @type {?} */
InputNumberComponent.prototype.max;
/** @type {?} */
InputNumberComponent.prototype.min;
/** @type {?} */
InputNumberComponent.prototype.step;
/** @type {?} */
InputNumberComponent.prototype.disabled;
/** @type {?} */
InputNumberComponent.prototype.size;
/** @type {?} */
InputNumberComponent.prototype.decimalLimit;
/** @type {?} */
InputNumberComponent.prototype.autoFocus;
/** @type {?} */
InputNumberComponent.prototype.allowEmpty;
/** @type {?} */
InputNumberComponent.prototype.placeholder;
/** @type {?} */
InputNumberComponent.prototype.maxLength;
/** @type {?} */
InputNumberComponent.prototype.reg;
/** @type {?} */
InputNumberComponent.prototype.afterValueChanged;
/** @type {?} */
InputNumberComponent.prototype.whileValueChanging;
/** @type {?} */
InputNumberComponent.prototype.incButton;
/** @type {?} */
InputNumberComponent.prototype.decButton;
/** @type {?} */
InputNumberComponent.prototype.inputElement;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.value;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.incListener;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.decListener;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.incAction;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.decAction;
/** @type {?} */
InputNumberComponent.prototype.disabledInc;
/** @type {?} */
InputNumberComponent.prototype.disabledDec;
/** @type {?} */
InputNumberComponent.prototype.valueInput;
/** @type {?} */
InputNumberComponent.prototype.lastEmittedValue;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.onTouchedCallback;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.onChangeCallback;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
InputNumberComponent.prototype.el;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2lucHV0LW51bWJlci8iLCJzb3VyY2VzIjpbImlucHV0LW51bWJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBNEIsTUFBTSxNQUFNLENBQUM7O0lBRXJELG1DQUFtQyxHQUFRO0lBQy9DLE9BQU8sRUFBRSxpQkFBaUI7O0lBRTFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEsb0JBQW9CLEVBQXBCLENBQW9CLEVBQUM7SUFDbkQsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQUlEO0lBd0NFLDhCQUFvQixHQUFzQixFQUFVLEVBQWM7UUFBOUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBaEN6RCxRQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBa0IsRUFBRSxDQUFDO1FBRXpCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWIsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvQyx1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBVTFELGdCQUFXLEdB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Ozs7SUFBRSxrQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuY29uc3QgSU5QVVRfTlVNQkVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dE51bWJlckNvbXBvbmVudCksXHJcbiAgbXVsdGk6IHRydWVcclxufTtcclxuXHJcbmV4cG9ydCB0eXBlIElucHV0U2l6ZVR5cGUgPSAnJyB8ICdzbScgfCAnbGcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWlucHV0LW51bWJlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LW51bWJlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbSU5QVVRfTlVNQkVSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXROdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIG1heCA9IDEwMDtcclxuICBASW5wdXQoKSBtaW4gPSAwO1xyXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2l6ZTogSW5wdXRTaXplVHlwZSA9ICcnO1xyXG4gIEBJbnB1dCgpIGRlY2ltYWxMaW1pdDtcclxuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhbGxvd0VtcHR5ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuICBASW5wdXQoKSBtYXhMZW5ndGggPSAwO1xyXG4gIEBJbnB1dCgpIHJlZzogUmVnRXhwIHwgc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSBhZnRlclZhbHVlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKSB3aGlsZVZhbHVlQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAVmlld0NoaWxkKCdpbmNCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbmNCdXR0b246IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZGVjQnV0dG9uJywgeyBzdGF0aWM6IHRydWUgfSkgZGVjQnV0dG9uOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RWxlbWVudCcsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgaW5jTGlzdGVuZXI6IE9ic2VydmFibGU8YW55PjtcclxuICBwcml2YXRlIGRlY0xpc3RlbmVyOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgcHJpdmF0ZSBpbmNBY3Rpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGRlY0FjdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRpc2FibGVkSW5jID0gZmFsc2U7XHJcbiAgZGlzYWJsZWREZWMgPSBmYWxzZTtcclxuICB2YWx1ZUlucHV0OiBudW1iZXI7XHJcbiAgbGFzdEVtaXR0ZWRWYWx1ZTogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrID0gKHY6IGFueSkgPT4ge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrID0gKHY6IGFueSkgPT4ge1xyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy50b2dnbGVEaXNhYmxlZChpc0Rpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUobmV3VmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5sYXN0RW1pdHRlZFZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLnNldFZhbHVlKHRoaXMuZW5zdXJlVmFsdWVJblJhbmdlKG5ld1ZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbHVlTXVzdEJlVmFsaWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICFpc05hTih0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wKG1pbjogbnVtYmVyLCBuOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5zdXJlVmFsdWVJblJhbmdlKHZhbHVlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcclxuICAgIGxldCBzYWZlVmFsdWU7XHJcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICBzYWZlVmFsdWUgPSB2YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsdWVNdXN0QmVWYWxpZCh2YWx1ZSkpIHtcclxuICAgICAgc2FmZVZhbHVlID0gdGhpcy5taW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgY3VycmVudFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIHNhZmVWYWx1ZSA9IHRoaXMuY2xhbXAodGhpcy5taW4sIGN1cnJlbnRWYWx1ZSwgdGhpcy5tYXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhZmVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMudmFsdWVJbnB1dCA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICB0aGlzLnN1YnNjcmliZURlY0FjdGlvbigpO1xyXG4gICAgICB0aGlzLnN1YnNjcmliZUluY0FjdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmNhbkRlY3JlYXNlKCkpIHtcclxuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRGVjQWN0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVEZWNBY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuY2FuSW5jcmVhc2UoKSkge1xyXG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVJbmNBY3Rpb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZUluY0FjdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUFjdGlvbnMoKTtcclxuICAgIHRoaXMudG9nZ2xlRGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlZ2lzdGVyQmx1ckxpc3RlbmVyLmJpbmQodGhpcykpO1xyXG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWluJykgfHwgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnbWF4JykpIHtcclxuICAgICAgdGhpcy5jaGVja1JhbmdlVmFsdWVzKHRoaXMubWluLCB0aGlzLm1heCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcclxuICAgIGlmICh0aGlzLmluY0J1dHRvbiAmJiB0aGlzLmluY0J1dHRvbi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuaW5jTGlzdGVuZXIgPSBmcm9tRXZlbnQodGhpcy5pbmNCdXR0b24ubmF0aXZlRWxlbWVudCwgJ2NsaWNrJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kZWNCdXR0b24gJiYgdGhpcy5kZWNCdXR0b24ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmRlY0xpc3RlbmVyID0gZnJvbUV2ZW50KHRoaXMuZGVjQnV0dG9uLm5hdGl2ZUVsZW1lbnQsICdjbGljaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlQWN0aW9ucygpIHtcclxuICAgIHRoaXMuc3Vic2NyaWJlSW5jQWN0aW9uKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZURlY0FjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlSW5jQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgIXRoaXMuaW5jQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5jQWN0aW9uID0gdGhpcy5pbmNMaXN0ZW5lci5zdWJzY3JpYmUodGhpcy5pbmNyZWFzZVZhbHVlLmJpbmQodGhpcykpO1xyXG4gICAgICB0aGlzLmRpc2FibGVkSW5jID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVEZWNBY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5kZWNMaXN0ZW5lciAmJiAhdGhpcy5kZWNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24gPSB0aGlzLmRlY0xpc3RlbmVyLnN1YnNjcmliZSh0aGlzLmRlY3JlYXNlVmFsdWUuYmluZCh0aGlzKSk7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWREZWMgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlQWN0aW9ucygpIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVJbmNBY3Rpb24oKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVEZWNBY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlSW5jQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgdGhpcy5pbmNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5pbmNBY3Rpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5pbmNBY3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc2FibGVkSW5jID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRGVjQWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaW5jTGlzdGVuZXIgJiYgdGhpcy5kZWNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5kZWNBY3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmRpc2FibGVkRGVjID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5jcmVhc2VWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLmNhbkluY3JlYXNlKCkpIHtcclxuICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSAmJiAodGhpcy52YWx1ZSA9PT0gbnVsbCB8fCB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLm1pbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZGVjaW1hbHMgPSB0aGlzLmdldE1heERlY2ltYWxzKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUocGFyc2VGbG9hdCgodGhpcy52YWx1ZSArIHRoaXMuc3RlcCkudG9GaXhlZChkZWNpbWFscykpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNyZWFzZVZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuRGVjcmVhc2UoKSkge1xyXG4gICAgICBpZiAodGhpcy5hbGxvd0VtcHR5ICYmICh0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWluKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBkZWNpbWFscyA9IHRoaXMuZ2V0TW