@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
129 lines • 18.5 kB
JavaScript
import { Injectable, InjectFlags } from '@angular/core';
import { ConfigChunk, deepMerge, DefaultConfigChunk, } from '@spartacus/core';
import { defer, of } from 'rxjs';
import { map, shareReplay } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
/**
* Service responsible for resolving cms config based feature modules.
*/
export class CmsFeaturesService {
constructor(configInitializer, featureModules) {
this.configInitializer = configInitializer;
this.featureModules = featureModules;
// maps componentType to feature
this.componentFeatureMap = new Map();
/*
* Contains either FeatureInstance or FeatureInstance resolver for not yet
* resolved feature modules
*/
this.featureInstances = new Map();
this.initFeatureMap();
}
initFeatureMap() {
this.configInitializer
.getStable('featureModules')
.subscribe((config) => {
var _a, _b;
this.featureModulesConfig = (_a = config.featureModules) !== null && _a !== void 0 ? _a : {};
for (const [featureName, featureConfig] of Object.entries(this.featureModulesConfig)) {
if (typeof featureConfig !== 'string' &&
(featureConfig === null || featureConfig === void 0 ? void 0 : featureConfig.module) &&
((_b = featureConfig === null || featureConfig === void 0 ? void 0 : featureConfig.cmsComponents) === null || _b === void 0 ? void 0 : _b.length)) {
for (const component of featureConfig.cmsComponents) {
this.componentFeatureMap.set(component, featureName);
}
}
}
});
}
/**
* Check if there is feature module configuration that covers specified
* component type
*/
hasFeatureFor(componentType) {
return this.componentFeatureMap.has(componentType);
}
/**
* Return full CmsComponent mapping defined in feature module
*/
getCmsMapping(componentType) {
const feature = this.componentFeatureMap.get(componentType);
if (!feature) {
return of(undefined);
}
return this.resolveFeatureInstance(feature).pipe(map((featureInstance) => { var _a; return (_a = featureInstance.componentsMappings) === null || _a === void 0 ? void 0 : _a[componentType]; }));
}
/**
* Resolves feature module for provided component type
*
* @param componentType
*/
getModule(componentType) {
var _a;
const feature = this.componentFeatureMap.get(componentType);
if (!feature) {
return undefined;
}
let module;
// we are returning injectors only for already resolved features
(_a = this.featureInstances
.get(feature)) === null || _a === void 0 ? void 0 : _a.subscribe((featureInstance) => {
module = featureInstance.moduleRef;
}).unsubscribe();
return module;
}
/**
* Resolve feature based on feature name, if feature was not yet resolved
*
* It will first resolve all module dependencies if defined
*/
resolveFeatureInstance(featureName) {
return defer(() => {
if (!this.featureInstances.has(featureName)) {
this.featureInstances.set(featureName, this.featureModules.resolveFeature(featureName).pipe(map((moduleRef) => this.createFeatureInstance(moduleRef, featureName)), shareReplay()));
}
return this.featureInstances.get(featureName);
});
}
/**
* Create feature instance from feature's moduleRef
*/
createFeatureInstance(moduleRef, feature) {
var _a, _b, _c;
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const featureConfig = this.featureModulesConfig[feature];
const featureInstance = {
moduleRef,
componentsMappings: {},
};
// resolve configuration for feature module
const resolvedConfiguration = this.resolveFeatureConfiguration(moduleRef.injector);
// extract cms components configuration from feature config
for (const componentType of (_a = featureConfig.cmsComponents) !== null && _a !== void 0 ? _a : []) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
featureInstance.componentsMappings[componentType] =
(_c = (_b = resolvedConfiguration.cmsComponents) === null || _b === void 0 ? void 0 : _b[componentType]) !== null && _c !== void 0 ? _c : {};
}
return featureInstance;
}
/**
* Returns configuration provided in feature module
*/
resolveFeatureConfiguration(featureInjector) {
// get config chunks from feature lib
const featureConfigChunks = featureInjector.get(ConfigChunk, [], InjectFlags.Self);
// get default config chunks from feature lib
const featureDefaultConfigChunks = featureInjector.get(DefaultConfigChunk, [], InjectFlags.Self);
return deepMerge({}, ...(featureDefaultConfigChunks !== null && featureDefaultConfigChunks !== void 0 ? featureDefaultConfigChunks : []), ...(featureConfigChunks !== null && featureConfigChunks !== void 0 ? featureConfigChunks : []));
}
}
CmsFeaturesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsFeaturesService, deps: [{ token: i1.ConfigInitializerService }, { token: i1.FeatureModulesService }], target: i0.ɵɵFactoryTarget.Injectable });
CmsFeaturesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsFeaturesService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CmsFeaturesService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.ConfigInitializerService }, { type: i1.FeatureModulesService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21zLWZlYXR1cmVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL2Ntcy1zdHJ1Y3R1cmUvc2VydmljZXMvY21zLWZlYXR1cmVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxXQUFXLEVBRVgsU0FBUyxFQUNULGtCQUFrQixHQUduQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU9sRDs7R0FFRztBQUlILE1BQU0sT0FBTyxrQkFBa0I7SUFnQjdCLFlBQ1ksaUJBQTJDLEVBQzNDLGNBQXFDO1FBRHJDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDM0MsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBWmpELGdDQUFnQztRQUN4Qix3QkFBbUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUU3RDs7O1dBR0c7UUFDSyxxQkFBZ0IsR0FDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQU1WLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsaUJBQWlCO2FBQ25CLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQzthQUMzQixTQUFTLENBQUMsQ0FBQyxNQUFpQixFQUFFLEVBQUU7O1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFBLE1BQU0sQ0FBQyxjQUFjLG1DQUFJLEVBQUUsQ0FBQztZQUV4RCxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8s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QzNDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUM1RCxTQUFTLENBQUMsUUFBUSxDQUNuQixDQUFDO1FBRUYsMkRBQTJEO1FBQzNELEtBQUssTUFBTSxhQUFhLElBQUksTUFBQSxhQUFhLENBQUMsYUFBYSxtQ0FBSSxFQUFFLEVBQUU7WUFDN0Qsb0VBQW9FO1lBQ3BFLGVBQWUsQ0FBQyxrQkFBbUIsQ0FBQyxhQUFhLENBQUM7Z0JBQ2hELE1BQUEsTUFBQSxxQkFBcUIsQ0FBQyxhQUFhLDBDQUFHLGFBQWEsQ0FBQyxtQ0FBSSxFQUFFLENBQUM7U0FDOUQ7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSywyQkFBMkIsQ0FBQyxlQUF5QjtRQUMzRCxxQ0FBcUM7UUFDckMsTUFBTSxtQkFBbUIsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUM3QyxXQUFXLEVBQ1gsRUFBRSxFQUNGLFdBQVcsQ0FBQyxJQUFJLENBQ2pCLENBQUM7UUFDRiw2Q0FBNkM7UUFDN0MsTUFBTSwwQkFBMEIsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUNwRCxrQkFBa0IsRUFDbEIsRUFBRSxFQUNGLFdBQVcsQ0FBQyxJQUFJLENBQ2pCLENBQUM7UUFFRixPQUFPLFNBQVMsQ0FDZCxFQUFFLEVBQ0YsR0FBRyxDQUFDLDBCQUEwQixhQUExQiwwQkFBMEIsY0FBMUIsMEJBQTBCLEdBQUksRUFBRSxDQUFDLEVBQ3JDLEdBQUcsQ0FBQyxtQkFBbUIsYUFBbkIsbUJBQW1CLGNBQW5CLG1CQUFtQixHQUFJLEVBQUUsQ0FBQyxDQUNsQixDQUFDO0lBQ2pCLENBQUM7OytHQTlLVSxrQkFBa0I7bUhBQWxCLGtCQUFrQixjQUZqQixNQUFNOzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RGbGFncywgSW5qZWN0b3IsIE5nTW9kdWxlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDTVNDb21wb25lbnRDb25maWcsXG4gIENtc0NvbXBvbmVudE1hcHBpbmcsXG4gIENtc0NvbmZpZyxcbiAgQ29uZmlnQ2h1bmssXG4gIENvbmZpZ0luaXRpYWxpemVyU2VydmljZSxcbiAgZGVlcE1lcmdlLFxuICBEZWZhdWx0Q29uZmlnQ2h1bmssXG4gIEZlYXR1cmVNb2R1bGVDb25maWcsXG4gIEZlYXR1cmVNb2R1bGVzU2VydmljZSxcbn0gZnJvbSAnQHNwYXJ0YWN1cy9jb3JlJztcbmltcG9ydCB7IGRlZmVyLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIEZlYXR1cmVJbnN0YW5jZSBleHRlbmRzIEZlYXR1cmVNb2R1bGVDb25maWcge1xuICBtb2R1bGVSZWY/OiBOZ01vZHVsZVJlZjxhbnk+O1xuICBjb21wb25lbnRzTWFwcGluZ3M/OiBDTVNDb21wb25lbnRDb25maWc7XG59XG5cbi8qKlxuICogU2VydmljZSByZXNwb25zaWJsZSBmb3IgcmVzb2x2aW5nIGNtcyBjb25maWcgYmFzZWQgZmVhdHVyZSBtb2R1bGVzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ21zRmVhdHVyZXNTZXJ2aWNlIHtcbiAgLy8gZmVhdHVyZSBtb2R1bGVzIGNvbmZpZ3VyYXRpb25cbiAgcHJpdmF0ZSBmZWF0dXJlTW9kdWxlc0NvbmZpZz86IHtcbiAgICBbZmVhdHVyZU5hbWU6IHN0cmluZ106IEZlYXR1cmVNb2R1bGVDb25maWcgfCBzdHJpbmc7XG4gIH07XG5cbiAgLy8gbWFwcyBjb21wb25lbnRUeXBlIHRvIGZlYXR1cmVcbiAgcHJpdmF0ZSBjb21wb25lbnRGZWF0dXJlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIC8qXG4gICAqIENvbnRhaW5zIGVpdGhlciBGZWF0dXJlSW5zdGFuY2Ugb3IgRmVhdHVyZUluc3RhbmNlIHJlc29sdmVyIGZvciBub3QgeWV0XG4gICAqIHJlc29sdmVkIGZlYXR1cmUgbW9kdWxlc1xuICAgKi9cbiAgcHJpdmF0ZSBmZWF0dXJlSW5zdGFuY2VzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPEZlYXR1cmVJbnN0YW5jZT4+ID1cbiAgICBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbmZpZ0luaXRpYWxpemVyOiBDb25maWdJbml0aWFsaXplclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGZlYXR1cmVNb2R1bGVzOiBGZWF0dXJlTW9kdWxlc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pbml0RmVhdHVyZU1hcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RmVhdHVyZU1hcCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ0luaXRpYWxpemVyXG4gICAgICAuZ2V0U3RhYmxlKCdmZWF0dXJlTW9kdWxlcycpXG4gICAgICAuc3Vic2NyaWJlKChjb25maWc6IENtc0NvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmZlYXR1cmVNb2R1bGVzQ29uZmlnID0gY29uZmlnLmZlYXR1cmVNb2R1bGVzID8/IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ZlYXR1cmVOYW1lLCBmZWF0dXJlQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB0aGlzLmZlYXR1cmVNb2R1bGVzQ29uZmlnXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZmVhdHVyZUNvbmZpZyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIGZlYXR1cmVDb25maWc/Lm1vZHVsZSAmJlxuICAgICAgICAgICAgZmVhdHVyZUNvbmZpZz8uY21zQ29tcG9uZW50cz8ubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBmZWF0dXJlQ29uZmlnLmNtc0NvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGZWF0dXJlTWFwLnNldChjb21wb25lbnQsIGZlYXR1cmVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlIGlzIGZlYXR1cmUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjb3ZlcnMgc3BlY2lmaWVkXG4gICAqIGNvbXBvbmVudCB0eXBlXG4gICAqL1xuICBoYXNGZWF0dXJlRm9yKGNvbXBvbmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZlYXR1cmVNYXAuaGFzKGNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBmdWxsIENtc0NvbXBvbmVudCBtYXBwaW5nIGRlZmluZWQgaW4gZmVhdHVyZSBtb2R1bGVcbiAgICovXG4gIGdldENtc01hcHBpbmcoXG4gICAgY29tcG9uZW50VHlwZTogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8Q21zQ29tcG9uZW50TWFwcGluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmNvbXBvbmVudEZlYXR1cmVNYXAuZ2V0KGNvbXBvbmVudFR5cGUpO1xuXG4gICAgaWYgKCFmZWF0dXJlKSB7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlRmVhdHVyZUluc3RhbmNlKGZlYXR1cmUpLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChmZWF0dXJlSW5zdGFuY2UpID0+IGZlYXR1cmVJbnN0YW5jZS5jb21wb25lbnRzTWFwcGluZ3M/Lltjb21wb25lbnRUeXBlXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgZmVhdHVyZSBtb2R1bGUgZm9yIHByb3ZpZGVkIGNvbXBvbmVudCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlXG4gICAqL1xuICBnZXRNb2R1bGUoY29tcG9uZW50VHlwZTogc3RyaW5nKTogTmdNb2R1bGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuY29tcG9uZW50RmVhdHVyZU1hcC5nZXQoY29tcG9uZW50VHlwZSk7XG5cbiAgICBpZiAoIWZlYXR1cmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IG1vZHVsZTtcblxuICAgIC8vIHdlIGFyZSByZXR1cm5pbmcgaW5qZWN0b3JzIG9ubHkgZm9yIGFscmVhZHkgcmVzb2x2ZWQgZmVhdHVyZXNcbiAgICB0aGlzLmZlYXR1cmVJbnN0YW5jZXNcbiAgICAgIC5nZXQoZmVhdHVyZSlcbiAgICAgID8uc3Vic2NyaWJlKChmZWF0dXJlSW5zdGFuY2UpID0+IHtcbiAgICAgICAgbW9kdWxlID0gZmVhdHVyZUluc3RhbmNlLm1vZHVsZVJlZjtcbiAgICAgIH0pXG4gICAgICAudW5zdWJzY3JpYmUoKTtcbiAgICByZXR1cm4gbW9kdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZmVhdHVyZSBiYXNlZCBvbiBmZWF0dXJlIG5hbWUsIGlmIGZlYXR1cmUgd2FzIG5vdCB5ZXQgcmVzb2x2ZWRcbiAgICpcbiAgICogSXQgd2lsbCBmaXJzdCByZXNvbHZlIGFsbCBtb2R1bGUgZGVwZW5kZW5jaWVzIGlmIGRlZmluZWRcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUZlYXR1cmVJbnN0YW5jZShcbiAgICBmZWF0dXJlTmFtZTogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8RmVhdHVyZUluc3RhbmNlPiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mZWF0dXJlSW5zdGFuY2VzLmhhcyhmZWF0dXJlTmFtZSkpIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5zdGFuY2VzLnNldChcbiAgICAgICAgICBmZWF0dXJlTmFtZSxcbiAgICAgICAgICB0aGlzLmZlYXR1cmVNb2R1bGVzLnJlc29sdmVGZWF0dXJlKGZlYXR1cmVOYW1lKS5waXBlKFxuICAgICAgICAgICAgbWFwKChtb2R1bGVSZWYpID0+XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRmVhdHVyZUluc3RhbmNlKG1vZHVsZVJlZiwgZmVhdHVyZU5hbWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZUluc3RhbmNlcy5nZXQoZmVhdHVyZU5hbWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZWF0dXJlIGluc3RhbmNlIGZyb20gZmVhdHVyZSdzIG1vZHVsZVJlZlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGZWF0dXJlSW5zdGFuY2UoXG4gICAgbW9kdWxlUmVmOiBOZ01vZHVsZVJlZjxhbnk+LFxuICAgIGZlYXR1cmU6IHN0cmluZ1xuICApOiBGZWF0dXJlSW5zdGFuY2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgY29uc3QgZmVhdHVyZUNvbmZpZyA9IHRoaXMuZmVhdHVyZU1vZHVsZXNDb25maWchW1xuICAgICAgZmVhdHVyZVxuICAgIF0gYXMgRmVhdHVyZU1vZHVsZUNvbmZpZztcblxuICAgIGNvbnN0IGZlYXR1cmVJbnN0YW5jZTogRmVhdHVyZUluc3RhbmNlID0ge1xuICAgICAgbW9kdWxlUmVmLFxuICAgICAgY29tcG9uZW50c01hcHBpbmdzOiB7fSxcbiAgICB9O1xuXG4gICAgLy8gcmVzb2x2ZSBjb25maWd1cmF0aW9uIGZvciBmZWF0dXJlIG1vZHVsZVxuICAgIGNvbnN0IHJlc29sdmVkQ29uZmlndXJhdGlvbiA9IHRoaXMucmVzb2x2ZUZlYXR1cmVDb25maWd1cmF0aW9uKFxuICAgICAgbW9kdWxlUmVmLmluamVjdG9yXG4gICAgKTtcblxuICAgIC8vIGV4dHJhY3QgY21zIGNvbXBvbmVudHMgY29uZmlndXJhdGlvbiBmcm9tIGZlYXR1cmUgY29uZmlnXG4gICAgZm9yIChjb25zdCBjb21wb25lbnRUeXBlIG9mIGZlYXR1cmVDb25maWcuY21zQ29tcG9uZW50cyA/PyBbXSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGZlYXR1cmVJbnN0YW5jZS5jb21wb25lbnRzTWFwcGluZ3MhW2NvbXBvbmVudFR5cGVdID1cbiAgICAgICAgcmVzb2x2ZWRDb25maWd1cmF0aW9uLmNtc0NvbXBvbmVudHM/Lltjb21wb25lbnRUeXBlXSA/PyB7fTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVJbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgaW4gZmVhdHVyZSBtb2R1bGVcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUZlYXR1cmVDb25maWd1cmF0aW9uKGZlYXR1cmVJbmplY3RvcjogSW5qZWN0b3IpOiBDbXNDb25maWcge1xuICAgIC8vIGdldCBjb25maWcgY2h1bmtzIGZyb20gZmVhdHVyZSBsaWJcbiAgICBjb25zdCBmZWF0dXJlQ29uZmlnQ2h1bmtzID0gZmVhdHVyZUluamVjdG9yLmdldDxhbnlbXT4oXG4gICAgICBDb25maWdDaHVuayxcbiAgICAgIFtdLFxuICAgICAgSW5qZWN0RmxhZ3MuU2VsZlxuICAgICk7XG4gICAgLy8gZ2V0IGRlZmF1bHQgY29uZmlnIGNodW5rcyBmcm9tIGZlYXR1cmUgbGliXG4gICAgY29uc3QgZmVhdHVyZURlZmF1bHRDb25maWdDaHVua3MgPSBmZWF0dXJlSW5qZWN0b3IuZ2V0PGFueVtdPihcbiAgICAgIERlZmF1bHRDb25maWdDaHVuayxcbiAgICAgIFtdLFxuICAgICAgSW5qZWN0RmxhZ3MuU2VsZlxuICAgICk7XG5cbiAgICByZXR1cm4gZGVlcE1lcmdlKFxuICAgICAge30sXG4gICAgICAuLi4oZmVhdHVyZURlZmF1bHRDb25maWdDaHVua3MgPz8gW10pLFxuICAgICAgLi4uKGZlYXR1cmVDb25maWdDaHVua3MgPz8gW10pXG4gICAgKSBhcyBDbXNDb25maWc7XG4gIH1cbn1cbiJdfQ==