@acrodata/gui 0.5.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -14
- package/button-toggle/button-toggle.d.ts +1 -1
- package/button-toggle/button-toggle.scss +1 -0
- package/button-toggle/icon.d.ts +1 -1
- package/esm2022/button-toggle/button-toggle.mjs +23 -15
- package/esm2022/button-toggle/icon.mjs +16 -11
- package/esm2022/field-group/field-group.mjs +7 -8
- package/esm2022/field-label/field-label.mjs +6 -7
- package/esm2022/file-uploader/file-uploader-config.mjs +9 -6
- package/esm2022/file-uploader/file-uploader.mjs +27 -15
- package/esm2022/fill/fill.mjs +25 -14
- package/esm2022/gui-form.mjs +57 -29
- package/esm2022/gui-icons.mjs +40 -10
- package/esm2022/gui-module.mjs +35 -35
- package/esm2022/gui-utils.mjs +10 -8
- package/esm2022/image-select/image-select.mjs +23 -14
- package/esm2022/inline-group/inline-group.mjs +6 -7
- package/esm2022/input-number/input-number.mjs +21 -13
- package/esm2022/input-text/input-text.mjs +21 -13
- package/esm2022/public-api.mjs +2 -1
- package/esm2022/select/select.mjs +23 -14
- package/esm2022/slider/slider.mjs +25 -14
- package/esm2022/switch/switch.mjs +12 -13
- package/esm2022/textarea/textarea.mjs +21 -13
- package/fesm2022/acrodata-gui.mjs +592 -443
- package/fesm2022/acrodata-gui.mjs.map +1 -1
- package/field-group/field-group.d.ts +1 -1
- package/field-label/field-label.d.ts +1 -1
- package/file-uploader/file-uploader.d.ts +4 -3
- package/fill/fill.d.ts +1 -1
- package/gui-form.d.ts +3 -1
- package/gui-form.scss +1 -2
- package/gui-icons.d.ts +28 -1
- package/gui-module.d.ts +32 -35
- package/gui-utils.d.ts +2 -2
- package/image-select/image-select.d.ts +1 -1
- package/image-select/image-select.scss +2 -0
- package/inline-group/inline-group.d.ts +1 -1
- package/input-number/input-number.d.ts +1 -1
- package/input-text/input-text.d.ts +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +1 -0
- package/select/select.d.ts +1 -1
- package/slider/slider.d.ts +1 -1
- package/switch/switch.d.ts +1 -1
- package/switch/switch.scss +7 -7
- package/textarea/textarea.d.ts +1 -1
package/esm2022/gui-form.mjs
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
1
2
|
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
2
|
-
import { FormArray, FormControl, FormGroup } from '@angular/forms';
|
|
3
|
+
import { FormArray, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { MatIconButton } from '@angular/material/button';
|
|
5
|
+
import { MatExpansionPanel, MatExpansionPanelContent, MatExpansionPanelHeader, } from '@angular/material/expansion';
|
|
6
|
+
import { MatIcon } from '@angular/material/icon';
|
|
7
|
+
import { MatTab, MatTabContent, MatTabGroup, MatTabLabel } from '@angular/material/tabs';
|
|
3
8
|
import { Subscription, mergeWith, of } from 'rxjs';
|
|
4
|
-
import {
|
|
9
|
+
import { GuiButtonToggle } from './button-toggle/button-toggle';
|
|
10
|
+
import { GuiFieldGroup } from './field-group/field-group';
|
|
11
|
+
import { GuiFieldLabel } from './field-label/field-label';
|
|
12
|
+
import { GuiFileUploader } from './file-uploader/file-uploader';
|
|
13
|
+
import { GuiFill } from './fill/fill';
|
|
14
|
+
import { GuiEjsPipe, GuiFlexDirective, compareValues, getValueByPath } from './gui-utils';
|
|
15
|
+
import { GuiImageSelect } from './image-select/image-select';
|
|
16
|
+
import { GuiInlineGroup } from './inline-group/inline-group';
|
|
17
|
+
import { GuiInputNumber } from './input-number/input-number';
|
|
18
|
+
import { GuiInputText } from './input-text/input-text';
|
|
19
|
+
import { GuiSelect } from './select/select';
|
|
20
|
+
import { GuiSlider } from './slider/slider';
|
|
21
|
+
import { GuiSwitch } from './switch/switch';
|
|
22
|
+
import { GuiTextarea } from './textarea/textarea';
|
|
5
23
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "
|
|
24
|
+
import * as i1 from "./gui-icons";
|
|
7
25
|
import * as i2 from "@angular/forms";
|
|
8
|
-
import * as i3 from "@angular/material/icon";
|
|
9
|
-
import * as i4 from "@angular/material/button";
|
|
10
|
-
import * as i5 from "@angular/material/tabs";
|
|
11
|
-
import * as i6 from "@angular/material/expansion";
|
|
12
|
-
import * as i7 from "./input-text/input-text";
|
|
13
|
-
import * as i8 from "./input-number/input-number";
|
|
14
|
-
import * as i9 from "./select/select";
|
|
15
|
-
import * as i10 from "./switch/switch";
|
|
16
|
-
import * as i11 from "./slider/slider";
|
|
17
|
-
import * as i12 from "./button-toggle/button-toggle";
|
|
18
|
-
import * as i13 from "./fill/fill";
|
|
19
|
-
import * as i14 from "./field-group/field-group";
|
|
20
|
-
import * as i15 from "./field-label/field-label";
|
|
21
|
-
import * as i16 from "./inline-group/inline-group";
|
|
22
|
-
import * as i17 from "./image-select/image-select";
|
|
23
|
-
import * as i18 from "./textarea/textarea";
|
|
24
|
-
import * as i19 from "./file-uploader/file-uploader";
|
|
25
|
-
import * as i20 from "./gui-utils";
|
|
26
26
|
let nextUniqueId = 0;
|
|
27
27
|
export class GuiForm {
|
|
28
|
-
constructor() {
|
|
28
|
+
constructor(iconsRegistry) {
|
|
29
29
|
/**
|
|
30
30
|
* The form instance which allow to track model value and validation status.
|
|
31
31
|
*/
|
|
@@ -47,6 +47,7 @@ export class GuiForm {
|
|
|
47
47
|
this.controlSubscriptions = [];
|
|
48
48
|
// Unique id for this form
|
|
49
49
|
this.uid = `gui-form-${nextUniqueId++}`;
|
|
50
|
+
iconsRegistry.add('horizontal', 'vertical', 'copy', 'add', 'delete');
|
|
50
51
|
}
|
|
51
52
|
ngOnChanges(changes) {
|
|
52
53
|
if (changes['config']) {
|
|
@@ -92,7 +93,7 @@ export class GuiForm {
|
|
|
92
93
|
parentType,
|
|
93
94
|
model: model[key],
|
|
94
95
|
default: defaultValue?.[key],
|
|
95
|
-
index: Number(key),
|
|
96
|
+
index: Number(key), // the string key will be `NaN`
|
|
96
97
|
show: true,
|
|
97
98
|
...config[key],
|
|
98
99
|
};
|
|
@@ -249,16 +250,43 @@ export class GuiForm {
|
|
|
249
250
|
e.stopPropagation();
|
|
250
251
|
tabs.mode = mode;
|
|
251
252
|
}
|
|
252
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
253
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.8", type: GuiForm, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { properties: { "attr.id": "uid" }, classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container *ngIf=\"item.show\" [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"dots_horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"dots_vertical\" />\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"content_copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"plus\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"content_copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"plus\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;position:relative;display:block;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-icon-button .mat-icon{display:inline-flex;justify-content:center;align-items:center}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i5.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i5.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i5.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i5.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i6.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i6.MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: i7.GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: i8.GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: i9.GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: i10.GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: i11.GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: i12.GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: i13.GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: i14.GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "component", type: i15.GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: i16.GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: i17.GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: i18.GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: i19.GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "directive", type: i20.GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "pipe", type: i20.GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
253
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: GuiForm, deps: [{ token: i1.GuiIconsRegistry }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
254
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.6", type: GuiForm, isStandalone: true, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { properties: { "attr.id": "uid" }, classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:12px}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-icon-button .mat-icon{display:inline-flex;justify-content:center;align-items:center}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "directive", type: MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "directive", type: GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "component", type: GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "component", type: GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
254
255
|
}
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: GuiForm, decorators: [{
|
|
256
257
|
type: Component,
|
|
257
258
|
args: [{ selector: 'gui-form', host: {
|
|
258
259
|
'[attr.id]': 'uid',
|
|
259
260
|
'class': 'gui-form',
|
|
260
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\">\n <div *ngFor=\"let item of formFields\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n <ng-container *ngIf=\"item.show\" [ngSwitch]=\"item.type\" [formGroup]=\"form\">\n <!-- Text -->\n <gui-field-group *ngSwitchCase=\"'text'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Number -->\n <gui-field-group *ngSwitchCase=\"'number'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Select -->\n <gui-field-group *ngSwitchCase=\"'select'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Switch -->\n <gui-field-group *ngSwitchCase=\"'switch'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Slider -->\n <gui-field-group *ngSwitchCase=\"'slider'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Button Toggle -->\n <gui-field-group *ngSwitchCase=\"'buttonToggle'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Fill -->\n <gui-field-group *ngSwitchCase=\"'fill'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- File -->\n <gui-field-group *ngSwitchCase=\"'file'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Image -->\n <gui-field-group *ngSwitchCase=\"'image'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Video -->\n <gui-field-group *ngSwitchCase=\"'video'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Audio -->\n <gui-field-group *ngSwitchCase=\"'audio'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Image Select -->\n <gui-field-group *ngSwitchCase=\"'imageSelect'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n <!-- Textarea -->\n <gui-field-group *ngSwitchCase=\"'textarea'\" [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n <!-- Hidden Input -->\n <input *ngSwitchCase=\"'hidden'\" type=\"hidden\" [formControlName]=\"item.key\">\n\n <!-- Inline Group -->\n <gui-inline-group *ngSwitchCase=\"'inline'\" [config]=\"item\" [formGroupName]=\"item.key\">\n <ng-container *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </gui-inline-group>\n\n <!-- Group -->\n <mat-expansion-panel *ngSwitchCase=\"'group'\" [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <div *ngFor=\"let child of item.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Tabs -->\n <mat-expansion-panel *ngSwitchCase=\"'tabs'\" [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n <ng-container *ngIf=\"item.expanded\">\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"dots_horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"dots_vertical\" />\n </button>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"content_copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"plus\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </ng-container>\n </ng-container>\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n <!-- Horizontal mode -->\n <mat-tab-group *ngIf=\"item.mode!=='list'\" class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n <mat-tab *ngFor=\"let tab of item.children; index as i\" [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </mat-tab>\n </mat-tab-group>\n\n <!-- Vertical mode -->\n <div class=\"gui-list\" *ngIf=\"item.mode==='list'\">\n <div class=\"gui-list-item\" *ngFor=\"let tab of item.children; index as i\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n <ng-container *ngIf=\"item.template && (item.addable || item.addable===undefined)\">\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"content_copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"plus\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </ng-container>\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n <ng-container *ngIf=\"!tab.children || tab.children.length===0 || tab.type==='tabs'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n </ng-container>\n <!-- FormGroup -->\n <ng-container *ngIf=\"tab.children?.length>0 && tab.type!=='tabs'\">\n <div *ngFor=\"let child of tab.children\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-template>\n </mat-expansion-panel>\n\n <!-- Menu -->\n <mat-tab-group class=\"gui-menu\" *ngSwitchCase=\"'menu'\" [formGroupName]=\"item.key\" disableRipple>\n <mat-tab *ngFor=\"let menuChild of item.children\" [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n <ng-container *ngIf=\"menuChild.type==='menuItem'\">\n <!-- Must wrap with div -->\n <div *ngFor=\"let controlItem of menuChild.children\" [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n </ng-container>\n <!-- Support for unlimited nesting -->\n <ng-container *ngIf=\"menuChild.type==='menu'\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n </ng-container>\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n\n </ng-container>\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;position:relative;display:block;font-size:12px}.gui-form .mat-expansion-panel{--mat-expansion-container-shape: 0;box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-icon-button .mat-icon{display:inline-flex;justify-content:center;align-items:center}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
|
|
261
|
-
|
|
261
|
+
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
262
|
+
ReactiveFormsModule,
|
|
263
|
+
NgTemplateOutlet,
|
|
264
|
+
MatExpansionPanel,
|
|
265
|
+
MatExpansionPanelHeader,
|
|
266
|
+
MatExpansionPanelContent,
|
|
267
|
+
MatIconButton,
|
|
268
|
+
MatIcon,
|
|
269
|
+
MatTabGroup,
|
|
270
|
+
MatTab,
|
|
271
|
+
MatTabLabel,
|
|
272
|
+
MatTabContent,
|
|
273
|
+
GuiFieldGroup,
|
|
274
|
+
GuiFlexDirective,
|
|
275
|
+
GuiInputText,
|
|
276
|
+
GuiInputNumber,
|
|
277
|
+
GuiSelect,
|
|
278
|
+
GuiSwitch,
|
|
279
|
+
GuiSlider,
|
|
280
|
+
GuiButtonToggle,
|
|
281
|
+
GuiFill,
|
|
282
|
+
GuiFileUploader,
|
|
283
|
+
GuiImageSelect,
|
|
284
|
+
GuiTextarea,
|
|
285
|
+
GuiInlineGroup,
|
|
286
|
+
GuiFieldLabel,
|
|
287
|
+
GuiEjsPipe,
|
|
288
|
+
], template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: 12px;--mat-expansion-container-text-size: 12px;--mat-expansion-header-collapsed-state-height: 32px;--mat-expansion-header-expanded-state-height: 32px;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:12px}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 12px}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:8px}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:8px}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator:after{vertical-align:2px}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: 12px;--mdc-secondary-navigation-tab-container-height: 24px}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 12px}.gui-form .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 24px;--mdc-icon-button-icon-size: 14px;padding:0}.gui-form .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-form .mat-mdc-icon-button .mat-icon{display:inline-flex;justify-content:center;align-items:center}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 12px;line-height:24px}.gui-list-item-heading:before{position:absolute;left:0;width:2px;height:16px;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: 4px;padding:4px;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:4px}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;border-width:0;border-radius:var(--mdc-tab-indicator-active-indicator-shape);background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
|
|
289
|
+
}], ctorParameters: () => [{ type: i1.GuiIconsRegistry }], propDecorators: { form: [{
|
|
262
290
|
type: Input
|
|
263
291
|
}], config: [{
|
|
264
292
|
type: Input
|
|
@@ -267,4 +295,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.8", ngImpor
|
|
|
267
295
|
}], modelChange: [{
|
|
268
296
|
type: Output
|
|
269
297
|
}] } });
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRzVELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQWFyQixNQUFNLE9BQU8sT0FBTztJQVhwQjtRQVlFOztXQUVHO1FBQ00sU0FBSSxHQUFHLElBQUksU0FBUyxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXZDOztXQUVHO1FBQ00sV0FBTSxHQUFjLEVBQUUsQ0FBQztRQUVoQzs7V0FFRztRQUNNLFVBQUssR0FBUSxFQUFFLENBQUM7UUFFekI7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0MsZUFBVSxHQUFpQixFQUFFLENBQUM7UUFFOUIscUJBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUV0Qyx5QkFBb0IsR0FBbUIsRUFBRSxDQUFDO1FBRTFDLDBCQUEwQjtRQUMxQixRQUFHLEdBQUcsWUFBWSxZQUFZLEVBQUUsRUFBRSxDQUFDO0tBc1BwQztJQXBQQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7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QUMsb0JBQW9CO2FBQ25EO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYyxDQUFDLENBQWEsRUFBRSxJQUFnQixFQUFFLElBQWtCO1FBQ2hFLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDOzhHQWpSVSxPQUFPO2tHQUFQLE9BQU8sa1BDOUJwQixpN1ZBdU5BOzsyRkR6TGEsT0FBTztrQkFYbkIsU0FBUzsrQkFDRSxVQUFVLFFBR2Q7d0JBQ0osV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLE9BQU8sRUFBRSxVQUFVO3FCQUNwQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQU10QyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIG1lcmdlV2l0aCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbXBhcmVWYWx1ZXMsIGdldFZhbHVlQnlQYXRoIH0gZnJvbSAnLi9ndWktdXRpbHMnO1xuaW1wb3J0IHsgR3VpQ29uZGl0aW9uLCBHdWlDb250cm9sLCBHdWlGaWVsZFR5cGUsIEd1aUZpZWxkcywgR3VpVGFic01vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdndWktZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWktZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ3VpLWZvcm0uc2NzcyddLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICd1aWQnLFxuICAgICdjbGFzcyc6ICdndWktZm9ybScsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlGb3JtIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBpbnN0YW5jZSB3aGljaCBhbGxvdyB0byB0cmFjayBtb2RlbCB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMuXG4gICAqL1xuICBASW5wdXQoKSBmb3JtID0gbmV3IEZvcm1Hcm91cDxhbnk+KHt9KTtcblxuICAvKipcbiAgICogVGhlIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBidWlsZGluZyB0aGUgZm9ybS5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogR3VpRmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byBiZSByZXByZXNlbnRlZCBieSB0aGUgZm9ybS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGVsOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogRmlyZWQgb24gbW9kZWwgdmFsdWUgY2hhbmdlXG4gICAqL1xuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZm9ybUZpZWxkczogR3VpQ29udHJvbFtdID0gW107XG5cbiAgZm9ybVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBjb250cm9sU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgZm9ybVxuICB1aWQgPSBgZ3VpLWZvcm0tJHtuZXh0VW5pcXVlSWQrK31gO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scyA9IHt9OyAvLyByZXNldCBjb250cm9sc1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheSh0aGlzLmZvcm0sIHRoaXMuY29uZmlnLCB0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSAmJiB0aGlzLm1vZGVsICYmIE9iamVjdC5rZXlzKHRoaXMubW9kZWwpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbCwgdmFsdWUpO1xuICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgb2JqZWN0IGNvbmZpZyB0byBhcnJheSBjb25maWcgYW5kIHJlZ2lzdGVyIGludG8gdGhlIHJlYWN0aXZlIGZvcm0uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtICAgICAgICAgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbmZpZyAgICAgICBUaGUgY29uZmlnIG9mIHRoZSBmb3JtIGZpZWxkc1xuICAgKiBAcGFyYW0gbW9kZWwgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICogQHBhcmFtIHBhcmVudFR5cGUgICBUaGUgdHlwZSBvZiB0aGUgZm9ybSBmaWVsZCBwYXJlbnRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEZvcm1GaWVsZEFycmF5KFxuICAgIGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSxcbiAgICBjb25maWc6IEd1aUZpZWxkcyB8IEd1aUNvbnRyb2xbXSA9IHt9LFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsLFxuICAgIHBhcmVudFR5cGU6IEd1aUZpZWxkVHlwZSA9ICdncm91cCdcbiAgKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xuICAgICAgLy8gSW5mZXJyaW5nIHRoZSBmb3JtIHR5cGUgYnkgdGhlIGRhdGEgdHlwZSBvZiBgY2hpbGRyZW5gXG4gICAgICAvLyAxLiBgdW5kZWZpbmVkYCA9PiBGb3JtQ29udHJvbFxuICAgICAgLy8gMi4gYGFycmF5YCAgICAgPT4gRm9ybUFycmF5XG4gICAgICAvLyAzLiBgb2JqZWN0YCAgICA9PiBGb3JtR3JvdXBcbiAgICAgIGNvbnN0IF9jaGlsZHJlbiA9IChjb25maWcgYXMgYW55KVtrZXldLnRlbXBsYXRlID8gW10gOiAoY29uZmlnIGFzIGFueSlba2V5XS5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IF90eXBlID0gIV9jaGlsZHJlbiA/ICdjb250cm9sJyA6IEFycmF5LmlzQXJyYXkoX2NoaWxkcmVuKSA/ICdhcnJheScgOiAnZ3JvdXAnO1xuXG4gICAgICBjb25zdCBpdGVtOiBHdWlDb250cm9sID0ge1xuICAgICAgICBfdHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICBtb2RlbDogbW9kZWxba2V5XSxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlPy5ba2V5XSxcbiAgICAgICAgaW5kZXg6IE51bWJlcihrZXkpLCAvLyB0aGUgc3RyaW5nIGtleSB3aWxsIGJlIGBOYU5gXG4gICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgIC4uLihjb25maWcgYXMgYW55KVtrZXldLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIGBncm91cGAgdHlwZSBnZW5lcmFsbHkgaGF2ZSBubyBgZGVmYXVsdGAsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG1hbnVhbGx5XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBtb2RlbFtrZXldID09IG51bGwgJiYgaXRlbS5kZWZhdWx0ID09IG51bGwpIHtcbiAgICAgICAgaXRlbS5tb2RlbCA9IG1vZGVsW2tleV0gPSBpdGVtLl90eXBlID09PSAnYXJyYXknID8gW10gOiB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbW9kZWwgYnkgdGhlIGBkZWZhdWx0YCBrZXkgb2YgdGhlIGZpZWxkIGNvbmZpZ1xuICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ29iamVjdCcgJiYgbW9kZWxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIG1vZGVsW2tleV0gPSBpdGVtLmRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwganVkZ21lbnQgb24gYHRhYnNgIHR5cGUsIHRoZSBgY2hpbGRyZW5gIGtleSB3aWxsIGJlIGlnbm9yZWQgaWZcbiAgICAgIC8vIHRoZXJlIGhhcyBhIGB0ZW1wbGF0ZWAga2V5XG4gICAgICBpZiAoaXRlbS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBJZiBtb2RlbCBpcyBhbiBhcnJheSBhbmQgbm90IGVtcHR5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZm9ybSBmaWVsZFxuICAgICAgICAvLyB3aWxsIHVzZSB0aGUgbW9kZWwncyB2YWx1ZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtLm1vZGVsKSAmJiBpdGVtLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpdGVtLmRlZmF1bHQgPSBpdGVtLm1vZGVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmRlZmF1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBpdGVtLmRlZmF1bHQubWFwKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHZhbHVlLCBpdGVtLnRlbXBsYXRlPy5kZWZhdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAuLi5pdGVtLnRlbXBsYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgdGhlIGBzaG93SWZgIGNvbmRpdGlvbnNcbiAgICAgIGlmIChpdGVtLnNob3dJZikge1xuICAgICAgICBjb25zdCBzZXRWaXNpYmlsaXR5ID0gKGNvbXBhcmVXaXRoOiAoY29uZGl0aW9uOiBHdWlDb25kaXRpb24pID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5zaG93SWYhLmxvZ2ljYWxUeXBlID09PSAnJG9yJykge1xuICAgICAgICAgICAgaXRlbS5zaG93ID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMuc29tZShjID0+IGNvbXBhcmVXaXRoKGMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5zaG93ID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMuZXZlcnkoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCB0aGUgaW5pdCB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZFxuICAgICAgICBzZXRWaXNpYmlsaXR5KGMgPT4ge1xuICAgICAgICAgIGNvbnN0IGNmZyA9IGdldFZhbHVlQnlQYXRoKGNvbmZpZywgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5jb25maWcsIGNbMF0pO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGdldFZhbHVlQnlQYXRoKG1vZGVsLCBjWzBdKSA/PyBnZXRWYWx1ZUJ5UGF0aCh0aGlzLm1vZGVsLCBjWzBdKTtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZVZhbHVlcyhjZmc/LlsnZGVmYXVsdCddID8/IHZhbCwgY1syXSwgY1sxXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlbGF5IHRoZSBzdWJzY3JpcHRpb24gdG8gbWFrZSBzdXJlIGFsbCB0aGUgZm9ybSBjb250cm9scyBoYXZlIGJlZW4gY3JlYXRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBnZXRDb250cm9sID0gKHBhdGg6IHN0cmluZykgPT4gZm9ybS5nZXQocGF0aCkgfHwgdGhpcy5mb3JtLmdldChwYXRoKTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMubWFwKGMgPT4gZ2V0Q29udHJvbChjWzBdKSk7XG4gICAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2VzJCA9IGNvbnRyb2xzLm1hcChjb250cm9sID0+IGNvbnRyb2w/LnZhbHVlQ2hhbmdlcyB8fCBvZigpKTtcbiAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvZigpXG4gICAgICAgICAgICAucGlwZShtZXJnZVdpdGgodmFsdWVDaGFuZ2VzJCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IGNvbXBhcmVWYWx1ZXMoZ2V0Q29udHJvbChjWzBdKT8udmFsdWUsIGNbMl0sIGNbMV0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5jb250cm9sU3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5fdHlwZSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHsgdmFsdWU6IGl0ZW0uZGVmYXVsdCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgbGV0IGZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXk8YW55PihbXSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUFycmF5ID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQXJyYXkoW10pKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1BcnJheSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5jaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICAgICAgZm9ybUFycmF5LFxuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4sXG4gICAgICAgICAgaXRlbS5tb2RlbCxcbiAgICAgICAgICBpdGVtLmRlZmF1bHQsXG4gICAgICAgICAgaXRlbS50eXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaXRlbS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5fdHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBsZXQgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUdyb3VwID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtR3JvdXAoe30pKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1Hcm91cCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5jaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICAgICAgZm9ybUdyb3VwLFxuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4sXG4gICAgICAgICAgaXRlbS5tb2RlbCxcbiAgICAgICAgICBpdGVtLmRlZmF1bHQsXG4gICAgICAgICAgaXRlbS50eXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRlbXBBcnIucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVtcEFycjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0YWIgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgICAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGZvcm1BcnJheSBUaGUgcmVhY3RpdmUgZm9ybSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGFicyAgICAgIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIGNvcHkgICAgICBXaGV0aGVyIHRvIGNvcHkgdGhlIGN1cnJlbnQgdGFiXG4gICAqIEBwYXJhbSBpbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSB0YWJzIGFycmF5XG4gICAqL1xuICBhZGRUYWIoZTogTW91c2VFdmVudCwgZm9ybUFycmF5OiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGNvcHk/OiBib29sZWFuLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgaW5zZXJ0SW5kZXggPVxuICAgICAgaW5kZXggIT09IHZvaWQgMCA/IGluZGV4ICsgMSA6IGNvcHkgPyB0YWJzLnNlbGVjdGVkSW5kZXghICsgMSA6IHRhYnMuY2hpbGRyZW4hLmxlbmd0aDtcbiAgICAvLyBTYXZlIHRoZSBpbmRleCBvZiB0aGUgaW5zZXJ0aW9uIGluIHRoZSBjb25maWdcbiAgICB0YWJzLnRlbXBsYXRlIS5pbmRleCA9IGluc2VydEluZGV4O1xuICAgIC8vIFRoZSBrZXkgaW4gdGhlIG9iamVjdCBhbmQgdGhlIGluZGV4IGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIHNhbWVcbiAgICB0YWJzLmNoaWxkcmVuIS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA+PSBpbnNlcnRJbmRleCkge1xuICAgICAgICBjaGlsZC5pbmRleCEgKz0gMTtcbiAgICAgICAgY2hpbGQua2V5ID0gY2hpbGQuaW5kZXggKyAnJzsgLy8gY29udmVydCB0byBzdHJpbmdcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1BcnJheS5nZXQoaW5zZXJ0SW5kZXggLSAxICsgJycpPy52YWx1ZTtcbiAgICAvLyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IGxvb2tzIGxpa2UgdGhpcyBgW3sga2V5OiAndGFiJywgY2hpbGRyZW46IHRlbXBsYXRlIH1dYFxuICAgIC8vIFRoZSBrZXkgc2hvdWxkIHByZWZlcmFibHkgYmUgYG51bGxgXG4gICAgY29uc3QgbmV3VGFiID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgIGZvcm1BcnJheSxcbiAgICAgIHsgW2luc2VydEluZGV4XTogdGFicy50ZW1wbGF0ZSB9IGFzIEd1aUZpZWxkcyxcbiAgICAgIGNvcHkgPyB7IFtpbnNlcnRJbmRleF06IGZvcm1WYWx1ZSB9IDoge30sXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IG51bGwsXG4gICAgICAndGFicydcbiAgICApO1xuICAgIHRhYnMuY2hpbGRyZW4hLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3VGFiWzBdKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSBtb2RlbFxuICAgIGZvcm1BcnJheS5wYXRjaFZhbHVlKGZvcm1BcnJheS52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBpbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSB0YWJzIGFycmF5XG4gICAqL1xuICByZW1vdmVUYWIoZTogTW91c2VFdmVudCwgZm9ybUFycmF5OiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IGluZGV4ID09PSB2b2lkIDAgPyB0YWJzLnNlbGVjdGVkSW5kZXghIDogaW5kZXg7XG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiByZW1vdmVJbmRleCkge1xuICAgICAgICBjaGlsZC5pbmRleCEgLT0gMTtcbiAgICAgICAgY2hpbGQua2V5ID0gY2hpbGQuaW5kZXggKyAnJzsgLy8gY29udmVydCB0byBzdHJpbmdcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIGZvcm1BcnJheS5yZW1vdmVBdChyZW1vdmVJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkaXNwbGF5IG1vZGUgb2YgdGFicy5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSB0YWJzIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIG1vZGUgVGhlIGRpc3BsYXkgbW9kZSBvZiB0YWJzXG4gICAqL1xuICBjaGFuZ2VUYWJzTW9kZShlOiBNb3VzZUV2ZW50LCB0YWJzOiBHdWlDb250cm9sLCBtb2RlPzogR3VpVGFic01vZGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRhYnMubW9kZSA9IG1vZGU7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1GaWVsZHNcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtfVwiPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUeXBlIGxldC1pdGVtIGxldC1wYXJlbnQ9XCJwYXJlbnRcIiBsZXQtZm9ybT1cImZvcm1Hcm91cFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5zaG93XCIgW25nU3dpdGNoXT1cIml0ZW0udHlwZVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDwhLS0gVGV4dCAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1pbnB1dC10ZXh0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gTnVtYmVyIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktaW5wdXQtbnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gU2VsZWN0IC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gU3dpdGNoIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidzd2l0Y2gnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktc3dpdGNoIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gU2xpZGVyIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidzbGlkZXInXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktc2xpZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gQnV0dG9uIFRvZ2dsZSAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInYnV0dG9uVG9nZ2xlJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWJ1dHRvbi10b2dnbGUgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBGaWxsIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidmaWxsJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWZpbGwgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBGaWxlIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBJbWFnZSAtLT5cbiAgICA8Z3VpLWZpZWxkLWdyb3VwICpuZ1N3aXRjaENhc2U9XCInaW1hZ2UnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgIDxndWktZmlsZS11cGxvYWRlciB0eXBlPVwiaW1hZ2VcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICA8IS0tIFZpZGVvIC0tPlxuICAgIDxndWktZmllbGQtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIid2aWRlbydcIiBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJ2aWRlb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gQXVkaW8gLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2F1ZGlvJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImF1ZGlvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgPCEtLSBJbWFnZSBTZWxlY3QgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ2ltYWdlU2VsZWN0J1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLWltYWdlLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgW2FwcGVuZFRvXT1cIicjJyt1aWRcIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gVGV4dGFyZWEgLS0+XG4gICAgPGd1aS1maWVsZC1ncm91cCAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICA8Z3VpLXRleHRhcmVhIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgIDwhLS0gSGlkZGVuIElucHV0IC0tPlxuICAgIDxpbnB1dCAqbmdTd2l0Y2hDYXNlPVwiJ2hpZGRlbidcIiB0eXBlPVwiaGlkZGVuXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPlxuXG4gICAgPCEtLSBJbmxpbmUgR3JvdXAgLS0+XG4gICAgPGd1aS1pbmxpbmUtZ3JvdXAgKm5nU3dpdGNoQ2FzZT1cIidpbmxpbmUnXCIgW2NvbmZpZ109XCJpdGVtXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KX1cIj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZ3VpLWlubGluZS1ncm91cD5cblxuICAgIDwhLS0gR3JvdXAgLS0+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nU3dpdGNoQ2FzZT1cIidncm91cCdcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5jaGlsZHJlblwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KGl0ZW0ua2V5KX1cIj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gICAgPCEtLSBUYWJzIC0tPlxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ1N3aXRjaENhc2U9XCIndGFicydcIiBbZm9ybUFycmF5TmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgPCEtLSBTaG93IG9wZXJhdGlvbiBidXR0b25zIHdoZW4gcGFuZWwgb3BlbmVkIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZFwiPlxuICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlIT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFic01vZGUoJGV2ZW50LCBpdGVtLCAnbm9ybWFsJylcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZG90c19ob3Jpem9udGFsXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRhYnNNb2RlKCRldmVudCwgaXRlbSwgJ2xpc3QnKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkb3RzX3ZlcnRpY2FsXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZClcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIHRydWUpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29udGVudF9jb3B5XCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJwbHVzXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkZWxldGVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgIDwhLS0gTGF6eSByZW5kZXJpbmcgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICA8IS0tIEhvcml6b250YWwgbW9kZSAtLT5cbiAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJpdGVtLm1vZGUhPT0nbGlzdCdcIiBjbGFzcz1cImd1aS10YWJzXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgICAgICBbbWF0LXN0cmV0Y2gtdGFic109XCJmYWxzZVwiIFsoc2VsZWN0ZWRJbmRleCldPVwiaXRlbS5zZWxlY3RlZEluZGV4XCI+XG4gICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiBpdGVtLmNoaWxkcmVuOyBpbmRleCBhcyBpXCIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXY+e3t0YWIubmFtZSB8IGVqczp7aX0gfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicydcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKX1cIj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBGb3JtR3JvdXAgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJ1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGlsZCBvZiB0YWIuY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuXG4gICAgICAgIDwhLS0gVmVydGljYWwgbW9kZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0XCIgKm5nSWY9XCJpdGVtLm1vZGU9PT0nbGlzdCdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbVwiICpuZ0Zvcj1cImxldCB0YWIgb2YgaXRlbS5jaGlsZHJlbjsgaW5kZXggYXMgaVwiXG4gICAgICAgICAgICAgICBbY2xhc3MuZ3VpLWxpc3QtaXRlbS1hY3RpdmVdPVwiaXRlbS5zZWxlY3RlZEluZGV4PT09aVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW0taGVhZGluZ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImd1aS1saXN0LWl0ZW0tdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXRlbS5zZWxlY3RlZEluZGV4PWlcIj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIHRydWUsIGkpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvbnRlbnRfY29weVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGZhbHNlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJwbHVzXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicydcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSl9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNoaWxkIG9mIHRhYi5jaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG5cbiAgICA8IS0tIE1lbnUgLS0+XG4gICAgPG1hdC10YWItZ3JvdXAgY2xhc3M9XCJndWktbWVudVwiICpuZ1N3aXRjaENhc2U9XCInbWVudSdcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgbWVudUNoaWxkIG9mIGl0ZW0uY2hpbGRyZW5cIiBbbGFiZWxdPVwibWVudUNoaWxkLm5hbWVcIlxuICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnVDaGlsZC5kaXNhYmxlZFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudUNoaWxkLnR5cGU9PT0nbWVudUl0ZW0nXCI+XG4gICAgICAgICAgICA8IS0tIE11c3Qgd3JhcCB3aXRoIGRpdiAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2xJdGVtIG9mIG1lbnVDaGlsZC5jaGlsZHJlblwiIFtmb3JtR3JvdXBOYW1lXT1cIm1lbnVDaGlsZC5rZXlcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjb250cm9sSXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIG1lbnVDaGlsZC5rZXldKX1cIj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gU3VwcG9ydCBmb3IgdW5saW1pdGVkIG5lc3RpbmcgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lbnVDaGlsZC50eXBlPT09J21lbnUnXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBtZW51Q2hpbGQsIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFV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QUNkLGFBQWEsb0ZBQ2IsVUFBVTs7MkZBR0QsT0FBTztrQkF4Q25CLFNBQVM7K0JBQ0UsVUFBVSxRQUdkO3dCQUNKLFdBQVcsRUFBRSxLQUFLO3dCQUNsQixPQUFPLEVBQUUsVUFBVTtxQkFDcEIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2Qix3QkFBd0I7d0JBQ3hCLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxXQUFXO3dCQUNYLE1BQU07d0JBQ04sV0FBVzt3QkFDWCxhQUFhO3dCQUNiLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxTQUFTO3dCQUNULFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixVQUFVO3FCQUNYO3FGQU1RLElBQUk7c0JBQVosS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge1xuICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgTWF0RXhwYW5zaW9uUGFuZWxDb250ZW50LFxuICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiQ29udGVudCwgTWF0VGFiR3JvdXAsIE1hdFRhYkxhYmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIG1lcmdlV2l0aCwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgR3VpQnV0dG9uVG9nZ2xlIH0gZnJvbSAnLi9idXR0b24tdG9nZ2xlL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHsgR3VpRmllbGRHcm91cCB9IGZyb20gJy4vZmllbGQtZ3JvdXAvZmllbGQtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpRmllbGRMYWJlbCB9IGZyb20gJy4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkZXInO1xuaW1wb3J0IHsgR3VpRmlsbCB9IGZyb20gJy4vZmlsbC9maWxsJztcbmltcG9ydCB7IEd1aUVqc1BpcGUsIEd1aUZsZXhEaXJlY3RpdmUsIGNvbXBhcmVWYWx1ZXMsIGdldFZhbHVlQnlQYXRoIH0gZnJvbSAnLi9ndWktdXRpbHMnO1xuaW1wb3J0IHsgR3VpSW1hZ2VTZWxlY3QgfSBmcm9tICcuL2ltYWdlLXNlbGVjdC9pbWFnZS1zZWxlY3QnO1xuaW1wb3J0IHsgR3VpSW5saW5lR3JvdXAgfSBmcm9tICcuL2lubGluZS1ncm91cC9pbmxpbmUtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpSW5wdXROdW1iZXIgfSBmcm9tICcuL2lucHV0LW51bWJlci9pbnB1dC1udW1iZXInO1xuaW1wb3J0IHsgR3VpSW5wdXRUZXh0IH0gZnJvbSAnLi9pbnB1dC10ZXh0L2lucHV0LXRleHQnO1xuaW1wb3J0IHsgR3VpQ29uZGl0aW9uLCBHdWlDb250cm9sLCBHdWlGaWVsZFR5cGUsIEd1aUZpZWxkcywgR3VpVGFic01vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBHdWlTZWxlY3QgfSBmcm9tICcuL3NlbGVjdC9zZWxlY3QnO1xuaW1wb3J0IHsgR3VpU2xpZGVyIH0gZnJvbSAnLi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7IEd1aVN3aXRjaCB9IGZyb20gJy4vc3dpdGNoL3N3aXRjaCc7XG5pbXBvcnQgeyBHdWlUZXh0YXJlYSB9IGZyb20gJy4vdGV4dGFyZWEvdGV4dGFyZWEnO1xuXG5pbXBvcnQgeyBHdWlJY29uc1JlZ2lzdHJ5IH0gZnJvbSAnLi9ndWktaWNvbnMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpLWZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ndWktZm9ybS5zY3NzJyxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5pZF0nOiAndWlkJyxcbiAgICAnY2xhc3MnOiAnZ3VpLWZvcm0nLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbiAgICBNYXRFeHBhbnNpb25QYW5lbENvbnRlbnQsXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRhYkdyb3VwLFxuICAgIE1hdFRhYixcbiAgICBNYXRUYWJMYWJlbCxcbiAgICBNYXRUYWJDb250ZW50LFxuICAgIEd1aUZpZWxkR3JvdXAsXG4gICAgR3VpRmxleERpcmVjdGl2ZSxcbiAgICBHdWlJbnB1dFRleHQsXG4gICAgR3VpSW5wdXROdW1iZXIsXG4gICAgR3VpU2VsZWN0LFxuICAgIEd1aVN3aXRjaCxcbiAgICBHdWlTbGlkZXIsXG4gICAgR3VpQnV0dG9uVG9nZ2xlLFxuICAgIEd1aUZpbGwsXG4gICAgR3VpRmlsZVVwbG9hZGVyLFxuICAgIEd1aUltYWdlU2VsZWN0LFxuICAgIEd1aVRleHRhcmVhLFxuICAgIEd1aUlubGluZUdyb3VwLFxuICAgIEd1aUZpZWxkTGFiZWwsXG4gICAgR3VpRWpzUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRm9ybSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGZvcm0gaW5zdGFuY2Ugd2hpY2ggYWxsb3cgdG8gdHJhY2sgbW9kZWwgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgQElucHV0KCkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IEd1aUZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIG1vZGVsIHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29udHJvbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIGZvcm1cbiAgdWlkID0gYGd1aS1mb3JtLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICBjb25zdHJ1Y3RvcihpY29uc1JlZ2lzdHJ5OiBHdWlJY29uc1JlZ2lzdHJ5KSB7XG4gICAgaWNvbnNSZWdpc3RyeS5hZGQoJ2hvcml6b250YWwnLCAndmVydGljYWwnLCAnY29weScsICdhZGQnLCAnZGVsZXRlJyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHMgPSB7fTsgLy8gcmVzZXQgY29udHJvbHNcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkodGhpcy5mb3JtLCB0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10gJiYgdGhpcy5tb2RlbCAmJiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHZhbHVlKTtcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnXG4gICkge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIC8vIEluZmVycmluZyB0aGUgZm9ybSB0eXBlIGJ5IHRoZSBkYXRhIHR5cGUgb2YgYGNoaWxkcmVuYFxuICAgICAgLy8gMS4gYHVuZGVmaW5lZGAgPT4gRm9ybUNvbnRyb2xcbiAgICAgIC8vIDIuIGBhcnJheWAgICAgID0+IEZvcm1BcnJheVxuICAgICAgLy8gMy4gYG9iamVjdGAgICAgPT4gRm9ybUdyb3VwXG4gICAgICBjb25zdCBfY2hpbGRyZW4gPSAoY29uZmlnIGFzIGFueSlba2V5XS50ZW1wbGF0ZSA/IFtdIDogKGNvbmZpZyBhcyBhbnkpW2tleV0uY2hpbGRyZW47XG4gICAgICBjb25zdCBfdHlwZSA9ICFfY2hpbGRyZW4gPyAnY29udHJvbCcgOiBBcnJheS5pc0FycmF5KF9jaGlsZHJlbikgPyAnYXJyYXknIDogJ2dyb3VwJztcblxuICAgICAgY29uc3QgaXRlbTogR3VpQ29udHJvbCA9IHtcbiAgICAgICAgX3R5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgbW9kZWw6IG1vZGVsW2tleV0sXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZT8uW2tleV0sXG4gICAgICAgIGluZGV4OiBOdW1iZXIoa2V5KSwgLy8gdGhlIHN0cmluZyBrZXkgd2lsbCBiZSBgTmFOYFxuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAuLi4oY29uZmlnIGFzIGFueSlba2V5XSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBgZ3JvdXBgIHR5cGUgZ2VuZXJhbGx5IGhhdmUgbm8gYGRlZmF1bHRgLCBzbyB3ZSBzaG91bGRcbiAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBtYW51YWxseVxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgbW9kZWxba2V5XSA9PSBudWxsICYmIGl0ZW0uZGVmYXVsdCA9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ubW9kZWwgPSBtb2RlbFtrZXldID0gaXRlbS5fdHlwZSA9PT0gJ2FycmF5JyA/IFtdIDoge307XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIG1vZGVsIGJ5IHRoZSBgZGVmYXVsdGAga2V5IG9mIHRoZSBmaWVsZCBjb25maWdcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdvYmplY3QnICYmIG1vZGVsW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBtb2RlbFtrZXldID0gaXRlbS5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGp1ZGdtZW50IG9uIGB0YWJzYCB0eXBlLCB0aGUgYGNoaWxkcmVuYCBrZXkgd2lsbCBiZSBpZ25vcmVkIGlmXG4gICAgICAvLyB0aGVyZSBoYXMgYSBgdGVtcGxhdGVgIGtleVxuICAgICAgaWYgKGl0ZW0udGVtcGxhdGUpIHtcbiAgICAgICAgLy8gSWYgbW9kZWwgaXMgYW4gYXJyYXkgYW5kIG5vdCBlbXB0eSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICAgICAgLy8gd2lsbCB1c2UgdGhlIG1vZGVsJ3MgdmFsdWVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5tb2RlbCkgJiYgaXRlbS5tb2RlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaXRlbS5kZWZhdWx0ID0gaXRlbS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5kZWZhdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gaXRlbS5kZWZhdWx0Lm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih2YWx1ZSwgaXRlbS50ZW1wbGF0ZT8uZGVmYXVsdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgLi4uaXRlbS50ZW1wbGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBgc2hvd0lmYCBjb25kaXRpb25zXG4gICAgICBpZiAoaXRlbS5zaG93SWYpIHtcbiAgICAgICAgY29uc3Qgc2V0VmlzaWJpbGl0eSA9IChjb21wYXJlV2l0aDogKGNvbmRpdGlvbjogR3VpQ29uZGl0aW9uKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uc2hvd0lmIS5sb2dpY2FsVHlwZSA9PT0gJyRvcicpIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLnNvbWUoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLmV2ZXJ5KGMgPT4gY29tcGFyZVdpdGgoYykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgdGhlIGluaXQgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGRcbiAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IHtcbiAgICAgICAgICBjb25zdCBjZmcgPSBnZXRWYWx1ZUJ5UGF0aChjb25maWcsIGNbMF0pID8/IGdldFZhbHVlQnlQYXRoKHRoaXMuY29uZmlnLCBjWzBdKTtcbiAgICAgICAgICBjb25zdCB2YWwgPSBnZXRWYWx1ZUJ5UGF0aChtb2RlbCwgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5tb2RlbCwgY1swXSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoY2ZnPy5bJ2RlZmF1bHQnXSA/PyB2YWwsIGNbMl0sIGNbMV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWxheSB0aGUgc3Vic2NyaXB0aW9uIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGZvcm0gY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2V0Q29udHJvbCA9IChwYXRoOiBzdHJpbmcpID0+IGZvcm0uZ2V0KHBhdGgpIHx8IHRoaXMuZm9ybS5nZXQocGF0aCk7XG5cbiAgICAgICAgICBjb25zdCBjb250cm9scyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLm1hcChjID0+IGdldENvbnRyb2woY1swXSkpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyQgPSBjb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sPy52YWx1ZUNoYW5nZXMgfHwgb2YoKSk7XG4gICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb2YoKVxuICAgICAgICAgICAgLnBpcGUobWVyZ2VXaXRoKHZhbHVlQ2hhbmdlcyQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFZpc2liaWxpdHkoYyA9PiBjb21wYXJlVmFsdWVzKGdldENvbnRyb2woY1swXSk/LnZhbHVlLCBjWzJdLCBjWzFdKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uX3R5cGUgPT09ICdjb250cm9sJykge1xuICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7IHZhbHVlOiBpdGVtLmRlZmF1bHQsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH07XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1BcnJheSA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUFycmF5KFtdKSkgYXMgRm9ybUFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtQXJyYXksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1BcnJheSxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1Hcm91cCA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUdyb3VwKHt9KSkgYXMgRm9ybUdyb3VwO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtR3JvdXAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1Hcm91cCxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBjb3B5ICAgICAgV2hldGhlciB0byBjb3B5IHRoZSBjdXJyZW50IHRhYlxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgYWRkVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBjb3B5PzogYm9vbGVhbiwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGluc2VydEluZGV4ID1cbiAgICAgIGluZGV4ICE9PSB2b2lkIDAgPyBpbmRleCArIDEgOiBjb3B5ID8gdGFicy5zZWxlY3RlZEluZGV4ISArIDEgOiB0YWJzLmNoaWxkcmVuIS5sZW5ndGg7XG4gICAgLy8gU2F2ZSB0aGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBpbiB0aGUgY29uZmlnXG4gICAgdGFicy50ZW1wbGF0ZSEuaW5kZXggPSBpbnNlcnRJbmRleDtcbiAgICAvLyBUaGUga2V5IGluIHRoZSBvYmplY3QgYW5kIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghICs9IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtQXJyYXkuZ2V0KGluc2VydEluZGV4IC0gMSArICcnKT8udmFsdWU7XG4gICAgLy8gVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBsb29rcyBsaWtlIHRoaXMgYFt7IGtleTogJ3RhYicsIGNoaWxkcmVuOiB0ZW1wbGF0ZSB9XWBcbiAgICAvLyBUaGUga2V5IHNob3VsZCBwcmVmZXJhYmx5IGJlIGBudWxsYFxuICAgIGNvbnN0IG5ld1RhYiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB7IFtpbnNlcnRJbmRleF06IHRhYnMudGVtcGxhdGUgfSBhcyBHdWlGaWVsZHMsXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IHt9LFxuICAgICAgY29weSA/IHsgW2luc2VydEluZGV4XTogZm9ybVZhbHVlIH0gOiBudWxsLFxuICAgICAgJ3RhYnMnXG4gICAgKTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld1RhYlswXSk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGZvcm0gbW9kZWxcbiAgICBmb3JtQXJyYXkucGF0Y2hWYWx1ZShmb3JtQXJyYXkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybUFycmF5IFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgcmVtb3ZlVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBpbmRleCA9PT0gdm9pZCAwID8gdGFicy5zZWxlY3RlZEluZGV4ISA6IGluZGV4O1xuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID4gcmVtb3ZlSW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghIC09IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBtb2RlIG9mIHRhYnMuXG4gICAqXG4gICAqIEBwYXJhbSBlICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gdGFicyBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGFic1xuICAgKi9cbiAgY2hhbmdlVGFic01vZGUoZTogTW91c2VFdmVudCwgdGFiczogR3VpQ29udHJvbCwgbW9kZT86IEd1aVRhYnNNb2RlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0YWJzLm1vZGUgPSBtb2RlO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgQGZvciAoaXRlbSBvZiBmb3JtRmllbGRzOyB0cmFjayBpdGVtKSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm19XCI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICB9XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFR5cGUgbGV0LWl0ZW0gbGV0LXBhcmVudD1cInBhcmVudFwiIGxldC1mb3JtPVwiZm9ybUdyb3VwXCI+XG4gIEBpZiAoaXRlbS5zaG93KSB7XG4gICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICBAY2FzZSAoJ3RleHQnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbnB1dC10ZXh0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW5wdXQtbnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2VsZWN0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc3dpdGNoJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc3dpdGNoIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2xpZGVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2xpZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnYnV0dG9uVG9nZ2xlJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktYnV0dG9uLXRvZ2dsZSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ZpbGwnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxsIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZmlsZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImltYWdlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd2aWRlbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cInZpZGVvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdhdWRpbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImF1ZGlvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZVNlbGVjdCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWltYWdlLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgW2FwcGVuZFRvXT1cIicjJyt1aWRcIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS10ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2hpZGRlbicpIHtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2lubGluZScpIHtcbiAgICAgICAgICA8Z3VpLWlubGluZS1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiPlxuICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSl9XCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9ndWktaW5saW5lLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZ3JvdXAnKSB7XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd0YWJzJykge1xuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtmb3JtQXJyYXlOYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgIFsoZXhwYW5kZWQpXT1cIml0ZW0uZXhwYW5kZWRcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICAgIDwhLS0gU2hvdyBvcGVyYXRpb24gYnV0dG9ucyB3aGVuIHBhbmVsIG9wZW5lZCAtLT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtjb2xvcl09XCJpdGVtLm1vZGUhPT0nbGlzdCc/J3ByaW1hcnknOicnXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdub3JtYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJob3Jpem9udGFsXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRhYnNNb2RlKCRldmVudCwgaXRlbSwgJ2xpc3QnKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJ2ZXJ0aWNhbFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtLnRlbXBsYXRlICYmIChpdGVtLmFkZGFibGUgfHwgaXRlbS5hZGRhYmxlPT09dW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJjb3B5XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLm1vZGUhPT0nbGlzdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIEhvcml6b250YWwgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS10YWJzXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgW21hdC1zdHJldGNoLXRhYnNdPVwiZmFsc2VcIiBbKHNlbGVjdGVkSW5kZXgpXT1cIml0ZW0uc2VsZWN0ZWRJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAodGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgdGFiLmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gVmVydGljYWwgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHRhYiBvZiBpdGVtLmNoaWxkcmVuOyB0cmFjayB0YWI7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZ3VpLWxpc3QtaXRlbS1hY3RpdmVdPVwiaXRlbS5zZWxlY3RlZEluZGV4PT09aVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXRlbS5zZWxlY3RlZEluZGV4PWlcIj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCB0cnVlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29weVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGZhbHNlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUNvbnRyb2wgJiBGb3JtQXJyYXkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZCBvZiB0YWIuY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgaV0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtZW51Jykge1xuICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLW1lbnVcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICAgICAgICBAZm9yIChtZW51Q2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgbWVudUNoaWxkKSB7XG4gICAgICAgICAgICAgIDxtYXQtdGFiIFtsYWJlbF09XCJtZW51Q2hpbGQubmFtZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnVDaGlsZC5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51SXRlbScpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNdXN0IHdyYXAgd2l0aCBkaXYgLS0+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbnRyb2xJdGVtIG9mIG1lbnVDaGlsZC5jaGlsZHJlbjsgdHJhY2sgY29udHJvbEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cIm1lbnVDaGlsZC5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjb250cm9sSXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIG1lbnVDaGlsZC5rZXldKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwhLS0gU3VwcG9ydCBmb3IgdW5saW1pdGVkIG5lc3RpbmcgLS0+XG4gICAgICAgICAgICAgICAgICBAaWYgKG1lbnVDaGlsZC50eXBlPT09J21lbnUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG1lbnVDaGlsZCwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSl9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvbmctY29udGFpbmVyPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|