ad-custom-lib
Version:
This is an UI custom library based on Adminlte library with purpose for personal use, if you need a full template of Primeng please visit https://github.com/mledour/angular-admin-lte
687 lines • 63 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, NgZone, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core';
import { NavigationEnd, PRIMARY_OUTLET, Router, ActivatedRoute } from '@angular/router';
import { removeListeners, removeSubscriptions } from '../../helpers';
import { RoutingService } from '../../services/routing.service';
import { HeaderService } from '../header/header.service';
import { LayoutStore } from '../layout.store';
import { WrapperService } from '../wrapper/wrapper.service';
import { SidebarLeftToggleDirective } from './sidebar-left.directive';
/**
* @record
*/
export function Item() { }
if (false) {
/** @type {?} */
Item.prototype.id;
/** @type {?} */
Item.prototype.parentId;
/** @type {?} */
Item.prototype.label;
/** @type {?|undefined} */
Item.prototype.route;
/** @type {?|undefined} */
Item.prototype.iconClasses;
/** @type {?|undefined} */
Item.prototype.children;
/** @type {?|undefined} */
Item.prototype.isActive;
/** @type {?|undefined} */
Item.prototype.isCollapsed;
/** @type {?|undefined} */
Item.prototype.disableCollapse;
}
export class SidebarLeftComponent {
/**
* \@method constructor
* @param {?} changeDetectorRef [description]
* @param {?} layoutStore [description]
* @param {?} ngZone [description]
* @param {?} renderer2 [description]
* @param {?} router [description]
* @param {?} routingService [description]
* @param {?} wrapperService [description]
* @param {?} headerService [description]
* @param {?} activatedRoute
*/
constructor(changeDetectorRef, layoutStore, ngZone, renderer2, router, routingService, wrapperService, headerService, activatedRoute) {
this.changeDetectorRef = changeDetectorRef;
this.layoutStore = layoutStore;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.router = router;
this.routingService = routingService;
this.wrapperService = wrapperService;
this.headerService = headerService;
this.activatedRoute = activatedRoute;
this.collapsedItems = [];
this.activatedItems = [];
this.toggleListeners = [];
this.listeners = [];
this.itemsByIds = {};
this.runningAnimations = 0;
this.subscriptions = [];
}
/**
* \@method ngOnInit
* @return {?}
*/
ngOnInit() {
this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.menu = value;
this.monkeyPatchMenu(this.menu);
if (this.initialized) {
this.setMenuListeners(this.activeUrl);
this.setSidebarListeners();
this.setMenuTogglesListeners();
}
this.initialized = true;
})));
this.subscriptions.push(this.layoutStore.sidebarLeftMenuActiveUrl.subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.activeUrl = value;
this.setMenuListeners(value);
})));
this.subscriptions.push(this.routingService.events.subscribe((/**
* @param {?} event
* @return {?}
*/
(event) => {
/** @type {?} */
let url;
if (event instanceof NavigationEnd) {
url = event.url;
}
else {
url = this.router.url;
}
this.activeUrl = url;
this.setMenuListeners(url);
// console.log(url)
})));
this.setSidebarListeners();
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterViewInit() {
this.setMenuTogglesListeners();
this.checkMenuWithoutChildren();
}
/**
* \@method ngOnDestroy
* @return {?}
*/
ngOnDestroy() {
this.subscriptions = removeSubscriptions(this.subscriptions);
this.listeners = removeListeners(this.listeners);
this.toggleListeners = removeListeners(this.toggleListeners);
}
/**
* [setSidebarListeners description]
* \@method setSidebarListeners
* @return {?}
*/
setSidebarListeners() {
this.subscriptions.push(this.layoutStore.layout.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.layout = value;
this.setSidebarHeight();
})));
this.subscriptions.push(this.layoutStore.windowInnerHeight.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.windowInnerHeight = value;
this.setSidebarHeight();
})));
this.subscriptions.push(this.layoutStore.sidebarLeftMenu.subscribe((/**
* @return {?}
*/
() => {
this.changeDetectorRef.detectChanges();
})));
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseenter', (/**
* @return {?}
*/
() => {
this.layoutStore.sidebarLeftMouseOver(true);
})));
this.listeners.push(this.renderer2.listen(this.sidebarElement.nativeElement, 'mouseleave', (/**
* @return {?}
*/
() => {
this.layoutStore.sidebarLeftMouseOver(false);
})));
}));
this.subscriptions.push(this.layoutStore.windowInnerWidth.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.windowInnerWidth = value;
if (!this.isSidebarLeftCollapsed && this.windowInnerWidth <= 767) {
this.layoutStore.sidebarLeftCollapsed(true);
}
else if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed && !this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(false);
}
})));
this.subscriptions.push(this.layoutStore.isSidebarLeftMouseOver.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.isSidebarLeftMouseOver = value;
if (this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(!value);
}
})));
this.subscriptions.push(this.layoutStore.isSidebarLeftExpandOnOver.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.isSidebarLeftExpandOnOver = value;
if (this.windowInnerWidth > 767 && this.isSidebarLeftCollapsed !== undefined) {
this.layoutStore.sidebarLeftCollapsed(value);
}
})));
this.subscriptions.push(this.layoutStore.isSidebarLeftCollapsed.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.isSidebarLeftCollapsed = value;
if (this.windowInnerWidth <= 767) {
if (value) {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open');
}
else {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-open');
}
}
else {
if (this.isSidebarLeftExpandOnOver && !this.isSidebarLeftMouseOver && !value) {
this.layoutStore.sidebarLeftExpandOnOver(false);
}
if (value) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse');
if (this.isSidebarLeftExpandOnOver) {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover');
}
}
else {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-collapse');
if (this.isSidebarLeftExpandOnOver) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-expanded-on-hover');
}
}
}
})));
this.subscriptions.push(this.layoutStore.isSidebarLeftMini.subscribe((/**
* @param {?} value
* @return {?}
*/
(value) => {
if (value) {
this.renderer2.addClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini');
}
else {
this.renderer2.removeClass(this.wrapperService.wrapperElementRef.nativeElement, 'sidebar-mini');
}
})));
}
/**
* [setMenuListeners description]
* \@method setMenuListeners
* @param {?} url
* @return {?}
*/
setMenuListeners(url) {
if (url === '/') {
this.activeItems(url);
this.changeDetectorRef.detectChanges();
}
else {
/** @type {?} */
const primaryOutlet = this.router.parseUrl(url).root.children[PRIMARY_OUTLET];
if (primaryOutlet) {
// console.log(primaryOutlet)
// this.activeItems('/' + primaryOutlet.toString());
this.activeItems(primaryOutlet.toString());
this.changeDetectorRef.detectChanges();
}
}
if (this.windowInnerWidth <= 767 || this.isSidebarLeftExpandOnOver) {
this.layoutStore.sidebarLeftCollapsed(true);
}
}
/**
* [getIconClasses description]
* \@method getIconClasses
* @param {?} item [description]
* @return {?} [description]
*/
getIconClasses(item) {
if (item.iconClasses || item.iconClasses === '') {
return item.iconClasses;
}
else {
return 'fa fa-dot-circle-o';
}
}
/**
* [visibilityStateStart description]
* \@method visibilityStateStart
* @param {?} event [description]
* @return {?}
*/
visibilityStateStart(event) {
this.runningAnimations++;
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
setTimeout((/**
* @return {?}
*/
() => {
this.runningAnimations--;
if (!this.runningAnimations) {
this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight);
}
}), event.totalTime);
}));
}
/**
* [uncollapseItemParents description]
* \@method uncollapseItemParents
* @private
* @param {?} item [description]
* @param {?=} isActive [description]
* @return {?}
*/
uncollapseItemParents(item, isActive = false) {
if (isActive) {
item.isActive = true;
this.activatedItems.push(item);
}
// console.log(item)
// console.log(isActive)
item.isCollapsed = false;
this.collapsedItems.push(item);
if (item.parentId) {
this.uncollapseItemParents(this.itemsByIds[item.parentId], isActive);
}
}
/**
* [findItemsByUrl description]
* \@method findItemsByUrl
* @private
* @param {?} url [description]
* @param {?} items [description]
* @param {?=} returnItems [description]
* @return {?} [description]
*/
findItemsByUrl(url, items, returnItems = []) {
items.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (item.route === url) {
returnItems.push(item);
}
else if (item.children) {
this.findItemsByUrl(url, item.children, returnItems);
}
else if (url.includes(item.route) && item.route != '/') {
returnItems.push(item);
}
}));
return returnItems;
}
/**
* [activeItems description]
* \@method activeItems
* @private
* @param {?} url [description]
* @return {?}
*/
activeItems(url) {
this.activatedItems.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.isActive = false;
}));
this.activatedItems = [];
this.collapsedItems.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.isActive = false;
item.isCollapsed = true;
}));
this.collapsedItems = [];
// console.log(url)
/** @type {?} */
const items = this.findItemsByUrl(url, this.menu);
items.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
item.isActive = true;
this.uncollapseItemParents(item, true);
this.activatedItems.push(item);
}));
}
/**
* [monkeyPatchMenu description]
* \@method monkeyPatchMenu
* @private
* @param {?} items [description]
* @param {?=} parentId [description]
* @return {?}
*/
monkeyPatchMenu(items, parentId) {
items.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
(item, index) => {
item.id = parentId ? Number(parentId + '' + (index + 1)) : index + 1;
if (parentId) {
item.parentId = parentId;
}
if (!item.disableCollapse) {
item.isCollapsed = true;
}
item.isActive = false;
if (parentId || item.children) {
this.itemsByIds[item.id] = item;
}
if (item.children) {
this.monkeyPatchMenu(item.children, item.id);
}
}));
}
/**
* [setMenuTogglesListeners description]
* \@method setMenuTogglesListeners
* @private
* @return {?}
*/
setMenuTogglesListeners() {
this.toggleListeners = removeListeners(this.toggleListeners);
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.sidebarLeftToggleDirectives.forEach((/**
* @param {?} menuToggle
* @return {?}
*/
(menuToggle) => {
this.toggleListeners.push(this.renderer2.listen(menuToggle.elementRef.nativeElement, 'click', (/**
* @param {?} event
* @return {?}
*/
(event) => {
event.preventDefault();
if (menuToggle.item.isCollapsed) {
this.collapsedItems.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (!item.disableCollapse) {
item.isCollapsed = true;
}
}));
this.collapsedItems = [];
this.uncollapseItemParents(menuToggle.item);
}
else {
menuToggle.item.isCollapsed = !menuToggle.item.isCollapsed;
}
this.changeDetectorRef.detectChanges();
})));
}));
}));
}
/**
* [checkMenuWithoutChildren description]
* \@method checkMenuWithoutChildren
* @private
* @return {?}
*/
checkMenuWithoutChildren() {
/** @type {?} */
let menuHaveChildren;
this.menu.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (item.children) {
return menuHaveChildren = true;
}
}));
if (!menuHaveChildren) {
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
setTimeout((/**
* @return {?}
*/
() => {
this.layoutStore.setSidebarLeftElementHeight(this.sidebarElement.nativeElement.offsetHeight);
}));
}));
}
}
/**
* [setSidebarHeight description]
* \@method setSidebarHeight
* @private
* @return {?}
*/
setSidebarHeight() {
if (this.layout === 'fixed') {
/** @type {?} */
const height = this.windowInnerHeight - this.headerService.offsetHeight;
if (height && height !== this.sidebarHeight) {
this.sidebarHeight = height;
this.sidebarOverflow = 'auto';
this.changeDetectorRef.detectChanges();
}
}
else if (this.sidebarHeight) {
this.sidebarOverflow = this.sidebarHeight = null;
this.changeDetectorRef.detectChanges();
}
}
}
SidebarLeftComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-layout-sidebar-left',
template: "<aside class=\"main-sidebar\">\r\n <section class=\"sidebar\" #sidebarElement [style.height.px]=\"sidebarHeight\" [style.overflow]=\"sidebarOverflow\">\r\n <ng-content></ng-content>\r\n <ul class=\"sidebar-menu\">\r\n <ng-container *ngFor=\"let item of menu\">\r\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </section>\r\n</aside>\r\n\r\n<ng-template #sidebarInner let-item=\"item\">\r\n <li [class.active]=\"item.isActive\" [class.header]=\"item.separator\" [class.menu-open]=\"!item.isCollapsed\">\r\n <span *ngIf=\"item.separator\">{{item.label}}</span>\r\n <a *ngIf=\"!item.separator && item.route\" [routerLink]=\"item.route\">\r\n <i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\r\n <span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\r\n <span *ngFor=\"let rightItem of item.pullRights\"\r\n class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\r\n <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\r\n </span>\r\n </a>\r\n <a *ngIf=\"!item.separator && !item.route\" href=\"#\" [mkMenuToggle]=\"item\">\r\n <i [class]=\"getIconClasses(item)\"></i><span>{{item.label}}</span>\r\n <span *ngIf=\"item.children || item.pullRights\" class=\"pull-right-container\">\r\n <span *ngFor=\"let rightItem of item.pullRights\"\r\n class=\"pull-right {{rightItem.classes}}\">{{rightItem.text}}</span>\r\n <i *ngIf=\"!item.pullRights\" class=\"fa fa-angle-left pull-right\"></i>\r\n </span>\r\n </a>\r\n <ul *ngIf=\"item.children\" [mkCollapseAnimation]=\"item.isCollapsed\"\r\n (mkCollapseAnimation.start)=\"visibilityStateStart($event)\" class=\"treeview-menu\">\r\n <ng-container *ngFor=\"let item of item.children\">\r\n <ng-container *ngTemplateOutlet=\"sidebarInner; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".treeview-menu.collapse{display:none}.treeview-menu,.treeview-menu.collapse.in{display:block}"]
}] }
];
/** @nocollapse */
SidebarLeftComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: LayoutStore },
{ type: NgZone },
{ type: Renderer2 },
{ type: Router },
{ type: RoutingService },
{ type: WrapperService },
{ type: HeaderService },
{ type: ActivatedRoute }
];
SidebarLeftComponent.propDecorators = {
sidebarElement: [{ type: ViewChild, args: ['sidebarElement', { static: true },] }],
sidebarLeftToggleDirectives: [{ type: ViewChildren, args: [SidebarLeftToggleDirective,] }]
};
if (false) {
/** @type {?} */
SidebarLeftComponent.prototype.menu;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarHeight;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarOverflow;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.layout;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.isSidebarLeftCollapsed;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.isSidebarLeftExpandOnOver;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.isSidebarLeftMouseOver;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.windowInnerWidth;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.windowInnerHeight;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.collapsedItems;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.activatedItems;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.toggleListeners;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.listeners;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.itemsByIds;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.runningAnimations;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.subscriptions;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.activeUrl;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.initialized;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarElement;
/** @type {?} */
SidebarLeftComponent.prototype.sidebarLeftToggleDirectives;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.layoutStore;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.renderer2;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.router;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.routingService;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.wrapperService;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.headerService;
/**
* @type {?}
* @private
*/
SidebarLeftComponent.prototype.activatedRoute;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1sZWZ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FkLWN1c3RvbS1saWIvIiwic291cmNlcyI6WyJsaWIvbGF5b3V0L3NpZGViYXItbGVmdC9zaWRlYmFyLWxlZnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ1ksdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQ3JFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFDbkUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5RyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQUV0RSwwQkFVQzs7O0lBVEcsa0JBQVc7O0lBQ1gsd0JBQWlCOztJQUNqQixxQkFBYzs7SUFDZCxxQkFBZTs7SUFDZiwyQkFBcUI7O0lBQ3JCLHdCQUF1Qjs7SUFDdkIsd0JBQW1COztJQUNuQiwyQkFBc0I7O0lBQ3RCLCtCQUEwQjs7QUFXOUIsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7Ozs7Ozs7OztJQXFDN0IsWUFDWSxpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsTUFBYyxFQUNkLFNBQW9CLEVBQ3BCLE1BQWMsRUFDZCxjQUE4QixFQUM5QixjQUE4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MENBQXFEOzs7OztJQUNyRCxpREFBOEI7Ozs7O0lBQzlCLDZDQUEyQjs7Ozs7SUFDM0IseUNBQTBCOzs7OztJQUMxQiwyQ0FBNkI7O0lBRTdCLDhDQUFpRjs7SUFFakYsMkRBQW9IOzs7OztJQWNoSCxpREFBNEM7Ozs7O0lBQzVDLDJDQUFnQzs7Ozs7SUFDaEMsc0NBQXNCOzs7OztJQUN0Qix5Q0FBNEI7Ozs7O0lBQzVCLHNDQUFzQjs7Ozs7SUFDdEIsOENBQXNDOzs7OztJQUN0Qyw4Q0FBc0M7Ozs7O0lBQ3RDLDZDQUFvQzs7Ozs7SUFDcEMsOENBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV2ZW50IGFzIFJvdXRlckV2ZW50LCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJy4uLy4uL2FuaW1hdGlvbnMvYW5pbWF0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyByZW1vdmVMaXN0ZW5lcnMsIHJlbW92ZVN1YnNjcmlwdGlvbnMgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgUm91dGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yb3V0aW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIZWFkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vaGVhZGVyL2hlYWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0U3RvcmUgfSBmcm9tICcuLi9sYXlvdXQuc3RvcmUnO1xyXG5pbXBvcnQgeyBXcmFwcGVyU2VydmljZSB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuL3NpZGViYXItbGVmdC5kaXJlY3RpdmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcclxuICAgIGlkOiBudW1iZXI7XHJcbiAgICBwYXJlbnRJZDogbnVtYmVyO1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHJvdXRlPzogc3RyaW5nO1xyXG4gICAgaWNvbkNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICBjaGlsZHJlbj86IEFycmF5PEl0ZW0+O1xyXG4gICAgaXNBY3RpdmU/OiBib29sZWFuO1xyXG4gICAgaXNDb2xsYXBzZWQ/OiBib29sZWFuO1xyXG4gICAgZGlzYWJsZUNvbGxhcHNlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSXRlbXMgPSBBcnJheTxJdGVtPjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdtay1sYXlvdXQtc2lkZWJhci1sZWZ0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zaWRlYmFyLWxlZnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vc2lkZWJhci1sZWZ0LmNvbXBvbmVudC5jc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTGVmdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBwdWJsaWMgbWVudTogQXJyYXk8YW55PjtcclxuICAgIHB1YmxpYyBzaWRlYmFySGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgc2lkZWJhck92ZXJmbG93OiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdENvbGxhcHNlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3ZlcjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgaXNTaWRlYmFyTGVmdE1vdXNlT3ZlcjogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgd2luZG93SW5uZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSB3aW5kb3dJbm5lckhlaWdodDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjb2xsYXBzZWRJdGVtczogSXRlbXMgPSBbXTtcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkSXRlbXM6IEl0ZW1zID0gW107XHJcbiAgICBwcml2YXRlIHRvZ2dsZUxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyczogQXJyYXk8RnVuY3Rpb24+ID0gW107XHJcbiAgICBwcml2YXRlIGl0ZW1zQnlJZHM6IHsgW3Byb3BLZXk6IG51bWJlcl06IEl0ZW0gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBydW5uaW5nQW5pbWF0aW9ucyA9IDA7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICAgIHByaXZhdGUgYWN0aXZlVXJsOiBTdHJpbmc7XHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NpZGViYXJFbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHNpZGViYXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oU2lkZWJhckxlZnRUb2dnbGVEaXJlY3RpdmUpIHB1YmxpYyBzaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxTaWRlYmFyTGVmdFRvZ2dsZURpcmVjdGl2ZT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBtZXRob2QgY29uc3RydWN0b3JcclxuICAgICogQHBhcmFtICBjaGFuZ2VEZXRlY3RvclJlZiAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIGxheW91dFN0b3JlICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqIEBwYXJhbSAgbmdab25lICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICogQHBhcmFtICByZW5kZXJlcjIgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIHJvdXRlciAgICAgICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqIEBwYXJhbSAgcm91dGluZ1NlcnZpY2UgICAgIFtkZXNjcmlwdGlvbl1cclxuICAgICogQHBhcmFtICB3cmFwcGVyU2VydmljZSAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgKiBAcGFyYW0gIGhlYWRlclNlcnZpY2UgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBsYXlvdXRTdG9yZTogTGF5b3V0U3RvcmUsXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0aW5nU2VydmljZTogUm91dGluZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB3cmFwcGVyU2VydmljZTogV3JhcHBlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBoZWFkZXJTZXJ2aWNlOiBIZWFkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICAgKiBAbWV0aG9kIG5nT25Jbml0XHJcbiAgICAgICAqL1xyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1lbnUuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tZW51ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMubW9ua2V5UGF0Y2hNZW51KHRoaXMubWVudSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1lbnVMaXN0ZW5lcnModGhpcy5hY3RpdmVVcmwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTaWRlYmFyTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldE1lbnVUb2dnbGVzTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51QWN0aXZlVXJsLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVXJsID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TWVudUxpc3RlbmVycyh2YWx1ZSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucm91dGluZ1NlcnZpY2UuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB1cmw7XHJcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IGV2ZW50LnVybDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVVybCA9IHVybDtcclxuICAgICAgICAgICAgdGhpcy5zZXRNZW51TGlzdGVuZXJzKHVybCk7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHVybClcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0U2lkZWJhckxpc3RlbmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ0FmdGVyVmlld0luaXRcclxuICAgICAqL1xyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2V0TWVudVRvZ2dsZXNMaXN0ZW5lcnMoKTtcclxuICAgICAgICB0aGlzLmNoZWNrTWVudVdpdGhvdXRDaGlsZHJlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSByZW1vdmVTdWJzY3JpcHRpb25zKHRoaXMuc3Vic2NyaXB0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSByZW1vdmVMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlTGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMudG9nZ2xlTGlzdGVuZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtzZXRTaWRlYmFyTGlzdGVuZXJzIGRlc2NyaXB0aW9uXVxyXG4gICAgICogQG1ldGhvZCBzZXRTaWRlYmFyTGlzdGVuZXJzXHJcbiAgICAgKi9cclxuICAgIHNldFNpZGViYXJMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS5sYXlvdXQuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2lkZWJhckhlaWdodCgpO1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS53aW5kb3dJbm5lckhlaWdodC5zdWJzY3JpYmUoKHZhbHVlOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy53aW5kb3dJbm5lckhlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNpZGViYXJIZWlnaHQoKTtcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRNZW51LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1vdXNlT3Zlcih0cnVlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLnNpZGViYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdE1vdXNlT3ZlcihmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRTdG9yZS53aW5kb3dJbm5lcldpZHRoLnN1YnNjcmliZSgodmFsdWU6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndpbmRvd0lubmVyV2lkdGggPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgJiYgdGhpcy53aW5kb3dJbm5lcldpZHRoIDw9IDc2Nykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCh0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLndpbmRvd0lubmVyV2lkdGggPiA3NjcgJiYgdGhpcy5pc1NpZGViYXJMZWZ0Q29sbGFwc2VkICYmICF0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0U3RvcmUuc2lkZWJhckxlZnRDb2xsYXBzZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRNb3VzZU92ZXIuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2lkZWJhckxlZnRNb3VzZU92ZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWRlYmFyTGVmdEV4cGFuZE9uT3Zlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRTdG9yZS5zaWRlYmFyTGVmdENvbGxhcHNlZCghdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dFN0b3JlLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2lkZWJhckxlZnRFeHBhbmRPbk92ZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMud2luZG93SW5uZXJXaWR0aCA+IDc2NyAmJiB0aGlzLmlzU2lkZWJhckxlZnRDb2xsYXBzZWQgIT09IHVuZGVmaW5lZCkge1xy