@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
196 lines • 24.2 kB
JavaScript
/**
* Copyright (c) 2025 Visa, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { ContentChild, Directive, EventEmitter, HostBinding, Input, Output } from '@angular/core';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { ButtonStackedDirective } from '../button-stacked/button-stacked.directive';
import { ButtonColor, ButtonSize } from '../button/button.constants';
import { ButtonDirective } from '../button/button.directive';
import { FloatingUITriggerDirective } from '../floating-ui-trigger/floating-ui-trigger.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/app-stable-check.service";
export class TabItemDirective {
/**
* Provides custom class(es) for custom styling.
* @default .v-tab
*/
get class() {
return [this._class, 'v-tab'].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
const internalClass = [this.class, 'v-tab', this.sectionTitle ? 'v-tab-section-title' : ''].join(' ');
return internalClass;
}
/**
* Sets role of tab item. <br />
* If no custom role is set, role may be set by a parent component (nav, tabs, etc.).
* @builtin true
*/
get role() {
return this._role;
}
set role(value) {
this._role = value;
this._roleSetByUser = true;
}
get hostRole() {
return this.role;
}
/**
* Marks tab as active when true. <br />
* Not to be used with navigational tabs. To set a navigational tab as active, view [Angular's tutorial on identifying the active route](https://angular.dev/guide/routing/router-tutorial#identify-the-active-route).
* @default false
*/
get active() {
return this._active;
}
set active(value) {
this._active = coerceBooleanProperty(value);
if (this.active)
this.tabActive.emit(true);
if (this.button && !this.disclosureTab && !this.trigger && !this.button._isInNavOrNested) {
if (this._nestedTab) {
this.button.ariaCurrent = this._active ? 'page' : null;
}
else {
this.button.ariaSelected = this._active;
}
}
}
/**
* Marks the tab as a disclosure item when true. <br />
* This item cannot be active and should expand and collapse when pressed.
* @default false
*/
get disclosureTab() {
return this._disclosureTab;
}
set disclosureTab(value) {
this._disclosureTab = coerceBooleanProperty(value);
}
/**
* Marks the tab as a section title when true. <br />
* This item titles a subset of tabs and is not interactive.
* @default false
*/
get sectionTitle() {
return this._sectionTitle;
}
set sectionTitle(value) {
this._sectionTitle = coerceBooleanProperty(value);
}
constructor(appReady) {
this.appReady = appReady;
this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user
this._roleSetByTab = false; // prevents parent component from overriding if role is only set by TabItemDirective (allowing nav to override)
this._sizeSetByTab = false; // prevents parent component from overriding if size is only set by TabItemDirective (allowing nav to override)
this._nestedTab = false; // aria is different when nested tabs are present
this._class = '';
this._active = false;
this._disclosureTab = false;
this._sectionTitle = false;
/**
* Emits true when this tab is set to active.
*/
this.tabActive = new EventEmitter();
/**
* Emits true when this tab's child button is clicked.
*/
this.clicked = new EventEmitter();
}
ngAfterContentInit() {
if (this.button) {
if (!this._roleSetByUser) {
this.role = this.trigger || this.disclosureTab ? null : 'none';
this._roleSetByTab = true;
}
this.button.buttonColor = this.button._buttonColorSetByUser ? this.button.buttonColor : ButtonColor.TERTIARY;
if (this.appReady.isBrowserAndDomAvailable()) {
if (this.stackedButton && this.stackedButton.el.nativeElement === this.button.el.nativeElement)
return;
if (!this.button._buttonSizeSetByUser) {
this.button.buttonSize = ButtonSize.LARGE;
this._sizeSetByTab = true;
}
}
if (this.button.toggleIconComponent) {
this.button.toggleIconComponent.class = [this.button.toggleIconComponent.class, 'v-tab-suffix'].join(' ');
if (this.button.toggleIconComponent.defaultTemplate)
this.button.toggleIconComponent.defaultTemplate.class = [
this.button.toggleIconComponent.defaultTemplate.class,
'v-tab-suffix'
].join(' ');
if (this.button.toggleIconComponent.rotatedTemplate)
this.button.toggleIconComponent.rotatedTemplate.class = [
this.button.toggleIconComponent.rotatedTemplate.class,
'v-tab-suffix'
].join(' ');
}
else if (this.button.icons.length > 0) {
this.button.icons.last.class = [this.button.icons.last.class, 'v-tab-suffix'].join(' ');
}
this.button.clicked.subscribe(() => {
if (this.button._isInNavOrNested || this.disclosureTab || this.button.toggleIcon || this.trigger)
return;
this.clicked.emit(true);
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabItemDirective, deps: [{ token: i1.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TabItemDirective, isStandalone: true, selector: "[v-tab-item]", inputs: { class: "class", role: "role", active: "active", disclosureTab: "disclosureTab", sectionTitle: "sectionTitle" }, outputs: { tabActive: "tabActive", clicked: "clicked" }, host: { properties: { "class": "this.hostClass", "attr.role": "this.hostRole" } }, queries: [{ propertyName: "button", first: true, predicate: ButtonDirective, descendants: true }, { propertyName: "stackedButton", first: true, predicate: ButtonStackedDirective, descendants: true }, { propertyName: "trigger", first: true, predicate: FloatingUITriggerDirective, descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabItemDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
// tslint:disable-next-line:directive-selector
selector: '[v-tab-item]'
}]
}], ctorParameters: () => [{ type: i1.AppReadyService }], propDecorators: { button: [{
type: ContentChild,
args: [ButtonDirective]
}], stackedButton: [{
type: ContentChild,
args: [ButtonStackedDirective]
}], trigger: [{
type: ContentChild,
args: [FloatingUITriggerDirective]
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], active: [{
type: Input
}], disclosureTab: [{
type: Input
}], sectionTitle: [{
type: Input
}], tabActive: [{
type: Output
}], clicked: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3RhYi1pdGVtL3RhYi1pdGVtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFvQixZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7OztBQU9sRyxNQUFNLE9BQU8sZ0JBQWdCO0lBUzNCOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFD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QUFjO2lCQUN6QjtvRkFFZ0MsTUFBTTtzQkFBcEMsWUFBWTt1QkFBQyxlQUFlO2dCQUNTLGFBQWE7c0JBQWxELFlBQVk7dUJBQUMsc0JBQXNCO2dCQUNNLE9BQU87c0JBQWhELFlBQVk7dUJBQUMsMEJBQTBCO2dCQVdwQyxLQUFLO3NCQURSLEtBQUs7Z0JBU0YsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU87Z0JBWWhCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFXcEIsTUFBTTtzQkFEVCxLQUFLO2dCQXVCRixhQUFhO3NCQURoQixLQUFLO2dCQWVGLFlBQVk7c0JBRGYsS0FBSztnQkFZSSxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29udGVudENoaWxkLCBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IEJ1dHRvblN0YWNrZWREaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24tc3RhY2tlZC9idXR0b24tc3RhY2tlZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29sb3IsIEJ1dHRvblNpemUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGbG9hdGluZ1VJVHJpZ2dlckRpcmVjdGl2ZSB9IGZyb20gJy4uL2Zsb2F0aW5nLXVpLXRyaWdnZXIvZmxvYXRpbmctdWktdHJpZ2dlci5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t2LXRhYi1pdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgVGFiSXRlbURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkKEJ1dHRvbkRpcmVjdGl2ZSkgYnV0dG9uOiBCdXR0b25EaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoQnV0dG9uU3RhY2tlZERpcmVjdGl2ZSkgc3RhY2tlZEJ1dHRvbjogQnV0dG9uU3RhY2tlZERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChGbG9hdGluZ1VJVHJpZ2dlckRpcmVjdGl2ZSkgdHJpZ2dlcjogRmxvYXRpbmdVSVRyaWdnZXJEaXJlY3RpdmU7XG4gIF9yb2xlU2V0QnlVc2VyOiBib29sZWFuID0gZmFsc2U7IC8vIHByZXZlbnRzIHBhcmVudCBjb21wb25lbnQgZnJvbSBvdmVycmlkaW5nIGlmIHJvbGUgaWYgcm9sZSBpcyBnaXZlbiBkaXJlY3RseSBieSB1c2VyXG4gIF9yb2xlU2V0QnlUYWI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgcm9sZSBpcyBvbmx5IHNldCBieSBUYWJJdGVtRGlyZWN0aXZlIChhbGxvd2luZyBuYXYgdG8gb3ZlcnJpZGUpXG4gIF9zaXplU2V0QnlUYWI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgc2l6ZSBpcyBvbmx5IHNldCBieSBUYWJJdGVtRGlyZWN0aXZlIChhbGxvd2luZyBuYXYgdG8gb3ZlcnJpZGUpXG4gIF9uZXN0ZWRUYWI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gYXJpYSBpcyBkaWZmZXJlbnQgd2hlbiBuZXN0ZWQgdGFicyBhcmUgcHJlc2VudFxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi10YWJcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbdGhpcy5fY2xhc3MsICd2LXRhYiddLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnRlcm5hbENsYXNzID0gW3RoaXMuY2xhc3MsICd2LXRhYicsIHRoaXMuc2VjdGlvblRpdGxlID8gJ3YtdGFiLXNlY3Rpb24tdGl0bGUnIDogJyddLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gaW50ZXJuYWxDbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHJvbGUgb2YgdGFiIGl0ZW0uIDxiciAvPlxuICAgKiBJZiBubyBjdXN0b20gcm9sZSBpcyBzZXQsIHJvbGUgbWF5IGJlIHNldCBieSBhIHBhcmVudCBjb21wb25lbnQgKG5hdiwgdGFicywgZXRjLikuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByb2xlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb2xlO1xuICB9XG4gIHNldCByb2xlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fcm9sZSA9IHZhbHVlO1xuICAgIHRoaXMuX3JvbGVTZXRCeVVzZXIgPSB0cnVlO1xuICB9XG4gIF9yb2xlOiBzdHJpbmcgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRhYiBhcyBhY3RpdmUgd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogTm90IHRvIGJlIHVzZWQgd2l0aCBuYXZpZ2F0aW9uYWwgdGFicy4gVG8gc2V0IGEgbmF2aWdhdGlvbmFsIHRhYiBhcyBhY3RpdmUsIHZpZXcgW0FuZ3VsYXIncyB0dXRvcmlhbCBvbiBpZGVudGlmeWluZyB0aGUgYWN0aXZlIHJvdXRlXShodHRwczovL2FuZ3VsYXIuZGV2L2d1aWRlL3JvdXRpbmcvcm91dGVyLXR1dG9yaWFsI2lkZW50aWZ5LXRoZS1hY3RpdmUtcm91dGUpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHNldCBhY3RpdmUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuYWN0aXZlKSB0aGlzLnRhYkFjdGl2ZS5lbWl0KHRydWUpO1xuICAgIGlmICh0aGlzLmJ1dHRvbiAmJiAhdGhpcy5kaXNjbG9zdXJlVGFiICYmICF0aGlzLnRyaWdnZXIgJiYgIXRoaXMuYnV0dG9uLl9pc0luTmF2T3JOZXN0ZWQpIHtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRUYWIpIHtcbiAgICAgICAgdGhpcy5idXR0b24uYXJpYUN1cnJlbnQgPSB0aGlzLl9hY3RpdmUgPyAncGFnZScgOiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idXR0b24uYXJpYVNlbGVjdGVkID0gdGhpcy5fYWN0aXZlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcmtzIHRoZSB0YWIgYXMgYSBkaXNjbG9zdXJlIGl0ZW0gd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogVGhpcyBpdGVtIGNhbm5vdCBiZSBhY3RpdmUgYW5kIHNob3VsZCBleHBhbmQgYW5kIGNvbGxhcHNlIHdoZW4gcHJlc3NlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNjbG9zdXJlVGFiKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNjbG9zdXJlVGFiO1xuICB9XG4gIHNldCBkaXNjbG9zdXJlVGFiKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNjbG9zdXJlVGFiID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfZGlzY2xvc3VyZVRhYjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgdGFiIGFzIGEgc2VjdGlvbiB0aXRsZSB3aGVuIHRydWUuIDxiciAvPlxuICAgKiBUaGlzIGl0ZW0gdGl0bGVzIGEgc3Vic2V0IG9mIHRhYnMgYW5kIGlzIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzZWN0aW9uVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25UaXRsZTtcbiAgfVxuICBzZXQgc2VjdGlvblRpdGxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zZWN0aW9uVGl0bGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9zZWN0aW9uVGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgdHJ1ZSB3aGVuIHRoaXMgdGFiIGlzIHNldCB0byBhY3RpdmUuXG4gICAqL1xuICBAT3V0cHV0KCkgdGFiQWN0aXZlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB0cnVlIHdoZW4gdGhpcyB0YWIncyBjaGlsZCBidXR0b24gaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBjbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwUmVhZHk6IEFwcFJlYWR5U2VydmljZSkge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnV0dG9uKSB7XG4gICAgICBpZiAoIXRoaXMuX3JvbGVTZXRCeVVzZXIpIHtcbiAgICAgICAgdGhpcy5yb2xlID0gdGhpcy50cmlnZ2VyIHx8IHRoaXMuZGlzY2xvc3VyZVRhYiA/IG51bGwgOiAnbm9uZSc7XG4gICAgICAgIHRoaXMuX3JvbGVTZXRCeVRhYiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnV0dG9uLmJ1dHRvbkNvbG9yID0gdGhpcy5idXR0b24uX2J1dHRvbkNvbG9yU2V0QnlVc2VyID8gdGhpcy5idXR0b24uYnV0dG9uQ29sb3IgOiBCdXR0b25Db2xvci5URVJUSUFSWTtcbiAgICAgIGlmICh0aGlzLmFwcFJlYWR5LmlzQnJvd3NlckFuZERvbUF2YWlsYWJsZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrZWRCdXR0b24gJiYgdGhpcy5zdGFja2VkQnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQgPT09IHRoaXMuYnV0dG9uLmVsLm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmJ1dHRvbi5fYnV0dG9uU2l6ZVNldEJ5VXNlcikge1xuICAgICAgICAgIHRoaXMuYnV0dG9uLmJ1dHRvblNpemUgPSBCdXR0b25TaXplLkxBUkdFO1xuICAgICAgICAgIHRoaXMuX3NpemVTZXRCeVRhYiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYnV0dG9uLnRvZ2dsZUljb25Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5jbGFzcyA9IFt0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50LmNsYXNzLCAndi10YWItc3VmZml4J10uam9pbignICcpO1xuICAgICAgICBpZiAodGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5kZWZhdWx0VGVtcGxhdGUpXG4gICAgICAgICAgdGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5kZWZhdWx0VGVtcGxhdGUuY2xhc3MgPSBbXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50LmRlZmF1bHRUZW1wbGF0ZS5jbGFzcyxcbiAgICAgICAgICAgICd2LXRhYi1zdWZmaXgnXG4gICAgICAgICAgXS5qb2luKCcgJyk7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50LnJvdGF0ZWRUZW1wbGF0ZSlcbiAgICAgICAgICB0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50LnJvdGF0ZWRUZW1wbGF0ZS5jbGFzcyA9IFtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uLnRvZ2dsZUljb25Db21wb25lbnQucm90YXRlZFRlbXBsYXRlLmNsYXNzLFxuICAgICAgICAgICAgJ3YtdGFiLXN1ZmZpeCdcbiAgICAgICAgICBdLmpvaW4oJyAnKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5idXR0b24uaWNvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmJ1dHRvbi5pY29ucy5sYXN0LmNsYXNzID0gW3RoaXMuYnV0dG9uLmljb25zLmxhc3QuY2xhc3MsICd2LXRhYi1zdWZmaXgnXS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnV0dG9uLmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uLl9pc0luTmF2T3JOZXN0ZWQgfHwgdGhpcy5kaXNjbG9zdXJlVGFiIHx8IHRoaXMuYnV0dG9uLnRvZ2dsZUljb24gfHwgdGhpcy50cmlnZ2VyKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=