@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
398 lines • 39.3 kB
JavaScript
/**
* © 2025 Visa
*
* 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, coerceNumberProperty } from '@angular/cdk/coercion';
import { ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, Output, QueryList } from '@angular/core';
import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive';
import { BadgeDirective } from '../badge/badge.directive';
import { IconToggleComponent } from '../icon-toggle/icon-toggle.component';
import { IconToggleDirective } from '../icon-toggle/icon-toggle.directive';
import { IconComponent } from '../icon/icon.component';
import { ButtonColor, ButtonSize } from './button.constants';
import * as i0 from "@angular/core";
export class ButtonDirective extends BaseInteractiveDirective {
get hostId() {
return this.id;
}
get hostType() {
return this.type;
}
/**
* Provides custom class(es) for custom styling.
* @default .v-button.v-button-<buttonColor>.v-button-<buttonSize>
*/
get class() {
return [
this._class,
'v-button',
this.buttonColor !== ButtonColor.PRIMARY ? 'v-button-' + this.buttonColor : '',
this.buttonSize !== ButtonSize.MEDIUM ? 'v-button-' + this.buttonSize : '',
this.subtle ? 'v-button-subtle' : '',
this.destructive ? 'v-button-destructive' : ''
].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
/**
* Sets button size.
* @default 'medium' / ButtonSize.MEDIUM
* @options 'small' | ButtonSize.SMALL | <br> 'medium' | ButtonSize.MEDIUM | <br> 'large' | ButtonSize.LARGE
*/
get buttonSize() {
return this._buttonSize;
}
set buttonSize(value) {
this._buttonSize = value;
this._buttonSizeSetByUser = true;
}
/**
* Sets button color scheme.
* @default 'primary' / ButtonColor.PRIMARY
* @options 'primary' | ButtonSize.PRIMARY | <br> 'secondary' | ButtonSize.SECONDARY | <br> 'tertiary' | ButtonSize.TERTIARY
*/
get buttonColor() {
return this._buttonColor;
}
set buttonColor(value) {
this._buttonColor = value;
this._buttonColorSetByUser = true;
}
/**
* Sets button to subtle variant when true.
* @default false
*/
get subtle() {
return this._subtle;
}
set subtle(value) {
this._subtle = coerceBooleanProperty(value);
}
/**
* Sets button to destructive variant when true.
* @default false
*/
get destructive() {
return this._destructive;
}
set destructive(value) {
this._destructive = coerceBooleanProperty(value);
}
/**
* Disables button when true.
* @default false
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = coerceBooleanProperty(value);
this.disabledChange.emit(this.disabled);
}
/**
* Aria attribute pointing to id of descriptive element. <br />
* If the button has a badge, the <code>aria-describedby</code> will be set to the badge's id by default.
* @default false
*/
get ariaDescribedby() {
return this._ariaDescribedby;
}
set ariaDescribedby(value) {
this._ariaDescribedby = value;
}
get hostAriaDescribedby() {
if (this.ariaDescribedby !== null) {
return this.ariaDescribedby;
}
}
constructor(el) {
super(el);
this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user
this._buttonColorSetByUser = false; // prevents parent component from overriding if buttonColor if buttonColor is given directly by user
this._buttonSizeSetByUser = false; // prevents parent component from overriding if buttonSize if buttonSize is given directly by user
/**
* Sets custom type.
* @default 'button'
*/
this.type = 'button';
this._class = '';
this._buttonSize = ButtonSize.MEDIUM;
this._buttonColor = ButtonColor.PRIMARY;
this._subtle = false;
this._destructive = false;
this._disabled = false;
/**
* Emits a boolean value indicating the new disabled state when the disabled state changes.
*/
this.disabledChange = new EventEmitter();
this._ariaDescribedby = null;
this._roleSetByTab = false;
this._isInNavOrNested = false;
this._ariaSelected = null;
this._ariaCurrent = null;
this._ariaExpanded = null;
this._ariaDisabled = false;
this._ariaControls = null;
/** Below needed for combobox */
this._inCombobox = false;
} // used in accordion service
ngAfterContentInit() {
if (this.badge) {
this.ariaDescribedby = this.badge.id;
}
}
/**
* Sets role of button. <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() {
if (this.role || this.role === null)
return this.role;
}
/**
* Aria attribute relaying whether button is selected. <br />
* <code>aria-current</code> and <code>aria-selected</code> should not be used together.
* @default null
* @builtin true
*/
get ariaSelected() {
return this._ariaSelected;
}
set ariaSelected(value) {
this._ariaSelected = coerceBooleanProperty(value);
}
get hostAriaSelected() {
if (this.ariaSelected !== null && !this._isInNavOrNested) {
return this.ariaSelected.toString();
}
}
/**
* Aria attribute relaying whether button is selected. <br />
* <code>aria-current</code> and <code>aria-selected</code> should not be used together.
* @default null
* @builtin true
*/
get ariaCurrent() {
return this._ariaCurrent;
}
set ariaCurrent(value) {
if (value === 'page') {
this._ariaCurrent = value;
}
else
this._ariaCurrent = coerceBooleanProperty(value);
}
get hostAriaCurrent() {
if (this.ariaCurrent !== null) {
return this.ariaCurrent.toString();
}
}
/**
* Aria attribute relaying whether button is expanded.
* @default null
* @builtin true
*/
get ariaExpanded() {
return this._ariaExpanded;
}
set ariaExpanded(value) {
this._ariaExpanded = coerceBooleanProperty(value);
}
get hostAriaExpanded() {
if (this.ariaExpanded !== null) {
return this.ariaExpanded.toString();
}
}
/**
* Sets aria disabled state for accessibility purposes. <br />
* When true, indicates that the button is disabled and not interactive.
* @default false
*/
get ariaDisabled() {
return this._ariaDisabled;
}
set ariaDisabled(value) {
this._ariaDisabled = coerceBooleanProperty(value);
}
/**
* Aria attribute relaying what element the button controls.
* @default null
* @default '<accordion-panel-id>' when button is used within Accordion.
* @default '<panel-content-id>' when button is used within Panel.
* @builtin true
*/
get ariaControls() {
return this._ariaControls;
}
set ariaControls(value) {
this._ariaControls = value;
}
get hostAriaControls() {
if (this.ariaControls !== null) {
return this.ariaControls;
}
}
/**
* Sets button to combobox toggle button when true.
* @default false
* @default true when button is used within combobox and no custom value is given.
* @builtin true
*/
get ariaHaspopup() {
return this._ariaHaspopup;
}
set ariaHaspopup(value) {
this._ariaHaspopup = coerceBooleanProperty(value);
}
get hostAriaHaspopup() {
if (!this.ariaHaspopup && this._inCombobox) {
return 'true';
}
else if (this.ariaHaspopup) {
return this.ariaHaspopup.toString();
}
}
/**
* Sets button's tabIndex.
* @default null
* @default -1 when button is used within combobox and no custom value is given.
* @builtin true
*/
get tabindex() {
return this._tabindex;
}
set tabindex(value) {
this._tabindex = coerceNumberProperty(value);
}
get hostTabindex() {
if (!this.tabindex && (this._inCombobox || this.ariaDisabled)) {
return '-1';
}
else if (this.tabindex) {
return this.tabindex.toString();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ButtonDirective, isStandalone: true, selector: "[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]", inputs: { id: "id", type: "type", class: "class", buttonSize: "buttonSize", buttonColor: "buttonColor", subtle: "subtle", destructive: "destructive", disabled: "disabled", ariaDescribedby: ["aria-describedby", "ariaDescribedby"], role: "role", ariaSelected: ["aria-selected", "ariaSelected"], ariaCurrent: ["aria-current", "ariaCurrent"], ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaDisabled: ["aria-disabled", "ariaDisabled"], ariaControls: ["aria-controls", "ariaControls"], ariaHaspopup: ["aria-haspopup", "ariaHaspopup"], tabindex: "tabindex" }, outputs: { disabledChange: "disabledChange" }, host: { properties: { "attr.id": "this.hostId", "attr.type": "this.hostType", "class": "this.hostClass", "attr.aria-describedby": "this.hostAriaDescribedby", "attr.role": "this.hostRole", "attr.aria-selected": "this.hostAriaSelected", "attr.aria-current": "this.hostAriaCurrent", "attr.aria-expanded": "this.hostAriaExpanded", "attr.aria-controls": "this.hostAriaControls", "attr.aria-haspopup": "this.hostAriaHaspopup", "attr.tabindex": "this.hostTabindex" } }, queries: [{ propertyName: "badge", first: true, predicate: BadgeDirective, descendants: true }, { propertyName: "toggleIcon", first: true, predicate: IconToggleDirective, descendants: true }, { propertyName: "toggleIconComponent", first: true, predicate: IconToggleComponent, descendants: true }, { propertyName: "icons", predicate: IconComponent }], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
// tslint:disable-next-line:directive-selector
selector: '[v-button], [v-button-icon], [v-button-stacked], [v-panel-toggle]'
}]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { badge: [{
type: ContentChild,
args: [BadgeDirective]
}], id: [{
type: Input
}], hostId: [{
type: HostBinding,
args: ['attr.id']
}], type: [{
type: Input
}], hostType: [{
type: HostBinding,
args: ['attr.type']
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], buttonSize: [{
type: Input
}], buttonColor: [{
type: Input
}], subtle: [{
type: Input
}], destructive: [{
type: Input
}], disabled: [{
type: Input
}], disabledChange: [{
type: Output
}], ariaDescribedby: [{
type: Input,
args: ['aria-describedby']
}], hostAriaDescribedby: [{
type: HostBinding,
args: ['attr.aria-describedby']
}], icons: [{
type: ContentChildren,
args: [IconComponent]
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], ariaSelected: [{
type: Input,
args: ['aria-selected']
}], hostAriaSelected: [{
type: HostBinding,
args: ['attr.aria-selected']
}], ariaCurrent: [{
type: Input,
args: ['aria-current']
}], hostAriaCurrent: [{
type: HostBinding,
args: ['attr.aria-current']
}], ariaExpanded: [{
type: Input,
args: ['aria-expanded']
}], hostAriaExpanded: [{
type: HostBinding,
args: ['attr.aria-expanded']
}], ariaDisabled: [{
type: Input,
args: ['aria-disabled']
}], toggleIcon: [{
type: ContentChild,
args: [IconToggleDirective]
}], toggleIconComponent: [{
type: ContentChild,
args: [IconToggleComponent]
}], ariaControls: [{
type: Input,
args: ['aria-controls']
}], hostAriaControls: [{
type: HostBinding,
args: ['attr.aria-controls']
}], ariaHaspopup: [{
type: Input,
args: ['aria-haspopup']
}], hostAriaHaspopup: [{
type: HostBinding,
args: ['attr.aria-haspopup']
}], tabindex: [{
type: Input
}], hostTabindex: [{
type: HostBinding,
args: ['attr.tabindex']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQTZCLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0csT0FBTyxFQUVMLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFPN0QsTUFBTSxPQUFPLGVBQWdCLFNBQVEsd0JBQXdCO0lBVzNELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBUUQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxVQUFVO1lBQ1YsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUMsT0FBTyxDQUFDLENB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S0FBSztnQkFhYSxjQUFjO3NCQUFoQyxNQUFNO2dCQVFILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVyQixtQkFBbUI7c0JBRHRCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQWtCSixLQUFLO3NCQUFwQyxlQUFlO3VCQUFDLGFBQWE7Z0JBUzFCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFZcEIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBVWxCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYzdCLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxjQUFjO2dCQVlqQixlQUFlO3NCQURsQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFhNUIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVhLFVBQVU7c0JBQTVDLFlBQVk7dUJBQUMsbUJBQW1CO2dCQUNFLG1CQUFtQjtzQkFBckQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBVTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVsQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQWlCN0IsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBZ0I3QixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsWUFBWTtzQkFEZixXQUFXO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnVtYmVySW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9hbmd1bGFyLXNwZWNpZmljLWRpcmVjdGl2ZXMvYmFzZS1pbnRlcmFjdGl2ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQmFkZ2VEaXJlY3RpdmUgfSBmcm9tICcuLi9iYWRnZS9iYWRnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWNvblRvZ2dsZUNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24tdG9nZ2xlL2ljb24tdG9nZ2xlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbG9yLCBCdXR0b25TaXplIH0gZnJvbSAnLi9idXR0b24uY29uc3RhbnRzJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbdi1idXR0b25dLCBbdi1idXR0b24taWNvbl0sIFt2LWJ1dHRvbi1zdGFja2VkXSwgW3YtcGFuZWwtdG9nZ2xlXSdcbn0pXG5leHBvcnQgY2xhc3MgQnV0dG9uRGlyZWN0aXZlIGV4dGVuZHMgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGQoQmFkZ2VEaXJlY3RpdmUpIGJhZGdlOiBCYWRnZURpcmVjdGl2ZTtcbiAgX3JvbGVTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgcm9sZSBpZiByb2xlIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcbiAgX2J1dHRvbkNvbG9yU2V0QnlVc2VyID0gZmFsc2U7IC8vIHByZXZlbnRzIHBhcmVudCBjb21wb25lbnQgZnJvbSBvdmVycmlkaW5nIGlmIGJ1dHRvbkNvbG9yIGlmIGJ1dHRvbkNvbG9yIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcbiAgX2J1dHRvblNpemVTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgYnV0dG9uU2l6ZSBpZiBidXR0b25TaXplIGlzIGdpdmVuIGRpcmVjdGx5IGJ5IHVzZXJcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gaWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBpZDogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICBnZXQgaG9zdElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gdHlwZS5cbiAgICogQGRlZmF1bHQgJ2J1dHRvbidcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IHN0cmluZyA9ICdidXR0b24nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudHlwZScpXG4gIGdldCBob3N0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtYnV0dG9uLnYtYnV0dG9uLSZsdDtidXR0b25Db2xvciZndDsudi1idXR0b24tJmx0O2J1dHRvblNpemUmZ3Q7XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fY2xhc3MsXG4gICAgICAndi1idXR0b24nLFxuICAgICAgdGhpcy5idXR0b25Db2xvciAhPT0gQnV0dG9uQ29sb3IuUFJJTUFSWSA/ICd2LWJ1dHRvbi0nICsgdGhpcy5idXR0b25Db2xvciA6ICcnLFxuICAgICAgdGhpcy5idXR0b25TaXplICE9PSBCdXR0b25TaXplLk1FRElVTSA/ICd2LWJ1dHRvbi0nICsgdGhpcy5idXR0b25TaXplIDogJycsXG4gICAgICB0aGlzLnN1YnRsZSA/ICd2LWJ1dHRvbi1zdWJ0bGUnIDogJycsXG4gICAgICB0aGlzLmRlc3RydWN0aXZlID8gJ3YtYnV0dG9uLWRlc3RydWN0aXZlJyA6ICcnXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBidXR0b24gc2l6ZS5cbiAgICogQGRlZmF1bHQgJ21lZGl1bScgLyBCdXR0b25TaXplLk1FRElVTVxuICAgKiBAb3B0aW9ucyAnc21hbGwnIHwgQnV0dG9uU2l6ZS5TTUFMTCB8IDxicj4gJ21lZGl1bScgfCBCdXR0b25TaXplLk1FRElVTSB8IDxicj4gJ2xhcmdlJyB8IEJ1dHRvblNpemUuTEFSR0VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBidXR0b25TaXplKCk6IEJ1dHRvblNpemUge1xuICAgIHJldHVybiB0aGlzLl9idXR0b25TaXplO1xuICB9XG4gIHNldCBidXR0b25TaXplKHZhbHVlOiBCdXR0b25TaXplKSB7XG4gICAgdGhpcy5fYnV0dG9uU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMuX2J1dHRvblNpemVTZXRCeVVzZXIgPSB0cnVlO1xuICB9XG4gIF9idXR0b25TaXplOiBCdXR0b25TaXplID0gQnV0dG9uU2l6ZS5NRURJVU07XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIGNvbG9yIHNjaGVtZS5cbiAgICogQGRlZmF1bHQgJ3ByaW1hcnknIC8gQnV0dG9uQ29sb3IuUFJJTUFSWVxuICAgKiBAb3B0aW9ucyAncHJpbWFyeScgfCBCdXR0b25TaXplLlBSSU1BUlkgfCA8YnI+ICdzZWNvbmRhcnknIHwgQnV0dG9uU2l6ZS5TRUNPTkRBUlkgfCA8YnI+ICd0ZXJ0aWFyeScgfCBCdXR0b25TaXplLlRFUlRJQVJZXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgYnV0dG9uQ29sb3IoKTogQnV0dG9uQ29sb3Ige1xuICAgIHJldHVybiB0aGlzLl9idXR0b25Db2xvcjtcbiAgfVxuICBzZXQgYnV0dG9uQ29sb3IodmFsdWU6IEJ1dHRvbkNvbG9yKSB7XG4gICAgdGhpcy5fYnV0dG9uQ29sb3IgPSB2YWx1ZTtcbiAgICB0aGlzLl9idXR0b25Db2xvclNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX2J1dHRvbkNvbG9yOiBCdXR0b25Db2xvciA9IEJ1dHRvbkNvbG9yLlBSSU1BUlk7XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIHRvIHN1YnRsZSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdWJ0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRsZTtcbiAgfVxuICBzZXQgc3VidGxlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9zdWJ0bGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9zdWJ0bGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gdG8gZGVzdHJ1Y3RpdmUgdmFyaWFudCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGVzdHJ1Y3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3RydWN0aXZlO1xuICB9XG4gIHNldCBkZXN0cnVjdGl2ZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGVzdHJ1Y3RpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9kZXN0cnVjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBidXR0b24gd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmVtaXQodGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBuZXcgZGlzYWJsZWQgc3RhdGUgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBkaXNhYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcG9pbnRpbmcgdG8gaWQgb2YgZGVzY3JpcHRpdmUgZWxlbWVudC4gPGJyIC8+XG4gICAqIElmIHRoZSBidXR0b24gaGFzIGEgYmFkZ2UsIHRoZSA8Y29kZT5hcmlhLWRlc2NyaWJlZGJ5PC9jb2RlPiB3aWxsIGJlIHNldCB0byB0aGUgYmFkZ2UncyBpZCBieSBkZWZhdWx0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWRlc2NyaWJlZGJ5JylcbiAgZ2V0IGFyaWFEZXNjcmliZWRieSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYURlc2NyaWJlZGJ5O1xuICB9XG4gIHNldCBhcmlhRGVzY3JpYmVkYnkodmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhRGVzY3JpYmVkYnkgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYURlc2NyaWJlZGJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRieScpXG4gIGdldCBob3N0QXJpYURlc2NyaWJlZGJ5KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFEZXNjcmliZWRieSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYURlc2NyaWJlZGJ5O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWwpO1xuICB9IC8vIHVzZWQgaW4gYWNjb3JkaW9uIHNlcnZpY2VcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmFkZ2UpIHtcbiAgICAgIHRoaXMuYXJpYURlc2NyaWJlZGJ5ID0gdGhpcy5iYWRnZS5pZDtcbiAgICB9XG4gIH1cblxuICAvKiogQmVsb3cgaXRlbXMgbmVlZGVkIGZvciB0YWIgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihJY29uQ29tcG9uZW50KSBpY29uczogUXVlcnlMaXN0PEljb25Db21wb25lbnQ+O1xuICBfcm9sZVNldEJ5VGFiOiBib29sZWFuID0gZmFsc2U7XG4gIF9pc0luTmF2T3JOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHMgcm9sZSBvZiBidXR0b24uIDxiciAvPlxuICAgKiBJZiBubyBjdXN0b20gcm9sZSBpcyBzZXQsIHJvbGUgbWF5IGJlIHNldCBieSBhIHBhcmVudCBjb21wb25lbnQgKG5hdiwgdGFicywgZXRjLikuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByb2xlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb2xlO1xuICB9XG4gIHNldCByb2xlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fcm9sZSA9IHZhbHVlO1xuICAgIHRoaXMuX3JvbGVTZXRCeVVzZXIgPSB0cnVlO1xuICB9XG4gIF9yb2xlOiBzdHJpbmcgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcgfCB2b2lkIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucm9sZSB8fCB0aGlzLnJvbGUgPT09IG51bGwpIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgc2VsZWN0ZWQuIDxiciAvPlxuICAgKiA8Y29kZT5hcmlhLWN1cnJlbnQ8L2NvZGU+IGFuZCA8Y29kZT5hcmlhLXNlbGVjdGVkPC9jb2RlPiBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGFyaWFTZWxlY3RlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFTZWxlY3RlZDtcbiAgfVxuICBzZXQgYXJpYVNlbGVjdGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhU2VsZWN0ZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhU2VsZWN0ZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1zZWxlY3RlZCcpXG4gIGdldCBob3N0QXJpYVNlbGVjdGVkKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFTZWxlY3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5faXNJbk5hdk9yTmVzdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhU2VsZWN0ZWQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgc2VsZWN0ZWQuIDxiciAvPlxuICAgKiA8Y29kZT5hcmlhLWN1cnJlbnQ8L2NvZGU+IGFuZCA8Y29kZT5hcmlhLXNlbGVjdGVkPC9jb2RlPiBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWN1cnJlbnQnKVxuICBnZXQgYXJpYUN1cnJlbnQoKTogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQ3VycmVudDtcbiAgfVxuICBzZXQgYXJpYUN1cnJlbnQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3BhZ2UnKSB7XG4gICAgICB0aGlzLl9hcmlhQ3VycmVudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB0aGlzLl9hcmlhQ3VycmVudCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFDdXJyZW50OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY3VycmVudCcpXG4gIGdldCBob3N0QXJpYUN1cnJlbnQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFDdXJyZW50LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoZXRoZXIgYnV0dG9uIGlzIGV4cGFuZGVkLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1leHBhbmRlZCcpXG4gIGdldCBhcmlhRXhwYW5kZWQoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRXhwYW5kZWQ7XG4gIH1cbiAgc2V0IGFyaWFFeHBhbmRlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYUV4cGFuZGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUV4cGFuZGVkOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgZ2V0IGhvc3RBcmlhRXhwYW5kZWQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUV4cGFuZGVkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhRXhwYW5kZWQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhcmlhIGRpc2FibGVkIHN0YXRlIGZvciBhY2Nlc3NpYmlsaXR5IHB1cnBvc2VzLiA8YnIgLz5cbiAgICogV2hlbiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBub3QgaW50ZXJhY3RpdmUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZGlzYWJsZWQnKVxuICBnZXQgYXJpYURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGFyaWFEaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYURpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEJlbG93IG5lZWRlZCBmb3IgQWNjb3JkaW9uICovXG4gIEBDb250ZW50Q2hpbGQoSWNvblRvZ2dsZURpcmVjdGl2ZSkgdG9nZ2xlSWNvbjogSWNvblRvZ2dsZURpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChJY29uVG9nZ2xlQ29tcG9uZW50KSB0b2dnbGVJY29uQ29tcG9uZW50OiBJY29uVG9nZ2xlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGF0IGVsZW1lbnQgdGhlIGJ1dHRvbiBjb250cm9scy5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2FjY29yZGlvbi1wYW5lbC1pZCZndDsnIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIEFjY29yZGlvbi5cbiAgICogQGRlZmF1bHQgJyZsdDtwYW5lbC1jb250ZW50LWlkJmd0Oycgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gUGFuZWwuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1jb250cm9scycpXG4gIGdldCBhcmlhQ29udHJvbHMoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFDb250cm9scztcbiAgfVxuICBzZXQgYXJpYUNvbnRyb2xzKHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYUNvbnRyb2xzID0gdmFsdWU7XG4gIH1cbiAgX2FyaWFDb250cm9sczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtY29udHJvbHMnKVxuICBnZXQgaG9zdEFyaWFDb250cm9scygpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQ29udHJvbHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFDb250cm9scztcbiAgICB9XG4gIH1cblxuICAvKiogQmVsb3cgbmVlZGVkIGZvciBjb21ib2JveCAqL1xuICBfaW5Db21ib2JveCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiB0byBjb21ib2JveCB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlZmF1bHQgdHJ1ZSB3aGVuIGJ1dHRvbiBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtaGFzcG9wdXAnKVxuICBnZXQgYXJpYUhhc3BvcHVwKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUhhc3BvcHVwO1xuICB9XG4gIHNldCBhcmlhSGFzcG9wdXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFIYXNwb3B1cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFIYXNwb3B1cDogYm9vbGVhbiB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJylcbiAgZ2V0IGhvc3RBcmlhSGFzcG9wdXAoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFyaWFIYXNwb3B1cCAmJiB0aGlzLl9pbkNvbWJvYm94KSB7XG4gICAgICByZXR1cm4gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hcmlhSGFzcG9wdXApIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFIYXNwb3B1cC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbidzIHRhYkluZGV4LlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0IC0xIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgZ2l2ZW4uXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cbiAgc2V0IHRhYmluZGV4KHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgIHRoaXMuX3RhYmluZGV4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF90YWJpbmRleDogbnVtYmVyIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgZ2V0IGhvc3RUYWJpbmRleCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFiaW5kZXggJiYgKHRoaXMuX2luQ29tYm9ib3ggfHwgdGhpcy5hcmlhRGlzYWJsZWQpKSB7XG4gICAgICByZXR1cm4gJy0xJztcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFiaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmluZGV4LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG59XG4iXX0=