@acrodata/gui 2.3.0 → 2.5.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/_index.scss +8 -2
- package/button-toggle/button-toggle.d.ts +3 -3
- package/codearea/codearea-config.d.ts +14 -0
- package/codearea/codearea-dialog.d.ts +31 -0
- package/codearea/codearea-dialog.scss +63 -0
- package/codearea/codearea.d.ts +41 -0
- package/codearea/codearea.scss +49 -0
- package/combobox/combobox.d.ts +3 -3
- package/esm2022/button-toggle/button-toggle.mjs +6 -6
- package/esm2022/button-toggle/icon.mjs +4 -4
- package/esm2022/codearea/codearea-config.mjs +20 -0
- package/esm2022/codearea/codearea-dialog.mjs +70 -0
- package/esm2022/codearea/codearea.mjs +147 -0
- package/esm2022/combobox/combobox.mjs +4 -4
- package/esm2022/field-group/field-group.mjs +5 -5
- package/esm2022/field-label/field-label.mjs +5 -5
- package/esm2022/file-uploader/file-uploader-config.mjs +4 -4
- package/esm2022/file-uploader/file-uploader.mjs +6 -6
- package/esm2022/fill/fill.mjs +6 -6
- package/esm2022/gui-form.mjs +9 -7
- package/esm2022/gui-icons.mjs +14 -6
- package/esm2022/gui-module.mjs +18 -6
- package/esm2022/gui-utils.mjs +7 -7
- package/esm2022/icon-button-wrapper/icon-button-wrapper.mjs +5 -5
- package/esm2022/image-select/image-select.mjs +6 -6
- package/esm2022/inline-group/inline-group.mjs +4 -4
- package/esm2022/input-number/input-number.mjs +6 -6
- package/esm2022/input-text/input-text.mjs +6 -6
- package/esm2022/interface.mjs +1 -1
- package/esm2022/public-api.mjs +4 -1
- package/esm2022/select/select.mjs +6 -6
- package/esm2022/slider/slider.mjs +6 -6
- package/esm2022/switch/switch.mjs +6 -6
- package/esm2022/textarea/textarea.mjs +6 -6
- package/fesm2022/acrodata-gui.mjs +457 -227
- package/fesm2022/acrodata-gui.mjs.map +1 -1
- package/field-label/field-label.scss +4 -0
- package/gui-icons.d.ts +3 -3
- package/gui-module.d.ts +6 -4
- package/icon-button-wrapper/icon-button-wrapper.scss +2 -5
- package/interface.d.ts +3 -1
- package/package.json +3 -1
- package/public-api.d.ts +3 -0
- package/select/select.d.ts +3 -3
package/esm2022/fill/fill.mjs
CHANGED
|
@@ -35,16 +35,16 @@ export class GuiFill {
|
|
|
35
35
|
onValueChange() {
|
|
36
36
|
this.onChange(this.value);
|
|
37
37
|
}
|
|
38
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
39
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.
|
|
38
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiFill, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: GuiFill, isStandalone: true, selector: "gui-fill", inputs: { config: "config", disabled: "disabled" }, host: { classAttribute: "gui-field gui-fill" }, providers: [
|
|
40
40
|
{
|
|
41
41
|
provide: NG_VALUE_ACCESSOR,
|
|
42
42
|
useExisting: forwardRef(() => GuiFill),
|
|
43
43
|
multi: true,
|
|
44
44
|
},
|
|
45
|
-
], ngImport: i0, template: "<mat-form-field>\n <ng-container matPrefix>\n <span class=\"gui-color-block-empty\"></span>\n <span class=\"gui-color-block\" [style.background]=\"value\"></span>\n </ng-container>\n\n <input
|
|
45
|
+
], ngImport: i0, template: "<mat-form-field>\n <ng-container matPrefix>\n <span class=\"gui-color-block-empty\"></span>\n <span class=\"gui-color-block\" [style.background]=\"value\"></span>\n </ng-container>\n\n <input\n matInput\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder || ''\"\n [mtxColorpicker]=\"cp\"\n (colorChange)=\"onValueChange()\"\n />\n\n <mtx-colorpicker #cp />\n <gui-icon-button-wrapper matSuffix>\n <mtx-colorpicker-toggle [for]=\"cp\" />\n </gui-icon-button-wrapper>\n\n @if (config.parentType === 'inline') {\n <mat-hint>\n <gui-field-label [config]=\"config\" />\n </mat-hint>\n }\n</mat-form-field>\n", styles: [".gui-color-block,.gui-color-block-empty{position:relative;display:inline-block;width:1.5rem;height:1.5rem}.gui-color-block-empty{position:absolute;background-color:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-position:0 0,0 .25rem,.25rem -.25rem,-.25rem 0;background-size:.5rem .5rem}.gui-color-block:after{display:inline-block;width:100%;height:100%;box-sizing:border-box;border:1px solid currentColor;border-top-left-radius:var(--mdc-filled-text-field-container-shape);border-bottom-left-radius:var(--mdc-filled-text-field-container-shape);opacity:.12;content:\"\"}[dir=rtl] .gui-color-block:after{border-radius:0;border-top-right-radius:var(--mdc-filled-text-field-container-shape);border-bottom-right-radius:var(--mdc-filled-text-field-container-shape)}.gui-fill .mat-mdc-icon-button{display:inline-flex;justify-content:center;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MtxColorpickerInput, selector: "input[mtxColorpicker]", inputs: ["mtxColorpicker", "disabled", "value", "format"], outputs: ["colorChange", "colorInput"], exportAs: ["mtxColorpickerInput"] }, { kind: "component", type: MtxColorpicker, selector: "mtx-colorpicker", inputs: ["content", "disabled", "xPosition", "yPosition", "restoreFocus", "opened", "color", "format"], outputs: ["opened", "closed"], exportAs: ["mtxColorpicker"] }, { kind: "component", type: MtxColorpickerToggle, selector: "mtx-colorpicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["mtxColorpickerToggle"] }, { kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
46
46
|
}
|
|
47
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiFill, decorators: [{
|
|
48
48
|
type: Component,
|
|
49
49
|
args: [{ selector: 'gui-fill', host: {
|
|
50
50
|
class: 'gui-field gui-fill',
|
|
@@ -66,10 +66,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
|
66
66
|
MtxColorpickerToggle,
|
|
67
67
|
GuiFieldLabel,
|
|
68
68
|
GuiIconButtonWrapper,
|
|
69
|
-
], template: "<mat-form-field>\n <ng-container matPrefix>\n <span class=\"gui-color-block-empty\"></span>\n <span class=\"gui-color-block\" [style.background]=\"value\"></span>\n </ng-container>\n\n <input
|
|
69
|
+
], template: "<mat-form-field>\n <ng-container matPrefix>\n <span class=\"gui-color-block-empty\"></span>\n <span class=\"gui-color-block\" [style.background]=\"value\"></span>\n </ng-container>\n\n <input\n matInput\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [placeholder]=\"config.placeholder || ''\"\n [mtxColorpicker]=\"cp\"\n (colorChange)=\"onValueChange()\"\n />\n\n <mtx-colorpicker #cp />\n <gui-icon-button-wrapper matSuffix>\n <mtx-colorpicker-toggle [for]=\"cp\" />\n </gui-icon-button-wrapper>\n\n @if (config.parentType === 'inline') {\n <mat-hint>\n <gui-field-label [config]=\"config\" />\n </mat-hint>\n }\n</mat-form-field>\n", styles: [".gui-color-block,.gui-color-block-empty{position:relative;display:inline-block;width:1.5rem;height:1.5rem}.gui-color-block-empty{position:absolute;background-color:#fff;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-position:0 0,0 .25rem,.25rem -.25rem,-.25rem 0;background-size:.5rem .5rem}.gui-color-block:after{display:inline-block;width:100%;height:100%;box-sizing:border-box;border:1px solid currentColor;border-top-left-radius:var(--mdc-filled-text-field-container-shape);border-bottom-left-radius:var(--mdc-filled-text-field-container-shape);opacity:.12;content:\"\"}[dir=rtl] .gui-color-block:after{border-radius:0;border-top-right-radius:var(--mdc-filled-text-field-container-shape);border-bottom-right-radius:var(--mdc-filled-text-field-container-shape)}.gui-fill .mat-mdc-icon-button{display:inline-flex;justify-content:center;align-items:center}\n"] }]
|
|
70
70
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { config: [{
|
|
71
71
|
type: Input
|
|
72
72
|
}], disabled: [{
|
|
73
73
|
type: Input
|
|
74
74
|
}] } });
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9maWxsL2ZpbGwudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvZmlsbC9maWxsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLG9CQUFvQixHQUNyQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7O0FBa0NsRixNQUFNLE9BQU8sT0FBTztJQVNsQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQVJqQyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUNqQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFSCxhQUFRLEdBQTRCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRUksQ0FBQztJQUU5QyxVQUFVLENBQUMsS0FBYTtRQUN0QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUEyQjtRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBakNVLE9BQU87bUdBQVAsT0FBTywySkF0QlA7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztnQkFDdEMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQ25DSCwrcUJBMEJBLG1rQ0RZSSxXQUFXLCttQkFDWCxZQUFZLDRMQUNaLFNBQVMscUhBQ1QsUUFBUSxpVUFDUixTQUFTLHFIQUNULE9BQU8sOEVBQ1AsbUJBQW1CLHdNQUNuQixjQUFjLGlPQUNkLG9CQUFvQiwrS0FDcEIsYUFBYSx5RkFDYixvQkFBb0I7OzRGQUdYLE9BQU87a0JBL0JuQixTQUFTOytCQUNFLFVBQVUsUUFHZDt3QkFDSixLQUFLLEVBQUUsb0JBQW9CO3FCQUM1QixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQzs0QkFDdEMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsY0FDVyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixTQUFTO3dCQUNULE9BQU87d0JBQ1AsbUJBQW1CO3dCQUNuQixjQUFjO3dCQUNkLG9CQUFvQjt3QkFDcEIsYUFBYTt3QkFDYixvQkFBb0I7cUJBQ3JCO3NGQUdRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkLCBNYXRIaW50LCBNYXRQcmVmaXgsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQge1xuICBNdHhDb2xvcnBpY2tlcixcbiAgTXR4Q29sb3JwaWNrZXJJbnB1dCxcbiAgTXR4Q29sb3JwaWNrZXJUb2dnbGUsXG59IGZyb20gJ0BuZy1tYXRlcm8vZXh0ZW5zaW9ucy9jb2xvcnBpY2tlcic7XG5pbXBvcnQgeyBHdWlGaWVsZExhYmVsIH0gZnJvbSAnLi4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpSWNvbkJ1dHRvbldyYXBwZXIgfSBmcm9tICcuLi9pY29uLWJ1dHRvbi13cmFwcGVyL2ljb24tYnV0dG9uLXdyYXBwZXInO1xuaW1wb3J0IHsgR3VpQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1maWxsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGwuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9maWxsLnNjc3MnLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktZmllbGQgZ3VpLWZpbGwnLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBHdWlGaWxsKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0UHJlZml4LFxuICAgIE1hdElucHV0LFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRIaW50LFxuICAgIE10eENvbG9ycGlja2VySW5wdXQsXG4gICAgTXR4Q29sb3JwaWNrZXIsXG4gICAgTXR4Q29sb3JwaWNrZXJUb2dnbGUsXG4gICAgR3VpRmllbGRMYWJlbCxcbiAgICBHdWlJY29uQnV0dG9uV3JhcHBlcixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRmlsbCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY29uZmlnOiBQYXJ0aWFsPEd1aUNvbnRyb2w+ID0ge307XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgdmFsdWUgPSAnJztcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVmFsdWVDaGFuZ2UoKSB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxufVxuIiwiPG1hdC1mb3JtLWZpZWxkPlxuICA8bmctY29udGFpbmVyIG1hdFByZWZpeD5cbiAgICA8c3BhbiBjbGFzcz1cImd1aS1jb2xvci1ibG9jay1lbXB0eVwiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImd1aS1jb2xvci1ibG9ja1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInZhbHVlXCI+PC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8aW5wdXRcbiAgICBtYXRJbnB1dFxuICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgW210eENvbG9ycGlja2VyXT1cImNwXCJcbiAgICAoY29sb3JDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgpXCJcbiAgLz5cblxuICA8bXR4LWNvbG9ycGlja2VyICNjcCAvPlxuICA8Z3VpLWljb24tYnV0dG9uLXdyYXBwZXIgbWF0U3VmZml4PlxuICAgIDxtdHgtY29sb3JwaWNrZXItdG9nZ2xlIFtmb3JdPVwiY3BcIiAvPlxuICA8L2d1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuXG4gIEBpZiAoY29uZmlnLnBhcmVudFR5cGUgPT09ICdpbmxpbmUnKSB7XG4gICAgPG1hdC1oaW50PlxuICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cImNvbmZpZ1wiIC8+XG4gICAgPC9tYXQtaGludD5cbiAgfVxuPC9tYXQtZm9ybS1maWVsZD5cbiJdfQ==
|
package/esm2022/gui-form.mjs
CHANGED
|
@@ -7,6 +7,8 @@ import { MatIcon } from '@angular/material/icon';
|
|
|
7
7
|
import { MatTab, MatTabContent, MatTabGroup, MatTabLabel } from '@angular/material/tabs';
|
|
8
8
|
import { Subscription, mergeWith, of } from 'rxjs';
|
|
9
9
|
import { GuiButtonToggle } from './button-toggle/button-toggle';
|
|
10
|
+
import { GuiCodearea } from './codearea/codearea';
|
|
11
|
+
import { GuiCombobox } from './combobox/combobox';
|
|
10
12
|
import { GuiFieldGroup } from './field-group/field-group';
|
|
11
13
|
import { GuiFieldLabel } from './field-label/field-label';
|
|
12
14
|
import { GuiFileUploader } from './file-uploader/file-uploader';
|
|
@@ -21,7 +23,6 @@ import { GuiSelect } from './select/select';
|
|
|
21
23
|
import { GuiSlider } from './slider/slider';
|
|
22
24
|
import { GuiSwitch } from './switch/switch';
|
|
23
25
|
import { GuiTextarea } from './textarea/textarea';
|
|
24
|
-
import { GuiCombobox } from './combobox/combobox';
|
|
25
26
|
import * as i0 from "@angular/core";
|
|
26
27
|
import * as i1 from "./gui-icons";
|
|
27
28
|
import * as i2 from "@angular/forms";
|
|
@@ -151,7 +152,7 @@ export class GuiForm {
|
|
|
151
152
|
const controls = item.showIf.conditions.map(c => getControl(c[0]));
|
|
152
153
|
const valueChanges$ = controls.map(control => control?.valueChanges || of());
|
|
153
154
|
const subscription = of()
|
|
154
|
-
.pipe(mergeWith(valueChanges$))
|
|
155
|
+
.pipe(mergeWith(...valueChanges$))
|
|
155
156
|
.subscribe(() => {
|
|
156
157
|
setVisibility(c => compareValues(getControl(c[0])?.value, c[2], c[1]));
|
|
157
158
|
});
|
|
@@ -252,10 +253,10 @@ export class GuiForm {
|
|
|
252
253
|
e.stopPropagation();
|
|
253
254
|
tabs.mode = mode;
|
|
254
255
|
}
|
|
255
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
256
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", 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 </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 ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [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 }\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 </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 <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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 }\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 </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 <button class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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 }\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 </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 </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 }\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: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.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 svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.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 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;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: .25rem;padding:.25rem;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:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;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", "aria-label", "aria-labelledby"], 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: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }, { kind: "component", type: GuiCombobox, selector: "gui-combobox", inputs: ["config", "disabled", "appendTo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
256
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiForm, deps: [{ token: i1.GuiIconsRegistry }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
257
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", 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 </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 ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [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 ('codearea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-codearea [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]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\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 <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\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 <button class=\"gui-list-item-title\" type=\"button\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\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]=\"{\n $implicit: controlItem, formGroup: form.get([item.key, menuChild.key])\n }\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: menuChild, formGroup: form.get(item.key)\n }\" />\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: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.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 svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.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 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;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: .25rem;padding:.25rem;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:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;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", "aria-label", "aria-labelledby"], 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: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }, { kind: "component", type: GuiCombobox, selector: "gui-combobox", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiCodearea, selector: "gui-codearea", inputs: ["config", "disabled", "setup", "height", "language"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
257
258
|
}
|
|
258
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
259
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GuiForm, decorators: [{
|
|
259
260
|
type: Component,
|
|
260
261
|
args: [{ selector: 'gui-form', host: {
|
|
261
262
|
'[attr.id]': 'uid',
|
|
@@ -289,7 +290,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
|
289
290
|
GuiIconButtonWrapper,
|
|
290
291
|
GuiEjsPipe,
|
|
291
292
|
GuiCombobox,
|
|
292
|
-
], 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 </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 ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [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 }\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 </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 <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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 }\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 </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 <button class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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 }\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 </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 </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 }\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: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.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 svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.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 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;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: .25rem;padding:.25rem;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:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
|
|
293
|
+
GuiCodearea,
|
|
294
|
+
], 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 </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 ('combobox') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-combobox [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 ('codearea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-codearea [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]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get(item.key)\n }\" />\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 <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\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 <button class=\"gui-list-item-title\" type=\"button\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\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 </gui-icon-button-wrapper>\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]=\"{\n $implicit: tab, parent: item, formGroup: form.get([item.key])\n }\" />\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]=\"{\n $implicit: child, parent: item, formGroup: form.get([item.key, i])\n }\" />\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]=\"{\n $implicit: controlItem, formGroup: form.get([item.key, menuChild.key])\n }\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{\n $implicit: menuChild, formGroup: form.get(item.key)\n }\" />\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: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:none}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.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 svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.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 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;color:inherit;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;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: .25rem;padding:.25rem;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:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
|
|
293
295
|
}], ctorParameters: () => [{ type: i1.GuiIconsRegistry }], propDecorators: { form: [{
|
|
294
296
|
type: Input
|
|
295
297
|
}], config: [{
|
|
@@ -299,4 +301,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
|
299
301
|
}], modelChange: [{
|
|
300
302
|
type: Output
|
|
301
303
|
}] } });
|
|
302
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFV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QUNULFNBQVMsdUZBQ1QsU0FBUyx1RkFDVCxlQUFlLDhGQUNmLE9BQU8scUZBQ1AsZUFBZSxpSkFDZixjQUFjLHlHQUNkLFdBQVcseUZBQ1gsY0FBYyxpRkFDZCxhQUFhLHlGQUNiLG9CQUFvQiwrREFDcEIsVUFBVSw0Q0FDVixXQUFXOzsyRkFHRixPQUFPO2tCQTFDbkIsU0FBUzsrQkFDRSxVQUFVLFFBR2Q7d0JBQ0osV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLE9BQU8sRUFBRSxVQUFVO3FCQUNwQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixPQUFPO3dCQUNQLFdBQVc7d0JBQ1gsTUFBTTt3QkFDTixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxTQUFTO3dCQUNULFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsVUFBVTt3QkFDVixXQUFXO3FCQUNaO3FGQU1RLElBQUk7c0JBQVosS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQge1xuICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgTWF0RXhwYW5zaW9uUGFuZWxDb250ZW50LFxuICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRhYiwgTWF0VGFiQ29udGVudCwgTWF0VGFiR3JvdXAsIE1hdFRhYkxhYmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIG1lcmdlV2l0aCwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgR3VpQnV0dG9uVG9nZ2xlIH0gZnJvbSAnLi9idXR0b24tdG9nZ2xlL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHsgR3VpRmllbGRHcm91cCB9IGZyb20gJy4vZmllbGQtZ3JvdXAvZmllbGQtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpRmllbGRMYWJlbCB9IGZyb20gJy4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkZXInO1xuaW1wb3J0IHsgR3VpRmlsbCB9IGZyb20gJy4vZmlsbC9maWxsJztcbmltcG9ydCB7IEd1aUVqc1BpcGUsIEd1aUZsZXhEaXJlY3RpdmUsIGNvbXBhcmVWYWx1ZXMsIGdldFZhbHVlQnlQYXRoIH0gZnJvbSAnLi9ndWktdXRpbHMnO1xuaW1wb3J0IHsgR3VpSWNvbkJ1dHRvbldyYXBwZXIgfSBmcm9tICcuL2ljb24tYnV0dG9uLXdyYXBwZXIvaWNvbi1idXR0b24td3JhcHBlcic7XG5pbXBvcnQgeyBHdWlJbWFnZVNlbGVjdCB9IGZyb20gJy4vaW1hZ2Utc2VsZWN0L2ltYWdlLXNlbGVjdCc7XG5pbXBvcnQgeyBHdWlJbmxpbmVHcm91cCB9IGZyb20gJy4vaW5saW5lLWdyb3VwL2lubGluZS1ncm91cCc7XG5pbXBvcnQgeyBHdWlJbnB1dE51bWJlciB9IGZyb20gJy4vaW5wdXQtbnVtYmVyL2lucHV0LW51bWJlcic7XG5pbXBvcnQgeyBHdWlJbnB1dFRleHQgfSBmcm9tICcuL2lucHV0LXRleHQvaW5wdXQtdGV4dCc7XG5pbXBvcnQgeyBHdWlDb25kaXRpb24sIEd1aUNvbnRyb2wsIEd1aUZpZWxkVHlwZSwgR3VpRmllbGRzLCBHdWlUYWJzTW9kZSB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IEd1aVNlbGVjdCB9IGZyb20gJy4vc2VsZWN0L3NlbGVjdCc7XG5pbXBvcnQgeyBHdWlTbGlkZXIgfSBmcm9tICcuL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHsgR3VpU3dpdGNoIH0gZnJvbSAnLi9zd2l0Y2gvc3dpdGNoJztcbmltcG9ydCB7IEd1aVRleHRhcmVhIH0gZnJvbSAnLi90ZXh0YXJlYS90ZXh0YXJlYSc7XG5cbmltcG9ydCB7IEd1aUljb25zUmVnaXN0cnkgfSBmcm9tICcuL2d1aS1pY29ucyc7XG5pbXBvcnQgeyBHdWlDb21ib2JveCB9IGZyb20gJy4vY29tYm9ib3gvY29tYm9ib3gnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpLWZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ndWktZm9ybS5zY3NzJyxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5pZF0nOiAndWlkJyxcbiAgICAnY2xhc3MnOiAnZ3VpLWZvcm0nLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbiAgICBNYXRFeHBhbnNpb25QYW5lbENvbnRlbnQsXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRhYkdyb3VwLFxuICAgIE1hdFRhYixcbiAgICBNYXRUYWJMYWJlbCxcbiAgICBNYXRUYWJDb250ZW50LFxuICAgIEd1aUZpZWxkR3JvdXAsXG4gICAgR3VpRmxleERpcmVjdGl2ZSxcbiAgICBHdWlJbnB1dFRleHQsXG4gICAgR3VpSW5wdXROdW1iZXIsXG4gICAgR3VpU2VsZWN0LFxuICAgIEd1aVN3aXRjaCxcbiAgICBHdWlTbGlkZXIsXG4gICAgR3VpQnV0dG9uVG9nZ2xlLFxuICAgIEd1aUZpbGwsXG4gICAgR3VpRmlsZVVwbG9hZGVyLFxuICAgIEd1aUltYWdlU2VsZWN0LFxuICAgIEd1aVRleHRhcmVhLFxuICAgIEd1aUlubGluZUdyb3VwLFxuICAgIEd1aUZpZWxkTGFiZWwsXG4gICAgR3VpSWNvbkJ1dHRvbldyYXBwZXIsXG4gICAgR3VpRWpzUGlwZSxcbiAgICBHdWlDb21ib2JveCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRm9ybSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGZvcm0gaW5zdGFuY2Ugd2hpY2ggYWxsb3cgdG8gdHJhY2sgbW9kZWwgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgQElucHV0KCkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IEd1aUZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIG1vZGVsIHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29udHJvbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIGZvcm1cbiAgdWlkID0gYGd1aS1mb3JtLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICBjb25zdHJ1Y3RvcihpY29uc1JlZ2lzdHJ5OiBHdWlJY29uc1JlZ2lzdHJ5KSB7XG4gICAgaWNvbnNSZWdpc3RyeS5hZGQoJ2hvcml6b250YWwnLCAndmVydGljYWwnLCAnY29weScsICdhZGQnLCAnZGVsZXRlJyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHMgPSB7fTsgLy8gcmVzZXQgY29udHJvbHNcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkodGhpcy5mb3JtLCB0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10gJiYgdGhpcy5tb2RlbCAmJiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHZhbHVlKTtcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnXG4gICkge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIC8vIEluZmVycmluZyB0aGUgZm9ybSB0eXBlIGJ5IHRoZSBkYXRhIHR5cGUgb2YgYGNoaWxkcmVuYFxuICAgICAgLy8gMS4gYHVuZGVmaW5lZGAgPT4gRm9ybUNvbnRyb2xcbiAgICAgIC8vIDIuIGBhcnJheWAgICAgID0+IEZvcm1BcnJheVxuICAgICAgLy8gMy4gYG9iamVjdGAgICAgPT4gRm9ybUdyb3VwXG4gICAgICBjb25zdCBfY2hpbGRyZW4gPSAoY29uZmlnIGFzIGFueSlba2V5XS50ZW1wbGF0ZSA/IFtdIDogKGNvbmZpZyBhcyBhbnkpW2tleV0uY2hpbGRyZW47XG4gICAgICBjb25zdCBfdHlwZSA9ICFfY2hpbGRyZW4gPyAnY29udHJvbCcgOiBBcnJheS5pc0FycmF5KF9jaGlsZHJlbikgPyAnYXJyYXknIDogJ2dyb3VwJztcblxuICAgICAgY29uc3QgaXRlbTogR3VpQ29udHJvbCA9IHtcbiAgICAgICAgX3R5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgbW9kZWw6IG1vZGVsW2tleV0sXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZT8uW2tleV0sXG4gICAgICAgIGluZGV4OiBOdW1iZXIoa2V5KSwgLy8gdGhlIHN0cmluZyBrZXkgd2lsbCBiZSBgTmFOYFxuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAuLi4oY29uZmlnIGFzIGFueSlba2V5XSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBgZ3JvdXBgIHR5cGUgZ2VuZXJhbGx5IGhhdmUgbm8gYGRlZmF1bHRgLCBzbyB3ZSBzaG91bGRcbiAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBtYW51YWxseVxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgbW9kZWxba2V5XSA9PSBudWxsICYmIGl0ZW0uZGVmYXVsdCA9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ubW9kZWwgPSBtb2RlbFtrZXldID0gaXRlbS5fdHlwZSA9PT0gJ2FycmF5JyA/IFtdIDoge307XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIG1vZGVsIGJ5IHRoZSBgZGVmYXVsdGAga2V5IG9mIHRoZSBmaWVsZCBjb25maWdcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdvYmplY3QnICYmIG1vZGVsW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBtb2RlbFtrZXldID0gaXRlbS5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGp1ZGdtZW50IG9uIGB0YWJzYCB0eXBlLCB0aGUgYGNoaWxkcmVuYCBrZXkgd2lsbCBiZSBpZ25vcmVkIGlmXG4gICAgICAvLyB0aGVyZSBoYXMgYSBgdGVtcGxhdGVgIGtleVxuICAgICAgaWYgKGl0ZW0udGVtcGxhdGUpIHtcbiAgICAgICAgLy8gSWYgbW9kZWwgaXMgYW4gYXJyYXkgYW5kIG5vdCBlbXB0eSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICAgICAgLy8gd2lsbCB1c2UgdGhlIG1vZGVsJ3MgdmFsdWVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5tb2RlbCkgJiYgaXRlbS5tb2RlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaXRlbS5kZWZhdWx0ID0gaXRlbS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5kZWZhdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gaXRlbS5kZWZhdWx0Lm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih2YWx1ZSwgaXRlbS50ZW1wbGF0ZT8uZGVmYXVsdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgLi4uaXRlbS50ZW1wbGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBgc2hvd0lmYCBjb25kaXRpb25zXG4gICAgICBpZiAoaXRlbS5zaG93SWYpIHtcbiAgICAgICAgY29uc3Qgc2V0VmlzaWJpbGl0eSA9IChjb21wYXJlV2l0aDogKGNvbmRpdGlvbjogR3VpQ29uZGl0aW9uKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uc2hvd0lmIS5sb2dpY2FsVHlwZSA9PT0gJyRvcicpIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLnNvbWUoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLmV2ZXJ5KGMgPT4gY29tcGFyZVdpdGgoYykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgdGhlIGluaXQgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGRcbiAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IHtcbiAgICAgICAgICBjb25zdCBjZmcgPSBnZXRWYWx1ZUJ5UGF0aChjb25maWcsIGNbMF0pID8/IGdldFZhbHVlQnlQYXRoKHRoaXMuY29uZmlnLCBjWzBdKTtcbiAgICAgICAgICBjb25zdCB2YWwgPSBnZXRWYWx1ZUJ5UGF0aChtb2RlbCwgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5tb2RlbCwgY1swXSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXModmFsID8/IGNmZz8uWydkZWZhdWx0J10sIGNbMl0sIGNbMV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWxheSB0aGUgc3Vic2NyaXB0aW9uIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGZvcm0gY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2V0Q29udHJvbCA9IChwYXRoOiBzdHJpbmcpID0+IGZvcm0uZ2V0KHBhdGgpIHx8IHRoaXMuZm9ybS5nZXQocGF0aCk7XG5cbiAgICAgICAgICBjb25zdCBjb250cm9scyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLm1hcChjID0+IGdldENvbnRyb2woY1swXSkpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyQgPSBjb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sPy52YWx1ZUNoYW5nZXMgfHwgb2YoKSk7XG4gICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb2YoKVxuICAgICAgICAgICAgLnBpcGUobWVyZ2VXaXRoKHZhbHVlQ2hhbmdlcyQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFZpc2liaWxpdHkoYyA9PiBjb21wYXJlVmFsdWVzKGdldENvbnRyb2woY1swXSk/LnZhbHVlLCBjWzJdLCBjWzFdKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uX3R5cGUgPT09ICdjb250cm9sJykge1xuICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7IHZhbHVlOiBpdGVtLmRlZmF1bHQsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH07XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1BcnJheSA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUFycmF5KFtdKSkgYXMgRm9ybUFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtQXJyYXksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1BcnJheSxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1Hcm91cCA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUdyb3VwKHt9KSkgYXMgRm9ybUdyb3VwO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtR3JvdXAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1Hcm91cCxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBjb3B5ICAgICAgV2hldGhlciB0byBjb3B5IHRoZSBjdXJyZW50IHRhYlxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgYWRkVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBjb3B5PzogYm9vbGVhbiwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGluc2VydEluZGV4ID1cbiAgICAgIGluZGV4ICE9PSB2b2lkIDAgPyBpbmRleCArIDEgOiBjb3B5ID8gdGFicy5zZWxlY3RlZEluZGV4ISArIDEgOiB0YWJzLmNoaWxkcmVuIS5sZW5ndGg7XG4gICAgLy8gU2F2ZSB0aGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBpbiB0aGUgY29uZmlnXG4gICAgdGFicy50ZW1wbGF0ZSEuaW5kZXggPSBpbnNlcnRJbmRleDtcbiAgICAvLyBUaGUga2V5IGluIHRoZSBvYmplY3QgYW5kIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghICs9IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtQXJyYXkuZ2V0KGluc2VydEluZGV4IC0gMSArICcnKT8udmFsdWU7XG4gICAgLy8gVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBsb29rcyBsaWtlIHRoaXMgYFt7IGtleTogJ3RhYicsIGNoaWxkcmVuOiB0ZW1wbGF0ZSB9XWBcbiAgICAvLyBUaGUga2V5IHNob3VsZCBwcmVmZXJhYmx5IGJlIGBudWxsYFxuICAgIGNvbnN0IG5ld1RhYiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB7IFtpbnNlcnRJbmRleF06IHRhYnMudGVtcGxhdGUgfSBhcyBHdWlGaWVsZHMsXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IHt9LFxuICAgICAgY29weSA/IHsgW2luc2VydEluZGV4XTogZm9ybVZhbHVlIH0gOiBudWxsLFxuICAgICAgJ3RhYnMnXG4gICAgKTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld1RhYlswXSk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGZvcm0gbW9kZWxcbiAgICBmb3JtQXJyYXkucGF0Y2hWYWx1ZShmb3JtQXJyYXkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybUFycmF5IFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgcmVtb3ZlVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBpbmRleCA9PT0gdm9pZCAwID8gdGFicy5zZWxlY3RlZEluZGV4ISA6IGluZGV4O1xuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID4gcmVtb3ZlSW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghIC09IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBtb2RlIG9mIHRhYnMuXG4gICAqXG4gICAqIEBwYXJhbSBlICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gdGFicyBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGFic1xuICAgKi9cbiAgY2hhbmdlVGFic01vZGUoZTogTW91c2VFdmVudCwgdGFiczogR3VpQ29udHJvbCwgbW9kZT86IEd1aVRhYnNNb2RlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0YWJzLm1vZGUgPSBtb2RlO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgQGZvciAoaXRlbSBvZiBmb3JtRmllbGRzOyB0cmFjayBpdGVtKSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm19XCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUeXBlIGxldC1pdGVtIGxldC1wYXJlbnQ9XCJwYXJlbnRcIiBsZXQtZm9ybT1cImZvcm1Hcm91cFwiPlxuICBAaWYgKGl0ZW0uc2hvdykge1xuICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgICBAc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgQGNhc2UgKCd0ZXh0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW5wdXQtdGV4dCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ251bWJlcicpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWlucHV0LW51bWJlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3N3aXRjaCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXN3aXRjaCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3NsaWRlcicpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXNsaWRlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2J1dHRvblRvZ2dsZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWJ1dHRvbi10b2dnbGUgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdmaWxsJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsbCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ZpbGUnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnaW1hZ2UnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJpbWFnZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndmlkZW8nKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJ2aWRlb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnYXVkaW8nKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJhdWRpb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnaW1hZ2VTZWxlY3QnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbWFnZS1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIFthcHBlbmRUb109XCInIycrdWlkXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2NvbWJvYm94Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktY29tYm9ib3ggW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIFthcHBlbmRUb109XCInIycrdWlkXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktdGV4dGFyZWEgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdoaWRkZW4nKSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbmxpbmUnKSB7XG4gICAgICAgICAgPGd1aS1pbmxpbmUtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9ndWktaW5saW5lLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZ3JvdXAnKSB7XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGFicycpIHtcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUFycmF5TmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJpdGVtLmV4cGFuZGVkXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgICAgICA8IS0tIFNob3cgb3BlcmF0aW9uIGJ1dHRvbnMgd2hlbiBwYW5lbCBvcGVuZWQgLS0+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIDxndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlIT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdub3JtYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImhvcml6b250YWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFic01vZGUoJGV2ZW50LCBpdGVtLCAnbGlzdCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwidmVydGljYWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvcHlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZ3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLm1vZGUhPT0nbGlzdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIEhvcml6b250YWwgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS10YWJzXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgW21hdC1zdHJldGNoLXRhYnNdPVwiZmFsc2VcIiBbKHNlbGVjdGVkSW5kZXgpXT1cIml0ZW0uc2VsZWN0ZWRJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRhYi5jaGlsZHJlbj8ubGVuZ3RoPjAgJiYgdGFiLnR5cGUhPT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIFZlcnRpY2FsIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWIgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmd1aS1saXN0LWl0ZW0tYWN0aXZlXT1cIml0ZW0uc2VsZWN0ZWRJbmRleD09PWlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtLnNlbGVjdGVkSW5kZXg9aVwiPnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29weVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGZhbHNlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkZWxldGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2d1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUNvbnRyb2wgJiBGb3JtQXJyYXkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtZW51Jykge1xuICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLW1lbnVcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICAgICAgICBAZm9yIChtZW51Q2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgbWVudUNoaWxkKSB7XG4gICAgICAgICAgICAgIDxtYXQtdGFiIFtsYWJlbF09XCJtZW51Q2hpbGQubmFtZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnVDaGlsZC5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51SXRlbScpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNdXN0IHdyYXAgd2l0aCBkaXYgLS0+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbnRyb2xJdGVtIG9mIG1lbnVDaGlsZC5jaGlsZHJlbjsgdHJhY2sgY29udHJvbEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cIm1lbnVDaGlsZC5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjb250cm9sSXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIG1lbnVDaGlsZC5rZXldKX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIFN1cHBvcnQgZm9yIHVubGltaXRlZCBuZXN0aW5nIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBtZW51Q2hpbGQsIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvbmctY29udGFpbmVyPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVB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RkFDYixnQkFBZ0IscUVBQ2hCLFlBQVksMkZBQ1osY0FBYyw2RkFDZCxTQUFTLHVGQUNULFNBQVMsdUZBQ1QsU0FBUyx1RkFDVCxlQUFlLDhGQUNmLE9BQU8scUZBQ1AsZUFBZSxpSkFDZixjQUFjLHlHQUNkLFdBQVcseUZBQ1gsY0FBYyxpRkFDZCxhQUFhLHlGQUNiLG9CQUFvQiwrREFDcEIsVUFBVSw0Q0FDVixXQUFXLHFHQUNYLFdBQVc7OzRGQUdGLE9BQU87a0JBM0NuQixTQUFTOytCQUNFLFVBQVUsUUFHZDt3QkFDSixXQUFXLEVBQUUsS0FBSzt3QkFDbEIsT0FBTyxFQUFFLFVBQVU7cUJBQ3BCLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsZ0JBQWdCO3dCQUNoQixpQkFBaUI7d0JBQ2pCLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixhQUFhO3dCQUNiLE9BQU87d0JBQ1AsV0FBVzt3QkFDWCxNQUFNO3dCQUNOLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxTQUFTO3dCQUNULGVBQWU7d0JBQ2YsT0FBTzt3QkFDUCxlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxjQUFjO3dCQUNkLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixVQUFVO3dCQUNWLFdBQVc7d0JBQ1gsV0FBVztxQkFDWjtxRkFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtcbiAgTWF0RXhwYW5zaW9uUGFuZWwsXG4gIE1hdEV4cGFuc2lvblBhbmVsQ29udGVudCxcbiAgTWF0RXhwYW5zaW9uUGFuZWxIZWFkZXIsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkNvbnRlbnQsIE1hdFRhYkdyb3VwLCBNYXRUYWJMYWJlbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZVdpdGgsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEd1aUJ1dHRvblRvZ2dsZSB9IGZyb20gJy4vYnV0dG9uLXRvZ2dsZS9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IEd1aUNvZGVhcmVhIH0gZnJvbSAnLi9jb2RlYXJlYS9jb2RlYXJlYSc7XG5pbXBvcnQgeyBHdWlDb21ib2JveCB9IGZyb20gJy4vY29tYm9ib3gvY29tYm9ib3gnO1xuaW1wb3J0IHsgR3VpRmllbGRHcm91cCB9IGZyb20gJy4vZmllbGQtZ3JvdXAvZmllbGQtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpRmllbGRMYWJlbCB9IGZyb20gJy4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpRmlsZVVwbG9hZGVyIH0gZnJvbSAnLi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkZXInO1xuaW1wb3J0IHsgR3VpRmlsbCB9IGZyb20gJy4vZmlsbC9maWxsJztcbmltcG9ydCB7IEd1aUVqc1BpcGUsIEd1aUZsZXhEaXJlY3RpdmUsIGNvbXBhcmVWYWx1ZXMsIGdldFZhbHVlQnlQYXRoIH0gZnJvbSAnLi9ndWktdXRpbHMnO1xuaW1wb3J0IHsgR3VpSWNvbkJ1dHRvbldyYXBwZXIgfSBmcm9tICcuL2ljb24tYnV0dG9uLXdyYXBwZXIvaWNvbi1idXR0b24td3JhcHBlcic7XG5pbXBvcnQgeyBHdWlJbWFnZVNlbGVjdCB9IGZyb20gJy4vaW1hZ2Utc2VsZWN0L2ltYWdlLXNlbGVjdCc7XG5pbXBvcnQgeyBHdWlJbmxpbmVHcm91cCB9IGZyb20gJy4vaW5saW5lLWdyb3VwL2lubGluZS1ncm91cCc7XG5pbXBvcnQgeyBHdWlJbnB1dE51bWJlciB9IGZyb20gJy4vaW5wdXQtbnVtYmVyL2lucHV0LW51bWJlcic7XG5pbXBvcnQgeyBHdWlJbnB1dFRleHQgfSBmcm9tICcuL2lucHV0LXRleHQvaW5wdXQtdGV4dCc7XG5pbXBvcnQgeyBHdWlDb25kaXRpb24sIEd1aUNvbnRyb2wsIEd1aUZpZWxkVHlwZSwgR3VpRmllbGRzLCBHdWlUYWJzTW9kZSB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IEd1aVNlbGVjdCB9IGZyb20gJy4vc2VsZWN0L3NlbGVjdCc7XG5pbXBvcnQgeyBHdWlTbGlkZXIgfSBmcm9tICcuL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHsgR3VpU3dpdGNoIH0gZnJvbSAnLi9zd2l0Y2gvc3dpdGNoJztcbmltcG9ydCB7IEd1aVRleHRhcmVhIH0gZnJvbSAnLi90ZXh0YXJlYS90ZXh0YXJlYSc7XG5cbmltcG9ydCB7IEd1aUljb25zUmVnaXN0cnkgfSBmcm9tICcuL2d1aS1pY29ucyc7XG5cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdndWktZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWktZm9ybS5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2d1aS1mb3JtLnNjc3MnLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICd1aWQnLFxuICAgICdjbGFzcyc6ICdndWktZm9ybScsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE1hdEV4cGFuc2lvblBhbmVsLFxuICAgIE1hdEV4cGFuc2lvblBhbmVsSGVhZGVyLFxuICAgIE1hdEV4cGFuc2lvblBhbmVsQ29udGVudCxcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdEljb24sXG4gICAgTWF0VGFiR3JvdXAsXG4gICAgTWF0VGFiLFxuICAgIE1hdFRhYkxhYmVsLFxuICAgIE1hdFRhYkNvbnRlbnQsXG4gICAgR3VpRmllbGRHcm91cCxcbiAgICBHdWlGbGV4RGlyZWN0aXZlLFxuICAgIEd1aUlucHV0VGV4dCxcbiAgICBHdWlJbnB1dE51bWJlcixcbiAgICBHdWlTZWxlY3QsXG4gICAgR3VpU3dpdGNoLFxuICAgIEd1aVNsaWRlcixcbiAgICBHdWlCdXR0b25Ub2dnbGUsXG4gICAgR3VpRmlsbCxcbiAgICBHdWlGaWxlVXBsb2FkZXIsXG4gICAgR3VpSW1hZ2VTZWxlY3QsXG4gICAgR3VpVGV4dGFyZWEsXG4gICAgR3VpSW5saW5lR3JvdXAsXG4gICAgR3VpRmllbGRMYWJlbCxcbiAgICBHdWlJY29uQnV0dG9uV3JhcHBlcixcbiAgICBHdWlFanNQaXBlLFxuICAgIEd1aUNvbWJvYm94LFxuICAgIEd1aUNvZGVhcmVhLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlGb3JtIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBpbnN0YW5jZSB3aGljaCBhbGxvdyB0byB0cmFjayBtb2RlbCB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMuXG4gICAqL1xuICBASW5wdXQoKSBmb3JtID0gbmV3IEZvcm1Hcm91cDxhbnk+KHt9KTtcblxuICAvKipcbiAgICogVGhlIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBidWlsZGluZyB0aGUgZm9ybS5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogR3VpRmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byBiZSByZXByZXNlbnRlZCBieSB0aGUgZm9ybS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGVsOiBhbnkgPSB7fTtcblxuICAvKipcbiAgICogRmlyZWQgb24gbW9kZWwgdmFsdWUgY2hhbmdlXG4gICAqL1xuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZm9ybUZpZWxkczogR3VpQ29udHJvbFtdID0gW107XG5cbiAgZm9ybVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICBjb250cm9sU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgZm9ybVxuICB1aWQgPSBgZ3VpLWZvcm0tJHtuZXh0VW5pcXVlSWQrK31gO1xuXG4gIGNvbnN0cnVjdG9yKGljb25zUmVnaXN0cnk6IEd1aUljb25zUmVnaXN0cnkpIHtcbiAgICBpY29uc1JlZ2lzdHJ5LmFkZCgnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCcsICdjb3B5JywgJ2FkZCcsICdkZWxldGUnKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scyA9IHt9OyAvLyByZXNldCBjb250cm9sc1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheSh0aGlzLmZvcm0sIHRoaXMuY29uZmlnLCB0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSAmJiB0aGlzLm1vZGVsICYmIE9iamVjdC5rZXlzKHRoaXMubW9kZWwpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbCwgdmFsdWUpO1xuICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgb2JqZWN0IGNvbmZpZyB0byBhcnJheSBjb25maWcgYW5kIHJlZ2lzdGVyIGludG8gdGhlIHJlYWN0aXZlIGZvcm0uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtICAgICAgICAgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIGNvbmZpZyAgICAgICBUaGUgY29uZmlnIG9mIHRoZSBmb3JtIGZpZWxkc1xuICAgKiBAcGFyYW0gbW9kZWwgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICogQHBhcmFtIHBhcmVudFR5cGUgICBUaGUgdHlwZSBvZiB0aGUgZm9ybSBmaWVsZCBwYXJlbnRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldEZvcm1GaWVsZEFycmF5KFxuICAgIGZvcm06IEZvcm1Hcm91cCB8IEZvcm1BcnJheSxcbiAgICBjb25maWc6IEd1aUZpZWxkcyB8IEd1aUNvbnRyb2xbXSA9IHt9LFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4gICAgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsLFxuICAgIHBhcmVudFR5cGU6IEd1aUZpZWxkVHlwZSA9ICdncm91cCdcbiAgKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xuICAgICAgLy8gSW5mZXJyaW5nIHRoZSBmb3JtIHR5cGUgYnkgdGhlIGRhdGEgdHlwZSBvZiBgY2hpbGRyZW5gXG4gICAgICAvLyAxLiBgdW5kZWZpbmVkYCA9PiBGb3JtQ29udHJvbFxuICAgICAgLy8gMi4gYGFycmF5YCAgICAgPT4gRm9ybUFycmF5XG4gICAgICAvLyAzLiBgb2JqZWN0YCAgICA9PiBGb3JtR3JvdXBcbiAgICAgIGNvbnN0IF9jaGlsZHJlbiA9IChjb25maWcgYXMgYW55KVtrZXldLnRlbXBsYXRlID8gW10gOiAoY29uZmlnIGFzIGFueSlba2V5XS5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IF90eXBlID0gIV9jaGlsZHJlbiA/ICdjb250cm9sJyA6IEFycmF5LmlzQXJyYXkoX2NoaWxkcmVuKSA/ICdhcnJheScgOiAnZ3JvdXAnO1xuXG4gICAgICBjb25zdCBpdGVtOiBHdWlDb250cm9sID0ge1xuICAgICAgICBfdHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICBtb2RlbDogbW9kZWxba2V5XSxcbiAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlPy5ba2V5XSxcbiAgICAgICAgaW5kZXg6IE51bWJlcihrZXkpLCAvLyB0aGUgc3RyaW5nIGtleSB3aWxsIGJlIGBOYU5gXG4gICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgIC4uLihjb25maWcgYXMgYW55KVtrZXldLFxuICAgICAgfTtcblxuICAgICAgLy8gVGhlIGBncm91cGAgdHlwZSBnZW5lcmFsbHkgaGF2ZSBubyBgZGVmYXVsdGAsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG1hbnVhbGx5XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBtb2RlbFtrZXldID09IG51bGwgJiYgaXRlbS5kZWZhdWx0ID09IG51bGwpIHtcbiAgICAgICAgaXRlbS5tb2RlbCA9IG1vZGVsW2tleV0gPSBpdGVtLl90eXBlID09PSAnYXJyYXknID8gW10gOiB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbW9kZWwgYnkgdGhlIGBkZWZhdWx0YCBrZXkgb2YgdGhlIGZpZWxkIGNvbmZpZ1xuICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ29iamVjdCcgJiYgbW9kZWxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIG1vZGVsW2tleV0gPSBpdGVtLmRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwZWNpYWwganVkZ21lbnQgb24gYHRhYnNgIHR5cGUsIHRoZSBgY2hpbGRyZW5gIGtleSB3aWxsIGJlIGlnbm9yZWQgaWZcbiAgICAgIC8vIHRoZXJlIGhhcyBhIGB0ZW1wbGF0ZWAga2V5XG4gICAgICBpZiAoaXRlbS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBJZiBtb2RlbCBpcyBhbiBhcnJheSBhbmQgbm90IGVtcHR5LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZm9ybSBmaWVsZFxuICAgICAgICAvLyB3aWxsIHVzZSB0aGUgbW9kZWwncyB2YWx1ZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtLm1vZGVsKSAmJiBpdGVtLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpdGVtLmRlZmF1bHQgPSBpdGVtLm1vZGVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmRlZmF1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBpdGVtLmRlZmF1bHQubWFwKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHZhbHVlLCBpdGVtLnRlbXBsYXRlPy5kZWZhdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlLFxuICAgICAgICAgICAgICAuLi5pdGVtLnRlbXBsYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgdGhlIGBzaG93SWZgIGNvbmRpdGlvbnNcbiAgICAgIGlmIChpdGVtLnNob3dJZikge1xuICAgICAgICBjb25zdCBzZXRWaXNpYmlsaXR5ID0gKGNvbXBhcmVXaXRoOiAoY29uZGl0aW9uOiBHdWlDb25kaXRpb24pID0+IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5zaG93SWYhLmxvZ2ljYWxUeXBlID09PSAnJG9yJykge1xuICAgICAgICAgICAgaXRlbS5zaG93ID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMuc29tZShjID0+IGNvbXBhcmVXaXRoKGMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5zaG93ID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMuZXZlcnkoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCB0aGUgaW5pdCB2aXNpYmlsaXR5IG9mIHRoZSBmaWVsZFxuICAgICAgICBzZXRWaXNpYmlsaXR5KGMgPT4ge1xuICAgICAgICAgIGNvbnN0IGNmZyA9IGdldFZhbHVlQnlQYXRoKGNvbmZpZywgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5jb25maWcsIGNbMF0pO1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGdldFZhbHVlQnlQYXRoKG1vZGVsLCBjWzBdKSA/PyBnZXRWYWx1ZUJ5UGF0aCh0aGlzLm1vZGVsLCBjWzBdKTtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZVZhbHVlcyh2YWwgPz8gY2ZnPy5bJ2RlZmF1bHQnXSwgY1syXSwgY1sxXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlbGF5IHRoZSBzdWJzY3JpcHRpb24gdG8gbWFrZSBzdXJlIGFsbCB0aGUgZm9ybSBjb250cm9scyBoYXZlIGJlZW4gY3JlYXRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBnZXRDb250cm9sID0gKHBhdGg6IHN0cmluZykgPT4gZm9ybS5nZXQocGF0aCkgfHwgdGhpcy5mb3JtLmdldChwYXRoKTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gaXRlbS5zaG93SWYhLmNvbmRpdGlvbnMubWFwKGMgPT4gZ2V0Q29udHJvbChjWzBdKSk7XG4gICAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2VzJCA9IGNvbnRyb2xzLm1hcChjb250cm9sID0+IGNvbnRyb2w/LnZhbHVlQ2hhbmdlcyB8fCBvZigpKTtcbiAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvZigpXG4gICAgICAgICAgICAucGlwZShtZXJnZVdpdGgoLi4udmFsdWVDaGFuZ2VzJCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IGNvbXBhcmVWYWx1ZXMoZ2V0Q29udHJvbChjWzBdKT8udmFsdWUsIGNbMl0sIGNbMV0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5jb250cm9sU3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5fdHlwZSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHsgdmFsdWU6IGl0ZW0uZGVmYXVsdCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZWQgfTtcbiAgICAgICAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICBmb3JtLnJlZ2lzdGVyQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgbGV0IGZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXk8YW55PihbXSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUFycmF5ID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQXJyYXkoW10pKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1BcnJheSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5jaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICAgICAgZm9ybUFycmF5LFxuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4sXG4gICAgICAgICAgaXRlbS5tb2RlbCxcbiAgICAgICAgICBpdGVtLmRlZmF1bHQsXG4gICAgICAgICAgaXRlbS50eXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaXRlbS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5fdHlwZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBsZXQgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybUdyb3VwID0gZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtR3JvdXAoe30pKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgIGZvcm0uaW5zZXJ0KGl0ZW0uaW5kZXggfHwgZm9ybS5sZW5ndGgsIGZvcm1Hcm91cCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5jaGlsZHJlbiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICAgICAgZm9ybUdyb3VwLFxuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4sXG4gICAgICAgICAgaXRlbS5tb2RlbCxcbiAgICAgICAgICBpdGVtLmRlZmF1bHQsXG4gICAgICAgICAgaXRlbS50eXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRlbXBBcnIucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVtcEFycjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB0YWIgaXRlbS5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgICAgICBUaGUgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGZvcm1BcnJheSBUaGUgcmVhY3RpdmUgZm9ybSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGFicyAgICAgIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIGNvcHkgICAgICBXaGV0aGVyIHRvIGNvcHkgdGhlIGN1cnJlbnQgdGFiXG4gICAqIEBwYXJhbSBpbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSB0YWJzIGFycmF5XG4gICAqL1xuICBhZGRUYWIoZTogTW91c2VFdmVudCwgZm9ybUFycmF5OiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGNvcHk/OiBib29sZWFuLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgaW5zZXJ0SW5kZXggPVxuICAgICAgaW5kZXggIT09IHZvaWQgMCA/IGluZGV4ICsgMSA6IGNvcHkgPyB0YWJzLnNlbGVjdGVkSW5kZXghICsgMSA6IHRhYnMuY2hpbGRyZW4hLmxlbmd0aDtcbiAgICAvLyBTYXZlIHRoZSBpbmRleCBvZiB0aGUgaW5zZXJ0aW9uIGluIHRoZSBjb25maWdcbiAgICB0YWJzLnRlbXBsYXRlIS5pbmRleCA9IGluc2VydEluZGV4O1xuICAgIC8vIFRoZSBrZXkgaW4gdGhlIG9iamVjdCBhbmQgdGhlIGluZGV4IGluIHRoZSBhcnJheSBzaG91bGQgYmUgdGhlIHNhbWVcbiAgICB0YWJzLmNoaWxkcmVuIS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA+PSBpbnNlcnRJbmRleCkge1xuICAgICAgICBjaGlsZC5pbmRleCEgKz0gMTtcbiAgICAgICAgY2hpbGQua2V5ID0gY2hpbGQuaW5kZXggKyAnJzsgLy8gY29udmVydCB0byBzdHJpbmdcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm1BcnJheS5nZXQoaW5zZXJ0SW5kZXggLSAxICsgJycpPy52YWx1ZTtcbiAgICAvLyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IGxvb2tzIGxpa2UgdGhpcyBgW3sga2V5OiAndGFiJywgY2hpbGRyZW46IHRlbXBsYXRlIH1dYFxuICAgIC8vIFRoZSBrZXkgc2hvdWxkIHByZWZlcmFibHkgYmUgYG51bGxgXG4gICAgY29uc3QgbmV3VGFiID0gdGhpcy5nZXRGb3JtRmllbGRBcnJheShcbiAgICAgIGZvcm1BcnJheSxcbiAgICAgIHsgW2luc2VydEluZGV4XTogdGFicy50ZW1wbGF0ZSB9IGFzIEd1aUZpZWxkcyxcbiAgICAgIGNvcHkgPyB7IFtpbnNlcnRJbmRleF06IGZvcm1WYWx1ZSB9IDoge30sXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IG51bGwsXG4gICAgICAndGFicydcbiAgICApO1xuICAgIHRhYnMuY2hpbGRyZW4hLnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3VGFiWzBdKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgZm9ybSBtb2RlbFxuICAgIGZvcm1BcnJheS5wYXRjaFZhbHVlKGZvcm1BcnJheS52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBpbmRleCAgICAgVGhlIGluZGV4IG9mIHRoZSB0YWJzIGFycmF5XG4gICAqL1xuICByZW1vdmVUYWIoZTogTW91c2VFdmVudCwgZm9ybUFycmF5OiBGb3JtQXJyYXksIHRhYnM6IEd1aUNvbnRyb2wsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IGluZGV4ID09PSB2b2lkIDAgPyB0YWJzLnNlbGVjdGVkSW5kZXghIDogaW5kZXg7XG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPiByZW1vdmVJbmRleCkge1xuICAgICAgICBjaGlsZC5pbmRleCEgLT0gMTtcbiAgICAgICAgY2hpbGQua2V5ID0gY2hpbGQuaW5kZXggKyAnJzsgLy8gY29udmVydCB0byBzdHJpbmdcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIGZvcm1BcnJheS5yZW1vdmVBdChyZW1vdmVJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBkaXNwbGF5IG1vZGUgb2YgdGFicy5cbiAgICpcbiAgICogQHBhcmFtIGUgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSB0YWJzIFRoZSBjb25maWcgb2YgdGhlIHRhYnMgZmllbGRcbiAgICogQHBhcmFtIG1vZGUgVGhlIGRpc3BsYXkgbW9kZSBvZiB0YWJzXG4gICAqL1xuICBjaGFuZ2VUYWJzTW9kZShlOiBNb3VzZUV2ZW50LCB0YWJzOiBHdWlDb250cm9sLCBtb2RlPzogR3VpVGFic01vZGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRhYnMubW9kZSA9IG1vZGU7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICBAZm9yIChpdGVtIG9mIGZvcm1GaWVsZHM7IHRyYWNrIGl0ZW0pIHtcbiAgICA8ZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybX1cIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFR5cGUgbGV0LWl0ZW0gbGV0LXBhcmVudD1cInBhcmVudFwiIGxldC1mb3JtPVwiZm9ybUdyb3VwXCI+XG4gIEBpZiAoaXRlbS5zaG93KSB7XG4gICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICBAY2FzZSAoJ3RleHQnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbnB1dC10ZXh0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW5wdXQtbnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2VsZWN0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc3dpdGNoJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc3dpdGNoIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2xpZGVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2xpZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnYnV0dG9uVG9nZ2xlJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktYnV0dG9uLXRvZ2dsZSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ZpbGwnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxsIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZmlsZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImltYWdlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd2aWRlbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cInZpZGVvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdhdWRpbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImF1ZGlvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZVNlbGVjdCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWltYWdlLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgW2FwcGVuZFRvXT1cIicjJyt1aWRcIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnY29tYm9ib3gnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1jb21ib2JveCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgW2FwcGVuZFRvXT1cIicjJyt1aWRcIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS10ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2NvZGVhcmVhJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktY29kZWFyZWEgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdoaWRkZW4nKSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbmxpbmUnKSB7XG4gICAgICAgICAgPGd1aS1pbmxpbmUtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSlcbiAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2d1aS1pbmxpbmUtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdncm91cCcpIHtcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJpdGVtLmV4cGFuZGVkXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgIDwhLS0gTGF6eSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICBAZm9yIChjaGlsZCBvZiBpdGVtLmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSlcbiAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGFicycpIHtcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUFycmF5TmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJpdGVtLmV4cGFuZGVkXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgICAgICA8IS0tIFNob3cgb3BlcmF0aW9uIGJ1dHRvbnMgd2hlbiBwYW5lbCBvcGVuZWQgLS0+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIDxndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlIT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdub3JtYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImhvcml6b250YWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFic01vZGUoJGV2ZW50LCBpdGVtLCAnbGlzdCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwidmVydGljYWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvcHlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZ3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLm1vZGUhPT0nbGlzdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIEhvcml6b250YWwgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS10YWJzXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgW21hdC1zdHJldGNoLXRhYnNdPVwiZmFsc2VcIiBbKHNlbGVjdGVkSW5kZXgpXT1cIml0ZW0uc2VsZWN0ZWRJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtR3JvdXAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZCBvZiB0YWIuY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPCEtLSBWZXJ0aWNhbCBtb2RlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ndWktbGlzdC1pdGVtLWFjdGl2ZV09XCJpdGVtLnNlbGVjdGVkSW5kZXg9PT1pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW0taGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImd1aS1saXN0LWl0ZW0tdGl0bGVcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIml0ZW0uc2VsZWN0ZWRJbmRleD1pXCI+e3t0YWIubmFtZSB8IGVqczp7aX0gfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGd1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCB0cnVlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJjb3B5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgZmFsc2UsIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImFkZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIXRhYi5jaGlsZHJlbiB8fCB0YWIuY2hpbGRyZW4ubGVuZ3RoPT09MCB8fCB0YWIudHlwZT09PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodGFiLmNoaWxkcmVuPy5sZW5ndGg+MCAmJiB0YWIudHlwZSE9PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZCBvZiB0YWIuY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgaV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ21lbnUnKSB7XG4gICAgICAgICAgPG1hdC10YWItZ3JvdXAgY2xhc3M9XCJndWktbWVudVwiIFtmb3JtR3JvdXBOYW1lXT1cIml0ZW0ua2V5XCIgZGlzYWJsZVJpcHBsZT5cbiAgICAgICAgICAgIEBmb3IgKG1lbnVDaGlsZCBvZiBpdGVtLmNoaWxkcmVuOyB0cmFjayBtZW51Q2hpbGQpIHtcbiAgICAgICAgICAgICAgPG1hdC10YWIgW2xhYmVsXT1cIm1lbnVDaGlsZC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudUNoaWxkLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdFRhYkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICBAaWYgKG1lbnVDaGlsZC50eXBlPT09J21lbnVJdGVtJykge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIE11c3Qgd3JhcCB3aXRoIGRpdiAtLT5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29udHJvbEl0ZW0gb2YgbWVudUNoaWxkLmNoaWxkcmVuOyB0cmFjayBjb250cm9sSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwibWVudUNoaWxkLmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbnRyb2xJdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgbWVudUNoaWxkLmtleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIFN1cHBvcnQgZm9yIHVubGltaXRlZCBuZXN0aW5nIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IG1lbnVDaGlsZCwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9uZy1jb250YWluZXI+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|