UNPKG

angular-sidebar-menu

Version:

The sources for this package are in the [Angular Sidebar Menu](https://github.com/mledour/angular-sidebar-menu) repo. Please file issues and pull requests against that repo.

133 lines 16.1 kB
import { ChangeDetectionStrategy, Component, Input, ChangeDetectorRef, HostBinding, } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, Subject } from 'rxjs'; import { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators'; import { RoleService } from './role.service'; import { SearchService } from './search.service'; import { rotateAnimation } from './node.animations'; export class ItemComponent { constructor(router, roleService, searchService, changeDetectorRef) { this.router = router; this.roleService = roleService; this.searchService = searchService; this.changeDetectorRef = changeDetectorRef; this.isRootNode = true; this.disable = false; this.onDestroy$ = new Subject(); this.isActive = new BehaviorSubject(false); this.isFiltered = new BehaviorSubject(false); this.isActive$ = this.isActive.asObservable().pipe(distinctUntilChanged(), takeUntil(this.onDestroy$)); this.isFiltered$ = this.isFiltered.asObservable().pipe(distinctUntilChanged(), takeUntil(this.onDestroy$)); this.isItemFiltered = false; this.isItemDisabled = false; } get filtered() { return this.isItemFiltered; } get disabled() { return this.isItemDisabled || this.disable; } ngOnInit() { this.routerItemActiveSubscription(); this.emitItemActive(); this.menuSearchSubscription(); this.disabledItemSubscription(); } ngOnDestroy() { this.onDestroy$.next(); this.onDestroy$.complete(); } onNodeActive(event) { this.isActive.next(event); } onNodeFiltered(event) { this.isItemFiltered = event; this.isFiltered.next(event); } routerItemActiveSubscription() { this.router.events .pipe(filter((e) => e instanceof NavigationEnd), takeUntil(this.onDestroy$)) .subscribe((e) => { this.emitItemActive(); }); } menuSearchSubscription() { if (!this.menuItem.children) { this.searchService.search$.pipe(takeUntil(this.onDestroy$)).subscribe((search) => { this.isItemFiltered = this.searchService.filter(search, this.menuItem.label || this.menuItem.header); this.isFiltered.next(this.isItemFiltered); this.changeDetectorRef.markForCheck(); }); } } disabledItemSubscription() { this.roleService .disableItem$(this.menuItem.roles) .pipe(takeUntil(this.onDestroy$)) .subscribe((disabled) => (this.isItemDisabled = disabled)); } emitItemActive() { if (this.menuItem.route) { this.isActive.next(this.isActiveRoute(this.menuItem.route)); } } isActiveRoute(route) { return this.router.isActive(route, this.isItemLinkExact()); } isItemLinkExact() { return this.menuItem.linkActiveExact === undefined ? true : this.menuItem.linkActiveExact; } } ItemComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'li[asm-menu-item][menuItem]', animations: [rotateAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: ` <ng-container [ngSwitch]="true"> <span *ngSwitchCase="!!menuItem.header" class="asm-menu-item__header">{{ menuItem.header }}</span> <asm-menu-anchor *ngSwitchCase="!menuItem.children && !menuItem.header" class="asm-menu-anchor" [menuItem]="menuItem" [disable]="disable || isItemDisabled" ></asm-menu-anchor> <ng-container *ngSwitchCase="!!menuItem.children"> <asm-menu-anchor class="asm-menu-anchor" [ngClass]="{ 'asm-menu-anchor--open': node.isOpen }" [menuItem]="menuItem" (clickAnchor)="node.onNodeToggleClick()" [isActive]="node.isActiveChild" ><i toggleIcon [@rotate]="node.isOpen" [class]="node.nodeService.toggleIconClasses"></i ></asm-menu-anchor> <asm-menu-node #node class="asm-menu-node" [menuItem]="menuItem" [level]="level" [disable]="disable || isItemDisabled" (isActive)="onNodeActive($event)" (isFiltered)="onNodeFiltered($event)" ></asm-menu-node> </ng-container> </ng-container> ` },] } ]; ItemComponent.ctorParameters = () => [ { type: Router }, { type: RoleService }, { type: SearchService }, { type: ChangeDetectorRef } ]; ItemComponent.propDecorators = { menuItem: [{ type: Input }], isRootNode: [{ type: Input }], level: [{ type: Input }], disable: [{ type: Input }], filtered: [{ type: HostBinding, args: ['class.asm-menu-item--filtered',] }], disabled: [{ type: HostBinding, args: ['class.asm-menu-item--disabled',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3NyYy9saWIvaW50ZXJuYWwvaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixFQUNqQixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXNDcEQsTUFBTSxPQUFPLGFBQWE7SUFzQnhCLFlBQ1UsTUFBYyxFQUNmLFdBQXdCLEVBQ3ZCLGFBQTRCLEVBQzVCLGlCQUFvQztRQUhwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXhCckMsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBU2pCLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENB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Q0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQWE7UUFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLGVBQWU7UUFDckIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7SUFDNUYsQ0FBQzs7O1lBOUhGLFNBQVMsU0FBQztnQkFDVCw4Q0FBOEM7Z0JBQzlDLFFBQVEsRUFBRSw2QkFBNkI7Z0JBQ3ZDLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0IsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07Z0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2QlQ7YUFDRjs7O1lBOUM2QyxNQUFNO1lBTzNDLFdBQVc7WUFDWCxhQUFhO1lBWHBCLGlCQUFpQjs7O3VCQW1EaEIsS0FBSzt5QkFDTCxLQUFLO29CQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFFTCxXQUFXLFNBQUMsK0JBQStCO3VCQUczQyxXQUFXLFNBQUMsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSG9zdEJpbmRpbmcsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQgYXMgUm91dGVyRXZlbnQsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJy4uL3NpZGViYXItbWVudS5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gJy4vcm9sZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IHJvdGF0ZUFuaW1hdGlvbiB9IGZyb20gJy4vbm9kZS5hbmltYXRpb25zJztcblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaVthc20tbWVudS1pdGVtXVttZW51SXRlbV0nLFxuICBhbmltYXRpb25zOiBbcm90YXRlQW5pbWF0aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIiEhbWVudUl0ZW0uaGVhZGVyXCIgY2xhc3M9XCJhc20tbWVudS1pdGVtX19oZWFkZXJcIj57eyBtZW51SXRlbS5oZWFkZXIgfX08L3NwYW4+XG4gICAgICA8YXNtLW1lbnUtYW5jaG9yXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCIhbWVudUl0ZW0uY2hpbGRyZW4gJiYgIW1lbnVJdGVtLmhlYWRlclwiXG4gICAgICAgIGNsYXNzPVwiYXNtLW1lbnUtYW5jaG9yXCJcbiAgICAgICAgW21lbnVJdGVtXT1cIm1lbnVJdGVtXCJcbiAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSB8fCBpc0l0ZW1EaXNhYmxlZFwiXG4gICAgICA+PC9hc20tbWVudS1hbmNob3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIhIW1lbnVJdGVtLmNoaWxkcmVuXCI+XG4gICAgICAgIDxhc20tbWVudS1hbmNob3JcbiAgICAgICAgICBjbGFzcz1cImFzbS1tZW51LWFuY2hvclwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnYXNtLW1lbnUtYW5jaG9yLS1vcGVuJzogbm9kZS5pc09wZW4gfVwiXG4gICAgICAgICAgW21lbnVJdGVtXT1cIm1lbnVJdGVtXCJcbiAgICAgICAgICAoY2xpY2tBbmNob3IpPVwibm9kZS5vbk5vZGVUb2dnbGVDbGljaygpXCJcbiAgICAgICAgICBbaXNBY3RpdmVdPVwibm9kZS5pc0FjdGl2ZUNoaWxkXCJcbiAgICAgICAgICA+PGkgdG9nZ2xlSWNvbiBbQHJvdGF0ZV09XCJub2RlLmlzT3BlblwiIFtjbGFzc109XCJub2RlLm5vZGVTZXJ2aWNlLnRvZ2dsZUljb25DbGFzc2VzXCI+PC9pXG4gICAgICAgID48L2FzbS1tZW51LWFuY2hvcj5cbiAgICAgICAgPGFzbS1tZW51LW5vZGVcbiAgICAgICAgICAjbm9kZVxuICAgICAgICAgIGNsYXNzPVwiYXNtLW1lbnUtbm9kZVwiXG4gICAgICAgICAgW21lbnVJdGVtXT1cIm1lbnVJdGVtXCJcbiAgICAgICAgICBbbGV2ZWxdPVwibGV2ZWxcIlxuICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUgfHwgaXNJdGVtRGlzYWJsZWRcIlxuICAgICAgICAgIChpc0FjdGl2ZSk9XCJvbk5vZGVBY3RpdmUoJGV2ZW50KVwiXG4gICAgICAgICAgKGlzRmlsdGVyZWQpPVwib25Ob2RlRmlsdGVyZWQoJGV2ZW50KVwiXG4gICAgICAgID48L2FzbS1tZW51LW5vZGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgbWVudUl0ZW0hOiBNZW51SXRlbTtcbiAgQElucHV0KCkgaXNSb290Tm9kZSA9IHRydWU7XG4gIEBJbnB1dCgpIGxldmVsITogbnVtYmVyO1xuICBASW5wdXQoKSBkaXNhYmxlID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hc20tbWVudS1pdGVtLS1maWx0ZXJlZCcpIGdldCBmaWx0ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0l0ZW1GaWx0ZXJlZDtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFzbS1tZW51LWl0ZW0tLWRpc2FibGVkJykgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSXRlbURpc2FibGVkIHx8IHRoaXMuZGlzYWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgb25EZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgaXNBY3RpdmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc0ZpbHRlcmVkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgaXNBY3RpdmUkID0gdGhpcy5pc0FjdGl2ZS5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKTtcbiAgaXNGaWx0ZXJlZCQgPSB0aGlzLmlzRmlsdGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSk7XG4gIGlzSXRlbUZpbHRlcmVkID0gZmFsc2U7XG4gIGlzSXRlbURpc2FibGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgcm9sZVNlcnZpY2U6IFJvbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXJJdGVtQWN0aXZlU3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5lbWl0SXRlbUFjdGl2ZSgpO1xuICAgIHRoaXMubWVudVNlYXJjaFN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuZGlzYWJsZWRJdGVtU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25Ob2RlQWN0aXZlKGV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0FjdGl2ZS5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIG9uTm9kZUZpbHRlcmVkKGV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0l0ZW1GaWx0ZXJlZCA9IGV2ZW50O1xuICAgIHRoaXMuaXNGaWx0ZXJlZC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVySXRlbUFjdGl2ZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGU6IFJvdXRlckV2ZW50KTogZSBpcyBOYXZpZ2F0aW9uRW5kID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0SXRlbUFjdGl2ZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lbnVTZWFyY2hTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnVJdGVtLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoJC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKS5zdWJzY3JpYmUoKHNlYXJjaCkgPT4ge1xuICAgICAgICB0aGlzLmlzSXRlbUZpbHRlcmVkID0gdGhpcy5zZWFyY2hTZXJ2aWNlLmZpbHRlcihzZWFyY2gsIHRoaXMubWVudUl0ZW0ubGFiZWwgfHwgdGhpcy5tZW51SXRlbS5oZWFkZXIpO1xuICAgICAgICB0aGlzLmlzRmlsdGVyZWQubmV4dCh0aGlzLmlzSXRlbUZpbHRlcmVkKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZWRJdGVtU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMucm9sZVNlcnZpY2VcbiAgICAgIC5kaXNhYmxlSXRlbSQodGhpcy5tZW51SXRlbS5yb2xlcylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoZGlzYWJsZWQpID0+ICh0aGlzLmlzSXRlbURpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEl0ZW1BY3RpdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVudUl0ZW0ucm91dGUpIHtcbiAgICAgIHRoaXMuaXNBY3RpdmUubmV4dCh0aGlzLmlzQWN0aXZlUm91dGUodGhpcy5tZW51SXRlbS5yb3V0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNBY3RpdmVSb3V0ZShyb3V0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmlzQWN0aXZlKHJvdXRlLCB0aGlzLmlzSXRlbUxpbmtFeGFjdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJdGVtTGlua0V4YWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lbnVJdGVtLmxpbmtBY3RpdmVFeGFjdCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMubWVudUl0ZW0ubGlua0FjdGl2ZUV4YWN0O1xuICB9XG59XG4iXX0=