ngx-form-control
Version:
Form controls for angular 6
364 lines (360 loc) • 36.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { BaseListControlComponent } from '../../utils/base-list-control.component';
import { Common } from '../../utils/common';
export class FormSelect2Component extends BaseListControlComponent {
constructor() {
super(...arguments);
this._isTouched = false;
}
/**
* @param {?} value
* @return {?}
*/
set placeholder(value) {
this._placeholder = value;
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
set required(value) {
this._required = value;
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
set multiple(value) {
this._multiple = value;
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
set tag(value) {
this._tag = value;
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
set tokenSeparators(value) {
this._tag = value;
this.updateSelect2Options();
}
/**
* @return {?}
*/
get value() {
if (!this._selectedIndexes || !this._selectedIndexes.length) {
return null;
}
/** @type {?} */
const result = this._selectedIndexes.reduce((currentResult, index) => {
if (Number.isInteger(index) && this._selectOptions[index]) {
currentResult.push(this._selectOptions[index].value);
}
else if (this._tag) {
/** @type {?} */
const match = index['value'].match(/^number: {([\d]+)}$/);
if (match) {
currentResult.push(match[1]);
}
else {
currentResult.push(index['value']);
}
}
return currentResult;
}, []);
return this._multiple ? result : result[0];
}
/**
* @return {?}
*/
get invalid() {
if (this.hasCustomError) {
return true;
}
if (!this._isTouched) {
return false;
}
return this.hasRequiredError;
}
/**
* @return {?}
*/
get valid() {
if (this.hasCustomError) {
return false;
}
if (!this._isTouched) {
return false;
}
return !this.hasRequiredError;
}
/**
* @return {?}
*/
get errorMessages() {
if (this.hasRequiredError) {
return [this.requiredErrorMessage];
}
if (this.hasCustomError) {
return this.innerCustomErrorMessages;
}
}
/**
* @return {?}
*/
ngOnInit() {
this.updateSelect2Options();
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (this._multiple && value && value.length) {
this.selectValues(value);
}
else if (!this._multiple) {
this.selectValue(value);
}
else {
this.cleanValue();
}
}
/**
* @return {?}
*/
validate() {
/** @type {?} */
const result = {};
if (this.hasRequiredError) {
result['required'] = true;
}
return result;
}
/**
* @return {?}
*/
reset() {
this._isTouched = false;
}
/**
* @return {?}
*/
afterInitOptions() {
this._selectOptions = [...this._selectOptions];
this.updateSelect2Options();
}
/**
* @param {?} values
* @return {?}
*/
selectValues(values) {
this._selectedIndexes = [];
/** @type {?} */
const select2Data = [];
if (values && values.length) {
values.map((value) => {
/** @type {?} */
const index = this.findIndex(value);
if (index > -1) {
this._selectedIndexes.push(index);
select2Data.push(index);
}
else if (this._tag) {
this._selectedIndexes.push({ value });
select2Data.push(value);
}
});
}
if (Common.isClient()) {
this._selectElement.val(select2Data);
this._selectElement.trigger('change');
}
}
/**
* @return {?}
*/
updateSelectedIndexes() {
if (Common.isServer()) {
return;
}
/** @type {?} */
const oldSelectedIndexes = JSON.stringify(this._selectedIndexes);
/** @type {?} */
const value = this._selectElement.val();
if ('number' === typeof value || ('string' === typeof value && Number.isInteger(+value))) {
this._selectedIndexes = [+value];
}
else if ('string' === typeof value && this._tag) {
this._selectedIndexes = [{ value }];
}
else if (value && value.length) {
this._selectedIndexes = value.map(item => {
if (Number.isInteger(+item)) {
return +item;
}
if (this._tag) {
return { value: item };
}
return null;
});
}
else {
this._selectedIndexes = [];
}
/** @type {?} */
const newSelectedIndexes = JSON.stringify(this._selectedIndexes);
if (newSelectedIndexes !== oldSelectedIndexes) {
this.triggerChange();
}
}
/**
* @param {?} value
* @return {?}
*/
selectValue(value) {
if (Common.isServer()) {
return;
}
/** @type {?} */
const index = this.findIndex(value);
if (index > -1) {
this._selectedIndexes = [index];
this._selectElement.val(this._selectedIndexes);
this._selectElement.trigger('change');
}
else if (this._tag) {
this._selectedIndexes = [{ value }];
this._selectElement.val(value);
this._selectElement.trigger('change');
}
else {
this.cleanValue();
}
}
/**
* @return {?}
*/
cleanValue() {
if (Common.isServer()) {
return;
}
this._selectedIndexes = [];
this._selectElement.val(null);
this._selectElement.trigger('change');
}
/**
* @return {?}
*/
updateSelect2Options() {
if (Common.isServer() || !this.customSelectElement || !this.customSelectElement.nativeElement) {
return;
}
this._selectElement = $(this.customSelectElement.nativeElement);
if (this._selectElement.hasClass('select2-hidden-accessible')) {
this._selectElement.select2().empty();
this._selectElement.select2('destroy');
}
this._selectElement.select2({
tags: this._tag,
tokenSeparators: this._tokenSeparators || [],
placeholder: this._placeholder,
allowClear: !this._required,
multiple: this._multiple,
data: this._selectOptions,
disabled: this._disabled,
createTag: function (params) {
/** @type {?} */
const term = $.trim(params.term);
if (term === '') {
return null;
}
return {
id: Number.isInteger(+term) ? `number: {${term}}` : term,
text: term,
newTag: true
};
}
});
this._selectElement.on('select2:select', () => {
this.updateSelectedIndexes();
});
this._selectElement.on('select2:unselect', () => {
this.updateSelectedIndexes();
});
this._selectElement.on('select2:close', () => {
this._isTouched = true;
});
}
}
FormSelect2Component.decorators = [
{ type: Component, args: [{
selector: 'ngx-form-select2',
template: `<label *ngIf="label" [for]="id">{{label}}</label>
<div class="form-control is-invalid" [ngClass]="{'is-invalid': invalid, 'is-valid': valid}">
<!--suppress HtmlFormInputWithoutLabel -->
<select [id]="id" #customSelectElement></select>
</div>
<div class="valid-feedback" *ngIf="valid && validMessage">{{validMessage}}</div>
<div class="invalid-feedback" *ngIf="invalid">
<span *ngFor="let message of errorMessages; let last = last;">
{{message}}<br *ngIf="!last">
</span>
</div>
`,
styles: [`:host .form-control{padding:0}:host .form-control /deep/ .select2-container{width:100%!important}:host .form-control /deep/ .select2-container .select2-selection--single{height:auto}:host .form-control /deep/ .select2-container--default .select2-selection--multiple,:host .form-control /deep/ .select2-container--default .select2-selection--single,:host .form-control /deep/ .select2-container--default.select2-container--focus .select2-selection--multiple{border:none;outline:0!important}:host .form-control /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control /deep/ .select2-container--default .select2-selection--single:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-invalid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--multiple:focus,:host .form-control.is-valid /deep/ .select2-container--default .select2-selection--single:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__rendered{min-height:40px;line-height:25px;padding:.375rem 25px .375rem .75rem}:host .form-control /deep/ .select2-container .select2-selection--multiple{min-height:40px;padding:.375rem .75rem}:host .form-control /deep/ .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding:0}:host .form-control /deep/ .select2-container--default .select2-selection--single .select2-selection__arrow{height:38px}`],
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: FormSelect2Component, multi: true },
{ provide: NG_VALIDATORS, useExisting: FormSelect2Component, multi: true }
]
},] },
];
FormSelect2Component.propDecorators = {
customSelectElement: [{ type: ViewChild, args: ['customSelectElement',] }],
placeholder: [{ type: Input }],
required: [{ type: Input }],
disabled: [{ type: Input }],
multiple: [{ type: Input }],
tag: [{ type: Input }],
tokenSeparators: [{ type: Input }]
};
if (false) {
/** @type {?} */
FormSelect2Component.prototype._selectElement;
/** @type {?} */
FormSelect2Component.prototype._isTouched;
/** @type {?} */
FormSelect2Component.prototype._placeholder;
/** @type {?} */
FormSelect2Component.prototype.customSelectElement;
/** @type {?} */
FormSelect2Component.prototype._required;
/** @type {?} */
FormSelect2Component.prototype._disabled;
/** @type {?} */
FormSelect2Component.prototype._tag;
/** @type {?} */
FormSelect2Component.prototype._tokenSeparators;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZWxlY3QyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mb3JtLWNvbnRyb2wvIiwic291cmNlcyI6WyJsaWIvZm9ybS1zZWxlY3QyL2Zvcm0tc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQTJCMUMsTUFBTSwyQkFBNEIsU0FBUSx3QkFBd0I7OzswQkFHM0MsS0FBSzs7Ozs7O0lBSzFCLElBQWEsV0FBVyxDQUFDLEtBQWE7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDN0I7Ozs7O0lBSUQsSUFBYSxRQUFRLENBQUMsS0FBYztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztLQUM3Qjs7Ozs7SUFJRCxJQUFhLFFBQVEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0tBQzdCOzs7OztJQUVELElBQWEsUUFBUSxDQUFDLEtBQWM7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7S0FDN0I7Ozs7O0lBSUQsSUFBYSxHQUFHLENBQUMsS0FBYztRQUM3QixJQUFJLENBQUMsSUFBSSxHQUFH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VixNQUFNLEVBQUUsSUFBSTtpQkFDYixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7WUFDNUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEIsQ0FBQyxDQUFDOzs7O1lBdlNOLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7O0NBY1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsa3dEQUFrd0QsQ0FBQztnQkFDNXdELFNBQVMsRUFBRTtvQkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztvQkFDNUUsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUN6RTthQUNGOzs7a0NBT0UsU0FBUyxTQUFDLHFCQUFxQjswQkFFL0IsS0FBSzt1QkFPTCxLQUFLO3VCQU9MLEtBQUs7dUJBS0wsS0FBSztrQkFPTCxLQUFLOzhCQU9MLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0Jhc2VMaXN0Q29udHJvbENvbXBvbmVudH0gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZS1saXN0LWNvbnRyb2wuY29tcG9uZW50JztcclxuaW1wb3J0IHtDb21tb259IGZyb20gJy4uLy4uL3V0aWxzL2NvbW1vbic7XHJcblxyXG5kZWNsYXJlIGNvbnN0ICQ7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1mb3JtLXNlbGVjdDInLFxyXG4gIHRlbXBsYXRlOiBgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuXHJcbjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaXMtaW52YWxpZFwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCc6IGludmFsaWQsICdpcy12YWxpZCc6IHZhbGlkfVwiPlxyXG4gIDwhLS1zdXBwcmVzcyBIdG1sRm9ybUlucHV0V2l0aG91dExhYmVsIC0tPlxyXG4gIDxzZWxlY3QgW2lkXT1cImlkXCIgI2N1c3RvbVNlbGVjdEVsZW1lbnQ+PC9zZWxlY3Q+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cInZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJ2YWxpZCAmJiB2YWxpZE1lc3NhZ2VcIj57e3ZhbGlkTWVzc2FnZX19PC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiaW52YWxpZFwiPlxyXG4gIDxzcGFuICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIGVycm9yTWVzc2FnZXM7IGxldCBsYXN0ID0gbGFzdDtcIj5cclxuICAgIHt7bWVzc2FnZX19PGJyICpuZ0lmPVwiIWxhc3RcIj5cclxuICA8L3NwYW4+XHJcbjwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2A6aG9zdCAuZm9ybS1jb250cm9se3BhZGRpbmc6MH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXJ7d2lkdGg6MTAwJSFpbXBvcnRhbnR9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyIC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xle2hlaWdodDphdXRvfTpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlLDpob3N0IC5mb3JtLWNvbnRyb2wgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZSw6aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQuc2VsZWN0Mi1jb250YWluZXItLWZvY3VzIC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGV7Ym9yZGVyOm5vbmU7b3V0bGluZTowIWltcG9ydGFudH06aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZTpmb2N1cyw6aG9zdCAuZm9ybS1jb250cm9sIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGU6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4MGJkZmY7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDAsMTIzLDI1NSwuMjUpfTpob3N0IC5mb3JtLWNvbnRyb2wuaXMtaW52YWxpZCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGU6Zm9jdXMsOmhvc3QgLmZvcm0tY29udHJvbC5pcy1pbnZhbGlkIC9kZWVwLyAuc2VsZWN0Mi1jb250YWluZXItLWRlZmF1bHQgLnNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGU6Zm9jdXN7Ym9yZGVyLWNvbG9yOiNkYzM1NDU7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDIyMCw1Myw2OSwuMjUpfTpob3N0IC5mb3JtLWNvbnRyb2wuaXMtdmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLW11bHRpcGxlOmZvY3VzLDpob3N0IC5mb3JtLWNvbnRyb2wuaXMtdmFsaWQgL2RlZXAvIC5zZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCAuc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZTpmb2N1c3tib3JkZXItY29sb3I6IzI4YTc0NTtib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDAsMTY3LDY5LC4yNSl9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlIC5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWR7bWluLWhlaWdodDo0MHB4O2xpbmUtaGVpZ2h0OjI1cHg7cGFkZGluZzouMzc1cmVtIDI1cHggLjM3NXJlbSAuNzVyZW19Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyIC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGV7bWluLWhlaWdodDo0MHB4O3BhZGRpbmc6LjM3NXJlbSAuNzVyZW19Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGUgLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZHtwYWRkaW5nOjB9Omhvc3QgLmZvcm0tY29udHJvbCAvZGVlcC8gLnNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0IC5zZWxlY3QyLXNlbGVjdGlvbi0tc2luZ2xlIC5zZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3d7aGVpZ2h0OjM4cHh9YF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBGb3JtU2VsZWN0MkNvbXBvbmVudCwgbXVsdGk6IHRydWV9LFxyXG4gICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBGb3JtU2VsZWN0MkNvbXBvbmVudCwgbXVsdGk6IHRydWV9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybVNlbGVjdDJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTGlzdENvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RFbGVtZW50O1xyXG4gIHByaXZhdGUgX2lzVG91Y2hlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbVNlbGVjdEVsZW1lbnQnKSBjdXN0b21TZWxlY3RFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGFnOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBzZXQgdGFnKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl90YWcgPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rva2VuU2VwYXJhdG9yczogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgc2V0IHRva2VuU2VwYXJhdG9ycyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdGFnID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdDJPcHRpb25zKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55IHtcclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRJbmRleGVzIHx8ICF0aGlzLl9zZWxlY3RlZEluZGV4ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3NlbGVjdGVkSW5kZXhlcy5yZWR1Y2UoKGN1cnJlbnRSZXN1bHQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSAmJiB0aGlzLl9zZWxlY3RPcHRpb25zW2luZGV4XSkge1xyXG4gICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaCh0aGlzLl9zZWxlY3RPcHRpb25zW2luZGV4XS52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpbmRleFsndmFsdWUnXS5tYXRjaCgvXm51bWJlcjogeyhbXFxkXSspfSQvKTtcclxuXHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobWF0Y2hbMV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2goaW5kZXhbJ3ZhbHVlJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGN1cnJlbnRSZXN1bHQ7XHJcbiAgICB9LCBbXSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlID8gcmVzdWx0IDogcmVzdWx0WzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzVG91Y2hlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGFzUmVxdWlyZWRFcnJvcjtcclxuICB9XHJcblxyXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmhhc0N1c3RvbUVycm9yKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuX2lzVG91Y2hlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICF0aGlzLmhhc1JlcXVpcmVkRXJyb3I7XHJcbiAgfVxyXG5cclxuICBnZXQgZXJyb3JNZXNzYWdlcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IpIHtcclxuICAgICAgcmV0dXJuIFt0aGlzLnJlcXVpcmVkRXJyb3JNZXNzYWdlXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbm5lckN1c3RvbUVycm9yTWVzc2FnZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0Mk9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSB8IEFycmF5PGFueT4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9tdWx0aXBsZSAmJiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RWYWx1ZXModmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICghdGhpcy5fbXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFuVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKCk6IHt9IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG5cclxuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IpIHtcclxuICAgICAgcmVzdWx0WydyZXF1aXJlZCddID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8gbm9pbnNwZWN0aW9uIEpTVW51c2VkR2xvYmFsU3ltYm9sc1xyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5faXNUb3VjaGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWZ0ZXJJbml0T3B0aW9ucygpIHtcclxuICAgIHRoaXMuX3NlbGVjdE9wdGlvbnMgPSBbLi4udGhpcy5fc2VsZWN0T3B0aW9uc107XHJcblxyXG4gICAgdGhpcy51cGRhdGVTZWxlY3QyT3B0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RWYWx1ZXModmFsdWVzKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbXTtcclxuICAgIGNvbnN0IHNlbGVjdDJEYXRhID0gW107XHJcblxyXG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZpbmRJbmRleCh2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICBzZWxlY3QyRGF0YS5wdXNoKGluZGV4KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZykge1xyXG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzLnB1c2goe3ZhbHVlfSk7XHJcbiAgICAgICAgICBzZWxlY3QyRGF0YS5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChDb21tb24uaXNDbGllbnQoKSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbChzZWxlY3QyRGF0YSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkSW5kZXhlcygpIHtcclxuICAgIGlmIChDb21tb24uaXNTZXJ2ZXIoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2xkU2VsZWN0ZWRJbmRleGVzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRJbmRleGVzKTtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc2VsZWN0RWxlbWVudC52YWwoKTtcclxuXHJcbiAgICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiB2YWx1ZSB8fCAoJ3N0cmluZycgPT09IHR5cGVvZiB2YWx1ZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKCt2YWx1ZSkpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFsrdmFsdWVdO1xyXG4gICAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHZhbHVlICYmIHRoaXMuX3RhZykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbe3ZhbHVlfV07XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoK2l0ZW0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gK2l0ZW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBpdGVtfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXhlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1NlbGVjdGVkSW5kZXhlcyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkSW5kZXhlcyk7XHJcblxyXG4gICAgaWYgKG5ld1NlbGVjdGVkSW5kZXhlcyAhPT0gb2xkU2VsZWN0ZWRJbmRleGVzKSB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RWYWx1ZSh2YWx1ZSkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZmluZEluZGV4KHZhbHVlKTtcclxuXHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ZXMgPSBbaW5kZXhdO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCh0aGlzLl9zZWxlY3RlZEluZGV4ZXMpO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl90YWcpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW3t2YWx1ZX1dO1xyXG4gICAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsZWFuVmFsdWUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYW5WYWx1ZSgpIHtcclxuICAgIGlmIChDb21tb24uaXNTZXJ2ZXIoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleGVzID0gW107XHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50LnZhbChudWxsKTtcclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdDJPcHRpb25zKCkge1xyXG4gICAgaWYgKENvbW1vbi5pc1NlcnZlcigpIHx8ICF0aGlzLmN1c3RvbVNlbGVjdEVsZW1lbnQgfHwgIXRoaXMuY3VzdG9tU2VsZWN0RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50ID0gJCh0aGlzLmN1c3RvbVNlbGVjdEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0RWxlbWVudC5oYXNDbGFzcygnc2VsZWN0Mi1oaWRkZW4tYWNjZXNzaWJsZScpKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0MigpLmVtcHR5KCk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0MignZGVzdHJveScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NlbGVjdEVsZW1lbnQuc2VsZWN0Mih7XHJcbiAgICAgIHRhZ3M6IHRoaXMuX3RhZyxcclxuICAgICAgdG9rZW5TZXBhcmF0b3JzOiB0aGlzLl90b2tlblNlcGFyYXRvcnMgfHwgW10sXHJcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLl9wbGFjZWhvbGRlcixcclxuICAgICAgYWxsb3dDbGVhcjogIXRoaXMuX3JlcXVpcmVkLFxyXG4gICAgICBtdWx0aXBsZTogdGhpcy5fbXVsdGlwbGUsXHJcbiAgICAgIGRhdGE6IHRoaXMuX3NlbGVjdE9wdGlvbnMsXHJcbiAgICAgIGRpc2FibGVkOiB0aGlzLl9kaXNhYmxlZCxcclxuICAgICAgY3JlYXRlVGFnOiBmdW5jdGlvbiAocGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgdGVybSA9ICQudHJpbShwYXJhbXMudGVybSk7XHJcblxyXG4gICAgICAgIGlmICh0ZXJtID09PSAnJykge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaWQ6IE51bWJlci5pc0ludGVnZXIoK3Rlcm0pID8gYG51bWJlcjogeyR7dGVybX19YCA6IHRlcm0sXHJcbiAgICAgICAgICB0ZXh0OiB0ZXJtLFxyXG4gICAgICAgICAgbmV3VGFnOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5vbignc2VsZWN0MjpzZWxlY3QnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRleGVzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zZWxlY3RFbGVtZW50Lm9uKCdzZWxlY3QyOnVuc2VsZWN0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSW5kZXhlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2VsZWN0RWxlbWVudC5vbignc2VsZWN0MjpjbG9zZScsICgpID0+IHtcclxuICAgICAgdGhpcy5faXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuIl19