UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

296 lines 34.1 kB
/** * © 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 { 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 * \u00A9 2025 Visa\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 * \u00A9 2025 Visa\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9saXN0Ym94LWl0ZW0vbGlzdGJveC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBNkIscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDaEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBT2hGLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx3QkFBd0I7SUFRaEU7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdC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QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU2pDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV2pDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnVtYmVySW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi9fdXRpbGl0aWVzL2FuZ3VsYXItc3BlY2lmaWMtZGlyZWN0aXZlcy9iYXNlLWludGVyYWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBVVUlEU2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrYm94RGlyZWN0aXZlIH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guZGlyZWN0aXZlJztcbmltcG9ydCB7IEVORF9LRVksIEVOVEVSX0tFWSwgSE9NRV9LRVksIFNQQUNFX0tFWSB9IGZyb20gJy4uL25vdmEtbGliLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBSYWRpb0RpcmVjdGl2ZSB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUb2dnbGVDb250cm9sU2VydmljZSB9IGZyb20gJy4uL3RvZ2dsZS1jb250cm9sL3RvZ2dsZS1jb250cm9sLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ1t2LWxpc3Rib3gtaXRlbV0gJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Rib3gtaXRlbS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTGlzdGJveEl0ZW1Db21wb25lbnQgZXh0ZW5kcyBCYXNlSW50ZXJhY3RpdmVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChSYWRpb0RpcmVjdGl2ZSkgcmFkaW86IFJhZGlvRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKENoZWNrYm94RGlyZWN0aXZlKSBjaGVja2JveDogQ2hlY2tib3hEaXJlY3RpdmU7XG4gIF9pc1JvbGVPcHRpb25WYXJpYW50ID0gZmFsc2U7XG4gIF9tdWx0aSA9IGZhbHNlO1xuICBfZGlzYWJsZWRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBfaW52YWxpZEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWxpc3Rib3gtaXRlbVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFt0aGlzLl9jbGFzcywgJ3YtbGlzdGJveC1pdGVtJywgdGhpcy5oaWdobGlnaHRlZCA/ICd2LWxpc3Rib3gtaXRlbS1oaWdobGlnaHRlZCcgOiAnJ10uam9pbignICcpO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIGl0ZW0gYXMgc2VsZWN0ZWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHNldCBhY3RpdmUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9hY3RpdmUgIT09IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5fYWN0aXZlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoY2hhbmdlZCkgdGhpcy5pdGVtQ2hhbmdlZC5lbWl0KHRoaXMuX2FjdGl2ZSk7XG4gIH1cbiAgX2FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBpdGVtIGFzIGhpZ2hsaWdodGVkIHdoZW4gdHJ1ZS4gT2NjdXJzIG5hdGl2ZWx5IHdpdGggOmZvY3VzLXZpc2libGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWQ7XG4gIH1cbiAgc2V0IGhpZ2hsaWdodGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9oaWdobGlnaHRlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2hpZ2hsaWdodGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gaW5kZXggb2YgaXRlbSB3aXRoaW4gbGlzdGJveCwgc3VwcGxpZWQgYnkgbGlzdGJveCBkaXJlY3RpdmVcbiAgLyoqIEBpZ25vcmUgKi9cbiAgQElucHV0KClcbiAgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG4gIHNldCBpbmRleCh2YWx1ZTogTnVtYmVySW5wdXQpIHtcbiAgICB0aGlzLl9pbmRleCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gcm9sZS5cbiAgICogQGRlZmF1bHQgJ29wdGlvbicgaWYgbm8gY2hpbGQgcmFkaW8gb3IgY2hlY2tib3ggaXMgcHJlc2VudC5cbiAgICogQGRlZmF1bHQgbm90IHByZXNlbnQgaWYgY2hpbGQgcmFkaW8gb3IgY2hlY2tib3ggaXMgcHJlc2VudC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgcm9sZTogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50ICYmICF0aGlzLnJvbGUpIHtcbiAgICAgIHRoaXMucm9sZSA9ICdvcHRpb24nO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIGxpc3Rib3ggaXRlbS4gPGJyIC8+XG4gICAqIEEgdmFsdWUgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IGJlIHByZXNlbnQgb24gZXZlcnkgbGlzdCBpdGVtIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBjaGlsZCByYWRpbyBvciBjaGVja2JveC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgX3ZhbHVlOiBzdHJpbmcgfCBudW1iZXI7XG4gIEBIb3N0QmluZGluZygnYXR0ci52YWx1ZScpXG4gIGdldCBob3N0VmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGxpc3QgaXRlbSB3aXRoIDxzdHJvbmc+bm8gY2hpbGQgcmFkaW8gb3IgY2hlY2tib3g8L3N0cm9uZz4gYXMgZGlzYWJsZWQuIDxiciAvPlxuICAgKiBJZiB1c2luZyBhIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94LCBzZXQgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGRpcmVjdGx5IG9uIHRob3NlIGNvbXBvbmVudHMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICghdGhpcy5faXNSb2xlT3B0aW9uVmFyaWFudCkgdGhpcy5fZGlzYWJsZWRFbWl0dGVyLmVtaXQodGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnYXR0ci5kaXNhYmxlZCcpXG4gIGdldCBob3N0RGlzYWJsZWQoKTogbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGlzYWJsZWQnKVxuICBnZXQgaG9zdEFyaWFEaXNhYmxlZCgpOiBzdHJpbmcgfCBudWxsIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJ3RydWUnIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBsaXN0IGl0ZW0gd2l0aCA8c3Ryb25nPm5vIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94PC9zdHJvbmc+IGFzIGludmFsaWQuIDxiciAvPlxuICAgKiBJZiB1c2luZyBhIGNoaWxkIHJhZGlvIG9yIGNoZWNrYm94LCBzZXQgPGNvZGU+aW52YWxpZDwvY29kZT4gZGlyZWN0bHkgb24gdGhvc2UgY29tcG9uZW50cy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkO1xuICB9XG4gIHNldCBpbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pbnZhbGlkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHRoaXMuX2ludmFsaWRFbWl0dGVyLmVtaXQodGhpcy5pbnZhbGlkKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuaW52YWxpZCcpXG4gIGdldCBob3N0SW52YWxpZCgpOiBzdHJpbmcgfCBudWxsIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyAnaW52YWxpZCcgOiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBpZC5cbiAgICogQGRlZmF1bHQgdXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1saXN0Ym94LWl0ZW0tJylcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgaWQ6IHN0cmluZyA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1saXN0Ym94LWl0ZW0tJyk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgZ2V0IGhvc3RBcmlhU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFjdGl2ZSBzdGF0ZSBvZiBpdGVtIHdoZW4gdG9nZ2xlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBpdGVtQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGlzIGl0ZW0gaXMgZm9jdXNlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICBoYW5kbGVGb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9nZ2xlQ29udHJvbFNlcnZpY2U6IFRvZ2dsZUNvbnRyb2xTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGVsKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmFkaW8gJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMucmFkaW8gPyB0aGlzLnJhZGlvIDogdGhpcy5jaGVja2JveCA/IHRoaXMuY2hlY2tib3ggOiBudWxsO1xuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBjb3JyZWN0IGNsYXNzZXMgYXQgdGhlIGxpc3Rib3gtY29udGFpbmVyIGxldmVsXG4gICAgICAgIHRoaXMuaW52YWxpZCA9IGNoaWxkLmludmFsaWQ7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBjaGlsZC5kaXNhYmxlZDtcbiAgICAgICAgY2hpbGQuX2Rpc2FibGVkRW1pdHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBjaGlsZC5kaXNhYmxlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNoaWxkLl9pbnZhbGlkRW1pdHRlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW52YWxpZCA9IGNoaWxkLmludmFsaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX2lzUm9sZU9wdGlvblZhcmlhbnQpIHtcbiAgICAgIHRoaXMudG9nZ2xlQ29udHJvbFNlcnZpY2UudG9nZ2xlQ29udHJvbCh0aGlzLnJhZGlvIHx8IHRoaXMuY2hlY2tib3gsIGV2ZW50KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RJdGVtKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXl1cCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSByZXR1cm47XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZIHx8IGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IHNjcm9sbGluZ1xuICAgICAgdGhpcy5jbGlja2VkLmVtaXQoKTtcbiAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkpIHRoaXMuc2VsZWN0SXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9pc1JvbGVPcHRpb25WYXJpYW50KSByZXR1cm47XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZIHx8IGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZIHx8IGV2ZW50LmtleSA9PT0gSE9NRV9LRVkgfHwgZXZlbnQua2V5ID09PSBFTkRfS0VZKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IHNjcm9sbGluZ1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEl0ZW0oKSB7XG4gICAgaWYgKHRoaXMuX211bHRpKSB7XG4gICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPHNwYW5cbiAgKm5nSWY9XCJfaXNSb2xlT3B0aW9uVmFyaWFudFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndi1mbGV4LXNocmluay0wJzogdHJ1ZSxcbiAgICAndi1jaGVja2JveCc6IF9tdWx0aSxcbiAgICAndi1yYWRpbyc6ICFfbXVsdGlcbiAgfVwiXG4+PC9zcGFuPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuIl19