@nova-ui/bits
Version:
SolarWinds Nova Framework
121 lines • 17.2 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { Injectable } from "@angular/core";
import { SelectionModel } from "./public-api";
import { SelectorService } from "../lib/selector/selector.service";
import * as i0 from "@angular/core";
import * as i1 from "../lib/selector/selector.service";
export class ListService {
constructor(selectorService) {
this.selectorService = selectorService;
}
/**
* Updates the selector checkbox status, selector menu items, and the repeat selected items.
*
* @param {INovaFilteringOutputs} state The filtering outputs state
*
* @returns {INovaFilteringOutputs} The updated state
*/
updateSelectionState(state) {
const selection = new SelectionModel(state.selector?.selection ?? {});
const itemsSource = (state.repeat && state.repeat.itemsSource) || [];
const paginator = state.paginator || { total: undefined };
const selectedItems = this.selectorService.getSelectedItems(selection, itemsSource);
const outputState = {
...state,
repeat: {
itemsSource,
...state.repeat,
selectedItems,
},
selector: {
...state.selector,
selection,
selectorState: this.selectorService.getSelectorState(selection, itemsSource.length, selectedItems.length, paginator.total, selection.include.length),
},
};
return outputState;
}
/**
* Updates the selector selection state, selector checkbox status, selector menu items, and the
* selected items in the repeat based on the items in the provided list and the specified selection
* mode.
*
* @param {any[]} selectedItems The items to select
* @param {RepeatSelectionMode} selectionMode The mode to use for selection
* @param {INovaFilteringOutputs} state The filtering outputs state
*
* @returns {INovaFilteringOutputs} The updated state
*/
selectItems(selectedItems, selectionMode, state) {
if (!state.selector || !state.selector.selection) {
throw new Error("State must contain selector property");
}
if (!state.repeat) {
throw new Error("State must contain repeat property");
}
if (!state.paginator) {
throw new Error("State must contain paginator property");
}
const outputState = {
...state,
selector: {
...state.selector,
selection: this.selectorService.selectItems(state.selector.selection, selectedItems, state.repeat.itemsSource, selectionMode),
},
};
return this.updateSelectionState(outputState);
}
/**
* Updates the selector selection state, selector checkbox status, selector menu items, and the
* selected items in the repeat based on the selection type.
*
* @param {SelectionType} selectionType The selection type to apply
* @param {INovaFilteringOutputs} state The filtering outputs state
*
* @returns {INovaFilteringOutputs} The updated state
*/
applySelector(selectionType, state) {
if (!state.selector || !state.selector.selection) {
throw new Error("State must contain selector property");
}
if (!state.repeat) {
throw new Error("State must contain repeat property");
}
if (!state.paginator) {
throw new Error("State must contain paginator property");
}
const outputState = {
...state,
selector: {
...state.selector,
selection: this.selectorService.applySelector(state.selector.selection, state.repeat.itemsSource, selectionType, state.paginator.total),
},
};
return this.updateSelectionState(outputState);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListService, deps: [{ token: i1.SelectorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListService, decorators: [{
type: Injectable,
args: [{ providedIn: "root" }]
}], ctorParameters: () => [{ type: i1.SelectorService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2xpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBR25FLE1BQU0sT0FBTyxXQUFXO0lBQ3BCLFlBQW9CLGVBQWdDO1FBQWhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtJQUFHLENBQUM7SUFFeEQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CLENBQ3ZCLEtBQTRCO1FBRTVCLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBRTFELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdC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IExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgSU5vdmFGaWx0ZXJpbmdPdXRwdXRzIH0gZnJvbSBcIi4vZGF0YS1zb3VyY2UvcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5pbXBvcnQgeyBSZXBlYXRTZWxlY3Rpb25Nb2RlIH0gZnJvbSBcIi4uL2xpYi9yZXBlYXQvdHlwZXNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tIFwiLi4vbGliL3NlbGVjdG9yL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IFNlbGVjdG9yU2VydmljZSB9IGZyb20gXCIuLi9saWIvc2VsZWN0b3Ivc2VsZWN0b3Iuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgTGlzdFNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VsZWN0b3JTZXJ2aWNlOiBTZWxlY3RvclNlcnZpY2UpIHt9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3RvciBjaGVja2JveCBzdGF0dXMsIHNlbGVjdG9yIG1lbnUgaXRlbXMsIGFuZCB0aGUgcmVwZWF0IHNlbGVjdGVkIGl0ZW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJTm92YUZpbHRlcmluZ091dHB1dHN9IHN0YXRlIFRoZSBmaWx0ZXJpbmcgb3V0cHV0cyBzdGF0ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0lOb3ZhRmlsdGVyaW5nT3V0cHV0c30gVGhlIHVwZGF0ZWQgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlU2VsZWN0aW9uU3RhdGUoXG4gICAgICAgIHN0YXRlOiBJTm92YUZpbHRlcmluZ091dHB1dHNcbiAgICApOiBJTm92YUZpbHRlcmluZ091dHB1dHMge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWwoc3RhdGUuc2VsZWN0b3I/LnNlbGVjdGlvbiA/PyB7fSk7XG4gICAgICAgIGNvbnN0IGl0ZW1zU291cmNlID0gKHN0YXRlLnJlcGVhdCAmJiBzdGF0ZS5yZXBlYXQuaXRlbXNTb3VyY2UpIHx8IFtdO1xuICAgICAgICBjb25zdCBwYWdpbmF0b3IgPSBzdGF0ZS5wYWdpbmF0b3IgfHwgeyB0b3RhbDogdW5kZWZpbmVkIH07XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuc2VsZWN0b3JTZXJ2aWNlLmdldFNlbGVjdGVkSXRlbXMoXG4gICAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgICBpdGVtc1NvdXJjZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBvdXRwdXRTdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgcmVwZWF0OiB7XG4gICAgICAgICAgICAgICAgaXRlbXNTb3VyY2UsXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucmVwZWF0LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JTdGF0ZTogdGhpcy5zZWxlY3RvclNlcnZpY2UuZ2V0U2VsZWN0b3JTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpdGVtc1NvdXJjZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBwYWdpbmF0b3IudG90YWwsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5pbmNsdWRlLmxlbmd0aFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBvdXRwdXRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3RvciBzZWxlY3Rpb24gc3RhdGUsIHNlbGVjdG9yIGNoZWNrYm94IHN0YXR1cywgc2VsZWN0b3IgbWVudSBpdGVtcywgYW5kIHRoZVxuICAgICAqIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZXBlYXQgYmFzZWQgb24gdGhlIGl0ZW1zIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZCB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvblxuICAgICAqIG1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBzZWxlY3RlZEl0ZW1zIFRoZSBpdGVtcyB0byBzZWxlY3RcbiAgICAgKiBAcGFyYW0ge1JlcGVhdFNlbGVjdGlvbk1vZGV9IHNlbGVjdGlvbk1vZGUgVGhlIG1vZGUgdG8gdXNlIGZvciBzZWxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0lOb3ZhRmlsdGVyaW5nT3V0cHV0c30gc3RhdGUgVGhlIGZpbHRlcmluZyBvdXRwdXRzIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SU5vdmFGaWx0ZXJpbmdPdXRwdXRzfSBUaGUgdXBkYXRlZCBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtcyhcbiAgICAgICAgc2VsZWN0ZWRJdGVtczogYW55W10sXG4gICAgICAgIHNlbGVjdGlvbk1vZGU6IFJlcGVhdFNlbGVjdGlvbk1vZGUsXG4gICAgICAgIHN0YXRlOiBJTm92YUZpbHRlcmluZ091dHB1dHNcbiAgICApOiBJTm92YUZpbHRlcmluZ091dHB1dHMge1xuICAgICAgICBpZiAoIXN0YXRlLnNlbGVjdG9yIHx8ICFzdGF0ZS5zZWxlY3Rvci5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRlIG11c3QgY29udGFpbiBzZWxlY3RvciBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdGUucmVwZWF0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0ZSBtdXN0IGNvbnRhaW4gcmVwZWF0IHByb3BlcnR5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRlIG11c3QgY29udGFpbiBwYWdpbmF0b3IgcHJvcGVydHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRTdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHRoaXMuc2VsZWN0b3JTZXJ2aWNlLnNlbGVjdEl0ZW1zKFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rvci5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlcGVhdC5pdGVtc1NvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNlbGVjdGlvblN0YXRlKG91dHB1dFN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3RvciBzZWxlY3Rpb24gc3RhdGUsIHNlbGVjdG9yIGNoZWNrYm94IHN0YXR1cywgc2VsZWN0b3IgbWVudSBpdGVtcywgYW5kIHRoZVxuICAgICAqIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZXBlYXQgYmFzZWQgb24gdGhlIHNlbGVjdGlvbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZWxlY3Rpb25UeXBlfSBzZWxlY3Rpb25UeXBlIFRoZSBzZWxlY3Rpb24gdHlwZSB0byBhcHBseVxuICAgICAqIEBwYXJhbSB7SU5vdmFGaWx0ZXJpbmdPdXRwdXRzfSBzdGF0ZSBUaGUgZmlsdGVyaW5nIG91dHB1dHMgc3RhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtJTm92YUZpbHRlcmluZ091dHB1dHN9IFRoZSB1cGRhdGVkIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIGFwcGx5U2VsZWN0b3IoXG4gICAgICAgIHNlbGVjdGlvblR5cGU6IFNlbGVjdGlvblR5cGUsXG4gICAgICAgIHN0YXRlOiBJTm92YUZpbHRlcmluZ091dHB1dHNcbiAgICApOiBJTm92YUZpbHRlcmluZ091dHB1dHMge1xuICAgICAgICBpZiAoIXN0YXRlLnNlbGVjdG9yIHx8ICFzdGF0ZS5zZWxlY3Rvci5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRlIG11c3QgY29udGFpbiBzZWxlY3RvciBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3RhdGUucmVwZWF0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0ZSBtdXN0IGNvbnRhaW4gcmVwZWF0IHByb3BlcnR5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0YXRlIG11c3QgY29udGFpbiBwYWdpbmF0b3IgcHJvcGVydHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXRTdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHRoaXMuc2VsZWN0b3JTZXJ2aWNlLmFwcGx5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdG9yLnNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVwZWF0Lml0ZW1zU291cmNlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UeXBlLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYWdpbmF0b3IudG90YWxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVTZWxlY3Rpb25TdGF0ZShvdXRwdXRTdGF0ZSk7XG4gICAgfVxufVxuIl19