@nova-ui/bits
Version:
SolarWinds Nova Framework
156 lines • 28.2 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 { CdkScrollable, ScrollDispatcher } from "@angular/cdk/scrolling";
import { DOCUMENT } from "@angular/common";
import { Component, ElementRef, EventEmitter, HostListener, Inject, Input, NgZone, Output, Renderer2, ViewEncapsulation, } from "@angular/core";
import { NavigationEnd, Router } from "@angular/router";
import { filter, take } from "rxjs/operators";
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/scrolling";
import * as i2 from "@angular/router";
import * as i3 from "@angular/cdk/a11y";
const FOCUSABLE_SELECTOR = "a, button, input, textarea, select, details, [tabindex]:not([tabindex='-1'])";
/*
* <example-url>./../examples/index.html#/dialog</example-url><br />
*
* @dynamic
*/
export class DialogComponent {
constructor(document, elRef, renderer, ngZone, scrollDispatcher, router) {
this.document = document;
this.elRef = elRef;
this.renderer = renderer;
this.ngZone = ngZone;
this.scrollDispatcher = scrollDispatcher;
this.router = router;
/**
* Whether a backdrop element should be created for a given dialog (true by default).
* Alternatively, specify 'static' for a backdrop which doesn't close the dialog on click.
*/
this.backdrop = true;
/**
* Whether to close the dialog when escape key is pressed (true by default).
*/
this.keyboard = true;
/**
* Event fired on dismiss of the dialog window
*/
this.dismissEvent = new EventEmitter();
}
onShiftTab(event) {
if (this.elRef.nativeElement === this.document.activeElement ||
!this.elRef.nativeElement.contains(this.document.activeElement)) {
this.handleFocus(event);
}
}
onTab(event) {
if (!this.elRef.nativeElement.contains(this.document.activeElement)) {
this.handleFocus(event);
}
}
backdropMouseDown($event) {
this.mouseDownOrigin = $event.target;
}
backdropMouseUp($event) {
if (this.backdrop === true) {
if (this.mouseDownOrigin !== this.elRef.nativeElement) {
return;
}
else if (this.elRef.nativeElement === $event.target) {
this.dismiss("BACKDROP_CLICK");
}
}
}
escKey($event) {
if (this.keyboard && !$event.defaultPrevented) {
this.dismiss("ESC");
}
}
dismiss(reason) {
this.dismissEvent.emit(reason);
}
ngOnInit() {
this.elWithFocus = this.document.activeElement;
this.renderer.addClass(this.document.body, "dialog-open");
this.scrollableElement = new CdkScrollable(this.elRef, this.scrollDispatcher, this.ngZone);
this.scrollDispatcher.register(this.scrollableElement);
this.router.events
.pipe(filter((e) => e instanceof NavigationEnd), take(1))
.subscribe(() => this.dismiss("ROUTE_CHANGED"));
}
ngAfterViewInit() {
if (!this.elRef.nativeElement.contains(document.activeElement)) {
this.elRef.nativeElement["focus"].apply(this.elRef.nativeElement, []);
}
}
ngOnDestroy() {
const body = this.document.body;
const elWithFocus = this.elWithFocus;
let elementToFocus;
if (elWithFocus && elWithFocus["focus"] && body.contains(elWithFocus)) {
elementToFocus = elWithFocus;
}
else {
elementToFocus = body;
}
elementToFocus["focus"].apply(elementToFocus, []);
this.elWithFocus = null;
this.renderer.removeClass(body, "dialog-open");
this.scrollDispatcher.deregister(this.scrollableElement);
}
handleFocus(event) {
event.preventDefault();
this.elRef.nativeElement.querySelector(FOCUSABLE_SELECTOR).focus();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogComponent, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i1.ScrollDispatcher }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DialogComponent, selector: "nui-dialog-window", inputs: { backdrop: "backdrop", keyboard: "keyboard", size: "size", windowClass: "windowClass" }, outputs: { dismissEvent: "dismissEvent" }, host: { attributes: { "role": "dialog", "aria-modal": "true", "tabindex": "-1" }, listeners: { "keyup.esc": "escKey($event)", "mousedown": "backdropMouseDown($event)", "mouseup": "backdropMouseUp($event)", "window:keydown.shift.tab": "onShiftTab($event)", "window:keydown.tab": "onTab($event)" }, properties: { "class": "\"nui-dialog fade in show\" + (windowClass ? \" \" + windowClass : \"\")" } }, ngImport: i0, template: "<div [class]=\"'modal-dialog' + (size ? ' dialog-' + size : '')\" cdkTrapFocus>\n <div class=\"dialog-content\"><ng-content></ng-content></div>\n</div>\n", styles: [".nui .dialog-open{overflow:hidden}.nui .dialog-open .nui-dialog{overflow-x:hidden;overflow-y:auto}.nui .nui-dialog{display:none;overflow:hidden;position:fixed;inset:0;z-index:1050;pointer-events:auto;-webkit-overflow-scrolling:touch;outline:0}.nui .nui-dialog .modal-dialog{position:relative;width:auto;max-width:80%;margin:10px}.nui .nui-dialog .modal-dialog .dialog-content{position:relative;background-color:var(--nui-color-bg-content_popover,#fff);box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3));background-clip:padding-box;outline:0;min-width:400px;word-wrap:break-word}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header{display:flex;align-items:center;justify-content:space-between;padding:15px;border-bottom:1px solid;border-bottom-color:var(--nui-color-line-default,#d9d9d9);min-height:39px;background:none}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text{display:inline-flex;align-items:center;overflow:hidden}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text .dialog-title{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;display:inline-block;margin:0;padding:0;line-height:24px;text-transform:none}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text .nui-icon{margin-right:5px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .btn-group{margin-left:15px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-info{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-warning{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-warning,#fec405)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-critical{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body{position:relative;padding:15px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body.compact-mode{padding:0}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body.responsive-mode{overflow:auto;max-height:71vh}.nui .dialog-backdrop{position:fixed;inset:0;z-index:1040;background-color:var(--nui-color-overlay-modal,rgba(17, 17, 17, .5))}.nui .nui-overlay-container.cdk-overlay-container .dialog-backdrop,.nui .nui-overlay-container.cdk-overlay-container .nui-dialog{z-index:1000}@media (min-width: 768px){.nui .nui-dialog .modal-dialog{width:600px;margin:80px auto}.nui .nui-dialog .modal-dialog .dialog-content{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui-dialog .modal-dialog.dialog-sm{width:400px}}@media (min-width: 992px){.nui-dialog .modal-dialog.dialog-lg{width:900px}}\n"], dependencies: [{ kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogComponent, decorators: [{
type: Component,
args: [{ selector: "nui-dialog-window", host: {
"[class]": `"nui-dialog fade in show" + (windowClass ? " " + windowClass : "")`,
role: "dialog",
"aria-modal": "true",
tabindex: "-1",
"(keyup.esc)": "escKey($event)",
"(mousedown)": "backdropMouseDown($event)",
"(mouseup)": "backdropMouseUp($event)",
}, encapsulation: ViewEncapsulation.None, template: "<div [class]=\"'modal-dialog' + (size ? ' dialog-' + size : '')\" cdkTrapFocus>\n <div class=\"dialog-content\"><ng-content></ng-content></div>\n</div>\n", styles: [".nui .dialog-open{overflow:hidden}.nui .dialog-open .nui-dialog{overflow-x:hidden;overflow-y:auto}.nui .nui-dialog{display:none;overflow:hidden;position:fixed;inset:0;z-index:1050;pointer-events:auto;-webkit-overflow-scrolling:touch;outline:0}.nui .nui-dialog .modal-dialog{position:relative;width:auto;max-width:80%;margin:10px}.nui .nui-dialog .modal-dialog .dialog-content{position:relative;background-color:var(--nui-color-bg-content_popover,#fff);box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3));background-clip:padding-box;outline:0;min-width:400px;word-wrap:break-word}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header{display:flex;align-items:center;justify-content:space-between;padding:15px;border-bottom:1px solid;border-bottom-color:var(--nui-color-line-default,#d9d9d9);min-height:39px;background:none}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text{display:inline-flex;align-items:center;overflow:hidden}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text .dialog-title{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;display:inline-block;margin:0;padding:0;line-height:24px;text-transform:none}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .severity-text .nui-icon{margin-right:5px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header .btn-group{margin-left:15px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-info{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-warning{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-warning,#fec405)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-header.dialog-header-critical{border-bottom:3px solid;border-bottom-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body{position:relative;padding:15px}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body.compact-mode{padding:0}.nui .nui-dialog .modal-dialog .dialog-content .dialog-body.responsive-mode{overflow:auto;max-height:71vh}.nui .dialog-backdrop{position:fixed;inset:0;z-index:1040;background-color:var(--nui-color-overlay-modal,rgba(17, 17, 17, .5))}.nui .nui-overlay-container.cdk-overlay-container .dialog-backdrop,.nui .nui-overlay-container.cdk-overlay-container .nui-dialog{z-index:1000}@media (min-width: 768px){.nui .nui-dialog .modal-dialog{width:600px;margin:80px auto}.nui .nui-dialog .modal-dialog .dialog-content{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3))}.nui-dialog .modal-dialog.dialog-sm{width:400px}}@media (min-width: 992px){.nui-dialog .modal-dialog.dialog-lg{width:900px}}\n"] }]
}], ctorParameters: () => [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.ScrollDispatcher }, { type: i2.Router }], propDecorators: { backdrop: [{
type: Input
}], keyboard: [{
type: Input
}], size: [{
type: Input
}], windowClass: [{
type: Input
}], dismissEvent: [{
type: Output
}], onShiftTab: [{
type: HostListener,
args: ["window:keydown.shift.tab", ["$event"]]
}], onTab: [{
type: HostListener,
args: ["window:keydown.tab", ["$event"]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRTlDLE1BQU0sa0JBQWtCLEdBQ3BCLDhFQUE4RSxDQUFDO0FBRW5GOzs7O0dBSUc7QUFnQkgsTUFBTSxPQUFPLGVBQWU7SUErQnhCLFlBQzhCLFFBQWtCLEVBQ3BDLEtBQWlCLEVBQ2pCLFFBQW1CLEVBQ25CLE1BQWMsRUFD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aENYLGVBQWUsc2xCQy9ENUIsOEpBR0E7OzRGRDREYSxlQUFlO2tCQWYzQixTQUFTOytCQUNJLG1CQUFtQixRQUN2Qjt3QkFDRixTQUFTLEVBQUUsb0VBQW9FO3dCQUMvRSxJQUFJLEVBQUUsUUFBUTt3QkFDZCxZQUFZLEVBQUUsTUFBTTt3QkFDcEIsUUFBUSxFQUFFLElBQUk7d0JBQ2QsYUFBYSxFQUFFLGdCQUFnQjt3QkFDL0IsYUFBYSxFQUFFLDJCQUEyQjt3QkFDMUMsV0FBVyxFQUFFLHlCQUF5QjtxQkFDekMsaUJBR2MsaUJBQWlCLENBQUMsSUFBSTs7MEJBa0NoQyxNQUFNOzJCQUFDLFFBQVE7bUtBMUJYLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLSSxZQUFZO3NCQUFyQixNQUFNO2dCQWVQLFVBQVU7c0JBRFQsWUFBWTt1QkFBQywwQkFBMEIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXcEQsS0FBSztzQkFESixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IENka1Njcm9sbGFibGUsIFNjcm9sbERpc3BhdGNoZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5jb25zdCBGT0NVU0FCTEVfU0VMRUNUT1IgPVxuICAgIFwiYSwgYnV0dG9uLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgZGV0YWlscywgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PSctMSddKVwiO1xuXG4vKlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvZGlhbG9nPC9leGFtcGxlLXVybD48YnIgLz5cbiAqXG4gKiBAZHluYW1pY1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktZGlhbG9nLXdpbmRvd1wiLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgXCJbY2xhc3NdXCI6IGBcIm51aS1kaWFsb2cgZmFkZSBpbiBzaG93XCIgKyAod2luZG93Q2xhc3MgPyBcIiBcIiArIHdpbmRvd0NsYXNzIDogXCJcIilgLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJ0cnVlXCIsXG4gICAgICAgIHRhYmluZGV4OiBcIi0xXCIsXG4gICAgICAgIFwiKGtleXVwLmVzYylcIjogXCJlc2NLZXkoJGV2ZW50KVwiLFxuICAgICAgICBcIihtb3VzZWRvd24pXCI6IFwiYmFja2Ryb3BNb3VzZURvd24oJGV2ZW50KVwiLFxuICAgICAgICBcIihtb3VzZXVwKVwiOiBcImJhY2tkcm9wTW91c2VVcCgkZXZlbnQpXCIsXG4gICAgfSxcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2RpYWxvZy5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9kaWFsb2cuY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgZWxXaXRoRm9jdXM6IGFueTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgYmFja2Ryb3AgZWxlbWVudCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBnaXZlbiBkaWFsb2cgKHRydWUgYnkgZGVmYXVsdCkuXG4gICAgICogQWx0ZXJuYXRpdmVseSwgc3BlY2lmeSAnc3RhdGljJyBmb3IgYSBiYWNrZHJvcCB3aGljaCBkb2Vzbid0IGNsb3NlIHRoZSBkaWFsb2cgb24gY2xpY2suXG4gICAgICovXG4gICAgQElucHV0KCkgYmFja2Ryb3A6IGJvb2xlYW4gfCBzdHJpbmcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBjbG9zZSB0aGUgZGlhbG9nIHdoZW4gZXNjYXBlIGtleSBpcyBwcmVzc2VkICh0cnVlIGJ5IGRlZmF1bHQpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGtleWJvYXJkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFNpemUgb2YgYSBuZXcgZGlhbG9nIHdpbmRvdy5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzaXplOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gY2xhc3MgdG8gYXBwZW5kIHRvIHRoZSBkaWFsb2cgd2luZG93XG4gICAgICovXG4gICAgQElucHV0KCkgd2luZG93Q2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIG9uIGRpc21pc3Mgb2YgdGhlIGRpYWxvZyB3aW5kb3dcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZGlzbWlzc0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHJpdmF0ZSBzY3JvbGxhYmxlRWxlbWVudDogQ2RrU2Nyb2xsYWJsZTtcbiAgICBwcml2YXRlIG1vdXNlRG93bk9yaWdpbjogTW91c2VFdmVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHNjcm9sbERpc3BhdGNoZXI6IFNjcm9sbERpc3BhdGNoZXIsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgICApIHt9XG5cbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93OmtleWRvd24uc2hpZnQudGFiXCIsIFtcIiRldmVudFwiXSlcbiAgICBvblNoaWZ0VGFiKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCA9PT0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8XG4gICAgICAgICAgICAhdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZvY3VzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6a2V5ZG93bi50YWJcIiwgW1wiJGV2ZW50XCJdKVxuICAgIG9uVGFiKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXMoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmFja2Ryb3BNb3VzZURvd24oJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3VzZURvd25PcmlnaW4gPSAkZXZlbnQudGFyZ2V0O1xuICAgIH1cblxuICAgIGJhY2tkcm9wTW91c2VVcCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5iYWNrZHJvcCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW91c2VEb3duT3JpZ2luICE9PSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCA9PT0gJGV2ZW50LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzbWlzcyhcIkJBQ0tEUk9QX0NMSUNLXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXNjS2V5KCRldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkICYmICEkZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNtaXNzKFwiRVNDXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzbWlzcyhyZWFzb246IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc21pc3NFdmVudC5lbWl0KHJlYXNvbik7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVsV2l0aEZvY3VzID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZG9jdW1lbnQuYm9keSwgXCJkaWFsb2ctb3BlblwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxhYmxlRWxlbWVudCA9IG5ldyBDZGtTY3JvbGxhYmxlKFxuICAgICAgICAgICAgdGhpcy5lbFJlZixcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlcixcbiAgICAgICAgICAgIHRoaXMubmdab25lXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlci5yZWdpc3Rlcih0aGlzLnNjcm9sbGFibGVFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZSkgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kaXNtaXNzKFwiUk9VVEVfQ0hBTkdFRFwiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudFtcImZvY3VzXCJdLmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3QgZWxXaXRoRm9jdXMgPSB0aGlzLmVsV2l0aEZvY3VzO1xuXG4gICAgICAgIGxldCBlbGVtZW50VG9Gb2N1cztcbiAgICAgICAgaWYgKGVsV2l0aEZvY3VzICYmIGVsV2l0aEZvY3VzW1wiZm9jdXNcIl0gJiYgYm9keS5jb250YWlucyhlbFdpdGhGb2N1cykpIHtcbiAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzID0gZWxXaXRoRm9jdXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cyA9IGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudFRvRm9jdXNbXCJmb2N1c1wiXS5hcHBseShlbGVtZW50VG9Gb2N1cywgW10pO1xuXG4gICAgICAgIHRoaXMuZWxXaXRoRm9jdXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGJvZHksIFwiZGlhbG9nLW9wZW5cIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlci5kZXJlZ2lzdGVyKHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRm9jdXMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoRk9DVVNBQkxFX1NFTEVDVE9SKS5mb2N1cygpO1xuICAgIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIidtb2RhbC1kaWFsb2cnICsgKHNpemUgPyAnIGRpYWxvZy0nICsgc2l6ZSA6ICcnKVwiIGNka1RyYXBGb2N1cz5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRlbnRcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+XG48L2Rpdj5cbiJdfQ==