UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

296 lines 34.2 kB
/** * 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 { CommonModule } from '@angular/common'; import { Component, ContentChild, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core'; import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive'; import { UUIDService } from '../_utilities/services/uuid.service'; import { CheckboxDirective } from '../checkbox/checkbox.directive'; import { END_KEY, ENTER_KEY, HOME_KEY, SPACE_KEY } from '../nova-lib.constants'; import { RadioDirective } from '../radio/radio.directive'; import { ToggleControlService } from '../toggle-control/toggle-control.service'; import * as i0 from "@angular/core"; import * as i1 from "../_utilities/services/uuid.service"; import * as i2 from "../toggle-control/toggle-control.service"; import * as i3 from "@angular/common"; export class ListboxItemComponent extends BaseInteractiveDirective { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-listbox-item */ get class() { return [this._class, 'v-listbox-item', this.highlighted ? 'v-listbox-item-highlighted' : ''].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Marks item as selected when true. * @default false */ get active() { return this._active; } set active(value) { const changed = this._active !== coerceBooleanProperty(value); this._active = coerceBooleanProperty(value); if (changed) this.itemChanged.emit(this._active); } /** * Marks item as highlighted when true. Occurs natively with :focus-visible. * @default false * @builtin true */ get highlighted() { return this._highlighted; } set highlighted(value) { this._highlighted = coerceBooleanProperty(value); } // index of item within listbox, supplied by listbox directive /** @ignore */ get index() { return this._index; } set index(value) { this._index = coerceNumberProperty(value); } get hostRole() { if (this._isRoleOptionVariant && !this.role) { this.role = 'option'; } return this.role; } /** * Value of listbox item. <br /> * A value <strong>must</strong> be present on every list item if it does not have a child radio or checkbox. */ get value() { return this._value; } set value(value) { this._value = value; } get hostValue() { if (this._isRoleOptionVariant) { return this.value; } } /** * Sets list item with <strong>no child radio or checkbox</strong> as disabled. <br /> * If using a child radio or checkbox, set <code>disabled</code> directly on those components. * @default false */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); if (!this._isRoleOptionVariant) this._disabledEmitter.emit(this.disabled); } get hostDisabled() { return null; } get hostAriaDisabled() { if (this._isRoleOptionVariant) { return this.disabled ? 'true' : null; } } /** * Sets list item with <strong>no child radio or checkbox</strong> as invalid. <br /> * If using a child radio or checkbox, set <code>invalid</code> directly on those components. * @default false */ get invalid() { return this._invalid; } set invalid(value) { this._invalid = coerceBooleanProperty(value); if (!this._isRoleOptionVariant) this._invalidEmitter.emit(this.invalid); } get hostInvalid() { if (this._isRoleOptionVariant) { return this.invalid ? 'invalid' : null; } } get hostId() { return this.id; } get hostAriaSelected() { if (this._isRoleOptionVariant) { return this.active; } } handleFocus(event) { this.onFocus.emit(event); } constructor(el, uuidService, toggleControlService) { super(el); this.uuidService = uuidService; this.toggleControlService = toggleControlService; this._isRoleOptionVariant = false; this._multi = false; this._disabledEmitter = new EventEmitter(); this._invalidEmitter = new EventEmitter(); this._class = ''; this._active = false; this._highlighted = false; this._disabled = false; this._invalid = false; /** * Sets custom id. * @default uuidService.getUUID('v-listbox-item-') * @builtin true */ this.id = this.uuidService.getUUID('v-listbox-item-'); /** * Emits active state of item when toggled. */ this.itemChanged = new EventEmitter(); /** * Emits when this item is focused. */ this.onFocus = new EventEmitter(); } ngAfterContentInit() { if (!this.radio && !this.checkbox) { this._isRoleOptionVariant = true; } else { const child = this.radio ? this.radio : this.checkbox ? this.checkbox : null; if (child) { // the following is needed to apply the correct classes at the listbox-container level this.invalid = child.invalid; this.disabled = child.disabled; child._disabledEmitter.subscribe(() => { this.disabled = child.disabled; }); child._invalidEmitter.subscribe(() => { this.invalid = child.invalid; }); } } } onClick(event) { if (!this._isRoleOptionVariant) { this.toggleControlService.toggleControl(this.radio || this.checkbox, event); } this.selectItem(); } handleKeyup(event) { if (!this._isRoleOptionVariant) return; if (event.key === ENTER_KEY || event.key === SPACE_KEY) { event.preventDefault(); // prevent scrolling this.clicked.emit(); if (!event.shiftKey) this.selectItem(); } } handleKeyDown(event) { if (!this._isRoleOptionVariant) return; if (event.key === ENTER_KEY || event.key === SPACE_KEY || event.key === HOME_KEY || event.key === END_KEY) { event.preventDefault(); // prevent scrolling } } selectItem() { if (this._multi) { this.active = !this.active; } else { this.active = true; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListboxItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.UUIDService }, { token: i2.ToggleControlService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ListboxItemComponent, isStandalone: true, selector: "[v-listbox-item] ", inputs: { class: "class", active: "active", highlighted: "highlighted", index: "index", role: "role", value: "value", disabled: "disabled", invalid: "invalid", id: "id" }, outputs: { itemChanged: "itemChanged", onFocus: "onFocus" }, host: { listeners: { "focus": "handleFocus($event)", "click": "onClick($event)", "keyup": "handleKeyup($event)", "keydown": "handleKeyDown($event)" }, properties: { "class": "this.hostClass", "attr.role": "this.hostRole", "attr.value": "this.hostValue", "attr.disabled": "this.hostDisabled", "attr.aria-disabled": "this.hostAriaDisabled", "attr.invalid": "this.hostInvalid", "attr.id": "this.hostId", "attr.aria-selected": "this.hostAriaSelected" } }, queries: [{ propertyName: "radio", first: true, predicate: RadioDirective, descendants: true }, { propertyName: "checkbox", first: true, predicate: CheckboxDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n * Copyright (c) 2025 Visa, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<span\n *ngIf=\"_isRoleOptionVariant\"\n [ngClass]=\"{\n 'v-flex-shrink-0': true,\n 'v-checkbox': _multi,\n 'v-radio': !_multi\n }\"\n></span>\n<ng-content></ng-content>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListboxItemComponent, decorators: [{ type: Component, args: [{ standalone: true, imports: [CommonModule], selector: '[v-listbox-item] ', template: "<!--\n * Copyright (c) 2025 Visa, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<span\n *ngIf=\"_isRoleOptionVariant\"\n [ngClass]=\"{\n 'v-flex-shrink-0': true,\n 'v-checkbox': _multi,\n 'v-radio': !_multi\n }\"\n></span>\n<ng-content></ng-content>\n" }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.UUIDService }, { type: i2.ToggleControlService }], propDecorators: { radio: [{ type: ContentChild, args: [RadioDirective] }], checkbox: [{ type: ContentChild, args: [CheckboxDirective] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], active: [{ type: Input }], highlighted: [{ type: Input }], index: [{ type: Input }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], value: [{ type: Input }], hostValue: [{ type: HostBinding, args: ['attr.value'] }], disabled: [{ type: Input }], hostDisabled: [{ type: HostBinding, args: ['attr.disabled'] }], hostAriaDisabled: [{ type: HostBinding, args: ['attr.aria-disabled'] }], invalid: [{ type: Input }], hostInvalid: [{ type: HostBinding, args: ['attr.invalid'] }], id: [{ type: Input }], hostId: [{ type: HostBinding, args: ['attr.id'] }], hostAriaSelected: [{ type: HostBinding, args: ['attr.aria-selected'] }], itemChanged: [{ type: Output }], onFocus: [{ type: Output }], handleFocus: [{ type: HostListener, args: ['focus', ['$event']] }], onClick: [{ type: HostListener, args: ['click', ['$event']] }], handleKeyup: [{ type: HostListener, args: ['keyup', ['$event']] }], handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBNkIscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDaEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBT2hGLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx3QkFBd0I7SUFRaEU7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQW1CO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUsscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUdEOzs7O09BSUc7SUFDSCxJQUNJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEtBQW1CO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUdELDhEQUE4RDtJQUM5RCxjQUFjO0lBQ2QsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFrQjtRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFVRCxJQUNJLFFBQVE7UUFDVixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQXNCO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUNJLFNBQVM7UUFDWCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQW1CO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFDSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFDSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBbUI7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsSUFDSSxXQUFXO1FBQ2IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBU0QsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUNJLGdCQUFnQjtRQUNsQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQWFELFdBQVcsQ0FBQyxLQUFpQjtRQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFDRSxFQUFjLEVBQ04sV0FBd0IsRUFDeEIsb0JBQTBDO1FBRWxELEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUhGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFuTHBELHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUMvQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFhOUMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQW1CcEIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWN6QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQTREOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQXlCM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQVExQjs7OztXQUlHO1FBRUgsT0FBRSxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFhekQ7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFcEQ7O1dBRUc7UUFDTyxZQUFPLEdBQTZCLElBQUksWUFBWSxFQUFFLENBQUM7SUFhakUsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1Ysc0ZBQXNGO2dCQUN0RixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBR0QsT0FBTyxDQUFDLEtBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUdELFdBQVcsQ0FBQyxLQUFvQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDdkMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQjtZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFHRCxhQUFhLENBQUMsS0FBb0I7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxPQUFPO1FBQ3ZDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQzsrR0E5T1Usb0JBQW9CO21HQUFwQixvQkFBb0IsNnhCQUNqQixjQUFjLDJFQUNkLGlCQUFpQix1RUMzQ2pDLDB6QkF5QkEsMkNEWVksWUFBWTs7NEZBSVgsb0JBQW9CO2tCQU5oQyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiLG1CQUFtQjs0SUFJQyxLQUFLO3NCQUFsQyxZQUFZO3VCQUFDLGNBQWM7Z0JBQ0ssUUFBUTtzQkFBeEMsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBVzNCLEtBQUs7c0JBRFIsS0FBSztnQkFTRixTQUFTO3NCQURaLFdBQVc7dUJBQUMsT0FBTztnQkFVaEIsTUFBTTtzQkFEVCxLQUFLO2dCQWlCRixXQUFXO3NCQURkLEtBQUs7Z0JBWUYsS0FBSztzQkFEUixLQUFLO2dCQWVHLElBQUk7c0JBQVosS0FBSztnQkFFRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFhcEIsS0FBSztzQkFEUixLQUFLO2dCQVNGLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxZQUFZO2dCQWFyQixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsWUFBWTtzQkFEZixXQUFXO3VCQUFDLGVBQWU7Z0JBS3hCLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBYTdCLE9BQU87c0JBRFYsS0FBSztnQkFVRixXQUFXO3NCQURkLFdBQVc7dUJBQUMsY0FBYztnQkFhM0IsRUFBRTtzQkFERCxLQUFLO2dCQUdGLE1BQU07c0JBRFQsV0FBVzt1QkFBQyxTQUFTO2dCQU1sQixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsb0JBQW9CO2dCQVV2QixXQUFXO3NCQUFwQixNQUFNO2dCQUtHLE9BQU87c0JBQWhCLE1BQU07Z0JBR1AsV0FBVztzQkFEVixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFpQ2pDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU2pDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV2pDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMjUgVmlzYSwgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5LCBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VJbnRlcmFjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uL191dGlsaXRpZXMvYW5ndWxhci1zcGVjaWZpYy1kaXJlY3RpdmVzL2Jhc2UtaW50ZXJhY3RpdmUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tib3hEaXJlY3RpdmUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRU5EX0tFWSwgRU5URVJfS0VZLCBIT01FX0tFWSwgU1BBQ0VfS0VZIH0gZnJvbSAnLi4vbm92YS1saWIuY29uc3RhbnRzJztcbmltcG9ydCB7IFJhZGlvRGlyZWN0aXZlIH0gZnJvbSAnLi4vcmFkaW8vcmFkaW8uZGlyZWN0aXZlJztcbmltcG9ydCB7IFRvZ2dsZUNvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi4vdG9nZ2xlLWNvbnRyb2wvdG9nZ2xlLWNvbnRyb2wuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHNlbGVjdG9yOiAnW3YtbGlzdGJveC1pdGVtXSAnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlzdGJveC1pdGVtLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBMaXN0Ym94SXRlbUNvbXBvbmVudCBleHRlbmRzIEJhc2VJbnRlcmFjdGl2ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkKFJhZGlvRGlyZWN0aXZlKSByYWRpbzogUmFkaW9EaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoQ2hlY2tib3hEaXJlY3RpdmUpIGNoZWNrYm94OiBDaGVja2JveERpcmVjdGl2ZTtcbiAgX2lzUm9sZU9wdGlvblZhcmlhbnQgPSBmYWxzZTtcbiAgX211bHRpID0gZmFsc2U7XG4gIF9kaXNhYmxlZEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIF9pbnZhbGlkRW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtbGlzdGJveC1pdGVtXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW3RoaXMuX2NsYXNzLCAndi1saXN0Ym94LWl0ZW0nLCB0aGlzLmhpZ2hsaWdodGVkID8gJ3YtbGlzdGJveC1pdGVtLWhpZ2hsaWdodGVkJyA6ICcnXS5qb2luKCcgJyk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgaXRlbSBhcyBzZWxlY3RlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cbiAgc2V0IGFjdGl2ZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuX2FjdGl2ZSAhPT0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLml0ZW1DaGFuZ2VkLmVtaXQodGhpcy5fYWN0aXZlKTtcbiAgfVxuICBfYWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGl0ZW0gYXMgaGlnaGxpZ2h0ZWQgd2hlbiB0cnVlLiBPY2N1cnMgbmF0aXZlbHkgd2l0aCA6Zm9jdXMtdmlzaWJsZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGhpZ2hsaWdodGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZDtcbiAgfVxuICBzZXQgaGlnaGxpZ2h0ZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2hpZ2hsaWdodGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaGlnaGxpZ2h0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBpbmRleCBvZiBpdGVtIHdpdGhpbiBsaXN0Ym94LCBzdXBwbGllZCBieSBsaXN0Ym94IGRpcmVjdGl2ZVxuICAvKiogQGlnbm9yZSAqL1xuICBASW5wdXQoKVxuICBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cbiAgc2V0IGluZGV4KHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgIHRoaXMuX2luZGV4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9pbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSByb2xlLlxuICAgKiBAZGVmYXVsdCAnb3B0aW9uJyBpZiBubyBjaGlsZCByYWRpbyBvciBjaGVja2JveCBpcyBwcmVzZW50LlxuICAgKiBAZGVmYXVsdCBub3QgcHJlc2VudCBpZiBjaGlsZCByYWRpbyBvciBjaGVja2JveCBpcyBwcmVzZW50LlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoKSByb2xlOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQgJiYgIXRoaXMucm9sZSkge1xuICAgICAgdGhpcy5yb2xlID0gJ29wdGlvbic7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsdWUgb2YgbGlzdGJveCBpdGVtLiA8YnIgLz5cbiAgICogQSB2YWx1ZSA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgcHJlc2VudCBvbiBldmVyeSBsaXN0IGl0ZW0gaWYgaXQgZG9lcyBub3QgaGF2ZSBhIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBfdmFsdWU6IHN0cmluZyB8IG51bWJlcjtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnZhbHVlJylcbiAgZ2V0IGhvc3RWYWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbGlzdCBpdGVtIHdpdGggPHN0cm9uZz5ubyBjaGlsZCByYWRpbyBvciBjaGVja2JveDwvc3Ryb25nPiBhcyBkaXNhYmxlZC4gPGJyIC8+XG4gICAqIElmIHVzaW5nIGEgY2hpbGQgcmFkaW8gb3IgY2hlY2tib3gsIHNldCA8Y29kZT5kaXNhYmxlZDwvY29kZT4gZGlyZWN0bHkgb24gdGhvc2UgY29tcG9uZW50cy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKCF0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSB0aGlzLl9kaXNhYmxlZEVtaXR0ZXIuZW1pdCh0aGlzLmRpc2FibGVkKTtcbiAgfVxuICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRpc2FibGVkJylcbiAgZ2V0IGhvc3REaXNhYmxlZCgpOiBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXG4gIGdldCBob3N0QXJpYURpc2FibGVkKCk6IHN0cmluZyB8IG51bGwgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAndHJ1ZScgOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxpc3QgaXRlbSB3aXRoIDxzdHJvbmc+bm8gY2hpbGQgcmFkaW8gb3IgY2hlY2tib3g8L3N0cm9uZz4gYXMgaW52YWxpZC4gPGJyIC8+XG4gICAqIElmIHVzaW5nIGEgY2hpbGQgcmFkaW8gb3IgY2hlY2tib3gsIHNldCA8Y29kZT5pbnZhbGlkPC9jb2RlPiBkaXJlY3RseSBvbiB0aG9zZSBjb21wb25lbnRzLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmFsaWQ7XG4gIH1cbiAgc2V0IGludmFsaWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2ludmFsaWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICghdGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkgdGhpcy5faW52YWxpZEVtaXR0ZXIuZW1pdCh0aGlzLmludmFsaWQpO1xuICB9XG4gIF9pbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pbnZhbGlkJylcbiAgZ2V0IGhvc3RJbnZhbGlkKCk6IHN0cmluZyB8IG51bGwgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/ICdpbnZhbGlkJyA6IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIGlkLlxuICAgKiBAZGVmYXVsdCB1dWlkU2VydmljZS5nZXRVVUlEKCd2LWxpc3Rib3gtaXRlbS0nKVxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBpZDogc3RyaW5nID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LWxpc3Rib3gtaXRlbS0nKTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgZ2V0IGhvc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtc2VsZWN0ZWQnKVxuICBnZXQgaG9zdEFyaWFTZWxlY3RlZCgpOiBib29sZWFuIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgYWN0aXZlIHN0YXRlIG9mIGl0ZW0gd2hlbiB0b2dnbGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoaXMgaXRlbSBpcyBmb2N1c2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uRm9jdXM6IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgdGhpcy5vbkZvY3VzLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2dnbGVDb250cm9sU2VydmljZTogVG9nZ2xlQ29udHJvbFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoZWwpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yYWRpbyAmJiAhdGhpcy5jaGVja2JveCkge1xuICAgICAgdGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5yYWRpbyA/IHRoaXMucmFkaW8gOiB0aGlzLmNoZWNrYm94ID8gdGhpcy5jaGVja2JveCA6IG51bGw7XG4gICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgdG8gYXBwbHkgdGhlIGNvcnJlY3QgY2xhc3NlcyBhdCB0aGUgbGlzdGJveC1jb250YWluZXIgbGV2ZWxcbiAgICAgICAgdGhpcy5pbnZhbGlkID0gY2hpbGQuaW52YWxpZDtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGNoaWxkLmRpc2FibGVkO1xuICAgICAgICBjaGlsZC5fZGlzYWJsZWRFbWl0dGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGNoaWxkLmRpc2FibGVkO1xuICAgICAgICB9KTtcbiAgICAgICAgY2hpbGQuX2ludmFsaWRFbWl0dGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnZhbGlkID0gY2hpbGQuaW52YWxpZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkge1xuICAgICAgdGhpcy50b2dnbGVDb250cm9sU2VydmljZS50b2dnbGVDb250cm9sKHRoaXMucmFkaW8gfHwgdGhpcy5jaGVja2JveCwgZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdEl0ZW0oKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBFTlRFUl9LRVkgfHwgZXZlbnQua2V5ID09PSBTUEFDRV9LRVkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgc2Nyb2xsaW5nXG4gICAgICB0aGlzLmNsaWNrZWQuZW1pdCgpO1xuICAgICAgaWYgKCFldmVudC5zaGlmdEtleSkgdGhpcy5zZWxlY3RJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBFTlRFUl9LRVkgfHwgZXZlbnQua2V5ID09PSBTUEFDRV9LRVkgfHwgZXZlbnQua2V5ID09PSBIT01FX0tFWSB8fCBldmVudC5rZXkgPT09IEVORF9LRVkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgc2Nyb2xsaW5nXG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SXRlbSgpIHtcbiAgICBpZiAodGhpcy5fbXVsdGkpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAtLT5cbjxzcGFuXG4gICpuZ0lmPVwiX2lzUm9sZU9wdGlvblZhcmlhbnRcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3YtZmxleC1zaHJpbmstMCc6IHRydWUsXG4gICAgJ3YtY2hlY2tib3gnOiBfbXVsdGksXG4gICAgJ3YtcmFkaW8nOiAhX211bHRpXG4gIH1cIlxuPjwvc3Bhbj5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==