UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

90 lines 25.8 kB
import { Component, forwardRef, Input, ViewChild } from '@angular/core'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { OperationStatus } from '@c8y/client'; import { CoreModule, gettext, ListItemComponent, PRODUCT_EXPERIENCE_EVENT_SOURCE } from '@c8y/ngx-components'; import { BulkOperationListItemService } from '@c8y/ngx-components/operations/bulk-operation-list-item'; import { OperationsListItemDetailsModule } from '@c8y/ngx-components/operations/operations-list-item-details'; import { OPERATION_STATUS_OPTIONS_MAP, OperationsService } from '@c8y/ngx-components/operations/shared'; import { TooltipModule } from 'ngx-bootstrap/tooltip'; import { OperationsListService } from './operations-list.service'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components/operations/bulk-operation-list-item"; import * as i2 from "@c8y/ngx-components/operations/shared"; import * as i3 from "./operations-list.service"; import * as i4 from "@angular/router"; import * as i5 from "@c8y/ngx-components"; import * as i6 from "@angular/common"; import * as i7 from "ngx-bootstrap/tooltip"; import * as i8 from "@c8y/ngx-components/operations/operations-list-item-details"; export class OperationsListItemComponent { constructor(bulkOperationListItemService, sharedService, operationsListService, route, router) { this.bulkOperationListItemService = bulkOperationListItemService; this.sharedService = sharedService; this.operationsListService = operationsListService; this.route = route; this.router = router; this.collapsed = true; this.readOnly = false; this.noExpandToggle = false; this.refreshLoading = false; this.OPERATION_STATUS = OperationStatus; this.OPERATION_STATUS_OPTIONS_MAP = OPERATION_STATUS_OPTIONS_MAP; this.deviceId = this.route.snapshot.parent?.data.contextData?.id || this.route.snapshot.firstChild?.data.contextData?.id; } ngOnInit() { this.updateOperationTitle(); const smartRulesCreatePermissions = this.operationsListService.getSmartRulesCreatePermissions(); if (smartRulesCreatePermissions) { this.inventoryPermissions = smartRulesCreatePermissions[0].anyRole; this.smartRuleAdminPermissions = smartRulesCreatePermissions[1].anyRole; } } ngOnChanges(changes) { if (changes.operation && changes.operation.currentValue) { this.updateOperationTitle(); } } createCustomizedBulkOperation($event) { if ($event) { $event.stopPropagation(); } this.router.navigateByUrl(`/devicecontrol/single/create-bulk/${this.operation.id}`); } updateOperationTitle() { this.operationTitle = this.operation?.c8y_Command?.text || this.operation?.description || gettext('No command text or description available'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OperationsListItemComponent, deps: [{ token: i1.BulkOperationListItemService }, { token: i2.OperationsService }, { token: i3.OperationsListService }, { token: i4.ActivatedRoute }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: OperationsListItemComponent, isStandalone: true, selector: "c8y-operations-list-item", inputs: { operation: "operation", collapsed: "collapsed", readOnly: "readOnly", noExpandToggle: "noExpandToggle", isSmartRulesMicroserviceAvailable: "isSmartRulesMicroserviceAvailable" }, providers: [ { provide: PRODUCT_EXPERIENCE_EVENT_SOURCE, useExisting: forwardRef(() => OperationsListItemComponent) } ], viewQueries: [{ propertyName: "listItem", first: true, predicate: ["listItem"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<c8y-li\n class=\"c8y-list__item--double-actions\"\n [ngClass]=\"{ 'c8y-list__item--no-expand': noExpandToggle }\"\n [collapsed]=\"collapsed\"\n #listItem\n id=\"{{ operation.id }}\"\n>\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].label | translate\"\n [tooltip]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].label | translate\"\n placement=\"right\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </button>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-58': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-5\">\n <span title=\"{{ operationTitle | translate }}\" class=\"text-truncate\">\n {{ operationTitle | translate }}\n </span>\n </div>\n <div class=\"col-3\" *ngIf=\"!deviceId\">\n <a\n title=\"{{ operation.deviceName }}\"\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n class=\"text-truncate\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i c8yIcon=\"calendar\" class=\"m-r-4\"></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n </div>\n <ng-container *ngIf=\"!readOnly\">\n <c8y-li-action\n label=\"{{ 'Schedule as bulk operation' | translate }}\"\n (click)=\"createCustomizedBulkOperation($event)\"\n icon=\"c8y-icon c8y-icon-energy\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n <ng-container *c8yIfAllowed=\"inventoryPermissions; allowAny: true\">\n <ng-container *c8yIfAllowed=\"smartRuleAdminPermissions; allowAny: true\">\n <c8y-li-action\n *ngIf=\"isSmartRulesMicroserviceAvailable\"\n label=\"{{ 'Create smart rule' | translate }}\"\n (click)=\"operationsListService.createSmartRule(operation)\"\n icon=\"sliders\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n </ng-container>\n </ng-container>\n <c8y-li-action\n *ngIf=\"operation.status === OPERATION_STATUS.PENDING\"\n label=\"{{ 'Cancel operation' | translate }}\"\n (click)=\"$event.stopPropagation(); sharedService.cancel(operation)\"\n icon=\"times-circle\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n </ng-container>\n <c8y-li-collapse class=\"m-b-16\">\n <c8y-operation-details-tabs\n *ngIf=\"!listItem.collapsed\"\n [operation]=\"operation\"\n [bulkOperationModalDetailsService]=\"bulkOperationListItemService\"\n ></c8y-operation-details-tabs>\n </c8y-li-collapse>\n</c8y-li>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "pipe", type: i5.DatePipe, name: "c8yDate" }, { kind: "component", type: i5.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i5.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i5.ListItemActionComponent, selector: "c8y-list-item-action, c8y-li-action", inputs: ["label", "icon", "disabled"], outputs: ["click"] }, { kind: "component", type: i5.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: i5.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: OperationsListItemDetailsModule }, { kind: "component", type: i8.OperationDetailsTabsComponent, selector: "c8y-operation-details-tabs", inputs: ["operation", "readOnly", "bulkOperationModalDetailsService"], outputs: ["onRetryFailedOperations", "showFailedOperation"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OperationsListItemComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-operations-list-item', standalone: true, imports: [CoreModule, TooltipModule, OperationsListItemDetailsModule, RouterLink], providers: [ { provide: PRODUCT_EXPERIENCE_EVENT_SOURCE, useExisting: forwardRef(() => OperationsListItemComponent) } ], template: "<c8y-li\n class=\"c8y-list__item--double-actions\"\n [ngClass]=\"{ 'c8y-list__item--no-expand': noExpandToggle }\"\n [collapsed]=\"collapsed\"\n #listItem\n id=\"{{ operation.id }}\"\n>\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].label | translate\"\n [tooltip]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].label | translate\"\n placement=\"right\"\n container=\"body\"\n [delay]=\"500\"\n >\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </button>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-58': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-5\">\n <span title=\"{{ operationTitle | translate }}\" class=\"text-truncate\">\n {{ operationTitle | translate }}\n </span>\n </div>\n <div class=\"col-3\" *ngIf=\"!deviceId\">\n <a\n title=\"{{ operation.deviceName }}\"\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n class=\"text-truncate\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i c8yIcon=\"calendar\" class=\"m-r-4\"></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n </div>\n <ng-container *ngIf=\"!readOnly\">\n <c8y-li-action\n label=\"{{ 'Schedule as bulk operation' | translate }}\"\n (click)=\"createCustomizedBulkOperation($event)\"\n icon=\"c8y-icon c8y-icon-energy\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n <ng-container *c8yIfAllowed=\"inventoryPermissions; allowAny: true\">\n <ng-container *c8yIfAllowed=\"smartRuleAdminPermissions; allowAny: true\">\n <c8y-li-action\n *ngIf=\"isSmartRulesMicroserviceAvailable\"\n label=\"{{ 'Create smart rule' | translate }}\"\n (click)=\"operationsListService.createSmartRule(operation)\"\n icon=\"sliders\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n </ng-container>\n </ng-container>\n <c8y-li-action\n *ngIf=\"operation.status === OPERATION_STATUS.PENDING\"\n label=\"{{ 'Cancel operation' | translate }}\"\n (click)=\"$event.stopPropagation(); sharedService.cancel(operation)\"\n icon=\"times-circle\"\n c8yProductExperience\n inherit\n ></c8y-li-action>\n </ng-container>\n <c8y-li-collapse class=\"m-b-16\">\n <c8y-operation-details-tabs\n *ngIf=\"!listItem.collapsed\"\n [operation]=\"operation\"\n [bulkOperationModalDetailsService]=\"bulkOperationListItemService\"\n ></c8y-operation-details-tabs>\n </c8y-li-collapse>\n</c8y-li>\n" }] }], ctorParameters: () => [{ type: i1.BulkOperationListItemService }, { type: i2.OperationsService }, { type: i3.OperationsListService }, { type: i4.ActivatedRoute }, { type: i4.Router }], propDecorators: { operation: [{ type: Input }], collapsed: [{ type: Input }], readOnly: [{ type: Input }], noExpandToggle: [{ type: Input }], isSmartRulesMicroserviceAvailable: [{ type: Input }], listItem: [{ type: ViewChild, args: ['listItem', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9ucy1saXN0LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25zLWxpc3Qvb3BlcmF0aW9ucy1saXN0LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25zLWxpc3Qvb3BlcmF0aW9ucy1saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUF5QixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsK0JBQStCLEVBR2hDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDdkcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUcsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixpQkFBaUIsRUFFbEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7QUFjbEUsTUFBTSxPQUFPLDJCQUEyQjtJQXVCdEMsWUFDUyw0QkFBMEQsRUFDMUQsYUFBZ0MsRUFDaEMscUJBQTRDLEVBQzNDLEtBQXFCLEVBQ3JCLE1BQWM7UUFKZixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQThCO1FBQzFELGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNoQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzNDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUF4QnhCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFakIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUl2QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxlQUFlLENBQUM7UUFDbkMsaUNBQTRCLEdBQW9DLDRCQUE0QixDQUFDO1FBQzdGLGFBQVEsR0FDTixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQVlwRCxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVCLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDaEcsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELDZCQUE2QixDQUFDLE1BQWM7UUFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMscUNBQXFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxjQUFjO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUk7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVztnQkFDM0IsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDeEQsQ0FBQzsrR0E1RFUsMkJBQTJCO21HQUEzQiwyQkFBMkIsbVFBUDNCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLCtCQUErQjtnQkFDeEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQzthQUMzRDtTQUNGLG1LQ2hDSCwyNEZBbUZBLDJDRHpEWSxVQUFVLHUxQ0FBRSxhQUFhLGlrQkFBRSwrQkFBK0IsMFFBQUUsVUFBVTs7NEZBUXJFLDJCQUEyQjtrQkFadkMsU0FBUzsrQkFDRSwwQkFBMEIsY0FDeEIsSUFBSSxXQUVQLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSwrQkFBK0IsRUFBRSxVQUFVLENBQUMsYUFDdEU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLCtCQUErQjs0QkFDeEMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUM7eUJBQzNEO3FCQUNGO3VOQUlELFNBQVM7c0JBRFIsS0FBSztnQkFHTixTQUFTO3NCQURSLEtBQUs7Z0JBR04sUUFBUTtzQkFEUCxLQUFLO2dCQUdOLGNBQWM7c0JBRGIsS0FBSztnQkFHTixpQ0FBaUM7c0JBRGhDLEtBQUs7Z0JBRW1DLFFBQVE7c0JBQWhELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgSU9wZXJhdGlvbiwgT3BlcmF0aW9uU3RhdHVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ29yZU1vZHVsZSxcbiAgZ2V0dGV4dCxcbiAgTGlzdEl0ZW1Db21wb25lbnQsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnQsXG4gIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2Vcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCdWxrT3BlcmF0aW9uTGlzdEl0ZW1TZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL2J1bGstb3BlcmF0aW9uLWxpc3QtaXRlbSc7XG5pbXBvcnQgeyBPcGVyYXRpb25zTGlzdEl0ZW1EZXRhaWxzTW9kdWxlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL29wZXJhdGlvbnMtbGlzdC1pdGVtLWRldGFpbHMnO1xuaW1wb3J0IHtcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUCxcbiAgT3BlcmF0aW9uc1NlcnZpY2UsXG4gIE9wZXJhdGlvblN0YXR1c09wdGlvbnNNYXBTaGFyZWRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL3NoYXJlZCc7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcbmltcG9ydCB7IE9wZXJhdGlvbnNMaXN0U2VydmljZSB9IGZyb20gJy4vb3BlcmF0aW9ucy1saXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktb3BlcmF0aW9ucy1saXN0LWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vb3BlcmF0aW9ucy1saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgT3BlcmF0aW9uc0xpc3RJdGVtRGV0YWlsc01vZHVsZSwgUm91dGVyTGlua10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcGVyYXRpb25zTGlzdEl0ZW1Db21wb25lbnQpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbnNMaXN0SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZSB7XG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogUGFydGlhbDxJT3BlcmF0aW9uPjtcbiAgQElucHV0KClcbiAgY29sbGFwc2VkID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgbm9FeHBhbmRUb2dnbGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgaXNTbWFydFJ1bGVzTWljcm9zZXJ2aWNlQXZhaWxhYmxlOiBib29sZWFuO1xuICBAVmlld0NoaWxkKCdsaXN0SXRlbScsIHsgc3RhdGljOiB0cnVlIH0pIGxpc3RJdGVtOiBMaXN0SXRlbUNvbXBvbmVudDtcbiAgcmVmcmVzaExvYWRpbmcgPSBmYWxzZTtcbiAgT1BFUkFUSU9OX1NUQVRVUyA9IE9wZXJhdGlvblN0YXR1cztcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUDogT3BlcmF0aW9uU3RhdHVzT3B0aW9uc01hcFNoYXJlZCA9IE9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVA7XG4gIGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIgPVxuICAgIHRoaXMucm91dGUuc25hcHNob3QucGFyZW50Py5kYXRhLmNvbnRleHREYXRhPy5pZCB8fFxuICAgIHRoaXMucm91dGUuc25hcHNob3QuZmlyc3RDaGlsZD8uZGF0YS5jb250ZXh0RGF0YT8uaWQ7XG4gIGludmVudG9yeVBlcm1pc3Npb25zOiBzdHJpbmdbXTtcbiAgc21hcnRSdWxlQWRtaW5QZXJtaXNzaW9uczogc3RyaW5nW107XG4gIG9wZXJhdGlvblRpdGxlOiBzdHJpbmc7XG4gIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQ6IFByb2R1Y3RFeHBlcmllbmNlRXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJ1bGtPcGVyYXRpb25MaXN0SXRlbVNlcnZpY2U6IEJ1bGtPcGVyYXRpb25MaXN0SXRlbVNlcnZpY2UsXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IE9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHB1YmxpYyBvcGVyYXRpb25zTGlzdFNlcnZpY2U6IE9wZXJhdGlvbnNMaXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZU9wZXJhdGlvblRpdGxlKCk7XG5cbiAgICBjb25zdCBzbWFydFJ1bGVzQ3JlYXRlUGVybWlzc2lvbnMgPSB0aGlzLm9wZXJhdGlvbnNMaXN0U2VydmljZS5nZXRTbWFydFJ1bGVzQ3JlYXRlUGVybWlzc2lvbnMoKTtcbiAgICBpZiAoc21hcnRSdWxlc0NyZWF0ZVBlcm1pc3Npb25zKSB7XG4gICAgICB0aGlzLmludmVudG9yeVBlcm1pc3Npb25zID0gc21hcnRSdWxlc0NyZWF0ZVBlcm1pc3Npb25zWzBdLmFueVJvbGU7XG4gICAgICB0aGlzLnNtYXJ0UnVsZUFkbWluUGVybWlzc2lvbnMgPSBzbWFydFJ1bGVzQ3JlYXRlUGVybWlzc2lvbnNbMV0uYW55Um9sZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMub3BlcmF0aW9uICYmIGNoYW5nZXMub3BlcmF0aW9uLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25UaXRsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUN1c3RvbWl6ZWRCdWxrT3BlcmF0aW9uKCRldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKCRldmVudCkge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoYC9kZXZpY2Vjb250cm9sL3NpbmdsZS9jcmVhdGUtYnVsay8ke3RoaXMub3BlcmF0aW9uLmlkfWApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVPcGVyYXRpb25UaXRsZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblRpdGxlID1cbiAgICAgIHRoaXMub3BlcmF0aW9uPy5jOHlfQ29tbWFuZD8udGV4dCB8fFxuICAgICAgdGhpcy5vcGVyYXRpb24/LmRlc2NyaXB0aW9uIHx8XG4gICAgICBnZXR0ZXh0KCdObyBjb21tYW5kIHRleHQgb3IgZGVzY3JpcHRpb24gYXZhaWxhYmxlJyk7XG4gIH1cbn1cbiIsIjxjOHktbGlcbiAgY2xhc3M9XCJjOHktbGlzdF9faXRlbS0tZG91YmxlLWFjdGlvbnNcIlxuICBbbmdDbGFzc109XCJ7ICdjOHktbGlzdF9faXRlbS0tbm8tZXhwYW5kJzogbm9FeHBhbmRUb2dnbGUgfVwiXG4gIFtjb2xsYXBzZWRdPVwiY29sbGFwc2VkXCJcbiAgI2xpc3RJdGVtXG4gIGlkPVwie3sgb3BlcmF0aW9uLmlkIH19XCJcbj5cbiAgPGM4eS1saS1pY29uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuLWNsZWFuXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQW29wZXJhdGlvbi5zdGF0dXNdLmxhYmVsIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0b29sdGlwXT1cIk9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVBbb3BlcmF0aW9uLnN0YXR1c10ubGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICA+XG4gICAgICA8aVxuICAgICAgICBbYzh5SWNvbl09XCJPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQW29wZXJhdGlvbi5zdGF0dXNdLmljb25cIlxuICAgICAgICBbbmdDbGFzc109XCJPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQW29wZXJhdGlvbi5zdGF0dXNdLnN0eWxlQ2xhc3NcIlxuICAgICAgPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgPC9jOHktbGktaWNvbj5cbiAgPGRpdiBbbmdDbGFzc109XCJ7ICdjb250ZW50LWZsZXgtNTgnOiAhcmVhZE9ubHksICdjb250ZW50LWZsZXgtNTAnOiByZWFkT25seSB9XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC01XCI+XG4gICAgICA8c3BhbiB0aXRsZT1cInt7IG9wZXJhdGlvblRpdGxlIHwgdHJhbnNsYXRlIH19XCIgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgIHt7IG9wZXJhdGlvblRpdGxlIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCIgKm5nSWY9XCIhZGV2aWNlSWRcIj5cbiAgICAgIDxhXG4gICAgICAgIHRpdGxlPVwie3sgb3BlcmF0aW9uLmRldmljZU5hbWUgfX1cIlxuICAgICAgICBbcm91dGVyTGlua109XCJbJy9kZXZpY2UnLCBvcGVyYXRpb24uZGV2aWNlSWQsICdkZXZpY2UtaW5mbyddXCJcbiAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiXG4gICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG9wZXJhdGlvbi5kZXZpY2VOYW1lIH19XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICA8c21hbGwgY2xhc3M9XCJpY29uLWZsZXggdGV4dC1tdXRlZFwiPlxuICAgICAgICA8aSBjOHlJY29uPVwiY2FsZW5kYXJcIiBjbGFzcz1cIm0tci00XCI+PC9pPlxuICAgICAgICB7eyBvcGVyYXRpb24uY3JlYXRpb25UaW1lIHwgYzh5RGF0ZSB9fVxuICAgICAgPC9zbWFsbD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZE9ubHlcIj5cbiAgICA8Yzh5LWxpLWFjdGlvblxuICAgICAgbGFiZWw9XCJ7eyAnU2NoZWR1bGUgYXMgYnVsayBvcGVyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIChjbGljayk9XCJjcmVhdGVDdXN0b21pemVkQnVsa09wZXJhdGlvbigkZXZlbnQpXCJcbiAgICAgIGljb249XCJjOHktaWNvbiBjOHktaWNvbi1lbmVyZ3lcIlxuICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgIGluaGVyaXRcbiAgICA+PC9jOHktbGktYWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKmM4eUlmQWxsb3dlZD1cImludmVudG9yeVBlcm1pc3Npb25zOyBhbGxvd0FueTogdHJ1ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqYzh5SWZBbGxvd2VkPVwic21hcnRSdWxlQWRtaW5QZXJtaXNzaW9uczsgYWxsb3dBbnk6IHRydWVcIj5cbiAgICAgICAgPGM4eS1saS1hY3Rpb25cbiAgICAgICAgICAqbmdJZj1cImlzU21hcnRSdWxlc01pY3Jvc2VydmljZUF2YWlsYWJsZVwiXG4gICAgICAgICAgbGFiZWw9XCJ7eyAnQ3JlYXRlIHNtYXJ0IHJ1bGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlcmF0aW9uc0xpc3RTZXJ2aWNlLmNyZWF0ZVNtYXJ0UnVsZShvcGVyYXRpb24pXCJcbiAgICAgICAgICBpY29uPVwic2xpZGVyc1wiXG4gICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICBpbmhlcml0XG4gICAgICAgID48L2M4eS1saS1hY3Rpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8Yzh5LWxpLWFjdGlvblxuICAgICAgKm5nSWY9XCJvcGVyYXRpb24uc3RhdHVzID09PSBPUEVSQVRJT05fU1RBVFVTLlBFTkRJTkdcIlxuICAgICAgbGFiZWw9XCJ7eyAnQ2FuY2VsIG9wZXJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgc2hhcmVkU2VydmljZS5jYW5jZWwob3BlcmF0aW9uKVwiXG4gICAgICBpY29uPVwidGltZXMtY2lyY2xlXCJcbiAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICBpbmhlcml0XG4gICAgPjwvYzh5LWxpLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxjOHktbGktY29sbGFwc2UgY2xhc3M9XCJtLWItMTZcIj5cbiAgICA8Yzh5LW9wZXJhdGlvbi1kZXRhaWxzLXRhYnNcbiAgICAgICpuZ0lmPVwiIWxpc3RJdGVtLmNvbGxhcHNlZFwiXG4gICAgICBbb3BlcmF0aW9uXT1cIm9wZXJhdGlvblwiXG4gICAgICBbYnVsa09wZXJhdGlvbk1vZGFsRGV0YWlsc1NlcnZpY2VdPVwiYnVsa09wZXJhdGlvbkxpc3RJdGVtU2VydmljZVwiXG4gICAgPjwvYzh5LW9wZXJhdGlvbi1kZXRhaWxzLXRhYnM+XG4gIDwvYzh5LWxpLWNvbGxhcHNlPlxuPC9jOHktbGk+XG4iXX0=