@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
398 lines • 39.3 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, 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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S0FBSztnQkFhYSxjQUFjO3NCQUFoQyxNQUFNO2dCQVFILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVyQixtQkFBbUI7c0JBRHRCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQWtCSixLQUFLO3NCQUFwQyxlQUFlO3VCQUFDLGFBQWE7Z0JBUzFCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFZcEIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBVWxCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYzdCLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyxjQUFjO2dCQVlqQixlQUFlO3NCQURsQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFhNUIsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVhLFVBQVU7c0JBQTVDLFlBQVk7dUJBQUMsbUJBQW1CO2dCQUNFLG1CQUFtQjtzQkFBckQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBVTdCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxlQUFlO2dCQVVsQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQWlCN0IsWUFBWTtzQkFEZixLQUFLO3VCQUFDLGVBQWU7Z0JBU2xCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBZ0I3QixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsWUFBWTtzQkFEZixXQUFXO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi9fdXRpbGl0aWVzL2FuZ3VsYXItc3BlY2lmaWMtZGlyZWN0aXZlcy9iYXNlLWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYWRnZURpcmVjdGl2ZSB9IGZyb20gJy4uL2JhZGdlL2JhZGdlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEljb25Ub2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9pY29uLXRvZ2dsZS9pY29uLXRvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29sb3IsIEJ1dHRvblNpemUgfSBmcm9tICcuL2J1dHRvbi5jb25zdGFudHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t2LWJ1dHRvbl0sIFt2LWJ1dHRvbi1pY29uXSwgW3YtYnV0dG9uLXN0YWNrZWRdLCBbdi1wYW5lbC10b2dnbGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25EaXJlY3RpdmUgZXh0ZW5kcyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChCYWRnZURpcmVjdGl2ZSkgYmFkZ2U6IEJhZGdlRGlyZWN0aXZlO1xuICBfcm9sZVNldEJ5VXNlciA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiByb2xlIGlmIHJvbGUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBfYnV0dG9uQ29sb3JTZXRCeVVzZXIgPSBmYWxzZTsgLy8gcHJldmVudHMgcGFyZW50IGNvbXBvbmVudCBmcm9tIG92ZXJyaWRpbmcgaWYgYnV0dG9uQ29sb3IgaWYgYnV0dG9uQ29sb3IgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBfYnV0dG9uU2l6ZVNldEJ5VXNlciA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiBidXR0b25TaXplIGlmIGJ1dHRvblNpemUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBpZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlkOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSB0eXBlLlxuICAgKiBAZGVmYXVsdCAnYnV0dG9uJ1xuICAgKi9cbiAgQElucHV0KClcbiAgdHlwZTogc3RyaW5nID0gJ2J1dHRvbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci50eXBlJylcbiAgZ2V0IGhvc3RUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1idXR0b24udi1idXR0b24tJmx0O2J1dHRvbkNvbG9yJmd0Oy52LWJ1dHRvbi0mbHQ7YnV0dG9uU2l6ZSZndDtcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9jbGFzcyxcbiAgICAgICd2LWJ1dHRvbicsXG4gICAgICB0aGlzLmJ1dHRvbkNvbG9yICE9PSBCdXR0b25Db2xvci5QUklNQVJZID8gJ3YtYnV0dG9uLScgKyB0aGlzLmJ1dHRvbkNvbG9yIDogJycsXG4gICAgICB0aGlzLmJ1dHRvblNpemUgIT09IEJ1dHRvblNpemUuTUVESVVNID8gJ3YtYnV0dG9uLScgKyB0aGlzLmJ1dHRvblNpemUgOiAnJyxcbiAgICAgIHRoaXMuc3VidGxlID8gJ3YtYnV0dG9uLXN1YnRsZScgOiAnJyxcbiAgICAgIHRoaXMuZGVzdHJ1Y3RpdmUgPyAndi1idXR0b24tZGVzdHJ1Y3RpdmUnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiBzaXplLlxuICAgKiBAZGVmYXVsdCAnbWVkaXVtJyAvIEJ1dHRvblNpemUuTUVESVVNXG4gICAqIEBvcHRpb25zICdzbWFsbCcgfCBCdXR0b25TaXplLlNNQUxMIHwgPGJyPiAnbWVkaXVtJyB8IEJ1dHRvblNpemUuTUVESVVNIHwgPGJyPiAnbGFyZ2UnIHwgQnV0dG9uU2l6ZS5MQVJHRVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGJ1dHRvblNpemUoKTogQnV0dG9uU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvblNpemU7XG4gIH1cbiAgc2V0IGJ1dHRvblNpemUodmFsdWU6IEJ1dHRvblNpemUpIHtcbiAgICB0aGlzLl9idXR0b25TaXplID0gdmFsdWU7XG4gICAgdGhpcy5fYnV0dG9uU2l6ZVNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX2J1dHRvblNpemU6IEJ1dHRvblNpemUgPSBCdXR0b25TaXplLk1FRElVTTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gY29sb3Igc2NoZW1lLlxuICAgKiBAZGVmYXVsdCAncHJpbWFyeScgLyBCdXR0b25Db2xvci5QUklNQVJZXG4gICAqIEBvcHRpb25zICdwcmltYXJ5JyB8IEJ1dHRvblNpemUuUFJJTUFSWSB8IDxicj4gJ3NlY29uZGFyeScgfCBCdXR0b25TaXplLlNFQ09OREFSWSB8IDxicj4gJ3RlcnRpYXJ5JyB8IEJ1dHRvblNpemUuVEVSVElBUllcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBidXR0b25Db2xvcigpOiBCdXR0b25Db2xvciB7XG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvbkNvbG9yO1xuICB9XG4gIHNldCBidXR0b25Db2xvcih2YWx1ZTogQnV0dG9uQ29sb3IpIHtcbiAgICB0aGlzLl9idXR0b25Db2xvciA9IHZhbHVlO1xuICAgIHRoaXMuX2J1dHRvbkNvbG9yU2V0QnlVc2VyID0gdHJ1ZTtcbiAgfVxuICBfYnV0dG9uQ29sb3I6IEJ1dHRvbkNvbG9yID0gQnV0dG9uQ29sb3IuUFJJTUFSWTtcblxuICAvKipcbiAgICogU2V0cyBidXR0b24gdG8gc3VidGxlIHZhcmlhbnQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHN1YnRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3VidGxlO1xuICB9XG4gIHNldCBzdWJ0bGUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3N1YnRsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3N1YnRsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGJ1dHRvbiB0byBkZXN0cnVjdGl2ZSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkZXN0cnVjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJ1Y3RpdmU7XG4gIH1cbiAgc2V0IGRlc3RydWN0aXZlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kZXN0cnVjdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2Rlc3RydWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIGJ1dHRvbiB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuZW1pdCh0aGlzLmRpc2FibGVkKTtcbiAgfVxuICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgdGhlIG5ldyBkaXNhYmxlZCBzdGF0ZSB3aGVuIHRoZSBkaXNhYmxlZCBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSBwb2ludGluZyB0byBpZCBvZiBkZXNjcmlwdGl2ZSBlbGVtZW50LiA8YnIgLz5cbiAgICogSWYgdGhlIGJ1dHRvbiBoYXMgYSBiYWRnZSwgdGhlIDxjb2RlPmFyaWEtZGVzY3JpYmVkYnk8L2NvZGU+IHdpbGwgYmUgc2V0IHRvIHRoZSBiYWRnZSdzIGlkIGJ5IGRlZmF1bHQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICBnZXQgYXJpYURlc2NyaWJlZGJ5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhRGVzY3JpYmVkYnk7XG4gIH1cbiAgc2V0IGFyaWFEZXNjcmliZWRieSh2YWx1ZSkge1xuICAgIHRoaXMuX2FyaWFEZXNjcmliZWRieSA9IHZhbHVlO1xuICB9XG4gIF9hcmlhRGVzY3JpYmVkYnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JylcbiAgZ2V0IGhvc3RBcmlhRGVzY3JpYmVkYnkoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYURlc2NyaWJlZGJ5ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhRGVzY3JpYmVkYnk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihlbCk7XG4gIH0gLy8gdXNlZCBpbiBhY2NvcmRpb24gc2VydmljZVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWRnZSkge1xuICAgICAgdGhpcy5hcmlhRGVzY3JpYmVkYnkgPSB0aGlzLmJhZGdlLmlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWxvdyBpdGVtcyBuZWVkZWQgZm9yIHRhYiAqL1xuICBAQ29udGVudENoaWxkcmVuKEljb25Db21wb25lbnQpIGljb25zOiBRdWVyeUxpc3Q8SWNvbkNvbXBvbmVudD47XG4gIF9yb2xlU2V0QnlUYWI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX2lzSW5OYXZPck5lc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyByb2xlIG9mIGJ1dHRvbi4gPGJyIC8+XG4gICAqIElmIG5vIGN1c3RvbSByb2xlIGlzIHNldCwgcm9sZSBtYXkgYmUgc2V0IGJ5IGEgcGFyZW50IGNvbXBvbmVudCAobmF2LCB0YWJzLCBldGMuKS5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGU7XG4gIH1cbiAgc2V0IHJvbGUodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9yb2xlID0gdmFsdWU7XG4gICAgdGhpcy5fcm9sZVNldEJ5VXNlciA9IHRydWU7XG4gIH1cbiAgX3JvbGU6IHN0cmluZyB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB8IHZvaWQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5yb2xlIHx8IHRoaXMucm9sZSA9PT0gbnVsbCkgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGV0aGVyIGJ1dHRvbiBpcyBzZWxlY3RlZC4gPGJyIC8+XG4gICAqIDxjb2RlPmFyaWEtY3VycmVudDwvY29kZT4gYW5kIDxjb2RlPmFyaWEtc2VsZWN0ZWQ8L2NvZGU+IHNob3VsZCBub3QgYmUgdXNlZCB0b2dldGhlci5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtc2VsZWN0ZWQnKVxuICBnZXQgYXJpYVNlbGVjdGVkKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYVNlbGVjdGVkO1xuICB9XG4gIHNldCBhcmlhU2VsZWN0ZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFTZWxlY3RlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFTZWxlY3RlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGhvc3RBcmlhU2VsZWN0ZWQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYVNlbGVjdGVkICE9PSBudWxsICYmICF0aGlzLl9pc0luTmF2T3JOZXN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFTZWxlY3RlZC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGV0aGVyIGJ1dHRvbiBpcyBzZWxlY3RlZC4gPGJyIC8+XG4gICAqIDxjb2RlPmFyaWEtY3VycmVudDwvY29kZT4gYW5kIDxjb2RlPmFyaWEtc2VsZWN0ZWQ8L2NvZGU+IHNob3VsZCBub3QgYmUgdXNlZCB0b2dldGhlci5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtY3VycmVudCcpXG4gIGdldCBhcmlhQ3VycmVudCgpOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFDdXJyZW50O1xuICB9XG4gIHNldCBhcmlhQ3VycmVudCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgaWYgKHZhbHVlID09PSAncGFnZScpIHtcbiAgICAgIHRoaXMuX2FyaWFDdXJyZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHRoaXMuX2FyaWFDdXJyZW50ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUN1cnJlbnQ6IGJvb2xlYW4gfCBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jdXJyZW50JylcbiAgZ2V0IGhvc3RBcmlhQ3VycmVudCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQ3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUN1cnJlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBidXR0b24gaXMgZXhwYW5kZWQuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWV4cGFuZGVkJylcbiAgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFFeHBhbmRlZDtcbiAgfVxuICBzZXQgYXJpYUV4cGFuZGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhRXhwYW5kZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhRXhwYW5kZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICBnZXQgaG9zdEFyaWFFeHBhbmRlZCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhRXhwYW5kZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFFeHBhbmRlZC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFyaWEgZGlzYWJsZWQgc3RhdGUgZm9yIGFjY2Vzc2liaWxpdHkgcHVycG9zZXMuIDxiciAvPlxuICAgKiBXaGVuIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIG5vdCBpbnRlcmFjdGl2ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1kaXNhYmxlZCcpXG4gIGdldCBhcmlhRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFEaXNhYmxlZDtcbiAgfVxuICBzZXQgYXJpYURpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhRGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQmVsb3cgbmVlZGVkIGZvciBBY2NvcmRpb24gKi9cbiAgQENvbnRlbnRDaGlsZChJY29uVG9nZ2xlRGlyZWN0aXZlKSB0b2dnbGVJY29uOiBJY29uVG9nZ2xlRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKEljb25Ub2dnbGVDb21wb25lbnQpIHRvZ2dsZUljb25Db21wb25lbnQ6IEljb25Ub2dnbGVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgZWxlbWVudCB0aGUgYnV0dG9uIGNvbnRyb2xzLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICcmbHQ7YWNjb3JkaW9uLXBhbmVsLWlkJmd0Oycgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gQWNjb3JkaW9uLlxuICAgKiBAZGVmYXVsdCAnJmx0O3BhbmVsLWNvbnRlbnQtaWQmZ3Q7JyB3aGVuIGJ1dHRvbiBpcyB1c2VkIHdpdGhpbiBQYW5lbC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWNvbnRyb2xzJylcbiAgZ2V0IGFyaWFDb250cm9scygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUNvbnRyb2xzO1xuICB9XG4gIHNldCBhcmlhQ29udHJvbHModmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhQ29udHJvbHMgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpXG4gIGdldCBob3N0QXJpYUNvbnRyb2xzKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFDb250cm9scyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUNvbnRyb2xzO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCZWxvdyBuZWVkZWQgZm9yIGNvbWJvYm94ICovXG4gIF9pbkNvbWJvYm94ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uIHRvIGNvbWJvYm94IHRvZ2dsZSBidXR0b24gd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVmYXVsdCB0cnVlIHdoZW4gYnV0dG9uIGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgZ2l2ZW4uXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1oYXNwb3B1cCcpXG4gIGdldCBhcmlhSGFzcG9wdXAoKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhSGFzcG9wdXA7XG4gIH1cbiAgc2V0IGFyaWFIYXNwb3B1cCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXJpYUhhc3BvcHVwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfYXJpYUhhc3BvcHVwOiBib29sZWFuIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGFzcG9wdXAnKVxuICBnZXQgaG9zdEFyaWFIYXNwb3B1cCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXJpYUhhc3BvcHVwICYmIHRoaXMuX2luQ29tYm9ib3gpIHtcbiAgICAgIHJldHVybiAndHJ1ZSc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFyaWFIYXNwb3B1cCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUhhc3BvcHVwLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYnV0dG9uJ3MgdGFiSW5kZXguXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgLTEgd2hlbiBidXR0b24gaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIG5vIGN1c3RvbSB2YWx1ZSBpcyBnaXZlbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuICBzZXQgdGFiaW5kZXgodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgdGhpcy5fdGFiaW5kZXggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3RhYmluZGV4OiBudW1iZXIgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBnZXQgaG9zdFRhYmluZGV4KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJpbmRleCAmJiAodGhpcy5faW5Db21ib2JveCB8fCB0aGlzLmFyaWFEaXNhYmxlZCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH0gZWxzZSBpZiAodGhpcy50YWJpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFiaW5kZXgudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==