UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

68 lines 29.5 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ChangeDetectorRef, Component, EventEmitter, Input, Output, } from "@angular/core"; import { FormBuilder } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "@nova-ui/bits"; import * as i4 from "../../../widget-editor-accordion/widget-editor-accordion.component"; import * as i5 from "../../../../pipe/widget-editor-accordion-form-state.pipe"; export class EntityFormattingConfigurationComponent { static { this.lateLoadKey = "EntityFormattingComponent"; } constructor(changeDetector, formBuilder) { this.changeDetector = changeDetector; this.formBuilder = formBuilder; this.formReady = new EventEmitter(); this.form = this.formBuilder.group({ dataFieldIds: this.formBuilder.group({ icon: "", status: "", detailedUrl: "", label: "", url: "", }), }); } ngOnInit() { this.formReady.emit(this.form); } ngOnChanges(changes) { if (changes.dataFieldIds) { this.getFieldMappingsControl.setValue(changes.dataFieldIds.currentValue); } } get getFieldMappingsControl() { return this.form.get("dataFieldIds"); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityFormattingConfigurationComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EntityFormattingConfigurationComponent, selector: "nui-entity-formatting-configuration", inputs: { mappingKeys: "mappingKeys", dataFieldIds: "dataFieldIds" }, outputs: { formReady: "formReady" }, usesOnChanges: true, ngImport: i0, template: "<nui-widget-editor-accordion\n [formGroup]=\"form\"\n [state]=\"form | nuiWidgetEditorAccordionFormState | async\"\n>\n <div accordionHeader class=\"d-flex align-items-center px-4 py-2\">\n <nui-icon\n class=\"align-self-start pt-2\"\n [icon]=\"'tag'\"\n iconColor=\"gray\"\n ></nui-icon>\n <div class=\"d-flex flex-column ml-4 pt-1\">\n <span class=\"nui-text-label\" i18n>Entity formatting</span>\n <div class=\"nui-text-secondary\" title=\"Show status icon\">\n Show status icon\n </div>\n </div>\n </div>\n <div\n class=\"entity-formatting__accordion-content\"\n formGroupName=\"dataFieldIds\"\n >\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Icon</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('icon')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"icon\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Status</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('status')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"status\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Details URL</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('detailedUrl')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"detailedUrl\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Label</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('label')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"label\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Label URL</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('url')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"url\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n </div>\n</nui-widget-editor-accordion>\n", styles: [".entity-formatting__accordion-content{padding:15px 15px 15px 46px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i3.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "component", type: i3.FormFieldComponent, selector: "nui-form-field", inputs: ["control", "caption", "info", "infoTemplate", "hint", "hintTemplate", "customBoxWidth", "showOptionalText"] }, { kind: "component", type: i3.SelectV2Component, selector: "nui-select-v2", inputs: ["displayValueTemplate"] }, { kind: "component", type: i3.SelectV2OptionComponent, selector: "nui-select-v2-option", inputs: ["value", "index", "displayValueContext", "outfiltered"] }, { kind: "component", type: i4.WidgetEditorAccordionComponent, selector: "nui-widget-editor-accordion", inputs: ["showOpenStateIcon", "state"], outputs: ["openToggle"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.WidgetEditorAccordionFormStatePipe, name: "nuiWidgetEditorAccordionFormState" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityFormattingConfigurationComponent, decorators: [{ type: Component, args: [{ selector: "nui-entity-formatting-configuration", template: "<nui-widget-editor-accordion\n [formGroup]=\"form\"\n [state]=\"form | nuiWidgetEditorAccordionFormState | async\"\n>\n <div accordionHeader class=\"d-flex align-items-center px-4 py-2\">\n <nui-icon\n class=\"align-self-start pt-2\"\n [icon]=\"'tag'\"\n iconColor=\"gray\"\n ></nui-icon>\n <div class=\"d-flex flex-column ml-4 pt-1\">\n <span class=\"nui-text-label\" i18n>Entity formatting</span>\n <div class=\"nui-text-secondary\" title=\"Show status icon\">\n Show status icon\n </div>\n </div>\n </div>\n <div\n class=\"entity-formatting__accordion-content\"\n formGroupName=\"dataFieldIds\"\n >\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Icon</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('icon')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"icon\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Status</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('status')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"status\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Details URL</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('detailedUrl')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"detailedUrl\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Label</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('label')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"label\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"nui-text-label\" i18n>Label URL</label>\n <div class=\"d-flex flex-grow-1\">\n <nui-form-field\n class=\"d-flex flex-grow-1\"\n [control]=\"getFieldMappingsControl.get('url')\"\n >\n <nui-select-v2\n placeholder=\"Select Item\"\n i18n-placeholder\n formControlName=\"url\"\n >\n <nui-select-v2-option\n *ngFor=\"let item of mappingKeys\"\n [value]=\"item\"\n >\n {{ item }}\n </nui-select-v2-option>\n </nui-select-v2>\n </nui-form-field>\n </div>\n </div>\n </div>\n</nui-widget-editor-accordion>\n", styles: [".entity-formatting__accordion-content{padding:15px 15px 15px 46px}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FormBuilder }], propDecorators: { mappingKeys: [{ type: Input }], dataFieldIds: [{ type: Input }], formReady: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZvcm1hdHRpbmctY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldHMvZHJpbGxkb3duL2VudGl0eS1mb3JtYXR0aW5nLWNvbmZpZ3VyYXRpb24vZW50aXR5LWZvcm1hdHRpbmctY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZ3VyYXRvci9jb21wb25lbnRzL3dpZGdldHMvZHJpbGxkb3duL2VudGl0eS1mb3JtYXR0aW5nLWNvbmZpZ3VyYXRpb24vZW50aXR5LWZvcm1hdHRpbmctY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBYXhELE1BQU0sT0FBTyxzQ0FBc0M7YUFHakMsZ0JBQVcsR0FBRywyQkFBMkIsQUFBOUIsQ0FBK0I7SUFpQnhELFlBQ1csY0FBaUMsRUFDaEMsV0FBd0I7UUFEekIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBZDFCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRTdDLFNBQUksR0FBYyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxFQUFFO2dCQUNmLEtBQUssRUFBRSxFQUFFO2dCQUNULEdBQUcsRUFBRSxFQUFFO2FBQ1YsQ0FBQztTQUNMLENBQUMsQ0FBQztJQUtBLENBQUM7SUFFRyxRQUFRO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQ2pDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNwQyxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsSUFBVyx1QkFBdUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWMsQ0FBQztJQUN0RCxDQUFDO2tJQXZDUSxzQ0FBc0M7c0hBQXRDLHNDQUFzQywyTUMzQ25ELDJzS0FxSUE7OzRGRDFGYSxzQ0FBc0M7a0JBWGxELFNBQVM7K0JBQ0kscUNBQXFDO2dIQWV0QyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLWVudGl0eS1mb3JtYXR0aW5nLWNvbmZpZ3VyYXRpb25cIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2VudGl0eS1mb3JtYXR0aW5nLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgLmVudGl0eS1mb3JtYXR0aW5nX19hY2NvcmRpb24tY29udGVudCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMTVweCAxNXB4IDE1cHggNDZweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGb3JtYXR0aW5nQ29uZmlndXJhdGlvbkNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgICBwdWJsaWMgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJFbnRpdHlGb3JtYXR0aW5nQ29tcG9uZW50XCI7XG5cbiAgICBASW5wdXQoKSBtYXBwaW5nS2V5czogc3RyaW5nW107XG4gICAgQElucHV0KCkgZGF0YUZpZWxkSWRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gICAgQE91dHB1dCgpIGZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPigpO1xuXG4gICAgcHVibGljIGZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBkYXRhRmllbGRJZHM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgIHN0YXR1czogXCJcIixcbiAgICAgICAgICAgIGRldGFpbGVkVXJsOiBcIlwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiXCIsXG4gICAgICAgICAgICB1cmw6IFwiXCIsXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1SZWFkeS5lbWl0KHRoaXMuZm9ybSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZGF0YUZpZWxkSWRzKSB7XG4gICAgICAgICAgICB0aGlzLmdldEZpZWxkTWFwcGluZ3NDb250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIGNoYW5nZXMuZGF0YUZpZWxkSWRzLmN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0RmllbGRNYXBwaW5nc0NvbnRyb2woKTogRm9ybUdyb3VwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJkYXRhRmllbGRJZHNcIikgYXMgRm9ybUdyb3VwO1xuICAgIH1cbn1cbiIsIjxudWktd2lkZ2V0LWVkaXRvci1hY2NvcmRpb25cbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgIFtzdGF0ZV09XCJmb3JtIHwgbnVpV2lkZ2V0RWRpdG9yQWNjb3JkaW9uRm9ybVN0YXRlIHwgYXN5bmNcIlxuPlxuICAgIDxkaXYgYWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBweC00IHB5LTJcIj5cbiAgICAgICAgPG51aS1pY29uXG4gICAgICAgICAgICBjbGFzcz1cImFsaWduLXNlbGYtc3RhcnQgcHQtMlwiXG4gICAgICAgICAgICBbaWNvbl09XCIndGFnJ1wiXG4gICAgICAgICAgICBpY29uQ29sb3I9XCJncmF5XCJcbiAgICAgICAgPjwvbnVpLWljb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbWwtNCBwdC0xXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5FbnRpdHkgZm9ybWF0dGluZzwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudWktdGV4dC1zZWNvbmRhcnlcIiB0aXRsZT1cIlNob3cgc3RhdHVzIGljb25cIj5cbiAgICAgICAgICAgICAgICBTaG93IHN0YXR1cyBpY29uXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImVudGl0eS1mb3JtYXR0aW5nX19hY2NvcmRpb24tY29udGVudFwiXG4gICAgICAgIGZvcm1Hcm91cE5hbWU9XCJkYXRhRmllbGRJZHNcIlxuICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5JY29uPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICA8bnVpLWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1ncm93LTFcIlxuICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRGaWVsZE1hcHBpbmdzQ29udHJvbC5nZXQoJ2ljb24nKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bnVpLXNlbGVjdC12MlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjItb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWFwcGluZ0tleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjItb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjI+XG4gICAgICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5TdGF0dXM8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgIDxudWktZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3ctMVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldEZpZWxkTWFwcGluZ3NDb250cm9sLmdldCgnc3RhdHVzJylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjItb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWFwcGluZ0tleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjItb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjI+XG4gICAgICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5EZXRhaWxzIFVSTDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgPG51aS1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3Jvdy0xXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0RmllbGRNYXBwaW5nc0NvbnRyb2wuZ2V0KCdkZXRhaWxlZFVybCcpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxudWktc2VsZWN0LXYyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRldGFpbGVkVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjItb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWFwcGluZ0tleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjItb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjI+XG4gICAgICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5MYWJlbDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgPG51aS1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3Jvdy0xXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0RmllbGRNYXBwaW5nc0NvbnRyb2wuZ2V0KCdsYWJlbCcpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxudWktc2VsZWN0LXYyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjItb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWFwcGluZ0tleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjItb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjI+XG4gICAgICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10ZXh0LWxhYmVsXCIgaTE4bj5MYWJlbCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgIDxudWktZm9ybS1maWVsZFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3ctMVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldEZpZWxkTWFwcGluZ3NDb250cm9sLmdldCgndXJsJylcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG51aS1zZWxlY3QtdjItb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWFwcGluZ0tleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjItb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L251aS1zZWxlY3QtdjI+XG4gICAgICAgICAgICAgICAgPC9udWktZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbnVpLXdpZGdldC1lZGl0b3ItYWNjb3JkaW9uPlxuIl19