@o3r/localization 12.0.0-next.2 → 12.0.0-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builders/localization-extractor/index.d.ts.map +1 -1
- package/builders/localization-extractor/index.js +1 -0
- package/builders/localization-extractor/index.js.map +1 -1
- package/builders/package.json +3 -0
- package/fesm2022/o3r-localization-rules-engine.mjs +7 -7
- package/fesm2022/o3r-localization-rules-engine.mjs.map +1 -1
- package/fesm2022/o3r-localization.mjs +67 -71
- package/fesm2022/o3r-localization.mjs.map +1 -1
- package/package.json +19 -22
- package/rules-engine/package.json +3 -0
- package/schematics/add-localization-key/index.js +2 -2
- package/schematics/add-localization-key/index.js.map +1 -1
- package/schematics/add-localization-key/schema.d.ts +2 -2
- package/schematics/add-localization-key/schema.d.ts.map +1 -1
- package/schematics/add-localization-key/schema.json +4 -3
- package/schematics/package.json +3 -0
- package/tools/localization-translate.directive.d.ts.map +1 -1
- package/tools/localization-translate.pipe.d.ts +0 -8
- package/tools/localization-translate.pipe.d.ts.map +1 -1
- package/tools/localization.module.d.ts +1 -1
- package/tools/localization.module.d.ts.map +1 -1
- package/tools/localized-currency.pipe.d.ts.map +1 -1
- package/tools/localized-date.pipe.d.ts.map +1 -1
- package/tools/localized-decimal.pipe.d.ts.map +1 -1
- package/esm2022/annotations/index.mjs +0 -2
- package/esm2022/annotations/localization.mjs +0 -29
- package/esm2022/core/index.mjs +0 -5
- package/esm2022/core/json-localization.interface.mjs +0 -2
- package/esm2022/core/localization.configuration.mjs +0 -15
- package/esm2022/core/translatable.mjs +0 -2
- package/esm2022/core/translate-messageformat-lazy.compiler.mjs +0 -67
- package/esm2022/devkit/index.mjs +0 -7
- package/esm2022/devkit/localization-devkit.interface.mjs +0 -2
- package/esm2022/devkit/localization-devtools.console.service.mjs +0 -87
- package/esm2022/devkit/localization-devtools.message.service.mjs +0 -129
- package/esm2022/devkit/localization-devtools.module.mjs +0 -47
- package/esm2022/devkit/localization-devtools.service.mjs +0 -95
- package/esm2022/devkit/localization-devtools.token.mjs +0 -8
- package/esm2022/o3r-localization.mjs +0 -5
- package/esm2022/public_api.mjs +0 -6
- package/esm2022/rules-engine/localization.handler-action.mjs +0 -30
- package/esm2022/rules-engine/localization.interfaces.mjs +0 -3
- package/esm2022/rules-engine/localization.rules-engine.module.mjs +0 -23
- package/esm2022/rules-engine/o3r-localization-rules-engine.mjs +0 -5
- package/esm2022/rules-engine/public_api.mjs +0 -4
- package/esm2022/stores/index.mjs +0 -7
- package/esm2022/stores/localization-override/localization-override.actions.mjs +0 -8
- package/esm2022/stores/localization-override/localization-override.module.mjs +0 -39
- package/esm2022/stores/localization-override/localization-override.reducer.mjs +0 -17
- package/esm2022/stores/localization-override/localization-override.selectors.mjs +0 -7
- package/esm2022/stores/localization-override/localization-override.state.mjs +0 -5
- package/esm2022/stores/localization-override/localization-override.sync.mjs +0 -11
- package/esm2022/tools/index.mjs +0 -13
- package/esm2022/tools/localization-translate.directive.mjs +0 -77
- package/esm2022/tools/localization-translate.pipe.mjs +0 -86
- package/esm2022/tools/localization.module.mjs +0 -89
- package/esm2022/tools/localization.provider.mjs +0 -25
- package/esm2022/tools/localization.service.mjs +0 -192
- package/esm2022/tools/localization.token.mjs +0 -4
- package/esm2022/tools/localized-currency.pipe.mjs +0 -32
- package/esm2022/tools/localized-date.pipe.mjs +0 -32
- package/esm2022/tools/localized-decimal.pipe.mjs +0 -32
- package/esm2022/tools/text-direction.service.mjs +0 -43
- package/esm2022/tools/text-directionality.service.mjs +0 -26
- package/esm2022/tools/translations-loader.mjs +0 -112
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, } from '@angular/core';
|
|
2
|
-
import { DynamicContentService, } from '@o3r/dynamic-content';
|
|
3
|
-
import { LoggerService, } from '@o3r/logger';
|
|
4
|
-
import { combineLatest, from, of, } from 'rxjs';
|
|
5
|
-
import { catchError, map, switchMap, } from 'rxjs/operators';
|
|
6
|
-
import { LOCALIZATION_CONFIGURATION_TOKEN, } from './localization.token';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@o3r/logger";
|
|
9
|
-
import * as i2 from "@o3r/dynamic-content";
|
|
10
|
-
const JSON_EXT = '.json';
|
|
11
|
-
/**
|
|
12
|
-
* This class is responsible for loading translation bundles from remote or local endpoints depending on the LocalizationConfiguration.
|
|
13
|
-
* Fallback mechanism ensures that if a bundle in some language cannot be fetched remotely
|
|
14
|
-
* we try to fetch the same language bundle locally (bundles stored inside the application)
|
|
15
|
-
* and finally load the fallback language bundle (if all previous fetches failed)
|
|
16
|
-
*/
|
|
17
|
-
export class TranslationsLoader {
|
|
18
|
-
constructor(localizationConfiguration, logger, dynamicContentService) {
|
|
19
|
-
this.localizationConfiguration = localizationConfiguration;
|
|
20
|
-
this.logger = logger;
|
|
21
|
-
this.dynamicContentService = dynamicContentService;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Download a language bundle file
|
|
25
|
-
* @param url Url to the bundle file
|
|
26
|
-
*/
|
|
27
|
-
downloadLanguageBundle$(url) {
|
|
28
|
-
const queryParams = this.localizationConfiguration.queryParams;
|
|
29
|
-
let queryString = '';
|
|
30
|
-
if (queryParams) {
|
|
31
|
-
queryString = '?' + Object.keys(queryParams).map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(queryParams[key])).join('&');
|
|
32
|
-
}
|
|
33
|
-
return from(fetch(url + queryString, this.localizationConfiguration.fetchOptions)).pipe(switchMap((response) => from(response.json())));
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* @inheritdoc
|
|
37
|
-
*/
|
|
38
|
-
getTranslation(lang) {
|
|
39
|
-
const fallback = this.localizationConfiguration.fallbackLanguage;
|
|
40
|
-
let localizationPath$ = of(this.localizationConfiguration.endPointUrl);
|
|
41
|
-
if (this.localizationConfiguration.useDynamicContent) {
|
|
42
|
-
if (!this.dynamicContentService) {
|
|
43
|
-
throw new Error('Dynamic Content is not available. Please verify you have imported the module DynamicContentModule in your application');
|
|
44
|
-
}
|
|
45
|
-
localizationPath$ = this.dynamicContentService.getContentPathStream(this.localizationConfiguration.endPointUrl);
|
|
46
|
-
}
|
|
47
|
-
return localizationPath$.pipe(switchMap((localizationPath) => {
|
|
48
|
-
if (localizationPath) {
|
|
49
|
-
const localizationBundle$ = this.downloadLanguageBundle$(localizationPath + lang + JSON_EXT);
|
|
50
|
-
if (this.localizationConfiguration.mergeWithLocalTranslations) {
|
|
51
|
-
return combineLatest([
|
|
52
|
-
localizationBundle$.pipe(catchError(() => of({}))),
|
|
53
|
-
this.getTranslationFromLocal(lang, fallback).pipe(map((translations) => {
|
|
54
|
-
Object.keys(translations).forEach((key) => translations[key] = `[local] ${translations[key]}`);
|
|
55
|
-
return translations;
|
|
56
|
-
}))
|
|
57
|
-
]).pipe(map(([dynamicTranslations, localTranslations]) => ({ ...localTranslations, ...dynamicTranslations })));
|
|
58
|
-
}
|
|
59
|
-
/*
|
|
60
|
-
* if endPointUrl is specified by the configuration then:
|
|
61
|
-
* 1. try to load lang from endPointUrl
|
|
62
|
-
* 2. if 1 fails then try to load from the app (local file)
|
|
63
|
-
*/
|
|
64
|
-
return localizationBundle$.pipe(catchError(() => {
|
|
65
|
-
this.logger?.warn(`Failed to load the localization resource from ${localizationPath + lang + JSON_EXT}, trying from the application resources`);
|
|
66
|
-
return this.getTranslationFromLocal(lang, fallback);
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
/*
|
|
70
|
-
* else if endPointUrl NOT specified by then configuration then:
|
|
71
|
-
* 1. try to load from the app (local file)
|
|
72
|
-
*/
|
|
73
|
-
this.logger?.warn('No localization endpoint specified, localization fetch from application resources');
|
|
74
|
-
return this.getTranslationFromLocal(lang, fallback);
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
*
|
|
79
|
-
*Fetches localization bundles from published folder (internal to application)
|
|
80
|
-
*
|
|
81
|
-
*1. try to load lang from local
|
|
82
|
-
*2. if 1 fails try to load fallback lang but only if it's different from lang in 1
|
|
83
|
-
* @param lang - language of the bundle
|
|
84
|
-
* @param fallbackLanguage - fallback language in case bundle in language not found
|
|
85
|
-
*/
|
|
86
|
-
getTranslationFromLocal(lang, fallbackLanguage) {
|
|
87
|
-
const pathPrefix = this.localizationConfiguration.bundlesOutputPath;
|
|
88
|
-
return this.downloadLanguageBundle$(pathPrefix + lang + JSON_EXT).pipe(catchError(() => {
|
|
89
|
-
if (lang === fallbackLanguage) {
|
|
90
|
-
this.logger?.warn(`Failed to load ${lang} from ${pathPrefix + lang + JSON_EXT}.`);
|
|
91
|
-
return of({});
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
this.logger?.warn(`Failed to load ${lang} from ${pathPrefix + lang + JSON_EXT}. Application will fallback to ${fallbackLanguage}`);
|
|
95
|
-
return this.downloadLanguageBundle$(pathPrefix + fallbackLanguage + JSON_EXT).pipe(catchError(() => of({})));
|
|
96
|
-
}
|
|
97
|
-
}));
|
|
98
|
-
}
|
|
99
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader, deps: [{ token: LOCALIZATION_CONFIGURATION_TOKEN }, { token: i1.LoggerService, optional: true }, { token: i2.DynamicContentService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
100
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader }); }
|
|
101
|
-
}
|
|
102
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TranslationsLoader, decorators: [{
|
|
103
|
-
type: Injectable
|
|
104
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
105
|
-
type: Inject,
|
|
106
|
-
args: [LOCALIZATION_CONFIGURATION_TOKEN]
|
|
107
|
-
}] }, { type: i1.LoggerService, decorators: [{
|
|
108
|
-
type: Optional
|
|
109
|
-
}] }, { type: i2.DynamicContentService, decorators: [{
|
|
110
|
-
type: Optional
|
|
111
|
-
}] }] });
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb25zLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29scy90cmFuc2xhdGlvbnMtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQ0wscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGFBQWEsR0FDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLElBQUksRUFFSixFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEdBQUcsRUFDSCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4QixPQUFPLEVBQ0wsZ0NBQWdDLEdBQ2pDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFOUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBRXpCOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUF1RSx5QkFBb0QsRUFDNUYsTUFBc0IsRUFDdEIscUJBQTZDO1FBRkwsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUM1RixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXdCO0lBQUcsQ0FBQztJQUVoRjs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxHQUFXO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUM7UUFFL0QsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsV0FBVyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFB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Qzs7MEJBQ2pELFFBQVE7OzBCQUNSLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3QsXG4gIEluamVjdGFibGUsXG4gIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFRyYW5zbGF0ZUxvYWRlcixcbn0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBEeW5hbWljQ29udGVudFNlcnZpY2UsXG59IGZyb20gJ0BvM3IvZHluYW1pYy1jb250ZW50JztcbmltcG9ydCB7XG4gIExvZ2dlclNlcnZpY2UsXG59IGZyb20gJ0BvM3IvbG9nZ2VyJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZyb20sXG4gIE9ic2VydmFibGUsXG4gIG9mLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIG1hcCxcbiAgc3dpdGNoTWFwLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBMb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLFxufSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG4gIExPQ0FMSVpBVElPTl9DT05GSUdVUkFUSU9OX1RPS0VOLFxufSBmcm9tICcuL2xvY2FsaXphdGlvbi50b2tlbic7XG5cbmNvbnN0IEpTT05fRVhUID0gJy5qc29uJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRyYW5zbGF0aW9uIGJ1bmRsZXMgZnJvbSByZW1vdGUgb3IgbG9jYWwgZW5kcG9pbnRzIGRlcGVuZGluZyBvbiB0aGUgTG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5cbiAqIEZhbGxiYWNrIG1lY2hhbmlzbSBlbnN1cmVzIHRoYXQgaWYgYSBidW5kbGUgaW4gc29tZSBsYW5ndWFnZSBjYW5ub3QgYmUgZmV0Y2hlZCByZW1vdGVseVxuICogd2UgdHJ5IHRvIGZldGNoIHRoZSBzYW1lIGxhbmd1YWdlIGJ1bmRsZSBsb2NhbGx5IChidW5kbGVzIHN0b3JlZCBpbnNpZGUgdGhlIGFwcGxpY2F0aW9uKVxuICogYW5kIGZpbmFsbHkgbG9hZCB0aGUgZmFsbGJhY2sgbGFuZ3VhZ2UgYnVuZGxlIChpZiBhbGwgcHJldmlvdXMgZmV0Y2hlcyBmYWlsZWQpXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbnNMb2FkZXIgaW1wbGVtZW50cyBUcmFuc2xhdGVMb2FkZXIge1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KExPQ0FMSVpBVElPTl9DT05GSUdVUkFUSU9OX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb246IExvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbnRlbnRTZXJ2aWNlPzogRHluYW1pY0NvbnRlbnRTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBhIGxhbmd1YWdlIGJ1bmRsZSBmaWxlXG4gICAqIEBwYXJhbSAgdXJsIFVybCB0byB0aGUgYnVuZGxlIGZpbGVcbiAgICovXG4gIHByaXZhdGUgZG93bmxvYWRMYW5ndWFnZUJ1bmRsZSQodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5xdWVyeVBhcmFtcztcblxuICAgIGxldCBxdWVyeVN0cmluZyA9ICcnO1xuICAgIGlmIChxdWVyeVBhcmFtcykge1xuICAgICAgcXVlcnlTdHJpbmcgPSAnPycgKyBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcykubWFwKChrZXkpID0+IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5UGFyYW1zW2tleV0pKS5qb2luKCcmJyk7XG4gICAgfVxuICAgIHJldHVybiBmcm9tKGZldGNoKHVybCArIHF1ZXJ5U3RyaW5nLCB0aGlzLmxvY2FsaXphdGlvbkNvbmZpZ3VyYXRpb24uZmV0Y2hPcHRpb25zKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2UpID0+IGZyb20ocmVzcG9uc2UuanNvbigpKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBmYWxsYmFjayA9IHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5mYWxsYmFja0xhbmd1YWdlO1xuICAgIGxldCBsb2NhbGl6YXRpb25QYXRoJCA9IG9mKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5lbmRQb2ludFVybCk7XG5cbiAgICBpZiAodGhpcy5sb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLnVzZUR5bmFtaWNDb250ZW50KSB7XG4gICAgICBpZiAoIXRoaXMuZHluYW1pY0NvbnRlbnRTZXJ2aWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRHluYW1pYyBDb250ZW50IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSB2ZXJpZnkgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIG1vZHVsZSBEeW5hbWljQ29udGVudE1vZHVsZSBpbiB5b3VyIGFwcGxpY2F0aW9uJyk7XG4gICAgICB9XG4gICAgICBsb2NhbGl6YXRpb25QYXRoJCA9IHRoaXMuZHluYW1pY0NvbnRlbnRTZXJ2aWNlLmdldENvbnRlbnRQYXRoU3RyZWFtKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5lbmRQb2ludFVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsaXphdGlvblBhdGgkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGxvY2FsaXphdGlvblBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAobG9jYWxpemF0aW9uUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGxvY2FsaXphdGlvbkJ1bmRsZSQgPSB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKGxvY2FsaXphdGlvblBhdGggKyBsYW5nICsgSlNPTl9FWFQpO1xuXG4gICAgICAgICAgaWYgKHRoaXMubG9jYWxpemF0aW9uQ29uZmlndXJhdGlvbi5tZXJnZVdpdGhMb2NhbFRyYW5zbGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgICBsb2NhbGl6YXRpb25CdW5kbGUkLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZih7fSkpKSxcbiAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nLCBmYWxsYmFjaykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHRyYW5zbGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChrZXkpID0+IHRyYW5zbGF0aW9uc1trZXldID0gYFtsb2NhbF0gJHt0cmFuc2xhdGlvbnNba2V5XSBhcyBzdHJpbmd9YCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIF0pLnBpcGUobWFwKChbZHluYW1pY1RyYW5zbGF0aW9ucywgbG9jYWxUcmFuc2xhdGlvbnNdKSA9PiAoeyAuLi5sb2NhbFRyYW5zbGF0aW9ucywgLi4uZHluYW1pY1RyYW5zbGF0aW9ucyB9KSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qXG4gICAgICAgICAgKiBpZiBlbmRQb2ludFVybCBpcyBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdGhlbjpcbiAgICAgICAgICAqICAgMS4gdHJ5IHRvIGxvYWQgbGFuZyBmcm9tIGVuZFBvaW50VXJsXG4gICAgICAgICAgKiAgIDIuIGlmIDEgZmFpbHMgdGhlbiB0cnkgdG8gbG9hZCBmcm9tIHRoZSBhcHAgKGxvY2FsIGZpbGUpXG4gICAgICAgICAgKi9cbiAgICAgICAgICByZXR1cm4gbG9jYWxpemF0aW9uQnVuZGxlJC5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyPy53YXJuKGBGYWlsZWQgdG8gbG9hZCB0aGUgbG9jYWxpemF0aW9uIHJlc291cmNlIGZyb20gJHtsb2NhbGl6YXRpb25QYXRoICsgbGFuZyArIEpTT05fRVhUfSwgdHJ5aW5nIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJlc291cmNlc2ApO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nLCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgKiBlbHNlIGlmIGVuZFBvaW50VXJsIE5PVCBzcGVjaWZpZWQgYnkgdGhlbiBjb25maWd1cmF0aW9uIHRoZW46XG4gICAgICAgICogICAxLiB0cnkgdG8gbG9hZCBmcm9tIHRoZSBhcHAgKGxvY2FsIGZpbGUpXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubG9nZ2VyPy53YXJuKCdObyBsb2NhbGl6YXRpb24gZW5kcG9pbnQgc3BlY2lmaWVkLCBsb2NhbGl6YXRpb24gZmV0Y2ggZnJvbSBhcHBsaWNhdGlvbiByZXNvdXJjZXMnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb25Gcm9tTG9jYWwobGFuZywgZmFsbGJhY2spO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqRmV0Y2hlcyBsb2NhbGl6YXRpb24gYnVuZGxlcyBmcm9tIHB1Ymxpc2hlZCBmb2xkZXIgKGludGVybmFsIHRvIGFwcGxpY2F0aW9uKVxuICAgKlxuICAgKjEuIHRyeSB0byBsb2FkIGxhbmcgZnJvbSBsb2NhbFxuICAgKjIuIGlmIDEgZmFpbHMgdHJ5IHRvIGxvYWQgZmFsbGJhY2sgbGFuZyBidXQgb25seSBpZiBpdCdzIGRpZmZlcmVudCBmcm9tIGxhbmcgaW4gMVxuICAgKiBAcGFyYW0gbGFuZyAtIGxhbmd1YWdlIG9mIHRoZSBidW5kbGVcbiAgICogQHBhcmFtIGZhbGxiYWNrTGFuZ3VhZ2UgLSBmYWxsYmFjayBsYW5ndWFnZSBpbiBjYXNlIGJ1bmRsZSBpbiBsYW5ndWFnZSBub3QgZm91bmRcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFuc2xhdGlvbkZyb21Mb2NhbChsYW5nOiBzdHJpbmcsIGZhbGxiYWNrTGFuZ3VhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcGF0aFByZWZpeDogc3RyaW5nID0gdGhpcy5sb2NhbGl6YXRpb25Db25maWd1cmF0aW9uLmJ1bmRsZXNPdXRwdXRQYXRoO1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKHBhdGhQcmVmaXggKyBsYW5nICsgSlNPTl9FWFQpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgaWYgKGxhbmcgPT09IGZhbGxiYWNrTGFuZ3VhZ2UpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlcj8ud2FybihgRmFpbGVkIHRvIGxvYWQgJHtsYW5nfSBmcm9tICR7cGF0aFByZWZpeCArIGxhbmcgKyBKU09OX0VYVH0uYCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlcj8ud2FybihgRmFpbGVkIHRvIGxvYWQgJHtsYW5nfSBmcm9tICR7cGF0aFByZWZpeCArIGxhbmcgKyBKU09OX0VYVH0uIEFwcGxpY2F0aW9uIHdpbGwgZmFsbGJhY2sgdG8gJHtmYWxsYmFja0xhbmd1YWdlfWApO1xuICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkTGFuZ3VhZ2VCdW5kbGUkKHBhdGhQcmVmaXggKyBmYWxsYmFja0xhbmd1YWdlICsgSlNPTl9FWFQpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHt9KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|