@nova-ui/bits
Version:
SolarWinds Nova Framework
113 lines • 17.5 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { ActiveDescendantKeyManager } from "@angular/cdk/a11y";
import { Injectable } from "@angular/core";
import { KEYBOARD_CODE } from "../../constants/keycode.constants";
import * as i0 from "@angular/core";
const scrollOption = { block: "nearest" };
export class TimePickerKeyboardService {
initService(popup, overlay, trigger) {
this.overlay = overlay;
this.popup = popup;
this.menuItems = popup.menuItems.toArray();
this.keyboardEventsManager =
new ActiveDescendantKeyManager(this.menuItems);
this.menuTrigger = trigger;
}
onKeyDown(event) {
this.overlay.showing
? this.handleOpenedMenu(event)
: this.handleClosedMenu(event);
}
handleOpenedMenu(event) {
const { code } = event;
if (code === KEYBOARD_CODE.ESCAPE) {
this.hideMenu();
}
if (code === KEYBOARD_CODE.ARROW_DOWN ||
code === KEYBOARD_CODE.ARROW_UP) {
this.navigateByArrow(event);
}
if (code === KEYBOARD_CODE.ENTER) {
event.preventDefault();
this.keyboardEventsManager.activeItem?.doAction(event);
}
if (code === KEYBOARD_CODE.SPACE &&
document.activeElement === this.menuTrigger) {
event.preventDefault();
this.overlay.toggle();
}
}
handleClosedMenu(event) {
const { code } = event;
const isIconTrigger = document.activeElement === this.menuTrigger &&
this.isOpenMenuCode(code);
const isInputTrigger = document.activeElement !== this.menuTrigger &&
code === KEYBOARD_CODE.ARROW_DOWN;
if (isInputTrigger || isIconTrigger) {
event.preventDefault();
this.overlay.show();
this.keyboardEventsManager.setActiveItem(this.getSelectedIndex());
this.keyboardEventsManager.activeItem?.menuItem?.nativeElement?.scrollIntoView({ block: "center" });
}
}
hideMenu() {
this.overlay.hide();
}
navigateByArrow(event) {
const { code } = event;
const index = this.keyboardEventsManager.activeItemIndex;
event.preventDefault();
if (code === KEYBOARD_CODE.ARROW_UP && index === 0) {
this.navigateOnLast();
return;
}
if (code === KEYBOARD_CODE.ARROW_DOWN &&
index === this.menuItems.length) {
this.navigateOnFirst();
return;
}
this.keyboardEventsManager.onKeydown(event);
this.keyboardEventsManager.activeItem?.menuItem?.nativeElement?.scrollIntoView(scrollOption);
}
navigateOnLast() {
this.keyboardEventsManager.setActiveItem(this.menuItems.length - 1);
this.keyboardEventsManager.activeItem?.menuItem.nativeElement.scrollIntoView(scrollOption);
}
navigateOnFirst() {
this.keyboardEventsManager.setActiveItem(0);
this.keyboardEventsManager.activeItem?.menuItem.nativeElement.scrollIntoView(scrollOption);
}
getSelectedIndex() {
return this.menuItems.findIndex((component) => {
const parent = component.menuItem.nativeElement.parentElement;
return parent.classList.contains("nui-menu-item--selected");
});
}
isOpenMenuCode(code) {
return code === KEYBOARD_CODE.ENTER || code === KEYBOARD_CODE.SPACE;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimePickerKeyboardService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIta2V5Ym9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdGltZS1waWNrZXIvdGltZS1waWNrZXIta2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBSWxFLE1BQU0sWUFBWSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBMkIsQ0FBQztBQUduRSxNQUFNLE9BQU8seUJBQXlCO0lBTzNCLFdBQVcsQ0FDZCxLQUF5QixFQUN6QixPQUF5QixFQUN6QixPQUFvQjtRQUVwQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQjtZQUN0QixJQUFJLDBCQUEwQixDQUMxQixJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO1FBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7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QUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUMxRSxZQUFZLENBQ2YsQ0FBQztJQUNOLENBQUM7SUFFTyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDeEUsWUFBWSxDQUNmLENBQUM7SUFDTixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQ3hFLFlBQVksQ0FDZixDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBRTlELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBbUI7UUFDdEMsT0FBTyxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQztJQUN4RSxDQUFDOytHQWxJUSx5QkFBeUI7bUhBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IEtFWUJPQVJEX0NPREUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2tleWNvZGUuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNZW51SXRlbUJhc2VDb21wb25lbnQsIE1lbnVQb3B1cENvbXBvbmVudCB9IGZyb20gXCIuLi9tZW51XCI7XG5pbXBvcnQgeyBPdmVybGF5Q29tcG9uZW50IH0gZnJvbSBcIi4uL292ZXJsYXkvb3ZlcmxheS1jb21wb25lbnQvb3ZlcmxheS5jb21wb25lbnRcIjtcblxuY29uc3Qgc2Nyb2xsT3B0aW9uID0geyBibG9jazogXCJuZWFyZXN0XCIgfSBhcyBTY3JvbGxJbnRvVmlld09wdGlvbnM7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyS2V5Ym9hcmRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgb3ZlcmxheTogT3ZlcmxheUNvbXBvbmVudDtcbiAgICBwcml2YXRlIHBvcHVwOiBNZW51UG9wdXBDb21wb25lbnQ7XG4gICAgcHJpdmF0ZSBtZW51SXRlbXM6IE1lbnVJdGVtQmFzZUNvbXBvbmVudFtdO1xuICAgIHByaXZhdGUga2V5Ym9hcmRFdmVudHNNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxNZW51SXRlbUJhc2VDb21wb25lbnQ+O1xuICAgIHByaXZhdGUgbWVudVRyaWdnZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgcHVibGljIGluaXRTZXJ2aWNlKFxuICAgICAgICBwb3B1cDogTWVudVBvcHVwQ29tcG9uZW50LFxuICAgICAgICBvdmVybGF5OiBPdmVybGF5Q29tcG9uZW50LFxuICAgICAgICB0cmlnZ2VyOiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBvcHVwID0gcG9wdXA7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gcG9wdXAubWVudUl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIgPVxuICAgICAgICAgICAgbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPE1lbnVJdGVtQmFzZUNvbXBvbmVudD4oXG4gICAgICAgICAgICAgICAgdGhpcy5tZW51SXRlbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIHRoaXMubWVudVRyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdmVybGF5LnNob3dpbmdcbiAgICAgICAgICAgID8gdGhpcy5oYW5kbGVPcGVuZWRNZW51KGV2ZW50KVxuICAgICAgICAgICAgOiB0aGlzLmhhbmRsZUNsb3NlZE1lbnUoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlT3BlbmVkTWVudShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGV2ZW50O1xuXG4gICAgICAgIGlmIChjb2RlID09PSBLRVlCT0FSRF9DT0RFLkVTQ0FQRSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlTWVudSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOIHx8XG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX1VQXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUJ5QXJyb3coZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEtFWUJPQVJEX0NPREUuRU5URVIpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5kb0FjdGlvbihldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLlNQQUNFICYmXG4gICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm1lbnVUcmlnZ2VyXG4gICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheS50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xvc2VkTWVudShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBpc0ljb25UcmlnZ2VyID1cbiAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMubWVudVRyaWdnZXIgJiZcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuTWVudUNvZGUoY29kZSBhcyBLRVlCT0FSRF9DT0RFKTtcbiAgICAgICAgY29uc3QgaXNJbnB1dFRyaWdnZXIgPVxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhpcy5tZW51VHJpZ2dlciAmJlxuICAgICAgICAgICAgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOO1xuXG4gICAgICAgIGlmIChpc0lucHV0VHJpZ2dlciB8fCBpc0ljb25UcmlnZ2VyKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5LnNob3coKTtcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odGhpcy5nZXRTZWxlY3RlZEluZGV4KCkpO1xuICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuYWN0aXZlSXRlbT8ubWVudUl0ZW0/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbEludG9WaWV3KFxuICAgICAgICAgICAgICAgIHsgYmxvY2s6IFwiY2VudGVyXCIgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZU1lbnUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheS5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZUJ5QXJyb3coZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtSW5kZXg7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19VUCAmJiBpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU9uTGFzdCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV04gJiZcbiAgICAgICAgICAgIGluZGV4ID09PSB0aGlzLm1lbnVJdGVtcy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlT25GaXJzdCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5tZW51SXRlbT8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgICBzY3JvbGxPcHRpb25cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5hdmlnYXRlT25MYXN0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMubWVudUl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtPy5tZW51SXRlbS5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KFxuICAgICAgICAgICAgc2Nyb2xsT3B0aW9uXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZU9uRmlyc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oMCk7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0/Lm1lbnVJdGVtLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoXG4gICAgICAgICAgICBzY3JvbGxPcHRpb25cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVudUl0ZW1zLmZpbmRJbmRleCgoY29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBjb21wb25lbnQubWVudUl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNsYXNzTGlzdC5jb250YWlucyhcIm51aS1tZW51LWl0ZW0tLXNlbGVjdGVkXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT3Blbk1lbnVDb2RlKGNvZGU6IEtFWUJPQVJEX0NPREUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvZGUgPT09IEtFWUJPQVJEX0NPREUuRU5URVIgfHwgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5TUEFDRTtcbiAgICB9XG59XG4iXX0=