UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

74 lines 17.2 kB
import { Component } from '@angular/core'; import { InteractionMode } from '@nakedobjects/services'; import { PaneComponent } from '../pane/pane'; import * as i0 from "@angular/core"; import * as i1 from "@nakedobjects/services"; import * as i2 from "@angular/router"; import * as i3 from "@nakedobjects/view-models"; import * as i4 from "@angular/common"; import * as i5 from "../action-list/action-list.component"; import * as i6 from "../dialog/dialog.component"; import * as i7 from "../create-new-dialog/create-new-dialog.component"; import * as i8 from "../menu-bar/menu-bar.component"; export class HomeComponent extends PaneComponent { viewModelFactory; errorService; constructor(urlManager, activatedRoute, viewModelFactory, context, errorService) { super(activatedRoute, urlManager, context); this.viewModelFactory = viewModelFactory; this.errorService = errorService; } // template API get hasMenus() { return !!this.menus; } get menuItems() { return this.menus?.items ?? []; } selectedMenu = null; selectedDialogId = null; hasAuthorisedMenus = true; isCreateNew = false; toCreateClass; menus; getMenus(paneRouteData) { this.context.getMenus() .then((menus) => { this.menus = this.viewModelFactory.menusViewModel(menus, paneRouteData); this.hasAuthorisedMenus = this.menus && this.menus.items && this.menus.items.length > 0; }) .catch((reject) => { this.errorService.handleError(reject); }); } getMenu(paneRouteData) { const menuId = paneRouteData.menuId; if (menuId) { this.context.getMenu(menuId) .then((menu) => { this.selectedMenu = this.viewModelFactory.menuViewModel(menu, paneRouteData); this.selectedDialogId = paneRouteData.dialogId ?? null; }) .catch((reject) => { this.errorService.handleError(reject); }); } else { this.selectedMenu = null; this.selectedDialogId = null; } } setup(paneRouteData) { this.getMenus(paneRouteData); this.getMenu(paneRouteData); this.isCreateNew = paneRouteData.interactionMode === InteractionMode.CreateNew; this.toCreateClass = paneRouteData.toCreate; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: HomeComponent, deps: [{ token: i1.UrlManagerService }, { token: i2.ActivatedRoute }, { token: i3.ViewModelFactoryService }, { token: i1.ContextService }, { token: i1.ErrorService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: HomeComponent, selector: "nof-home", usesInheritance: true, ngImport: i0, template: "<ng-container>\n\t<ng-container *ngIf=\"!hasAuthorisedMenus\">\n\t\t<p class=\"startup-message\">Either no menu actions are available - or you are not authorized to see any of them. Please contact the application administrator.</p>\n\t</ng-container>\n\t<ng-container *ngIf=\"hasAuthorisedMenus && !isCreateNew\">\n\t\t<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n\t\t\t<!--TODO: This is the Single/Split definition-->\n\t\t\t<div class=\"home\">\n\t\t\t\t<div class=\"header\">\n\t\t\t\t\t<div class=\"title\">Home</div>\n\t\t\t\t\t<nof-menu-bar class=\"menus\" *ngIf=\"hasMenus\" [menus]=\"menuItems\"></nof-menu-bar>\n\t\t\t\t\t<div class=\"messages\"></div>\n\t\t\t\t</div>\n\t\t\t\t<nof-action-list *ngIf=\"selectedMenu\" [menuHolder]=\"selectedMenu\"></nof-action-list>\n\t\t\t\t<div class=\"main-column\">\n\t\t\t\t\t<nof-dialog *ngIf=\"selectedMenu\" [selectedDialogId]=\"selectedDialogId!\" [parentVM]=\"selectedMenu\"></nof-dialog>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</ng-container>\n\t<ng-container *ngIf=\"hasAuthorisedMenus && isCreateNew\">\n\t\t<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n\t\t\t<!--TODO: This is the Single/Split definition-->\n\t\t\t<nof-create-new-dialog *ngIf=\"selectedMenu\" [selectedDialogId]=\"selectedDialogId!\" [parentMenu]=\"selectedMenu\" [toCreateClass]=\"toCreateClass!\"></nof-create-new-dialog>\n\t\t</div>\n\t</ng-container>\n\t<router-outlet *ngIf=\"hasAuthorisedMenus\" (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n</ng-container>", styles: [".home{padding-left:var(--space-5);height:100%;overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1)}.header{margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1)}.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}p{color:var(--default-text-color)}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i5.ActionListComponent, selector: "nof-action-list", inputs: ["menuHolder"] }, { kind: "component", type: i6.DialogComponent, selector: "nof-dialog", inputs: ["parentVM"] }, { kind: "component", type: i7.CreateNewDialogComponent, selector: "nof-create-new-dialog", inputs: ["toCreateClass", "parentMenu"] }, { kind: "component", type: i8.MenuBarComponent, selector: "nof-menu-bar", inputs: ["menus"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: HomeComponent, decorators: [{ type: Component, args: [{ selector: 'nof-home', template: "<ng-container>\n\t<ng-container *ngIf=\"!hasAuthorisedMenus\">\n\t\t<p class=\"startup-message\">Either no menu actions are available - or you are not authorized to see any of them. Please contact the application administrator.</p>\n\t</ng-container>\n\t<ng-container *ngIf=\"hasAuthorisedMenus && !isCreateNew\">\n\t\t<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n\t\t\t<!--TODO: This is the Single/Split definition-->\n\t\t\t<div class=\"home\">\n\t\t\t\t<div class=\"header\">\n\t\t\t\t\t<div class=\"title\">Home</div>\n\t\t\t\t\t<nof-menu-bar class=\"menus\" *ngIf=\"hasMenus\" [menus]=\"menuItems\"></nof-menu-bar>\n\t\t\t\t\t<div class=\"messages\"></div>\n\t\t\t\t</div>\n\t\t\t\t<nof-action-list *ngIf=\"selectedMenu\" [menuHolder]=\"selectedMenu\"></nof-action-list>\n\t\t\t\t<div class=\"main-column\">\n\t\t\t\t\t<nof-dialog *ngIf=\"selectedMenu\" [selectedDialogId]=\"selectedDialogId!\" [parentVM]=\"selectedMenu\"></nof-dialog>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</ng-container>\n\t<ng-container *ngIf=\"hasAuthorisedMenus && isCreateNew\">\n\t\t<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n\t\t\t<!--TODO: This is the Single/Split definition-->\n\t\t\t<nof-create-new-dialog *ngIf=\"selectedMenu\" [selectedDialogId]=\"selectedDialogId!\" [parentMenu]=\"selectedMenu\" [toCreateClass]=\"toCreateClass!\"></nof-create-new-dialog>\n\t\t</div>\n\t</ng-container>\n\t<router-outlet *ngIf=\"hasAuthorisedMenus\" (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n</ng-container>", styles: [".home{padding-left:var(--space-5);height:100%;overflow-y:auto;color:var(--default-text-color);font-size:var(--font-size-2);font-weight:var(--font-weight-1)}.header{margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title{position:relative;font-weight:var(--font-weight-2);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1)}.main-column{float:left;margin-bottom:var(--space-5);margin-right:var(--space-5)}p{color:var(--default-text-color)}\n"] }] }], ctorParameters: () => [{ type: i1.UrlManagerService }, { type: i2.ActivatedRoute }, { type: i3.ViewModelFactoryService }, { type: i1.ContextService }, { type: i1.ErrorService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2hvbWUvaG9tZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2hvbWUvaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFDLE9BQU8sRUFBOEMsZUFBZSxFQUFvQyxNQUFNLHdCQUF3QixDQUFDO0FBRXZJLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7QUFPN0MsTUFBTSxPQUFPLGFBQWMsU0FBUSxhQUFhO0lBSXZCO0lBRUE7SUFKckIsWUFBWSxVQUE2QixFQUNyQyxjQUE4QixFQUNiLGdCQUF5QyxFQUMxRCxPQUF1QixFQUNOLFlBQTBCO1FBQzNDLEtBQUssQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSDFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFFekMsaUJBQVksR0FBWixZQUFZLENBQWM7SUFFL0MsQ0FBQztJQUVELGVBQWU7SUFDZixJQUFJLFFBQVE7UUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFBWSxHQUF5QixJQUFJLENBQUM7SUFDMUMsZ0JBQWdCLEdBQWtCLElBQUksQ0FBQztJQUV2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDMUIsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixhQUFhLENBQVU7SUFFZixLQUFLLENBQWtCO0lBRS9CLFFBQVEsQ0FBQyxhQUE0QjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTthQUNsQixJQUFJLENBQUMsQ0FBQyxLQUE2QixFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVGLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLE1BQW9CLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLENBQUMsYUFBNEI7UUFDaEMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2lCQUN2QixJQUFJLENBQUMsQ0FBQyxJQUEyQixFQUFFLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQztZQUMzRCxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsTUFBb0IsRUFBRSxFQUFFO2dCQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxhQUE0QjtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDL0UsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ2hELENBQUM7dUdBN0RRLGFBQWE7MkZBQWIsYUFBYSx1RUNaMUIsMGdEQTJCZTs7MkZEZkYsYUFBYTtrQkFMekIsU0FBUzsrQkFDSSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgKiBhcyBSbyBmcm9tICdAbmFrZWRvYmplY3RzL3Jlc3RmdWwtb2JqZWN0cyc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSwgRXJyb3JTZXJ2aWNlLCBFcnJvcldyYXBwZXIsIEludGVyYWN0aW9uTW9kZSwgUGFuZVJvdXRlRGF0YSwgVXJsTWFuYWdlclNlcnZpY2UgfSBmcm9tICdAbmFrZWRvYmplY3RzL3NlcnZpY2VzJztcbmltcG9ydCB7IExpbmtWaWV3TW9kZWwsIE1lbnVzVmlld01vZGVsLCBNZW51Vmlld01vZGVsLCBWaWV3TW9kZWxGYWN0b3J5U2VydmljZSB9IGZyb20gJ0BuYWtlZG9iamVjdHMvdmlldy1tb2RlbHMnO1xuaW1wb3J0IHsgUGFuZUNvbXBvbmVudCB9IGZyb20gJy4uL3BhbmUvcGFuZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWhvbWUnLFxuICAgIHRlbXBsYXRlVXJsOiAnaG9tZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2hvbWUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhvbWVDb21wb25lbnQgZXh0ZW5kcyBQYW5lQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHVybE1hbmFnZXI6IFVybE1hbmFnZXJTZXJ2aWNlLFxuICAgICAgICBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld01vZGVsRmFjdG9yeTogVmlld01vZGVsRmFjdG9yeVNlcnZpY2UsXG4gICAgICAgIGNvbnRleHQ6IENvbnRleHRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGFjdGl2YXRlZFJvdXRlLCB1cmxNYW5hZ2VyLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyB0ZW1wbGF0ZSBBUElcbiAgICBnZXQgaGFzTWVudXMoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMubWVudXM7XG4gICAgfVxuXG4gICAgZ2V0IG1lbnVJdGVtcygpOiBMaW5rVmlld01vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW51cz8uaXRlbXMgPz8gW107XG4gICAgfVxuXG4gICAgc2VsZWN0ZWRNZW51OiBNZW51Vmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG4gICAgc2VsZWN0ZWREaWFsb2dJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBoYXNBdXRob3Jpc2VkTWVudXMgPSB0cnVlO1xuICAgIGlzQ3JlYXRlTmV3ID0gZmFsc2U7XG4gICAgdG9DcmVhdGVDbGFzcz86IHN0cmluZztcblxuICAgIHByaXZhdGUgbWVudXM/OiBNZW51c1ZpZXdNb2RlbDtcblxuICAgIGdldE1lbnVzKHBhbmVSb3V0ZURhdGE6IFBhbmVSb3V0ZURhdGEpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmdldE1lbnVzKClcbiAgICAgICAgICAgIC50aGVuKChtZW51czogUm8uTWVudXNSZXByZXNlbnRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudXMgPSB0aGlzLnZpZXdNb2RlbEZhY3RvcnkubWVudXNWaWV3TW9kZWwobWVudXMsIHBhbmVSb3V0ZURhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQXV0aG9yaXNlZE1lbnVzID0gdGhpcy5tZW51cyAmJiB0aGlzLm1lbnVzLml0ZW1zICYmIHRoaXMubWVudXMuaXRlbXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKHJlamVjdDogRXJyb3JXcmFwcGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvclNlcnZpY2UuaGFuZGxlRXJyb3IocmVqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE1lbnUocGFuZVJvdXRlRGF0YTogUGFuZVJvdXRlRGF0YSkge1xuICAgICAgICBjb25zdCBtZW51SWQgPSBwYW5lUm91dGVEYXRhLm1lbnVJZDtcbiAgICAgICAgaWYgKG1lbnVJZCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldE1lbnUobWVudUlkKVxuICAgICAgICAgICAgICAgIC50aGVuKChtZW51OiBSby5NZW51UmVwcmVzZW50YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lbnUgPSB0aGlzLnZpZXdNb2RlbEZhY3RvcnkubWVudVZpZXdNb2RlbChtZW51LCBwYW5lUm91dGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERpYWxvZ0lkID0gcGFuZVJvdXRlRGF0YS5kaWFsb2dJZCA/PyBudWxsO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChyZWplY3Q6IEVycm9yV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yU2VydmljZS5oYW5kbGVFcnJvcihyZWplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lbnUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERpYWxvZ0lkID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXR1cChwYW5lUm91dGVEYXRhOiBQYW5lUm91dGVEYXRhKSB7XG4gICAgICAgIHRoaXMuZ2V0TWVudXMocGFuZVJvdXRlRGF0YSk7XG4gICAgICAgIHRoaXMuZ2V0TWVudShwYW5lUm91dGVEYXRhKTtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZU5ldyA9IHBhbmVSb3V0ZURhdGEuaW50ZXJhY3Rpb25Nb2RlID09PSBJbnRlcmFjdGlvbk1vZGUuQ3JlYXRlTmV3O1xuICAgICAgICB0aGlzLnRvQ3JlYXRlQ2xhc3MgPSBwYW5lUm91dGVEYXRhLnRvQ3JlYXRlO1xuICAgIH1cblxufVxuIiwiPG5nLWNvbnRhaW5lcj5cblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNBdXRob3Jpc2VkTWVudXNcIj5cblx0XHQ8cCBjbGFzcz1cInN0YXJ0dXAtbWVzc2FnZVwiPkVpdGhlciBubyBtZW51IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSAgLSAgb3IgeW91IGFyZSBub3QgYXV0aG9yaXplZCB0byBzZWUgYW55IG9mIHRoZW0uICBQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24gYWRtaW5pc3RyYXRvci48L3A+XG5cdDwvbmctY29udGFpbmVyPlxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXV0aG9yaXNlZE1lbnVzICYmICFpc0NyZWF0ZU5ld1wiPlxuXHRcdDxkaXYgW2F0dHIuaWRdPVwicGFuZUlkTmFtZVwiIFtuZ0NsYXNzXT1cInBhbmVUeXBlXCI+XG5cdFx0XHQ8IS0tVE9ETzogVGhpcyBpcyB0aGUgU2luZ2xlL1NwbGl0IGRlZmluaXRpb24tLT5cblx0XHRcdDxkaXYgY2xhc3M9XCJob21lXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGVcIj5Ib21lPC9kaXY+XG5cdFx0XHRcdFx0PG5vZi1tZW51LWJhciBjbGFzcz1cIm1lbnVzXCIgKm5nSWY9XCJoYXNNZW51c1wiIFttZW51c109XCJtZW51SXRlbXNcIj48L25vZi1tZW51LWJhcj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWVzc2FnZXNcIj48L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxub2YtYWN0aW9uLWxpc3QgKm5nSWY9XCJzZWxlY3RlZE1lbnVcIiBbbWVudUhvbGRlcl09XCJzZWxlY3RlZE1lbnVcIj48L25vZi1hY3Rpb24tbGlzdD5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1haW4tY29sdW1uXCI+XG5cdFx0XHRcdFx0PG5vZi1kaWFsb2cgKm5nSWY9XCJzZWxlY3RlZE1lbnVcIiBbc2VsZWN0ZWREaWFsb2dJZF09XCJzZWxlY3RlZERpYWxvZ0lkIVwiIFtwYXJlbnRWTV09XCJzZWxlY3RlZE1lbnVcIj48L25vZi1kaWFsb2c+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvbmctY29udGFpbmVyPlxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXV0aG9yaXNlZE1lbnVzICYmIGlzQ3JlYXRlTmV3XCI+XG5cdFx0PGRpdiBbYXR0ci5pZF09XCJwYW5lSWROYW1lXCIgW25nQ2xhc3NdPVwicGFuZVR5cGVcIj5cblx0XHRcdDwhLS1UT0RPOiBUaGlzIGlzIHRoZSBTaW5nbGUvU3BsaXQgZGVmaW5pdGlvbi0tPlxuXHRcdFx0PG5vZi1jcmVhdGUtbmV3LWRpYWxvZyAqbmdJZj1cInNlbGVjdGVkTWVudVwiIFtzZWxlY3RlZERpYWxvZ0lkXT1cInNlbGVjdGVkRGlhbG9nSWQhXCIgW3BhcmVudE1lbnVdPVwic2VsZWN0ZWRNZW51XCIgW3RvQ3JlYXRlQ2xhc3NdPVwidG9DcmVhdGVDbGFzcyFcIj48L25vZi1jcmVhdGUtbmV3LWRpYWxvZz5cblx0XHQ8L2Rpdj5cblx0PC9uZy1jb250YWluZXI+XG5cdDxyb3V0ZXItb3V0bGV0ICpuZ0lmPVwiaGFzQXV0aG9yaXNlZE1lbnVzXCIgKGFjdGl2YXRlKT1cIm9uQ2hpbGQoKVwiIChkZWFjdGl2YXRlKT1cIm9uQ2hpbGRsZXNzKClcIj48L3JvdXRlci1vdXRsZXQ+XG48L25nLWNvbnRhaW5lcj4iXX0=