ngx-mat-dynamic-form-builder
Version:
Build dynamic forms in Angular Material using Reactive forms.
149 lines • 21.2 kB
JavaScript
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
import { FormControl, Validators } from '@angular/forms';
import { map, startWith } from 'rxjs/operators';
import { isString } from 'lodash';
export class ChipSelectorComponent {
constructor() {
this.options = [];
this.hint = "";
this.appearance = 'standard';
this.disabled = false;
this.customChip = false;
this.output = new EventEmitter();
this.visible = true;
this.selectable = true;
this.separatorKeysCodes = [ENTER, COMMA];
this.selectedObjects = [];
}
ngOnInit() {
this.setupValidators();
}
ngOnChanges(changes) {
if (changes.options && this.options) {
if (!this.formControl)
this.setupValidators();
this.filteredObjects = this.formControl.valueChanges.pipe(startWith([]), map((obj) => {
return obj ? this._filter(obj) : this.options.slice();
}));
if (this.defaultOptions && this.defaultOptionsKey) {
this.addDefaultSelected(this.defaultOptions);
}
}
}
setupValidators() {
if (this.formControl)
return;
if (this.validators) {
let isRequired = false;
this.validators.forEach(vd => {
if (vd.name === 'required')
isRequired = true;
});
if (isRequired) {
this.formControl = new FormControl(this.selectedObjects, [Validators.required, this.valueSelected()]);
}
else {
this.formControl = new FormControl(this.selectedObjects, [this.valueSelected()]);
}
}
else if (!this.customChip) {
this.formControl = new FormControl(this.selectedObjects, [this.valueSelected()]);
}
else {
this.formControl = new FormControl();
}
}
add(event) {
// Add fruit only when MatAutocomplete is not open
// To make sure this does not conflict with OptionSelected Event
if (!this.matAutocomplete.isOpen) {
const input = event.input;
const value = event.value;
if (this.customChip && (value || '').trim()) {
this.selectedObjects.push({ [this.displayKey]: value.trim() });
this.output.emit(this.selectedObjects);
}
// Reset the input value
if (input) {
input.value = '';
}
}
this.formControl.setValue(this.selectedObjects);
this.formControl.updateValueAndValidity();
}
remove(item) {
this.updateFilteredObjects();
const index = this.selectedObjects.indexOf(item);
if (index >= 0) {
this.selectedObjects.splice(index, 1);
this.output.emit(this.selectedObjects);
}
this.formControl.updateValueAndValidity();
}
updateFilteredObjects() {
this.filteredObjects = this.filteredObjects.pipe(map(data => data.filter(obj => !this.selectedObjects.includes(obj))));
}
selected(event) {
this.selectedObjects.push(event.option.value);
this.output.emit(this.selectedObjects);
this.updateFilteredObjects();
this.formInput.nativeElement.value = '';
this.formInput.nativeElement.blur();
this.formControl.setValue(this.selectedObjects);
}
addDefaultSelected(values) {
if (!Array.isArray(values)) {
console.error('Default values not an array');
return;
}
this.selectedObjects = this.options.filter(i => values.some(t => t === i[this.defaultOptionsKey]));
this.output.emit(this.selectedObjects);
this.updateFilteredObjects();
this.formControl.setValue(this.selectedObjects);
}
_filter(value) {
if (isString(value) && value.length >= 1) {
let filterValue = value.toLowerCase();
return this.options.filter(obj => obj[this.filterKey ? this.filterKey : this.displayKey].
toLowerCase().includes(filterValue));
}
return this.options;
}
valueSelected() {
return (c) => {
// if value is set and it is not an object, valid option not selected
if (c.value && typeof c.value !== 'object') {
return { match: true };
}
else {
return null;
}
};
}
}
ChipSelectorComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-mat-chip-selector',
template: "<mat-form-field [appearance]=\"appearance\" fxFlex>\r\n <mat-label>{{label}}</mat-label>\r\n <mat-chip-list #chipList>\r\n <mat-chip *ngFor=\"let obj of selectedObjects\" [selectable]=\"selectable\" [removable]=\"!disabled\"\r\n (removed)=\"remove(obj)\">\r\n {{obj[displayKey]}}\r\n <mat-icon matChipRemove *ngIf=\"!disabled\">cancel</mat-icon>\r\n </mat-chip>\r\n <input [placeholder]=\"placeholder\" [readonly]=\"disabled\" #formInput [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\" [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n (matChipInputTokenEnd)=\"add($event)\" [formControl]=\"formControl\">\r\n <mat-error *ngIf=\"!formControl.valid && formControl.touched\">Select valid option</mat-error>\r\n </mat-chip-list>\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n <mat-option *ngFor=\"let obj of filteredObjects | async\" [value]=\"obj\">\r\n {{obj[displayKey]}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-hint>{{hint}} </mat-hint>\r\n</mat-form-field>",
styles: [""]
},] }
];
ChipSelectorComponent.propDecorators = {
options: [{ type: Input }],
defaultOptions: [{ type: Input }],
defaultOptionsKey: [{ type: Input }],
label: [{ type: Input }],
placeholder: [{ type: Input }],
displayKey: [{ type: Input }],
filterKey: [{ type: Input }],
hint: [{ type: Input }],
appearance: [{ type: Input }],
disabled: [{ type: Input }],
customChip: [{ type: Input }],
validators: [{ type: Input }],
output: [{ type: Output }],
formInput: [{ type: ViewChild, args: ['formInput',] }],
matAutocomplete: [{ type: ViewChild, args: ['auto',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0LWR5bmFtaWMtZm9ybS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jaGlwLXNlbGVjdG9yL2NoaXAtc2VsZWN0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBYyxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxXQUFXLEVBQWUsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBSXZGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQU9sQyxNQUFNLE9BQU8scUJBQXFCO0lBTGxDO1FBT1csWUFBTyxHQUFVLEVBQUUsQ0FBQztRQVNwQixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGVBQVUsR0FBVyxVQUFVLENBQUM7UUFDaEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBSTNCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBTzdDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHVCQUFrQixHQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRzlDLG9CQUFlLEdBQVUsRUFBRSxDQUFDO0lBK0g5QixDQUFDO0lBN0hDLFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDdkQsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUNiLEdBQUcsQ0FBQyxDQUFDLEdBQWtCLEVBQUUsRUFBRTtnQkFDekIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDdkQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDOUM7U0FDRjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsV0FBVztZQUNsQixPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFVBQVU7b0JBQ3hCLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDdkc7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNsRjtTQUNGO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUF3QjtRQUMxQixrREFBa0Q7UUFDbEQsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN4QztZQUVELHdCQUF3QjtZQUN4QixJQUFJLEtBQUssRUFBRTtnQkFDVCxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUNsQjtTQUNGO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUN4QztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUU1QyxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNULElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3hELENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRCxRQUFRLENBQUMsS0FBbUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQWE7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzdDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQWE7UUFDM0IsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDeEMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXRDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDdEYsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxDQUFDLENBQWtCLEVBQXFDLEVBQUU7WUFDL0QscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUM7SUFDSixDQUFDOzs7WUFqS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLDhrQ0FBNkM7O2FBRTlDOzs7c0JBR0UsS0FBSzs2QkFFTCxLQUFLO2dDQUNMLEtBQUs7b0JBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7d0JBRUwsS0FBSzttQkFDTCxLQUFLO3lCQUNMLEtBQUs7dUJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUVMLEtBQUs7cUJBRUwsTUFBTTt3QkFJTixTQUFTLFNBQUMsV0FBVzs4QkFDckIsU0FBUyxTQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1hdC1jaGlwLXNlbGVjdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hpcC1zZWxlY3Rvci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENoaXBTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcclxuICAvLyBEZWZhdWx0IHNlbGVjdGVkIG9wdGlvbnMgKGFycmF5IG9mIHNlbGVjdGlvbiBrZXlzKVxyXG4gIEBJbnB1dCgpIGRlZmF1bHRPcHRpb25zOiBhbnlbXTtcclxuICBASW5wdXQoKSBkZWZhdWx0T3B0aW9uc0tleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5S2V5OiBzdHJpbmc7XHJcbiAgLy8gSWYgZmlsdGVyS2V5IG5vdCBzcGVjaWZpZWQgZGVmYXVsdHMgdG8gZGlzcGxheUtleSB2YWx1ZVxyXG4gIEBJbnB1dCgpIGZpbHRlcktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhpbnQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogc3RyaW5nID0gJ3N0YW5kYXJkJztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoaXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXTtcclxuXHJcbiAgQE91dHB1dCgpIG91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcblxyXG4gIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlucHV0JykgZm9ybUlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2F1dG8nKSBtYXRBdXRvY29tcGxldGU6IE1hdEF1dG9jb21wbGV0ZTtcclxuXHJcbiAgdmlzaWJsZSA9IHRydWU7XHJcbiAgc2VsZWN0YWJsZSA9IHRydWU7XHJcbiAgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUFdO1xyXG5cclxuICBmaWx0ZXJlZE9iamVjdHM6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIHNlbGVjdGVkT2JqZWN0czogYW55W10gPSBbXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldHVwVmFsaWRhdG9ycygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMpIHtcclxuICAgICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKVxyXG4gICAgICAgIHRoaXMuc2V0dXBWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcclxuICAgICAgICBtYXAoKG9iajogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIG9iaiA/IHRoaXMuX2ZpbHRlcihvYmopIDogdGhpcy5vcHRpb25zLnNsaWNlKClcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGhpcy5kZWZhdWx0T3B0aW9ucyAmJiB0aGlzLmRlZmF1bHRPcHRpb25zS2V5KSB7XHJcbiAgICAgICAgdGhpcy5hZGREZWZhdWx0U2VsZWN0ZWQodGhpcy5kZWZhdWx0T3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldHVwVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBpZiAodGhpcy52YWxpZGF0b3JzKSB7XHJcbiAgICAgIGxldCBpc1JlcXVpcmVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudmFsaWRhdG9ycy5mb3JFYWNoKHZkID0+IHtcclxuICAgICAgICBpZiAodmQubmFtZSA9PT0gJ3JlcXVpcmVkJylcclxuICAgICAgICAgIGlzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VsZWN0ZWRPYmplY3RzLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy52YWx1ZVNlbGVjdGVkKCldKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VsZWN0ZWRPYmplY3RzLCBbdGhpcy52YWx1ZVNlbGVjdGVkKCldKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICghdGhpcy5jdXN0b21DaGlwKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5zZWxlY3RlZE9iamVjdHMsIFt0aGlzLnZhbHVlU2VsZWN0ZWQoKV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gQWRkIGZydWl0IG9ubHkgd2hlbiBNYXRBdXRvY29tcGxldGUgaXMgbm90IG9wZW5cclxuICAgIC8vIFRvIG1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggT3B0aW9uU2VsZWN0ZWQgRXZlbnRcclxuICAgIGlmICghdGhpcy5tYXRBdXRvY29tcGxldGUuaXNPcGVuKSB7XHJcbiAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQuaW5wdXQ7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jdXN0b21DaGlwICYmICh2YWx1ZSB8fCAnJykudHJpbSgpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMucHVzaCh7IFt0aGlzLmRpc3BsYXlLZXldOiB2YWx1ZS50cmltKCkgfSk7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlc2V0IHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRPYmplY3RzKTtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGl0ZW06IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJlZE9iamVjdHMoKTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRPYmplY3RzLmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVGaWx0ZXJlZE9iamVjdHMoKSB7XHJcbiAgICB0aGlzLmZpbHRlcmVkT2JqZWN0cyA9IHRoaXMuZmlsdGVyZWRPYmplY3RzLnBpcGUoXHJcbiAgICAgIG1hcChkYXRhID0+XHJcbiAgICAgICAgZGF0YS5maWx0ZXIob2JqID0+ICF0aGlzLnNlbGVjdGVkT2JqZWN0cy5pbmNsdWRlcyhvYmopKVxyXG4gICAgICApXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdHMucHVzaChldmVudC5vcHRpb24udmFsdWUpO1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJlZE9iamVjdHMoKTtcclxuICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIHRoaXMuZm9ybUlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBhZGREZWZhdWx0U2VsZWN0ZWQodmFsdWVzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRGVmYXVsdCB2YWx1ZXMgbm90IGFuIGFycmF5Jyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzID0gdGhpcy5vcHRpb25zLmZpbHRlcihpID0+IHZhbHVlcy5zb21lKHQgPT4gdCA9PT0gaVt0aGlzLmRlZmF1bHRPcHRpb25zS2V5XSkpO1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdCh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkT2JqZWN0cygpO1xyXG4gICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID49IDEpIHtcclxuICAgICAgbGV0IGZpbHRlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG9iaiA9PiBvYmpbdGhpcy5maWx0ZXJLZXkgPyB0aGlzLmZpbHRlcktleSA6IHRoaXMuZGlzcGxheUtleV0uXHJcbiAgICAgICAgdG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsdWVTZWxlY3RlZCgpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICByZXR1cm4gKGM6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCA9PiB7XHJcbiAgICAgIC8vIGlmIHZhbHVlIGlzIHNldCBhbmQgaXQgaXMgbm90IGFuIG9iamVjdCwgdmFsaWQgb3B0aW9uIG5vdCBzZWxlY3RlZFxyXG4gICAgICBpZiAoYy52YWx1ZSAmJiB0eXBlb2YgYy52YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4geyBtYXRjaDogdHJ1ZSB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=