@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
149 lines • 19.7 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Directive, ElementRef, inject, Input, NgZone, ViewChildren, ViewEncapsulation, } from '@angular/core';
import { distinctUntilChanged, skip, startWith } from 'rxjs/operators';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { ngbNavFadeInTransition, ngbNavFadeOutTransition } from './nav-transition';
import { ngbRunTransition } from '../util/transition/ngbTransition';
import { NgTemplateOutlet } from '@angular/common';
import * as i0 from "@angular/core";
export class NgbNavPane {
constructor() {
this.nativeElement = inject(ElementRef).nativeElement;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbNavPane, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.0", type: NgbNavPane, isStandalone: true, selector: "[ngbNavPane]", inputs: { item: "item", nav: "nav", role: "role" }, host: { properties: { "id": "item.panelDomId", "class.fade": "nav.animation", "attr.role": "role ? role : nav.roles ? \"tabpanel\" : undefined", "attr.aria-labelledby": "item.domId" }, classAttribute: "tab-pane" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbNavPane, decorators: [{
type: Directive,
args: [{
selector: '[ngbNavPane]',
standalone: true,
host: {
'[id]': 'item.panelDomId',
class: 'tab-pane',
'[class.fade]': 'nav.animation',
'[attr.role]': 'role ? role : nav.roles ? "tabpanel" : undefined',
'[attr.aria-labelledby]': 'item.domId',
},
}]
}], propDecorators: { item: [{
type: Input
}], nav: [{
type: Input
}], role: [{
type: Input
}] } });
/**
* The outlet where currently active nav content will be displayed.
*
* @since 5.2.0
*/
export class NgbNavOutlet {
constructor() {
this._cd = inject(ChangeDetectorRef);
this._ngZone = inject(NgZone);
this._activePane = null;
}
isPanelTransitioning(item) {
return this._activePane?.item === item;
}
ngAfterViewInit() {
// initial display
this._updateActivePane();
// this will be emitted for all 3 types of nav changes: .select(), [activeId] or (click)
this.nav.navItemChange$
.pipe(takeUntilDestroyed(this.nav.destroyRef), startWith(this._activePane?.item || null), distinctUntilChanged(), skip(1))
.subscribe((nextItem) => {
const options = { animation: this.nav.animation, runningTransition: 'stop' };
// next panel we're switching to will only appear in DOM after the change detection is done
// and `this._panes` will be updated
this._cd.detectChanges();
// fading out
if (this._activePane) {
ngbRunTransition(this._ngZone, this._activePane.nativeElement, ngbNavFadeOutTransition, options).subscribe(() => {
const activeItem = this._activePane?.item;
this._activePane = this._getPaneForItem(nextItem);
// mark for check when transition finishes as outlet or parent containers might be OnPush
// without this the panes that have "faded out" will stay in DOM
this._cd.markForCheck();
// fading in
if (this._activePane) {
// we have to add the '.active' class before running the transition,
// because it should be in place before `ngbRunTransition` does `reflow()`
this._activePane.nativeElement.classList.add('active');
ngbRunTransition(this._ngZone, this._activePane.nativeElement, ngbNavFadeInTransition, options).subscribe(() => {
if (nextItem) {
nextItem.shown.emit();
this.nav.shown.emit(nextItem.id);
}
});
}
if (activeItem) {
activeItem.hidden.emit();
this.nav.hidden.emit(activeItem.id);
}
});
}
else {
this._updateActivePane();
}
});
}
_updateActivePane() {
this._activePane = this._getActivePane();
this._activePane?.nativeElement.classList.add('show');
this._activePane?.nativeElement.classList.add('active');
}
_getPaneForItem(item) {
return (this._panes && this._panes.find((pane) => pane.item === item)) || null;
}
_getActivePane() {
return (this._panes && this._panes.find((pane) => pane.item.active)) || null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbNavOutlet, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.0", type: NgbNavOutlet, isStandalone: true, selector: "[ngbNavOutlet]", inputs: { paneRole: "paneRole", nav: ["ngbNavOutlet", "nav"] }, host: { properties: { "class.tab-content": "true" } }, viewQueries: [{ propertyName: "_panes", predicate: NgbNavPane, descendants: true }], ngImport: i0, template: `
(item of nav.items; track item) {
(item.isPanelInDom() || isPanelTransitioning(item)) {
<div ngbNavPane [item]="item" [nav]="nav" [role]="paneRole">
<ng-template
[ngTemplateOutlet]="item.contentTpl?.templateRef || null"
[ngTemplateOutletContext]="{ $implicit: item.active || isPanelTransitioning(item) }"
/>
</div>
}
}
`, isInline: true, dependencies: [{ kind: "directive", type: NgbNavPane, selector: "[ngbNavPane]", inputs: ["item", "nav", "role"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgbNavOutlet, decorators: [{
type: Component,
args: [{
selector: '[ngbNavOutlet]',
standalone: true,
imports: [NgbNavPane, NgTemplateOutlet],
host: {
'[class.tab-content]': 'true',
},
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
(item of nav.items; track item) {
(item.isPanelInDom() || isPanelTransitioning(item)) {
<div ngbNavPane [item]="item" [nav]="nav" [role]="paneRole">
<ng-template
[ngTemplateOutlet]="item.contentTpl?.templateRef || null"
[ngTemplateOutletContext]="{ $implicit: item.active || isPanelTransitioning(item) }"
/>
</div>
}
}
`,
}]
}], propDecorators: { _panes: [{
type: ViewChildren,
args: [NgbNavPane]
}], paneRole: [{
type: Input
}], nav: [{
type: Input,
args: ['ngbNavOutlet']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW91dGxldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uYXYvbmF2LW91dGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixZQUFZLEVBQ1osaUJBQWlCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGdCQUFnQixFQUF3QixNQUFNLGtDQUFrQyxDQUFDO0FBRTFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQWFuRCxNQUFNLE9BQU8sVUFBVTtJQVh2QjtRQVlDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQTRCLENBQUM7S0FLaEU7OEdBTlksVUFBVTtrR0FBVixVQUFVOzsyRkFBVixVQUFVO2tCQVh0QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNMLE1BQU0sRUFBRSxpQkFBaUI7d0JBQ3pCLEtBQUssRUFBRSxVQUFVO3dCQUNqQixjQUFjLEVBQUUsZUFBZTt3QkFDL0IsYUFBYSxFQUFFLGtEQUFrRDt3QkFDakUsd0JBQXdCLEVBQUUsWUFBWTtxQkFDdEM7aUJBQ0Q7OEJBSVMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxJQUFJ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QixHQUFHO3NCQUF6QixLQUFLO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdENvbXBvbmVudCxcblx0RGlyZWN0aXZlLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdElucHV0LFxuXHROZ1pvbmUsXG5cdFF1ZXJ5TGlzdCxcblx0Vmlld0NoaWxkcmVuLFxuXHRWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc2tpcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBuZ2JOYXZGYWRlSW5UcmFuc2l0aW9uLCBuZ2JOYXZGYWRlT3V0VHJhbnNpdGlvbiB9IGZyb20gJy4vbmF2LXRyYW5zaXRpb24nO1xuaW1wb3J0IHsgbmdiUnVuVHJhbnNpdGlvbiwgTmdiVHJhbnNpdGlvbk9wdGlvbnMgfSBmcm9tICcuLi91dGlsL3RyYW5zaXRpb24vbmdiVHJhbnNpdGlvbic7XG5pbXBvcnQgeyBOZ2JOYXYsIE5nYk5hdkl0ZW0gfSBmcm9tICcuL25hdic7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnW25nYk5hdlBhbmVdJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aG9zdDoge1xuXHRcdCdbaWRdJzogJ2l0ZW0ucGFuZWxEb21JZCcsXG5cdFx0Y2xhc3M6ICd0YWItcGFuZScsXG5cdFx0J1tjbGFzcy5mYWRlXSc6ICduYXYuYW5pbWF0aW9uJyxcblx0XHQnW2F0dHIucm9sZV0nOiAncm9sZSA/IHJvbGUgOiBuYXYucm9sZXMgPyBcInRhYnBhbmVsXCIgOiB1bmRlZmluZWQnLFxuXHRcdCdbYXR0ci5hcmlhLWxhYmVsbGVkYnldJzogJ2l0ZW0uZG9tSWQnLFxuXHR9LFxufSlcbmV4cG9ydCBjbGFzcyBOZ2JOYXZQYW5lIHtcblx0bmF0aXZlRWxlbWVudCA9IGluamVjdChFbGVtZW50UmVmKS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG5cdEBJbnB1dCgpIGl0ZW06IE5nYk5hdkl0ZW07XG5cdEBJbnB1dCgpIG5hdjogTmdiTmF2O1xuXHRASW5wdXQoKSByb2xlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG91dGxldCB3aGVyZSBjdXJyZW50bHkgYWN0aXZlIG5hdiBjb250ZW50IHdpbGwgYmUgZGlzcGxheWVkLlxuICpcbiAqIEBzaW5jZSA1LjIuMFxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdbbmdiTmF2T3V0bGV0XScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGltcG9ydHM6IFtOZ2JOYXZQYW5lLCBOZ1RlbXBsYXRlT3V0bGV0XSxcblx0aG9zdDoge1xuXHRcdCdbY2xhc3MudGFiLWNvbnRlbnRdJzogJ3RydWUnLFxuXHR9LFxuXHRlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0dGVtcGxhdGU6IGBcblx0XHRAZm9yIChpdGVtIG9mIG5hdi5pdGVtczsgdHJhY2sgaXRlbSkge1xuXHRcdFx0QGlmIChpdGVtLmlzUGFuZWxJbkRvbSgpIHx8IGlzUGFuZWxUcmFuc2l0aW9uaW5nKGl0ZW0pKSB7XG5cdFx0XHRcdDxkaXYgbmdiTmF2UGFuZSBbaXRlbV09XCJpdGVtXCIgW25hdl09XCJuYXZcIiBbcm9sZV09XCJwYW5lUm9sZVwiPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbS5jb250ZW50VHBsPy50ZW1wbGF0ZVJlZiB8fCBudWxsXCJcblx0XHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbS5hY3RpdmUgfHwgaXNQYW5lbFRyYW5zaXRpb25pbmcoaXRlbSkgfVwiXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHR9XG5cdFx0fVxuXHRgLFxufSlcbmV4cG9ydCBjbGFzcyBOZ2JOYXZPdXRsZXQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblx0cHJpdmF0ZSBfY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXHRwcml2YXRlIF9uZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblxuXHRwcml2YXRlIF9hY3RpdmVQYW5lOiBOZ2JOYXZQYW5lIHwgbnVsbCA9IG51bGw7XG5cblx0QFZpZXdDaGlsZHJlbihOZ2JOYXZQYW5lKSBwcml2YXRlIF9wYW5lczogUXVlcnlMaXN0PE5nYk5hdlBhbmU+O1xuXG5cdC8qKlxuXHQgKiBBIHJvbGUgdG8gc2V0IG9uIHRoZSBuYXYgcGFuZVxuXHQgKi9cblx0QElucHV0KCkgcGFuZVJvbGU7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgYE5nYk5hdmBcblx0ICovXG5cdEBJbnB1dCgnbmdiTmF2T3V0bGV0JykgbmF2OiBOZ2JOYXY7XG5cblx0aXNQYW5lbFRyYW5zaXRpb25pbmcoaXRlbTogTmdiTmF2SXRlbSkge1xuXHRcdHJldHVybiB0aGlzLl9hY3RpdmVQYW5lPy5pdGVtID09PSBpdGVtO1xuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdC8vIGluaXRpYWwgZGlzcGxheVxuXHRcdHRoaXMuX3VwZGF0ZUFjdGl2ZVBhbmUoKTtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSBlbWl0dGVkIGZvciBhbGwgMyB0eXBlcyBvZiBuYXYgY2hhbmdlczogLnNlbGVjdCgpLCBbYWN0aXZlSWRdIG9yIChjbGljaylcblx0XHR0aGlzLm5hdi5uYXZJdGVtQ2hhbmdlJFxuXHRcdFx0LnBpcGUoXG5cdFx0XHRcdHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLm5hdi5kZXN0cm95UmVmKSxcblx0XHRcdFx0c3RhcnRXaXRoKHRoaXMuX2FjdGl2ZVBhbmU/Lml0ZW0gfHwgbnVsbCksXG5cdFx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cdFx0XHRcdHNraXAoMSksXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKChuZXh0SXRlbSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvcHRpb25zOiBOZ2JUcmFuc2l0aW9uT3B0aW9uczx1bmRlZmluZWQ+ID0geyBhbmltYXRpb246IHRoaXMubmF2LmFuaW1hdGlvbiwgcnVubmluZ1RyYW5zaXRpb246ICdzdG9wJyB9O1xuXG5cdFx0XHRcdC8vIG5leHQgcGFuZWwgd2UncmUgc3dpdGNoaW5nIHRvIHdpbGwgb25seSBhcHBlYXIgaW4gRE9NIGFmdGVyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGlzIGRvbmVcblx0XHRcdFx0Ly8gYW5kIGB0aGlzLl9wYW5lc2Agd2lsbCBiZSB1cGRhdGVkXG5cdFx0XHRcdHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0XHQvLyBmYWRpbmcgb3V0XG5cdFx0XHRcdGlmICh0aGlzLl9hY3RpdmVQYW5lKSB7XG5cdFx0XHRcdFx0bmdiUnVuVHJhbnNpdGlvbih0aGlzLl9uZ1pvbmUsIHRoaXMuX2FjdGl2ZVBhbmUubmF0aXZlRWxlbWVudCwgbmdiTmF2RmFkZU91dFRyYW5zaXRpb24sIG9wdGlvbnMpLnN1YnNjcmliZShcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuX2FjdGl2ZVBhbmU/Lml0ZW07XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FjdGl2ZVBhbmUgPSB0aGlzLl9nZXRQYW5lRm9ySXRlbShuZXh0SXRlbSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gbWFyayBmb3IgY2hlY2sgd2hlbiB0cmFuc2l0aW9uIGZpbmlzaGVzIGFzIG91dGxldCBvciBwYXJlbnQgY29udGFpbmVycyBtaWdodCBiZSBPblB1c2hcblx0XHRcdFx0XHRcdFx0Ly8gd2l0aG91dCB0aGlzIHRoZSBwYW5lcyB0aGF0IGhhdmUgXCJmYWRlZCBvdXRcIiB3aWxsIHN0YXkgaW4gRE9NXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGZhZGluZyBpblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5fYWN0aXZlUGFuZSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgdG8gYWRkIHRoZSAnLmFjdGl2ZScgY2xhc3MgYmVmb3JlIHJ1bm5pbmcgdGhlIHRyYW5zaXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVjYXVzZSBpdCBzaG91bGQgYmUgaW4gcGxhY2UgYmVmb3JlIGBuZ2JSdW5UcmFuc2l0aW9uYCBkb2VzIGByZWZsb3coKWBcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9hY3RpdmVQYW5lLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdFx0XHRcdFx0XHRcdFx0bmdiUnVuVHJhbnNpdGlvbihcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX25nWm9uZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2FjdGl2ZVBhbmUubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0XHRcdFx0XHRcdG5nYk5hdkZhZGVJblRyYW5zaXRpb24sXG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRcdCkuc3Vic2NyaWJlKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChuZXh0SXRlbSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRuZXh0SXRlbS5zaG93bi5lbWl0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMubmF2LnNob3duLmVtaXQobmV4dEl0ZW0uaWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUl0ZW0pIHtcblx0XHRcdFx0XHRcdFx0XHRhY3RpdmVJdGVtLmhpZGRlbi5lbWl0KCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5uYXYuaGlkZGVuLmVtaXQoYWN0aXZlSXRlbS5pZCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVBY3RpdmVQYW5lKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfdXBkYXRlQWN0aXZlUGFuZSgpIHtcblx0XHR0aGlzLl9hY3RpdmVQYW5lID0gdGhpcy5fZ2V0QWN0aXZlUGFuZSgpO1xuXHRcdHRoaXMuX2FjdGl2ZVBhbmU/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXHRcdHRoaXMuX2FjdGl2ZVBhbmU/Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdH1cblxuXHRwcml2YXRlIF9nZXRQYW5lRm9ySXRlbShpdGVtOiBOZ2JOYXZJdGVtIHwgbnVsbCkge1xuXHRcdHJldHVybiAodGhpcy5fcGFuZXMgJiYgdGhpcy5fcGFuZXMuZmluZCgocGFuZSkgPT4gcGFuZS5pdGVtID09PSBpdGVtKSkgfHwgbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgX2dldEFjdGl2ZVBhbmUoKTogTmdiTmF2UGFuZSB8IG51bGwge1xuXHRcdHJldHVybiAodGhpcy5fcGFuZXMgJiYgdGhpcy5fcGFuZXMuZmluZCgocGFuZSkgPT4gcGFuZS5pdGVtLmFjdGl2ZSkpIHx8IG51bGw7XG5cdH1cbn1cbiJdfQ==