UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

243 lines 26.4 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 } from '@angular/cdk/coercion'; import { ChangeDetectorRef, ContentChildren, Directive, ElementRef, HostBinding, HostListener, Input, QueryList, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { UUIDService } from '../_utilities/services/uuid.service'; import { AppReadyService } from '../_utilities/services/app-stable-check.service'; import { RadioDirective } from '../radio/radio.directive'; import * as i0 from "@angular/core"; import * as i1 from "../_utilities/services/app-stable-check.service"; import * as i2 from "../_utilities/services/uuid.service"; /** * This directive is used to group radio buttons together and manage their state. <br /> * Typically used for a required group to relay that one of the group is required to be selected. */ export class RadioGroupDirective { /** * Marks radio group as required when true. * @default false */ get groupRequired() { return this._groupRequired; } set groupRequired(value) { this._groupRequired = coerceBooleanProperty(value); this.updateChildrenState('required', this.groupRequired); } get ariaRequired() { if (this.groupRequired) return 'true'; } /** * Sets radio group as disabled when true. * @default false */ get groupDisabled() { return this._groupDisabled; } set groupDisabled(value) { this._groupDisabled = coerceBooleanProperty(value); this.updateChildrenState('disabled', this.groupDisabled); } /** Fires when a formControl's disabled state updates */ setDisabledState(isDisabled) { this.groupDisabled = isDisabled; } /** * Marks radio group as invalid when true. * @default false */ get groupInvalid() { return this._groupInvalid; } set groupInvalid(value) { this._groupInvalid = coerceBooleanProperty(value); this.updateChildrenState('invalid', this.groupInvalid); } get hostRole() { return this.role; } /** * Value of radio group. */ get value() { return this._value; } set value(value) { this._value = value; if (!value) this.clear(); this.onChange(value); this.onTouched(value); } handleChange(event) { const target = event.target; const selected = this.radios.find((radio) => radio.radioValue == target.value); // double equals so number can be compared to string if (selected) { this.value = selected.radioValue; this.radios.forEach((radio) => (radio.checked = radio.radioValue === this.value)); } } handleBlur(event) { this.onTouched(event); } constructor(el, appReadyService, cdRef, uuidService) { this.el = el; this.appReadyService = appReadyService; this.cdRef = cdRef; this.uuidService = uuidService; this._groupRequired = false; this._groupDisabled = false; this._groupInvalid = false; /** * Sets custom role. * @default radiogroup * @builtin true */ this.role = 'radiogroup'; /** * Shared name of radio group. * @default this.uuidService.getUUID('v-radio-group-'); * @builtin true */ this.name = this.uuidService.getUUID('v-radio-group-'); this.onChange = (_) => { }; this.onTouched = (_) => { }; } ngAfterContentInit() { if (this.radios) { this.radios.forEach((radio) => { radio.name = radio.name ? radio.name : this.name; }); this.radios.changes.subscribe(() => { this.radios.forEach((radio) => { radio.name = radio.name ? radio.name : this.name; }); this.cdRef.detectChanges(); }); if (this.value) { // if value is given, select matching radio this.selectRadio(); } else { // if no value is given, see if a radio is selected and update value const selected = this.radios.find((radio) => radio.checked); if (selected) { this.value = selected.radioValue; } } if (this.groupDisabled) this.updateChildrenState('disabled', this.groupDisabled); if (this.groupInvalid) this.updateChildrenState('invalid', this.groupInvalid); if (this.groupRequired) this.updateChildrenState('required', this.groupRequired); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } writeValue(value) { this.value = value; this.selectRadio(); this.onChange(this.value); } selectRadio() { const selected = this.radios?.find((radio) => radio.radioValue == this.value); // double equals so number can be compared to string if (selected && !selected.checked) { selected.checked = true; if (this.appReadyService.isBrowserAndDomAvailable()) { selected.el.nativeElement.checked = true; } } } clear() { if (this.radios) { // clear value from radio and visual check this.radios.forEach((radio) => { radio.checked = false; if (this.appReadyService.isBrowserAndDomAvailable()) { radio.el.nativeElement.checked = false; } }); } } updateChildrenState(prop, groupProp) { if (this.radios) { this.radios.forEach((radio) => { radio[prop] = groupProp; }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioGroupDirective, deps: [{ token: i0.ElementRef }, { token: i1.AppReadyService }, { token: i0.ChangeDetectorRef }, { token: i2.UUIDService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RadioGroupDirective, isStandalone: true, selector: "[v-radio-group]", inputs: { groupRequired: ["required", "groupRequired"], groupDisabled: ["disabled", "groupDisabled"], groupInvalid: ["invalid", "groupInvalid"], role: "role", value: "value", name: "name" }, host: { listeners: { "change": "handleChange($event)", "blur": "handleBlur($event)" }, properties: { "attr.aria-required": "this.ariaRequired", "attr.role": "this.hostRole" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupDirective), multi: true } ], queries: [{ propertyName: "radios", predicate: RadioDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioGroupDirective, decorators: [{ type: Directive, args: [{ selector: '[v-radio-group]', standalone: true, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupDirective), multi: true } ] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AppReadyService }, { type: i0.ChangeDetectorRef }, { type: i2.UUIDService }], propDecorators: { radios: [{ type: ContentChildren, args: [RadioDirective, { descendants: true }] }], groupRequired: [{ type: Input, args: ['required'] }], ariaRequired: [{ type: HostBinding, args: ['attr.aria-required'] }], groupDisabled: [{ type: Input, args: ['disabled'] }], groupInvalid: [{ type: Input, args: ['invalid'] }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], value: [{ type: Input }], name: [{ type: Input }], handleChange: [{ type: HostListener, args: ['change', ['$event']] }], handleBlur: [{ type: HostListener, args: ['blur', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQUUxRDs7O0dBR0c7QUFZSCxNQUFNLE9BQU8sbUJBQW1CO0lBRTlCOzs7T0FHRztJQUNILElBQ0ksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsS0FBbUI7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFDSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLGFB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QUE3RCxlQUFlO3VCQUFDLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBTWxELGFBQWE7c0JBRGhCLEtBQUs7dUJBQUMsVUFBVTtnQkFVYixZQUFZO3NCQURmLFdBQVc7dUJBQUMsb0JBQW9CO2dCQVU3QixhQUFhO3NCQURoQixLQUFLO3VCQUFDLFVBQVU7Z0JBbUJiLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxTQUFTO2dCQWVQLElBQUk7c0JBQVosS0FBSztnQkFFRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFTcEIsS0FBSztzQkFEUixLQUFLO2dCQWtCRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR04sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXbEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0LFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBSZWFkeVNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL2FwcC1zdGFibGUtY2hlY2suc2VydmljZSc7XG5pbXBvcnQgeyBSYWRpb0RpcmVjdGl2ZSB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCB0byBncm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIGFuZCBtYW5hZ2UgdGhlaXIgc3RhdGUuIDxiciAvPlxuICogVHlwaWNhbGx5IHVzZWQgZm9yIGEgcmVxdWlyZWQgZ3JvdXAgdG8gcmVsYXkgdGhhdCBvbmUgb2YgdGhlIGdyb3VwIGlzIHJlcXVpcmVkIHRvIGJlIHNlbGVjdGVkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdi1yYWRpby1ncm91cF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvR3JvdXBEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgUmFkaW9Hcm91cERpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZHJlbihSYWRpb0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSByYWRpb3M6IFF1ZXJ5TGlzdDxSYWRpb0RpcmVjdGl2ZT47XG4gIC8qKlxuICAgKiBNYXJrcyByYWRpbyBncm91cCBhcyByZXF1aXJlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3JlcXVpcmVkJylcbiAgZ2V0IGdyb3VwUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2dyb3VwUmVxdWlyZWQ7XG4gIH1cbiAgc2V0IGdyb3VwUmVxdWlyZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2dyb3VwUmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgncmVxdWlyZWQnLCB0aGlzLmdyb3VwUmVxdWlyZWQpO1xuICB9XG4gIF9ncm91cFJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXJlcXVpcmVkJylcbiAgZ2V0IGFyaWFSZXF1aXJlZCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5ncm91cFJlcXVpcmVkKSByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcmFkaW8gZ3JvdXAgYXMgZGlzYWJsZWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCdkaXNhYmxlZCcpXG4gIGdldCBncm91cERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9ncm91cERpc2FibGVkO1xuICB9XG4gIHNldCBncm91cERpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ncm91cERpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuU3RhdGUoJ2Rpc2FibGVkJywgdGhpcy5ncm91cERpc2FibGVkKTtcbiAgfVxuICBfZ3JvdXBEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRmlyZXMgd2hlbiBhIGZvcm1Db250cm9sJ3MgZGlzYWJsZWQgc3RhdGUgdXBkYXRlcyAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ncm91cERpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyByYWRpbyBncm91cCBhcyBpbnZhbGlkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgnaW52YWxpZCcpXG4gIGdldCBncm91cEludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2dyb3VwSW52YWxpZDtcbiAgfVxuICBzZXQgZ3JvdXBJbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ncm91cEludmFsaWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgnaW52YWxpZCcsIHRoaXMuZ3JvdXBJbnZhbGlkKTtcbiAgfVxuICBfZ3JvdXBJbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIHJvbGUuXG4gICAqIEBkZWZhdWx0IHJhZGlvZ3JvdXBcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgcm9sZTogc3RyaW5nID0gJ3JhZGlvZ3JvdXAnO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHJhZGlvIGdyb3VwLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdmFsdWUpIHRoaXMuY2xlYXIoKTtcblxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKHZhbHVlKTtcbiAgfVxuICBfdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBuYW1lIG9mIHJhZGlvIGdyb3VwLlxuICAgKiBAZGVmYXVsdCB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtcmFkaW8tZ3JvdXAtJyk7XG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZyA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1yYWRpby1ncm91cC0nKTtcblxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJhZGlvcy5maW5kKChyYWRpbykgPT4gcmFkaW8ucmFkaW9WYWx1ZSA9PSB0YXJnZXQudmFsdWUpOyAvLyBkb3VibGUgZXF1YWxzIHNvIG51bWJlciBjYW4gYmUgY29tcGFyZWQgdG8gc3RyaW5nXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWQucmFkaW9WYWx1ZTtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiAocmFkaW8uY2hlY2tlZCA9IHJhZGlvLnJhZGlvVmFsdWUgPT09IHRoaXMudmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQmx1cihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm9uVG91Y2hlZChldmVudCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBhcHBSZWFkeVNlcnZpY2U6IEFwcFJlYWR5U2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVVUlEU2VydmljZVxuICApIHsgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgIHJhZGlvLm5hbWUgPSByYWRpby5uYW1lID8gcmFkaW8ubmFtZSA6IHRoaXMubmFtZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJhZGlvcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgICAgcmFkaW8ubmFtZSA9IHJhZGlvLm5hbWUgPyByYWRpby5uYW1lIDogdGhpcy5uYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaXMgZ2l2ZW4sIHNlbGVjdCBtYXRjaGluZyByYWRpb1xuICAgICAgICB0aGlzLnNlbGVjdFJhZGlvKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBubyB2YWx1ZSBpcyBnaXZlbiwgc2VlIGlmIGEgcmFkaW8gaXMgc2VsZWN0ZWQgYW5kIHVwZGF0ZSB2YWx1ZVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucmFkaW9zLmZpbmQoKHJhZGlvKSA9PiByYWRpby5jaGVja2VkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkLnJhZGlvVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3VwRGlzYWJsZWQpIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgnZGlzYWJsZWQnLCB0aGlzLmdyb3VwRGlzYWJsZWQpO1xuICAgICAgaWYgKHRoaXMuZ3JvdXBJbnZhbGlkKSB0aGlzLnVwZGF0ZUNoaWxkcmVuU3RhdGUoJ2ludmFsaWQnLCB0aGlzLmdyb3VwSW52YWxpZCk7XG4gICAgICBpZiAodGhpcy5ncm91cFJlcXVpcmVkKSB0aGlzLnVwZGF0ZUNoaWxkcmVuU3RhdGUoJ3JlcXVpcmVkJywgdGhpcy5ncm91cFJlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICBvblRvdWNoZWQgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZWxlY3RSYWRpbygpO1xuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHNlbGVjdFJhZGlvKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yYWRpb3M/LmZpbmQoKHJhZGlvKSA9PiByYWRpby5yYWRpb1ZhbHVlID09IHRoaXMudmFsdWUpOyAvLyBkb3VibGUgZXF1YWxzIHNvIG51bWJlciBjYW4gYmUgY29tcGFyZWQgdG8gc3RyaW5nXG4gICAgaWYgKHNlbGVjdGVkICYmICFzZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICBzZWxlY3RlZC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkge1xuICAgICAgICBzZWxlY3RlZC5lbC5uYXRpdmVFbGVtZW50LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLnJhZGlvcykge1xuICAgICAgLy8gY2xlYXIgdmFsdWUgZnJvbSByYWRpbyBhbmQgdmlzdWFsIGNoZWNrXG4gICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkge1xuICAgICAgICAgIHJhZGlvLmVsLm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDaGlsZHJlblN0YXRlKHByb3A6ICdkaXNhYmxlZCcgfCAnaW52YWxpZCcgfCAncmVxdWlyZWQnLCBncm91cFByb3A6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgIHJhZGlvW3Byb3BdID0gZ3JvdXBQcm9wO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=