@bravobit/bb-foundation 0.22.4 → 0.23.0

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.
Files changed (37) hide show
  1. package/elements/lib/pipes/relative-time.pipe.d.ts +1 -1
  2. package/esm2020/localize/lib/dictionary/dictionary.class.mjs +92 -0
  3. package/esm2020/localize/lib/dictionary/dictionary.context.mjs +26 -0
  4. package/esm2020/localize/lib/dictionary/dictionary.data.mjs +6 -0
  5. package/esm2020/localize/lib/functions/lowercase.function.mjs +2 -2
  6. package/esm2020/localize/lib/functions/uppercase.function.mjs +2 -2
  7. package/esm2020/localize/lib/handlers/missing.handler.mjs +2 -2
  8. package/esm2020/localize/lib/interfaces/config.interfaces.mjs +1 -1
  9. package/esm2020/localize/lib/interfaces/options.interfaces.mjs +1 -1
  10. package/esm2020/localize/lib/interfaces/transforms.interfaces.mjs +3 -0
  11. package/esm2020/localize/lib/localize.module.mjs +11 -3
  12. package/esm2020/localize/lib/localize.pipe.mjs +4 -5
  13. package/esm2020/localize/lib/localize.service.mjs +84 -128
  14. package/esm2020/localize/lib/transforms/abstract.transform.mjs +30 -0
  15. package/esm2020/localize/lib/transforms/interpolate.transform.mjs +54 -0
  16. package/esm2020/localize/lib/transforms/reference.transform.mjs +25 -0
  17. package/esm2020/localize/public_api.mjs +8 -2
  18. package/fesm2015/bravobit-bb-foundation-localize.mjs +339 -167
  19. package/fesm2015/bravobit-bb-foundation-localize.mjs.map +1 -1
  20. package/fesm2020/bravobit-bb-foundation-localize.mjs +321 -160
  21. package/fesm2020/bravobit-bb-foundation-localize.mjs.map +1 -1
  22. package/localize/lib/dictionary/dictionary.class.d.ts +28 -0
  23. package/localize/lib/dictionary/dictionary.context.d.ts +7 -0
  24. package/localize/lib/dictionary/dictionary.data.d.ts +7 -0
  25. package/localize/lib/interfaces/config.interfaces.d.ts +4 -6
  26. package/localize/lib/interfaces/options.interfaces.d.ts +1 -0
  27. package/localize/lib/interfaces/transforms.interfaces.d.ts +3 -0
  28. package/localize/lib/localize.module.d.ts +1 -1
  29. package/localize/lib/localize.pipe.d.ts +1 -1
  30. package/localize/lib/localize.service.d.ts +25 -21
  31. package/localize/lib/transforms/abstract.transform.d.ts +13 -0
  32. package/localize/lib/transforms/interpolate.transform.d.ts +14 -0
  33. package/localize/lib/transforms/reference.transform.d.ts +10 -0
  34. package/localize/public_api.d.ts +7 -1
  35. package/package.json +1 -1
  36. package/esm2020/localize/lib/localize.dictionary.mjs +0 -24
  37. package/localize/lib/localize.dictionary.d.ts +0 -7
@@ -1,169 +1,111 @@
1
- import { LOCALIZE_FUNCTION } from './interfaces/functions.interfaces';
1
+ import { LOCALIZE_TRANSFORM } from './interfaces/transforms.interfaces';
2
+ import { LocalizeDictionary } from './dictionary/dictionary.class';
2
3
  import { Inject, Injectable, Optional } from '@angular/core';
4
+ import { WINDOW } from '@bravobit/bb-foundation';
3
5
  import { DOCUMENT } from '@angular/common';
4
6
  import * as i0 from "@angular/core";
5
7
  import * as i1 from "@bravobit/bb-foundation/storage";
6
8
  import * as i2 from "@bravobit/bb-foundation";
7
- import * as i3 from "./interfaces/config.interfaces";
8
- import * as i4 from "./handlers/missing.handler";
9
+ import * as i3 from "./handlers/missing.handler";
10
+ import * as i4 from "./interfaces/config.interfaces";
9
11
  export class Localize {
10
- constructor(_storage, _languages, _config, _missingHandler, _document, _functions) {
12
+ constructor(_storage, _languages, _missingHandler, _config, _window, _document, _transforms) {
11
13
  this._storage = _storage;
12
14
  this._languages = _languages;
13
- this._config = _config;
14
15
  this._missingHandler = _missingHandler;
16
+ this._config = _config;
17
+ this._window = _window;
15
18
  this._document = _document;
16
- this._functions = _functions;
17
- this._storageToken = 'bb-language-dictionary-id';
18
- // Current language dictionary.
19
- this._currentLanguage = null;
20
- this._currentDictionary = null;
19
+ this._transforms = _transforms;
20
+ // Readonly data.
21
+ this._storageToken = this._config?.storageToken ?? 'bb-language-dictionary-id';
22
+ this._availableLanguages = this?._config?.languages ?? [];
23
+ this._bestMatchingLanguage = this.retrieveBestMatchingLanguage();
24
+ this._loadedDictionaries = new Map();
25
+ // Current dictionary.
26
+ this._current = null;
21
27
  this.convertToParams = (tokenOrParams) => {
22
28
  if (typeof tokenOrParams !== 'string') {
23
29
  // Destruct the params from the object.
24
- const { token, optional, data } = tokenOrParams;
30
+ const { token, optional, dictionary, data } = tokenOrParams;
25
31
  // Make sure all parameters are valid
26
32
  // by type safe adding them.
27
- return { token: token, optional: optional ?? false, data: data ?? {} };
33
+ return { token: token, optional: optional ?? false, dictionary: dictionary ?? null, data: data ?? {} };
28
34
  }
29
35
  // If the parameter is a string fill in the blanks.
30
- return { token: tokenOrParams, optional: false, data: {} };
36
+ return { token: tokenOrParams, optional: false, dictionary: null, data: {} };
31
37
  };
32
- this.getMatches = (value, substitutions) => {
33
- // Get the matching substitutions.
34
- const { start, end } = substitutions;
35
- // Compose a regex that will find the matches.
36
- const regex = new RegExp(`${start}([^${end}]+)${end}`, 'g');
37
- // Execute the regex to find matches.
38
- let match = regex.exec(value);
39
- const matches = [];
40
- while (match !== null) {
41
- matches.push({ match: match[0], token: match[1] });
42
- match = regex.exec(value);
43
- }
44
- // Return the processed value.
45
- return matches.filter(item => !!item);
46
- };
47
- // Check if at least one language was passed in the config.
48
- this._availableLanguages = this._config.languages;
49
- if (this._availableLanguages.length < 1) {
50
- throw new Error('Localize: one or more languages should be supplied.');
51
- }
52
- // Gather all the localize functions.
53
- this._functionMiddleware = this._functions.reduce((previous, current) => {
54
- previous[current.keyword()] = current;
55
- return previous;
56
- }, {});
57
- // Save the best matching current dictionary.
58
- this._bestMatchingLanguage = this.retrieveBestMatchingLanguage();
59
38
  this.renderDocumentLanguage();
60
39
  }
61
40
  get languages() {
62
41
  return this._availableLanguages ?? [];
63
42
  }
64
43
  get current() {
65
- return this._currentLanguage;
66
- }
67
- async set(language, cache = true) {
68
- // Await the language data and set the current
69
- // dictionary to the loaded data.
70
- this._currentLanguage = language ?? this._availableLanguages?.[0];
71
- if (this._currentLanguage) {
72
- this._currentDictionary = await this._currentLanguage.data();
44
+ return this._current;
45
+ }
46
+ async load(id) {
47
+ if (id === null || id === undefined) {
48
+ throw new Error(`Cannot load language with id: "${id}".`);
49
+ }
50
+ if (this._loadedDictionaries.has(id)) {
51
+ return this._loadedDictionaries.get(id);
52
+ }
53
+ const language = this.languages?.find(language => language?.id === id);
54
+ if (!language || !language?.data) {
55
+ console?.warn?.(`No language was found with id: "${id}"; Defaulting to first available language.`);
56
+ const languageId = this.languages?.[0]?.id ?? null;
57
+ return this.load(languageId);
73
58
  }
74
- // Save the selected language in the storage.
59
+ const dictionaryDataValues = await language?.data?.();
60
+ const dictionary = this.createDictionary(dictionaryDataValues, language);
61
+ this._loadedDictionaries.set(id, dictionary);
62
+ return dictionary;
63
+ }
64
+ async switch(id, options) {
65
+ this._current = await this.load(id);
66
+ const cache = options?.cache ?? true;
75
67
  if (cache) {
76
- this._storage.cookie.set(this._storageToken, this._currentLanguage?.id, {});
68
+ this._storage.cookie.set(this._storageToken, this._current?.id, {});
69
+ }
70
+ const reload = options?.reload ?? false;
71
+ if (reload) {
72
+ this._window?.location?.reload?.();
77
73
  }
74
+ return this._current;
75
+ }
76
+ select(id) {
77
+ if (!this._loadedDictionaries.has(id)) {
78
+ throw new Error(`Dictionary with id: "${id}" not loaded; Load dictionary first before using .select(:id).`);
79
+ }
80
+ return this._loadedDictionaries.get(id);
78
81
  }
79
82
  initialize() {
80
- return async () => this.set(this._bestMatchingLanguage, false);
83
+ return async () => this.switch(this._bestMatchingLanguage?.id, { reload: false, cache: false });
81
84
  }
82
85
  clear() {
83
86
  this._storage.cookie.remove(this._storageToken);
84
87
  }
88
+ transform(value, data = {}) {
89
+ return (this._transforms ?? []).reduce((previous, current) => {
90
+ return current.execute(previous, data, this);
91
+ }, value);
92
+ }
85
93
  translate(tokenOrParams) {
86
94
  // 1. Convert to the params.
87
95
  const params = this.convertToParams(tokenOrParams);
88
96
  // 2. Try to find the translation in the dictionary.
89
- const searchResult = this._currentDictionary.get(params?.token);
97
+ const dictionary = this.getDictionary(params?.dictionary);
98
+ const searchResult = !!dictionary ? dictionary.get(params?.token) : null;
90
99
  // 3. Verify the translation was found.
91
100
  if (!searchResult) {
92
101
  return this._missingHandler.handle(params);
93
102
  }
94
- // 4. Find references in the translation that need to be translated as well.
95
- const processResult = this.findReferencesInTranslation(searchResult);
96
- // 5. Parse the interpolation data.
97
- return this.parseInterpolationData(processResult, params?.data);
98
- }
99
- parseInterpolationData(value, data) {
100
- // Get the interpolation substitutions.
101
- const substitutions = this.getSubstitutions('interpolation', ['{{', '}}']);
102
- // Get all matches in the value.
103
- const matches = this.getMatches(value, substitutions);
104
- // Replace all matches with the parsed value.
105
- return matches.reduce((previous, current) => {
106
- // Try to parse the token.
107
- const interpolatedToken = this.interpolateFunctionData(current?.token, data);
108
- // Replace the match with the parsed token.
109
- return previous.replace(current?.match, interpolatedToken);
110
- }, `${value}`);
111
- }
112
- interpolateFunctionData(value, interpolationData) {
113
- // Get the token and the methods by splitting
114
- // on the pipe symbol.
115
- const [token, ...methods] = value.split('|').map(item => item.trim());
116
- // Get the value for the token from
117
- // the interpolation data.
118
- const interpolationValue = interpolationData?.[token] ?? token;
119
- // Loop through all the middleware methods and try to
120
- // conform the string to the given parameters.
121
- return methods.reduce((string, middlewareName) => {
122
- // Try to retrieve the middleware from the collection.
123
- const middleware = this._functionMiddleware[middlewareName];
124
- // If the middleware is missing return an error
125
- // so that the user knows it was not found.
126
- if (!middleware) {
127
- return string;
128
- }
129
- // Execute the middleware function with the string.
130
- return middleware.transform(string, this.current?.locale);
131
- }, `${interpolationValue}`);
132
- }
133
- findReferencesInTranslation(value) {
134
- // Get the reference substitutions.
135
- const substitutions = this.getSubstitutions('references', ['#(', ')']);
136
- // Get all matches in the value.
137
- const matches = this.getMatches(value, substitutions);
138
- // Replace all matches with the translated value.
139
- return matches.reduce((previous, current) => {
140
- // Try to translate the token.
141
- const translatedToken = this.translate(current?.token);
142
- // Replace the match with the translated token.
143
- return previous.replace(current?.match, translatedToken);
144
- }, value);
145
- }
146
- getSubstitutions(type, defaultValue) {
147
- // Get the substitutions.
148
- const substitutions = this._config?.substitutions?.[type] ?? null;
149
- const value = (!substitutions || substitutions.length !== 2)
150
- ? defaultValue
151
- : substitutions;
152
- // Escape both substitutions so that they
153
- // can be used.
154
- const escape = /[.*+?^${}()|[\]\\]/g;
155
- const start = value[0].replace(escape, '\\$&');
156
- const end = value[1].replace(escape, '\\$&');
157
- // Return the substitutions.
158
- return { start, end };
103
+ return this.transform(searchResult, params?.data);
159
104
  }
160
105
  retrieveBestMatchingLanguage() {
161
- // Get the language based on storage.
162
- const storageLanguage = this.getLanguageFromStorage();
163
- // Get the language based on the supported languages of the browser.
164
- const browserLanguage = this.getBestBrowserMatchLanguage();
165
- // Return the best matching language.
166
- return storageLanguage ?? browserLanguage ?? this._availableLanguages?.[0];
106
+ return this.getLanguageFromStorage()
107
+ ?? this.getBestBrowserMatchLanguage()
108
+ ?? this._availableLanguages?.[0];
167
109
  }
168
110
  getLanguageFromStorage() {
169
111
  // Get id from the storage.
@@ -179,6 +121,15 @@ export class Localize {
179
121
  return this._availableLanguages.find(item => item?.supported?.includes(languageCode));
180
122
  }).filter(item => !!item).find((_, index) => index === 0);
181
123
  }
124
+ createDictionary(data, language) {
125
+ return new LocalizeDictionary(language?.id, language?.locale, language?.supported, data?.data, this);
126
+ }
127
+ getDictionary(id) {
128
+ if (id === null || id === undefined) {
129
+ return this._current;
130
+ }
131
+ return this.select(id);
132
+ }
182
133
  renderDocumentLanguage() {
183
134
  const element = this._document?.documentElement;
184
135
  if (!element) {
@@ -187,13 +138,18 @@ export class Localize {
187
138
  element.lang = this._bestMatchingLanguage?.supported?.[0] ?? this._bestMatchingLanguage?.locale;
188
139
  }
189
140
  }
190
- Localize.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: Localize, deps: [{ token: i1.Storage }, { token: i2.Languages }, { token: i3.LocalizeConfig, optional: true }, { token: i4.LocalizeMissingHandler }, { token: DOCUMENT, optional: true }, { token: LOCALIZE_FUNCTION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
141
+ Localize.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: Localize, deps: [{ token: i1.Storage }, { token: i2.Languages }, { token: i3.LocalizeMissingHandler }, { token: i4.LocalizeConfig, optional: true }, { token: WINDOW, optional: true }, { token: DOCUMENT, optional: true }, { token: LOCALIZE_TRANSFORM, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
191
142
  Localize.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: Localize });
192
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: Localize, decorators: [{
193
144
  type: Injectable
194
- }], ctorParameters: function () { return [{ type: i1.Storage }, { type: i2.Languages }, { type: i3.LocalizeConfig, decorators: [{
145
+ }], ctorParameters: function () { return [{ type: i1.Storage }, { type: i2.Languages }, { type: i3.LocalizeMissingHandler }, { type: i4.LocalizeConfig, decorators: [{
195
146
  type: Optional
196
- }] }, { type: i4.LocalizeMissingHandler }, { type: Document, decorators: [{
147
+ }] }, { type: Window, decorators: [{
148
+ type: Optional
149
+ }, {
150
+ type: Inject,
151
+ args: [WINDOW]
152
+ }] }, { type: Document, decorators: [{
197
153
  type: Optional
198
154
  }, {
199
155
  type: Inject,
@@ -202,6 +158,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
202
158
  type: Optional
203
159
  }, {
204
160
  type: Inject,
205
- args: [LOCALIZE_FUNCTION]
161
+ args: [LOCALIZE_TRANSFORM]
206
162
  }] }]; } });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL2xpYi9sb2NhbGl6ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBd0MsTUFBTSxtQ0FBbUMsQ0FBQztBQUkzRyxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFHekMsTUFBTSxPQUFPLFFBQVE7SUFhakIsWUFBb0IsUUFBaUIsRUFDakIsVUFBcUIsRUFDVCxPQUF1QixFQUNuQyxlQUF1QyxFQUNULFNBQW9CLEVBQ1gsVUFBK0I7UUFMdEUsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ1QsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDbkMsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ1QsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNYLGVBQVUsR0FBVixVQUFVLENBQXFCO1FBWHpFLGtCQUFhLEdBQVcsMkJBQTJCLENBQUM7UUFFckUsK0JBQStCO1FBQ3ZCLHFCQUFnQixHQUFrQyxJQUFJLENBQUM7UUFDdkQsdUJBQWtCLEdBQThCLElBQUksQ0FBQztRQXFMckQsb0JBQWUsR0FBRyxDQUFDLGFBQXNDLEVBQUUsRUFBRTtZQUNqRSxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtnQkFDbkMsdUNBQXVDO2dCQUN2QyxNQUFNLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsR0FBRyxhQUFhLENBQUM7Z0JBRTlDLHFDQUFxQztnQkFDckMsNEJBQTRCO2dCQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVB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SSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBZ0JPLHNCQUFzQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTztTQUNWO1FBRUQsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUNwRyxDQUFDOztxR0FyTlEsUUFBUSxzSkFpQmUsUUFBUSw2QkFDUixpQkFBaUI7eUdBbEJ4QyxRQUFROzJGQUFSLFFBQVE7a0JBRHBCLFVBQVU7OzBCQWdCTSxRQUFRO21FQUV5QyxRQUFROzBCQUF6RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUMzQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TE9DQUxJWkVfRlVOQ1RJT04sIExvY2FsaXplRnVuY3Rpb24sIExvY2FsaXplRnVuY3Rpb25NYXB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplQ29uZmlnLCBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZXMnO1xuaW1wb3J0IHtMb2NhbGl6ZU9wdGlvbnNEYXRhLCBMb2NhbGl6ZVBhcmFtc30gZnJvbSAnLi9pbnRlcmZhY2VzL29wdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplTWlzc2luZ0hhbmRsZXJ9IGZyb20gJy4vaGFuZGxlcnMvbWlzc2luZy5oYW5kbGVyJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvY2FsaXplRGljdGlvbmFyeX0gZnJvbSAnLi9sb2NhbGl6ZS5kaWN0aW9uYXJ5JztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24vc3RvcmFnZSc7XG5pbXBvcnQge0xhbmd1YWdlc30gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24nO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvY2FsaXplIHtcblxuICAgIC8vIFJlYWRvbmx5IGRhdGEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXZhaWxhYmxlTGFuZ3VhZ2VzOiBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYmVzdE1hdGNoaW5nTGFuZ3VhZ2U6IExvY2FsaXplQ29uZmlnTGFuZ3VhZ2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mdW5jdGlvbk1pZGRsZXdhcmU6IExvY2FsaXplRnVuY3Rpb25NYXA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3RvcmFnZVRva2VuOiBzdHJpbmcgPSAnYmItbGFuZ3VhZ2UtZGljdGlvbmFyeS1pZCc7XG5cbiAgICAvLyBDdXJyZW50IGxhbmd1YWdlIGRpY3Rpb25hcnkuXG4gICAgcHJpdmF0ZSBfY3VycmVudExhbmd1YWdlOiBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfY3VycmVudERpY3Rpb25hcnk6IExvY2FsaXplRGljdGlvbmFyeSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9sYW5ndWFnZXM6IExhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9jb25maWc6IExvY2FsaXplQ29uZmlnLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX21pc3NpbmdIYW5kbGVyOiBMb2NhbGl6ZU1pc3NpbmdIYW5kbGVyLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50PzogRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMT0NBTElaRV9GVU5DVElPTikgcHJpdmF0ZSBfZnVuY3Rpb25zPzogTG9jYWxpemVGdW5jdGlvbltdKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBsYW5ndWFnZSB3YXMgcGFzc2VkIGluIHRoZSBjb25maWcuXG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcyA9IHRoaXMuX2NvbmZpZy5sYW5ndWFnZXM7XG4gICAgICAgIGlmICh0aGlzLl9hdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGl6ZTogb25lIG9yIG1vcmUgbGFuZ3VhZ2VzIHNob3VsZCBiZSBzdXBwbGllZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgdGhlIGxvY2FsaXplIGZ1bmN0aW9ucy5cbiAgICAgICAgdGhpcy5fZnVuY3Rpb25NaWRkbGV3YXJlID0gdGhpcy5fZnVuY3Rpb25zLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIHByZXZpb3VzW2N1cnJlbnQua2V5d29yZCgpXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICAvLyBTYXZlIHRoZSBiZXN0IG1hdGNoaW5nIGN1cnJlbnQgZGljdGlvbmFyeS5cbiAgICAgICAgdGhpcy5fYmVzdE1hdGNoaW5nTGFuZ3VhZ2UgPSB0aGlzLnJldHJpZXZlQmVzdE1hdGNoaW5nTGFuZ3VhZ2UoKTtcblxuICAgICAgICB0aGlzLnJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlTGFuZ3VhZ2VzID8/IFtdO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudExhbmd1YWdlO1xuICAgIH1cblxuICAgIGFzeW5jIHNldChsYW5ndWFnZTogTG9jYWxpemVDb25maWdMYW5ndWFnZSwgY2FjaGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIC8vIEF3YWl0IHRoZSBsYW5ndWFnZSBkYXRhIGFuZCBzZXQgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gZGljdGlvbmFyeSB0byB0aGUgbG9hZGVkIGRhdGEuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRMYW5ndWFnZSA9IGxhbmd1YWdlID8/IHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcz8uWzBdO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudExhbmd1YWdlKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50RGljdGlvbmFyeSA9IGF3YWl0IHRoaXMuX2N1cnJlbnRMYW5ndWFnZS5kYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpbiB0aGUgc3RvcmFnZS5cbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLmNvb2tpZS5zZXQ8c3RyaW5nPih0aGlzLl9zdG9yYWdlVG9rZW4sIHRoaXMuX2N1cnJlbnRMYW5ndWFnZT8uaWQsIHt9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB0aGlzLnNldCh0aGlzLl9iZXN0TWF0Y2hpbmdMYW5ndWFnZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLmNvb2tpZS5yZW1vdmUodGhpcy5fc3RvcmFnZVRva2VuKTtcbiAgICB9XG5cbiAgICB0cmFuc2xhdGUodG9rZW5PclBhcmFtczogc3RyaW5nIHwgTG9jYWxpemVQYXJhbXMpIHtcbiAgICAgICAgLy8gMS4gQ29udmVydCB0byB0aGUgcGFyYW1zLlxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbnZlcnRUb1BhcmFtcyh0b2tlbk9yUGFyYW1zKTtcblxuICAgICAgICAvLyAyLiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gaW4gdGhlIGRpY3Rpb25hcnkuXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdCA9IHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5LmdldChwYXJhbXM/LnRva2VuKTtcblxuICAgICAgICAvLyAzLiBWZXJpZnkgdGhlIHRyYW5zbGF0aW9uIHdhcyBmb3VuZC5cbiAgICAgICAgaWYgKCFzZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9taXNzaW5nSGFuZGxlci5oYW5kbGUocGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIEZpbmQgcmVmZXJlbmNlcyBpbiB0aGUgdHJhbnNsYXRpb24gdGhhdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgYXMgd2VsbC5cbiAgICAgICAgY29uc3QgcHJvY2Vzc1Jlc3VsdCA9IHRoaXMuZmluZFJlZmVyZW5jZXNJblRyYW5zbGF0aW9uKHNlYXJjaFJlc3VsdCk7XG5cbiAgICAgICAgLy8gNS4gUGFyc2UgdGhlIGludGVycG9sYXRpb24gZGF0YS5cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJbnRlcnBvbGF0aW9uRGF0YShwcm9jZXNzUmVzdWx0LCBwYXJhbXM/LmRhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VJbnRlcnBvbGF0aW9uRGF0YSh2YWx1ZTogc3RyaW5nLCBkYXRhOiBMb2NhbGl6ZU9wdGlvbnNEYXRhKSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW50ZXJwb2xhdGlvbiBzdWJzdGl0dXRpb25zLlxuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gdGhpcy5nZXRTdWJzdGl0dXRpb25zKCdpbnRlcnBvbGF0aW9uJywgWyd7eycsICd9fSddKTtcblxuICAgICAgICAvLyBHZXQgYWxsIG1hdGNoZXMgaW4gdGhlIHZhbHVlLlxuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5nZXRNYXRjaGVzKHZhbHVlLCBzdWJzdGl0dXRpb25zKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGFsbCBtYXRjaGVzIHdpdGggdGhlIHBhcnNlZCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoZXMucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRlZFRva2VuID0gdGhpcy5pbnRlcnBvbGF0ZUZ1bmN0aW9uRGF0YShjdXJyZW50Py50b2tlbiwgZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG1hdGNoIHdpdGggdGhlIHBhcnNlZCB0b2tlbi5cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cy5yZXBsYWNlKGN1cnJlbnQ/Lm1hdGNoLCBpbnRlcnBvbGF0ZWRUb2tlbik7XG4gICAgICAgIH0sIGAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW50ZXJwb2xhdGVGdW5jdGlvbkRhdGEodmFsdWU6IHN0cmluZywgaW50ZXJwb2xhdGlvbkRhdGE6IExvY2FsaXplT3B0aW9uc0RhdGEpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBhbmQgdGhlIG1ldGhvZHMgYnkgc3BsaXR0aW5nXG4gICAgICAgIC8vIG9uIHRoZSBwaXBlIHN5bWJvbC5cbiAgICAgICAgY29uc3QgW3Rva2VuLCAuLi5tZXRob2RzXSA9IHZhbHVlLnNwbGl0KCd8JykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgZm9yIHRoZSB0b2tlbiBmcm9tXG4gICAgICAgIC8vIHRoZSBpbnRlcnBvbGF0aW9uIGRhdGEuXG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25WYWx1ZSA9IGludGVycG9sYXRpb25EYXRhPy5bdG9rZW5dID8/IHRva2VuO1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIG1pZGRsZXdhcmUgbWV0aG9kcyBhbmQgdHJ5IHRvXG4gICAgICAgIC8vIGNvbmZvcm0gdGhlIHN0cmluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgcmV0dXJuIG1ldGhvZHMucmVkdWNlKChzdHJpbmcsIG1pZGRsZXdhcmVOYW1lKSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gcmV0cmlldmUgdGhlIG1pZGRsZXdhcmUgZnJvbSB0aGUgY29sbGVjdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZXdhcmUgPSB0aGlzLl9mdW5jdGlvbk1pZGRsZXdhcmVbbWlkZGxld2FyZU5hbWVdO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbWlkZGxld2FyZSBpcyBtaXNzaW5nIHJldHVybiBhbiBlcnJvclxuICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgdXNlciBrbm93cyBpdCB3YXMgbm90IGZvdW5kLlxuICAgICAgICAgICAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWlkZGxld2FyZSBmdW5jdGlvbiB3aXRoIHRoZSBzdHJpbmcuXG4gICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZS50cmFuc2Zvcm0oc3RyaW5nLCB0aGlzLmN1cnJlbnQ/LmxvY2FsZSk7XG4gICAgICAgIH0sIGAke2ludGVycG9sYXRpb25WYWx1ZX1gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRSZWZlcmVuY2VzSW5UcmFuc2xhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEdldCB0aGUgcmVmZXJlbmNlIHN1YnN0aXR1dGlvbnMuXG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoJ3JlZmVyZW5jZXMnLCBbJyMoJywgJyknXSk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCBtYXRjaGVzIGluIHRoZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgc3Vic3RpdHV0aW9ucyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyB3aXRoIHRoZSB0cmFuc2xhdGVkIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRUb2tlbiA9IHRoaXMudHJhbnNsYXRlKGN1cnJlbnQ/LnRva2VuKTtcblxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgbWF0Y2ggd2l0aCB0aGUgdHJhbnNsYXRlZCB0b2tlbi5cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cy5yZXBsYWNlKGN1cnJlbnQ/Lm1hdGNoLCB0cmFuc2xhdGVkVG9rZW4pO1xuICAgICAgICB9LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdWJzdGl0dXRpb25zKHR5cGU6ICdyZWZlcmVuY2VzJyB8ICdpbnRlcnBvbGF0aW9uJywgZGVmYXVsdFZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgICAvLyBHZXQgdGhlIHN1YnN0aXR1dGlvbnMuXG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLl9jb25maWc/LnN1YnN0aXR1dGlvbnM/Llt0eXBlXSA/PyBudWxsO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICghc3Vic3RpdHV0aW9ucyB8fCBzdWJzdGl0dXRpb25zLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgID8gZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICA6IHN1YnN0aXR1dGlvbnM7XG5cbiAgICAgICAgLy8gRXNjYXBlIGJvdGggc3Vic3RpdHV0aW9ucyBzbyB0aGF0IHRoZXlcbiAgICAgICAgLy8gY2FuIGJlIHVzZWQuXG4gICAgICAgIGNvbnN0IGVzY2FwZSA9IC9bLiorP14ke30oKXxbXFxdXFxcXF0vZztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB2YWx1ZVswXS5yZXBsYWNlKGVzY2FwZSwgJ1xcXFwkJicpO1xuICAgICAgICBjb25zdCBlbmQgPSB2YWx1ZVsxXS5yZXBsYWNlKGVzY2FwZSwgJ1xcXFwkJicpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgc3Vic3RpdHV0aW9ucy5cbiAgICAgICAgcmV0dXJuIHtzdGFydCwgZW5kfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJldHJpZXZlQmVzdE1hdGNoaW5nTGFuZ3VhZ2UoKSB7XG4gICAgICAgIC8vIEdldCB0aGUgbGFuZ3VhZ2UgYmFzZWQgb24gc3RvcmFnZS5cbiAgICAgICAgY29uc3Qgc3RvcmFnZUxhbmd1YWdlID0gdGhpcy5nZXRMYW5ndWFnZUZyb21TdG9yYWdlKCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcyBvZiB0aGUgYnJvd3Nlci5cbiAgICAgICAgY29uc3QgYnJvd3Nlckxhbmd1YWdlID0gdGhpcy5nZXRCZXN0QnJvd3Nlck1hdGNoTGFuZ3VhZ2UoKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGJlc3QgbWF0Y2hpbmcgbGFuZ3VhZ2UuXG4gICAgICAgIHJldHVybiBzdG9yYWdlTGFuZ3VhZ2UgPz8gYnJvd3Nlckxhbmd1YWdlID8/IHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcz8uWzBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TGFuZ3VhZ2VGcm9tU3RvcmFnZSgpIHtcbiAgICAgICAgLy8gR2V0IGlkIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5fc3RvcmFnZS5jb29raWUuZ2V0PHN0cmluZz4odGhpcy5fc3RvcmFnZVRva2VuKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGxhbmd1YWdlIGJhc2VkIG9uIHRoZSBzdG9yYWdlIGlkLlxuICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlTGFuZ3VhZ2VzLmZpbmQoaXRlbSA9PiBpdGVtPy5pZCA9PT0gaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmVzdEJyb3dzZXJNYXRjaExhbmd1YWdlKCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGJyb3dzZXIgbGFuZ3VhZ2VzIGFuZCByZXR1cm4gdGhlXG4gICAgICAgIC8vIGJlc3QgbWF0Y2hpbmcgbGFuZ3VhZ2UuXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZXMuYWxsLm1hcCgoe2NvZGUsIHJlZ2lvbn0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlQ29kZSA9IFtjb2RlLCByZWdpb25dLmZpbHRlcihkYXRhID0+ICEhZGF0YSkuam9pbignLScpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlTGFuZ3VhZ2VzLmZpbmQoaXRlbSA9PiBpdGVtPy5zdXBwb3J0ZWQ/LmluY2x1ZGVzKGxhbmd1YWdlQ29kZSkpO1xuICAgICAgICB9KS5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pLmZpbmQoKF8sIGluZGV4KSA9PiBpbmRleCA9PT0gMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9QYXJhbXMgPSAodG9rZW5PclBhcmFtczogc3RyaW5nIHwgTG9jYWxpemVQYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbk9yUGFyYW1zICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gRGVzdHJ1Y3QgdGhlIHBhcmFtcyBmcm9tIHRoZSBvYmplY3QuXG4gICAgICAgICAgICBjb25zdCB7dG9rZW4sIG9wdGlvbmFsLCBkYXRhfSA9IHRva2VuT3JQYXJhbXM7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgcGFyYW1ldGVycyBhcmUgdmFsaWRcbiAgICAgICAgICAgIC8vIGJ5IHR5cGUgc2FmZSBhZGRpbmcgdGhlbS5cbiAgICAgICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuLCBvcHRpb25hbDogb3B0aW9uYWwgPz8gZmFsc2UsIGRhdGE6IGRhdGEgPz8ge319O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHN0cmluZyBmaWxsIGluIHRoZSBibGFua3MuXG4gICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuT3JQYXJhbXMsIG9wdGlvbmFsOiBmYWxzZSwgZGF0YToge319O1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQubGFuZyA9IHRoaXMuX2Jlc3RNYXRjaGluZ0xhbmd1YWdlPy5zdXBwb3J0ZWQ/LlswXSA/PyB0aGlzLl9iZXN0TWF0Y2hpbmdMYW5ndWFnZT8ubG9jYWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hlcyA9ICh2YWx1ZTogc3RyaW5nLCBzdWJzdGl0dXRpb25zOiB7IHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgLy8gR2V0IHRoZSBtYXRjaGluZyBzdWJzdGl0dXRpb25zLlxuICAgICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBzdWJzdGl0dXRpb25zO1xuXG4gICAgICAgIC8vIENvbXBvc2UgYSByZWdleCB0aGF0IHdpbGwgZmluZCB0aGUgbWF0Y2hlcy5cbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAke3N0YXJ0fShbXiR7ZW5kfV0rKSR7ZW5kfWAsICdnJyk7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcmVnZXggdG8gZmluZCBtYXRjaGVzLlxuICAgICAgICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHZhbHVlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHttYXRjaDogbWF0Y2hbMF0sIHRva2VuOiBtYXRjaFsxXX0pO1xuICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUgcHJvY2Vzc2VkIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pO1xuICAgIH07XG5cbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL2xpYi9sb2NhbGl6ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBSXRFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRWpFLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQVksTUFBTSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFHekMsTUFBTSxPQUFPLFFBQVE7SUFZakIsWUFBb0IsUUFBaUIsRUFDakIsVUFBcUIsRUFDckIsZUFBdUMsRUFDM0IsT0FBd0IsRUFDUixPQUFnQixFQUNkLFNBQW9CLEVBQ1YsV0FBaUM7UUFOekUsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3JCLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ1YsZ0JBQVcsR0FBWCxXQUFXLENBQXNCO1FBaEI3RixpQkFBaUI7UUFDQSxrQkFBYSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLDJCQUEyQixDQUFDO1FBQ2xGLHdCQUFtQixHQUE2QixJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDL0UsMEJBQXFCLEdBQTJCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBRXBGLHdCQUFtQixHQUFvQyxJ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Q0FBQyxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0lBQ3BHLENBQUM7O3FHQW5KUSxRQUFRLHNKQWdCZSxNQUFNLDZCQUNOLFFBQVEsNkJBQ1Isa0JBQWtCO3lHQWxCekMsUUFBUTsyRkFBUixRQUFRO2tCQURwQixVQUFVOzswQkFnQk0sUUFBUTs4QkFDcUMsTUFBTTswQkFBbkQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNOzhCQUN3QixRQUFROzBCQUF6RCxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUMzQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9jYWxpemVDb25maWcsIExvY2FsaXplQ29uZmlnTGFuZ3VhZ2V9IGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xPQ0FMSVpFX1RSQU5TRk9STX0gZnJvbSAnLi9pbnRlcmZhY2VzL3RyYW5zZm9ybXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplRGljdGlvbmFyeURhdGF9IGZyb20gJy4vZGljdGlvbmFyeS9kaWN0aW9uYXJ5LmRhdGEnO1xuaW1wb3J0IHtMb2NhbGl6ZVRyYW5zZm9ybX0gZnJvbSAnLi90cmFuc2Zvcm1zL2Fic3RyYWN0LnRyYW5zZm9ybSc7XG5pbXBvcnQge0xvY2FsaXplTWlzc2luZ0hhbmRsZXJ9IGZyb20gJy4vaGFuZGxlcnMvbWlzc2luZy5oYW5kbGVyJztcbmltcG9ydCB7TG9jYWxpemVEaWN0aW9uYXJ5fSBmcm9tICcuL2RpY3Rpb25hcnkvZGljdGlvbmFyeS5jbGFzcyc7XG5pbXBvcnQge0xvY2FsaXplUGFyYW1zfSBmcm9tICcuL2ludGVyZmFjZXMvb3B0aW9ucy5pbnRlcmZhY2VzJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xhbmd1YWdlcywgV0lORE9XfSBmcm9tICdAYnJhdm9iaXQvYmItZm91bmRhdGlvbic7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uL3N0b3JhZ2UnO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvY2FsaXplIHtcblxuICAgIC8vIFJlYWRvbmx5IGRhdGEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3RvcmFnZVRva2VuOiBzdHJpbmcgPSB0aGlzLl9jb25maWc/LnN0b3JhZ2VUb2tlbiA/PyAnYmItbGFuZ3VhZ2UtZGljdGlvbmFyeS1pZCc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXZhaWxhYmxlTGFuZ3VhZ2VzOiBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlW10gPSB0aGlzPy5fY29uZmlnPy5sYW5ndWFnZXMgPz8gW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYmVzdE1hdGNoaW5nTGFuZ3VhZ2U6IExvY2FsaXplQ29uZmlnTGFuZ3VhZ2UgPSB0aGlzLnJldHJpZXZlQmVzdE1hdGNoaW5nTGFuZ3VhZ2UoKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvYWRlZERpY3Rpb25hcmllczogTWFwPHN0cmluZywgTG9jYWxpemVEaWN0aW9uYXJ5PiA9IG5ldyBNYXA8c3RyaW5nLCBMb2NhbGl6ZURpY3Rpb25hcnk+KCk7XG5cbiAgICAvLyBDdXJyZW50IGRpY3Rpb25hcnkuXG4gICAgcHJpdmF0ZSBfY3VycmVudDogTG9jYWxpemVEaWN0aW9uYXJ5IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2xhbmd1YWdlczogTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX21pc3NpbmdIYW5kbGVyOiBMb2NhbGl6ZU1pc3NpbmdIYW5kbGVyLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2NvbmZpZz86IExvY2FsaXplQ29uZmlnLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoV0lORE9XKSBwcml2YXRlIF93aW5kb3c/OiBXaW5kb3csXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ/OiBEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KExPQ0FMSVpFX1RSQU5TRk9STSkgcHJpdmF0ZSBfdHJhbnNmb3Jtcz86IExvY2FsaXplVHJhbnNmb3JtW10pIHtcbiAgICAgICAgdGhpcy5yZW5kZXJEb2N1bWVudExhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxhbmd1YWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcyA/PyBbXTtcbiAgICB9XG5cbiAgICBnZXQgY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZChpZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBsb2FkIGxhbmd1YWdlIHdpdGggaWQ6IFwiJHtpZH1cIi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9sb2FkZWREaWN0aW9uYXJpZXMuaGFzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZERpY3Rpb25hcmllcy5nZXQoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmxhbmd1YWdlcz8uZmluZChsYW5ndWFnZSA9PiBsYW5ndWFnZT8uaWQgPT09IGlkKTtcbiAgICAgICAgaWYgKCFsYW5ndWFnZSB8fCAhbGFuZ3VhZ2U/LmRhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGU/Lndhcm4/LihgTm8gbGFuZ3VhZ2Ugd2FzIGZvdW5kIHdpdGggaWQ6IFwiJHtpZH1cIjsgRGVmYXVsdGluZyB0byBmaXJzdCBhdmFpbGFibGUgbGFuZ3VhZ2UuYCk7XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZUlkID0gdGhpcy5sYW5ndWFnZXM/LlswXT8uaWQgPz8gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQobGFuZ3VhZ2VJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaWN0aW9uYXJ5RGF0YVZhbHVlcyA9IGF3YWl0IGxhbmd1YWdlPy5kYXRhPy4oKTtcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuY3JlYXRlRGljdGlvbmFyeShkaWN0aW9uYXJ5RGF0YVZhbHVlcywgbGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLl9sb2FkZWREaWN0aW9uYXJpZXMuc2V0KGlkLCBkaWN0aW9uYXJ5KTtcbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3dpdGNoKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNhY2hlPzogYm9vbGVhbiwgcmVsb2FkPzogYm9vbGVhbiB9KSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnQgPSBhd2FpdCB0aGlzLmxvYWQoaWQpO1xuXG4gICAgICAgIGNvbnN0IGNhY2hlID0gb3B0aW9ucz8uY2FjaGUgPz8gdHJ1ZTtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLmNvb2tpZS5zZXQ8c3RyaW5nPih0aGlzLl9zdG9yYWdlVG9rZW4sIHRoaXMuX2N1cnJlbnQ/LmlkLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxvYWQgPSBvcHRpb25zPy5yZWxvYWQgPz8gZmFsc2U7XG4gICAgICAgIGlmIChyZWxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvdz8ubG9jYXRpb24/LnJlbG9hZD8uKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgICB9XG5cbiAgICBzZWxlY3QoaWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZERpY3Rpb25hcmllcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpY3Rpb25hcnkgd2l0aCBpZDogXCIke2lkfVwiIG5vdCBsb2FkZWQ7IExvYWQgZGljdGlvbmFyeSBmaXJzdCBiZWZvcmUgdXNpbmcgLnNlbGVjdCg6aWQpLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWREaWN0aW9uYXJpZXMuZ2V0KGlkKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4gdGhpcy5zd2l0Y2godGhpcy5fYmVzdE1hdGNoaW5nTGFuZ3VhZ2U/LmlkLCB7cmVsb2FkOiBmYWxzZSwgY2FjaGU6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UuY29va2llLnJlbW92ZSh0aGlzLl9zdG9yYWdlVG9rZW4pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBkYXRhOiBMb2NhbGl6ZVBhcmFtc1snZGF0YSddID0ge30pIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl90cmFuc2Zvcm1zID8/IFtdKS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudC5leGVjdXRlKHByZXZpb3VzLCBkYXRhLCB0aGlzKTtcbiAgICAgICAgfSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHRyYW5zbGF0ZSh0b2tlbk9yUGFyYW1zOiBzdHJpbmcgfCBMb2NhbGl6ZVBhcmFtcykge1xuICAgICAgICAvLyAxLiBDb252ZXJ0IHRvIHRoZSBwYXJhbXMuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29udmVydFRvUGFyYW1zKHRva2VuT3JQYXJhbXMpO1xuXG4gICAgICAgIC8vIDIuIFRyeSB0byBmaW5kIHRoZSB0cmFuc2xhdGlvbiBpbiB0aGUgZGljdGlvbmFyeS5cbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZ2V0RGljdGlvbmFyeShwYXJhbXM/LmRpY3Rpb25hcnkpO1xuICAgICAgICBjb25zdCBzZWFyY2hSZXN1bHQgPSAhIWRpY3Rpb25hcnkgPyBkaWN0aW9uYXJ5LmdldChwYXJhbXM/LnRva2VuKSA6IG51bGw7XG5cbiAgICAgICAgLy8gMy4gVmVyaWZ5IHRoZSB0cmFuc2xhdGlvbiB3YXMgZm91bmQuXG4gICAgICAgIGlmICghc2VhcmNoUmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWlzc2luZ0hhbmRsZXIuaGFuZGxlKHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc2VhcmNoUmVzdWx0LCBwYXJhbXM/LmRhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmV0cmlldmVCZXN0TWF0Y2hpbmdMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFuZ3VhZ2VGcm9tU3RvcmFnZSgpXG4gICAgICAgICAgICA/PyB0aGlzLmdldEJlc3RCcm93c2VyTWF0Y2hMYW5ndWFnZSgpXG4gICAgICAgICAgICA/PyB0aGlzLl9hdmFpbGFibGVMYW5ndWFnZXM/LlswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExhbmd1YWdlRnJvbVN0b3JhZ2UoKSB7XG4gICAgICAgIC8vIEdldCBpZCBmcm9tIHRoZSBzdG9yYWdlLlxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3N0b3JhZ2UuY29va2llLmdldDxzdHJpbmc+KHRoaXMuX3N0b3JhZ2VUb2tlbik7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgc3RvcmFnZSBpZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcy5maW5kKGl0ZW0gPT4gaXRlbT8uaWQgPT09IGlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJlc3RCcm93c2VyTWF0Y2hMYW5ndWFnZSgpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBicm93c2VyIGxhbmd1YWdlcyBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAvLyBiZXN0IG1hdGNoaW5nIGxhbmd1YWdlLlxuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VzLmFsbC5tYXAoKHtjb2RlLCByZWdpb259KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZUNvZGUgPSBbY29kZSwgcmVnaW9uXS5maWx0ZXIoZGF0YSA9PiAhIWRhdGEpLmpvaW4oJy0nKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcy5maW5kKGl0ZW0gPT4gaXRlbT8uc3VwcG9ydGVkPy5pbmNsdWRlcyhsYW5ndWFnZUNvZGUpKTtcbiAgICAgICAgfSkuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKS5maW5kKChfLCBpbmRleCkgPT4gaW5kZXggPT09IDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGljdGlvbmFyeShkYXRhOiBMb2NhbGl6ZURpY3Rpb25hcnlEYXRhLCBsYW5ndWFnZTogTG9jYWxpemVDb25maWdMYW5ndWFnZSkge1xuICAgICAgICByZXR1cm4gbmV3IExvY2FsaXplRGljdGlvbmFyeShsYW5ndWFnZT8uaWQsIGxhbmd1YWdlPy5sb2NhbGUsIGxhbmd1YWdlPy5zdXBwb3J0ZWQsIGRhdGE/LmRhdGEsIHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGljdGlvbmFyeShpZDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQubGFuZyA9IHRoaXMuX2Jlc3RNYXRjaGluZ0xhbmd1YWdlPy5zdXBwb3J0ZWQ/LlswXSA/PyB0aGlzLl9iZXN0TWF0Y2hpbmdMYW5ndWFnZT8ubG9jYWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udmVydFRvUGFyYW1zID0gKHRva2VuT3JQYXJhbXM6IHN0cmluZyB8IExvY2FsaXplUGFyYW1zKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5PclBhcmFtcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIERlc3RydWN0IHRoZSBwYXJhbXMgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAgICAgICAgY29uc3Qge3Rva2VuLCBvcHRpb25hbCwgZGljdGlvbmFyeSwgZGF0YX0gPSB0b2tlbk9yUGFyYW1zO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHBhcmFtZXRlcnMgYXJlIHZhbGlkXG4gICAgICAgICAgICAvLyBieSB0eXBlIHNhZmUgYWRkaW5nIHRoZW0uXG4gICAgICAgICAgICByZXR1cm4ge3Rva2VuOiB0b2tlbiwgb3B0aW9uYWw6IG9wdGlvbmFsID8/IGZhbHNlLCBkaWN0aW9uYXJ5OiBkaWN0aW9uYXJ5ID8/IG51bGwsIGRhdGE6IGRhdGEgPz8ge319O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHN0cmluZyBmaWxsIGluIHRoZSBibGFua3MuXG4gICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuT3JQYXJhbXMsIG9wdGlvbmFsOiBmYWxzZSwgZGljdGlvbmFyeTogbnVsbCwgZGF0YToge319O1xuICAgIH07XG5cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ export class LocalizeTransform {
2
+ getMatches(value, substitutions) {
3
+ // Validate our value exists, else return zero matches.
4
+ if (value === undefined || value === null) {
5
+ return [];
6
+ }
7
+ // Get the matching substitutions.
8
+ const { start, end } = this.getSubstitutions(substitutions);
9
+ // Compose a regex that will find the matches.
10
+ const regex = new RegExp(`${start}([^${end}]+)${end}`, 'g');
11
+ // Execute the regex to find matches.
12
+ let match = regex.exec(value);
13
+ const matches = [];
14
+ while (match !== null) {
15
+ matches.push({ match: match[0], token: match[1] });
16
+ match = regex.exec(value);
17
+ }
18
+ // Return the processed value.
19
+ return matches.filter(item => !!item);
20
+ }
21
+ getSubstitutions(value) {
22
+ // Escape both substitutions so that they can be used.
23
+ const escape = /[.*+?^${}()|[\]\\]/g;
24
+ const start = value[0].replace(escape, '\\$&');
25
+ const end = value[1].replace(escape, '\\$&');
26
+ // Return the substitutions.
27
+ return { start, end };
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QudHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9sb2NhbGl6ZS9zcmMvbGliL3RyYW5zZm9ybXMvYWJzdHJhY3QudHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBZ0IsaUJBQWlCO0lBSXpCLFVBQVUsQ0FBQyxLQUFhLEVBQUUsYUFBK0I7UUFDL0QsdURBQXVEO1FBQ3ZELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxrQ0FBa0M7UUFDbEMsTUFBTSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUQsOENBQThDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUU1RCxxQ0FBcUM7UUFDckMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBdUMsRUFBRSxDQUFDO1FBRXZELE9BQU8sS0FBSyxLQUFLLElBQUksRUFBRTtZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUNqRCxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QjtRQUVELDhCQUE4QjtRQUM5QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQXVCO1FBQzlDLHNEQUFzRDtRQUN0RCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3Qyw0QkFBNEI7UUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUN4QixDQUFDO0NBRUoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvY2FsaXplUGFyYW1zfSBmcm9tICcuLi9pbnRlcmZhY2VzL29wdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplfSBmcm9tICcuLi9sb2NhbGl6ZS5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvY2FsaXplVHJhbnNmb3JtIHtcblxuICAgIGFic3RyYWN0IGV4ZWN1dGUodmFsdWU6IHN0cmluZywgZGF0YTogTG9jYWxpemVQYXJhbXNbJ2RhdGEnXSwgbG9jYWxpemU6IExvY2FsaXplKTogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIGdldE1hdGNoZXModmFsdWU6IHN0cmluZywgc3Vic3RpdHV0aW9uczogW3N0cmluZywgc3RyaW5nXSkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBvdXIgdmFsdWUgZXhpc3RzLCBlbHNlIHJldHVybiB6ZXJvIG1hdGNoZXMuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIG1hdGNoaW5nIHN1YnN0aXR1dGlvbnMuXG4gICAgICAgIGNvbnN0IHtzdGFydCwgZW5kfSA9IHRoaXMuZ2V0U3Vic3RpdHV0aW9ucyhzdWJzdGl0dXRpb25zKTtcblxuICAgICAgICAvLyBDb21wb3NlIGEgcmVnZXggdGhhdCB3aWxsIGZpbmQgdGhlIG1hdGNoZXMuXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtzdGFydH0oW14ke2VuZH1dKykke2VuZH1gLCAnZycpO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIHJlZ2V4IHRvIGZpbmQgbWF0Y2hlcy5cbiAgICAgICAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IHsgbWF0Y2g6IHN0cmluZywgdG9rZW46IHN0cmluZyB9W10gPSBbXTtcblxuICAgICAgICB3aGlsZSAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7bWF0Y2g6IG1hdGNoWzBdLCB0b2tlbjogbWF0Y2hbMV19KTtcbiAgICAgICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHByb2Nlc3NlZCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoZXMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U3Vic3RpdHV0aW9ucyh2YWx1ZTogW3N0cmluZywgc3RyaW5nXSkge1xuICAgICAgICAvLyBFc2NhcGUgYm90aCBzdWJzdGl0dXRpb25zIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZC5cbiAgICAgICAgY29uc3QgZXNjYXBlID0gL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nO1xuICAgICAgICBjb25zdCBzdGFydCA9IHZhbHVlWzBdLnJlcGxhY2UoZXNjYXBlLCAnXFxcXCQmJyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IHZhbHVlWzFdLnJlcGxhY2UoZXNjYXBlLCAnXFxcXCQmJyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBzdWJzdGl0dXRpb25zLlxuICAgICAgICByZXR1cm4ge3N0YXJ0LCBlbmR9O1xuICAgIH1cblxufVxuIl19
@@ -0,0 +1,54 @@
1
+ import { __decorate, __param } from "tslib";
2
+ import { LOCALIZE_FUNCTION } from '../interfaces/functions.interfaces';
3
+ import { LocalizeTransform } from './abstract.transform';
4
+ import { Inject, Optional } from '@angular/core';
5
+ let LocalizeInterpolateTransform = class LocalizeInterpolateTransform extends LocalizeTransform {
6
+ constructor(config, functions) {
7
+ super();
8
+ this.config = config;
9
+ this.functions = functions;
10
+ this.substitutions = this.config?.substitutions?.references ?? ['{{', '}}'];
11
+ this.functionsMap = (this.functions ?? []).reduce((previous, current) => {
12
+ previous[current?.keyword()] = current;
13
+ return previous;
14
+ }, {});
15
+ }
16
+ execute(value, data, localize) {
17
+ const matches = this.getMatches(value, this.substitutions);
18
+ // Replace all matches with the translated value.
19
+ return matches.reduce((previous, current) => {
20
+ // Try to parse the token.
21
+ const interpolatedToken = this.parseInterpolationToken(current?.token, data, localize);
22
+ // Replace the match with the translated token.
23
+ return previous.replace(current?.match, interpolatedToken);
24
+ }, value);
25
+ }
26
+ parseInterpolationToken(value, data, localize) {
27
+ // Get the token and the methods by splitting
28
+ // on the pipe symbol.
29
+ const [token, ...methods] = (value ?? '').split('|').map(item => item.trim());
30
+ // Get the value for the token from
31
+ // the interpolation data.
32
+ const interpolationValue = data?.[token] ?? 'null';
33
+ // Loop through all the middleware methods and try to
34
+ // conform the string to the given parameters.
35
+ return methods.reduce((string, middlewareName) => {
36
+ // Try to retrieve the middleware from the collection.
37
+ const middleware = this.functionsMap?.[middlewareName];
38
+ // If the middleware is missing return an error
39
+ // so that the user knows it was not found.
40
+ if (!middleware) {
41
+ return string;
42
+ }
43
+ // Execute the middleware function with the string.
44
+ return middleware.transform(string, localize?.current?.locale);
45
+ }, `${interpolationValue}`);
46
+ }
47
+ };
48
+ LocalizeInterpolateTransform = __decorate([
49
+ __param(0, Optional()),
50
+ __param(1, Optional()),
51
+ __param(1, Inject(LOCALIZE_FUNCTION))
52
+ ], LocalizeInterpolateTransform);
53
+ export { LocalizeInterpolateTransform };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJwb2xhdGUudHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9sb2NhbGl6ZS9zcmMvbGliL3RyYW5zZm9ybXMvaW50ZXJwb2xhdGUudHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQXdDLE1BQU0sb0NBQW9DLENBQUM7QUFHNUcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHeEMsSUFBTSw0QkFBNEIsR0FBbEMsTUFBTSw0QkFBNkIsU0FBUSxpQkFBaUI7SUFRL0QsWUFBa0MsTUFBc0IsRUFDSyxTQUE4QjtRQUN2RixLQUFLLEVBQUUsQ0FBQztRQUZzQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUNLLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBUGxGLGtCQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLGlCQUFZLEdBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDN0YsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN2QyxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFLUCxDQUFDO0lBRVEsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUE0QixFQUFFLFFBQWtCO1FBQzVFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzRCxpREFBaUQ7UUFDakQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3hDLDBCQUEwQjtZQUMxQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV2RiwrQ0FBK0M7WUFDL0MsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMvRCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRVMsdUJBQXVCLENBQUMsS0FBYSxFQUFFLElBQTRCLEVBQUUsUUFBa0I7UUFDN0YsNkNBQTZDO1FBQzdDLHNCQUFzQjtRQUN0QixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTlFLG1DQUFtQztRQUNuQywwQkFBMEI7UUFDMUIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7UUFFbkQscURBQXFEO1FBQ3JELDhDQUE4QztRQUM5QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDN0Msc0RBQXNEO1lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV2RCwrQ0FBK0M7WUFDL0MsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2IsT0FBTyxNQUFNLENBQUM7YUFDakI7WUFFRCxtREFBbUQ7WUFDbkQsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLENBQUMsRUFBRSxHQUFHLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBRUosQ0FBQTtBQXBEWSw0QkFBNEI7SUFReEIsV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFBRSxXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0dBVHpDLDRCQUE0QixDQW9EeEM7U0FwRFksNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMT0NBTElaRV9GVU5DVElPTiwgTG9jYWxpemVGdW5jdGlvbiwgTG9jYWxpemVGdW5jdGlvbk1hcH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mdW5jdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplUGFyYW1zfSBmcm9tICcuLi9pbnRlcmZhY2VzL29wdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplQ29uZmlnfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2VzJztcbmltcG9ydCB7TG9jYWxpemVUcmFuc2Zvcm19IGZyb20gJy4vYWJzdHJhY3QudHJhbnNmb3JtJztcbmltcG9ydCB7SW5qZWN0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvY2FsaXplfSBmcm9tICcuLi9sb2NhbGl6ZS5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIExvY2FsaXplSW50ZXJwb2xhdGVUcmFuc2Zvcm0gZXh0ZW5kcyBMb2NhbGl6ZVRyYW5zZm9ybSB7XG5cbiAgICByZWFkb25seSBzdWJzdGl0dXRpb25zID0gdGhpcy5jb25maWc/LnN1YnN0aXR1dGlvbnM/LnJlZmVyZW5jZXMgPz8gWyd7eycsICd9fSddO1xuICAgIHJlYWRvbmx5IGZ1bmN0aW9uc01hcDogTG9jYWxpemVGdW5jdGlvbk1hcCA9ICh0aGlzLmZ1bmN0aW9ucyA/PyBbXSkucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgICAgICBwcmV2aW91c1tjdXJyZW50Py5rZXl3b3JkKCldID0gY3VycmVudDtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByb3RlY3RlZCBjb25maWc6IExvY2FsaXplQ29uZmlnLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTE9DQUxJWkVfRlVOQ1RJT04pIHByb3RlY3RlZCBmdW5jdGlvbnM/OiBMb2NhbGl6ZUZ1bmN0aW9uW10pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBleGVjdXRlKHZhbHVlOiBzdHJpbmcsIGRhdGE6IExvY2FsaXplUGFyYW1zWydkYXRhJ10sIGxvY2FsaXplOiBMb2NhbGl6ZSkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5nZXRNYXRjaGVzKHZhbHVlLCB0aGlzLnN1YnN0aXR1dGlvbnMpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIG1hdGNoZXMgd2l0aCB0aGUgdHJhbnNsYXRlZCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoZXMucmVkdWNlKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRlZFRva2VuID0gdGhpcy5wYXJzZUludGVycG9sYXRpb25Ub2tlbihjdXJyZW50Py50b2tlbiwgZGF0YSwgbG9jYWxpemUpO1xuXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBtYXRjaCB3aXRoIHRoZSB0cmFuc2xhdGVkIHRva2VuLlxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzLnJlcGxhY2UoY3VycmVudD8ubWF0Y2gsIGludGVycG9sYXRlZFRva2VuKTtcbiAgICAgICAgfSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYXJzZUludGVycG9sYXRpb25Ub2tlbih2YWx1ZTogc3RyaW5nLCBkYXRhOiBMb2NhbGl6ZVBhcmFtc1snZGF0YSddLCBsb2NhbGl6ZTogTG9jYWxpemUpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBhbmQgdGhlIG1ldGhvZHMgYnkgc3BsaXR0aW5nXG4gICAgICAgIC8vIG9uIHRoZSBwaXBlIHN5bWJvbC5cbiAgICAgICAgY29uc3QgW3Rva2VuLCAuLi5tZXRob2RzXSA9ICh2YWx1ZSA/PyAnJykuc3BsaXQoJ3wnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHRva2VuIGZyb21cbiAgICAgICAgLy8gdGhlIGludGVycG9sYXRpb24gZGF0YS5cbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvblZhbHVlID0gZGF0YT8uW3Rva2VuXSA/PyAnbnVsbCc7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgbWlkZGxld2FyZSBtZXRob2RzIGFuZCB0cnkgdG9cbiAgICAgICAgLy8gY29uZm9ybSB0aGUgc3RyaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxuICAgICAgICByZXR1cm4gbWV0aG9kcy5yZWR1Y2UoKHN0cmluZywgbWlkZGxld2FyZU5hbWUpID0+IHtcbiAgICAgICAgICAgIC8vIFRyeSB0byByZXRyaWV2ZSB0aGUgbWlkZGxld2FyZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICAgICAgY29uc3QgbWlkZGxld2FyZSA9IHRoaXMuZnVuY3Rpb25zTWFwPy5bbWlkZGxld2FyZU5hbWVdO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbWlkZGxld2FyZSBpcyBtaXNzaW5nIHJldHVybiBhbiBlcnJvclxuICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgdXNlciBrbm93cyBpdCB3YXMgbm90IGZvdW5kLlxuICAgICAgICAgICAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWlkZGxld2FyZSBmdW5jdGlvbiB3aXRoIHRoZSBzdHJpbmcuXG4gICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZS50cmFuc2Zvcm0oc3RyaW5nLCBsb2NhbGl6ZT8uY3VycmVudD8ubG9jYWxlKTtcbiAgICAgICAgfSwgYCR7aW50ZXJwb2xhdGlvblZhbHVlfWApO1xuICAgIH1cblxufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { __decorate, __param } from "tslib";
2
+ import { LocalizeTransform } from './abstract.transform';
3
+ import { Optional } from '@angular/core';
4
+ let LocalizeReferenceTransform = class LocalizeReferenceTransform extends LocalizeTransform {
5
+ constructor(config) {
6
+ super();
7
+ this.config = config;
8
+ this.substitutions = this.config?.substitutions?.references ?? ['#(', ')'];
9
+ }
10
+ execute(value, _, localize) {
11
+ const matches = this.getMatches(value, this.substitutions);
12
+ // Replace all matches with the translated value.
13
+ return matches.reduce((previous, current) => {
14
+ // Try to translate the token.
15
+ const translatedToken = localize.translate(current?.token);
16
+ // Replace the match with the translated token.
17
+ return previous.replace(current?.match, translatedToken);
18
+ }, value);
19
+ }
20
+ };
21
+ LocalizeReferenceTransform = __decorate([
22
+ __param(0, Optional())
23
+ ], LocalizeReferenceTransform);
24
+ export { LocalizeReferenceTransform };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLnRyYW5zZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL2xpYi90cmFuc2Zvcm1zL3JlZmVyZW5jZS50cmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFaEMsSUFBTSwwQkFBMEIsR0FBaEMsTUFBTSwwQkFBMkIsU0FBUSxpQkFBaUI7SUFJN0QsWUFBa0MsTUFBc0I7UUFDcEQsS0FBSyxFQUFFLENBQUM7UUFEc0IsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFGL0Msa0JBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFJL0UsQ0FBQztJQUVRLE9BQU8sQ0FBQyxLQUFhLEVBQUUsQ0FBeUIsRUFBRSxRQUFrQjtRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFM0QsaURBQWlEO1FBQ2pELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN4Qyw4QkFBOEI7WUFDOUIsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFM0QsK0NBQStDO1lBQy9DLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FFSixDQUFBO0FBckJZLDBCQUEwQjtJQUl0QixXQUFBLFFBQVEsRUFBRSxDQUFBO0dBSmQsMEJBQTBCLENBcUJ0QztTQXJCWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvY2FsaXplUGFyYW1zfSBmcm9tICcuLi9pbnRlcmZhY2VzL29wdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xvY2FsaXplQ29uZmlnfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2VzJztcbmltcG9ydCB7TG9jYWxpemVUcmFuc2Zvcm19IGZyb20gJy4vYWJzdHJhY3QudHJhbnNmb3JtJztcbmltcG9ydCB7TG9jYWxpemV9IGZyb20gJy4uL2xvY2FsaXplLnNlcnZpY2UnO1xuaW1wb3J0IHtPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbGl6ZVJlZmVyZW5jZVRyYW5zZm9ybSBleHRlbmRzIExvY2FsaXplVHJhbnNmb3JtIHtcblxuICAgIHJlYWRvbmx5IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmNvbmZpZz8uc3Vic3RpdHV0aW9ucz8ucmVmZXJlbmNlcyA/PyBbJyMoJywgJyknXTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByb3RlY3RlZCBjb25maWc6IExvY2FsaXplQ29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZXhlY3V0ZSh2YWx1ZTogc3RyaW5nLCBfOiBMb2NhbGl6ZVBhcmFtc1snZGF0YSddLCBsb2NhbGl6ZTogTG9jYWxpemUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgdGhpcy5zdWJzdGl0dXRpb25zKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGFsbCBtYXRjaGVzIHdpdGggdGhlIHRyYW5zbGF0ZWQgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaGVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFRyeSB0byB0cmFuc2xhdGUgdGhlIHRva2VuLlxuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZFRva2VuID0gbG9jYWxpemUudHJhbnNsYXRlKGN1cnJlbnQ/LnRva2VuKTtcblxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgbWF0Y2ggd2l0aCB0aGUgdHJhbnNsYXRlZCB0b2tlbi5cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cy5yZXBsYWNlKGN1cnJlbnQ/Lm1hdGNoLCB0cmFuc2xhdGVkVG9rZW4pO1xuICAgICAgICB9LCB2YWx1ZSk7XG4gICAgfVxuXG59XG4iXX0=
@@ -2,16 +2,22 @@ export * from './lib/interfaces/config.interfaces';
2
2
  export * from './lib/interfaces/options.interfaces';
3
3
  export * from './lib/interfaces/functions.interfaces';
4
4
  export * from './lib/interfaces/handlers.interfaces';
5
+ export * from './lib/interfaces/transforms.interfaces';
5
6
  export * from './lib/functions/lowercase.function';
6
7
  export * from './lib/functions/uppercase.function';
7
8
  export * from './lib/functions/date.function';
8
9
  export * from './lib/localizations/english.localization';
9
10
  export * from './lib/localizations/dutch.localization';
10
11
  export * from './lib/handlers/missing.handler';
12
+ export * from './lib/dictionary/dictionary.data';
13
+ export * from './lib/dictionary/dictionary.class';
14
+ export * from './lib/dictionary/dictionary.context';
15
+ export * from './lib/transforms/abstract.transform';
16
+ export * from './lib/transforms/interpolate.transform';
17
+ export * from './lib/transforms/reference.transform';
11
18
  export * from './lib/views/localize-string/localize-string.component';
12
19
  export * from './lib/views/localize-template.directive';
13
- export * from './lib/localize.dictionary';
14
20
  export * from './lib/localize.service';
15
21
  export * from './lib/localize.pipe';
16
22
  export * from './lib/localize.module';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYywrQkFBK0IsQ0FBQztBQUU5QyxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsd0NBQXdDLENBQUM7QUFFdkQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUUvQyxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMseUNBQXlDLENBQUM7QUFFeEQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9vcHRpb25zLmludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9mdW5jdGlvbnMuaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2hhbmRsZXJzLmludGVyZmFjZXMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mdW5jdGlvbnMvbG93ZXJjYXNlLmZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Z1bmN0aW9ucy91cHBlcmNhc2UuZnVuY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZnVuY3Rpb25zL2RhdGUuZnVuY3Rpb24nO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2NhbGl6YXRpb25zL2VuZ2xpc2gubG9jYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xvY2FsaXphdGlvbnMvZHV0Y2gubG9jYWxpemF0aW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvaGFuZGxlcnMvbWlzc2luZy5oYW5kbGVyJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvdmlld3MvbG9jYWxpemUtc3RyaW5nL2xvY2FsaXplLXN0cmluZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmlld3MvbG9jYWxpemUtdGVtcGxhdGUuZGlyZWN0aXZlJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9jYWxpemUuZGljdGlvbmFyeSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2NhbGl6ZS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xvY2FsaXplLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9jYWxpemUubW9kdWxlJztcbiJdfQ==
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBRXZELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYyx3Q0FBd0MsQ0FBQztBQUV2RCxjQUFjLGdDQUFnQyxDQUFDO0FBRS9DLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLHFDQUFxQyxDQUFDO0FBRXBELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHNDQUFzQyxDQUFDO0FBRXJELGNBQWMsdURBQXVELENBQUM7QUFDdEUsY0FBYyx5Q0FBeUMsQ0FBQztBQUV4RCxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9vcHRpb25zLmludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9mdW5jdGlvbnMuaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2hhbmRsZXJzLmludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy90cmFuc2Zvcm1zLmludGVyZmFjZXMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mdW5jdGlvbnMvbG93ZXJjYXNlLmZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Z1bmN0aW9ucy91cHBlcmNhc2UuZnVuY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZnVuY3Rpb25zL2RhdGUuZnVuY3Rpb24nO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2NhbGl6YXRpb25zL2VuZ2xpc2gubG9jYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xvY2FsaXphdGlvbnMvZHV0Y2gubG9jYWxpemF0aW9uJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvaGFuZGxlcnMvbWlzc2luZy5oYW5kbGVyJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvZGljdGlvbmFyeS9kaWN0aW9uYXJ5LmRhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGljdGlvbmFyeS9kaWN0aW9uYXJ5LmNsYXNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpY3Rpb25hcnkvZGljdGlvbmFyeS5jb250ZXh0JztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNmb3Jtcy9hYnN0cmFjdC50cmFuc2Zvcm0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNmb3Jtcy9pbnRlcnBvbGF0ZS50cmFuc2Zvcm0nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHJhbnNmb3Jtcy9yZWZlcmVuY2UudHJhbnNmb3JtJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvdmlld3MvbG9jYWxpemUtc3RyaW5nL2xvY2FsaXplLXN0cmluZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmlld3MvbG9jYWxpemUtdGVtcGxhdGUuZGlyZWN0aXZlJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbG9jYWxpemUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9sb2NhbGl6ZS5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2xvY2FsaXplLm1vZHVsZSc7XG4iXX0=