@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
115 lines • 30 kB
JavaScript
import { Component, EventEmitter, Inject, signal } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { ContextRouteService, Permissions } from '@c8y/ngx-components';
import { delay, Subject, takeUntil, tap } from 'rxjs';
import { SUB_ASSETS_CONFIG } from './sub-assets.model';
import { SubAssetsService } from './sub-assets.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./sub-assets.service";
import * as i3 from "@c8y/ngx-components";
import * as i4 from "@angular/common";
import * as i5 from "./add-group/add-group.component";
import * as i6 from "./sub-assets-grid.component";
import * as i7 from "./assign-devices/assign-devices.component";
import * as i8 from "./assign-devices/assign-child-devices.component";
import * as i9 from "./group-info.component";
import * as i10 from "./asset-properties.component";
export class SubAssetsComponent {
constructor(activeRoute, subAssetsService, contextRouteService, permissionsService, moduleConfig, router) {
this.activeRoute = activeRoute;
this.subAssetsService = subAssetsService;
this.contextRouteService = contextRouteService;
this.permissionsService = permissionsService;
this.moduleConfig = moduleConfig;
this.router = router;
this.SHOW_ADD_GROUP = 'showAddGroup';
this.toggle = false;
this.showAddGroup = signal(false);
this.showAssignDevices = false;
this.showAssignChildDevices = false;
this.refresh = new EventEmitter();
this.filterable = true;
this.shouldDisableAddGroup = false;
this.shouldDisableAssignDevices = false;
this.shouldShowAssetsProperties = false;
this.customProperties = [];
this.isSmartGroup = false;
this.destroyed = new Subject();
this.activeRoute.parent.data.pipe(takeUntil(this.destroyed)).subscribe(({ contextData }) => {
this.init(contextData);
});
}
async ngOnInit() {
this.displayOptions = {
striped: true,
bordered: false,
gridHeader: true,
filter: true,
hover: true
};
this.isSmartGroup = this.subAssetsService.isSmartGroup(this.group);
this.activeRoute.queryParamMap
.pipe(delay(50), // It allows seeing drawer animation.
takeUntil(this.destroyed), tap(params => this.showAddGroup.set(params.has(this.SHOW_ADD_GROUP))))
.subscribe();
}
async init(contextData) {
this.group = { ...contextData };
this.title = this.group.name;
this.currentGroupId = this.group.id;
this.shouldDisableAddGroup = !(await this.permissionsService.canEdit([
Permissions.ROLE_INVENTORY_ADMIN,
Permissions.ROLE_INVENTORY_CREATE,
Permissions.ROLE_MANAGED_OBJECT_ADMIN,
Permissions.ROLE_MANAGED_OBJECT_CREATE
], this.group));
this.shouldDisableAssignDevices = !(await this.subAssetsService.canAssignDevice(this.group));
this.customProperties = await this.subAssetsService.getCustomProperties(this.group);
this.shouldShowAssetsProperties =
this.moduleConfig.showProperties && this.customProperties.length > 0;
}
groupChange(group) {
this.group = group;
this.title = group.name;
this.contextRouteService.setContext(this.activeRoute, group);
this.contextRouteService.refreshContext();
this.refresh.emit();
}
onAddGroupClick() {
this.showAddGroup.set(!this.showAddGroup());
this.handleShowAddGroupQueryParam();
}
ngOnDestroy() {
this.destroyed.next();
this.destroyed.complete();
}
/**
* Updates the query parameter `showAddGroup` based on the value of `showAddGroup` property.
* - If `showAddGroup` is `true`, adds `showAddGroup=true` to the query parameters.
* - If `showAddGroup` is `false`, removes `showAddGroup` from the query parameters.
*/
handleShowAddGroupQueryParam() {
const currentParams = { ...this.activeRoute.snapshot.queryParams };
if (this.showAddGroup()) {
currentParams[this.SHOW_ADD_GROUP] = true;
}
else {
delete currentParams[this.SHOW_ADD_GROUP];
}
this.router.navigate([], {
relativeTo: this.activeRoute,
queryParams: currentParams
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubAssetsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.SubAssetsService }, { token: i3.ContextRouteService }, { token: i3.Permissions }, { token: SUB_ASSETS_CONFIG }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SubAssetsComponent, selector: "c8y-sub-assets", ngImport: i0, template: "<c8y-title>\n {{ title }}\n</c8y-title>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"!isSmartGroup && moduleConfig.showAddGroupBtn\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add group' | translate }}\"\n (click)=\"onAddGroupClick()\"\n [disabled]=\"shouldDisableAddGroup\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span translate>Add group</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"!isSmartGroup && moduleConfig.showAssignDeviceBtn\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Assign devices' | translate }}\"\n (click)=\"showAssignDevices = !showAssignDevices\"\n [disabled]=\"shouldDisableAssignDevices\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span translate>Assign devices</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n *ngIf=\"isSmartGroup; else assetsHelp\"\n src=\"/docs/device-management-application/grouping-devices/#using-smart-groups\"\n></c8y-help>\n\n<ng-template #assetsHelp>\n <c8y-help src=\"/docs/cockpit/managing-assets/#managing-assets\"></c8y-help>\n</ng-template>\n\n<div\n class=\"card content-fullpage\"\n [ngClass]=\"{\n 'card--grid grid__col--8-4--md grid__row--fit-auto': shouldShowAssetsProperties,\n 'd-flex d-col': !shouldShowAssetsProperties\n }\"\n>\n <c8y-group-info\n class=\"grid__col--fullspan\"\n *ngIf=\"moduleConfig.showDetails\"\n [group]=\"group\"\n (groupChange)=\"groupChange($event)\"\n ></c8y-group-info>\n <c8y-sub-assets-grid\n class=\"d-contents\"\n [refresh]=\"refresh\"\n [parent-group]=\"group\"\n [filterable]=\"filterable\"\n [displayOptions]=\"displayOptions\"\n [columnsConfigKey]=\"'sub-assets-grid'\"\n [baseQuery]=\"moduleConfig.baseQuery\"\n ></c8y-sub-assets-grid>\n <div\n class=\"inner-scroll bg-level-1\"\n *ngIf=\"shouldShowAssetsProperties\"\n >\n <c8y-asset-properties\n class=\"d-contents\"\n [properties]=\"customProperties\"\n [asset]=\"group\"\n (assetChange)=\"groupChange($event)\"\n ></c8y-asset-properties>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAddGroup() }\">\n <div class=\"bottom-drawer\">\n <c8y-add-group\n [currentGroupId]=\"currentGroupId\"\n [refresh]=\"refresh\"\n (onCancel)=\"onAddGroupClick()\"\n *ngIf=\"showAddGroup()\"\n ></c8y-add-group>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAssignDevices }\">\n <div class=\"bottom-drawer\">\n <div class=\"d-flex d-col no-align-items fit-h\">\n <c8y-assign-devices\n class=\"d-contents\"\n (onCancel)=\"showAssignDevices = false\"\n [refresh]=\"refresh\"\n [currentGroupId]=\"currentGroupId\"\n (onShowChildDevices)=\"showAssignChildDevices = $event\"\n (selectedDevice)=\"showChildrenForDevice = $event\"\n *ngIf=\"showAssignDevices\"\n ></c8y-assign-devices>\n </div>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAssignChildDevices }\">\n <div class=\"bottom-drawer m-t-40\">\n <div class=\"d-flex d-col no-align-items fit-h\">\n <c8y-assign-child-devices\n class=\"d-contents\"\n *ngIf=\"showAssignChildDevices\"\n (onCancel)=\"showAssignChildDevices = false\"\n [refresh]=\"refresh\"\n [currentGroupId]=\"currentGroupId\"\n [parentDevice]=\"showChildrenForDevice\"\n ></c8y-assign-child-devices>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i3.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i3.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i5.AddGroupComponent, selector: "c8y-add-group", inputs: ["currentGroupId", "refresh"], outputs: ["onDeviceQueryStringChange", "onCancel"] }, { kind: "component", type: i6.SubAssetsGridComponent, selector: "c8y-sub-assets-grid", inputs: ["parent-group", "refresh", "title", "emptyStateText", "loadingItemsLabel", "columnsConfigKey", "columns", "pagination", "actionControls", "selectable", "baseQuery", "bulkActionControls", "filterable", "sortable", "displayOptions"], outputs: ["onColumnsChange", "itemsSelect"] }, { kind: "component", type: i7.AssignDevicesComponent, selector: "c8y-assign-devices", inputs: ["currentGroupId", "refresh"], outputs: ["onCancel", "onShowChildDevices", "selectedDevice"] }, { kind: "component", type: i8.AssignChildDevicesComponent, selector: "c8y-assign-child-devices", inputs: ["currentGroupId", "parentDevice", "refresh", "onlySelect"], outputs: ["onCancel", "onSelectedDevices"] }, { kind: "component", type: i9.GroupInfoComponent, selector: "c8y-group-info", inputs: ["group"], outputs: ["groupChange"] }, { kind: "component", type: i10.AssetPropertiesComponent, selector: "c8y-asset-properties", inputs: ["asset", "properties"], outputs: ["assetChange"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubAssetsComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-sub-assets', template: "<c8y-title>\n {{ title }}\n</c8y-title>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"!isSmartGroup && moduleConfig.showAddGroupBtn\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add group' | translate }}\"\n (click)=\"onAddGroupClick()\"\n [disabled]=\"shouldDisableAddGroup\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span translate>Add group</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"!isSmartGroup && moduleConfig.showAssignDeviceBtn\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Assign devices' | translate }}\"\n (click)=\"showAssignDevices = !showAssignDevices\"\n [disabled]=\"shouldDisableAssignDevices\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span translate>Assign devices</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n *ngIf=\"isSmartGroup; else assetsHelp\"\n src=\"/docs/device-management-application/grouping-devices/#using-smart-groups\"\n></c8y-help>\n\n<ng-template #assetsHelp>\n <c8y-help src=\"/docs/cockpit/managing-assets/#managing-assets\"></c8y-help>\n</ng-template>\n\n<div\n class=\"card content-fullpage\"\n [ngClass]=\"{\n 'card--grid grid__col--8-4--md grid__row--fit-auto': shouldShowAssetsProperties,\n 'd-flex d-col': !shouldShowAssetsProperties\n }\"\n>\n <c8y-group-info\n class=\"grid__col--fullspan\"\n *ngIf=\"moduleConfig.showDetails\"\n [group]=\"group\"\n (groupChange)=\"groupChange($event)\"\n ></c8y-group-info>\n <c8y-sub-assets-grid\n class=\"d-contents\"\n [refresh]=\"refresh\"\n [parent-group]=\"group\"\n [filterable]=\"filterable\"\n [displayOptions]=\"displayOptions\"\n [columnsConfigKey]=\"'sub-assets-grid'\"\n [baseQuery]=\"moduleConfig.baseQuery\"\n ></c8y-sub-assets-grid>\n <div\n class=\"inner-scroll bg-level-1\"\n *ngIf=\"shouldShowAssetsProperties\"\n >\n <c8y-asset-properties\n class=\"d-contents\"\n [properties]=\"customProperties\"\n [asset]=\"group\"\n (assetChange)=\"groupChange($event)\"\n ></c8y-asset-properties>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAddGroup() }\">\n <div class=\"bottom-drawer\">\n <c8y-add-group\n [currentGroupId]=\"currentGroupId\"\n [refresh]=\"refresh\"\n (onCancel)=\"onAddGroupClick()\"\n *ngIf=\"showAddGroup()\"\n ></c8y-add-group>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAssignDevices }\">\n <div class=\"bottom-drawer\">\n <div class=\"d-flex d-col no-align-items fit-h\">\n <c8y-assign-devices\n class=\"d-contents\"\n (onCancel)=\"showAssignDevices = false\"\n [refresh]=\"refresh\"\n [currentGroupId]=\"currentGroupId\"\n (onShowChildDevices)=\"showAssignChildDevices = $event\"\n (selectedDevice)=\"showChildrenForDevice = $event\"\n *ngIf=\"showAssignDevices\"\n ></c8y-assign-devices>\n </div>\n </div>\n</div>\n\n<div [ngClass]=\"{ drawerOpen: showAssignChildDevices }\">\n <div class=\"bottom-drawer m-t-40\">\n <div class=\"d-flex d-col no-align-items fit-h\">\n <c8y-assign-child-devices\n class=\"d-contents\"\n *ngIf=\"showAssignChildDevices\"\n (onCancel)=\"showAssignChildDevices = false\"\n [refresh]=\"refresh\"\n [currentGroupId]=\"currentGroupId\"\n [parentDevice]=\"showChildrenForDevice\"\n ></c8y-assign-child-devices>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.SubAssetsService }, { type: i3.ContextRouteService }, { type: i3.Permissions }, { type: undefined, decorators: [{
type: Inject,
args: [SUB_ASSETS_CONFIG]
}] }, { type: i1.Router }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLWFzc2V0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zdWItYXNzZXRzL3N1Yi1hc3NldHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3ViLWFzc2V0cy9zdWItYXNzZXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLG1CQUFtQixFQUFrQixXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBTXhELE1BQU0sT0FBTyxrQkFBa0I7SUFxQjdCLFlBQ1UsV0FBMkIsRUFDM0IsZ0JBQWtDLEVBQ2xDLG1CQUF3QyxFQUN4QyxrQkFBK0IsRUFDTCxZQUE2QixFQUN2RCxNQUFjO1FBTGQsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWE7UUFDTCxpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDdkQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTFCaEIsbUJBQWMsR0FBRyxjQUFjLENBQUM7UUFLeEMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGlCQUFZLEdBQUcsTUFBTSxDQUFD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a0JBSjlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkE2QnZCLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IENvbnRleHRSb3V0ZVNlcnZpY2UsIERpc3BsYXlPcHRpb25zLCBQZXJtaXNzaW9ucyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgZGVsYXksIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTVUJfQVNTRVRTX0NPTkZJRywgU3ViQXNzZXRzQ29uZmlnIH0gZnJvbSAnLi9zdWItYXNzZXRzLm1vZGVsJztcbmltcG9ydCB7IFN1YkFzc2V0c1NlcnZpY2UgfSBmcm9tICcuL3N1Yi1hc3NldHMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zdWItYXNzZXRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1Yi1hc3NldHMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFN1YkFzc2V0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBTSE9XX0FERF9HUk9VUCA9ICdzaG93QWRkR3JvdXAnO1xuICBncm91cDogSU1hbmFnZWRPYmplY3Q7XG4gIGN1cnJlbnRHcm91cElkOiBzdHJpbmc7XG4gIHNob3dDaGlsZHJlbkZvckRldmljZTogSU1hbmFnZWRPYmplY3Q7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRvZ2dsZSA9IGZhbHNlO1xuICBzaG93QWRkR3JvdXAgPSBzaWduYWwoZmFsc2UpO1xuICBzaG93QXNzaWduRGV2aWNlcyA9IGZhbHNlO1xuICByZXF1ZXN0SW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgc2hvd0Fzc2lnbkNoaWxkRGV2aWNlcyA9IGZhbHNlO1xuICByZWZyZXNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgZmlsdGVyYWJsZSA9IHRydWU7XG4gIHNob3VsZERpc2FibGVBZGRHcm91cCA9IGZhbHNlO1xuICBzaG91bGREaXNhYmxlQXNzaWduRGV2aWNlcyA9IGZhbHNlO1xuICBzaG91bGRTaG93QXNzZXRzUHJvcGVydGllcyA9IGZhbHNlO1xuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnM7XG4gIGN1c3RvbVByb3BlcnRpZXM6IElNYW5hZ2VkT2JqZWN0W10gPSBbXTtcbiAgaXNTbWFydEdyb3VwID0gZmFsc2U7XG4gIGRlc3Ryb3llZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBzdWJBc3NldHNTZXJ2aWNlOiBTdWJBc3NldHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGV4dFJvdXRlU2VydmljZTogQ29udGV4dFJvdXRlU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zU2VydmljZTogUGVybWlzc2lvbnMsXG4gICAgQEluamVjdChTVUJfQVNTRVRTX0NPTkZJRykgcHVibGljIG1vZHVsZUNvbmZpZzogU3ViQXNzZXRzQ29uZmlnLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7XG4gICAgdGhpcy5hY3RpdmVSb3V0ZS5wYXJlbnQuZGF0YS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoeyBjb250ZXh0RGF0YSB9KSA9PiB7XG4gICAgICB0aGlzLmluaXQoY29udGV4dERhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kaXNwbGF5T3B0aW9ucyA9IHtcbiAgICAgIHN0cmlwZWQ6IHRydWUsXG4gICAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgICBncmlkSGVhZGVyOiB0cnVlLFxuICAgICAgZmlsdGVyOiB0cnVlLFxuICAgICAgaG92ZXI6IHRydWVcbiAgICB9O1xuICAgIHRoaXMuaXNTbWFydEdyb3VwID0gdGhpcy5zdWJBc3NldHNTZXJ2aWNlLmlzU21hcnRHcm91cCh0aGlzLmdyb3VwKTtcbiAgICB0aGlzLmFjdGl2ZVJvdXRlLnF1ZXJ5UGFyYW1NYXBcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWxheSg1MCksIC8vIEl0IGFsbG93cyBzZWVpbmcgZHJhd2VyIGFuaW1hdGlvbi5cbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcbiAgICAgICAgdGFwKHBhcmFtcyA9PiB0aGlzLnNob3dBZGRHcm91cC5zZXQocGFyYW1zLmhhcyh0aGlzLlNIT1dfQUREX0dST1VQKSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3luYyBpbml0KGNvbnRleHREYXRhKSB7XG4gICAgdGhpcy5ncm91cCA9IHsgLi4uY29udGV4dERhdGEgfTtcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5ncm91cC5uYW1lO1xuICAgIHRoaXMuY3VycmVudEdyb3VwSWQgPSB0aGlzLmdyb3VwLmlkO1xuICAgIHRoaXMuc2hvdWxkRGlzYWJsZUFkZEdyb3VwID0gIShhd2FpdCB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5jYW5FZGl0KFxuICAgICAgW1xuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9BRE1JTixcbiAgICAgICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQ1JFQVRFLFxuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX01BTkFHRURfT0JKRUNUX0FETUlOLFxuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX01BTkFHRURfT0JKRUNUX0NSRUFURVxuICAgICAgXSxcbiAgICAgIHRoaXMuZ3JvdXBcbiAgICApKTtcbiAgICB0aGlzLnNob3VsZERpc2FibGVBc3NpZ25EZXZpY2VzID0gIShhd2FpdCB0aGlzLnN1YkFzc2V0c1NlcnZpY2UuY2FuQXNzaWduRGV2aWNlKHRoaXMuZ3JvdXApKTtcbiAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXMgPSBhd2FpdCB0aGlzLnN1YkFzc2V0c1NlcnZpY2UuZ2V0Q3VzdG9tUHJvcGVydGllcyh0aGlzLmdyb3VwKTtcbiAgICB0aGlzLnNob3VsZFNob3dBc3NldHNQcm9wZXJ0aWVzID1cbiAgICAgIHRoaXMubW9kdWxlQ29uZmlnLnNob3dQcm9wZXJ0aWVzICYmIHRoaXMuY3VzdG9tUHJvcGVydGllcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgZ3JvdXBDaGFuZ2UoZ3JvdXA6IElNYW5hZ2VkT2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5ncm91cCA9IGdyb3VwO1xuICAgIHRoaXMudGl0bGUgPSBncm91cC5uYW1lO1xuICAgIHRoaXMuY29udGV4dFJvdXRlU2VydmljZS5zZXRDb250ZXh0KHRoaXMuYWN0aXZlUm91dGUsIGdyb3VwKTtcbiAgICB0aGlzLmNvbnRleHRSb3V0ZVNlcnZpY2UucmVmcmVzaENvbnRleHQoKTtcbiAgICB0aGlzLnJlZnJlc2guZW1pdCgpO1xuICB9XG4gIG9uQWRkR3JvdXBDbGljaygpIHtcbiAgICB0aGlzLnNob3dBZGRHcm91cC5zZXQoIXRoaXMuc2hvd0FkZEdyb3VwKCkpO1xuICAgIHRoaXMuaGFuZGxlU2hvd0FkZEdyb3VwUXVlcnlQYXJhbSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcXVlcnkgcGFyYW1ldGVyIGBzaG93QWRkR3JvdXBgIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBgc2hvd0FkZEdyb3VwYCBwcm9wZXJ0eS5cbiAgICogLSBJZiBgc2hvd0FkZEdyb3VwYCBpcyBgdHJ1ZWAsIGFkZHMgYHNob3dBZGRHcm91cD10cnVlYCB0byB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICogLSBJZiBgc2hvd0FkZEdyb3VwYCBpcyBgZmFsc2VgLCByZW1vdmVzIGBzaG93QWRkR3JvdXBgIGZyb20gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNob3dBZGRHcm91cFF1ZXJ5UGFyYW0oKSB7XG4gICAgY29uc3QgY3VycmVudFBhcmFtcyA9IHsgLi4udGhpcy5hY3RpdmVSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyB9O1xuXG4gICAgaWYgKHRoaXMuc2hvd0FkZEdyb3VwKCkpIHtcbiAgICAgIGN1cnJlbnRQYXJhbXNbdGhpcy5TSE9XX0FERF9HUk9VUF0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgY3VycmVudFBhcmFtc1t0aGlzLlNIT1dfQUREX0dST1VQXTtcbiAgICB9XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZlUm91dGUsXG4gICAgICBxdWVyeVBhcmFtczogY3VycmVudFBhcmFtc1xuICAgIH0pO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPlxuICB7eyB0aXRsZSB9fVxuPC9jOHktdGl0bGU+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gICpuZ0lmPVwiIWlzU21hcnRHcm91cCAmJiBtb2R1bGVDb25maWcuc2hvd0FkZEdyb3VwQnRuXCJcbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgZ3JvdXAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAoY2xpY2spPVwib25BZGRHcm91cENsaWNrKClcIlxuICAgIFtkaXNhYmxlZF09XCJzaG91bGREaXNhYmxlQWRkR3JvdXBcIlxuICA+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuIHRyYW5zbGF0ZT5BZGQgZ3JvdXA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICAqbmdJZj1cIiFpc1NtYXJ0R3JvdXAgJiYgbW9kdWxlQ29uZmlnLnNob3dBc3NpZ25EZXZpY2VCdG5cIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ0Fzc2lnbiBkZXZpY2VzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cInNob3dBc3NpZ25EZXZpY2VzID0gIXNob3dBc3NpZ25EZXZpY2VzXCJcbiAgICBbZGlzYWJsZWRdPVwic2hvdWxkRGlzYWJsZUFzc2lnbkRldmljZXNcIlxuICA+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuIHRyYW5zbGF0ZT5Bc3NpZ24gZGV2aWNlczwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktaGVscFxuICAqbmdJZj1cImlzU21hcnRHcm91cDsgZWxzZSBhc3NldHNIZWxwXCJcbiAgc3JjPVwiL2RvY3MvZGV2aWNlLW1hbmFnZW1lbnQtYXBwbGljYXRpb24vZ3JvdXBpbmctZGV2aWNlcy8jdXNpbmctc21hcnQtZ3JvdXBzXCJcbj48L2M4eS1oZWxwPlxuXG48bmctdGVtcGxhdGUgI2Fzc2V0c0hlbHA+XG4gIDxjOHktaGVscCBzcmM9XCIvZG9jcy9jb2NrcGl0L21hbmFnaW5nLWFzc2V0cy8jbWFuYWdpbmctYXNzZXRzXCI+PC9jOHktaGVscD5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXZcbiAgY2xhc3M9XCJjYXJkIGNvbnRlbnQtZnVsbHBhZ2VcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ2NhcmQtLWdyaWQgZ3JpZF9fY29sLS04LTQtLW1kIGdyaWRfX3Jvdy0tZml0LWF1dG8nOiBzaG91bGRTaG93QXNzZXRzUHJvcGVydGllcyxcbiAgICAnZC1mbGV4IGQtY29sJzogIXNob3VsZFNob3dBc3NldHNQcm9wZXJ0aWVzXG4gIH1cIlxuPlxuICA8Yzh5LWdyb3VwLWluZm9cbiAgICBjbGFzcz1cImdyaWRfX2NvbC0tZnVsbHNwYW5cIlxuICAgICpuZ0lmPVwibW9kdWxlQ29uZmlnLnNob3dEZXRhaWxzXCJcbiAgICBbZ3JvdXBdPVwiZ3JvdXBcIlxuICAgIChncm91cENoYW5nZSk9XCJncm91cENoYW5nZSgkZXZlbnQpXCJcbiAgPjwvYzh5LWdyb3VwLWluZm8+XG4gIDxjOHktc3ViLWFzc2V0cy1ncmlkXG4gICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICBbcmVmcmVzaF09XCJyZWZyZXNoXCJcbiAgICBbcGFyZW50LWdyb3VwXT1cImdyb3VwXCJcbiAgICBbZmlsdGVyYWJsZV09XCJmaWx0ZXJhYmxlXCJcbiAgICBbZGlzcGxheU9wdGlvbnNdPVwiZGlzcGxheU9wdGlvbnNcIlxuICAgIFtjb2x1bW5zQ29uZmlnS2V5XT1cIidzdWItYXNzZXRzLWdyaWQnXCJcbiAgICBbYmFzZVF1ZXJ5XT1cIm1vZHVsZUNvbmZpZy5iYXNlUXVlcnlcIlxuICA+PC9jOHktc3ViLWFzc2V0cy1ncmlkPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJpbm5lci1zY3JvbGwgYmctbGV2ZWwtMVwiXG4gICAgKm5nSWY9XCJzaG91bGRTaG93QXNzZXRzUHJvcGVydGllc1wiXG4gID5cbiAgICA8Yzh5LWFzc2V0LXByb3BlcnRpZXNcbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICBbcHJvcGVydGllc109XCJjdXN0b21Qcm9wZXJ0aWVzXCJcbiAgICAgIFthc3NldF09XCJncm91cFwiXG4gICAgICAoYXNzZXRDaGFuZ2UpPVwiZ3JvdXBDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvYzh5LWFzc2V0LXByb3BlcnRpZXM+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgW25nQ2xhc3NdPVwieyBkcmF3ZXJPcGVuOiBzaG93QWRkR3JvdXAoKSB9XCI+XG4gIDxkaXYgY2xhc3M9XCJib3R0b20tZHJhd2VyXCI+XG4gICAgPGM4eS1hZGQtZ3JvdXBcbiAgICAgIFtjdXJyZW50R3JvdXBJZF09XCJjdXJyZW50R3JvdXBJZFwiXG4gICAgICBbcmVmcmVzaF09XCJyZWZyZXNoXCJcbiAgICAgIChvbkNhbmNlbCk9XCJvbkFkZEdyb3VwQ2xpY2soKVwiXG4gICAgICAqbmdJZj1cInNob3dBZGRHcm91cCgpXCJcbiAgICA+PC9jOHktYWRkLWdyb3VwPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IFtuZ0NsYXNzXT1cInsgZHJhd2VyT3Blbjogc2hvd0Fzc2lnbkRldmljZXMgfVwiPlxuICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRyYXdlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgbm8tYWxpZ24taXRlbXMgZml0LWhcIj5cbiAgICAgIDxjOHktYXNzaWduLWRldmljZXNcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgKG9uQ2FuY2VsKT1cInNob3dBc3NpZ25EZXZpY2VzID0gZmFsc2VcIlxuICAgICAgICBbcmVmcmVzaF09XCJyZWZyZXNoXCJcbiAgICAgICAgW2N1cnJlbnRHcm91cElkXT1cImN1cnJlbnRHcm91cElkXCJcbiAgICAgICAgKG9uU2hvd0NoaWxkRGV2aWNlcyk9XCJzaG93QXNzaWduQ2hpbGREZXZpY2VzID0gJGV2ZW50XCJcbiAgICAgICAgKHNlbGVjdGVkRGV2aWNlKT1cInNob3dDaGlsZHJlbkZvckRldmljZSA9ICRldmVudFwiXG4gICAgICAgICpuZ0lmPVwic2hvd0Fzc2lnbkRldmljZXNcIlxuICAgICAgPjwvYzh5LWFzc2lnbi1kZXZpY2VzPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IFtuZ0NsYXNzXT1cInsgZHJhd2VyT3Blbjogc2hvd0Fzc2lnbkNoaWxkRGV2aWNlcyB9XCI+XG4gIDxkaXYgY2xhc3M9XCJib3R0b20tZHJhd2VyIG0tdC00MFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgbm8tYWxpZ24taXRlbXMgZml0LWhcIj5cbiAgICAgIDxjOHktYXNzaWduLWNoaWxkLWRldmljZXNcbiAgICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgICAgKm5nSWY9XCJzaG93QXNzaWduQ2hpbGREZXZpY2VzXCJcbiAgICAgICAgKG9uQ2FuY2VsKT1cInNob3dBc3NpZ25DaGlsZERldmljZXMgPSBmYWxzZVwiXG4gICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICAgICAgICBbY3VycmVudEdyb3VwSWRdPVwiY3VycmVudEdyb3VwSWRcIlxuICAgICAgICBbcGFyZW50RGV2aWNlXT1cInNob3dDaGlsZHJlbkZvckRldmljZVwiXG4gICAgICA+PC9jOHktYXNzaWduLWNoaWxkLWRldmljZXM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=