@netgrif/components
Version:
Netgrif Application Engine frontend Angular components
42 lines • 47.9 kB
JavaScript
import { Component } from '@angular/core';
import { AbstractRoleAssignmentComponent, RoleAssignmentService } from '@netgrif/components-core';
import * as i0 from "@angular/core";
import * as i1 from "@netgrif/components-core";
import * as i2 from "@angular/common";
import * as i3 from "@ngbracket/ngx-layout";
import * as i4 from "@ngbracket/ngx-layout/extended";
import * as i5 from "@angular/material/button";
import * as i6 from "@angular/material/divider";
import * as i7 from "@angular/material/expansion";
import * as i8 from "@angular/material/core";
import * as i9 from "@angular/material/icon";
import * as i10 from "@angular/material/input";
import * as i11 from "@angular/material/form-field";
import * as i12 from "@angular/material/list";
import * as i13 from "@angular/material/progress-bar";
import * as i14 from "@angular/material/progress-spinner";
import * as i15 from "@angular/material/toolbar";
import * as i16 from "@angular/material/tooltip";
import * as i17 from "@angular/cdk/scrolling";
import * as i18 from "@angular/forms";
import * as i19 from "@ngx-translate/core";
export class RoleAssignmentComponent extends AbstractRoleAssignmentComponent {
_service;
_userService;
constructor(_service, _userService) {
super(_service, _userService);
this._service = _service;
this._userService = _userService;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleAssignmentComponent, deps: [{ token: i1.RoleAssignmentService }, { token: i1.UserService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RoleAssignmentComponent, selector: "nc-role-assignment", providers: [
RoleAssignmentService
], usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"row\" fxLayout.lt-sm=\"column\" fxLayoutAlign=\"start center\" class=\"full-height full-width padding-default\">\n\n <div fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"49\" class=\"role-height\">\n <ng-container *ngIf=\"users.users$ | async as users_\">\n\n <mat-toolbar color=\"primary\" class=\"min-height-radius\">\n <span matTooltip=\"{{users_.length}}/{{users.totalUsers}}\">\n {{'admin.user-list.listTitle' | translate}}\n </span>\n <div fxFlex=\"5\"></div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-search-fix netgrif-input-primary-search-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <mat-label>{{ 'side-menu.user.choose' | translate }}</mat-label>\n <input matInput [formControl]=\"searchUserControl\">\n <button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\" color=\"warn\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <span style=\"flex: 1 1 auto;\"></span>\n <button disabled mat-icon-button\n matTooltip=\"{{userMultiSelect ? 'Multi selection' : 'Single selection'}}\"\n (click)=\"userMultiSelect = !userMultiSelect\">\n <mat-icon>{{userMultiSelect ? 'group' : 'person'}}</mat-icon>\n </button>\n <button mat-icon-button matTooltip=\"{{ 'side-menu.tooltip.SelectAll' | translate }}\" (click)=\"selectAllUsers(true)\">\n <mat-icon>done_all</mat-icon>\n </button>\n <button mat-icon-button matTooltip=\"{{ 'side-menu.tooltip.DeselectAll' | translate }}\" (click)=\"selectAllUsers(false)\">\n <mat-icon>clear</mat-icon>\n </button>\n </mat-toolbar>\n\n <div *ngIf=\"(users.loading$ | async) === false && users_.length === 0\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"margin-top-x2\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default no-user-icon\">perm_identity</mat-icon>\n <span class=\"font-size-20\">{{ 'admin.user-list.noUsersWereFound' | translate}}</span>\n </div>\n\n <mat-selection-list #userList color=\"primary\" fxFlex=\"100\" class=\"full-width advanced-option-list\">\n\n <cdk-virtual-scroll-viewport itemSize=\"48\" (scrolledIndexChange)=\"loadNextUserPage()\"\n class=\"full-width full-height\">\n <mat-list-option class=\"min-height-option\" *cdkVirtualFor=\"let user of users_; let i = index;\" checkboxPosition=\"before\"\n [selected]=\"user.selected\"\n [value]=\"user\"\n [ngClass]=\"{'list-item-selected':user.selected}\"\n (click)=\"user.toggle();autoSelectRoles()\" fxLayoutAlign=\"start center\" fxLayout=\"row\">\n <h3 matLine class=\"primary-color-line margin-none\">{{user.fullName}}</h3>\n <p matLine class=\"paragraph-fix margin-none\">ID: {{user.id}}, Email: {{user.email}}</p>\n </mat-list-option>\n\n <div *ngIf=\"users.loading$ | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <mat-spinner color=\"primary\" diameter=\"50\"></mat-spinner>\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n </mat-selection-list>\n </ng-container>\n </div>\n\n <div fxFlex=\"2\"></div>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"49\" class=\"role-height\">\n\n <mat-toolbar color=\"primary\" class=\"min-height-radius\">\n <span>{{'admin.process-list.listTitle' | translate}}</span>\n <div fxFlex=\"5\"></div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-search-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <mat-label>{{ 'side-menu.import-net.search' | translate }}</mat-label>\n <input matInput [formControl]=\"searchNetControl\">\n <button *ngIf=\"searchNetControl.value\" matSuffix mat-icon-button\n (click)=\"searchNetControl.setValue('')\" color=\"warn\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <span style=\"flex: 1 1 auto;\"></span>\n <mat-spinner *ngIf=\"users.updating$ | async\" color=\"accent\" diameter=\"30\"></mat-spinner>\n </mat-toolbar>\n\n <div *ngIf=\"(users.loading$ | async) === false && nets.processes.length === 0\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"margin-top-x2\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default no-user-icon\">timeline</mat-icon>\n <span class=\"font-size-20\">{{ 'admin.process-list.noProcessesWereFound' | translate}}</span>\n </div>\n\n <mat-accordion class=\"full-width margin-top-default process-list-accordion\" multi fxFlex>\n\n <mat-expansion-panel *ngFor=\"let item of filteredProcesses; let last = last;\" (afterExpand)=\"nets.loadProcessItemRoles(item)\"\n (afterCollapse)=\"nets.prepareToTryAgainToLoadRoles(item)\" class=\"panel-body\" [ngClass]=\"{'panel-last':last}\">\n\n <mat-expansion-panel-header class=\"role-header panel-color\">\n <mat-panel-title>\n <mat-icon *ngIf=\"item.someRolesSelected\" color=\"accent\" class=\"margin-right-x2\">tour</mat-icon>\n <span>{{item.initials}} - {{item.title}}</span>\n </mat-panel-title>\n <mat-panel-description class=\"process-item-description\">\n <span\n class=\"process-item-description full-width\">{{'admin.process-list.newestVersion' | translate}}\n : {{item.newestVersion}}</span>\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div *ngIf=\"item.loading\" fxFlex=\"100\" class=\"full-width\">\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n </div>\n\n <div *ngIf=\"!item.loading && item.emptyRoles\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"full-width full-height net-panel-content\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default\">account_circle</mat-icon>\n <span class=\"font-size-15\">{{ 'admin.process-list.noRoles' | translate}}</span>\n </div>\n\n <div *ngIf=\"!item.loading && !item.emptyRoles\" fxLayout=\"column\" fxLayoutAlign=\"start start\"\n class=\"full-height full-width net-panel-content\">\n\n <div *ngFor=\"let net of item.processes; let first = first\" fxLayout=\"column\"\n fxLayoutAlign=\"start center\" class=\"full-width\">\n <mat-divider *ngIf=\"!first\" style=\"position: relative\"></mat-divider>\n\n <div class=\"full-width\">\n <div fxFlex fxLayoutAlign=\"start center\">\n <h3 class=\"margin-none\" *ngIf=\"first\">{{ 'admin.process-list.roles' | translate}}</h3>\n </div>\n <div fxFlex fxLayoutAlign=\"center center\">\n <button mat-stroked-button matTooltip=\"{{item.someRolesSelected ? 'Deselect All' : 'Select All'}}\"\n (click)=\"toggleAllRoles(net, !item.someRolesSelected)\">\n {{net.version}}\n </button>\n </div>\n <div fxFlex></div>\n </div>\n\n\n <mat-selection-list color=\"accent\" fxLayout=\"row wrap\" fxLayoutAlign=\"start center\"\n class=\"full-width\">\n <mat-list-option *ngFor=\"let role of net.roles\" checkboxPosition=\"before\"\n [selected]=\"role.selected\" (click)=\"role.toggle();update(role)\"\n fxFlex=\"50\">\n <h3 matLine class=\"margin-none\">{{role.name}}</h3>\n </mat-list-option>\n </mat-selection-list>\n </div>\n </div>\n\n </mat-expansion-panel>\n\n </mat-accordion>\n\n <div *ngIf=\"nets.loading$ | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\">\n <mat-spinner color=\"primary\" diameter=\"65\"></mat-spinner>\n </div>\n </div>\n</div>\n", styles: [".full-height{height:100%;min-height:100%}.full-width{width:100%;min-width:100%}.padding-default{padding:8px}.padding-half{padding:4px}.padding-x2{padding:16px}.margin-default{margin:8px}.margin-half{margin:4px}.margin-x2{margin:16px}.margin-top-default{margin-top:8px}.margin-top-half{margin-top:4px}.margin-top-x2{margin-top:16px}.margin-bottom-default{margin-bottom:8px}.margin-bottom-half{margin-bottom:4px}.margin-bottom-x2{margin-bottom:16px}.margin-left-default{margin-left:8px}.margin-left-half{margin-left:4px}.margin-left-x2{margin-left:16px}.margin-right-default{margin-right:8px}.margin-right-half{margin-right:4px}.margin-right-x2{margin-right:16px}.user-list-item-margin{margin:4px 0}.net-panel-content{padding-left:24px;padding-right:24px;padding-bottom:24px}.font-size-20{font-size:20px}.font-size-15{font-size:15px}.no-user-icon{font-size:40px;width:40px;height:40px}.process-item-description{text-align:right}.process-list-accordion{overflow-y:auto;padding:0 2px 4px}.process-list-accordion .mat-expansion-panel-spacing{margin:8px 0}.user-assign-search{width:100%;color:#64748b;min-width:250px;border-radius:6px}.search-icon{margin-right:10px}.min-height-radius{min-height:64px;border-radius:8px}.prefix-icon{font-size:22px}.paragraph-fix{word-break:break-all;white-space:pre-wrap!important}.min-height-option{height:auto!important;min-height:48px;padding:3px 0!important}.role-header{min-height:48px!important;height:auto!important}.panel-last{padding-bottom:16px}.margin-none{margin-top:0!important;margin-bottom:0!important}.role-height{height:100%;min-height:100%}@media only screen and (max-width: 599.99px){.role-height{height:50%;min-height:50%;width:100%}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i7.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i7.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "directive", type: i8.MatLine, selector: "[mat-line], [matLine]" }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i12.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i17.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i17.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i17.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i18.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleAssignmentComponent, decorators: [{
type: Component,
args: [{ selector: 'nc-role-assignment', providers: [
RoleAssignmentService
], template: "<div fxLayout=\"row\" fxLayout.lt-sm=\"column\" fxLayoutAlign=\"start center\" class=\"full-height full-width padding-default\">\n\n <div fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"49\" class=\"role-height\">\n <ng-container *ngIf=\"users.users$ | async as users_\">\n\n <mat-toolbar color=\"primary\" class=\"min-height-radius\">\n <span matTooltip=\"{{users_.length}}/{{users.totalUsers}}\">\n {{'admin.user-list.listTitle' | translate}}\n </span>\n <div fxFlex=\"5\"></div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-search-fix netgrif-input-primary-search-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <mat-label>{{ 'side-menu.user.choose' | translate }}</mat-label>\n <input matInput [formControl]=\"searchUserControl\">\n <button *ngIf=\"searchUserControl.value\" matSuffix mat-icon-button\n (click)=\"searchUserControl.setValue('')\" color=\"warn\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <span style=\"flex: 1 1 auto;\"></span>\n <button disabled mat-icon-button\n matTooltip=\"{{userMultiSelect ? 'Multi selection' : 'Single selection'}}\"\n (click)=\"userMultiSelect = !userMultiSelect\">\n <mat-icon>{{userMultiSelect ? 'group' : 'person'}}</mat-icon>\n </button>\n <button mat-icon-button matTooltip=\"{{ 'side-menu.tooltip.SelectAll' | translate }}\" (click)=\"selectAllUsers(true)\">\n <mat-icon>done_all</mat-icon>\n </button>\n <button mat-icon-button matTooltip=\"{{ 'side-menu.tooltip.DeselectAll' | translate }}\" (click)=\"selectAllUsers(false)\">\n <mat-icon>clear</mat-icon>\n </button>\n </mat-toolbar>\n\n <div *ngIf=\"(users.loading$ | async) === false && users_.length === 0\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"margin-top-x2\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default no-user-icon\">perm_identity</mat-icon>\n <span class=\"font-size-20\">{{ 'admin.user-list.noUsersWereFound' | translate}}</span>\n </div>\n\n <mat-selection-list #userList color=\"primary\" fxFlex=\"100\" class=\"full-width advanced-option-list\">\n\n <cdk-virtual-scroll-viewport itemSize=\"48\" (scrolledIndexChange)=\"loadNextUserPage()\"\n class=\"full-width full-height\">\n <mat-list-option class=\"min-height-option\" *cdkVirtualFor=\"let user of users_; let i = index;\" checkboxPosition=\"before\"\n [selected]=\"user.selected\"\n [value]=\"user\"\n [ngClass]=\"{'list-item-selected':user.selected}\"\n (click)=\"user.toggle();autoSelectRoles()\" fxLayoutAlign=\"start center\" fxLayout=\"row\">\n <h3 matLine class=\"primary-color-line margin-none\">{{user.fullName}}</h3>\n <p matLine class=\"paragraph-fix margin-none\">ID: {{user.id}}, Email: {{user.email}}</p>\n </mat-list-option>\n\n <div *ngIf=\"users.loading$ | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\">\n <mat-spinner color=\"primary\" diameter=\"50\"></mat-spinner>\n </div>\n\n </cdk-virtual-scroll-viewport>\n\n </mat-selection-list>\n </ng-container>\n </div>\n\n <div fxFlex=\"2\"></div>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"start center\" fxFlex=\"49\" class=\"role-height\">\n\n <mat-toolbar color=\"primary\" class=\"min-height-radius\">\n <span>{{'admin.process-list.listTitle' | translate}}</span>\n <div fxFlex=\"5\"></div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" class=\"netgrif-input netgrif-input-search-fix\">\n <mat-form-field fxFlex=\"100\" class=\"user-assign-search\" color=\"primary\" appearance=\"outline\">\n <mat-icon matPrefix class=\"prefix-icon\">search</mat-icon>\n <mat-label>{{ 'side-menu.import-net.search' | translate }}</mat-label>\n <input matInput [formControl]=\"searchNetControl\">\n <button *ngIf=\"searchNetControl.value\" matSuffix mat-icon-button\n (click)=\"searchNetControl.setValue('')\" color=\"warn\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </div>\n\n <span style=\"flex: 1 1 auto;\"></span>\n <mat-spinner *ngIf=\"users.updating$ | async\" color=\"accent\" diameter=\"30\"></mat-spinner>\n </mat-toolbar>\n\n <div *ngIf=\"(users.loading$ | async) === false && nets.processes.length === 0\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"margin-top-x2\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default no-user-icon\">timeline</mat-icon>\n <span class=\"font-size-20\">{{ 'admin.process-list.noProcessesWereFound' | translate}}</span>\n </div>\n\n <mat-accordion class=\"full-width margin-top-default process-list-accordion\" multi fxFlex>\n\n <mat-expansion-panel *ngFor=\"let item of filteredProcesses; let last = last;\" (afterExpand)=\"nets.loadProcessItemRoles(item)\"\n (afterCollapse)=\"nets.prepareToTryAgainToLoadRoles(item)\" class=\"panel-body\" [ngClass]=\"{'panel-last':last}\">\n\n <mat-expansion-panel-header class=\"role-header panel-color\">\n <mat-panel-title>\n <mat-icon *ngIf=\"item.someRolesSelected\" color=\"accent\" class=\"margin-right-x2\">tour</mat-icon>\n <span>{{item.initials}} - {{item.title}}</span>\n </mat-panel-title>\n <mat-panel-description class=\"process-item-description\">\n <span\n class=\"process-item-description full-width\">{{'admin.process-list.newestVersion' | translate}}\n : {{item.newestVersion}}</span>\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <div *ngIf=\"item.loading\" fxFlex=\"100\" class=\"full-width\">\n <mat-progress-bar mode=\"indeterminate\" color=\"primary\"></mat-progress-bar>\n </div>\n\n <div *ngIf=\"!item.loading && item.emptyRoles\" fxLayout=\"column\"\n fxLayoutAlign=\"center center\" fxFlex class=\"full-width full-height net-panel-content\">\n <mat-icon color=\"accent\" class=\"margin-bottom-default\">account_circle</mat-icon>\n <span class=\"font-size-15\">{{ 'admin.process-list.noRoles' | translate}}</span>\n </div>\n\n <div *ngIf=\"!item.loading && !item.emptyRoles\" fxLayout=\"column\" fxLayoutAlign=\"start start\"\n class=\"full-height full-width net-panel-content\">\n\n <div *ngFor=\"let net of item.processes; let first = first\" fxLayout=\"column\"\n fxLayoutAlign=\"start center\" class=\"full-width\">\n <mat-divider *ngIf=\"!first\" style=\"position: relative\"></mat-divider>\n\n <div class=\"full-width\">\n <div fxFlex fxLayoutAlign=\"start center\">\n <h3 class=\"margin-none\" *ngIf=\"first\">{{ 'admin.process-list.roles' | translate}}</h3>\n </div>\n <div fxFlex fxLayoutAlign=\"center center\">\n <button mat-stroked-button matTooltip=\"{{item.someRolesSelected ? 'Deselect All' : 'Select All'}}\"\n (click)=\"toggleAllRoles(net, !item.someRolesSelected)\">\n {{net.version}}\n </button>\n </div>\n <div fxFlex></div>\n </div>\n\n\n <mat-selection-list color=\"accent\" fxLayout=\"row wrap\" fxLayoutAlign=\"start center\"\n class=\"full-width\">\n <mat-list-option *ngFor=\"let role of net.roles\" checkboxPosition=\"before\"\n [selected]=\"role.selected\" (click)=\"role.toggle();update(role)\"\n fxFlex=\"50\">\n <h3 matLine class=\"margin-none\">{{role.name}}</h3>\n </mat-list-option>\n </mat-selection-list>\n </div>\n </div>\n\n </mat-expansion-panel>\n\n </mat-accordion>\n\n <div *ngIf=\"nets.loading$ | async\" fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"100\">\n <mat-spinner color=\"primary\" diameter=\"65\"></mat-spinner>\n </div>\n </div>\n</div>\n", styles: [".full-height{height:100%;min-height:100%}.full-width{width:100%;min-width:100%}.padding-default{padding:8px}.padding-half{padding:4px}.padding-x2{padding:16px}.margin-default{margin:8px}.margin-half{margin:4px}.margin-x2{margin:16px}.margin-top-default{margin-top:8px}.margin-top-half{margin-top:4px}.margin-top-x2{margin-top:16px}.margin-bottom-default{margin-bottom:8px}.margin-bottom-half{margin-bottom:4px}.margin-bottom-x2{margin-bottom:16px}.margin-left-default{margin-left:8px}.margin-left-half{margin-left:4px}.margin-left-x2{margin-left:16px}.margin-right-default{margin-right:8px}.margin-right-half{margin-right:4px}.margin-right-x2{margin-right:16px}.user-list-item-margin{margin:4px 0}.net-panel-content{padding-left:24px;padding-right:24px;padding-bottom:24px}.font-size-20{font-size:20px}.font-size-15{font-size:15px}.no-user-icon{font-size:40px;width:40px;height:40px}.process-item-description{text-align:right}.process-list-accordion{overflow-y:auto;padding:0 2px 4px}.process-list-accordion .mat-expansion-panel-spacing{margin:8px 0}.user-assign-search{width:100%;color:#64748b;min-width:250px;border-radius:6px}.search-icon{margin-right:10px}.min-height-radius{min-height:64px;border-radius:8px}.prefix-icon{font-size:22px}.paragraph-fix{word-break:break-all;white-space:pre-wrap!important}.min-height-option{height:auto!important;min-height:48px;padding:3px 0!important}.role-header{min-height:48px!important;height:auto!important}.panel-last{padding-bottom:16px}.margin-none{margin-top:0!important;margin-bottom:0!important}.role-height{height:100%;min-height:100%}@media only screen and (max-width: 599.99px){.role-height{height:50%;min-height:50%;width:100%}}\n"] }]
}], ctorParameters: () => [{ type: i1.RoleAssignmentService }, { type: i1.UserService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1hc3NpZ25tZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy9zcmMvbGliL2FkbWluL3JvbGUtYXNzaWdubWVudC9yb2xlLWFzc2lnbm1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzL3NyYy9saWIvYWRtaW4vcm9sZS1hc3NpZ25tZW50L3JvbGUtYXNzaWdubWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQywrQkFBK0IsRUFBRSxxQkFBcUIsRUFBYyxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVN0csTUFBTSxPQUFPLHVCQUF3QixTQUFRLCtCQUErQjtJQUNsRDtJQUEyQztJQUFqRSxZQUFzQixRQUErQixFQUFZLFlBQXlCO1FBQ3RGLEtBQUssQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFEWixhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUFZLGlCQUFZLEdBQVosWUFBWSxDQUFhO0lBRTFGLENBQUM7d0dBSFEsdUJBQXVCOzRGQUF2Qix1QkFBdUIsNkNBSnJCO1lBQ1AscUJBQXFCO1NBQ3hCLGlEQ1RMLG9zVEFvS0E7OzRGRHpKYSx1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0ksb0JBQW9CLGFBR25CO3dCQUNQLHFCQUFxQjtxQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Um9sZUFzc2lnbm1lbnRDb21wb25lbnQsIFJvbGVBc3NpZ25tZW50U2VydmljZSwgVXNlclNlcnZpY2V9IGZyb20gJ0BuZXRncmlmL2NvbXBvbmVudHMtY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmMtcm9sZS1hc3NpZ25tZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcm9sZS1hc3NpZ25tZW50LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9yb2xlLWFzc2lnbm1lbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Um9sZUFzc2lnbm1lbnRDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfc2VydmljZTogUm9sZUFzc2lnbm1lbnRTZXJ2aWNlLCBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSkge1xuICAgICAgICBzdXBlcihfc2VydmljZSwgX3VzZXJTZXJ2aWNlKTtcbiAgICB9XG59XG4iLCI8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQubHQtc209XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgY2xhc3M9XCJmdWxsLWhlaWdodCBmdWxsLXdpZHRoIHBhZGRpbmctZGVmYXVsdFwiPlxuXG4gICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeEZsZXg9XCI0OVwiIGNsYXNzPVwicm9sZS1oZWlnaHRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJzLnVzZXJzJCB8IGFzeW5jIGFzIHVzZXJzX1wiPlxuXG4gICAgICAgICAgICA8bWF0LXRvb2xiYXIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJtaW4taGVpZ2h0LXJhZGl1c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRvb2x0aXA9XCJ7e3VzZXJzXy5sZW5ndGh9fS97e3VzZXJzLnRvdGFsVXNlcnN9fVwiPlxuICAgICAgICAgICAgICAgICAgICB7eydhZG1pbi51c2VyLWxpc3QubGlzdFRpdGxlJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PVwiNVwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBjbGFzcz1cIm5ldGdyaWYtaW5wdXQgbmV0Z3JpZi1pbnB1dC1zZWFyY2gtZml4IG5ldGdyaWYtaW5wdXQtcHJpbWFyeS1zZWFyY2gtZml4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBjbGFzcz1cInVzZXItYXNzaWduLXNlYXJjaFwiIGNvbG9yPVwicHJpbWFyeVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4IGNsYXNzPVwicHJlZml4LWljb25cIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnc2lkZS1tZW51LnVzZXIuY2hvb3NlJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzZWFyY2hVc2VyQ29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlYXJjaFVzZXJDb250cm9sLnZhbHVlXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoVXNlckNvbnRyb2wuc2V0VmFsdWUoJycpXCIgY29sb3I9XCJ3YXJuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxIDEgYXV0bztcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZCBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7e3VzZXJNdWx0aVNlbGVjdCA/ICdNdWx0aSBzZWxlY3Rpb24nIDogJ1NpbmdsZSBzZWxlY3Rpb24nfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJNdWx0aVNlbGVjdCA9ICF1c2VyTXVsdGlTZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnt7dXNlck11bHRpU2VsZWN0ID8gJ2dyb3VwJyA6ICdwZXJzb24nfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJ7eyAnc2lkZS1tZW51LnRvb2x0aXAuU2VsZWN0QWxsJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJzZWxlY3RBbGxVc2Vycyh0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZG9uZV9hbGw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJ7eyAnc2lkZS1tZW51LnRvb2x0aXAuRGVzZWxlY3RBbGwnIHwgdHJhbnNsYXRlIH19XCIgKGNsaWNrKT1cInNlbGVjdEFsbFVzZXJzKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtdG9vbGJhcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIih1c2Vycy5sb2FkaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgdXNlcnNfLmxlbmd0aCA9PT0gMFwiIGZ4TGF5b3V0PVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBmeEZsZXggY2xhc3M9XCJtYXJnaW4tdG9wLXgyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwiYWNjZW50XCIgY2xhc3M9XCJtYXJnaW4tYm90dG9tLWRlZmF1bHQgbm8tdXNlci1pY29uXCI+cGVybV9pZGVudGl0eTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNpemUtMjBcIj57eyAnYWRtaW4udXNlci1saXN0Lm5vVXNlcnNXZXJlRm91bmQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCAjdXNlckxpc3QgY29sb3I9XCJwcmltYXJ5XCIgZnhGbGV4PVwiMTAwXCIgY2xhc3M9XCJmdWxsLXdpZHRoIGFkdmFuY2VkLW9wdGlvbi1saXN0XCI+XG5cbiAgICAgICAgICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IGl0ZW1TaXplPVwiNDhcIiAoc2Nyb2xsZWRJbmRleENoYW5nZSk9XCJsb2FkTmV4dFVzZXJQYWdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoIGZ1bGwtaGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGlzdC1vcHRpb24gY2xhc3M9XCJtaW4taGVpZ2h0LW9wdGlvblwiICpjZGtWaXJ0dWFsRm9yPVwibGV0IHVzZXIgb2YgdXNlcnNfOyBsZXQgaSA9IGluZGV4O1wiIGNoZWNrYm94UG9zaXRpb249XCJiZWZvcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJ1c2VyLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydsaXN0LWl0ZW0tc2VsZWN0ZWQnOnVzZXIuc2VsZWN0ZWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlci50b2dnbGUoKTthdXRvU2VsZWN0Um9sZXMoKVwiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIiBmeExheW91dD1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIG1hdExpbmUgY2xhc3M9XCJwcmltYXJ5LWNvbG9yLWxpbmUgbWFyZ2luLW5vbmVcIj57e3VzZXIuZnVsbE5hbWV9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBtYXRMaW5lIGNsYXNzPVwicGFyYWdyYXBoLWZpeCBtYXJnaW4tbm9uZVwiPklEOiB7e3VzZXIuaWR9fSwgRW1haWw6IHt7dXNlci5lbWFpbH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlcnMubG9hZGluZyQgfCBhc3luY1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBjb2xvcj1cInByaW1hcnlcIiBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBmeEZsZXg9XCIyXCI+PC9kaXY+XG5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGZ4RmxleD1cIjQ5XCIgY2xhc3M9XCJyb2xlLWhlaWdodFwiPlxuXG4gICAgICAgIDxtYXQtdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm1pbi1oZWlnaHQtcmFkaXVzXCI+XG4gICAgICAgICAgICA8c3Bhbj57eydhZG1pbi5wcm9jZXNzLWxpc3QubGlzdFRpdGxlJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBmeEZsZXg9XCI1XCI+PC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCIgY2xhc3M9XCJuZXRncmlmLWlucHV0IG5ldGdyaWYtaW5wdXQtc2VhcmNoLWZpeFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDBcIiBjbGFzcz1cInVzZXItYXNzaWduLXNlYXJjaFwiIGNvbG9yPVwicHJpbWFyeVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXggY2xhc3M9XCJwcmVmaXgtaWNvblwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ3NpZGUtbWVudS5pbXBvcnQtbmV0LnNlYXJjaCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzZWFyY2hOZXRDb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWFyY2hOZXRDb250cm9sLnZhbHVlXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hOZXRDb250cm9sLnNldFZhbHVlKCcnKVwiIGNvbG9yPVwid2FyblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDEgMSBhdXRvO1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cInVzZXJzLnVwZGF0aW5nJCB8IGFzeW5jXCIgY29sb3I9XCJhY2NlbnRcIiBkaWFtZXRlcj1cIjMwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiKHVzZXJzLmxvYWRpbmckIHwgYXN5bmMpID09PSBmYWxzZSAmJiBuZXRzLnByb2Nlc3Nlcy5sZW5ndGggPT09IDBcIiBmeExheW91dD1cImNvbHVtblwiXG4gICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBmeEZsZXggY2xhc3M9XCJtYXJnaW4tdG9wLXgyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJhY2NlbnRcIiBjbGFzcz1cIm1hcmdpbi1ib3R0b20tZGVmYXVsdCBuby11c2VyLWljb25cIj50aW1lbGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2l6ZS0yMFwiPnt7ICdhZG1pbi5wcm9jZXNzLWxpc3Qubm9Qcm9jZXNzZXNXZXJlRm91bmQnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxtYXQtYWNjb3JkaW9uIGNsYXNzPVwiZnVsbC13aWR0aCBtYXJnaW4tdG9wLWRlZmF1bHQgcHJvY2Vzcy1saXN0LWFjY29yZGlvblwiIG11bHRpIGZ4RmxleD5cblxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRQcm9jZXNzZXM7IGxldCBsYXN0ID0gbGFzdDtcIiAoYWZ0ZXJFeHBhbmQpPVwibmV0cy5sb2FkUHJvY2Vzc0l0ZW1Sb2xlcyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWZ0ZXJDb2xsYXBzZSk9XCJuZXRzLnByZXBhcmVUb1RyeUFnYWluVG9Mb2FkUm9sZXMoaXRlbSlcIiBjbGFzcz1cInBhbmVsLWJvZHlcIiBbbmdDbGFzc109XCJ7J3BhbmVsLWxhc3QnOmxhc3R9XCI+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgY2xhc3M9XCJyb2xlLWhlYWRlciBwYW5lbC1jb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiaXRlbS5zb21lUm9sZXNTZWxlY3RlZFwiIGNvbG9yPVwiYWNjZW50XCIgY2xhc3M9XCJtYXJnaW4tcmlnaHQteDJcIj50b3VyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXRlbS5pbml0aWFsc319IC0ge3tpdGVtLnRpdGxlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLWRlc2NyaXB0aW9uIGNsYXNzPVwicHJvY2Vzcy1pdGVtLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvY2Vzcy1pdGVtLWRlc2NyaXB0aW9uIGZ1bGwtd2lkdGhcIj57eydhZG1pbi5wcm9jZXNzLWxpc3QubmV3ZXN0VmVyc2lvbicgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge3tpdGVtLm5ld2VzdFZlcnNpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmxvYWRpbmdcIiBmeEZsZXg9XCIxMDBcIiBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWl0ZW0ubG9hZGluZyAmJiBpdGVtLmVtcHR5Um9sZXNcIiBmeExheW91dD1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGZ4RmxleCBjbGFzcz1cImZ1bGwtd2lkdGggZnVsbC1oZWlnaHQgbmV0LXBhbmVsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwiYWNjZW50XCIgY2xhc3M9XCJtYXJnaW4tYm90dG9tLWRlZmF1bHRcIj5hY2NvdW50X2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zaXplLTE1XCI+e3sgJ2FkbWluLnByb2Nlc3MtbGlzdC5ub1JvbGVzJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLmxvYWRpbmcgJiYgIWl0ZW0uZW1wdHlSb2xlc1wiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC1oZWlnaHQgZnVsbC13aWR0aCBuZXQtcGFuZWwtY29udGVudFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG5ldCBvZiBpdGVtLnByb2Nlc3NlczsgbGV0IGZpcnN0ID0gZmlyc3RcIiBmeExheW91dD1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiIWZpcnN0XCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj48L21hdC1kaXZpZGVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4IGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwibWFyZ2luLW5vbmVcIiAqbmdJZj1cImZpcnN0XCI+e3sgJ2FkbWluLnByb2Nlc3MtbGlzdC5yb2xlcycgfCB0cmFuc2xhdGV9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeEZsZXggZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gbWF0VG9vbHRpcD1cInt7aXRlbS5zb21lUm9sZXNTZWxlY3RlZCA/ICdEZXNlbGVjdCBBbGwnIDogJ1NlbGVjdCBBbGwnfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbGxSb2xlcyhuZXQsICFpdGVtLnNvbWVSb2xlc1NlbGVjdGVkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tuZXQudmVyc2lvbn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhGbGV4PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCBjb2xvcj1cImFjY2VudFwiIGZ4TGF5b3V0PVwicm93IHdyYXBcIiBmeExheW91dEFsaWduPVwic3RhcnQgY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1saXN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcm9sZSBvZiBuZXQucm9sZXNcIiBjaGVja2JveFBvc2l0aW9uPVwiYmVmb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJyb2xlLnNlbGVjdGVkXCIgKGNsaWNrKT1cInJvbGUudG9nZ2xlKCk7dXBkYXRlKHJvbGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4RmxleD1cIjUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBtYXRMaW5lIGNsYXNzPVwibWFyZ2luLW5vbmVcIj57e3JvbGUubmFtZX19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gICAgICAgIDwvbWF0LWFjY29yZGlvbj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibmV0cy5sb2FkaW5nJCB8IGFzeW5jXCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGZ4RmxleD1cIjEwMFwiPlxuICAgICAgICAgICAgPG1hdC1zcGlubmVyIGNvbG9yPVwicHJpbWFyeVwiIGRpYW1ldGVyPVwiNjVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19