@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
157 lines • 24.1 kB
JavaScript
/**
* © 2025 Visa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { Injectable } from '@angular/core';
import { UUIDService } from '../_utilities/services/uuid.service';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
/**
* AccordionService is an internal service used to create accordion behavior and is used within the accordion component.
*/
export class AccordionService {
constructor(uuidService) {
this.uuidService = uuidService;
/** @ignore */
this.items = [];
}
/**
* The setUpAccordion method sets up the accordion by pairing accordion headings with their respective panels and having them reflect the same expanded state.
* @param accordion Accordion to set up.
* @returns void
*/
setUpAccordion(accordion) {
this.items = []; // reset items array
// provide service with necessary Directives
this.accordion = accordion;
this.headings = accordion.headings.toArray();
this.panels = accordion.panels.toArray();
// return or warn for edge cases of no or mismatched headings + panels
if (this.headings.length === 0 || this.panels.length === 0)
return;
if (this.headings.length !== this.panels.length) {
console.warn(`
The number of accordion headings and panels are not equal.
Behavior may be off as a result.
Please ensure each heading has a matching panel.
`);
}
this.headings.forEach((heading, index) => {
// set index at heading level.
heading._index = index;
/**
* Each item requires a controlling button
* This will either be an [v-button][v-accordion-heading] or a child button of an accordion-heading
*/
let buttonHeading = heading.hostButton
? heading.hostButton
: heading._buttonHeading
? heading._buttonHeading
: undefined;
// create array of items with each controlling button and respective panel
if (this.panels[index] && buttonHeading) {
this.items.push({ heading: heading, button: buttonHeading, panel: this.panels[index] });
this.setUpPanel(index, heading.expanded);
this.setUpButton(buttonHeading, index, heading.expanded);
}
});
}
/**
* The setUpPanel method configures a panel with index, expanded state, and assigns an id if not provided.
* @param index Index of panel to set up.
* @param expanded Expanded state of panel's associated accordion item.
*/
setUpPanel(index, expanded) {
// aligns panel index and expanded to associated heading
this.panels[index]._index = index;
this.panels[index]._expanded = expanded;
this.panels[index].id = this.panels[index].id
? this.panels[index].id
: this.uuidService.getUUID('v-accordion-panel-');
}
/**
* The setUpButton method configures a button with id, aria-controls, aria-expanded attributes, and the appropriate toggle icon.
* @param buttonHeading Button to set up.
* @param index Index of button to set up.
* @param expanded Expanded state of button's associated accordion item.
*/
setUpButton(buttonHeading, index, expanded) {
// sets up controlling button's aria properties
buttonHeading.id = buttonHeading.id ? buttonHeading.id : this.uuidService.getUUID('v-accordion-button-');
buttonHeading.ariaControls = this.panels[index].id;
buttonHeading.ariaExpanded = expanded;
if (buttonHeading.toggleIcon) {
buttonHeading.toggleIcon.class = [buttonHeading.toggleIcon.class, 'v-accordion-toggle-icon'].join(' ');
if (!buttonHeading.toggleIcon._iconSet) {
if (!buttonHeading.toggleIcon._expandedSet)
buttonHeading.toggleIcon.expandedIcon = 'chevron-down';
if (!buttonHeading.toggleIcon._collapsedSet)
buttonHeading.toggleIcon.collapsedIcon = 'chevron-right';
buttonHeading.toggleIcon.icon.icon = expanded
? buttonHeading.toggleIcon.expandedIcon
: buttonHeading.toggleIcon.collapsedIcon;
}
}
else if (buttonHeading.toggleIconComponent) {
buttonHeading.toggleIconComponent._accordionToggle = true;
buttonHeading.toggleIconComponent.rotated = expanded;
}
}
/**
* The toggleItem method reverses the current state of the accordion. If collapsed, it expands; if expanded, it collapses. If it was collapsed, the function will expand. If it was expanded, the function will collapse.
* @param index Index of accordion item to toggle.
*/
toggleItem(index) {
this.items[index]['heading'].expanded = !this.items[index]['heading'].expanded;
}
/**
* The expandItem method expands the accordion by showing panel content, setting the button’s aria-expanded to true, and changing the toggle icon to expandedIcon.
* @param index Index of accordion item to expand.
*/
expandItem(index) {
if (this.items[index]) {
this.items[index]['panel']._expanded = true;
this.items[index]['button'].ariaExpanded = true;
if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) {
this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.expandedIcon;
}
else if (this.items[index]['button'].toggleIconComponent) {
this.items[index]['button'].toggleIconComponent.rotated = true;
}
}
}
/**
* The collapseItem method collapses the accordion by hiding panel content, setting the button’s aria-expanded to false, and changing the toggle icon to collapsedIcon.
* @param index Index of accordion item to collapse.
*/
collapseItem(index) {
if (this.items[index]) {
this.items[index]['panel']._expanded = false;
this.items[index]['button'].ariaExpanded = false;
if (this.items[index]['button'].toggleIcon && !this.items[index]['button'].toggleIcon._iconSet) {
this.items[index]['button'].toggleIcon.icon.icon = this.items[index]['button'].toggleIcon.collapsedIcon;
}
else if (this.items[index]['button'].toggleIconComponent) {
this.items[index]['button'].toggleIconComponent.rotated = false;
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, deps: [{ token: i1.UUIDService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.UUIDService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvYWNjb3JkaW9uL2FjY29yZGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUFNbEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBSTVDLGNBQWM7UUFDZCxVQUFLLEdBQXNHLEVBQUUsQ0FBQztJQUwvRCxDQUFDO0lBV2hEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsU0FBNkI7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDckMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFekMsc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ25FLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDOzs7O09BSVosQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVE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USxDQUFDLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0F4SVUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4uL2FjY29yZGlvbi1oZWFkaW5nL2FjY29yZGlvbi1oZWFkaW5nLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25QYW5lbERpcmVjdGl2ZSB9IGZyb20gJy4uL2FjY29yZGlvbi1wYW5lbC9hY2NvcmRpb24tcGFuZWwuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4vYWNjb3JkaW9uLmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogQWNjb3JkaW9uU2VydmljZSBpcyBhbiBpbnRlcm5hbCBzZXJ2aWNlIHVzZWQgdG8gY3JlYXRlIGFjY29yZGlvbiBiZWhhdmlvciBhbmQgaXMgdXNlZCB3aXRoaW4gdGhlIGFjY29yZGlvbiBjb21wb25lbnQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UpIHt9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgYWNjb3JkaW9uOiBBY2NvcmRpb25EaXJlY3RpdmU7XG4gIC8qKiBAaWdub3JlICovXG4gIGl0ZW1zOiB7IGhlYWRpbmc6IEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmU7IGJ1dHRvbjogQnV0dG9uRGlyZWN0aXZlOyBwYW5lbDogQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmUgfVtdID0gW107XG4gIC8qKiBAaWdub3JlICovXG4gIGhlYWRpbmdzOiBBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlW107XG4gIC8qKiBAaWdub3JlICovXG4gIHBhbmVsczogQWNjb3JkaW9uUGFuZWxEaXJlY3RpdmVbXTtcblxuICAvKipcbiAgICogVGhlIHNldFVwQWNjb3JkaW9uIG1ldGhvZCBzZXRzIHVwIHRoZSBhY2NvcmRpb24gYnkgcGFpcmluZyBhY2NvcmRpb24gaGVhZGluZ3Mgd2l0aCB0aGVpciByZXNwZWN0aXZlIHBhbmVscyBhbmQgaGF2aW5nIHRoZW0gcmVmbGVjdCB0aGUgc2FtZSBleHBhbmRlZCBzdGF0ZS5cbiAgICogQHBhcmFtIGFjY29yZGlvbiBBY2NvcmRpb24gdG8gc2V0IHVwLlxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBzZXRVcEFjY29yZGlvbihhY2NvcmRpb246IEFjY29yZGlvbkRpcmVjdGl2ZSkge1xuICAgIHRoaXMuaXRlbXMgPSBbXTsgLy8gcmVzZXQgaXRlbXMgYXJyYXlcbiAgICAvLyBwcm92aWRlIHNlcnZpY2Ugd2l0aCBuZWNlc3NhcnkgRGlyZWN0aXZlc1xuICAgIHRoaXMuYWNjb3JkaW9uID0gYWNjb3JkaW9uO1xuICAgIHRoaXMuaGVhZGluZ3MgPSBhY2NvcmRpb24uaGVhZGluZ3MudG9BcnJheSgpO1xuICAgIHRoaXMucGFuZWxzID0gYWNjb3JkaW9uLnBhbmVscy50b0FycmF5KCk7XG5cbiAgICAvLyByZXR1cm4gb3Igd2FybiBmb3IgZWRnZSBjYXNlcyBvZiBubyBvciBtaXNtYXRjaGVkIGhlYWRpbmdzICsgcGFuZWxzXG4gICAgaWYgKHRoaXMuaGVhZGluZ3MubGVuZ3RoID09PSAwIHx8IHRoaXMucGFuZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhlYWRpbmdzLmxlbmd0aCAhPT0gdGhpcy5wYW5lbHMubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFxuICAgICAgICBUaGUgbnVtYmVyIG9mIGFjY29yZGlvbiBoZWFkaW5ncyBhbmQgcGFuZWxzIGFyZSBub3QgZXF1YWwuIFxuICAgICAgICBCZWhhdmlvciBtYXkgYmUgb2ZmIGFzIGEgcmVzdWx0LiBcbiAgICAgICAgUGxlYXNlIGVuc3VyZSBlYWNoIGhlYWRpbmcgaGFzIGEgbWF0Y2hpbmcgcGFuZWwuXG4gICAgICBgKTtcbiAgICB9XG5cbiAgICB0aGlzLmhlYWRpbmdzLmZvckVhY2goKGhlYWRpbmcsIGluZGV4KSA9PiB7XG4gICAgICAvLyBzZXQgaW5kZXggYXQgaGVhZGluZyBsZXZlbC5cbiAgICAgIGhlYWRpbmcuX2luZGV4ID0gaW5kZXg7XG5cbiAgICAgIC8qKlxuICAgICAgICogRWFjaCBpdGVtIHJlcXVpcmVzIGEgY29udHJvbGxpbmcgYnV0dG9uXG4gICAgICAgKiBUaGlzIHdpbGwgZWl0aGVyIGJlIGFuIFt2LWJ1dHRvbl1bdi1hY2NvcmRpb24taGVhZGluZ10gb3IgYSBjaGlsZCBidXR0b24gb2YgYW4gYWNjb3JkaW9uLWhlYWRpbmdcbiAgICAgICAqL1xuICAgICAgbGV0IGJ1dHRvbkhlYWRpbmc6IEJ1dHRvbkRpcmVjdGl2ZSB8IHVuZGVmaW5lZCA9IGhlYWRpbmcuaG9zdEJ1dHRvblxuICAgICAgICA/IGhlYWRpbmcuaG9zdEJ1dHRvblxuICAgICAgICA6IGhlYWRpbmcuX2J1dHRvbkhlYWRpbmdcbiAgICAgICAgICA/IGhlYWRpbmcuX2J1dHRvbkhlYWRpbmdcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gY3JlYXRlIGFycmF5IG9mIGl0ZW1zIHdpdGggZWFjaCBjb250cm9sbGluZyBidXR0b24gYW5kIHJlc3BlY3RpdmUgcGFuZWxcbiAgICAgIGlmICh0aGlzLnBhbmVsc1tpbmRleF0gJiYgYnV0dG9uSGVhZGluZykge1xuICAgICAgICB0aGlzLml0ZW1zLnB1c2goeyBoZWFkaW5nOiBoZWFkaW5nLCBidXR0b246IGJ1dHRvbkhlYWRpbmcsIHBhbmVsOiB0aGlzLnBhbmVsc1tpbmRleF0gfSk7XG5cbiAgICAgICAgdGhpcy5zZXRVcFBhbmVsKGluZGV4LCBoZWFkaW5nLmV4cGFuZGVkKTtcbiAgICAgICAgdGhpcy5zZXRVcEJ1dHRvbihidXR0b25IZWFkaW5nLCBpbmRleCwgaGVhZGluZy5leHBhbmRlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlwqBzZXRVcFBhbmVswqBtZXRob2QgY29uZmlndXJlcyBhIHBhbmVsIHdpdGggaW5kZXgsIGV4cGFuZGVkIHN0YXRlLCBhbmQgYXNzaWducyBhbiBpZCBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiBwYW5lbCB0byBzZXQgdXAuXG4gICAqIEBwYXJhbSBleHBhbmRlZCBFeHBhbmRlZCBzdGF0ZSBvZiBwYW5lbCdzIGFzc29jaWF0ZWQgYWNjb3JkaW9uIGl0ZW0uXG4gICAqL1xuICBzZXRVcFBhbmVsKGluZGV4OiBudW1iZXIsIGV4cGFuZGVkOiBib29sZWFuKSB7XG4gICAgLy8gYWxpZ25zIHBhbmVsIGluZGV4IGFuZCBleHBhbmRlZCB0byBhc3NvY2lhdGVkIGhlYWRpbmdcbiAgICB0aGlzLnBhbmVsc1tpbmRleF0uX2luZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5wYW5lbHNbaW5kZXhdLl9leHBhbmRlZCA9IGV4cGFuZGVkO1xuICAgIHRoaXMucGFuZWxzW2luZGV4XS5pZCA9IHRoaXMucGFuZWxzW2luZGV4XS5pZFxuICAgICAgPyB0aGlzLnBhbmVsc1tpbmRleF0uaWRcbiAgICAgIDogdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LWFjY29yZGlvbi1wYW5lbC0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGXCoHNldFVwQnV0dG9uwqBtZXRob2QgY29uZmlndXJlcyBhIGJ1dHRvbiB3aXRoIGlkLCBhcmlhLWNvbnRyb2xzLCBhcmlhLWV4cGFuZGVkIGF0dHJpYnV0ZXMsIGFuZCB0aGUgYXBwcm9wcmlhdGUgdG9nZ2xlIGljb24uXG4gICAqIEBwYXJhbSBidXR0b25IZWFkaW5nIEJ1dHRvbiB0byBzZXQgdXAuXG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiBidXR0b24gdG8gc2V0IHVwLlxuICAgKiBAcGFyYW0gZXhwYW5kZWQgRXhwYW5kZWQgc3RhdGUgb2YgYnV0dG9uJ3MgYXNzb2NpYXRlZCBhY2NvcmRpb24gaXRlbS5cbiAgICovXG4gIHNldFVwQnV0dG9uKGJ1dHRvbkhlYWRpbmc6IEJ1dHRvbkRpcmVjdGl2ZSwgaW5kZXg6IG51bWJlciwgZXhwYW5kZWQ6IGJvb2xlYW4pIHtcbiAgICAvLyBzZXRzIHVwIGNvbnRyb2xsaW5nIGJ1dHRvbidzIGFyaWEgcHJvcGVydGllc1xuICAgIGJ1dHRvbkhlYWRpbmcuaWQgPSBidXR0b25IZWFkaW5nLmlkID8gYnV0dG9uSGVhZGluZy5pZCA6IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1hY2NvcmRpb24tYnV0dG9uLScpO1xuICAgIGJ1dHRvbkhlYWRpbmcuYXJpYUNvbnRyb2xzID0gdGhpcy5wYW5lbHNbaW5kZXhdLmlkO1xuICAgIGJ1dHRvbkhlYWRpbmcuYXJpYUV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgaWYgKGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbikge1xuICAgICAgYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLmNsYXNzID0gW2J1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5jbGFzcywgJ3YtYWNjb3JkaW9uLXRvZ2dsZS1pY29uJ10uam9pbignICcpO1xuICAgICAgaWYgKCFidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uX2ljb25TZXQpIHtcbiAgICAgICAgaWYgKCFidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uX2V4cGFuZGVkU2V0KSBidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uZXhwYW5kZWRJY29uID0gJ2NoZXZyb24tZG93bic7XG4gICAgICAgIGlmICghYnV0dG9uSGVhZGluZy50b2dnbGVJY29uLl9jb2xsYXBzZWRTZXQpIGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5jb2xsYXBzZWRJY29uID0gJ2NoZXZyb24tcmlnaHQnO1xuICAgICAgICBidXR0b25IZWFkaW5nLnRvZ2dsZUljb24uaWNvbi5pY29uID0gZXhwYW5kZWRcbiAgICAgICAgICA/IGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5leHBhbmRlZEljb25cbiAgICAgICAgICA6IGJ1dHRvbkhlYWRpbmcudG9nZ2xlSWNvbi5jb2xsYXBzZWRJY29uO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnV0dG9uSGVhZGluZy50b2dnbGVJY29uQ29tcG9uZW50KSB7XG4gICAgICBidXR0b25IZWFkaW5nLnRvZ2dsZUljb25Db21wb25lbnQuX2FjY29yZGlvblRvZ2dsZSA9IHRydWU7XG4gICAgICBidXR0b25IZWFkaW5nLnRvZ2dsZUljb25Db21wb25lbnQucm90YXRlZCA9IGV4cGFuZGVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGXCoHRvZ2dsZUl0ZW3CoG1ldGhvZCByZXZlcnNlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYWNjb3JkaW9uLiBJZiBjb2xsYXBzZWQsIGl0IGV4cGFuZHM7IGlmIGV4cGFuZGVkLCBpdCBjb2xsYXBzZXMuIElmIGl0IHdhcyBjb2xsYXBzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGV4cGFuZC4gSWYgaXQgd2FzIGV4cGFuZGVkLCB0aGUgZnVuY3Rpb24gd2lsbCBjb2xsYXBzZS5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGFjY29yZGlvbiBpdGVtIHRvIHRvZ2dsZS5cbiAgICovXG4gIHRvZ2dsZUl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaXRlbXNbaW5kZXhdWydoZWFkaW5nJ10uZXhwYW5kZWQgPSAhdGhpcy5pdGVtc1tpbmRleF1bJ2hlYWRpbmcnXS5leHBhbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhwYW5kSXRlbSBtZXRob2QgZXhwYW5kcyB0aGUgYWNjb3JkaW9uIGJ5IHNob3dpbmcgcGFuZWwgY29udGVudCwgc2V0dGluZyB0aGUgYnV0dG9u4oCZcyBhcmlhLWV4cGFuZGVkIHRvIHRydWUsIGFuZCBjaGFuZ2luZyB0aGUgdG9nZ2xlIGljb24gdG8gZXhwYW5kZWRJY29uLlxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgYWNjb3JkaW9uIGl0ZW0gdG8gZXhwYW5kLlxuICAgKi9cbiAgZXhwYW5kSXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXRlbXNbaW5kZXhdKSB7XG4gICAgICB0aGlzLml0ZW1zW2luZGV4XVsncGFuZWwnXS5fZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLmFyaWFFeHBhbmRlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb24gJiYgIXRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLl9pY29uU2V0KSB7XG4gICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmljb24uaWNvbiA9IHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uLmV4cGFuZGVkSWNvbjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb25Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLnRvZ2dsZUljb25Db21wb25lbnQucm90YXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb2xsYXBzZUl0ZW0gbWV0aG9kIGNvbGxhcHNlcyB0aGUgYWNjb3JkaW9uIGJ5IGhpZGluZyBwYW5lbCBjb250ZW50LCBzZXR0aW5nIHRoZSBidXR0b27igJlzIGFyaWEtZXhwYW5kZWQgdG8gZmFsc2UsIGFuZCBjaGFuZ2luZyB0aGUgdG9nZ2xlIGljb24gdG8gY29sbGFwc2VkSWNvbi5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGFjY29yZGlvbiBpdGVtIHRvIGNvbGxhcHNlLlxuICAgKi9cbiAgY29sbGFwc2VJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pdGVtc1tpbmRleF0pIHtcbiAgICAgIHRoaXMuaXRlbXNbaW5kZXhdWydwYW5lbCddLl9leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pdGVtc1tpbmRleF1bJ2J1dHRvbiddLmFyaWFFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXRlbXNbaW5kZXhdWydidXR0b24nXS50b2dnbGVJY29uICYmICF0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbi5faWNvblNldCkge1xuICAgICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbi5pY29uLmljb24gPSB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbi5jb2xsYXBzZWRJY29uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLml0ZW1zW2luZGV4XVsnYnV0dG9uJ10udG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=