ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
506 lines • 35.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, HostBinding, NgZone } from '@angular/core';
import { CustomInputService } from './custom-input.service';
var CustomInputComponent = /** @class */ (function () {
function CustomInputComponent(_ref, _customInputService, _ngZone) {
var _this = this;
this._ref = _ref;
this._customInputService = _customInputService;
this._ngZone = _ngZone;
this.keyboardPrefixCls = 'am-number-keyboard';
this.focus = false;
this._value = '';
this._defaultValue = '';
this._placeholder = '';
this._editable = true;
this._disabled = false;
this._setFocus = false;
this.onChange = new EventEmitter();
this.onBlur = new EventEmitter();
this.onFocus = new EventEmitter();
this.clsFakeContainer = true;
this.inputFocus = (/**
* @return {?}
*/
function () {
_this.removeBlurListener();
/** @type {?} */
var focus = _this.focus;
if (!focus || _this._setFocus) {
_this.onInputFocus();
}
setTimeout((/**
* @return {?}
*/
function () {
_this.addBlurListener();
}), 50);
});
this.doBlur = (/**
* @param {?} ev
* @return {?}
*/
function (ev) {
/** @type {?} */
var value = _this._value;
// 点击是否是组件本身
/** @type {?} */
var parentFound = false;
// 点击目标是否是custom-input
/** @type {?} */
var isInput = false;
// 点击目标是否是custom-keyboard
/** @type {?} */
var isKeyboard = false;
/** @type {?} */
var isClear = false;
/** @type {?} */
var target = ev.target;
while (target && target !== null && !parentFound) {
if (target === _this._ref.nativeElement) {
parentFound = true;
}
if (target.localName === 'custominput') {
isInput = true;
}
if (target.localName === 'customkeyboard') {
isKeyboard = true;
}
if (target.className.indexOf('am-input-clear') >= 0) {
isClear = true;
}
target = target.parentElement;
}
// 当点击目标是本身的时候,获取焦点、不隐藏keyboard
// 当点击目标不是本身但是其他的custom-input时,失去焦点、不隐藏keyboard
// 当点击目标是keyboard时,不失去焦点,不隐藏keyboard
if (parentFound) {
_this.focus = true;
}
else if (isInput) {
_this._setFocus = false;
_this.focus = false;
_this.onBlur.emit(_this._value);
}
if (_this.focus && isKeyboard) {
_this.focus = true;
_this.onKeyboardClick(CustomInputService.clickValue);
}
if (!parentFound && !isInput && !isKeyboard && !isClear && !_this._setFocus) {
_this.focus = false;
_this._setFocus = false;
_this.onBlur.emit(_this._value);
CustomInputService.hideKeyboard();
}
_this.setFakeInputCls();
});
this.removeBlurListener = (/**
* @return {?}
*/
function () {
document.removeEventListener('click', _this.doBlur, false);
});
this.addBlurListener = (/**
* @return {?}
*/
function () {
document.addEventListener('click', _this.doBlur, false);
});
this.onInputBlur = (/**
* @param {?} value
* @return {?}
*/
function (value) {
_this.focus = false;
_this.setFakeInputCls();
_this.onBlur.emit(_this._value);
CustomInputService.hideKeyboard();
});
this.onInputFocus = (/**
* @return {?}
*/
function () {
_this.onFocus.emit(_this._value);
_this.focus = true;
_this._setFocus = false;
_this.setFakeInputCls();
setTimeout((/**
* @return {?}
*/
function () {
CustomInputService.showKeyboard();
}), 100);
});
this.setFakeInputCls = (/**
* @return {?}
*/
function () {
var _a;
_this.fakeInputCls = (_a = {},
_a["fake-input"] = true,
_a['fake-input-disabled'] = _this._disabled,
_a['focus'] = _this.focus,
_a);
});
this.setContainerCls = (/**
* @return {?}
*/
function () {
_this.clsFakeContainerLeft = _this._moneyKeyboardAlign === 'left';
});
this.onKeyboardClick = (/**
* @param {?} keyboardItemValue
* @return {?}
*/
function (keyboardItemValue) {
/** @type {?} */
var valueAfterChange;
// 删除键
if (keyboardItemValue === 'delete') {
valueAfterChange = _this._value.substring(0, _this._value.length - 1);
_this.onChange.emit(valueAfterChange);
// 确认键
}
else if (keyboardItemValue === 'confirm') {
valueAfterChange = _this._value;
_this.onChange.emit(valueAfterChange);
_this.onInputBlur(_this._value);
// 收起键
}
else if (keyboardItemValue === 'hide') {
valueAfterChange = _this._value;
_this.onInputBlur(valueAfterChange);
}
else {
if (_this._maxLength !== undefined &&
+_this._maxLength >= 0 &&
(_this._value + keyboardItemValue).length > _this._maxLength) {
valueAfterChange = (_this._value + keyboardItemValue).substr(0, _this._maxLength);
_this.onChange.emit(valueAfterChange);
}
else {
valueAfterChange = _this._value + keyboardItemValue;
_this.onChange.emit(valueAfterChange);
}
}
_this._ngZone.run((/**
* @return {?}
*/
function () {
_this._value = valueAfterChange;
}));
});
}
Object.defineProperty(CustomInputComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (typeof v === 'undefined' || v === null) {
this._value = '';
}
else if (this._maxLength !== undefined && this._maxLength >= 0) {
this._value = v.toString().substr(0, this._maxLength);
}
else {
this._value = v.toString();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "defaultValue", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._defaultValue = value;
if (!this._value) {
this._value = this._defaultValue.toString();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "maxLength", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._maxLength = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "placeholder", {
get: /**
* @return {?}
*/
function () {
return this._placeholder;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._placeholder = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "editable", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._editable = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "disabled", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "fontColor", {
get: /**
* @return {?}
*/
function () {
return this._fontColor;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._fontColor = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "moneyKeyboardAlign", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._moneyKeyboardAlign = value;
this.setContainerCls();
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomInputComponent.prototype, "setFocus", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._setFocus = value.focus;
if (this._setFocus) {
this.inputFocus();
}
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
CustomInputComponent.prototype.onFakeInputClick = /**
* @return {?}
*/
function () {
if (this._preventKeyboard) {
return;
}
this.inputFocus();
};
/**
* @return {?}
*/
CustomInputComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this._preventKeyboard = this._disabled || !this._editable;
this.setFakeInputCls();
this.setContainerCls();
};
/**
* @return {?}
*/
CustomInputComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.removeBlurListener();
if (CustomInputService) {
CustomInputService.hideKeyboard();
CustomInputService.compRef = null;
}
/** @type {?} */
var container = document.querySelector("#" + this.keyboardPrefixCls + "-container");
if (container) {
container.remove();
}
};
CustomInputComponent.decorators = [
{ type: Component, args: [{
selector: 'CustomInput',
template: "<div *ngIf=\"value === ''\" class=\"fake-input-placeholder\">\n {{ placeholder }}\n</div>\n<div [ngClass]=\"fakeInputCls\" [style.color]=\"fontColor\" (click)=\"onFakeInputClick()\">\n {{ value }}\n</div>\n",
encapsulation: ViewEncapsulation.None,
providers: [CustomInputService]
}] }
];
/** @nocollapse */
CustomInputComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: CustomInputService },
{ type: NgZone }
]; };
CustomInputComponent.propDecorators = {
value: [{ type: Input }],
defaultValue: [{ type: Input }],
maxLength: [{ type: Input }],
placeholder: [{ type: Input }],
editable: [{ type: Input }],
disabled: [{ type: Input }],
fontColor: [{ type: Input }],
moneyKeyboardAlign: [{ type: Input }],
setFocus: [{ type: Input }],
onChange: [{ type: Output }],
onBlur: [{ type: Output }],
onFocus: [{ type: Output }],
clsFakeContainer: [{ type: HostBinding, args: ['class.fake-input-container',] }],
clsFakeContainerLeft: [{ type: HostBinding, args: ['class.fake-input-container-left',] }]
};
return CustomInputComponent;
}());
export { CustomInputComponent };
if (false) {
/** @type {?} */
CustomInputComponent.prototype.keyboardPrefixCls;
/** @type {?} */
CustomInputComponent.prototype.fakeInputCls;
/** @type {?} */
CustomInputComponent.prototype.focus;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._value;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._defaultValue;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._placeholder;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._maxLength;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._editable;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._setFocus;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._preventKeyboard;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._moneyKeyboardAlign;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._fontColor;
/** @type {?} */
CustomInputComponent.prototype.onChange;
/** @type {?} */
CustomInputComponent.prototype.onBlur;
/** @type {?} */
CustomInputComponent.prototype.onFocus;
/** @type {?} */
CustomInputComponent.prototype.clsFakeContainer;
/** @type {?} */
CustomInputComponent.prototype.clsFakeContainerLeft;
/** @type {?} */
CustomInputComponent.prototype.inputFocus;
/** @type {?} */
CustomInputComponent.prototype.doBlur;
/** @type {?} */
CustomInputComponent.prototype.removeBlurListener;
/** @type {?} */
CustomInputComponent.prototype.addBlurListener;
/** @type {?} */
CustomInputComponent.prototype.onInputBlur;
/** @type {?} */
CustomInputComponent.prototype.onInputFocus;
/** @type {?} */
CustomInputComponent.prototype.setFakeInputCls;
/** @type {?} */
CustomInputComponent.prototype.setContainerCls;
/** @type {?} */
CustomInputComponent.prototype.onKeyboardClick;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._ref;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._customInputService;
/**
* @type {?}
* @private
*/
CustomInputComponent.prototype._ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW5wdXQtaXRlbS9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04saUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQ7SUE4RkUsOEJBQW9CLElBQWdCLEVBQVUsbUJBQXVDLEVBQVUsT0FBZTtRQUE5RyxpQkFBa0g7UUFBOUYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdkY5RyxzQkFBaUIsR0FBVyxvQkFBb0IsQ0FBQztRQUVqRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBRWYsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQWtFbkMsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHckQscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBYWpDLGVBQVU7OztRQUFHO1lBQ1gsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O2dCQUNwQixLQUFLLEdB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O0lBQ2xDLG1EQUFvQzs7Ozs7SUFDcEMsMENBQTJCOztJQThEM0Isd0NBQ3NEOztJQUN0RCxzQ0FDb0Q7O0lBQ3BELHVDQUNxRDs7SUFFckQsZ0RBQ2lDOztJQUNqQyxvREFDOEI7O0lBVzlCLDBDQVNDOztJQUVELHNDQThDQzs7SUFFRCxrREFFQzs7SUFFRCwrQ0FFQzs7SUFFRCwyQ0FLQzs7SUFFRCw0Q0FRQzs7SUFFRCwrQ0FNQzs7SUFFRCwrQ0FFQzs7SUFFRCwrQ0ErQkM7Ozs7O0lBeElXLG9DQUF3Qjs7Ozs7SUFBRSxtREFBK0M7Ozs7O0lBQUUsdUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSG9zdEJpbmRpbmcsXG4gIE5nWm9uZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1c3RvbUlucHV0U2VydmljZSB9IGZyb20gJy4vY3VzdG9tLWlucHV0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDdXN0b21JbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20taW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtDdXN0b21JbnB1dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBrZXlib2FyZFByZWZpeENsczogc3RyaW5nID0gJ2FtLW51bWJlci1rZXlib2FyZCc7XG4gIGZha2VJbnB1dENsczogb2JqZWN0O1xuICBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zZXRGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmV2ZW50S2V5Ym9hcmQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX21vbmV5S2V5Ym9hcmRBbGlnbjogc3RyaW5nO1xuICBwcml2YXRlIF9mb250Q29sb3I6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgfHwgdiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX21heExlbmd0aCA+PSAwKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHYudG9TdHJpbmcoKS5zdWJzdHIoMCwgdGhpcy5fbWF4TGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heExlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGVkaXRhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZWRpdGFibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBmb250Q29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvbnRDb2xvcjtcbiAgfVxuICBzZXQgZm9udENvbG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9mb250Q29sb3IgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbW9uZXlLZXlib2FyZEFsaWduKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tb25leUtleWJvYXJkQWxpZ24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzZXRGb2N1cyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXMgPSB2YWx1ZS5mb2N1cztcbiAgICAgIGlmICh0aGlzLl9zZXRGb2N1cykge1xuICAgICAgICB0aGlzLmlucHV0Rm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZha2UtaW5wdXQtY29udGFpbmVyJylcbiAgY2xzRmFrZUNvbnRhaW5lcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFrZS1pbnB1dC1jb250YWluZXItbGVmdCcpXG4gIGNsc0Zha2VDb250YWluZXJMZWZ0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBfY3VzdG9tSW5wdXRTZXJ2aWNlOiBDdXN0b21JbnB1dFNlcnZpY2UsIHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxuXG4gIG9uRmFrZUlucHV0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuX3ByZXZlbnRLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlucHV0Rm9jdXMoKTtcbiAgfVxuXG4gIGlucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5yZW1vdmVCbHVyTGlzdGVuZXIoKTtcbiAgICBjb25zdCBmb2N1cyA9IHRoaXMuZm9jdXM7XG4gICAgaWYgKCFmb2N1cyB8fCB0aGlzLl9zZXRGb2N1cykge1xuICAgICAgdGhpcy5vbklucHV0Rm9jdXMoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFkZEJsdXJMaXN0ZW5lcigpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIGRvQmx1ciA9IGV2ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIC8vIOeCueWHu+aYr+WQpuaYr+e7hOS7tuacrOi6q1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIC8vIOeCueWHu+ebruagh+aYr+WQpuaYr2N1c3RvbS1pbnB1dFxuICAgIGxldCBpc0lucHV0ID0gZmFsc2U7XG4gICAgLy8g54K55Ye755uu5qCH5piv5ZCm5pivY3VzdG9tLWtleWJvYXJkXG4gICAgbGV0IGlzS2V5Ym9hcmQgPSBmYWxzZTtcbiAgICBsZXQgaXNDbGVhciA9IGZhbHNlO1xuICAgIGxldCB0YXJnZXQgPSBldi50YXJnZXQ7XG4gICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9yZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ2N1c3RvbWlucHV0Jykge1xuICAgICAgICBpc0lucHV0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9ta2V5Ym9hcmQnKSB7XG4gICAgICAgIGlzS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignYW0taW5wdXQtY2xlYXInKSA+PSAwKSB7XG4gICAgICAgIGlzQ2xlYXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIOW9k+eCueWHu+ebruagh+aYr+acrOi6q+eahOaXtuWAme+8jOiOt+WPlueEpueCueOAgeS4jemakOiXj2tleWJvYXJkXG4gICAgLy8g5b2T54K55Ye755uu5qCH5LiN5piv5pys6Lqr5L2G5piv5YW25LuW55qEY3VzdG9tLWlucHV05pe277yM5aSx5Y6754Sm54K544CB5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICAvLyDlvZPngrnlh7vnm67moIfmmK9rZXlib2FyZOaXtu+8jOS4jeWkseWOu+eEpueCue+8jOS4jemakOiXj2tleWJvYXJkXG4gICAgaWYgKHBhcmVudEZvdW5kKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGlzSW5wdXQpIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXMgJiYgaXNLZXlib2FyZCkge1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLm9uS2V5Ym9hcmRDbGljayhDdXN0b21JbnB1dFNlcnZpY2UuY2xpY2tWYWx1ZSk7XG4gICAgfVxuICAgIGlmICghcGFyZW50Rm91bmQgJiYgIWlzSW5wdXQgJiYgIWlzS2V5Ym9hcmQgJiYgIWlzQ2xlYXIgJiYgIXRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuaGlkZUtleWJvYXJkKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gIH1cblxuICByZW1vdmVCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9XG5cbiAgYWRkQmx1ckxpc3RlbmVyID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb0JsdXIsIGZhbHNlKTtcbiAgfVxuXG4gIG9uSW5wdXRCbHVyID0gdmFsdWUgPT4ge1xuICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgfVxuXG4gIG9uSW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLm9uRm9jdXMuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLnNob3dLZXlib2FyZCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBzZXRGYWtlSW5wdXRDbHMgPSAoKSA9PiB7XG4gICAgdGhpcy5mYWtlSW5wdXRDbHMgPSB7XG4gICAgICBbYGZha2UtaW5wdXRgXTogdHJ1ZSxcbiAgICAgIFsnZmFrZS1pbnB1dC1kaXNhYmxlZCddOiB0aGlzLl9kaXNhYmxlZCxcbiAgICAgIFsnZm9jdXMnXTogdGhpcy5mb2N1c1xuICAgIH07XG4gIH1cblxuICBzZXRDb250YWluZXJDbHMgPSAoKSA9PiB7XG4gICAgdGhpcy5jbHNGYWtlQ29udGFpbmVyTGVmdCA9IHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9PT0gJ2xlZnQnO1xuICB9XG5cbiAgb25LZXlib2FyZENsaWNrID0ga2V5Ym9hcmRJdGVtVmFsdWUgPT4ge1xuICAgIGxldCB2YWx1ZUFmdGVyQ2hhbmdlO1xuICAgIC8vIOWIoOmZpOmUrlxuICAgIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZS5zdWJzdHJpbmcoMCwgdGhpcy5fdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICAvLyDnoa7orqTplK5cbiAgICB9IGVsc2UgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnY29uZmlybScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIHRoaXMub25JbnB1dEJsdXIodGhpcy5fdmFsdWUpO1xuICAgICAgLy8g5pS26LW36ZSuXG4gICAgfSBlbHNlIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2hpZGUnKSB7XG4gICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLm9uSW5wdXRCbHVyKHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICt0aGlzLl9tYXhMZW5ndGggPj0gMCAmJlxuICAgICAgICAodGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZSkubGVuZ3RoID4gdGhpcy5fbWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9ICh0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlKS5zdWJzdHIoMCwgdGhpcy5fbWF4TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlQWZ0ZXJDaGFuZ2U7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9wcmV2ZW50S2V5Ym9hcmQgPSB0aGlzLl9kaXNhYmxlZCB8fCAhdGhpcy5fZWRpdGFibGU7XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNscygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVCbHVyTGlzdGVuZXIoKTtcbiAgICBpZiAoQ3VzdG9tSW5wdXRTZXJ2aWNlKSB7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuaGlkZUtleWJvYXJkKCk7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuY29tcFJlZiA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMua2V5Ym9hcmRQcmVmaXhDbHN9LWNvbnRhaW5lcmApO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==