UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

96 lines 18.3 kB
import { Component, EventEmitter } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { InventoryService, QueriesUtil } from '@c8y/client'; import { DataGridService, gettext } from '@c8y/ngx-components'; import { SERVICE_FRAGMENT, ServiceCommandService } from '@c8y/ngx-components/services/shared'; import { StatusOptionsService } from '../status-options'; import { LastUpdatedDateGridColumn, ServiceNameGridColumn, ServiceTypeGridColumn, StatusGridColumn } from './columns'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@c8y/client"; import * as i3 from "@c8y/ngx-components"; import * as i4 from "../status-options"; import * as i5 from "@c8y/ngx-components/services/shared"; import * as i6 from "@angular/common"; export class ServicesDeviceTabComponent { constructor(route, inventoryService, gridService, statusOptionsService, serviceCommand) { this.route = route; this.inventoryService = inventoryService; this.gridService = gridService; this.statusOptionsService = statusOptionsService; this.serviceCommand = serviceCommand; this.deviceId = this.route.snapshot.parent.data.contextData.id; this.sizeRequestDone = false; this.refresh$ = new EventEmitter(); this.pagination = { pageSize: 50, currentPage: 1 }; this.actionControls = []; this.columns = [ new StatusGridColumn(this.statusOptionsService), new ServiceNameGridColumn(), new ServiceTypeGridColumn(), new LastUpdatedDateGridColumn() ]; this.noResultsMessage = gettext('No results to display.'); this.noDataMessage = gettext('No services to display.'); this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.'); this.queriesUtil = new QueriesUtil(); this.serverSideDataCallback = this.onDataSourceModifier.bind(this); this.sizeRequest = this.inventoryService .childAdditionsList(this.deviceId, { query: `type eq ${SERVICE_FRAGMENT}`, withTotalPages: true, pageSize: 1 }) .then(response => { this.sizeRequestDone = true; return response?.paging?.totalPages; }); } async onDataSourceModifier(dataSourceModifier) { const query = this.queriesUtil.buildQuery(this.queriesUtil.addAndFilter(this.gridService.getQueryObj(dataSourceModifier.columns), { type: SERVICE_FRAGMENT })); const dataRequest = this.inventoryService.childAdditionsList(this.deviceId, { query, withTotalPages: true, pageSize: dataSourceModifier.pagination.pageSize, currentPage: dataSourceModifier.pagination.currentPage }); const filtererdSizeRequest = this.inventoryService .childAdditionsList(this.deviceId, { query, withTotalPages: true, pageSize: 1 }) .then(response => response?.paging?.totalPages); const [dataResponse, size, filteredSize] = await Promise.all([ dataRequest, this.sizeRequest, filtererdSizeRequest ]); const { res, data, paging } = dataResponse; const commands = this.serviceCommand.getAllSupportedCommands(data); this.actionControls = this.serviceCommand.generateActionControls(commands); const serverSideDataResult = { res, data, paging, filteredSize, size }; return serverSideDataResult; } trackByName(_index, column) { return column.name; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.InventoryService }, { token: i3.DataGridService }, { token: i4.StatusOptionsService }, { token: i5.ServiceCommandService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServicesDeviceTabComponent, selector: "c8y-services-device-tab", ngImport: i0, template: "<div class=\"content-fullpage\">\n <c8y-data-grid\n [title]=\"'Services' | translate\"\n [refresh]=\"refresh$\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-tools'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats; isLoading as isLoading\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i3.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-services-device-tab', template: "<div class=\"content-fullpage\">\n <c8y-data-grid\n [title]=\"'Services' | translate\"\n [refresh]=\"refresh$\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-tools'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats; isLoading as isLoading\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n </c8y-data-grid>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.InventoryService }, { type: i3.DataGridService }, { type: i4.StatusOptionsService }, { type: i5.ServiceCommandService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMtZGV2aWNlLXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zZXJ2aWNlcy1kZXZpY2UtdGFiL3NlcnZpY2VzLWRldmljZS10YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc2VydmljZXMvc2VydmljZXMtZGV2aWNlLXRhYi9zZXJ2aWNlcy1kZXZpY2UtdGFiLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFlLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RixPQUFPLEVBR0wsZUFBZSxFQUVmLE9BQU8sRUFFUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3RCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNqQixNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7QUFNbkIsTUFBTSxPQUFPLDBCQUEwQjtJQTRCckMsWUFDVSxLQUFxQixFQUNyQixnQkFBa0MsRUFDbEMsV0FBNEIsRUFDNUIsb0JBQTBDLEVBQzFDLGNBQXFDO1FBSnJDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBaEMvQyxhQUFRLEdBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUczRSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QixhQUFRLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEQsZUFBVSxHQUFHO1lBQ1gsUUFBUSxFQUFFLEVBQUU7WUFDWixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUM7UUFFRixtQkFBYyxHQUFvQixFQUFFLENBQUM7UUFDckMsWUFBTyxHQUFhO1lBQ2xCLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQy9DLElBQUkscUJBQXFCLEVBQUU7WUFDM0IsSUFBSSxxQkFBcUIsRUFBRTtZQUMzQixJQUFJLHlCQUF5QixFQUFFO1NBQ2hDLENBQUM7UUFJRixxQkFBZ0IsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNyRCxrQkFBYSxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ25ELHNCQUFpQixHQUFHLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBRXhFLGdCQUFXLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFTbkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO2FBQ3JDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakMsS0FBSyxFQUFFLFdBQVcsZ0JBQWdCLEVBQUU7WUFDcEMsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLENBQUM7U0FDWixDQUFDO2FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsT0FBTyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLGtCQUFzQztRQUV0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEYsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDLENBQ0gsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3RELEtBQUs7WUFDTCxjQUFjLEVBQUUsSUFBSTtZQUNwQixRQUFRLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFDaEQsV0FBVyxFQUFFLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXO1NBQ3ZELENBQUMsQ0FBQztRQUVMLE1BQU0sb0JBQW9CLEdBQW9CLElBQUksQ0FBQyxnQkFBZ0I7YUFDaEUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxLQUFLO1lBQ0wsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLENBQUM7U0FDWixDQUFDO2FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVsRCxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDM0QsV0FBVztZQUNYLElBQUksQ0FBQyxXQUFXO1lBQ2hCLG9CQUFvQjtTQUNyQixDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFFM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUE0QixDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sb0JBQW9CLEdBQXlCO1lBQ2pELEdBQUc7WUFDSCxJQUFJO1lBQ0osTUFBTTtZQUNOLFlBQVk7WUFDWixJQUFJO1NBQ0wsQ0FBQztRQUVGLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBYztRQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQzsrR0FqR1UsMEJBQTBCO21HQUExQiwwQkFBMEIsK0RDNUJ2QywyM0JBc0JBOzs0RkRNYSwwQkFBMEI7a0JBSnRDLFNBQVM7K0JBQ0UseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBJUmVzdWx0TGlzdCwgUXVlcmllc1V0aWwgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkU2VydmljZSxcbiAgRGF0YVNvdXJjZU1vZGlmaWVyLFxuICBnZXR0ZXh0LFxuICBTZXJ2ZXJTaWRlRGF0YVJlc3VsdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIFNlcnZpY2UsXG4gIFNFUlZJQ0VfRlJBR01FTlQsXG4gIFNlcnZpY2VDb21tYW5kU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3NlcnZpY2VzL3NoYXJlZCc7XG5pbXBvcnQgeyBTdGF0dXNPcHRpb25zU2VydmljZSB9IGZyb20gJy4uL3N0YXR1cy1vcHRpb25zJztcbmltcG9ydCB7XG4gIExhc3RVcGRhdGVkRGF0ZUdyaWRDb2x1bW4sXG4gIFNlcnZpY2VOYW1lR3JpZENvbHVtbixcbiAgU2VydmljZVR5cGVHcmlkQ29sdW1uLFxuICBTdGF0dXNHcmlkQ29sdW1uXG59IGZyb20gJy4vY29sdW1ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zZXJ2aWNlcy1kZXZpY2UtdGFiJyxcbiAgdGVtcGxhdGVVcmw6ICdzZXJ2aWNlcy1kZXZpY2UtdGFiLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlc0RldmljZVRhYkNvbXBvbmVudCB7XG4gIGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhLmlkO1xuXG4gIHNpemVSZXF1ZXN0OiBQcm9taXNlPG51bWJlcj47XG4gIHNpemVSZXF1ZXN0RG9uZSA9IGZhbHNlO1xuXG4gIHJlZnJlc2gkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHBhZ2luYXRpb24gPSB7XG4gICAgcGFnZVNpemU6IDUwLFxuICAgIGN1cnJlbnRQYWdlOiAxXG4gIH07XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICBjb2x1bW5zOiBDb2x1bW5bXSA9IFtcbiAgICBuZXcgU3RhdHVzR3JpZENvbHVtbih0aGlzLnN0YXR1c09wdGlvbnNTZXJ2aWNlKSxcbiAgICBuZXcgU2VydmljZU5hbWVHcmlkQ29sdW1uKCksXG4gICAgbmV3IFNlcnZpY2VUeXBlR3JpZENvbHVtbigpLFxuICAgIG5ldyBMYXN0VXBkYXRlZERhdGVHcmlkQ29sdW1uKClcbiAgXTtcblxuICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBhbnk7XG5cbiAgbm9SZXN1bHRzTWVzc2FnZSA9IGdldHRleHQoJ05vIHJlc3VsdHMgdG8gZGlzcGxheS4nKTtcbiAgbm9EYXRhTWVzc2FnZSA9IGdldHRleHQoJ05vIHNlcnZpY2VzIHRvIGRpc3BsYXkuJyk7XG4gIG5vUmVzdWx0c1N1YnRpdGxlID0gZ2V0dGV4dCgnUmVmaW5lIHlvdXIgc2VhcmNoIHRlcm1zIG9yIGNoZWNrIHlvdXIgc3BlbGxpbmcuJyk7XG5cbiAgcHJpdmF0ZSBxdWVyaWVzVXRpbDogUXVlcmllc1V0aWwgPSBuZXcgUXVlcmllc1V0aWwoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RhdHVzT3B0aW9uc1NlcnZpY2U6IFN0YXR1c09wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZUNvbW1hbmQ6IFNlcnZpY2VDb21tYW5kU2VydmljZVxuICApIHtcbiAgICB0aGlzLnNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgPSB0aGlzLm9uRGF0YVNvdXJjZU1vZGlmaWVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zaXplUmVxdWVzdCA9IHRoaXMuaW52ZW50b3J5U2VydmljZVxuICAgICAgLmNoaWxkQWRkaXRpb25zTGlzdCh0aGlzLmRldmljZUlkLCB7XG4gICAgICAgIHF1ZXJ5OiBgdHlwZSBlcSAke1NFUlZJQ0VfRlJBR01FTlR9YCxcbiAgICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgICAgIHBhZ2VTaXplOiAxXG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICB0aGlzLnNpemVSZXF1ZXN0RG9uZSA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXNwb25zZT8ucGFnaW5nPy50b3RhbFBhZ2VzO1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBvbkRhdGFTb3VyY2VNb2RpZmllcihcbiAgICBkYXRhU291cmNlTW9kaWZpZXI6IERhdGFTb3VyY2VNb2RpZmllclxuICApOiBQcm9taXNlPFNlcnZlclNpZGVEYXRhUmVzdWx0PiB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNVdGlsLmJ1aWxkUXVlcnkoXG4gICAgICB0aGlzLnF1ZXJpZXNVdGlsLmFkZEFuZEZpbHRlcih0aGlzLmdyaWRTZXJ2aWNlLmdldFF1ZXJ5T2JqKGRhdGFTb3VyY2VNb2RpZmllci5jb2x1bW5zKSwge1xuICAgICAgICB0eXBlOiBTRVJWSUNFX0ZSQUdNRU5UXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhUmVxdWVzdDogUHJvbWlzZTxJUmVzdWx0TGlzdDxJTWFuYWdlZE9iamVjdD4+ID1cbiAgICAgIHRoaXMuaW52ZW50b3J5U2VydmljZS5jaGlsZEFkZGl0aW9uc0xpc3QodGhpcy5kZXZpY2VJZCwge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgICAgIHBhZ2VTaXplOiBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbi5wYWdlU2l6ZSxcbiAgICAgICAgY3VycmVudFBhZ2U6IGRhdGFTb3VyY2VNb2RpZmllci5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcmVyZFNpemVSZXF1ZXN0OiBQcm9taXNlPG51bWJlcj4gPSB0aGlzLmludmVudG9yeVNlcnZpY2VcbiAgICAgIC5jaGlsZEFkZGl0aW9uc0xpc3QodGhpcy5kZXZpY2VJZCwge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgICAgIHBhZ2VTaXplOiAxXG4gICAgICB9KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2U/LnBhZ2luZz8udG90YWxQYWdlcyk7XG5cbiAgICBjb25zdCBbZGF0YVJlc3BvbnNlLCBzaXplLCBmaWx0ZXJlZFNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZGF0YVJlcXVlc3QsXG4gICAgICB0aGlzLnNpemVSZXF1ZXN0LFxuICAgICAgZmlsdGVyZXJkU2l6ZVJlcXVlc3RcbiAgICBdKTtcblxuICAgIGNvbnN0IHsgcmVzLCBkYXRhLCBwYWdpbmcgfSA9IGRhdGFSZXNwb25zZTtcblxuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5zZXJ2aWNlQ29tbWFuZC5nZXRBbGxTdXBwb3J0ZWRDb21tYW5kcyhkYXRhIGFzIHVua25vd24gYXMgU2VydmljZVtdKTtcbiAgICB0aGlzLmFjdGlvbkNvbnRyb2xzID0gdGhpcy5zZXJ2aWNlQ29tbWFuZC5nZW5lcmF0ZUFjdGlvbkNvbnRyb2xzKGNvbW1hbmRzKTtcblxuICAgIGNvbnN0IHNlcnZlclNpZGVEYXRhUmVzdWx0OiBTZXJ2ZXJTaWRlRGF0YVJlc3VsdCA9IHtcbiAgICAgIHJlcyxcbiAgICAgIGRhdGEsXG4gICAgICBwYWdpbmcsXG4gICAgICBmaWx0ZXJlZFNpemUsXG4gICAgICBzaXplXG4gICAgfTtcblxuICAgIHJldHVybiBzZXJ2ZXJTaWRlRGF0YVJlc3VsdDtcbiAgfVxuXG4gIHRyYWNrQnlOYW1lKF9pbmRleCwgY29sdW1uOiBDb2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRlbnQtZnVsbHBhZ2VcIj5cbiAgPGM4eS1kYXRhLWdyaWRcbiAgICBbdGl0bGVdPVwiJ1NlcnZpY2VzJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3JlZnJlc2hdPVwicmVmcmVzaCRcIlxuICAgIFthY3Rpb25Db250cm9sc109XCJhY3Rpb25Db250cm9sc1wiXG4gICAgW3BhZ2luYXRpb25dPVwicGFnaW5hdGlvblwiXG4gICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgW2luZmluaXRlU2Nyb2xsXT1cIidhdXRvJ1wiXG4gICAgW3NlcnZlclNpZGVEYXRhQ2FsbGJhY2tdPVwic2VydmVyU2lkZURhdGFDYWxsYmFja1wiXG4gID5cbiAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICBbaWNvbl09XCJzdGF0cz8uc2l6ZSA+IDAgPyAnc2VhcmNoJyA6ICdjOHktdG9vbHMnXCJcbiAgICAgIFt0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzTWVzc2FnZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhTWVzc2FnZSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgW3N1YnRpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiBudWxsXCJcbiAgICAgICplbXB0eVN0YXRlQ29udGV4dD1cImxldCBzdGF0czsgaXNMb2FkaW5nIGFzIGlzTG9hZGluZ1wiXG4gICAgICBbaG9yaXpvbnRhbF09XCJzdGF0cz8uc2l6ZSA+IDBcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgdHJhY2tCeTogdHJhY2tCeU5hbWVcIj5cbiAgICAgIDxjOHktY29sdW1uIFtuYW1lXT1cImNvbHVtbi5uYW1lXCI+PC9jOHktY29sdW1uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2M4eS1kYXRhLWdyaWQ+XG48L2Rpdj5cbiJdfQ==