UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

210 lines 30.7 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 { Injectable } from '@angular/core'; import { AppReadyService } from '../_utilities/services/app-stable-check.service'; import { ComboboxFilterType } from './combobox.constants'; import * as i0 from "@angular/core"; import * as i1 from "../_utilities/services/app-stable-check.service"; /** * Service containing optional functions for the ComboboxDirective. */ export class ComboboxService { constructor(appReadyService) { this.appReadyService = appReadyService; } /** * The closeMenuOnItemClick method automatically closes the menu when an item is selected. <br /> * To keep the menu open after an item is selected, you must provide <code>[closeOnClick]="false"</code> to the combobox component. * @param combobox Combobox to apply behavior to. */ closeMenuOnItemClick(combobox) { combobox.listbox?.listItems?.forEach((item) => { item.clicked.subscribe(() => { combobox.floatingContainer?.floatingUIService?.hidefloatingUI(); }); }); // subscribe to changes in items and apply service function to these items as well combobox.listbox?.listItems?.changes.subscribe(() => { combobox.listbox?.listItems.forEach((item) => { item.clicked.subscribe(() => { combobox.floatingContainer?.floatingUIService?.hidefloatingUI(); }); }); }); } /** * The selectHighlightedOnMenuClose method selects the last highlighted item when the menu is closed. * This method is called by default within <code>autoSelectItem</code>. <br /> * @param combobox Combobox to apply behavior to. */ selectHighlightedOnMenuClose(combobox) { combobox.floatingContainer?.floatingUIService?.isShownEmitter.subscribe((isShown) => { if (!this.appReadyService.isBrowserAndDomAvailable()) return; // return if app is not ready to access nativeElement if (!isShown && combobox._lastHighlightedOnClose !== null) { combobox.selectItem(combobox._lastHighlightedOnClose); } }); } /** * The autoFilterDisplayedItems method automatically filters the items shown in the combobox on initial render. * If the items displayed on page load are not the full list you want to filter, please use a different function. This method filters items based on selection and input value changes. <br /> * To access the filtered list of <code>ListboxItemsDirective[]</code>, subscribe to the <code>filteredListEmitter</code>. * @param combobox Combobox to apply behavior to. */ autoFilterDisplayedItems(combobox) { if (!combobox.input || !combobox.listbox) return; let filteredListItems = []; // filter list with defaultValue if (combobox.value) { if (combobox.listbox?.multiselect) { combobox.value['value'].forEach((selectedValue) => { const selectedItem = combobox.initialListItems.find((item) => item.value === selectedValue); if (selectedItem) { filteredListItems.push(selectedItem); // combobox._prevActiveItem = selectedItem; } }); // don't update list on initial render for multiselect, only on input } else { const selectedItem = combobox.initialListItems.find((item) => item.value === combobox.value['value']); if (selectedItem) { filteredListItems.push(selectedItem); combobox._prevActiveItem = selectedItem; } this.updateList(combobox, filteredListItems); } } combobox.input.inputEvent.subscribe((value) => { if (!this.appReadyService.isBrowserAndDomAvailable()) return; // return if app is not ready to access nativeElement // input value filteredListItems = []; combobox.initialListItems.forEach((item) => { if (item.el.nativeElement.innerText.trim().toLowerCase().includes(value.toLowerCase())) { // keep item in list if it includes the input value filteredListItems.push(item); } }); this.updateList(combobox, filteredListItems); }); combobox.itemSelected.subscribe((value) => { if (combobox.listbox?.multiselect) { // reset list on multiselect when option is selected filteredListItems = combobox.initialListItems; // if (filteredListItems && filteredListItems.length > 0) // combobox._prevActiveItem = filteredListItems[filteredListItems.length - 1]; } else { // listbox item value filteredListItems = []; const selectedItem = combobox.initialListItems.find((item) => value?.includes(item.value)); if (selectedItem) { filteredListItems.push(selectedItem); combobox._prevActiveItem = selectedItem; } if (selectedItem) filteredListItems.push(selectedItem); } this.updateList(combobox, filteredListItems); }); } /** * The autoFilterBasedOnList method filters items in the combobox based on a specified list, which can differ from the initial list rendered. <br /> * This method allows customization of the filtering criteria, enabling you to filter items based on properties such as id, label, value, etc. To access the filtered list, subscribe to <code>the filteredListEmitter</code>, which emits the filtered list in the same shape as <code>fullList</code>. <br /> * This method is recommended over <code>autoFilterDisplayedItems</code> and can achieve the same functionality by calling <code>autoFilterBasedOnList(combobox, list, 'label')</code>. * @param combobox Combobox to apply filter function to. * @param fullList Full list of items to filter. * @param condition Condition on which to filter items in fullList (this would be a property you've provided to the items in fullList). */ autoFilterBasedOnList(combobox, fullList, condition) { const listData = fullList; let filteredData = fullList; if (!combobox) return; combobox.filter.subscribe((filterEvent) => { filteredData = []; if (filterEvent.type === ComboboxFilterType.SELECTION) { if (combobox.listbox?.multiselect) { filteredData = listData; // if (filteredData && filteredData.length > 0) combobox._prevActiveItem = filteredData[filteredData.length - 1]; } else { // if an item is selected, the list should only include that item filteredData = listData?.filter((item) => item[condition].toLowerCase() == filterEvent.input.toLowerCase()); if (filteredData && filteredData.length === 1) combobox._prevActiveItem = filteredData[0]; } } else if (filterEvent.type === ComboboxFilterType.INPUT) { listData.forEach((item) => { if (item[condition].toLowerCase().includes(filterEvent.input.toLowerCase())) filteredData.push(item); }); } else if (filterEvent.type === ComboboxFilterType.RESET) { filteredData = listData; } this.updateList(combobox, filteredData); }); } /** * The updateList method updates the combobox component with the given filtered list items, setting the active and highlighted index appropriately. <br /> * This method is called by default within <code>autoFilterDisplayedItems</code> and <code>autoFilterBasedOnList</code>. * @param combobox Combobox to update. * @param filteredListItems Filtered array of listbox items. */ updateList(combobox, filteredListItems) { if (combobox.listbox?.multiselect) { // reset multiselect keyboard traversal altogether combobox._activeIndex = null; combobox._highlightedIndex = null; } else if (combobox._prevActiveItem && filteredListItems.includes(combobox._prevActiveItem)) { combobox._activeIndex = filteredListItems.findIndex((item) => item === combobox._prevActiveItem); } else { combobox._activeIndex = null; combobox._highlightedIndex = null; } combobox.filteredListEmitter.emit(filteredListItems); } /** * The autoSelectItem method highlights the first list item based on user input. <br /> * This ensures that when the menu closes, if an input value was entered, an item is selected. * @param combobox Combobox to apply automatic selection to. */ autoSelectItem(combobox) { this.selectHighlightedOnMenuClose(combobox); combobox.input?.inputEvent.subscribe(() => { if (combobox.input.value) combobox.highlightIndex(0); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComboboxService, deps: [{ token: i1.AppReadyService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComboboxService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ComboboxService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.AppReadyService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9jb21ib2JveC9jb21ib2JveC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWxGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFHMUQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixZQUFvQixlQUFnQztRQUFoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFBRyxDQUFDO0lBQ3hEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxRQUEyQjtRQUM5QyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzFCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsa0ZBQWtGO1FBQ2xGLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xELFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQzFCLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsQ0FBQztn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TTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IExpc3Rib3hJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdGJveC1pdGVtL2xpc3Rib3gtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tYm9ib3hGaWx0ZXJUeXBlIH0gZnJvbSAnLi9jb21ib2JveC5jb25zdGFudHMnO1xuaW1wb3J0IHsgQ29tYm9ib3hEaXJlY3RpdmUgfSBmcm9tICcuL2NvbWJvYm94LmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogU2VydmljZSBjb250YWluaW5nIG9wdGlvbmFsIGZ1bmN0aW9ucyBmb3IgdGhlIENvbWJvYm94RGlyZWN0aXZlLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveFNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcFJlYWR5U2VydmljZTogQXBwUmVhZHlTZXJ2aWNlKSB7fVxuICAvKipcbiAgICogVGhlwqBjbG9zZU1lbnVPbkl0ZW1DbGlja8KgbWV0aG9kIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBtZW51IHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZC4gPGJyIC8+XG4gICAqIFRvIGtlZXAgdGhlIG1lbnUgb3BlbiBhZnRlciBhbiBpdGVtIGlzIHNlbGVjdGVkLCB5b3UgbXVzdCBwcm92aWRlIDxjb2RlPltjbG9zZU9uQ2xpY2tdPVwiZmFsc2VcIjwvY29kZT4gdG8gdGhlIGNvbWJvYm94IGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGNvbWJvYm94IENvbWJvYm94IHRvIGFwcGx5IGJlaGF2aW9yIHRvLlxuICAgKi9cbiAgY2xvc2VNZW51T25JdGVtQ2xpY2soY29tYm9ib3g6IENvbWJvYm94RGlyZWN0aXZlKSB7XG4gICAgY29tYm9ib3gubGlzdGJveD8ubGlzdEl0ZW1zPy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpdGVtLmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29tYm9ib3guZmxvYXRpbmdDb250YWluZXI/LmZsb2F0aW5nVUlTZXJ2aWNlPy5oaWRlZmxvYXRpbmdVSSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBzdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiBpdGVtcyBhbmQgYXBwbHkgc2VydmljZSBmdW5jdGlvbiB0byB0aGVzZSBpdGVtcyBhcyB3ZWxsXG4gICAgY29tYm9ib3gubGlzdGJveD8ubGlzdEl0ZW1zPy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb21ib2JveC5saXN0Ym94Py5saXN0SXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBjb21ib2JveC5mbG9hdGluZ0NvbnRhaW5lcj8uZmxvYXRpbmdVSVNlcnZpY2U/LmhpZGVmbG9hdGluZ1VJKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlwqBzZWxlY3RIaWdobGlnaHRlZE9uTWVudUNsb3NlwqBtZXRob2Qgc2VsZWN0cyB0aGUgbGFzdCBoaWdobGlnaHRlZCBpdGVtIHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgZGVmYXVsdCB3aXRoaW4gPGNvZGU+YXV0b1NlbGVjdEl0ZW08L2NvZGU+LiA8YnIgLz5cbiAgICogQHBhcmFtIGNvbWJvYm94IENvbWJvYm94IHRvIGFwcGx5IGJlaGF2aW9yIHRvLlxuICAgKi9cbiAgc2VsZWN0SGlnaGxpZ2h0ZWRPbk1lbnVDbG9zZShjb21ib2JveDogQ29tYm9ib3hEaXJlY3RpdmUpIHtcbiAgICBjb21ib2JveC5mbG9hdGluZ0NvbnRhaW5lcj8uZmxvYXRpbmdVSVNlcnZpY2U/LmlzU2hvd25FbWl0dGVyLnN1YnNjcmliZSgoaXNTaG93bikgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkgcmV0dXJuOyAvLyByZXR1cm4gaWYgYXBwIGlzIG5vdCByZWFkeSB0byBhY2Nlc3MgbmF0aXZlRWxlbWVudFxuICAgICAgaWYgKCFpc1Nob3duICYmIGNvbWJvYm94Ll9sYXN0SGlnaGxpZ2h0ZWRPbkNsb3NlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbWJvYm94LnNlbGVjdEl0ZW0oY29tYm9ib3guX2xhc3RIaWdobGlnaHRlZE9uQ2xvc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgYXV0b0ZpbHRlckRpc3BsYXllZEl0ZW1zwqBtZXRob2QgYXV0b21hdGljYWxseSBmaWx0ZXJzIHRoZSBpdGVtcyBzaG93biBpbiB0aGUgY29tYm9ib3ggb24gaW5pdGlhbCByZW5kZXIuXG4gICAqIElmIHRoZSBpdGVtcyBkaXNwbGF5ZWQgb24gcGFnZSBsb2FkIGFyZSBub3QgdGhlIGZ1bGwgbGlzdCB5b3Ugd2FudCB0byBmaWx0ZXIsIHBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24uIFRoaXMgbWV0aG9kIGZpbHRlcnMgaXRlbXMgYmFzZWQgb24gc2VsZWN0aW9uIGFuZCBpbnB1dCB2YWx1ZSBjaGFuZ2VzLiA8YnIgLz5cbiAgICogVG8gYWNjZXNzIHRoZSBmaWx0ZXJlZCBsaXN0IG9mwqA8Y29kZT5MaXN0Ym94SXRlbXNEaXJlY3RpdmVbXTwvY29kZT4sIHN1YnNjcmliZSB0byB0aGUgPGNvZGU+ZmlsdGVyZWRMaXN0RW1pdHRlcjwvY29kZT4uXG4gICAqIEBwYXJhbSBjb21ib2JveCBDb21ib2JveCB0byBhcHBseSBiZWhhdmlvciB0by5cbiAgICovXG4gIGF1dG9GaWx0ZXJEaXNwbGF5ZWRJdGVtcyhjb21ib2JveDogQ29tYm9ib3hEaXJlY3RpdmUpIHtcbiAgICBpZiAoIWNvbWJvYm94LmlucHV0IHx8ICFjb21ib2JveC5saXN0Ym94KSByZXR1cm47XG4gICAgbGV0IGZpbHRlcmVkTGlzdEl0ZW1zOiBMaXN0Ym94SXRlbUNvbXBvbmVudFtdID0gW107XG5cbiAgICAvLyBmaWx0ZXIgbGlzdCB3aXRoIGRlZmF1bHRWYWx1ZVxuICAgIGlmIChjb21ib2JveC52YWx1ZSkge1xuICAgICAgaWYgKGNvbWJvYm94Lmxpc3Rib3g/Lm11bHRpc2VsZWN0KSB7XG4gICAgICAgIGNvbWJvYm94LnZhbHVlWyd2YWx1ZSddLmZvckVhY2goKHNlbGVjdGVkVmFsdWU6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGNvbWJvYm94LmluaXRpYWxMaXN0SXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgICAgZmlsdGVyZWRMaXN0SXRlbXMucHVzaChzZWxlY3RlZEl0ZW0pO1xuICAgICAgICAgICAgLy8gY29tYm9ib3guX3ByZXZBY3RpdmVJdGVtID0gc2VsZWN0ZWRJdGVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRvbid0IHVwZGF0ZSBsaXN0IG9uIGluaXRpYWwgcmVuZGVyIGZvciBtdWx0aXNlbGVjdCwgb25seSBvbiBpbnB1dFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gY29tYm9ib3guaW5pdGlhbExpc3RJdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBjb21ib2JveC52YWx1ZVsndmFsdWUnXSk7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICBmaWx0ZXJlZExpc3RJdGVtcy5wdXNoKHNlbGVjdGVkSXRlbSk7XG4gICAgICAgICAgY29tYm9ib3guX3ByZXZBY3RpdmVJdGVtID0gc2VsZWN0ZWRJdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlTGlzdChjb21ib2JveCwgZmlsdGVyZWRMaXN0SXRlbXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbWJvYm94LmlucHV0LmlucHV0RXZlbnQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkgcmV0dXJuOyAvLyByZXR1cm4gaWYgYXBwIGlzIG5vdCByZWFkeSB0byBhY2Nlc3MgbmF0aXZlRWxlbWVudFxuICAgICAgLy8gaW5wdXQgdmFsdWVcbiAgICAgIGZpbHRlcmVkTGlzdEl0ZW1zID0gW107XG4gICAgICBjb21ib2JveC5pbml0aWFsTGlzdEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uZWwubmF0aXZlRWxlbWVudC5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAvLyBrZWVwIGl0ZW0gaW4gbGlzdCBpZiBpdCBpbmNsdWRlcyB0aGUgaW5wdXQgdmFsdWVcbiAgICAgICAgICBmaWx0ZXJlZExpc3RJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlTGlzdChjb21ib2JveCwgZmlsdGVyZWRMaXN0SXRlbXMpO1xuICAgIH0pO1xuXG4gICAgY29tYm9ib3guaXRlbVNlbGVjdGVkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIGlmIChjb21ib2JveC5saXN0Ym94Py5tdWx0aXNlbGVjdCkge1xuICAgICAgICAvLyByZXNldCBsaXN0IG9uIG11bHRpc2VsZWN0IHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkXG4gICAgICAgIGZpbHRlcmVkTGlzdEl0ZW1zID0gY29tYm9ib3guaW5pdGlhbExpc3RJdGVtcztcbiAgICAgICAgLy8gaWYgKGZpbHRlcmVkTGlzdEl0ZW1zICYmIGZpbHRlcmVkTGlzdEl0ZW1zLmxlbmd0aCA+IDApXG4gICAgICAgIC8vICAgY29tYm9ib3guX3ByZXZBY3RpdmVJdGVtID0gZmlsdGVyZWRMaXN0SXRlbXNbZmlsdGVyZWRMaXN0SXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsaXN0Ym94IGl0ZW0gdmFsdWVcbiAgICAgICAgZmlsdGVyZWRMaXN0SXRlbXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gY29tYm9ib3guaW5pdGlhbExpc3RJdGVtcy5maW5kKChpdGVtKSA9PlxuICAgICAgICAgICh2YWx1ZSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKT8uaW5jbHVkZXMoaXRlbS52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgIGZpbHRlcmVkTGlzdEl0ZW1zLnB1c2goc2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICBjb21ib2JveC5fcHJldkFjdGl2ZUl0ZW0gPSBzZWxlY3RlZEl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSkgZmlsdGVyZWRMaXN0SXRlbXMucHVzaChzZWxlY3RlZEl0ZW0pO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVMaXN0KGNvbWJvYm94LCBmaWx0ZXJlZExpc3RJdGVtcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlwqBhdXRvRmlsdGVyQmFzZWRPbkxpc3TCoG1ldGhvZCBmaWx0ZXJzIGl0ZW1zIGluIHRoZSBjb21ib2JveCBiYXNlZCBvbiBhIHNwZWNpZmllZCBsaXN0LCB3aGljaCBjYW4gZGlmZmVyIGZyb20gdGhlIGluaXRpYWwgbGlzdCByZW5kZXJlZC4gPGJyIC8+XG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHRoZSBmaWx0ZXJpbmcgY3JpdGVyaWEsIGVuYWJsaW5nIHlvdSB0byBmaWx0ZXIgaXRlbXMgYmFzZWQgb24gcHJvcGVydGllcyBzdWNoIGFzIGlkLCBsYWJlbCwgdmFsdWUsIGV0Yy4gVG8gYWNjZXNzIHRoZSBmaWx0ZXJlZCBsaXN0LCBzdWJzY3JpYmUgdG8gPGNvZGU+dGhlwqBmaWx0ZXJlZExpc3RFbWl0dGVyPC9jb2RlPiwgd2hpY2ggZW1pdHMgdGhlIGZpbHRlcmVkIGxpc3QgaW4gdGhlIHNhbWUgc2hhcGUgYXMgPGNvZGU+ZnVsbExpc3Q8L2NvZGU+LiA8YnIgLz5cbiAgICogVGhpcyBtZXRob2QgaXMgcmVjb21tZW5kZWQgb3ZlciA8Y29kZT5hdXRvRmlsdGVyRGlzcGxheWVkSXRlbXM8L2NvZGU+IGFuZCBjYW4gYWNoaWV2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGJ5IGNhbGxpbmcgPGNvZGU+YXV0b0ZpbHRlckJhc2VkT25MaXN0KGNvbWJvYm94LCBsaXN0LCAnbGFiZWwnKTwvY29kZT4uXG4gICAqIEBwYXJhbSBjb21ib2JveCBDb21ib2JveCB0byBhcHBseSBmaWx0ZXIgZnVuY3Rpb24gdG8uXG4gICAqIEBwYXJhbSBmdWxsTGlzdCBGdWxsIGxpc3Qgb2YgaXRlbXMgdG8gZmlsdGVyLlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIENvbmRpdGlvbiBvbiB3aGljaCB0byBmaWx0ZXIgaXRlbXMgaW4gZnVsbExpc3QgKHRoaXMgd291bGQgYmUgYSBwcm9wZXJ0eSB5b3UndmUgcHJvdmlkZWQgdG8gdGhlIGl0ZW1zIGluIGZ1bGxMaXN0KS5cbiAgICovXG4gIGF1dG9GaWx0ZXJCYXNlZE9uTGlzdChjb21ib2JveDogQ29tYm9ib3hEaXJlY3RpdmUsIGZ1bGxMaXN0OiBhbnlbXSwgY29uZGl0aW9uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0RGF0YSA9IGZ1bGxMaXN0O1xuICAgIGxldCBmaWx0ZXJlZERhdGE6IGFueVtdID0gZnVsbExpc3Q7XG5cbiAgICBpZiAoIWNvbWJvYm94KSByZXR1cm47XG5cbiAgICBjb21ib2JveC5maWx0ZXIuc3Vic2NyaWJlKChmaWx0ZXJFdmVudCkgPT4ge1xuICAgICAgZmlsdGVyZWREYXRhID0gW107XG4gICAgICBpZiAoZmlsdGVyRXZlbnQudHlwZSA9PT0gQ29tYm9ib3hGaWx0ZXJUeXBlLlNFTEVDVElPTikge1xuICAgICAgICBpZiAoY29tYm9ib3gubGlzdGJveD8ubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBsaXN0RGF0YTtcbiAgICAgICAgICAvLyBpZiAoZmlsdGVyZWREYXRhICYmIGZpbHRlcmVkRGF0YS5sZW5ndGggPiAwKSBjb21ib2JveC5fcHJldkFjdGl2ZUl0ZW0gPSBmaWx0ZXJlZERhdGFbZmlsdGVyZWREYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIGFuIGl0ZW0gaXMgc2VsZWN0ZWQsIHRoZSBsaXN0IHNob3VsZCBvbmx5IGluY2x1ZGUgdGhhdCBpdGVtXG4gICAgICAgICAgZmlsdGVyZWREYXRhID0gbGlzdERhdGE/LmZpbHRlcigoaXRlbSkgPT4gaXRlbVtjb25kaXRpb25dLnRvTG93ZXJDYXNlKCkgPT0gZmlsdGVyRXZlbnQuaW5wdXQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkRGF0YSAmJiBmaWx0ZXJlZERhdGEubGVuZ3RoID09PSAxKSBjb21ib2JveC5fcHJldkFjdGl2ZUl0ZW0gPSBmaWx0ZXJlZERhdGFbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyRXZlbnQudHlwZSA9PT0gQ29tYm9ib3hGaWx0ZXJUeXBlLklOUFVUKSB7XG4gICAgICAgIGxpc3REYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbVtjb25kaXRpb25dLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyRXZlbnQuaW5wdXQudG9Mb3dlckNhc2UoKSkpIGZpbHRlcmVkRGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyRXZlbnQudHlwZSA9PT0gQ29tYm9ib3hGaWx0ZXJUeXBlLlJFU0VUKSB7XG4gICAgICAgIGZpbHRlcmVkRGF0YSA9IGxpc3REYXRhO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVMaXN0KGNvbWJvYm94LCBmaWx0ZXJlZERhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZcKgdXBkYXRlTGlzdMKgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbWJvYm94IGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlbiBmaWx0ZXJlZCBsaXN0IGl0ZW1zLFxuICAgc2V0dGluZyB0aGUgYWN0aXZlIGFuZCBoaWdobGlnaHRlZCBpbmRleCBhcHByb3ByaWF0ZWx5LiA8YnIgLz5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGRlZmF1bHQgd2l0aGluIDxjb2RlPmF1dG9GaWx0ZXJEaXNwbGF5ZWRJdGVtczwvY29kZT4gYW5kIDxjb2RlPmF1dG9GaWx0ZXJCYXNlZE9uTGlzdDwvY29kZT4uXG4gICAqIEBwYXJhbSBjb21ib2JveCBDb21ib2JveCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBmaWx0ZXJlZExpc3RJdGVtcyBGaWx0ZXJlZCBhcnJheSBvZiBsaXN0Ym94IGl0ZW1zLlxuICAgKi9cbiAgdXBkYXRlTGlzdChjb21ib2JveDogQ29tYm9ib3hEaXJlY3RpdmUsIGZpbHRlcmVkTGlzdEl0ZW1zOiBMaXN0Ym94SXRlbUNvbXBvbmVudFtdKSB7XG4gICAgaWYgKGNvbWJvYm94Lmxpc3Rib3g/Lm11bHRpc2VsZWN0KSB7XG4gICAgICAvLyByZXNldCBtdWx0aXNlbGVjdCBrZXlib2FyZCB0cmF2ZXJzYWwgYWx0b2dldGhlclxuICAgICAgY29tYm9ib3guX2FjdGl2ZUluZGV4ID0gbnVsbDtcbiAgICAgIGNvbWJvYm94Ll9oaWdobGlnaHRlZEluZGV4ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNvbWJvYm94Ll9wcmV2QWN0aXZlSXRlbSAmJiBmaWx0ZXJlZExpc3RJdGVtcy5pbmNsdWRlcyhjb21ib2JveC5fcHJldkFjdGl2ZUl0ZW0pKSB7XG4gICAgICBjb21ib2JveC5fYWN0aXZlSW5kZXggPSBmaWx0ZXJlZExpc3RJdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0gPT09IGNvbWJvYm94Ll9wcmV2QWN0aXZlSXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJvYm94Ll9hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICBjb21ib2JveC5faGlnaGxpZ2h0ZWRJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgY29tYm9ib3guZmlsdGVyZWRMaXN0RW1pdHRlci5lbWl0KGZpbHRlcmVkTGlzdEl0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGXCoGF1dG9TZWxlY3RJdGVtwqBtZXRob2QgaGlnaGxpZ2h0cyB0aGUgZmlyc3QgbGlzdCBpdGVtIGJhc2VkIG9uIHVzZXIgaW5wdXQuIDxiciAvPlxuICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIHRoZSBtZW51IGNsb3NlcywgaWYgYW4gaW5wdXQgdmFsdWUgd2FzIGVudGVyZWQsIGFuIGl0ZW0gaXMgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBjb21ib2JveCBDb21ib2JveCB0byBhcHBseSBhdXRvbWF0aWMgc2VsZWN0aW9uIHRvLlxuICAgKi9cbiAgYXV0b1NlbGVjdEl0ZW0oY29tYm9ib3g6IENvbWJvYm94RGlyZWN0aXZlKSB7XG4gICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZE9uTWVudUNsb3NlKGNvbWJvYm94KTtcblxuICAgIGNvbWJvYm94LmlucHV0Py5pbnB1dEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoY29tYm9ib3guaW5wdXQudmFsdWUpIGNvbWJvYm94LmhpZ2hsaWdodEluZGV4KDApO1xuICAgIH0pO1xuICB9XG59XG4iXX0=