ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
621 lines • 38.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, forwardRef, HostBinding, ElementRef, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
export class TextareaItemComponent {
/**
* @param {?} element
* @param {?} render
*/
constructor(element, render) {
this.element = element;
this.render = render;
this.prefixCls = 'am-textarea';
this.isTitleString = true;
this.maxLength = Infinity;
this._prefixListCls = 'am-list';
this._defaultValue = '';
this._placeholder = '';
this._editable = true;
this._disabled = false;
this._clear = false;
this._rows = 1;
this._error = false;
this._labelNumber = 5;
this._name = '';
this._focus = false;
this._autoFocus = false;
this._isClear = false;
this._isClickingClear = false;
this.onChange = new EventEmitter();
this.onBlur = new EventEmitter();
this.onFocus = new EventEmitter();
this.onErrorClick = new EventEmitter();
this.clsItem = true;
this._onChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
this._el = element.nativeElement;
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (typeof v === 'undefined' || v === null) {
this._value = '';
}
else {
this._value = v;
}
this.textRef.nativeElement.value = this._value;
this._onChange(this._value);
}
/**
* @return {?}
*/
get defaultValue() {
return this._defaultValue;
}
/**
* @param {?} value
* @return {?}
*/
set defaultValue(value) {
this._defaultValue = value;
this._value = this._defaultValue;
this.textRef.nativeElement.value = this._value;
}
/**
* @return {?}
*/
get placeholder() {
return this._placeholder;
}
/**
* @param {?} value
* @return {?}
*/
set placeholder(value) {
this._placeholder = value;
}
/**
* @return {?}
*/
get editable() {
return this._editable;
}
/**
* @param {?} value
* @return {?}
*/
set editable(value) {
this._editable = value;
}
/**
* @return {?}
*/
get disabled() {
return this._disabled;
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
this.setCls();
}
/**
* @return {?}
*/
get clear() {
return this._clear;
}
/**
* @param {?} value
* @return {?}
*/
set clear(value) {
this._clear = value;
}
/**
* @return {?}
*/
get rows() {
return this._rows;
}
/**
* @param {?} value
* @return {?}
*/
set rows(value) {
this._rows = value;
this.setCls();
}
/**
* @return {?}
*/
get error() {
return this._error;
}
/**
* @param {?} value
* @return {?}
*/
set error(value) {
this._error = value;
this.setCls();
}
/**
* @param {?} value
* @return {?}
*/
set labelNumber(value) {
this._labelNumber = value;
this.setCls();
}
/**
* @return {?}
*/
get count() {
return this._count;
}
/**
* @param {?} value
* @return {?}
*/
set count(value) {
this._count = value;
this.setCls();
this.setCharacterLength();
}
/**
* @return {?}
*/
get prefixListCls() {
return this._prefixListCls;
}
/**
* @param {?} value
* @return {?}
*/
set prefixListCls(value) {
this._prefixListCls = value;
this.setCls();
}
/**
* @param {?} value
* @return {?}
*/
set name(value) {
this._name = value;
this.textRef.nativeElement.name = this._name;
}
/**
* @param {?} value
* @return {?}
*/
set autoHeight(value) {
this._autoHeight = value;
}
/**
* @return {?}
*/
get title() {
return this._title;
}
/**
* @param {?} value
* @return {?}
*/
set title(value) {
this._title = value;
this.isTitleString = true;
if (typeof value !== 'string') {
this.isTitleString = false;
}
}
/**
* @param {?} value
* @return {?}
*/
set focus(value) {
if (value && value.focus) {
this.textRef.nativeElement.focus();
this.inputFocus('');
}
}
/**
* @return {?}
*/
get autoFocus() {
return this._autoFocus;
}
/**
* @param {?} value
* @return {?}
*/
set autoFocus(value) {
this._autoFocus = value;
}
/**
* @return {?}
*/
setCls() {
this.hasCount = this._count > 0 && this._rows > 1;
this.render.addClass(this._el, this._prefixListCls + '-item');
this.clsSingleLine = this._rows === 1 && !this._autoHeight;
this.clsDisabled = this._disabled;
this.clsError = this._error;
this.clsFocus = this._focus;
this.clsHasCount = this.hasCount;
this.labelCls = {
[`${this.prefixCls}-label`]: true,
[`${this.prefixCls}-label-2`]: this._labelNumber === 2,
[`${this.prefixCls}-label-3`]: this._labelNumber === 3,
[`${this.prefixCls}-label-4`]: this._labelNumber === 4,
[`${this.prefixCls}-label-5`]: this._labelNumber === 5,
[`${this.prefixCls}-label-6`]: this._labelNumber === 6,
[`${this.prefixCls}-label-7`]: this._labelNumber === 7
};
this.controlCls = { [`${this.prefixCls}-control`]: true };
this.clearCls = {
[`${this.prefixCls}-clear-active`]: this._isClickingClear
};
}
/**
* @return {?}
*/
setCharacterLength() {
this.characterLength = this.countSymbols(this._value);
if (this._count > 0) {
this.maxLength = this._count - this.characterLength + (this._value ? this._value.length : 0);
}
}
/**
* @param {?} e
* @return {?}
*/
inputChange(e) {
this._value = e;
this.textRef.nativeElement.value = this._value;
this.setCharacterLength();
this._onChange(this._value);
this.onChange.emit(this._value);
}
/**
* @param {?} value
* @return {?}
*/
inputFocus(value) {
this._focus = true;
this.setCls();
if (value !== undefined) {
this.onFocus.emit(value);
}
}
/**
* @param {?} value
* @param {?} event
* @return {?}
*/
inputBlur(value, event) {
setTimeout((/**
* @return {?}
*/
() => {
this._focus = false;
this.setCls();
this.onBlur.emit(value);
this._isClear = false;
}), 100);
}
/**
* @return {?}
*/
clearInput() {
this._isClickingClear = true;
this.setCls();
setTimeout((/**
* @return {?}
*/
() => {
this._value = '';
this.inputChange('');
this.inputFocus(this._value);
this._isClickingClear = false;
this.setCls();
}), 100);
}
/**
* @param {?} e
* @return {?}
*/
errorClick(e) {
if (this.onErrorClick) {
this.onErrorClick.emit(e);
}
}
/**
* @return {?}
*/
reAlignHeight() {
/** @type {?} */
const textareaDom = this.textRef.nativeElement;
textareaDom.style.height = '';
textareaDom.style.height = `${textareaDom.scrollHeight}px`;
}
/**
* @param {?=} text
* @return {?}
*/
countSymbols(text = '') {
/** @type {?} */
const regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]|\n/g;
return text.replace(regexAstralSymbols, '_').length;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (typeof value === 'undefined' || value === null) {
this._value = '';
}
else {
this._value = value;
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this._onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
/**
* @return {?}
*/
ngOnInit() {
this.setCls();
this.setCharacterLength();
this.textRef.nativeElement.value = this._value;
}
/**
* @return {?}
*/
ngAfterViewInit() {
setTimeout((/**
* @return {?}
*/
() => {
if (this._autoHeight) {
this.reAlignHeight();
}
}), 100);
}
/**
* @return {?}
*/
ngAfterContentChecked() {
if (this._autoHeight && this._focus) {
this.reAlignHeight();
}
}
}
TextareaItemComponent.decorators = [
{ type: Component, args: [{
selector: 'TextareaItem , nzm-textarea-item',
template: "<div *ngIf=\"title && isTitleString\" [ngClass]=\"labelCls\">{{ title }}</div>\n<div *ngIf=\"title && !isTitleString\" [ngClass]=\"labelCls\">\n <ng-template [ngTemplateOutlet]=\"title\"></ng-template>\n</div>\n<div [ngClass]=\"controlCls\">\n <textarea\n #text\n [rows]=\"rows\"\n [maxlength]=\"maxLength\"\n [(ngModel)]=\"value\"\n [defaultValue]=\"defaultValue\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled\"\n [readOnly]=\"!editable\"\n [autofocus]=\"autoFocus\"\n (ngModelChange)=\"inputChange($event)\"\n (blur)=\"inputBlur(value, $event)\"\n (focus)=\"inputFocus(value)\"\n ></textarea>\n</div>\n<div\n *ngIf=\"clear && editable && !disabled && (value && value.length > 0)\"\n class=\"{{ prefixCls }}-clear\"\n [ngClass]=\"clearCls\"\n (click)=\"clearInput()\"\n></div>\n<div *ngIf=\"error\" class=\"{{ prefixCls }}-error-extra\" (click)=\"errorClick($event)\"></div>\n<span *ngIf=\"hasCount\" class=\"{{ prefixCls }}-count\">\n <span>{{ characterLength }}</span\n >/{{ count }}\n</span>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => TextareaItemComponent)),
multi: true
}
]
}] }
];
/** @nocollapse */
TextareaItemComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 }
];
TextareaItemComponent.propDecorators = {
textRef: [{ type: ViewChild, args: ['text',] }],
value: [{ type: Input }],
defaultValue: [{ type: Input }],
placeholder: [{ type: Input }],
editable: [{ type: Input }],
disabled: [{ type: Input }],
clear: [{ type: Input }],
rows: [{ type: Input }],
error: [{ type: Input }],
labelNumber: [{ type: Input }],
count: [{ type: Input }],
prefixListCls: [{ type: Input }],
name: [{ type: Input }],
autoHeight: [{ type: Input }],
title: [{ type: Input }],
focus: [{ type: Input }],
autoFocus: [{ type: Input }],
onChange: [{ type: Output }],
onBlur: [{ type: Output }],
onFocus: [{ type: Output }],
onErrorClick: [{ type: Output }],
clsItem: [{ type: HostBinding, args: ['class.am-textarea-item',] }],
clsDisabled: [{ type: HostBinding, args: ['class.am-textarea-disabled',] }],
clsError: [{ type: HostBinding, args: ['class.am-textarea-error',] }],
clsFocus: [{ type: HostBinding, args: ['class.am-textarea-focus',] }],
clsSingleLine: [{ type: HostBinding, args: ['class.am-textarea-item-single-line',] }],
clsHasCount: [{ type: HostBinding, args: ['class.am-textarea-has-count',] }]
};
if (false) {
/** @type {?} */
TextareaItemComponent.prototype.prefixCls;
/** @type {?} */
TextareaItemComponent.prototype.wrapCls;
/** @type {?} */
TextareaItemComponent.prototype.labelCls;
/** @type {?} */
TextareaItemComponent.prototype.controlCls;
/** @type {?} */
TextareaItemComponent.prototype.clearCls;
/** @type {?} */
TextareaItemComponent.prototype.hasCount;
/** @type {?} */
TextareaItemComponent.prototype.characterLength;
/** @type {?} */
TextareaItemComponent.prototype.isTitleString;
/** @type {?} */
TextareaItemComponent.prototype.maxLength;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._el;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._prefixListCls;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._value;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._defaultValue;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._placeholder;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._editable;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._clear;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._rows;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._count;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._autoHeight;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._error;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._labelNumber;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._name;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._title;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._focus;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._autoFocus;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._isClear;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype._isClickingClear;
/** @type {?} */
TextareaItemComponent.prototype.textRef;
/** @type {?} */
TextareaItemComponent.prototype.onChange;
/** @type {?} */
TextareaItemComponent.prototype.onBlur;
/** @type {?} */
TextareaItemComponent.prototype.onFocus;
/** @type {?} */
TextareaItemComponent.prototype.onErrorClick;
/** @type {?} */
TextareaItemComponent.prototype.clsItem;
/** @type {?} */
TextareaItemComponent.prototype.clsDisabled;
/** @type {?} */
TextareaItemComponent.prototype.clsError;
/** @type {?} */
TextareaItemComponent.prototype.clsFocus;
/** @type {?} */
TextareaItemComponent.prototype.clsSingleLine;
/** @type {?} */
TextareaItemComponent.prototype.clsHasCount;
/** @type {?} */
TextareaItemComponent.prototype._onChange;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype.element;
/**
* @type {?}
* @private
*/
TextareaItemComponent.prototype.render;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRleHRhcmVhLWl0ZW0vdGV4dGFyZWEtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUdULFVBQVUsRUFDVixXQUFXLEVBQ1gsVUFBVSxFQUNWLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFhekUsTUFBTSxPQUFPLHFCQUFxQjs7Ozs7SUFtTGhDLFlBQW9CLE9BQW1CLEVBQVUsTUFBaUI7UUFBOUMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFsTGxFLGNBQVMsR0FBVyxhQUFhLENBQUM7UUFPbEMsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDOUIsY0FBUyxHQUFXLFFBQVEsQ0FBQztRQUdyQixtQkFBYyxHQUFHLFNBQVMsQ0FBQztRQUUzQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUMxQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixVQUFLLEdBQVcsQ0FBQyxDQUFDO1FBR2xCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUVuQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFp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OzBCQUVwQyxXQUFXLFNBQUMsNEJBQTRCO3VCQUV4QyxXQUFXLFNBQUMseUJBQXlCO3VCQUVyQyxXQUFXLFNBQUMseUJBQXlCOzRCQUVyQyxXQUFXLFNBQUMsb0NBQW9DOzBCQUVoRCxXQUFXLFNBQUMsNkJBQTZCOzs7O0lBL0sxQywwQ0FBa0M7O0lBQ2xDLHdDQUFnQjs7SUFDaEIseUNBQWlCOztJQUNqQiwyQ0FBbUI7O0lBQ25CLHlDQUFpQjs7SUFDakIseUNBQWtCOztJQUNsQixnREFBd0I7O0lBQ3hCLDhDQUE4Qjs7SUFDOUIsMENBQTZCOzs7OztJQUU3QixvQ0FBd0I7Ozs7O0lBQ3hCLCtDQUFtQzs7Ozs7SUFDbkMsdUNBQXVCOzs7OztJQUN2Qiw4Q0FBbUM7Ozs7O0lBQ25DLDZDQUFrQzs7Ozs7SUFDbEMsMENBQWtDOzs7OztJQUNsQywwQ0FBbUM7Ozs7O0lBQ25DLHVDQUFnQzs7Ozs7SUFDaEMsc0NBQTBCOzs7OztJQUMxQix1Q0FBdUI7Ozs7O0lBQ3ZCLDRDQUE2Qjs7Ozs7SUFDN0IsdUNBQWdDOzs7OztJQUNoQyw2Q0FBaUM7Ozs7O0lBQ2pDLHNDQUEyQjs7Ozs7SUFDM0IsdUNBQTBDOzs7OztJQUMxQyx1Q0FBZ0M7Ozs7O0lBQ2hDLDJDQUFvQzs7Ozs7SUFDcEMseUNBQWtDOzs7OztJQUNsQyxpREFBMEM7O0lBRTFDLHdDQUNROztJQTZIUix5Q0FDc0Q7O0lBQ3RELHVDQUNvRDs7SUFDcEQsd0NBQ3FEOztJQUNyRCw2Q0FDMEQ7O0lBRTFELHdDQUN3Qjs7SUFDeEIsNENBQ3FCOztJQUNyQix5Q0FDa0I7O0lBQ2xCLHlDQUNrQjs7SUFDbEIsOENBQ3VCOztJQUN2Qiw0Q0FDcUI7O0lBTXJCLDBDQUEyQjs7Ozs7SUFKZix3Q0FBMkI7Ozs7O0lBQUUsdUNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0NoaWxkLFxuICBUZW1wbGF0ZVJlZixcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGV4dGFyZWFJdGVtICwgbnptLXRleHRhcmVhLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGV4dGFyZWFJdGVtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRleHRhcmVhSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10ZXh0YXJlYSc7XG4gIHdyYXBDbHM6IG9iamVjdDtcbiAgbGFiZWxDbHM6IG9iamVjdDtcbiAgY29udHJvbENsczogb2JqZWN0O1xuICBjbGVhckNsczogb2JqZWN0O1xuICBoYXNDb3VudDogYm9vbGVhbjtcbiAgY2hhcmFjdGVyTGVuZ3RoOiBudW1iZXI7XG4gIGlzVGl0bGVTdHJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBtYXhMZW5ndGg6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIHByaXZhdGUgX2VsOiBFbGVtZW50UmVmO1xuICBwcml2YXRlIF9wcmVmaXhMaXN0Q2xzID0gJ2FtLWxpc3QnO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2VkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcm93czogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBfY291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfYXV0b0hlaWdodDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbGFiZWxOdW1iZXI6IG51bWJlciA9IDU7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF90aXRsZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgcHJpdmF0ZSBfZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYXV0b0ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzQ2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDbGlja2luZ0NsZWFyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgndGV4dCcpXG4gIHRleHRSZWY7XG5cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09ICd1bmRlZmluZWQnIHx8IHYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICB9XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gIH1cbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBlZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdGFibGU7XG4gIH1cbiAgc2V0IGVkaXRhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZWRpdGFibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgY2xlYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFyO1xuICB9XG4gIHNldCBjbGVhcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcm93cztcbiAgfVxuICBzZXQgcm93cyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcm93cyA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGVycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgfVxuICBzZXQgZXJyb3IodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lcnJvciA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGxhYmVsTnVtYmVyKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sYWJlbE51bWJlciA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50O1xuICB9XG4gIHNldCBjb3VudCh2YWx1ZSkge1xuICAgIHRoaXMuX2NvdW50ID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICB0aGlzLnNldENoYXJhY3Rlckxlbmd0aCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwcmVmaXhMaXN0Q2xzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWZpeExpc3RDbHM7XG4gIH1cbiAgc2V0IHByZWZpeExpc3RDbHModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3ByZWZpeExpc3RDbHMgPSB2YWx1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQubmFtZSA9IHRoaXMuX25hbWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGF1dG9IZWlnaHQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9hdXRvSGVpZ2h0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICB0aGlzLl90aXRsZSA9IHZhbHVlO1xuICAgIHRoaXMuaXNUaXRsZVN0cmluZyA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuaXNUaXRsZVN0cmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZm9jdXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuZm9jdXMpIHtcbiAgICAgIHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLmlucHV0Rm9jdXMoJycpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgYXV0b0ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hdXRvRm9jdXM7XG4gIH1cbiAgc2V0IGF1dG9Gb2N1cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2F1dG9Gb2N1cyA9IHZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkVycm9yQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10ZXh0YXJlYS1pdGVtJylcbiAgY2xzSXRlbTogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGV4dGFyZWEtZGlzYWJsZWQnKVxuICBjbHNEaXNhYmxlZDogYm9vbGVhbjtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10ZXh0YXJlYS1lcnJvcicpXG4gIGNsc0Vycm9yOiBib29sZWFuO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRleHRhcmVhLWZvY3VzJylcbiAgY2xzRm9jdXM6IGJvb2xlYW47XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGV4dGFyZWEtaXRlbS1zaW5nbGUtbGluZScpXG4gIGNsc1NpbmdsZUxpbmU6IGJvb2xlYW47XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGV4dGFyZWEtaGFzLWNvdW50JylcbiAgY2xzSGFzQ291bnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5fZWwgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBfb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICBzZXRDbHMoKSB7XG4gICAgdGhpcy5oYXNDb3VudCA9IHRoaXMuX2NvdW50ID4gMCAmJiB0aGlzLl9yb3dzID4gMTtcbiAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLl9lbCwgdGhpcy5fcHJlZml4TGlzdENscyArICctaXRlbScpO1xuICAgIHRoaXMuY2xzU2luZ2xlTGluZSA9IHRoaXMuX3Jvd3MgPT09IDEgJiYgIXRoaXMuX2F1dG9IZWlnaHQ7XG4gICAgdGhpcy5jbHNEaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgIHRoaXMuY2xzRXJyb3IgPSB0aGlzLl9lcnJvcjtcbiAgICB0aGlzLmNsc0ZvY3VzID0gdGhpcy5fZm9jdXM7XG4gICAgdGhpcy5jbHNIYXNDb3VudCA9IHRoaXMuaGFzQ291bnQ7XG4gICAgdGhpcy5sYWJlbENscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWxgXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtMmBdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gMixcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtM2BdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gMyxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtNGBdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gNCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtNWBdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gNSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtNmBdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gNixcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tbGFiZWwtN2BdOiB0aGlzLl9sYWJlbE51bWJlciA9PT0gN1xuICAgIH07XG4gICAgdGhpcy5jb250cm9sQ2xzID0geyBbYCR7dGhpcy5wcmVmaXhDbHN9LWNvbnRyb2xgXTogdHJ1ZSB9O1xuICAgIHRoaXMuY2xlYXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNsZWFyLWFjdGl2ZWBdOiB0aGlzLl9pc0NsaWNraW5nQ2xlYXJcbiAgICB9O1xuICB9XG4gIHNldENoYXJhY3Rlckxlbmd0aCgpIHtcbiAgICB0aGlzLmNoYXJhY3Rlckxlbmd0aCA9IHRoaXMuY291bnRTeW1ib2xzKHRoaXMuX3ZhbHVlKTtcbiAgICBpZiAodGhpcy5fY291bnQgPiAwKSB7XG4gICAgICB0aGlzLm1heExlbmd0aCA9IHRoaXMuX2NvdW50IC0gdGhpcy5jaGFyYWN0ZXJMZW5ndGggKyAodGhpcy5fdmFsdWUgPyB0aGlzLl92YWx1ZS5sZW5ndGggOiAwKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dENoYW5nZShlKSB7XG4gICAgdGhpcy5fdmFsdWUgPSBlO1xuICAgIHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgdGhpcy5zZXRDaGFyYWN0ZXJMZW5ndGgoKTtcbiAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgfVxuXG4gIGlucHV0Rm9jdXModmFsdWUpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5zZXRDbHMoKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbkZvY3VzLmVtaXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0Qmx1cih2YWx1ZSwgZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLnNldENscygpO1xuICAgICAgdGhpcy5vbkJsdXIuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLl9pc0NsZWFyID0gZmFsc2U7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGNsZWFySW5wdXQoKSB7XG4gICAgdGhpcy5faXNDbGlja2luZ0NsZWFyID0gdHJ1ZTtcbiAgICB0aGlzLnNldENscygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2UoJycpO1xuICAgICAgdGhpcy5pbnB1dEZvY3VzKHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuX2lzQ2xpY2tpbmdDbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbHMoKTtcbiAgICB9LCAxMDApO1xuICB9XG4gIGVycm9yQ2xpY2soZSkge1xuICAgIGlmICh0aGlzLm9uRXJyb3JDbGljaykge1xuICAgICAgdGhpcy5vbkVycm9yQ2xpY2suZW1pdChlKTtcbiAgICB9XG4gIH1cbiAgcmVBbGlnbkhlaWdodCgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYURvbSA9IHRoaXMudGV4dFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRleHRhcmVhRG9tLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgIHRleHRhcmVhRG9tLnN0eWxlLmhlaWdodCA9IGAke3RleHRhcmVhRG9tLnNjcm9sbEhlaWdodH1weGA7XG4gIH1cblxuICBjb3VudFN5bWJvbHModGV4dCA9ICcnKSB7XG4gICAgY29uc3QgcmVnZXhBc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18XFxuL2c7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZShyZWdleEFzdHJhbFN5bWJvbHMsICdfJykubGVuZ3RoO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENscygpO1xuICAgIHRoaXMuc2V0Q2hhcmFjdGVyTGVuZ3RoKCk7XG4gICAgdGhpcy50ZXh0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9hdXRvSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVBbGlnbkhlaWdodCgpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9IZWlnaHQgJiYgdGhpcy5fZm9jdXMpIHtcbiAgICAgIHRoaXMucmVBbGlnbkhlaWdodCgpO1xuICAgIH1cbiAgfVxufVxuIl19