UNPKG

@alfresco/adf-content-services

Version:
88 lines 38.6 kB
import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core'; import { PermissionListService } from './permission-list.service'; import { CommonModule } from '@angular/common'; import { MatCardModule } from '@angular/material/card'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatIconModule } from '@angular/material/icon'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { TranslateModule } from '@ngx-translate/core'; import { MatButtonModule } from '@angular/material/button'; import { PermissionContainerComponent } from '../permission-container/permission-container.component'; import { PopOverDirective } from '../pop-over.directive'; import { AllowableOperationsEnum, ContentService } from '../../../common'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import * as i0 from "@angular/core"; import * as i1 from "./permission-list.service"; import * as i2 from "../../../common"; import * as i3 from "@angular/common"; import * as i4 from "@angular/material/card"; import * as i5 from "@angular/material/progress-spinner"; import * as i6 from "@angular/material/icon"; import * as i7 from "@angular/material/slide-toggle"; import * as i8 from "@ngx-translate/core"; import * as i9 from "@angular/material/button"; export class PermissionListComponent { get updatePermissionsAllowed() { return this._updatePermissionsAllowed; } constructor(permissionList, contentService) { this.permissionList = permissionList; this.contentService = contentService; this.selectedPermissions = []; this._updatePermissionsAllowed = false; this.destroyRef = inject(DestroyRef); this.error = this.permissionList.errored; this.update = this.permissionList.updated; } ngOnInit() { this.permissionList.fetchPermission(this.nodeId); this.permissionList.data$ .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((model) => (this._updatePermissionsAllowed = this.contentService.hasAllowableOperations(model.node, AllowableOperationsEnum.UPDATEPERMISSIONS))); } openAddPermissionDialog() { this.permissionList.updateNodePermissionByDialog(); } onSelect(selections) { this.selectedPermissions = selections.map((selection) => selection['obj']).filter((permission) => !permission.readonly); } deleteSelection() { this.permissionList.deletePermissions(this.selectedPermissions); this.selectedPermissions = []; } updatePermission({ role, permission }) { this.permissionList.updateRole(role, permission); } deletePermission(permission) { this.selectedPermissions = []; this.permissionList.deletePermission(permission); } updateAllPermission(role) { this.permissionList.bulkRoleUpdate(role); this.selectedPermissions = []; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PermissionListComponent, deps: [{ token: i1.PermissionListService }, { token: i2.ContentService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: PermissionListComponent, isStandalone: true, selector: "adf-permission-list", inputs: { nodeId: "nodeId" }, outputs: { update: "update", error: "error" }, ngImport: i0, template: "<mat-card class=\"adf-permission-card\" id=\"adf-permission-manager-card\">\n <div *ngIf=\"(permissionList.data$ | async) === null && permissionList.loading$ | async\" class=\"adf-permission-loader\">\n <mat-progress-spinner [color]=\"'primary'\" [mode]=\"'indeterminate'\" />\n </div>\n\n <ng-container *ngIf=\"permissionList.error$ | async\">\n <div class=\"adf-no-permission__template\" id=\"adf-permission-manager-error\">\n <mat-icon color=\"warn\">error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'PERMISSION_MANAGER.ERROR.NOT-FOUND'| translate }}</p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"permissionList.data$ | async as model\">\n <div class=\"adf-permission-container\" #target>\n\n <div class=\"adf-permission-header\">\n <span class=\"adf-inherit-container\">\n <h3 class=\"adf-inherit-container-header\">\n {{'PERMISSION_MANAGER.LABELS.INHERITED-PERMISSIONS' | translate }}\n\n {{ (model.node.permissions.isInheritanceEnabled ? \"PERMISSION_MANAGER.LABELS.ON\" : \"PERMISSION_MANAGER.LABELS.OFF\") | translate }}\n </h3>\n\n <mat-slide-toggle\n *ngIf=\"updatePermissionsAllowed\"\n class=\"adf-inherit-toggle\"\n title=\"{{'PERMISSION_MANAGER.LABELS.INHERITED_PERMISSION_TOGGLE' | translate }}\"\n color=\"primary\"\n aria-label=\"{{'PERMISSION_MANAGER.LABELS.INHERITED_PERMISSION_TOGGLE' | translate}}\"\n data-automation-id=\"adf-inherit-toggle-button\"\n [checked]=\"model.node.permissions.isInheritanceEnabled\"\n (change)=\"permissionList.toggleInherited($event)\" />\n </span>\n\n <span class=\"adf-inherit-subtitle\" title=\"total\">\n {{'PERMISSION_MANAGER.LABELS.INHERITED-SUBTITLE' | translate: { count: model.inheritedPermissions.length } }}\n </span>\n </div>\n\n <button\n mat-flat-button\n data-automation-id=\"permission-info-button\"\n class=\"adf-permission-visibility-toggle\"\n [adf-pop-over]=\"inheritedPermission\"\n [target]=\"target\"\n #popOver=\"adfPopOver\"\n *ngIf=\"model.node.permissions.isInheritanceEnabled\">\n {{ (popOver.open ? 'PERMISSION_MANAGER.LABELS.HIDE' : 'PERMISSION_MANAGER.LABELS.SHOW') | translate }}\n <mat-icon class=\"adf-permission-visibility-toggle-icon\" iconPositionEnd>\n {{ popOver.open ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} </mat-icon>\n </button>\n </div>\n\n <ng-template #inheritedPermission>\n <div class=\"adf-pop-over-card\">\n <adf-permission-container\n data-automation-id=\"adf-inherited-permission\"\n [isReadOnly]=\"true\"\n [node]=\"model.node\"\n [permissions]=\"model.inheritedPermissions\"\n [showLocation]=\"true\"\n [selectionMode]=\"'none'\"\n [roles]=\"model.roles\" />\n </div>\n </ng-template>\n\n <mat-card-content class=\"adf-local-permission-container\">\n <section class=\"adf-permission-content-header\">\n <h3>{{'PERMISSION_MANAGER.LABELS.DIRECT-PERMISSIONS' | translate }}</h3>\n\n <div class=\"adf-toolbar--spacer\"></div>\n\n <ng-container *ngIf=\"updatePermissionsAllowed\">\n <button\n mat-icon-button\n title=\"{{'PERMISSION_MANAGER.ACTION.ADD-PERMISSION' | translate}}\"\n (click)=\"openAddPermissionDialog()\"\n class=\"adf-add-permission-button\"\n data-automation-id=\"adf-add-permission-button\">\n <mat-icon>person_add_outline</mat-icon>\n </button>\n\n <button\n mat-icon-button\n title=\"{{'PERMISSION_MANAGER.ACTION.DELETE' | translate}}\"\n [disabled]=\"!selectedPermissions?.length\"\n (click)=\"deleteSelection()\"\n data-automation-id=\"adf-delete-selected-permission\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n </ng-container>\n </section>\n\n <adf-permission-container\n class=\"adf-permission-list\"\n data-automation-id=\"adf-locally-set-permission\"\n [node]=\"model.node\"\n [permissions]=\"model.localPermissions\"\n (update)=\"updatePermission($event)\"\n (delete)=\"deletePermission($event)\"\n (updateAll)=\"updateAllPermission($event)\"\n (row-select)=\"onSelect($any($event).detail.selection)\"\n (row-unselect)=\"onSelect($any($event).detail.selection)\"\n [roles]=\"model.roles\"\n [isReadOnly]=\"!updatePermissionsAllowed\"/>\n\n </mat-card-content>\n </ng-container>\n</mat-card>\n", styles: [".adf-permission-card{height:100%;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden;padding:16px}.adf-permission-loader{margin-left:45%;overflow:hidden}.adf-permission-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:10px 15px;border:1px solid var(--adf-theme-foreground-text-color-007)}.adf-permission-container .adf-permission-visibility-toggle .adf-permission-visibility-toggle-icon{font-size:24px;height:24px;width:24px;margin:1px 0 0 4px}.adf-inherit-container{display:flex;flex-direction:row;align-items:center}.adf-inherit-container-header{margin-bottom:10px;margin-top:10px}.adf-inherit-toggle{padding-left:30px;margin-top:-2px}.adf-inherit-subtitle{padding-bottom:5px}.adf-permission-content-header{display:flex;flex-direction:row;align-items:center;padding:5px 15px}.adf-permission-content-header .adf-add-permission-button{margin-left:12px;margin-right:24px}.adf-permission-content-header .adf-toolbar--spacer{flex:1 1 auto}.adf-permission-role-column-header{position:relative;height:40px}.adf-permission-header{display:flex;flex-direction:column;flex:1;height:100%;overflow:hidden;min-height:0}.adf-permission-list{display:flex;height:calc(100% - 63px)}.adf-local-permission-container.mat-mdc-card-content{overflow:hidden;flex:1 1 auto;padding:0}[aria-sort=Ascending] adf-user-role-column,[aria-sort=Descending] adf-user-role-column{padding-left:10px;padding-right:10px}.adf-permission-pop-over{padding-right:15px;width:100%}.adf-permission-pop-over .adf-pop-over-card{width:100%;overflow:hidden;box-shadow:0 8px 9px -5px var(--adf-theme-foreground-divider-color),0 15px 22px 2px var(--adf-theme-foreground-divider-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i4.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: PermissionContainerComponent, selector: "adf-permission-container", inputs: ["node", "permissions", "roles", "isReadOnly", "showLocation", "selectionMode"], outputs: ["update", "updateAll", "delete", "error"] }, { kind: "directive", type: PopOverDirective, selector: "[adf-pop-over]", inputs: ["adf-pop-over", "target", "panelClass", "autofocusedElementSelector"], exportAs: ["adfPopOver"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: PermissionListComponent, decorators: [{ type: Component, args: [{ selector: 'adf-permission-list', standalone: true, imports: [ CommonModule, MatCardModule, MatProgressSpinnerModule, MatIconModule, MatSlideToggleModule, TranslateModule, MatButtonModule, PermissionContainerComponent, PopOverDirective ], encapsulation: ViewEncapsulation.None, template: "<mat-card class=\"adf-permission-card\" id=\"adf-permission-manager-card\">\n <div *ngIf=\"(permissionList.data$ | async) === null && permissionList.loading$ | async\" class=\"adf-permission-loader\">\n <mat-progress-spinner [color]=\"'primary'\" [mode]=\"'indeterminate'\" />\n </div>\n\n <ng-container *ngIf=\"permissionList.error$ | async\">\n <div class=\"adf-no-permission__template\" id=\"adf-permission-manager-error\">\n <mat-icon color=\"warn\">error</mat-icon>\n <p class=\"adf-no-permission__template--text\">{{ 'PERMISSION_MANAGER.ERROR.NOT-FOUND'| translate }}</p>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"permissionList.data$ | async as model\">\n <div class=\"adf-permission-container\" #target>\n\n <div class=\"adf-permission-header\">\n <span class=\"adf-inherit-container\">\n <h3 class=\"adf-inherit-container-header\">\n {{'PERMISSION_MANAGER.LABELS.INHERITED-PERMISSIONS' | translate }}\n\n {{ (model.node.permissions.isInheritanceEnabled ? \"PERMISSION_MANAGER.LABELS.ON\" : \"PERMISSION_MANAGER.LABELS.OFF\") | translate }}\n </h3>\n\n <mat-slide-toggle\n *ngIf=\"updatePermissionsAllowed\"\n class=\"adf-inherit-toggle\"\n title=\"{{'PERMISSION_MANAGER.LABELS.INHERITED_PERMISSION_TOGGLE' | translate }}\"\n color=\"primary\"\n aria-label=\"{{'PERMISSION_MANAGER.LABELS.INHERITED_PERMISSION_TOGGLE' | translate}}\"\n data-automation-id=\"adf-inherit-toggle-button\"\n [checked]=\"model.node.permissions.isInheritanceEnabled\"\n (change)=\"permissionList.toggleInherited($event)\" />\n </span>\n\n <span class=\"adf-inherit-subtitle\" title=\"total\">\n {{'PERMISSION_MANAGER.LABELS.INHERITED-SUBTITLE' | translate: { count: model.inheritedPermissions.length } }}\n </span>\n </div>\n\n <button\n mat-flat-button\n data-automation-id=\"permission-info-button\"\n class=\"adf-permission-visibility-toggle\"\n [adf-pop-over]=\"inheritedPermission\"\n [target]=\"target\"\n #popOver=\"adfPopOver\"\n *ngIf=\"model.node.permissions.isInheritanceEnabled\">\n {{ (popOver.open ? 'PERMISSION_MANAGER.LABELS.HIDE' : 'PERMISSION_MANAGER.LABELS.SHOW') | translate }}\n <mat-icon class=\"adf-permission-visibility-toggle-icon\" iconPositionEnd>\n {{ popOver.open ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} </mat-icon>\n </button>\n </div>\n\n <ng-template #inheritedPermission>\n <div class=\"adf-pop-over-card\">\n <adf-permission-container\n data-automation-id=\"adf-inherited-permission\"\n [isReadOnly]=\"true\"\n [node]=\"model.node\"\n [permissions]=\"model.inheritedPermissions\"\n [showLocation]=\"true\"\n [selectionMode]=\"'none'\"\n [roles]=\"model.roles\" />\n </div>\n </ng-template>\n\n <mat-card-content class=\"adf-local-permission-container\">\n <section class=\"adf-permission-content-header\">\n <h3>{{'PERMISSION_MANAGER.LABELS.DIRECT-PERMISSIONS' | translate }}</h3>\n\n <div class=\"adf-toolbar--spacer\"></div>\n\n <ng-container *ngIf=\"updatePermissionsAllowed\">\n <button\n mat-icon-button\n title=\"{{'PERMISSION_MANAGER.ACTION.ADD-PERMISSION' | translate}}\"\n (click)=\"openAddPermissionDialog()\"\n class=\"adf-add-permission-button\"\n data-automation-id=\"adf-add-permission-button\">\n <mat-icon>person_add_outline</mat-icon>\n </button>\n\n <button\n mat-icon-button\n title=\"{{'PERMISSION_MANAGER.ACTION.DELETE' | translate}}\"\n [disabled]=\"!selectedPermissions?.length\"\n (click)=\"deleteSelection()\"\n data-automation-id=\"adf-delete-selected-permission\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n </ng-container>\n </section>\n\n <adf-permission-container\n class=\"adf-permission-list\"\n data-automation-id=\"adf-locally-set-permission\"\n [node]=\"model.node\"\n [permissions]=\"model.localPermissions\"\n (update)=\"updatePermission($event)\"\n (delete)=\"deletePermission($event)\"\n (updateAll)=\"updateAllPermission($event)\"\n (row-select)=\"onSelect($any($event).detail.selection)\"\n (row-unselect)=\"onSelect($any($event).detail.selection)\"\n [roles]=\"model.roles\"\n [isReadOnly]=\"!updatePermissionsAllowed\"/>\n\n </mat-card-content>\n </ng-container>\n</mat-card>\n", styles: [".adf-permission-card{height:100%;box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden;padding:16px}.adf-permission-loader{margin-left:45%;overflow:hidden}.adf-permission-container{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:10px 15px;border:1px solid var(--adf-theme-foreground-text-color-007)}.adf-permission-container .adf-permission-visibility-toggle .adf-permission-visibility-toggle-icon{font-size:24px;height:24px;width:24px;margin:1px 0 0 4px}.adf-inherit-container{display:flex;flex-direction:row;align-items:center}.adf-inherit-container-header{margin-bottom:10px;margin-top:10px}.adf-inherit-toggle{padding-left:30px;margin-top:-2px}.adf-inherit-subtitle{padding-bottom:5px}.adf-permission-content-header{display:flex;flex-direction:row;align-items:center;padding:5px 15px}.adf-permission-content-header .adf-add-permission-button{margin-left:12px;margin-right:24px}.adf-permission-content-header .adf-toolbar--spacer{flex:1 1 auto}.adf-permission-role-column-header{position:relative;height:40px}.adf-permission-header{display:flex;flex-direction:column;flex:1;height:100%;overflow:hidden;min-height:0}.adf-permission-list{display:flex;height:calc(100% - 63px)}.adf-local-permission-container.mat-mdc-card-content{overflow:hidden;flex:1 1 auto;padding:0}[aria-sort=Ascending] adf-user-role-column,[aria-sort=Descending] adf-user-role-column{padding-left:10px;padding-right:10px}.adf-permission-pop-over{padding-right:15px;width:100%}.adf-permission-pop-over .adf-pop-over-card{width:100%;overflow:hidden;box-shadow:0 8px 9px -5px var(--adf-theme-foreground-divider-color),0 15px 22px 2px var(--adf-theme-foreground-divider-color)}\n"] }] }], ctorParameters: () => [{ type: i1.PermissionListService }, { type: i2.ContentService }], propDecorators: { nodeId: [{ type: Input, args: [{ required: true }] }], update: [{ type: Output }], error: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvcGVybWlzc2lvbi1tYW5hZ2VyL2NvbXBvbmVudHMvcGVybWlzc2lvbi1saXN0L3Blcm1pc3Npb24tbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3Blcm1pc3Npb24tbWFuYWdlci9jb21wb25lbnRzL3Blcm1pc3Npb24tbGlzdC9wZXJtaXNzaW9uLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1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Q0wsWUFBWTt3QkFDWixhQUFhO3dCQUNiLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZiw0QkFBNEI7d0JBQzVCLGdCQUFnQjtxQkFDbkIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSTt1SEFLckMsTUFBTTtzQkFETCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFLekIsTUFBTTtzQkFETCxNQUFNO2dCQUtQLEtBQUs7c0JBREosTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgT2JqZWN0RGF0YVJvdyB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uRWxlbWVudCB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGVybWlzc2lvbkRpc3BsYXlNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9wZXJtaXNzaW9uLm1vZGVsJztcbmltcG9ydCB7IFBlcm1pc3Npb25MaXN0U2VydmljZSB9IGZyb20gJy4vcGVybWlzc2lvbi1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdENhcmRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jYXJkJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL3Blcm1pc3Npb24tY29udGFpbmVyL3Blcm1pc3Npb24tY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BPdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vcG9wLW92ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEFsbG93YWJsZU9wZXJhdGlvbnNFbnVtLCBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXBlcm1pc3Npb24tbGlzdCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0Q2FyZE1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIFBlcm1pc3Npb25Db250YWluZXJDb21wb25lbnQsXG4gICAgICAgIFBvcE92ZXJEaXJlY3RpdmVcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wZXJtaXNzaW9uLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Blcm1pc3Npb24tbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKiBJRCBvZiB0aGUgbm9kZSB3aG9zZSBwZXJtaXNzaW9ucyB5b3Ugd2FudCB0byBzaG93LiAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgbm9kZUlkOiBzdHJpbmc7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwZXJtaXNzaW9uIGlzIHVwZGF0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgdXBkYXRlOiBFdmVudEVtaXR0ZXI8UGVybWlzc2lvbkVsZW1lbnQ+O1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMuICovXG4gICAgQE91dHB1dCgpXG4gICAgZXJyb3I6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gICAgc2VsZWN0ZWRQZXJtaXNzaW9uczogUGVybWlzc2lvbkRpc3BsYXlNb2RlbFtdID0gW107XG5cbiAgICBwcml2YXRlIF91cGRhdGVQZXJtaXNzaW9uc0FsbG93ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIGdldCB1cGRhdGVQZXJtaXNzaW9uc0FsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVQZXJtaXNzaW9uc0FsbG93ZWQ7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25MaXN0OiBQZXJtaXNzaW9uTGlzdFNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFNlcnZpY2U6IENvbnRlbnRTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLnBlcm1pc3Npb25MaXN0LmVycm9yZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlID0gdGhpcy5wZXJtaXNzaW9uTGlzdC51cGRhdGVkO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25MaXN0LmZldGNoUGVybWlzc2lvbih0aGlzLm5vZGVJZCk7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbkxpc3QuZGF0YSRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAobW9kZWwpID0+XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLl91cGRhdGVQZXJtaXNzaW9uc0FsbG93ZWQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0uVVBEQVRFUEVSTUlTU0lPTlNcbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgb3BlbkFkZFBlcm1pc3Npb25EaWFsb2coKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbkxpc3QudXBkYXRlTm9kZVBlcm1pc3Npb25CeURpYWxvZygpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0KHNlbGVjdGlvbnM6IE9iamVjdERhdGFSb3dbXSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUGVybWlzc2lvbnMgPSBzZWxlY3Rpb25zLm1hcCgoc2VsZWN0aW9uKSA9PiBzZWxlY3Rpb25bJ29iaiddKS5maWx0ZXIoKHBlcm1pc3Npb24pID0+ICFwZXJtaXNzaW9uLnJlYWRvbmx5KTtcbiAgICB9XG5cbiAgICBkZWxldGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbkxpc3QuZGVsZXRlUGVybWlzc2lvbnModGhpcy5zZWxlY3RlZFBlcm1pc3Npb25zKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBlcm1pc3Npb25zID0gW107XG4gICAgfVxuXG4gICAgdXBkYXRlUGVybWlzc2lvbih7IHJvbGUsIHBlcm1pc3Npb24gfSkge1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25MaXN0LnVwZGF0ZVJvbGUocm9sZSwgcGVybWlzc2lvbik7XG4gICAgfVxuXG4gICAgZGVsZXRlUGVybWlzc2lvbihwZXJtaXNzaW9uOiBQZXJtaXNzaW9uRGlzcGxheU1vZGVsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25MaXN0LmRlbGV0ZVBlcm1pc3Npb24ocGVybWlzc2lvbik7XG4gICAgfVxuXG4gICAgdXBkYXRlQWxsUGVybWlzc2lvbihyb2xlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uTGlzdC5idWxrUm9sZVVwZGF0ZShyb2xlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBlcm1pc3Npb25zID0gW107XG4gICAgfVxufVxuIiwiPG1hdC1jYXJkIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tY2FyZFwiIGlkPVwiYWRmLXBlcm1pc3Npb24tbWFuYWdlci1jYXJkXCI+XG4gICAgPGRpdiAqbmdJZj1cIihwZXJtaXNzaW9uTGlzdC5kYXRhJCB8IGFzeW5jKSA9PT0gbnVsbCAmJiBwZXJtaXNzaW9uTGlzdC5sb2FkaW5nJCB8IGFzeW5jXCIgY2xhc3M9XCJhZGYtcGVybWlzc2lvbi1sb2FkZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyIFtjb2xvcl09XCIncHJpbWFyeSdcIiBbbW9kZV09XCInaW5kZXRlcm1pbmF0ZSdcIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlcm1pc3Npb25MaXN0LmVycm9yJCB8IGFzeW5jXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtbm8tcGVybWlzc2lvbl9fdGVtcGxhdGVcIiBpZD1cImFkZi1wZXJtaXNzaW9uLW1hbmFnZXItZXJyb3JcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImFkZi1uby1wZXJtaXNzaW9uX190ZW1wbGF0ZS0tdGV4dFwiPnt7ICdQRVJNSVNTSU9OX01BTkFHRVIuRVJST1IuTk9ULUZPVU5EJ3wgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXJtaXNzaW9uTGlzdC5kYXRhJCB8IGFzeW5jIGFzIG1vZGVsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtcGVybWlzc2lvbi1jb250YWluZXJcIiAjdGFyZ2V0PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXBlcm1pc3Npb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGYtaW5oZXJpdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiYWRmLWluaGVyaXQtY29udGFpbmVyLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snUEVSTUlTU0lPTl9NQU5BR0VSLkxBQkVMUy5JTkhFUklURUQtUEVSTUlTU0lPTlMnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChtb2RlbC5ub2RlLnBlcm1pc3Npb25zLmlzSW5oZXJpdGFuY2VFbmFibGVkID8gXCJQRVJNSVNTSU9OX01BTkFHRVIuTEFCRUxTLk9OXCIgOiBcIlBFUk1JU1NJT05fTUFOQUdFUi5MQUJFTFMuT0ZGXCIpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvaDM+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXBkYXRlUGVybWlzc2lvbnNBbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWluaGVyaXQtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3snUEVSTUlTU0lPTl9NQU5BR0VSLkxBQkVMUy5JTkhFUklURURfUEVSTUlTU0lPTl9UT0dHTEUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwie3snUEVSTUlTU0lPTl9NQU5BR0VSLkxBQkVMUy5JTkhFUklURURfUEVSTUlTU0lPTl9UT0dHTEUnIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLWluaGVyaXQtdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtb2RlbC5ub2RlLnBlcm1pc3Npb25zLmlzSW5oZXJpdGFuY2VFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicGVybWlzc2lvbkxpc3QudG9nZ2xlSW5oZXJpdGVkKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRmLWluaGVyaXQtc3VidGl0bGVcIiB0aXRsZT1cInRvdGFsXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J1BFUk1JU1NJT05fTUFOQUdFUi5MQUJFTFMuSU5IRVJJVEVELVNVQlRJVExFJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogbW9kZWwuaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoIH0gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cInBlcm1pc3Npb24taW5mby1idXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tdmlzaWJpbGl0eS10b2dnbGVcIlxuICAgICAgICAgICAgICAgIFthZGYtcG9wLW92ZXJdPVwiaW5oZXJpdGVkUGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgW3RhcmdldF09XCJ0YXJnZXRcIlxuICAgICAgICAgICAgICAgICNwb3BPdmVyPVwiYWRmUG9wT3ZlclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtb2RlbC5ub2RlLnBlcm1pc3Npb25zLmlzSW5oZXJpdGFuY2VFbmFibGVkXCI+XG4gICAgICAgICAgICAgICAge3sgKHBvcE92ZXIub3BlbiA/ICdQRVJNSVNTSU9OX01BTkFHRVIuTEFCRUxTLkhJREUnIDogJ1BFUk1JU1NJT05fTUFOQUdFUi5MQUJFTFMuU0hPVycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tdmlzaWJpbGl0eS10b2dnbGUtaWNvblwiIGljb25Qb3NpdGlvbkVuZD5cbiAgICAgICAgICAgICAgICAgICAge3sgcG9wT3Zlci5vcGVuID8gJ2tleWJvYXJkX2Fycm93X3VwJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJyB9fSA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjaW5oZXJpdGVkUGVybWlzc2lvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtcG9wLW92ZXItY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxhZGYtcGVybWlzc2lvbi1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLWluaGVyaXRlZC1wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm1vZGVsLm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICBbcGVybWlzc2lvbnNdPVwibW9kZWwuaW5oZXJpdGVkUGVybWlzc2lvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0xvY2F0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCInbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICBbcm9sZXNdPVwibW9kZWwucm9sZXNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJhZGYtbG9jYWwtcGVybWlzc2lvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tY29udGVudC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8aDM+e3snUEVSTUlTU0lPTl9NQU5BR0VSLkxBQkVMUy5ESVJFQ1QtUEVSTUlTU0lPTlMnIHwgdHJhbnNsYXRlIH19PC9oMz5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtdG9vbGJhci0tc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXBkYXRlUGVybWlzc2lvbnNBbGxvd2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eydQRVJNSVNTSU9OX01BTkFHRVIuQUNUSU9OLkFERC1QRVJNSVNTSU9OJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQWRkUGVybWlzc2lvbkRpYWxvZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWFkZC1wZXJtaXNzaW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtYWRkLXBlcm1pc3Npb24tYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGVyc29uX2FkZF9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7J1BFUk1JU1NJT05fTUFOQUdFUi5BQ1RJT04uREVMRVRFJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRQZXJtaXNzaW9ucz8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtZGVsZXRlLXNlbGVjdGVkLXBlcm1pc3Npb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgICA8YWRmLXBlcm1pc3Npb24tY29udGFpbmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtcGVybWlzc2lvbi1saXN0XCJcbiAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtbG9jYWxseS1zZXQtcGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgW25vZGVdPVwibW9kZWwubm9kZVwiXG4gICAgICAgICAgICAgICAgW3Blcm1pc3Npb25zXT1cIm1vZGVsLmxvY2FsUGVybWlzc2lvbnNcIlxuICAgICAgICAgICAgICAgICh1cGRhdGUpPVwidXBkYXRlUGVybWlzc2lvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZGVsZXRlKT1cImRlbGV0ZVBlcm1pc3Npb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHVwZGF0ZUFsbCk9XCJ1cGRhdGVBbGxQZXJtaXNzaW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChyb3ctc2VsZWN0KT1cIm9uU2VsZWN0KCRhbnkoJGV2ZW50KS5kZXRhaWwuc2VsZWN0aW9uKVwiXG4gICAgICAgICAgICAgICAgKHJvdy11bnNlbGVjdCk9XCJvblNlbGVjdCgkYW55KCRldmVudCkuZGV0YWlsLnNlbGVjdGlvbilcIlxuICAgICAgICAgICAgICAgIFtyb2xlc109XCJtb2RlbC5yb2xlc1wiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiIXVwZGF0ZVBlcm1pc3Npb25zQWxsb3dlZFwiLz5cblxuICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG48L21hdC1jYXJkPlxuIl19