UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

137 lines 17.6 kB
// © 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 { DatePipe } from "@angular/common"; import { Injectable } from "@angular/core"; import has from "lodash/has"; import isArray from "lodash/isArray"; import isDate from "lodash/isDate"; import isEmpty from "lodash/isEmpty"; import isNumber from "lodash/isNumber"; import isString from "lodash/isString"; import isUndefined from "lodash/isUndefined"; import keys from "lodash/keys"; import startsWith from "lodash/startsWith"; import { LoggerService } from "./log-service"; import * as i0 from "@angular/core"; import * as i1 from "./log-service"; import * as i2 from "@angular/common"; /** * <example-url>./../examples/index.html#/common/search-service</example-url> */ /** * Service that provides searching algorithms. * * __Name :__ * Search service * */ /** * @ignore */ export class SearchService { /** * __Description :__ * Search the value on the items within the given properties. * * __Parameters :__ * * {any[]} items Items to search within. * * {string[]} properties Properties where the search is applied. If no property specified, search is * applied on all fields. * * {string|number|date} searchValue The searched value that is used as a string or string fragment. Empty * string returns the whole array. * * {string} [dateFormat="mediumDate"] The Angular date format that is used for searching on Date type * properties. * * return {any[]} Items resulted after the search. * */ constructor(logger, datePipe) { this.logger = logger; this.datePipe = datePipe; this.search = (items, properties, searchValue, dateFormat) => { // TODO: in case of interest, create options as object, put dateFormat in, put caseSensitive in if (!isArray(items)) { this.logger.error("nuiSearchService needs items parameter as an Array"); } if (!isArray(properties)) { this.logger.error("nuiSearchService needs properties parameter as an Array"); } if (isEmpty(properties)) { properties = this.getSearchableColumns(items); this.logger.warn("No properties specified to search on, so all of the fields will be used"); } if (isUndefined(searchValue)) { this.logger.warn("No searchValue specified to search by, the whole list will be the result"); return items; } return this.filterResults(items, properties, searchValue, dateFormat); }; this.getSearchableColumns = (items) => { const props = {}; for (const item of items) { keys(item).map((key) => { if (!startsWith(key, "$")) { props[key] = true; } }); } return keys(props); }; } filterResults(items, properties, searchValue, dateFormat) { return items.filter((item) => { if (isString(item) || isNumber(item)) { return this.filterPredicate(item, searchValue); } for (const prop of properties) { let value = has(item, prop) ? item[prop] : item; if (isDate(value)) { value = this.transformDate(value, dateFormat); } if (isDate(searchValue)) { searchValue = this.transformDate(searchValue, dateFormat); } if (value && this.filterPredicate(value, searchValue)) { return true; } } }); } transformDate(value, dateFormat) { return this.datePipe.transform(value, dateFormat); } filterPredicate(item, searchValue) { return (item .toString() .toLowerCase() .indexOf(searchValue.toString().toLowerCase()) !== -1); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService, deps: [{ token: i1.LoggerService }, { token: i2.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService, providedIn: "root" }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchService, decorators: [{ type: Injectable, args: [{ providedIn: "root" }] }], ctorParameters: () => [{ type: i1.LoggerService }, { type: i2.DatePipe }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvc2VhcmNoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxRQUFRLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sVUFBVSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFHOUM7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFDSDs7R0FFRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsWUFBb0IsTUFBcUIsRUFBVSxR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LFVBQThCO1FBRTlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxlQUFlLENBQUMsSUFBUyxFQUFFLFdBQWdCO1FBQ2pELE9BQU8sQ0FDSCxJQUFJO2FBQ0MsUUFBUSxFQUFFO2FBQ1YsV0FBVyxFQUFFO2FBQ2IsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUM1RCxDQUFDO0lBQ04sQ0FBQzsrR0FoR1EsYUFBYTttSEFBYixhQUFhLGNBREEsTUFBTTs7NEZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgaGFzIGZyb20gXCJsb2Rhc2gvaGFzXCI7XG5pbXBvcnQgaXNBcnJheSBmcm9tIFwibG9kYXNoL2lzQXJyYXlcIjtcbmltcG9ydCBpc0RhdGUgZnJvbSBcImxvZGFzaC9pc0RhdGVcIjtcbmltcG9ydCBpc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gXCJsb2Rhc2gvaXNOdW1iZXJcIjtcbmltcG9ydCBpc1N0cmluZyBmcm9tIFwibG9kYXNoL2lzU3RyaW5nXCI7XG5pbXBvcnQgaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IGtleXMgZnJvbSBcImxvZGFzaC9rZXlzXCI7XG5pbXBvcnQgc3RhcnRzV2l0aCBmcm9tIFwibG9kYXNoL3N0YXJ0c1dpdGhcIjtcblxuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gXCIuL2xvZy1zZXJ2aWNlXCI7XG5pbXBvcnQgeyBJU2VhcmNoU2VydmljZSB9IGZyb20gXCIuL3B1YmxpYy1hcGlcIjtcblxuLyoqXG4gKiA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9jb21tb24vc2VhcmNoLXNlcnZpY2U8L2V4YW1wbGUtdXJsPlxuICovXG5cbi8qKlxuICogIFNlcnZpY2UgdGhhdCBwcm92aWRlcyBzZWFyY2hpbmcgYWxnb3JpdGhtcy5cbiAqXG4gKiBfX05hbWUgOl9fXG4gKiBTZWFyY2ggc2VydmljZVxuICpcbiAqL1xuLyoqXG4gKiBAaWdub3JlXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgSVNlYXJjaFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqICBfX0Rlc2NyaXB0aW9uIDpfX1xuICAgICAqIFNlYXJjaCB0aGUgdmFsdWUgb24gdGhlIGl0ZW1zIHdpdGhpbiB0aGUgZ2l2ZW4gcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIF9fUGFyYW1ldGVycyA6X19cbiAgICAgKlxuICAgICAqIHthbnlbXX0gaXRlbXMgSXRlbXMgdG8gc2VhcmNoIHdpdGhpbi5cbiAgICAgKlxuICAgICAqICB7c3RyaW5nW119IHByb3BlcnRpZXMgUHJvcGVydGllcyB3aGVyZSB0aGUgc2VhcmNoIGlzIGFwcGxpZWQuIElmIG5vIHByb3BlcnR5IHNwZWNpZmllZCwgc2VhcmNoIGlzXG4gICAgICogIGFwcGxpZWQgb24gYWxsIGZpZWxkcy5cbiAgICAgKlxuICAgICAqICB7c3RyaW5nfG51bWJlcnxkYXRlfSBzZWFyY2hWYWx1ZSBUaGUgc2VhcmNoZWQgdmFsdWUgdGhhdCBpcyB1c2VkIGFzIGEgc3RyaW5nIG9yIHN0cmluZyBmcmFnbWVudC4gRW1wdHlcbiAgICAgKiAgc3RyaW5nIHJldHVybnMgdGhlIHdob2xlIGFycmF5LlxuICAgICAqXG4gICAgICogIHtzdHJpbmd9IFtkYXRlRm9ybWF0PVwibWVkaXVtRGF0ZVwiXSBUaGUgQW5ndWxhciBkYXRlIGZvcm1hdCB0aGF0IGlzIHVzZWQgZm9yIHNlYXJjaGluZyBvbiBEYXRlIHR5cGVcbiAgICAgKiAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICByZXR1cm4ge2FueVtdfSBJdGVtcyByZXN1bHRlZCBhZnRlciB0aGUgc2VhcmNoLlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlKSB7fVxuXG4gICAgcHVibGljIHNlYXJjaCA9IDxUPihcbiAgICAgICAgaXRlbXM6IFRbXSxcbiAgICAgICAgcHJvcGVydGllczogc3RyaW5nW10sXG4gICAgICAgIHNlYXJjaFZhbHVlOiBhbnksXG4gICAgICAgIGRhdGVGb3JtYXQ/OiBzdHJpbmdcbiAgICApOiBUW10gPT4ge1xuICAgICAgICAvLyBUT0RPOiBpbiBjYXNlIG9mIGludGVyZXN0LCBjcmVhdGUgb3B0aW9ucyBhcyBvYmplY3QsIHB1dCBkYXRlRm9ybWF0IGluLCBwdXQgY2FzZVNlbnNpdGl2ZSBpblxuICAgICAgICBpZiAoIWlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBcIm51aVNlYXJjaFNlcnZpY2UgbmVlZHMgaXRlbXMgcGFyYW1ldGVyIGFzIGFuIEFycmF5XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5KHByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBcIm51aVNlYXJjaFNlcnZpY2UgbmVlZHMgcHJvcGVydGllcyBwYXJhbWV0ZXIgYXMgYW4gQXJyYXlcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eShwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuZ2V0U2VhcmNoYWJsZUNvbHVtbnMoaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBcIk5vIHByb3BlcnRpZXMgc3BlY2lmaWVkIHRvIHNlYXJjaCBvbiwgc28gYWxsIG9mIHRoZSBmaWVsZHMgd2lsbCBiZSB1c2VkXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHNlYXJjaFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBcIk5vIHNlYXJjaFZhbHVlIHNwZWNpZmllZCB0byBzZWFyY2ggYnksIHRoZSB3aG9sZSBsaXN0IHdpbGwgYmUgdGhlIHJlc3VsdFwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyUmVzdWx0cyhpdGVtcywgcHJvcGVydGllcywgc2VhcmNoVmFsdWUsIGRhdGVGb3JtYXQpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgZmlsdGVyUmVzdWx0czxUPihcbiAgICAgICAgaXRlbXM6IFRbXSxcbiAgICAgICAgcHJvcGVydGllczogc3RyaW5nW10sXG4gICAgICAgIHNlYXJjaFZhbHVlOiBhbnksXG4gICAgICAgIGRhdGVGb3JtYXQ/OiBzdHJpbmdcbiAgICApOiBUW10ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcoaXRlbSkgfHwgaXNOdW1iZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJQcmVkaWNhdGUoaXRlbSwgc2VhcmNoVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBoYXMoaXRlbSwgcHJvcCkgPyAoaXRlbSBhcyBhbnkpW3Byb3BdIDogaXRlbTtcblxuICAgICAgICAgICAgICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy50cmFuc2Zvcm1EYXRlKHZhbHVlLCBkYXRlRm9ybWF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzRGF0ZShzZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLnRyYW5zZm9ybURhdGUoc2VhcmNoVmFsdWUsIGRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5maWx0ZXJQcmVkaWNhdGUodmFsdWUsIHNlYXJjaFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0cmFuc2Zvcm1EYXRlKFxuICAgICAgICB2YWx1ZTogRGF0ZSxcbiAgICAgICAgZGF0ZUZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgZGF0ZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbHRlclByZWRpY2F0ZShpdGVtOiBhbnksIHNlYXJjaFZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGl0ZW1cbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLmluZGV4T2Yoc2VhcmNoVmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSAhPT0gLTFcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U2VhcmNoYWJsZUNvbHVtbnMgPSAoaXRlbXM6IGFueVtdKTogc3RyaW5nW10gPT4ge1xuICAgICAgICBjb25zdCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBrZXlzKGl0ZW0pLm1hcCgoa2V5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoa2V5LCBcIiRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXMocHJvcHMpO1xuICAgIH07XG59XG4iXX0=