UNPKG

carbon-components-angular

Version:
288 lines 30 kB
import { Component, Input, HostListener, ContentChildren, ViewChild } from "@angular/core"; import { Subscription } from "rxjs"; import { TabHeader } from "./tab-header.directive"; import { BaseTabHeader } from "./base-tab-header.component"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/utils"; import * as i2 from "@angular/common"; export class TabHeaderGroup extends BaseTabHeader { constructor(elementRef, changeDetectorRef, eventService, renderer) { super(elementRef, changeDetectorRef, eventService, renderer); this.elementRef = elementRef; this.changeDetectorRef = changeDetectorRef; this.eventService = eventService; this.renderer = renderer; this.isNavigation = false; /** * Keeps track of all the subscriptions to the tab header selection events. */ this.selectedSubscriptionTracker = new Subscription(); /** * Controls the manual focusing done by tabbing through headings. */ this.currentSelectedTab = 0; } // keyboard accessibility /** * Controls the keydown events used for tabbing through the headings. */ keyboardInput(event) { let tabHeadersArray = this.tabHeaderQuery.toArray(); if (event.key === "ArrowRight") { if (this.currentSelectedTab < tabHeadersArray.length - 1) { event.preventDefault(); if (this.followFocus && !tabHeadersArray[this.currentSelectedTab + 1].disabled) { tabHeadersArray[this.currentSelectedTab + 1].selectTab(); } else { tabHeadersArray[this.currentSelectedTab + 1].focus(); this.currentSelectedTab++; } } else { event.preventDefault(); if (this.followFocus && !tabHeadersArray[0].disabled) { tabHeadersArray[0].selectTab(); } else { tabHeadersArray[0].focus(); this.currentSelectedTab = 0; } } } if (event.key === "ArrowLeft") { if (this.currentSelectedTab > 0) { event.preventDefault(); if (this.followFocus && !tabHeadersArray[this.currentSelectedTab - 1].disabled) { tabHeadersArray[this.currentSelectedTab - 1].selectTab(); } else { tabHeadersArray[this.currentSelectedTab - 1].focus(); this.currentSelectedTab--; } } else { event.preventDefault(); if (this.followFocus && !tabHeadersArray[tabHeadersArray.length - 1].disabled) { tabHeadersArray[tabHeadersArray.length - 1].selectTab(); } else { tabHeadersArray[tabHeadersArray.length - 1].focus(); this.currentSelectedTab = tabHeadersArray.length - 1; } } } if (event.key === "Home") { event.preventDefault(); if (this.followFocus && !tabHeadersArray[0].disabled) { tabHeadersArray[0].selectTab(); } else { tabHeadersArray[0].focus(); this.currentSelectedTab = 0; } } if (event.key === "End") { event.preventDefault(); if (this.followFocus && !tabHeadersArray[tabHeadersArray.length - 1].disabled) { tabHeadersArray[tabHeadersArray.length - 1].selectTab(); } else { tabHeadersArray[tabHeadersArray.length - 1].focus(); this.currentSelectedTab = tabHeadersArray.length - 1; } } if ((event.key === " ") && !this.followFocus) { tabHeadersArray[this.currentSelectedTab].selectTab(); } } ngOnInit() { this.eventService.on(window, "resize", () => this.handleScroll()); } ngAfterContentInit() { this.selectedSubscriptionTracker.unsubscribe(); if (this.tabHeaderQuery) { this.tabHeaderQuery.toArray() .forEach(tabHeader => { tabHeader.cacheActive = this.cacheActive; tabHeader.paneTabIndex = this.isNavigation ? null : 0; }); } const selectedSubscriptions = this.tabHeaderQuery.toArray().forEach(tabHeader => { tabHeader.selected.subscribe(() => { this.currentSelectedTab = this.tabHeaderQuery.toArray().indexOf(tabHeader); // The Filter takes the current selected tab out, then all other headers are // deactivated and their associated pane references are also deactivated. this.tabHeaderQuery.toArray().filter(header => header !== tabHeader) .forEach(filteredHeader => { filteredHeader.active = false; if (filteredHeader.paneReference) { filteredHeader.paneReference.active = false; } }); }); }); this.selectedSubscriptionTracker.add(selectedSubscriptions); setTimeout(() => this.tabHeaderQuery.toArray()[this.currentSelectedTab].selectTab()); } ngOnChanges(changes) { if (this.tabHeaderQuery) { if (changes.cacheActive) { this.tabHeaderQuery.toArray().forEach(tabHeader => tabHeader.cacheActive = this.cacheActive); } if (changes.isNavigation) { this.tabHeaderQuery.toArray() .forEach(tabHeader => tabHeader.paneTabIndex = this.isNavigation ? null : 0); } } } getSelectedTab() { const selected = this.tabHeaderQuery.toArray()[this.currentSelectedTab]; if (selected) { return selected; } return { headingIsTemplate: false, heading: "" }; } } TabHeaderGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TabHeaderGroup, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.EventService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); TabHeaderGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TabHeaderGroup, selector: "cds-tab-header-group, ibm-tab-header-group", inputs: { isNavigation: "isNavigation" }, host: { listeners: { "keydown": "keyboardInput($event)" } }, queries: [{ propertyName: "tabHeaderQuery", predicate: TabHeader }], viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["tabList"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ` <button type="button" class="cds--tab--overflow-nav-button cds--tab--overflow-nav-button--previous" [ngClass]="{ 'cds--tab--overflow-nav-button--hidden': leftOverflowNavButtonHidden }" (click)="handleOverflowNavClick(-1, tabHeaderQuery.length)" (pointerdown)="handleOverflowNavMouseDown(-1)" (pointerup)="handleOverflowNavMouseUp()" (pointerleave)="handleOverflowNavMouseUp()" (pointerout)="handleOverflowNavMouseUp()" (pointercancel)="handleOverflowNavMouseUp()"> <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"> <path d="M5 8L10 3 10.7 3.7 6.4 8 10.7 12.3 10 13z"></path> </svg> </button> <div class="cds--tab--list" role="tablist" [attr.aria-label]="ariaLabel" (scroll)="handleScroll()" #tabList> <ng-container [ngTemplateOutlet]="contentBefore"></ng-container> <ng-content></ng-content> <ng-container [ngTemplateOutlet]="contentAfter"></ng-container> </div> <button type="button" class="cds--tab--overflow-nav-button cds--tab--overflow-nav-button--next" [ngClass]="{ 'cds--tab--overflow-nav-button--hidden': rightOverflowNavButtonHidden }" (click)="handleOverflowNavClick(1, tabHeaderQuery.length)" (pointerdown)="handleOverflowNavMouseDown(1)" (pointerup)="handleOverflowNavMouseUp()" (pointerleave)="handleOverflowNavMouseUp()" (pointerout)="handleOverflowNavMouseUp()" (pointercancel)="handleOverflowNavMouseUp()"> <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"> <path d="M11 8L6 13 5.3 12.3 9.6 8 5.3 3.7 6 3z"></path> </svg> </button> `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TabHeaderGroup, decorators: [{ type: Component, args: [{ selector: "cds-tab-header-group, ibm-tab-header-group", template: ` <button type="button" class="cds--tab--overflow-nav-button cds--tab--overflow-nav-button--previous" [ngClass]="{ 'cds--tab--overflow-nav-button--hidden': leftOverflowNavButtonHidden }" (click)="handleOverflowNavClick(-1, tabHeaderQuery.length)" (pointerdown)="handleOverflowNavMouseDown(-1)" (pointerup)="handleOverflowNavMouseUp()" (pointerleave)="handleOverflowNavMouseUp()" (pointerout)="handleOverflowNavMouseUp()" (pointercancel)="handleOverflowNavMouseUp()"> <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"> <path d="M5 8L10 3 10.7 3.7 6.4 8 10.7 12.3 10 13z"></path> </svg> </button> <div class="cds--tab--list" role="tablist" [attr.aria-label]="ariaLabel" (scroll)="handleScroll()" #tabList> <ng-container [ngTemplateOutlet]="contentBefore"></ng-container> <ng-content></ng-content> <ng-container [ngTemplateOutlet]="contentAfter"></ng-container> </div> <button type="button" class="cds--tab--overflow-nav-button cds--tab--overflow-nav-button--next" [ngClass]="{ 'cds--tab--overflow-nav-button--hidden': rightOverflowNavButtonHidden }" (click)="handleOverflowNavClick(1, tabHeaderQuery.length)" (pointerdown)="handleOverflowNavMouseDown(1)" (pointerup)="handleOverflowNavMouseUp()" (pointerleave)="handleOverflowNavMouseUp()" (pointerout)="handleOverflowNavMouseUp()" (pointercancel)="handleOverflowNavMouseUp()"> <svg focusable="false" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" fill="currentColor" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"> <path d="M11 8L6 13 5.3 12.3 9.6 8 5.3 3.7 6 3z"></path> </svg> </button> ` }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.EventService }, { type: i0.Renderer2 }]; }, propDecorators: { isNavigation: [{ type: Input }], tabHeaderQuery: [{ type: ContentChildren, args: [TabHeader] }], headerContainer: [{ type: ViewChild, args: ["tabList", { static: true }] }], keyboardInput: [{ type: HostListener, args: ["keydown", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWhlYWRlci1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFicy90YWItaGVhZGVyLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUVULEtBQUssRUFDTCxZQUFZLEVBQ1osZUFBZSxFQU1mLFNBQVMsRUFHVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFpRTVELE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQW1CaEQsWUFDVyxVQUFzQixFQUN0QixpQkFBb0MsRUFDcEMsWUFBMEIsRUFDMUIsUUFBbUI7UUFFN0IsS0FBSyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFMbkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQVc7UUF0QnJCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBUTlCOztXQUVHO1FBQ0gsZ0NBQTJCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVqRDs7V0FFRztRQUNILHVCQUFrQixHQUFHLENBQUMsQ0FBQztJQVN2QixDQUFDO0lBRUQseUJBQXlCO0lBQ3pCOztPQUVHO0lBRUgsYUFBYSxDQUFDLEtBQUs7UUFDbEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVwRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQy9CLElB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LFxuXHRJbnB1dCxcblx0SG9zdExpc3RlbmVyLFxuXHRDb250ZW50Q2hpbGRyZW4sXG5cdEFmdGVyQ29udGVudEluaXQsXG5cdEVsZW1lbnRSZWYsXG5cdE9uQ2hhbmdlcyxcblx0U2ltcGxlQ2hhbmdlcyxcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdFZpZXdDaGlsZCxcblx0T25Jbml0LFxuXHRSZW5kZXJlcjJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3V0aWxzXCI7XG5cbmltcG9ydCB7IFRhYkhlYWRlciB9IGZyb20gXCIuL3RhYi1oZWFkZXIuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBCYXNlVGFiSGVhZGVyIH0gZnJvbSBcIi4vYmFzZS10YWItaGVhZGVyLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLXRhYi1oZWFkZXItZ3JvdXAsIGlibS10YWItaGVhZGVyLWdyb3VwXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGJ1dHRvblxuXHRcdFx0dHlwZT1cImJ1dHRvblwiXG5cdFx0XHRjbGFzcz1cImNkcy0tdGFiLS1vdmVyZmxvdy1uYXYtYnV0dG9uIGNkcy0tdGFiLS1vdmVyZmxvdy1uYXYtYnV0dG9uLS1wcmV2aW91c1wiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYi0tb3ZlcmZsb3ctbmF2LWJ1dHRvbi0taGlkZGVuJzogbGVmdE92ZXJmbG93TmF2QnV0dG9uSGlkZGVuXG5cdFx0XHR9XCJcblx0XHRcdChjbGljayk9XCJoYW5kbGVPdmVyZmxvd05hdkNsaWNrKC0xLCB0YWJIZWFkZXJRdWVyeS5sZW5ndGgpXCJcblx0XHRcdChwb2ludGVyZG93bik9XCJoYW5kbGVPdmVyZmxvd05hdk1vdXNlRG93bigtMSlcIlxuXHRcdFx0KHBvaW50ZXJ1cCk9XCJoYW5kbGVPdmVyZmxvd05hdk1vdXNlVXAoKVwiXG5cdFx0XHQocG9pbnRlcmxlYXZlKT1cImhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpXCJcblx0XHRcdChwb2ludGVyb3V0KT1cImhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpXCJcblx0XHRcdChwb2ludGVyY2FuY2VsKT1cImhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpXCI+XG5cdFx0XHQ8c3ZnXG5cdFx0XHRcdGZvY3VzYWJsZT1cImZhbHNlXCJcblx0XHRcdFx0cHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaWRZTWlkIG1lZXRcIlxuXHRcdFx0XHR4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcblx0XHRcdFx0ZmlsbD1cImN1cnJlbnRDb2xvclwiXG5cdFx0XHRcdHdpZHRoPVwiMTZcIlxuXHRcdFx0XHRoZWlnaHQ9XCIxNlwiXG5cdFx0XHRcdHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuXHRcdFx0XHRhcmlhLWhpZGRlbj1cInRydWVcIj5cblx0XHRcdFx0PHBhdGggZD1cIk01IDhMMTAgMyAxMC43IDMuNyA2LjQgOCAxMC43IDEyLjMgMTAgMTN6XCI+PC9wYXRoPlxuXHRcdFx0PC9zdmc+XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdlxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYi0tbGlzdFwiXG5cdFx0XHRyb2xlPVwidGFibGlzdFwiXG5cdFx0XHRbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG5cdFx0XHQoc2Nyb2xsKT1cImhhbmRsZVNjcm9sbCgpXCJcblx0XHRcdCN0YWJMaXN0PlxuXHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50QmVmb3JlXCI+PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRBZnRlclwiPjwvbmctY29udGFpbmVyPlxuXHRcdDwvZGl2PlxuXHRcdDxidXR0b25cblx0XHRcdHR5cGU9XCJidXR0b25cIlxuXHRcdFx0Y2xhc3M9XCJjZHMtLXRhYi0tb3ZlcmZsb3ctbmF2LWJ1dHRvbiBjZHMtLXRhYi0tb3ZlcmZsb3ctbmF2LWJ1dHRvbi0tbmV4dFwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLXRhYi0tb3ZlcmZsb3ctbmF2LWJ1dHRvbi0taGlkZGVuJzogcmlnaHRPdmVyZmxvd05hdkJ1dHRvbkhpZGRlblxuXHRcdFx0fVwiXG5cdFx0XHQoY2xpY2spPVwiaGFuZGxlT3ZlcmZsb3dOYXZDbGljaygxLCB0YWJIZWFkZXJRdWVyeS5sZW5ndGgpXCJcblx0XHRcdChwb2ludGVyZG93bik9XCJoYW5kbGVPdmVyZmxvd05hdk1vdXNlRG93bigxKVwiXG5cdFx0XHQocG9pbnRlcnVwKT1cImhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpXCJcblx0XHRcdChwb2ludGVybGVhdmUpPVwiaGFuZGxlT3ZlcmZsb3dOYXZNb3VzZVVwKClcIlxuXHRcdFx0KHBvaW50ZXJvdXQpPVwiaGFuZGxlT3ZlcmZsb3dOYXZNb3VzZVVwKClcIlxuXHRcdFx0KHBvaW50ZXJjYW5jZWwpPVwiaGFuZGxlT3ZlcmZsb3dOYXZNb3VzZVVwKClcIj5cblx0XHRcdDxzdmdcblx0XHRcdFx0Zm9jdXNhYmxlPVwiZmFsc2VcIlxuXHRcdFx0XHRwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pZFlNaWQgbWVldFwiXG5cdFx0XHRcdHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuXHRcdFx0XHRmaWxsPVwiY3VycmVudENvbG9yXCJcblx0XHRcdFx0d2lkdGg9XCIxNlwiXG5cdFx0XHRcdGhlaWdodD1cIjE2XCJcblx0XHRcdFx0dmlld0JveD1cIjAgMCAxNiAxNlwiXG5cdFx0XHRcdGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuXHRcdFx0XHQ8cGF0aCBkPVwiTTExIDhMNiAxMyA1LjMgMTIuMyA5LjYgOCA1LjMgMy43IDYgM3pcIj48L3BhdGg+XG5cdFx0XHQ8L3N2Zz5cblx0XHQ8L2J1dHRvbj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJIZWFkZXJHcm91cCBleHRlbmRzIEJhc2VUYWJIZWFkZXIgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cdEBJbnB1dCgpIGlzTmF2aWdhdGlvbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBDb250ZW50Q2hpbGRyZW4gb2YgYWxsIHRoZSB0YWJIZWFkZXJzLlxuXHQgKi9cblx0QENvbnRlbnRDaGlsZHJlbihUYWJIZWFkZXIpIHRhYkhlYWRlclF1ZXJ5OiBRdWVyeUxpc3Q8VGFiSGVhZGVyPjtcblxuXHRAVmlld0NoaWxkKFwidGFiTGlzdFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXJDb250YWluZXI7XG5cdC8qKlxuXHQgKiBLZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHRhYiBoZWFkZXIgc2VsZWN0aW9uIGV2ZW50cy5cblx0ICovXG5cdHNlbGVjdGVkU3Vic2NyaXB0aW9uVHJhY2tlciA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuXHQvKipcblx0ICogQ29udHJvbHMgdGhlIG1hbnVhbCBmb2N1c2luZyBkb25lIGJ5IHRhYmJpbmcgdGhyb3VnaCBoZWFkaW5ncy5cblx0ICovXG5cdGN1cnJlbnRTZWxlY3RlZFRhYiA9IDA7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcblx0XHRwcm90ZWN0ZWQgZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjJcblx0KSB7XG5cdFx0c3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIGV2ZW50U2VydmljZSwgcmVuZGVyZXIpO1xuXHR9XG5cblx0Ly8ga2V5Ym9hcmQgYWNjZXNzaWJpbGl0eVxuXHQvKipcblx0ICogQ29udHJvbHMgdGhlIGtleWRvd24gZXZlbnRzIHVzZWQgZm9yIHRhYmJpbmcgdGhyb3VnaCB0aGUgaGVhZGluZ3MuXG5cdCAqL1xuXHRASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG5cdGtleWJvYXJkSW5wdXQoZXZlbnQpIHtcblx0XHRsZXQgdGFiSGVhZGVyc0FycmF5ID0gdGhpcy50YWJIZWFkZXJRdWVyeS50b0FycmF5KCk7XG5cblx0XHRpZiAoZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIikge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudFNlbGVjdGVkVGFiIDwgdGFiSGVhZGVyc0FycmF5Lmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0aWYgKHRoaXMuZm9sbG93Rm9jdXMgJiYgIXRhYkhlYWRlcnNBcnJheVt0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYiArIDFdLmRpc2FibGVkKSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RoaXMuY3VycmVudFNlbGVjdGVkVGFiICsgMV0uc2VsZWN0VGFiKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RoaXMuY3VycmVudFNlbGVjdGVkVGFiICsgMV0uZm9jdXMoKTtcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYisrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRpZiAodGhpcy5mb2xsb3dGb2N1cyAmJiAhdGFiSGVhZGVyc0FycmF5WzBdLmRpc2FibGVkKSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5WzBdLnNlbGVjdFRhYigpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRhYkhlYWRlcnNBcnJheVswXS5mb2N1cygpO1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudFNlbGVjdGVkVGFiID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYiA+IDApIHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0aWYgKHRoaXMuZm9sbG93Rm9jdXMgJiYgIXRhYkhlYWRlcnNBcnJheVt0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYiAtIDFdLmRpc2FibGVkKSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RoaXMuY3VycmVudFNlbGVjdGVkVGFiIC0gMV0uc2VsZWN0VGFiKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RoaXMuY3VycmVudFNlbGVjdGVkVGFiIC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYi0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRpZiAodGhpcy5mb2xsb3dGb2N1cyAmJiAhdGFiSGVhZGVyc0FycmF5W3RhYkhlYWRlcnNBcnJheS5sZW5ndGggLSAxXS5kaXNhYmxlZCkge1xuXHRcdFx0XHRcdHRhYkhlYWRlcnNBcnJheVt0YWJIZWFkZXJzQXJyYXkubGVuZ3RoIC0gMV0uc2VsZWN0VGFiKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RhYkhlYWRlcnNBcnJheS5sZW5ndGggLSAxXS5mb2N1cygpO1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudFNlbGVjdGVkVGFiID0gdGFiSGVhZGVyc0FycmF5Lmxlbmd0aCAtIDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZXZlbnQua2V5ID09PSBcIkhvbWVcIikge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICh0aGlzLmZvbGxvd0ZvY3VzICYmICF0YWJIZWFkZXJzQXJyYXlbMF0uZGlzYWJsZWQpIHtcblx0XHRcdFx0dGFiSGVhZGVyc0FycmF5WzBdLnNlbGVjdFRhYigpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFiSGVhZGVyc0FycmF5WzBdLmZvY3VzKCk7XG5cdFx0XHRcdHRoaXMuY3VycmVudFNlbGVjdGVkVGFiID0gMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZXZlbnQua2V5ID09PSBcIkVuZFwiKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0aWYgKHRoaXMuZm9sbG93Rm9jdXMgJiYgIXRhYkhlYWRlcnNBcnJheVt0YWJIZWFkZXJzQXJyYXkubGVuZ3RoIC0gMV0uZGlzYWJsZWQpIHtcblx0XHRcdFx0dGFiSGVhZGVyc0FycmF5W3RhYkhlYWRlcnNBcnJheS5sZW5ndGggLSAxXS5zZWxlY3RUYWIoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhYkhlYWRlcnNBcnJheVt0YWJIZWFkZXJzQXJyYXkubGVuZ3RoIC0gMV0uZm9jdXMoKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50U2VsZWN0ZWRUYWIgPSB0YWJIZWFkZXJzQXJyYXkubGVuZ3RoIC0gMTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoKGV2ZW50LmtleSA9PT0gXCIgXCIpICYmICF0aGlzLmZvbGxvd0ZvY3VzKSB7XG5cdFx0XHR0YWJIZWFkZXJzQXJyYXlbdGhpcy5jdXJyZW50U2VsZWN0ZWRUYWJdLnNlbGVjdFRhYigpO1xuXHRcdH1cblx0fVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuZXZlbnRTZXJ2aWNlLm9uKHdpbmRvdyBhcyBhbnksIFwicmVzaXplXCIsICgpID0+IHRoaXMuaGFuZGxlU2Nyb2xsKCkpO1xuXHR9XG5cblx0bmdBZnRlckNvbnRlbnRJbml0KCkge1xuXHRcdHRoaXMuc2VsZWN0ZWRTdWJzY3JpcHRpb25UcmFja2VyLnVuc3Vic2NyaWJlKCk7XG5cblx0XHRpZiAodGhpcy50YWJIZWFkZXJRdWVyeSkge1xuXHRcdFx0dGhpcy50YWJIZWFkZXJRdWVyeS50b0FycmF5KClcblx0XHRcdFx0LmZvckVhY2godGFiSGVhZGVyID0+IHtcblx0XHRcdFx0XHR0YWJIZWFkZXIuY2FjaGVBY3RpdmUgPSB0aGlzLmNhY2hlQWN0aXZlO1xuXHRcdFx0XHRcdHRhYkhlYWRlci5wYW5lVGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZFN1YnNjcmlwdGlvbnMgPSB0aGlzLnRhYkhlYWRlclF1ZXJ5LnRvQXJyYXkoKS5mb3JFYWNoKHRhYkhlYWRlciA9PiB7XG5cdFx0XHR0YWJIZWFkZXIuc2VsZWN0ZWQuc3Vic2NyaWJlKCgpID0+IHtcblx0XHRcdFx0dGhpcy5jdXJyZW50U2VsZWN0ZWRUYWIgPSB0aGlzLnRhYkhlYWRlclF1ZXJ5LnRvQXJyYXkoKS5pbmRleE9mKHRhYkhlYWRlcik7XG5cdFx0XHRcdC8vIFRoZSBGaWx0ZXIgdGFrZXMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgdGFiIG91dCwgdGhlbiBhbGwgb3RoZXIgaGVhZGVycyBhcmVcblx0XHRcdFx0Ly8gZGVhY3RpdmF0ZWQgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcGFuZSByZWZlcmVuY2VzIGFyZSBhbHNvIGRlYWN0aXZhdGVkLlxuXHRcdFx0XHR0aGlzLnRhYkhlYWRlclF1ZXJ5LnRvQXJyYXkoKS5maWx0ZXIoaGVhZGVyID0+IGhlYWRlciAhPT0gdGFiSGVhZGVyKVxuXHRcdFx0XHRcdC5mb3JFYWNoKGZpbHRlcmVkSGVhZGVyID0+IHtcblx0XHRcdFx0XHRcdGZpbHRlcmVkSGVhZGVyLmFjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0aWYgKGZpbHRlcmVkSGVhZGVyLnBhbmVSZWZlcmVuY2UpIHtcblx0XHRcdFx0XHRcdFx0ZmlsdGVyZWRIZWFkZXIucGFuZVJlZmVyZW5jZS5hY3RpdmUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdHRoaXMuc2VsZWN0ZWRTdWJzY3JpcHRpb25UcmFja2VyLmFkZChzZWxlY3RlZFN1YnNjcmlwdGlvbnMpO1xuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLnRhYkhlYWRlclF1ZXJ5LnRvQXJyYXkoKVt0aGlzLmN1cnJlbnRTZWxlY3RlZFRhYl0uc2VsZWN0VGFiKCkpO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLnRhYkhlYWRlclF1ZXJ5KSB7XG5cdFx0XHRpZiAoY2hhbmdlcy5jYWNoZUFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLnRhYkhlYWRlclF1ZXJ5LnRvQXJyYXkoKS5mb3JFYWNoKHRhYkhlYWRlciA9PiB0YWJIZWFkZXIuY2FjaGVBY3RpdmUgPSB0aGlzLmNhY2hlQWN0aXZlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoYW5nZXMuaXNOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHRoaXMudGFiSGVhZGVyUXVlcnkudG9BcnJheSgpXG5cdFx0XHRcdFx0LmZvckVhY2godGFiSGVhZGVyID0+IHRhYkhlYWRlci5wYW5lVGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRnZXRTZWxlY3RlZFRhYigpOiBhbnkge1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy50YWJIZWFkZXJRdWVyeS50b0FycmF5KClbdGhpcy5jdXJyZW50U2VsZWN0ZWRUYWJdO1xuXHRcdGlmIChzZWxlY3RlZCkge1xuXHRcdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0aGVhZGluZ0lzVGVtcGxhdGU6IGZhbHNlLFxuXHRcdFx0aGVhZGluZzogXCJcIlxuXHRcdH07XG5cdH1cbn1cbiJdfQ==