ng-materialgrammi
Version:
An Angular framework which follows
175 lines • 27.2 kB
JavaScript
import { Component, Input, HostListener, Output, EventEmitter } from '@angular/core';
import { FormControl } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "../input/input.component";
import * as i2 from "@angular/common";
;
export class MuliselectComponent {
constructor(eRef) {
this.eRef = eRef;
this.theme = "primary";
this.title = "multi select title";
this.searchOpt = new FormControl('');
this.placeholder = "click here";
this.removeIcon = `<i class="fas fa-times"></i>`;
this.options = [{
name: "option 001",
value: "value of option 1"
}, {
name: "option 002",
value: "value of option 2"
}, {
name: "option 003",
value: "value of option 3"
}, {
name: "option 004",
value: "value of option 4"
}];
this.allowDuplicates = false;
this.deleteIcon = `<i class="fas fa-times"></i>`;
this.viewType = "option";
this.enableSearch = false;
this.data = new EventEmitter();
this.selectedValues = [];
this.selectedOptions = [];
this.openOptions = false;
this.highlighted = "";
}
ngOnInit() {
}
ngOnChanges() {
this.data.emit(this.selectedValues);
}
clickout(event) {
if (!this.eRef.nativeElement.contains(event.target)) {
this.searchOpt.setValue("");
this.openOptions = false;
}
}
handleKeyboardEvent(event) {
this.openOptions = false;
}
toggleOptions() {
this.openOptions = !this.openOptions;
}
closeOptions() {
this.openOptions = false;
}
valueFromOption(option) {
for (let op of this.options) {
if (op.name === option) {
return op.value;
}
}
return false;
}
removeOptions(opt) {
if (this.viewType === "option") {
let opValue = this.valueFromOption(opt);
if (opValue) {
this.selectedValues = this.selectedValues.filter((o) => {
return o !== opValue;
});
}
this.selectedOptions = this.selectedOptions.filter((o) => {
return o !== opt;
});
}
else {
this.selectedValues = this.selectedValues.filter((o) => {
return o !== opt;
});
}
this.data.emit(this.selectedValues);
}
selectValue(value, name) {
if ((!this.allowDuplicates && !this.selectedValues.includes(value)) || this.allowDuplicates) {
this.selectedValues.push(value);
this.selectedOptions.push(name);
}
this.closeOptions();
this.data.emit(this.selectedValues);
}
mainClasses() {
let classes = "";
classes += this.theme;
classes += this.openOptions ? " active" : "";
return classes;
}
searchFromOptions(val) {
let enterPressed = false;
if (val && val.code == "Enter" || val.key == "Enter") {
enterPressed = true;
}
val = val.target.value;
var opt = false;
for (let i = 0; i < this.options.length; i++) {
if (val.length > 0 && this.options && this.options[i] && this.options[i].name && this.options[i].name.indexOf(val) > 1) {
this.highlighted = this.options[i].name;
opt = this.options[i];
}
else if (val.length > 0 && this.options[i].value.indexOf(val) > 1) {
this.highlighted = this.options[i].name;
opt = this.options[i];
}
}
if (val.length < 1) {
this.highlighted = "";
}
if (enterPressed && this.highlighted.length > 0) {
this.searchOpt.setValue("");
this.selectValue(opt.value, opt.name);
}
}
inputTheme() {
if (["primary", "success", "danger", "dark", "info"].includes(this.theme)) {
return "lite";
}
else {
return "dark";
}
}
isHighlighted(name) {
if (this.highlighted == name) {
return "highlighted";
}
else {
return "";
}
}
}
MuliselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: MuliselectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
MuliselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: MuliselectComponent, selector: "mg-muliselect", inputs: { theme: "theme", title: "title", searchOpt: "searchOpt", placeholder: "placeholder", removeIcon: "removeIcon", options: "options", allowDuplicates: "allowDuplicates", deleteIcon: "deleteIcon", viewType: "viewType", enableSearch: "enableSearch" }, outputs: { data: "data" }, host: { listeners: { "document:click": "clickout($event)", "document:keydown.escape": "handleKeyboardEvent($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"multi-select-container\" [ngClass]=\"mainClasses()\">\n <div class=\"multi-select-title\" (click)=\"toggleOptions()\">\n <p [innerHtml]=\"title\"></p>\n </div>\n <div class=\"multi-select-selected\" (click)=\"toggleOptions()\">\n <div class=\"row\">\n <div class=\"col m11 l11 s10\">\n <ng-container *ngIf=\"viewType === 'option'\">\n <ng-container *ngFor=\"let opt of selectedOptions\">\n <div class=\"selected-pill\">\n <span [innerHtml]=\"opt\" class=\"selected-description\"></span>\n <span (click)=\"removeOptions(opt)\" class=\"selected-description\"\n [innerHtml]=\"removeIcon\"></span>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"viewType != 'option'\">\n <ng-container *ngFor=\"let opt of selectedValues\">\n <div class=\"selected-pill\">\n <span [innerHtml]=\"opt\" class=\"selected-description\"></span>\n <span (click)=\"removeOptions(opt)\" class=\"selected-description\"\n [innerHtml]=\"removeIcon\"></span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"selectedValues.length < 1\">\n <span [innerHtml]=\"placeholder\" class=\"pad-5\"></span>\n </ng-container>\n </div>\n <div class=\"col m1 l1 s2 text-right\">\n <i class=\"fas fa-angle-down\"></i>\n </div>\n </div>\n </div>\n <div class=\"multi-select-options\">\n <ng-container *ngIf=\"enableSearch\">\n <mg-input placeholder=\"search\" [theme]=\"inputTheme()\" (keyup)=\"searchFromOptions($event)\" [filled]=\"true\">\n </mg-input>\n </ng-container>\n <ng-container *ngFor=\"let opt of options\">\n <div class=\"multi-option\" [ngClass]=\"isHighlighted(opt.name)\" [innerHtml]=\"opt.name\" (click)=\"selectValue(opt.value, opt.name)\"></div>\n </ng-container>\n </div>\n</div>", styles: [""], components: [{ type: i1.InputComponent, selector: "mg-input", inputs: ["theme", "form", "placeholder", "control", "type", "dark", "class", "value", "rounded", "filled", "info"], outputs: ["data", "isFocused", "keyup"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: MuliselectComponent, decorators: [{
type: Component,
args: [{ selector: 'mg-muliselect', template: "<div class=\"multi-select-container\" [ngClass]=\"mainClasses()\">\n <div class=\"multi-select-title\" (click)=\"toggleOptions()\">\n <p [innerHtml]=\"title\"></p>\n </div>\n <div class=\"multi-select-selected\" (click)=\"toggleOptions()\">\n <div class=\"row\">\n <div class=\"col m11 l11 s10\">\n <ng-container *ngIf=\"viewType === 'option'\">\n <ng-container *ngFor=\"let opt of selectedOptions\">\n <div class=\"selected-pill\">\n <span [innerHtml]=\"opt\" class=\"selected-description\"></span>\n <span (click)=\"removeOptions(opt)\" class=\"selected-description\"\n [innerHtml]=\"removeIcon\"></span>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"viewType != 'option'\">\n <ng-container *ngFor=\"let opt of selectedValues\">\n <div class=\"selected-pill\">\n <span [innerHtml]=\"opt\" class=\"selected-description\"></span>\n <span (click)=\"removeOptions(opt)\" class=\"selected-description\"\n [innerHtml]=\"removeIcon\"></span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"selectedValues.length < 1\">\n <span [innerHtml]=\"placeholder\" class=\"pad-5\"></span>\n </ng-container>\n </div>\n <div class=\"col m1 l1 s2 text-right\">\n <i class=\"fas fa-angle-down\"></i>\n </div>\n </div>\n </div>\n <div class=\"multi-select-options\">\n <ng-container *ngIf=\"enableSearch\">\n <mg-input placeholder=\"search\" [theme]=\"inputTheme()\" (keyup)=\"searchFromOptions($event)\" [filled]=\"true\">\n </mg-input>\n </ng-container>\n <ng-container *ngFor=\"let opt of options\">\n <div class=\"multi-option\" [ngClass]=\"isHighlighted(opt.name)\" [innerHtml]=\"opt.name\" (click)=\"selectValue(opt.value, opt.name)\"></div>\n </ng-container>\n </div>\n</div>", styles: [""] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { theme: [{
type: Input
}], title: [{
type: Input
}], searchOpt: [{
type: Input
}], placeholder: [{
type: Input
}], removeIcon: [{
type: Input
}], options: [{
type: Input
}], allowDuplicates: [{
type: Input
}], deleteIcon: [{
type: Input
}], viewType: [{
type: Input
}], enableSearch: [{
type: Input
}], data: [{
type: Output
}], clickout: [{
type: HostListener,
args: ['document:click', ['$event']]
}], handleKeyboardEvent: [{
type: HostListener,
args: ['document:keydown.escape', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsaXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbGdyYW1taS9zcmMvbGliL2NvbXBvbmVudHMvbXVsaXNlbGVjdC9tdWxpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsZ3JhbW1pL3NyYy9saWIvY29tcG9uZW50cy9tdWxpc2VsZWN0L211bGlzZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsWUFBWSxFQUFjLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBSzVDLENBQUM7QUFPRixNQUFNLE9BQU8sbUJBQW1CO0lBOEI5QixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBN0IzQixVQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ2xCLFVBQUssR0FBRyxvQkFBb0IsQ0FBQztRQUM3QixjQUFTLEdBQWdCLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBQzNCLGVBQVUsR0FBRyw4QkFBOEIsQ0FBQztRQUM1QyxZQUFPLEdBQWtCLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxZQUFZO2dCQUNsQixLQUFLLEVBQUUsbUJBQW1CO2FBQzNCLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLEtBQUssRUFBRSxtQkFBbUI7YUFDM0IsRUFBRTtnQkFDRCxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsS0FBSyxFQUFFLG1CQUFtQjthQUMzQixFQUFFO2dCQUNELElBQUksRUFBRSxZQUFZO2dCQUNsQixLQUFLLEVBQUUsbUJBQW1CO2FBQzNCLENBQUMsQ0FBQztRQUNNLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyw4QkFBOEIsQ0FBQztRQUM1QyxhQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLG1CQUFjLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3VCLENBQUM7SUFFekMsUUFBUTtJQUNSLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFHRCxRQUFRLENBQUMsS0FBVTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFvQjtRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBR0QsYUFBYTtRQUNYLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFXO1FBQ3pCLEtBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQixJQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNyQixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDakI7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFRO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDOUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFHLE9BQU8sRUFBRTtnQkFDVixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQzFELE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDNUQsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBSztZQUNKLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDMUQsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFVLEVBQUUsSUFBUztRQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQzNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQU87UUFDdkIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFDO1lBQ2xELFlBQVksR0FBRyxJQUFJLENBQUM7U0FDckI7UUFDRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQU8sS0FBSyxDQUFDO1FBQ3BCLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFDO2dCQUNwSCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN4QyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2QjtpQkFBSyxJQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7Z0JBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Y7UUFDRCxJQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBRyxZQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDO1lBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQztZQUN2RSxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQUk7WUFDSCxPQUFPLE1BQU0sQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLElBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUM7WUFDMUIsT0FBTyxhQUFhLENBQUM7U0FDdEI7YUFBSTtZQUNILE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDOztnSEEvSVUsbUJBQW1CO29HQUFuQixtQkFBbUIsOGRDYmhDLDR3RUE0Q007MkZEL0JPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxlQUFlO2lHQUtoQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFhRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFnQlAsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVExQyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgbXVsdGlPcHRpb24ge1xuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmdcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21nLW11bGlzZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsaXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL211bGlzZWxlY3QuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE11bGlzZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRoZW1lID0gXCJwcmltYXJ5XCI7XG4gIEBJbnB1dCgpIHRpdGxlID0gXCJtdWx0aSBzZWxlY3QgdGl0bGVcIjtcbiAgQElucHV0KCkgc2VhcmNoT3B0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gXCJjbGljayBoZXJlXCI7XG4gIEBJbnB1dCgpIHJlbW92ZUljb24gPSBgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+YDtcbiAgQElucHV0KCkgb3B0aW9uczogbXVsdGlPcHRpb25bXSA9IFt7XG4gICAgbmFtZTogXCJvcHRpb24gMDAxXCIsXG4gICAgdmFsdWU6IFwidmFsdWUgb2Ygb3B0aW9uIDFcIlxuICB9LCB7XG4gICAgbmFtZTogXCJvcHRpb24gMDAyXCIsXG4gICAgdmFsdWU6IFwidmFsdWUgb2Ygb3B0aW9uIDJcIlxuICB9LCB7XG4gICAgbmFtZTogXCJvcHRpb24gMDAzXCIsXG4gICAgdmFsdWU6IFwidmFsdWUgb2Ygb3B0aW9uIDNcIlxuICB9LCB7XG4gICAgbmFtZTogXCJvcHRpb24gMDA0XCIsXG4gICAgdmFsdWU6IFwidmFsdWUgb2Ygb3B0aW9uIDRcIlxuICB9XTtcbiAgQElucHV0KCkgYWxsb3dEdXBsaWNhdGVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRlbGV0ZUljb24gPSBgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+YDtcbiAgQElucHV0KCkgdmlld1R5cGUgPSBcIm9wdGlvblwiO1xuICBASW5wdXQoKSBlbmFibGVTZWFyY2ggPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgZGF0YSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBzZWxlY3RlZFZhbHVlczogYW55ID0gW107XG4gIHNlbGVjdGVkT3B0aW9uczogYW55ID0gW107XG4gIG9wZW5PcHRpb25zID0gZmFsc2U7XG4gIGhpZ2hsaWdodGVkID0gXCJcIjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBjbGlja291dChldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmVSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLnNlYXJjaE9wdC5zZXRWYWx1ZShcIlwiKTtcbiAgICAgIHRoaXMub3Blbk9wdGlvbnMgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5vcGVuT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cblxuICB0b2dnbGVPcHRpb25zKCkge1xuICAgIHRoaXMub3Blbk9wdGlvbnMgPSAhdGhpcy5vcGVuT3B0aW9ucztcbiAgfVxuXG4gIGNsb3NlT3B0aW9ucygpIHtcbiAgICB0aGlzLm9wZW5PcHRpb25zID0gZmFsc2U7XG4gIH1cblxuICB2YWx1ZUZyb21PcHRpb24ob3B0aW9uOiBhbnkpe1xuICAgIGZvcihsZXQgb3Agb2YgdGhpcy5vcHRpb25zKSB7XG4gICAgICBpZihvcC5uYW1lID09PSBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZW1vdmVPcHRpb25zKG9wdDogYW55KSB7XG4gICAgaWYgKHRoaXMudmlld1R5cGUgPT09IFwib3B0aW9uXCIpIHsgXG4gICAgICBsZXQgb3BWYWx1ZSA9IHRoaXMudmFsdWVGcm9tT3B0aW9uKG9wdCk7XG4gICAgICBpZihvcFZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSB0aGlzLnNlbGVjdGVkVmFsdWVzLmZpbHRlcigobzogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG8gIT09IG9wVmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5maWx0ZXIoKG86IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gbyAhPT0gb3B0O1xuICAgICAgfSk7XG4gICAgfWVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKChvOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIG8gIT09IG9wdDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGEuZW1pdCh0aGlzLnNlbGVjdGVkVmFsdWVzKTtcbiAgfVxuXG4gIHNlbGVjdFZhbHVlKHZhbHVlOiBhbnksIG5hbWU6IGFueSkge1xuICAgIGlmICgoIXRoaXMuYWxsb3dEdXBsaWNhdGVzICYmICF0aGlzLnNlbGVjdGVkVmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkgfHwgdGhpcy5hbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlT3B0aW9ucygpXG4gICAgdGhpcy5kYXRhLmVtaXQodGhpcy5zZWxlY3RlZFZhbHVlcyk7XG4gIH1cblxuICBtYWluQ2xhc3NlcygpIHtcbiAgICBsZXQgY2xhc3NlcyA9IFwiXCI7XG4gICAgY2xhc3NlcyArPSB0aGlzLnRoZW1lO1xuICAgIGNsYXNzZXMgKz0gdGhpcy5vcGVuT3B0aW9ucyA/IFwiIGFjdGl2ZVwiIDogXCJcIjtcbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuXG4gIHNlYXJjaEZyb21PcHRpb25zKHZhbDphbnkpe1xuICAgIGxldCBlbnRlclByZXNzZWQgPSBmYWxzZTtcbiAgICBpZih2YWwgJiYgdmFsLmNvZGUgPT0gXCJFbnRlclwiIHx8IHZhbC5rZXkgPT0gXCJFbnRlclwiKXtcbiAgICAgIGVudGVyUHJlc3NlZCA9IHRydWU7XG4gICAgfVxuICAgIHZhbCA9IHZhbC50YXJnZXQudmFsdWU7XG4gICAgdmFyIG9wdDphbnkgPSBmYWxzZTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZih2YWwubGVuZ3RoID4gMCAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW2ldICYmIHRoaXMub3B0aW9uc1tpXS5uYW1lICYmIHRoaXMub3B0aW9uc1tpXS5uYW1lLmluZGV4T2YodmFsKSA+IDEpe1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XG4gICAgICAgIG9wdCA9IHRoaXMub3B0aW9uc1tpXTtcbiAgICAgIH1lbHNlIGlmKHZhbC5sZW5ndGggPiAwICYmIHRoaXMub3B0aW9uc1tpXS52YWx1ZS5pbmRleE9mKHZhbCkgPiAxKXtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZCA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xuICAgICAgICBvcHQgPSB0aGlzLm9wdGlvbnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmKHZhbC5sZW5ndGggPCAxKXtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWQgPSBcIlwiO1xuICAgIH1cbiAgICBpZihlbnRlclByZXNzZWQgJiYgdGhpcy5oaWdobGlnaHRlZC5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuc2VhcmNoT3B0LnNldFZhbHVlKFwiXCIpO1xuICAgICAgdGhpcy5zZWxlY3RWYWx1ZShvcHQudmFsdWUsIG9wdC5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBpbnB1dFRoZW1lKCl7XG4gICAgaWYoW1wicHJpbWFyeVwiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIiwgXCJkYXJrXCIsIFwiaW5mb1wiXS5pbmNsdWRlcyh0aGlzLnRoZW1lKSl7XG4gICAgICByZXR1cm4gXCJsaXRlXCI7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gXCJkYXJrXCI7XG4gICAgfVxuICB9XG5cbiAgaXNIaWdobGlnaHRlZChuYW1lOiBzdHJpbmcpe1xuICAgIGlmKHRoaXMuaGlnaGxpZ2h0ZWQgPT0gbmFtZSl7XG4gICAgICByZXR1cm4gXCJoaWdobGlnaHRlZFwiO1xuICAgIH1lbHNle1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyXCIgW25nQ2xhc3NdPVwibWFpbkNsYXNzZXMoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtdGl0bGVcIiAoY2xpY2spPVwidG9nZ2xlT3B0aW9ucygpXCI+XG4gICAgICAgIDxwIFtpbm5lckh0bWxdPVwidGl0bGVcIj48L3A+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1zZWxlY3RlZFwiIChjbGljayk9XCJ0b2dnbGVPcHRpb25zKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBtMTEgbDExIHMxMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3VHlwZSA9PT0gJ29wdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0IG9mIHNlbGVjdGVkT3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm9wdFwiIGNsYXNzPVwic2VsZWN0ZWQtZGVzY3JpcHRpb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZU9wdGlvbnMob3B0KVwiIGNsYXNzPVwic2VsZWN0ZWQtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cInJlbW92ZUljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdUeXBlICE9ICdvcHRpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdCBvZiBzZWxlY3RlZFZhbHVlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm9wdFwiIGNsYXNzPVwic2VsZWN0ZWQtZGVzY3JpcHRpb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZU9wdGlvbnMob3B0KVwiIGNsYXNzPVwic2VsZWN0ZWQtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cInJlbW92ZUljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRWYWx1ZXMubGVuZ3RoIDwgMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cInBsYWNlaG9sZGVyXCIgY2xhc3M9XCJwYWQtNVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBtMSBsMSBzMiB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtZG93blwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LW9wdGlvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVuYWJsZVNlYXJjaFwiPlxuICAgICAgICAgICAgPG1nLWlucHV0IHBsYWNlaG9sZGVyPVwic2VhcmNoXCIgW3RoZW1lXT1cImlucHV0VGhlbWUoKVwiIChrZXl1cCk9XCJzZWFyY2hGcm9tT3B0aW9ucygkZXZlbnQpXCIgW2ZpbGxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICA8L21nLWlucHV0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0IG9mIG9wdGlvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1vcHRpb25cIiBbbmdDbGFzc109XCJpc0hpZ2hsaWdodGVkKG9wdC5uYW1lKVwiIFtpbm5lckh0bWxdPVwib3B0Lm5hbWVcIiAoY2xpY2spPVwic2VsZWN0VmFsdWUob3B0LnZhbHVlLCBvcHQubmFtZSlcIj48L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=