@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
98 lines • 13.3 kB
JavaScript
import { TestBed } from '@angular/core/testing';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { forceRoutingInsideAngularZone } from '@bespunky/angular-zen/core/testing';
import { createDeeplyNestedRoutes, DeepRouteSegments, NoopModule, NoopComponent } from '@bespunky/angular-zen/router-x/testing';
import { LanguageIntegrationModule, UrlLocalizer, UrlLocalizationService } from '@bespunky/angular-zen/language';
import { UrlReflectionService } from '@bespunky/angular-zen/router-x';
import { LanguageConfig } from './language-integration-config';
/**
* Configures the testing module with localized routes for testing and language integration services.
* Routes are created by running `createDeeplyNestedRoutes(DeepRouteSegments)`.
* Language integration tools are read from `LanguageConfig`.
*
* The function extracts services from the testbed and returns them in the returned object for quick deconstruction.
*
* @export
* @param {(UrlLocalizationStrategy | UrlLocalizationConfig)} strategyOrConfig The url localization strategy or full config.
* @returns A deconstructable object with ready to use language tools. See intellisense.
*/
export function setupUrlLocalizerTest(strategyOrConfig) {
const nestedRoutes = createLocalizedDeeplyNestedRoutes(DeepRouteSegments);
const config = isUrlLocalizationConfig(strategyOrConfig) ? strategyOrConfig : { strategy: strategyOrConfig };
TestBed.configureTestingModule({
imports: [
NoopModule,
RouterTestingModule.withRoutes([nestedRoutes]),
LanguageIntegrationModule.forRoot({
useFactory: () => LanguageConfig,
urlLocalization: config
})
]
});
const localizer = TestBed.inject(UrlLocalizer);
const urlLocalization = TestBed.inject(UrlLocalizationService);
const urlReflection = TestBed.inject(UrlReflectionService);
const router = TestBed.inject(Router);
forceRoutingInsideAngularZone(router);
router.initialNavigation();
return { localizer, urlLocalization, urlReflection, router };
}
/**
* Recoursively creates nested routes for the specified segments.
* Each specified segment will be a child route of its previous segment.
* Each created route will support 2 paths:
* 1. The segment name.
* 2. An 'en' path.
*
* #### Example
* Running the function on `['some', 'route']` will result in the following supported routes:
* /
*
* /some
* /some/route
*
* /en/
* /en/some
* /en/some/route
*
* /some/en
* /some/en/route
*
* /some/route/en
*
* @export
* @param {string[]} segments
* @returns {Route}
*/
export function createLocalizedDeeplyNestedRoutes(segments) {
const nestedRoutes = createDeeplyNestedRoutes(segments);
localizeRoute(nestedRoutes);
return nestedRoutes;
}
/**
* Recoursively adds an 'en' segment to all routes in the tree.
*
* @param {Route} route The top most route to localize.
*/
function localizeRoute(route) {
route.children || (route.children = []);
route.children.forEach(child => localizeRoute(child));
const localizedRoute = { path: 'en', component: NoopComponent };
// Copy the children of the current route to the localized route as well to ensure a route can be
// accessed with or without localization (i.e. the /en) prefix.
localizedRoute.children = [...route.children];
// Add the english segment as the first child of the route
route.children.unshift(localizedRoute);
}
/**
* Checks whether the given value is a url localization config object.
*
* @param {*} value The value to test.
* @returns {value is UrlLocalizationConfig} `true` if the value is a `UrlLocalizationConfig` object; otherwise `false`.
*/
function isUrlLocalizationConfig(value) {
const strategy = value?.strategy;
return strategy && (typeof strategy === 'number' || typeof strategy === 'string' || strategy.useClass || strategy.useFactory);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItemVuL2xhbmd1YWdlL3Rlc3Rpbmcvc3JjL3V0aWxzL3NldHVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQVMsTUFBTSxFQUFRLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLDZCQUE2QixFQUFvRixNQUFNLG9DQUFvQyxDQUFDO0FBQ3JLLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUEyQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pLLE9BQU8sRUFBMkIseUJBQXlCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUF5QixNQUFNLGdDQUFnQyxDQUFDO0FBQ2pLLE9BQU8sRUFBRSxvQkFBb0IsRUFBNkYsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqSyxPQUFPLEVBQUUsY0FBYyxFQUFtRyxNQUFNLCtCQUErQixDQUFDO0FBRWhLOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsZ0JBQWtFO0lBRXBHLE1BQU0sWUFBWSxHQUFHLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQVMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUEyQixDQUFDO0lBRTVJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUMzQixPQUFPLEVBQUU7WUFDTCxVQUFVO1lBQ1YsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUMseUJBQXlCLENBQUMsT0FBTyxDQUFDO2dCQUM5QixVQUFVLEVBQU8sR0FBRyxFQUFFLENBQUMsY0FBYztnQkFDckMsZUFBZSxFQUFFLE1BQU07YUFDMUIsQ0FBQztTQUNMO0tBQ0osQ0FBQyxDQUFDO0lBRUgsTUFBTSxTQUFTLEdBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0QsTUFBTSxhQUFhLEdBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFZLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0MsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFFM0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsUUFBa0I7SUFFaEUsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFeEQsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRTVCLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBWTtJQUUvQixLQUFLLENBQUMsUUFBUSxLQUFkLEtBQUssQ0FBQyxRQUFRLEdBQUssRUFBRSxFQUFDO0lBQ3RCLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFdEQsTUFBTSxjQUFjLEdBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUV2RSxpR0FBaUc7SUFDakcsK0RBQStEO0lBQy9ELGNBQWMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QywwREFBMEQ7SUFDMUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxLQUFVO0lBRXZDLE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLENBQUM7SUFFakMsT0FBTyxRQUFRLElBQUksQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0QmVkICAgICAgICAgICAgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcbmltcG9ydCB7IFJvdXRlLCBSb3V0ZXIgICAgICAgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUm91dGVyVGVzdGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlci90ZXN0aW5nJztcblxuaW1wb3J0IHsgZm9yY2VSb3V0aW5nSW5zaWRlQW5ndWxhclpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZnJvbSAnQGJlc3B1bmt5L2FuZ3VsYXItemVuL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgeyBjcmVhdGVEZWVwbHlOZXN0ZWRSb3V0ZXMsIERlZXBSb3V0ZVNlZ21lbnRzLCBOb29wTW9kdWxlLCBOb29wQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmcm9tICdAYmVzcHVua3kvYW5ndWxhci16ZW4vcm91dGVyLXgvdGVzdGluZyc7XG5pbXBvcnQgeyBVcmxMb2NhbGl6YXRpb25TdHJhdGVneSwgTGFuZ3VhZ2VJbnRlZ3JhdGlvbk1vZHVsZSwgVXJsTG9jYWxpemVyLCBVcmxMb2NhbGl6YXRpb25TZXJ2aWNlLCBVcmxMb2NhbGl6YXRpb25Db25maWcgfSBmcm9tICdAYmVzcHVua3kvYW5ndWxhci16ZW4vbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgVXJsUmVmbGVjdGlvblNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZnJvbSAnQGJlc3B1bmt5L2FuZ3VsYXItemVuL3JvdXRlci14JztcbmltcG9ydCB7IExhbmd1YWdlQ29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZyb20gJy4vbGFuZ3VhZ2UtaW50ZWdyYXRpb24tY29uZmlnJztcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSB0ZXN0aW5nIG1vZHVsZSB3aXRoIGxvY2FsaXplZCByb3V0ZXMgZm9yIHRlc3RpbmcgYW5kIGxhbmd1YWdlIGludGVncmF0aW9uIHNlcnZpY2VzLlxuICogUm91dGVzIGFyZSBjcmVhdGVkIGJ5IHJ1bm5pbmcgYGNyZWF0ZURlZXBseU5lc3RlZFJvdXRlcyhEZWVwUm91dGVTZWdtZW50cylgLlxuICogTGFuZ3VhZ2UgaW50ZWdyYXRpb24gdG9vbHMgYXJlIHJlYWQgZnJvbSBgTGFuZ3VhZ2VDb25maWdgLlxuICogXG4gKiBUaGUgZnVuY3Rpb24gZXh0cmFjdHMgc2VydmljZXMgZnJvbSB0aGUgdGVzdGJlZCBhbmQgcmV0dXJucyB0aGVtIGluIHRoZSByZXR1cm5lZCBvYmplY3QgZm9yIHF1aWNrIGRlY29uc3RydWN0aW9uLlxuICogXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0geyhVcmxMb2NhbGl6YXRpb25TdHJhdGVneSB8IFVybExvY2FsaXphdGlvbkNvbmZpZyl9IHN0cmF0ZWd5T3JDb25maWcgVGhlIHVybCBsb2NhbGl6YXRpb24gc3RyYXRlZ3kgb3IgZnVsbCBjb25maWcuXG4gKiBAcmV0dXJucyBBIGRlY29uc3RydWN0YWJsZSBvYmplY3Qgd2l0aCByZWFkeSB0byB1c2UgbGFuZ3VhZ2UgdG9vbHMuIFNlZSBpbnRlbGxpc2Vuc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFVybExvY2FsaXplclRlc3Qoc3RyYXRlZ3lPckNvbmZpZz86IFVybExvY2FsaXphdGlvblN0cmF0ZWd5IHwgVXJsTG9jYWxpemF0aW9uQ29uZmlnKVxue1xuICAgIGNvbnN0IG5lc3RlZFJvdXRlcyA9IGNyZWF0ZUxvY2FsaXplZERlZXBseU5lc3RlZFJvdXRlcyhEZWVwUm91dGVTZWdtZW50cyk7XG4gICAgY29uc3QgY29uZmlnICAgICAgID0gaXNVcmxMb2NhbGl6YXRpb25Db25maWcoc3RyYXRlZ3lPckNvbmZpZykgPyBzdHJhdGVneU9yQ29uZmlnIDogeyBzdHJhdGVneTogc3RyYXRlZ3lPckNvbmZpZyB9IGFzIFVybExvY2FsaXphdGlvbkNvbmZpZztcblxuICAgIFRlc3RCZWQuY29uZmlndXJlVGVzdGluZ01vZHVsZSh7XG4gICAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgICAgIE5vb3BNb2R1bGUsXG4gICAgICAgICAgICBSb3V0ZXJUZXN0aW5nTW9kdWxlLndpdGhSb3V0ZXMoW25lc3RlZFJvdXRlc10pLFxuICAgICAgICAgICAgTGFuZ3VhZ2VJbnRlZ3JhdGlvbk1vZHVsZS5mb3JSb290KHtcbiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5ICAgICA6ICgpID0+IExhbmd1YWdlQ29uZmlnLFxuICAgICAgICAgICAgICAgIHVybExvY2FsaXphdGlvbjogY29uZmlnXG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2NhbGl6ZXIgICAgICAgPSBUZXN0QmVkLmluamVjdChVcmxMb2NhbGl6ZXIpO1xuICAgIGNvbnN0IHVybExvY2FsaXphdGlvbiA9IFRlc3RCZWQuaW5qZWN0KFVybExvY2FsaXphdGlvblNlcnZpY2UpO1xuICAgIGNvbnN0IHVybFJlZmxlY3Rpb24gICA9IFRlc3RCZWQuaW5qZWN0KFVybFJlZmxlY3Rpb25TZXJ2aWNlKTtcbiAgICBjb25zdCByb3V0ZXIgICAgICAgICAgPSBUZXN0QmVkLmluamVjdChSb3V0ZXIpO1xuICAgIFxuICAgIGZvcmNlUm91dGluZ0luc2lkZUFuZ3VsYXJab25lKHJvdXRlcik7XG5cbiAgICByb3V0ZXIuaW5pdGlhbE5hdmlnYXRpb24oKTtcblxuICAgIHJldHVybiB7IGxvY2FsaXplciwgdXJsTG9jYWxpemF0aW9uLCB1cmxSZWZsZWN0aW9uLCByb3V0ZXIgfTtcbn1cblxuLyoqXG4gKiBSZWNvdXJzaXZlbHkgY3JlYXRlcyBuZXN0ZWQgcm91dGVzIGZvciB0aGUgc3BlY2lmaWVkIHNlZ21lbnRzLlxuICogRWFjaCBzcGVjaWZpZWQgc2VnbWVudCB3aWxsIGJlIGEgY2hpbGQgcm91dGUgb2YgaXRzIHByZXZpb3VzIHNlZ21lbnQuXG4gKiBFYWNoIGNyZWF0ZWQgcm91dGUgd2lsbCBzdXBwb3J0IDIgcGF0aHM6XG4gKiAxLiBUaGUgc2VnbWVudCBuYW1lLlxuICogMi4gQW4gJ2VuJyBwYXRoLlxuICogXG4gKiAjIyMjIEV4YW1wbGVcbiAqIFJ1bm5pbmcgdGhlIGZ1bmN0aW9uIG9uIGBbJ3NvbWUnLCAncm91dGUnXWAgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQgcm91dGVzOiAgXG4gKiAvICBcbiAqIFxuICogL3NvbWUgIFxuICogL3NvbWUvcm91dGUgIFxuICogICBcbiAqIC9lbi8gIFxuICogL2VuL3NvbWUgIFxuICogL2VuL3NvbWUvcm91dGUgIFxuICogICBcbiAqIC9zb21lL2VuICBcbiAqIC9zb21lL2VuL3JvdXRlICBcbiAqICAgXG4gKiAvc29tZS9yb3V0ZS9lbiAgXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7c3RyaW5nW119IHNlZ21lbnRzXG4gKiBAcmV0dXJucyB7Um91dGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2NhbGl6ZWREZWVwbHlOZXN0ZWRSb3V0ZXMoc2VnbWVudHM6IHN0cmluZ1tdKTogUm91dGVcbntcbiAgICBjb25zdCBuZXN0ZWRSb3V0ZXMgPSBjcmVhdGVEZWVwbHlOZXN0ZWRSb3V0ZXMoc2VnbWVudHMpO1xuICAgIFxuICAgIGxvY2FsaXplUm91dGUobmVzdGVkUm91dGVzKTtcblxuICAgIHJldHVybiBuZXN0ZWRSb3V0ZXM7XG59XG5cbi8qKlxuICogUmVjb3Vyc2l2ZWx5IGFkZHMgYW4gJ2VuJyBzZWdtZW50IHRvIGFsbCByb3V0ZXMgaW4gdGhlIHRyZWUuXG4gKlxuICogQHBhcmFtIHtSb3V0ZX0gcm91dGUgVGhlIHRvcCBtb3N0IHJvdXRlIHRvIGxvY2FsaXplLlxuICovXG5mdW5jdGlvbiBsb2NhbGl6ZVJvdXRlKHJvdXRlOiBSb3V0ZSk6IHZvaWRcbntcbiAgICByb3V0ZS5jaGlsZHJlbiB8fD0gW107XG4gICAgcm91dGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBsb2NhbGl6ZVJvdXRlKGNoaWxkKSk7XG5cbiAgICBjb25zdCBsb2NhbGl6ZWRSb3V0ZTogUm91dGUgPSB7IHBhdGg6ICdlbicsIGNvbXBvbmVudDogTm9vcENvbXBvbmVudCB9O1xuXG4gICAgLy8gQ29weSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgcm91dGUgdG8gdGhlIGxvY2FsaXplZCByb3V0ZSBhcyB3ZWxsIHRvIGVuc3VyZSBhIHJvdXRlIGNhbiBiZVxuICAgIC8vIGFjY2Vzc2VkIHdpdGggb3Igd2l0aG91dCBsb2NhbGl6YXRpb24gKGkuZS4gdGhlIC9lbikgcHJlZml4LlxuICAgIGxvY2FsaXplZFJvdXRlLmNoaWxkcmVuID0gWy4uLnJvdXRlLmNoaWxkcmVuXTtcbiAgICAvLyBBZGQgdGhlIGVuZ2xpc2ggc2VnbWVudCBhcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIHJvdXRlXG4gICAgcm91dGUuY2hpbGRyZW4udW5zaGlmdChsb2NhbGl6ZWRSb3V0ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdXJsIGxvY2FsaXphdGlvbiBjb25maWcgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgVXJsTG9jYWxpemF0aW9uQ29uZmlnfSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGEgYFVybExvY2FsaXphdGlvbkNvbmZpZ2Agb2JqZWN0OyBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNVcmxMb2NhbGl6YXRpb25Db25maWcodmFsdWU6IGFueSk6IHZhbHVlIGlzIFVybExvY2FsaXphdGlvbkNvbmZpZ1xue1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gdmFsdWU/LnN0cmF0ZWd5O1xuXG4gICAgcmV0dXJuIHN0cmF0ZWd5ICYmICh0eXBlb2Ygc3RyYXRlZ3kgPT09ICdudW1iZXInIHx8IHR5cGVvZiBzdHJhdGVneSA9PT0gJ3N0cmluZycgfHwgc3RyYXRlZ3kudXNlQ2xhc3MgfHwgc3RyYXRlZ3kudXNlRmFjdG9yeSk7XG59Il19