@acorex/core 18.16.0-next.3 → 18.16.0-next.5

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.
@@ -1,15 +1,30 @@
1
1
  import { AXEventService, AXEventTypes } from '@acorex/core/events';
2
2
  import { Injectable, inject } from '@angular/core';
3
3
  import { get as lodashGet, set as lodashSet } from 'lodash-es';
4
- import { BehaviorSubject, catchError, finalize, firstValueFrom, forkJoin, lastValueFrom, map, of, shareReplay, startWith, switchMap, take, tap, } from 'rxjs';
4
+ import { BehaviorSubject, catchError, distinctUntilChanged, finalize, firstValueFrom, forkJoin, map, of, shareReplay, startWith, switchMap, tap, } from 'rxjs';
5
5
  import { AX_TRANSLATION_CONFIG } from './translation.config';
6
6
  import { AX_TRANSLATION_LOADER } from './translation.loader';
7
7
  import * as i0 from "@angular/core";
8
- let service;
8
+ let singletonInstance;
9
9
  export function translateSync(key, options) {
10
- return service.translateSync(key, options);
10
+ return singletonInstance.translateSync(key, options);
11
11
  }
12
12
  export class AXTranslationService {
13
+ getDefaultLang() {
14
+ return this.config.defaultLang;
15
+ }
16
+ getActiveLang() {
17
+ return this.activeLang.getValue();
18
+ }
19
+ setActiveLang(lang) {
20
+ if (lang != this.getActiveLang()) {
21
+ this.activeLang.next(lang);
22
+ this.eventService.emitEvent({
23
+ type: AXEventTypes.AXLanguageChanged,
24
+ payload: lang,
25
+ });
26
+ }
27
+ }
13
28
  /**
14
29
  * @ignore
15
30
  */
@@ -21,9 +36,9 @@ export class AXTranslationService {
21
36
  this.ongoingRequests = new Map();
22
37
  this.activeLang = new BehaviorSubject(this.getDefaultLang());
23
38
  this.langChanges$ = this.activeLang.asObservable();
24
- this.lastActiveLang = null;
25
- // eslint-disable-next-line @typescript-eslint/no-this-alias
26
- service = this;
39
+ this.expressionCache = new Map();
40
+ this.isExpression = (value) => value.includes('t(');
41
+ singletonInstance = this;
27
42
  }
28
43
  loadLanguagesAndScopes(languages, scopes) {
29
44
  const requests = languages.flatMap((lang) => scopes.map((scope) => {
@@ -32,19 +47,19 @@ export class AXTranslationService {
32
47
  return of(this.translationCache[lang][scope]);
33
48
  }
34
49
  // Use the new method to handle ongoing requests and loading
35
- return this.getOrLoadTranslations(lang, scope);
50
+ return this.fetchTranslationFiles(lang, scope);
36
51
  }));
37
52
  return forkJoin(requests);
38
53
  }
39
- getOrLoadTranslations(lang, scope) {
54
+ fetchTranslationFiles(lang, scope) {
40
55
  const requestKey = `${lang}_${scope}`;
41
56
  // Return existing observable if the request is already in progress
42
57
  if (this.ongoingRequests.has(requestKey)) {
43
58
  return this.ongoingRequests.get(requestKey);
44
59
  }
45
60
  // Load translations if not in cache or ongoing requests
46
- const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap((translations) => this.cacheTranslations(lang, scope, translations)), catchError((error) => {
47
- console.error(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
61
+ const translationObservable = this.loader.getTranslation({ lang, scope }).pipe(tap((translations) => this.setTranslationCache(lang, scope, translations)), catchError((error) => {
62
+ this.handleError(`Error loading translations for lang: ${lang}, scope: ${scope}`, error);
48
63
  return of(null);
49
64
  }), finalize(() => {
50
65
  this.eventService.emitEvent({
@@ -56,238 +71,139 @@ export class AXTranslationService {
56
71
  this.ongoingRequests.set(requestKey, translationObservable);
57
72
  return translationObservable;
58
73
  }
59
- cacheTranslations(lang, scope, translations) {
74
+ //#region Helpers Methods
75
+ /**
76
+ * Set translation data into cache
77
+ */
78
+ setTranslationCache(lang, scope, translations) {
60
79
  lodashSet(this.translationCache, `${lang}.${scope}`, translations);
61
80
  }
62
- getDefaultLang() {
63
- return this.config.defaultLang;
64
- }
65
- getActiveLang() {
66
- return this.activeLang.getValue();
67
- }
68
- setActiveLang(lang) {
69
- if (lang != this.getActiveLang()) {
70
- this.lastActiveLang = this.getActiveLang(); // Update last active language
71
- this.activeLang.next(lang);
72
- this.eventService.emitEvent({
73
- type: AXEventTypes.AXLanguageChanged,
74
- payload: lang,
75
- });
76
- }
81
+ /**
82
+ * Get the translation from the cache or fallback to loading
83
+ */
84
+ getTranslationFromCache(lang, scope, key) {
85
+ return lodashGet(this.translationCache, `${lang}.${scope}.${key}`, key);
77
86
  }
78
87
  isLangAvailable(lang, scope = null) {
79
88
  return !this.translationCache[lang] && (!scope || !this.translationCache[lang][scope]);
80
89
  }
81
- getLangAvailable() {
82
- return this.config.availableLangs;
83
- }
84
- load(key, options = {}) {
85
- const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options;
86
- // Function to fetch translation
87
- const fetchTranslation = (language) => {
88
- // Check if translations are available in the cache
89
- if (this.translationCache[language]?.[scope]) {
90
- return of(this.getTranslation(key, language, scope, options.params));
91
- }
92
- // Use the new method to handle ongoing requests and loading
93
- return this.getOrLoadTranslations(language, scope).pipe(map(() => {
94
- const translation = this.translationCache[language]?.[scope]?.[key] || key;
95
- return this.getTranslation(translation, language, scope, options.params);
96
- }), switchMap((translatedText) => {
97
- if (translatedText === key && language !== this.getDefaultLang()) {
98
- // If the translation is not found and the language is not default,
99
- // try fetching from the default language
100
- return fetchTranslation(this.getDefaultLang());
101
- }
102
- return of(translatedText);
103
- }));
104
- };
105
- // First, try to fetch the translation for the requested language
106
- const translationForRequestedLang = fetchTranslation(lang);
107
- // If lastActiveLang is available and different from the requested language, use it as a fallback
108
- if (this.lastActiveLang && this.lastActiveLang !== lang) {
109
- const translationForLastActiveLang = this.getTranslation(key, this.lastActiveLang, scope, options.params);
110
- return translationForRequestedLang.pipe(startWith(translationForLastActiveLang));
111
- }
112
- return translationForRequestedLang;
113
- }
114
- getTranslation(key, lang, scope, params) {
115
- let translation = (lodashGet(this.translationCache, `${lang}.${scope}.${key}`) || key);
90
+ translateKey(key, lang, scope, params) {
91
+ // Trigger async preloading without blocking execution
92
+ this.loadLanguagesAndScopes([lang], [scope]).subscribe({
93
+ error: (err) => this.handleError(`Error preloading translations for ${lang}, ${scope}`, err),
94
+ });
95
+ // Retrieve the translation from the cache or fallback to the key
96
+ let translation = this.getTranslationFromCache(lang, scope, key);
116
97
  // Replace params like {{ name }}
117
- if (params) {
98
+ if (params && typeof translation === 'string') {
118
99
  Object.keys(params).forEach((paramKey) => {
119
- const paramValue = params[paramKey];
120
- if (typeof translation !== 'string') {
121
- console.error(`${key} is not string`, { key, lang, scope, params, translation });
122
- }
123
- else {
124
- translation = translation.replace(new RegExp(`{{\\s*${paramKey}\\s*}}`, 'g'), paramValue);
125
- }
126
- });
127
- }
128
- if (typeof translation !== 'string') {
129
- console.error(`${key} is not string`, { key, lang, scope, params, translation });
130
- }
131
- else {
132
- // Replace translations like {{ t('key') }}
133
- const translationPattern = /{{\s*t\('([^']+)'\)\s*}}/g;
134
- translation = translation.replace(translationPattern, (match, innerKey) => {
135
- return this.getTranslation(innerKey, lang, scope, params);
100
+ translation = translation.replace(new RegExp(`{{\\s*${paramKey}\\s*}}`, 'g'), params[paramKey]);
136
101
  });
137
102
  }
138
- return translation;
103
+ return translation || key;
139
104
  }
140
- translate(key, options) {
141
- const result = this.findAXTranslateOptionsFromKey(key);
142
- if (result.length) {
143
- return this.langChanges$.pipe(startWith(this.getActiveLang()), switchMap((lang) => {
144
- return this.translateAsyncAXTranslate(key, options);
145
- }));
105
+ decodeExpression(expression) {
106
+ if (this.expressionCache.has(expression)) {
107
+ return this.expressionCache.get(expression);
146
108
  }
147
- else {
148
- if (options?.lang) {
149
- return this.load(key, options);
109
+ const regex = /t\(["']([^"']+)["']\s*(?:,\s*(\{.*?\}))?\)/g;
110
+ const matches = [];
111
+ let match;
112
+ while ((match = regex.exec(expression)) !== null) {
113
+ const key = match[1];
114
+ const rawOptions = match[2];
115
+ if (!rawOptions) {
116
+ matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
117
+ continue;
118
+ }
119
+ try {
120
+ const jsonString = rawOptions
121
+ .replace(/(['"])?([a-zA-Z0-9_]+)(['"])?\s*:/g, '"$2":') // Ensure keys are quoted
122
+ .replace(/'/g, '"'); // Replace single quotes with double quotes
123
+ const options = JSON.parse(jsonString);
124
+ matches.push({
125
+ key,
126
+ scope: options.scope || null,
127
+ lang: options.lang || null,
128
+ fullMatch: match[0],
129
+ });
130
+ }
131
+ catch (error) {
132
+ this.handleError(`Failed to parse options for key "${key}":`, error);
133
+ matches.push({ key, scope: null, lang: null, fullMatch: match[0] });
150
134
  }
151
- return this.langChanges$.pipe(startWith(this.getActiveLang()), switchMap((lang) => {
152
- return this.load(key, { ...options, lang: lang });
153
- }));
154
- }
155
- }
156
- async translateAsync(key, options) {
157
- const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};
158
- let translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
159
- if (!translation) {
160
- // If the translation is not in the cache, load it
161
- await firstValueFrom(this.load(key, { lang, scope }).pipe(take(1)));
162
- translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
163
- }
164
- // If still not available, try the last active language or default language
165
- if (!translation && this.lastActiveLang) {
166
- translation = lodashGet(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`);
167
135
  }
168
- if (!translation) {
169
- translation = lodashGet(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`);
136
+ this.expressionCache.set(expression, matches);
137
+ return matches;
138
+ }
139
+ handleError(message, error) {
140
+ console.error(message, error);
141
+ this.eventService.emitEvent({
142
+ type: 'error',
143
+ payload: { message, error },
144
+ });
145
+ }
146
+ //#endregion
147
+ //#region Async Translation Methods
148
+ translateText(text, contextLang, contextScope, params) {
149
+ if (!this.isExpression(text)) {
150
+ return of(this.translateKey(text, contextLang, contextScope, params));
170
151
  }
171
- // Perform parameter replacement
172
- return this.getTranslation((translation || key), lang, scope, options?.params);
152
+ const matches = this.decodeExpression(text);
153
+ // Extract unique languages and scopes for batch loading
154
+ const langScopeSet = new Set(matches.map(({ lang, scope }) => `${lang || contextLang}_${scope || contextScope}`));
155
+ const langs = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[0])));
156
+ const scopes = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[1])));
157
+ // Load all required languages and scopes
158
+ return this.loadLanguagesAndScopes(langs, scopes).pipe(map(() => {
159
+ // Resolve translations after loading
160
+ const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
161
+ const resolvedScope = scope || contextScope;
162
+ const resolvedLang = lang || contextLang;
163
+ acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
164
+ return acc;
165
+ }, {});
166
+ // Replace all matches in the text with their resolved translations
167
+ return matches.reduce((result, { fullMatch }) => result.replace(new RegExp(fullMatch.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), translations[fullMatch]), text);
168
+ }), catchError((error) => {
169
+ this.handleError(`Error during translation:`, error);
170
+ return of(text); // Fallback to the original text
171
+ }));
173
172
  }
174
- translateSync(key, options) {
175
- const { lang = this.getActiveLang(), scope = this.config.defaultScope } = options || {};
176
- // Check if the translation for the active language is available
177
- let translation = lodashGet(this.translationCache, `${lang}.${scope}.${key}`);
178
- //
179
- const loadLang = () => lastValueFrom(this.getOrLoadTranslations(lang, scope));
180
- // If not available, check lastActiveLang
181
- if (!translation && this.lastActiveLang) {
182
- loadLang();
183
- translation = lodashGet(this.translationCache, `${this.lastActiveLang}.${scope}.${key}`);
173
+ translate$(text, options) {
174
+ if (options?.lang) {
175
+ return this.translateText(text, options.lang, options?.scope ?? this.config.defaultScope, options?.params);
184
176
  }
185
- // If still not available, use the default language
186
- if (!translation) {
187
- loadLang();
188
- translation = lodashGet(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`);
189
- }
190
- // Perform parameter replacement
191
- return this.getTranslation((translation || key), lang, scope, options?.params);
177
+ return this.langChanges$.pipe(startWith(this.getActiveLang()), distinctUntilChanged(), switchMap((lang) => {
178
+ return this.translateText(text, lang, options?.scope ?? this.config.defaultScope, options?.params);
179
+ }));
192
180
  }
193
- // private findAXTranslateOptionsFromKey(
194
- // inputString: string,
195
- // ): (Omit<AXTranslateOptions, 'params'> & { key: string })[] {
196
- // const regex = /<axt(?:\s+lang="([^"]*)")?(?:\s+scope="([^"]*)")?>(.*?)<\/axt>/g;
197
- // const result: (Omit<AXTranslateOptions, 'params'> & { key: string })[] = [];
198
- // let match;
199
- // // Loop through all matches in the input string
200
- // while ((match = regex.exec(inputString)) !== null) {
201
- // result.push({
202
- // lang: match[1] || undefined,
203
- // scope: match[2] || undefined,
204
- // key: match[3] || undefined,
205
- // });
206
- // }
207
- // return result;
208
- // }
209
- findAXTranslateOptionsFromKey(inputString) {
210
- const regex = /t\(\s*['"]([^'"]+)['"]\s*(?:,\s*\{\s*([^}]*)\s*\})?\s*\)/g;
211
- const result = [];
212
- let match;
213
- // Loop through all matches in the input string
214
- while ((match = regex.exec(inputString)) !== null) {
215
- const key = match[1]; // Extract the key
216
- const options = match[2]; // Extract the options object, if present
217
- // Parse options into a key-value object
218
- const parsedOptions = {};
219
- if (options) {
220
- options.split(',').forEach((option) => {
221
- const [key, value] = option.split(':').map((s) => s.trim().replace(/^['"]|['"]$/g, ''));
222
- parsedOptions[key] = value || undefined;
223
- });
224
- }
225
- result.push({
226
- key,
227
- lang: parsedOptions['lang'],
228
- scope: parsedOptions['scope'],
229
- });
181
+ async translateAsync(text, options) {
182
+ return firstValueFrom(this.translate$(text, options));
183
+ }
184
+ //#endregion
185
+ //#region Sync Translation Methods
186
+ translateSync(text, options) {
187
+ if (this.isExpression(text)) {
188
+ return this.translateTextSync(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
189
+ }
190
+ else {
191
+ return this.translateKey(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
230
192
  }
231
- return result;
232
193
  }
233
- // private translateAsyncAXTranslate(key: string, options?: AXTranslateOptions): Observable<string> {
234
- // const regex = /(<axt(?:\s+lang="[^"]*")?(?:\s+scope="[^"]*")?>.*?<\/axt>)/g;
235
- // const splitParts = key.split(regex); // Split into <axt> parts and text parts
236
- // const translationObservables: Observable<string>[] = [];
237
- // for (const part of splitParts) {
238
- // const optionsFromKey = this.findAXTranslateOptionsFromKey(part);
239
- // if (optionsFromKey.length > 0) {
240
- // // This is an <axt> part, translate it
241
- // for (const parsed of optionsFromKey) {
242
- // const parsedLang = parsed.lang || options?.lang || this.getActiveLang();
243
- // const parsedScope = parsed.scope || options?.scope || this.config.defaultScope;
244
- // const parsedKey = parsed.key;
245
- // // Push the translation observable to the array
246
- // translationObservables.push(
247
- // this.load(parsedKey, {
248
- // lang: parsedLang,
249
- // scope: parsedScope,
250
- // params: options?.params,
251
- // }),
252
- // );
253
- // }
254
- // } else {
255
- // // This is plain text, so wrap it in an observable
256
- // translationObservables.push(of(part));
257
- // }
258
- // }
259
- // // Use forkJoin to wait for all observables to complete
260
- // return forkJoin(translationObservables).pipe(
261
- // map((translatedParts) => translatedParts.join('')), // Join all translated parts
262
- // );
263
- // }
264
- translateAsyncAXTranslate(key, options) {
265
- const regex = /(t\(['"][^'"]+['"](?:,\s*\{[^}]*\})?\))/g; // Match t('key', { ... }) calls
266
- const splitParts = key.split(regex); // Split into t() parts and text parts
267
- const translationObservables = [];
268
- for (const part of splitParts) {
269
- const optionsFromKey = this.findAXTranslateOptionsFromKey(part);
270
- if (optionsFromKey.length > 0) {
271
- // This is a t() part, translate it
272
- for (const parsed of optionsFromKey) {
273
- const parsedLang = parsed.lang || options?.lang || this.getActiveLang();
274
- const parsedScope = parsed.scope || options?.scope || this.config.defaultScope;
275
- const parsedKey = parsed.key;
276
- // Push the translation observable to the array
277
- translationObservables.push(this.load(parsedKey, {
278
- lang: parsedLang,
279
- scope: parsedScope,
280
- params: options?.params,
281
- }));
282
- }
283
- }
284
- else {
285
- // This is plain text, so wrap it in an observable
286
- translationObservables.push(of(part));
194
+ translateTextSync(text, contextLang, contextScope, params) {
195
+ const matches = this.decodeExpression(text);
196
+ const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
197
+ const resolvedScope = scope || contextScope;
198
+ const resolvedLang = lang || contextLang;
199
+ // Cache translation to avoid redundant processing
200
+ if (!acc[fullMatch]) {
201
+ acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
287
202
  }
288
- }
289
- // Use forkJoin to wait for all observables to complete
290
- return forkJoin(translationObservables).pipe(map((translatedParts) => translatedParts.join('')));
203
+ return acc;
204
+ }, {});
205
+ // Replace all matches in one go
206
+ return matches.reduce((result, { fullMatch }) => result.replace(fullMatch, translations[fullMatch]), text);
291
207
  }
292
208
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
293
209
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
@@ -296,4 +212,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
296
212
  type: Injectable,
297
213
  args: [{ providedIn: 'root' }]
298
214
  }], ctorParameters: () => [] });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLGFBQWEsRUFDYixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFRN0QsSUFBSSxPQUE2QixDQUFDO0FBRWxDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUdELE1BQU0sT0FBTyxvQkFBb0I7SUFjL0I7O09BRUc7SUFDSDtRQWhCUSxXQUFNLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRDLHFCQUFnQixHQUFtRCxFQUFFLENBQUM7UUFDdEUsb0JBQWUsR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUUxRCxlQUFVLEdBQTRCLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLGlCQUFZLEdBQXVCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFMUQsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBTTNDLDREQUE0RDtRQUM1RCxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxTQUFtQixFQUFFLE1BQWdCO1FBQ2pFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsMkNBQTJDO1lBQzNDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUN2RCxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUV0QyxtRUFBbUU7UUFDbkUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUM1RSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ3hFLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLElBQUksWUFBWSxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7Z0JBQzFCLElBQUksRUFBRSxZQUFZLENBQUMsZ0JBQWdCO2dCQUNuQyxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDO1FBRUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsT0FBTyxxQkFBcUIsQ0FBQztJQUMvQixDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxZQUF3QztRQUM3RixTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVNLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBWTtRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtZQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLFlBQVksQ0FBQyxpQkFBaUI7Z0JBQ3BDLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsSUFBWSxFQUFFLFFBQWdCLElBQUk7UUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxJQUFJLENBQUMsR0FBVyxFQUFFLFVBQThCLEVBQUU7UUFDeEQsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWxGLGdDQUFnQztRQUNoQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBZ0IsRUFBc0IsRUFBRTtZQUNoRSxtREFBbUQ7WUFDbkQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDUCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztnQkFDM0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxjQUFjLEtBQUssR0FBRyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztvQkFDakUsbUVBQW1FO29CQUNuRSx5Q0FBeUM7b0JBQ3pDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLGlFQUFpRTtRQUNqRSxNQUFNLDJCQUEyQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELGlHQUFpRztRQUNqRyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxNQUFNLDRCQUE0QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQ3RELEdBQUcsRUFDSCxJQUFJLENBQUMsY0FBYyxFQUNuQixLQUFLLEVBQ0wsT0FBTyxDQUFDLE1BQU0sQ0FDZixDQUFDO1lBQ0YsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsT0FBTywyQkFBMkIsQ0FBQztJQUNyQyxDQUFDO0lBRU8sY0FBYyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE1BQTBCO1FBQ3pGLElBQUksV0FBVyxHQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQVcsQ0FBQztRQUV6RyxpQ0FBaUM7UUFDakMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQVcsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDcEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsUUFBUSxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzVGLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQzthQUFNLENBQUM7WUFDTiwyQ0FBMkM7WUFDM0MsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztZQUN2RCxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDeEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTRCO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQy9CLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFDL0IsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQVcsRUFBRSxPQUE0QjtRQUNuRSxNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3hGLElBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLGtEQUFrRDtZQUNsRCxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsV0FBVyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVNLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBNEI7UUFDNUQsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUV4RixnRUFBZ0U7UUFDaEUsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU5RSxFQUFFO1FBQ0YsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5RSx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEMsUUFBUSxFQUFFLENBQUM7WUFDWCxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsUUFBUSxFQUFFLENBQUM7WUFDWCxXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QseUNBQXlDO0lBQ3pDLHlCQUF5QjtJQUN6QixnRUFBZ0U7SUFDaEUscUZBQXFGO0lBQ3JGLGlGQUFpRjtJQUNqRixlQUFlO0lBRWYsb0RBQW9EO0lBQ3BELHlEQUF5RDtJQUN6RCxvQkFBb0I7SUFDcEIscUNBQXFDO0lBQ3JDLHNDQUFzQztJQUN0QyxvQ0FBb0M7SUFDcEMsVUFBVTtJQUNWLE1BQU07SUFDTixtQkFBbUI7SUFDbkIsSUFBSTtJQUNJLDZCQUE2QixDQUNuQyxXQUFtQjtRQUVuQixNQUFNLEtBQUssR0FBRywyREFBMkQsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBNkQsRUFBRSxDQUFDO1FBQzVFLElBQUksS0FBSyxDQUFDO1FBRVYsK0NBQStDO1FBQy9DLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtZQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUM7WUFFbkUsd0NBQXdDO1lBQ3hDLE1BQU0sYUFBYSxHQUF1QyxFQUFFLENBQUM7WUFDN0QsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNwQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN4RixhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLFNBQVMsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixHQUFHO2dCQUNILElBQUksRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDO2dCQUMzQixLQUFLLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQzthQUM5QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFHQUFxRztJQUNyRyxpRkFBaUY7SUFDakYsa0ZBQWtGO0lBRWxGLDZEQUE2RDtJQUU3RCxxQ0FBcUM7SUFDckMsdUVBQXVFO0lBRXZFLHVDQUF1QztJQUN2QywrQ0FBK0M7SUFDL0MsK0NBQStDO0lBQy9DLG1GQUFtRjtJQUNuRiwwRkFBMEY7SUFDMUYsd0NBQXdDO0lBRXhDLDBEQUEwRDtJQUMxRCx1Q0FBdUM7SUFDdkMsbUNBQW1DO0lBQ25DLGdDQUFnQztJQUNoQyxrQ0FBa0M7SUFDbEMsdUNBQXVDO0lBQ3ZDLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsVUFBVTtJQUNWLGVBQWU7SUFDZiwyREFBMkQ7SUFDM0QsK0NBQStDO0lBQy9DLFFBQVE7SUFDUixNQUFNO0lBRU4sNERBQTREO0lBQzVELGtEQUFrRDtJQUNsRCx1RkFBdUY7SUFDdkYsT0FBTztJQUNQLElBQUk7SUFDSSx5QkFBeUIsQ0FBQyxHQUFXLEVBQUUsT0FBNEI7UUFDekUsTUFBTSxLQUFLLEdBQUcsMENBQTBDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDMUYsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztRQUUzRSxNQUFNLHNCQUFzQixHQUF5QixFQUFFLENBQUM7UUFFeEQsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEUsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QixtQ0FBbUM7Z0JBQ25DLEtBQUssTUFBTSxNQUFNLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDL0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFFN0IsK0NBQStDO29CQUMvQyxzQkFBc0IsQ0FBQyxJQUFJLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNuQixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTTtxQkFDeEIsQ0FBQyxDQUNILENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixrREFBa0Q7Z0JBQ2xELHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCxPQUFPLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FDMUMsR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDOzhHQXBXVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURQLE1BQU07OzJGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhFdmVudFNlcnZpY2UsIEFYRXZlbnRUeXBlcyB9IGZyb20gJ0BhY29yZXgvY29yZS9ldmVudHMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXQgYXMgbG9kYXNoR2V0LCBzZXQgYXMgbG9kYXNoU2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY2F0Y2hFcnJvcixcbiAgZmluYWxpemUsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmb3JrSm9pbixcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fQ09ORklHIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fTE9BREVSIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5sb2FkZXInO1xuaW1wb3J0IHtcbiAgQVhUcmFuc2xhdGVIYXNoTWFwLFxuICBBWFRyYW5zbGF0ZUxhbmcsXG4gIEFYVHJhbnNsYXRlT3B0aW9ucyxcbiAgQVhUcmFuc2xhdGVQYXJhbXMsXG59IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5sZXQgc2VydmljZTogQVhUcmFuc2xhdGlvblNlcnZpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlcnZpY2UudHJhbnNsYXRlU3luYyhrZXksIG9wdGlvbnMpO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsb2FkZXIgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fQ09ORklHKTtcblxuICBwcml2YXRlIGV2ZW50U2VydmljZSA9IGluamVjdChBWEV2ZW50U2VydmljZSk7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGlvbkNhY2hlOiBBWFRyYW5zbGF0ZUhhc2hNYXA8QVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4+ID0ge307XG4gIHByaXZhdGUgb25nb2luZ1JlcXVlc3RzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgYWN0aXZlTGFuZzogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5nZXREZWZhdWx0TGFuZygpKTtcbiAgbGFuZ0NoYW5nZXMkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmFjdGl2ZUxhbmcuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBsYXN0QWN0aXZlTGFuZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIHNlcnZpY2UgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIGxvYWRMYW5ndWFnZXNBbmRTY29wZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSwgc2NvcGVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbGFuZ3VhZ2VzLmZsYXRNYXAoKGxhbmcpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ10/LltzY29wZV0pIHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy50cmFuc2xhdGlvbkNhY2hlW2xhbmddW3Njb3BlXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JMb2FkVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckxvYWRUcmFuc2xhdGlvbnMobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBWFRyYW5zbGF0ZUhhc2hNYXA8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBgJHtsYW5nfV8ke3Njb3BlfWA7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBpZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMub25nb2luZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzLmdldChyZXF1ZXN0S2V5KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRyYW5zbGF0aW9ucyBpZiBub3QgaW4gY2FjaGUgb3Igb25nb2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JzZXJ2YWJsZSA9IHRoaXMubG9hZGVyLmdldFRyYW5zbGF0aW9uKHsgbGFuZywgc2NvcGUgfSkucGlwZShcbiAgICAgIHRhcCgodHJhbnNsYXRpb25zKSA9PiB0aGlzLmNhY2hlVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlLCB0cmFuc2xhdGlvbnMpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciBsYW5nOiAke2xhbmd9LCBzY29wZTogJHtzY29wZX1gLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEFYRXZlbnRUeXBlcy5BWExhbmd1YWdlTG9hZGVkLFxuICAgICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5kZWxldGUocmVxdWVzdEtleSk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5zZXQocmVxdWVzdEtleSwgdHJhbnNsYXRpb25PYnNlcnZhYmxlKTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25PYnNlcnZhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVRyYW5zbGF0aW9ucyhsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHRyYW5zbGF0aW9uczogQVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4pOiB2b2lkIHtcbiAgICBsb2Rhc2hTZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHtsYW5nfS4ke3Njb3BlfWAsIHRyYW5zbGF0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVmYXVsdExhbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlTGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUxhbmcuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChsYW5nICE9IHRoaXMuZ2V0QWN0aXZlTGFuZygpKSB7XG4gICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCk7IC8vIFVwZGF0ZSBsYXN0IGFjdGl2ZSBsYW5ndWFnZVxuICAgICAgdGhpcy5hY3RpdmVMYW5nLm5leHQobGFuZyk7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICB0eXBlOiBBWEV2ZW50VHlwZXMuQVhMYW5ndWFnZUNoYW5nZWQsXG4gICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5nQXZhaWxhYmxlKCk6IEFYVHJhbnNsYXRlTGFuZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoa2V5OiBzdHJpbmcsIG9wdGlvbnM6IEFYVHJhbnNsYXRlT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBGdW5jdGlvbiB0byBmZXRjaCB0cmFuc2xhdGlvblxuICAgIGNvbnN0IGZldGNoVHJhbnNsYXRpb24gPSAobGFuZ3VhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGVcbiAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdKSB7XG4gICAgICAgIHJldHVybiBvZih0aGlzLmdldFRyYW5zbGF0aW9uKGtleSwgbGFuZ3VhZ2UsIHNjb3BlLCBvcHRpb25zLnBhcmFtcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgIHJldHVybiB0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5ndWFnZSwgc2NvcGUpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdPy5ba2V5XSB8fCBrZXk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24sIGxhbmd1YWdlLCBzY29wZSwgb3B0aW9ucy5wYXJhbXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCh0cmFuc2xhdGVkVGV4dCkgPT4ge1xuICAgICAgICAgIGlmICh0cmFuc2xhdGVkVGV4dCA9PT0ga2V5ICYmIGxhbmd1YWdlICE9PSB0aGlzLmdldERlZmF1bHRMYW5nKCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgZm91bmQgYW5kIHRoZSBsYW5ndWFnZSBpcyBub3QgZGVmYXVsdCxcbiAgICAgICAgICAgIC8vIHRyeSBmZXRjaGluZyBmcm9tIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hUcmFuc2xhdGlvbih0aGlzLmdldERlZmF1bHRMYW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YodHJhbnNsYXRlZFRleHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEZpcnN0LCB0cnkgdG8gZmV0Y2ggdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlXG4gICAgY29uc3QgdHJhbnNsYXRpb25Gb3JSZXF1ZXN0ZWRMYW5nID0gZmV0Y2hUcmFuc2xhdGlvbihsYW5nKTtcblxuICAgIC8vIElmIGxhc3RBY3RpdmVMYW5nIGlzIGF2YWlsYWJsZSBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHJlcXVlc3RlZCBsYW5ndWFnZSwgdXNlIGl0IGFzIGEgZmFsbGJhY2tcbiAgICBpZiAodGhpcy5sYXN0QWN0aXZlTGFuZyAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nICE9PSBsYW5nKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbihcbiAgICAgICAga2V5LFxuICAgICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nLFxuICAgICAgICBzY29wZSxcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZy5waXBlKHN0YXJ0V2l0aCh0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZywgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMpOiBzdHJpbmcge1xuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gKGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApIHx8IGtleSkgYXMgc3RyaW5nO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJhbXMgbGlrZSB7eyBuYW1lIH19XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbVZhbHVlID0gcGFyYW1zW3BhcmFtS2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7XFxcXHMqJHtwYXJhbUtleX1cXFxccyp9fWAsICdnJyksIHBhcmFtVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRyYW5zbGF0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlcGxhY2UgdHJhbnNsYXRpb25zIGxpa2Uge3sgdCgna2V5JykgfX1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUGF0dGVybiA9IC97e1xccyp0XFwoJyhbXiddKyknXFwpXFxzKn19L2c7XG4gICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UodHJhbnNsYXRpb25QYXR0ZXJuLCAobWF0Y2gsIGlubmVyS2V5KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9uKGlubmVyS2V5LCBsYW5nLCBzY29wZSwgcGFyYW1zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoa2V5KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ0NoYW5nZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLmdldEFjdGl2ZUxhbmcoKSksXG4gICAgICAgIHN3aXRjaE1hcCgobGFuZykgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZUFzeW5jQVhUcmFuc2xhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucz8ubGFuZykge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGtleSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYW5nQ2hhbmdlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgICAgc3dpdGNoTWFwKChsYW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZChrZXksIHsgLi4ub3B0aW9ucywgbGFuZzogbGFuZyB9KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2xhdGVBc3luYyhrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksIHNjb3BlID0gdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuXG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBpbiB0aGUgY2FjaGUsIGxvYWQgaXRcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubG9hZChrZXksIHsgbGFuZywgc2NvcGUgfSkucGlwZSh0YWtlKDEpKSk7XG4gICAgICB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIElmIHN0aWxsIG5vdCBhdmFpbGFibGUsIHRyeSB0aGUgbGFzdCBhY3RpdmUgbGFuZ3VhZ2Ugb3IgZGVmYXVsdCBsYW5ndWFnZVxuICAgIGlmICghdHJhbnNsYXRpb24gJiYgdGhpcy5sYXN0QWN0aXZlTGFuZykge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBhY3RpdmUgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlXG4gICAgbGV0IHRyYW5zbGF0aW9uID0gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCk7XG5cbiAgICAvL1xuICAgIGNvbnN0IGxvYWRMYW5nID0gKCkgPT4gbGFzdFZhbHVlRnJvbSh0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5nLCBzY29wZSkpO1xuICAgIC8vIElmIG5vdCBhdmFpbGFibGUsIGNoZWNrIGxhc3RBY3RpdmVMYW5nXG4gICAgaWYgKCF0cmFuc2xhdGlvbiAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICBpZiAoIXRyYW5zbGF0aW9uKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuICAvLyBwcml2YXRlIGZpbmRBWFRyYW5zbGF0ZU9wdGlvbnNGcm9tS2V5KFxuICAvLyAgIGlucHV0U3RyaW5nOiBzdHJpbmcsXG4gIC8vICk6IChPbWl0PEFYVHJhbnNsYXRlT3B0aW9ucywgJ3BhcmFtcyc+ICYgeyBrZXk6IHN0cmluZyB9KVtdIHtcbiAgLy8gICBjb25zdCByZWdleCA9IC88YXh0KD86XFxzK2xhbmc9XCIoW15cIl0qKVwiKT8oPzpcXHMrc2NvcGU9XCIoW15cIl0qKVwiKT8+KC4qPyk8XFwvYXh0Pi9nO1xuICAvLyAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgLy8gICBsZXQgbWF0Y2g7XG5cbiAgLy8gICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAvLyAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgLy8gICAgIHJlc3VsdC5wdXNoKHtcbiAgLy8gICAgICAgbGFuZzogbWF0Y2hbMV0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBzY29wZTogbWF0Y2hbMl0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBrZXk6IG1hdGNoWzNdIHx8IHVuZGVmaW5lZCxcbiAgLy8gICAgIH0pO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gcmVzdWx0O1xuICAvLyB9XG4gIHByaXZhdGUgZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoXG4gICAgaW5wdXRTdHJpbmc6IHN0cmluZyxcbiAgKTogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL3RcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccyooPzosXFxzKlxce1xccyooW159XSopXFxzKlxcfSk/XFxzKlxcKS9nO1xuICAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdOyAvLyBFeHRyYWN0IHRoZSBrZXlcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBtYXRjaFsyXTsgLy8gRXh0cmFjdCB0aGUgb3B0aW9ucyBvYmplY3QsIGlmIHByZXNlbnRcblxuICAgICAgLy8gUGFyc2Ugb3B0aW9ucyBpbnRvIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgY29uc3QgcGFyc2VkT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5zcGxpdCgnLCcpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IG9wdGlvbi5zcGxpdCgnOicpLm1hcCgocykgPT4gcy50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykpO1xuICAgICAgICAgIHBhcnNlZE9wdGlvbnNba2V5XSA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBsYW5nOiBwYXJzZWRPcHRpb25zWydsYW5nJ10sXG4gICAgICAgIHNjb3BlOiBwYXJzZWRPcHRpb25zWydzY29wZSddLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgdHJhbnNsYXRlQXN5bmNBWFRyYW5zbGF0ZShrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vICAgY29uc3QgcmVnZXggPSAvKDxheHQoPzpcXHMrbGFuZz1cIlteXCJdKlwiKT8oPzpcXHMrc2NvcGU9XCJbXlwiXSpcIik/Pi4qPzxcXC9heHQ+KS9nO1xuICAvLyAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIDxheHQ+IHBhcnRzIGFuZCB0ZXh0IHBhcnRzXG5cbiAgLy8gICBjb25zdCB0cmFuc2xhdGlvbk9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gIC8vICAgZm9yIChjb25zdCBwYXJ0IG9mIHNwbGl0UGFydHMpIHtcbiAgLy8gICAgIGNvbnN0IG9wdGlvbnNGcm9tS2V5ID0gdGhpcy5maW5kQVhUcmFuc2xhdGVPcHRpb25zRnJvbUtleShwYXJ0KTtcblxuICAvLyAgICAgaWYgKG9wdGlvbnNGcm9tS2V5Lmxlbmd0aCA+IDApIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBhbiA8YXh0PiBwYXJ0LCB0cmFuc2xhdGUgaXRcbiAgLy8gICAgICAgZm9yIChjb25zdCBwYXJzZWQgb2Ygb3B0aW9uc0Zyb21LZXkpIHtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRMYW5nID0gcGFyc2VkLmxhbmcgfHwgb3B0aW9ucz8ubGFuZyB8fCB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRTY29wZSA9IHBhcnNlZC5zY29wZSB8fCBvcHRpb25zPy5zY29wZSB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGU7XG4gIC8vICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gcGFyc2VkLmtleTtcblxuICAvLyAgICAgICAgIC8vIFB1c2ggdGhlIHRyYW5zbGF0aW9uIG9ic2VydmFibGUgdG8gdGhlIGFycmF5XG4gIC8vICAgICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKFxuICAvLyAgICAgICAgICAgdGhpcy5sb2FkKHBhcnNlZEtleSwge1xuICAvLyAgICAgICAgICAgICBsYW5nOiBwYXJzZWRMYW5nLFxuICAvLyAgICAgICAgICAgICBzY29wZTogcGFyc2VkU2NvcGUsXG4gIC8vICAgICAgICAgICAgIHBhcmFtczogb3B0aW9ucz8ucGFyYW1zLFxuICAvLyAgICAgICAgICAgfSksXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBwbGFpbiB0ZXh0LCBzbyB3cmFwIGl0IGluIGFuIG9ic2VydmFibGVcbiAgLy8gICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKG9mKHBhcnQpKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIG9ic2VydmFibGVzIHRvIGNvbXBsZXRlXG4gIC8vICAgcmV0dXJuIGZvcmtKb2luKHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMpLnBpcGUoXG4gIC8vICAgICBtYXAoKHRyYW5zbGF0ZWRQYXJ0cykgPT4gdHJhbnNsYXRlZFBhcnRzLmpvaW4oJycpKSwgLy8gSm9pbiBhbGwgdHJhbnNsYXRlZCBwYXJ0c1xuICAvLyAgICk7XG4gIC8vIH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBc3luY0FYVHJhbnNsYXRlKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZWdleCA9IC8odFxcKFsnXCJdW14nXCJdK1snXCJdKD86LFxccypcXHtbXn1dKlxcfSk/XFwpKS9nOyAvLyBNYXRjaCB0KCdrZXknLCB7IC4uLiB9KSBjYWxsc1xuICAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIHQoKSBwYXJ0cyBhbmQgdGV4dCBwYXJ0c1xuXG4gICAgY29uc3QgdHJhbnNsYXRpb25PYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBzcGxpdFBhcnRzKSB7XG4gICAgICBjb25zdCBvcHRpb25zRnJvbUtleSA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkocGFydCk7XG5cbiAgICAgIGlmIChvcHRpb25zRnJvbUtleS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSB0KCkgcGFydCwgdHJhbnNsYXRlIGl0XG4gICAgICAgIGZvciAoY29uc3QgcGFyc2VkIG9mIG9wdGlvbnNGcm9tS2V5KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGFuZyA9IHBhcnNlZC5sYW5nIHx8IG9wdGlvbnM/LmxhbmcgfHwgdGhpcy5nZXRBY3RpdmVMYW5nKCk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU2NvcGUgPSBwYXJzZWQuc2NvcGUgfHwgb3B0aW9ucz8uc2NvcGUgfHwgdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlZC5rZXk7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB0cmFuc2xhdGlvbiBvYnNlcnZhYmxlIHRvIHRoZSBhcnJheVxuICAgICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMubG9hZChwYXJzZWRLZXksIHtcbiAgICAgICAgICAgICAgbGFuZzogcGFyc2VkTGFuZyxcbiAgICAgICAgICAgICAgc2NvcGU6IHBhcnNlZFNjb3BlLFxuICAgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgcGxhaW4gdGV4dCwgc28gd3JhcCBpdCBpbiBhbiBvYnNlcnZhYmxlXG4gICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChvZihwYXJ0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIGZvcmtKb2luIHRvIHdhaXQgZm9yIGFsbCBvYnNlcnZhYmxlcyB0byBjb21wbGV0ZVxuICAgIHJldHVybiBmb3JrSm9pbih0cmFuc2xhdGlvbk9ic2VydmFibGVzKS5waXBlKFxuICAgICAgbWFwKCh0cmFuc2xhdGVkUGFydHMpID0+IHRyYW5zbGF0ZWRQYXJ0cy5qb2luKCcnKSksIC8vIEpvaW4gYWxsIHRyYW5zbGF0ZWQgcGFydHNcbiAgICApO1xuICB9XG59XG4iXX0=
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixRQUFRLEVBQ1IsY0FBYyxFQUNkLFFBQVEsRUFDUixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RCxJQUFJLGlCQUF1QyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8saUJBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBR0QsTUFBTSxPQUFPLG9CQUFvQjtJQWlCeEIsY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQVk7UUFDL0Is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QztRQUVGLGdDQUFnQztRQUNoQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ25CLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUM3RSxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7OEdBalRVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFAsTUFBTTs7MkZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWEV2ZW50U2VydmljZSwgQVhFdmVudFR5cGVzIH0gZnJvbSAnQGFjb3JleC9jb3JlL2V2ZW50cyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldCBhcyBsb2Rhc2hHZXQsIHNldCBhcyBsb2Rhc2hTZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmluYWxpemUsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmb3JrSm9pbixcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fQ09ORklHIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fTE9BREVSIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5sb2FkZXInO1xuaW1wb3J0IHsgQVhUcmFuc2xhdGVIYXNoTWFwLCBBWFRyYW5zbGF0ZU9wdGlvbnMsIEFYVHJhbnNsYXRlUGFyYW1zIH0gZnJvbSAnLi90cmFuc2xhdGlvbi50eXBlcyc7XG5cbmxldCBzaW5nbGV0b25JbnN0YW5jZTogQVhUcmFuc2xhdGlvblNlcnZpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlLnRyYW5zbGF0ZVN5bmMoa2V5LCBvcHRpb25zKTtcbn1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBWFRyYW5zbGF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgbG9hZGVyID0gaW5qZWN0KEFYX1RSQU5TTEFUSU9OX0xPQURFUik7XG4gIHByaXZhdGUgY29uZmlnID0gaW5qZWN0KEFYX1RSQU5TTEFUSU9OX0NPTkZJRyk7XG5cbiAgcHJpdmF0ZSBldmVudFNlcnZpY2UgPSBpbmplY3QoQVhFdmVudFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgdHJhbnNsYXRpb25DYWNoZTogQVhUcmFuc2xhdGVIYXNoTWFwPEFYVHJhbnNsYXRlSGFzaE1hcDxzdHJpbmc+PiA9IHt9O1xuICBwcml2YXRlIG9uZ29pbmdSZXF1ZXN0czogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGFjdGl2ZUxhbmc6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHRoaXMuZ2V0RGVmYXVsdExhbmcoKSk7XG4gIGxhbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5hY3RpdmVMYW5nLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgZXhwcmVzc2lvbkNhY2hlID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBrZXk6IHN0cmluZzsgc2NvcGU/OiBzdHJpbmc7IGxhbmc/OiBzdHJpbmc7IGZ1bGxNYXRjaDogc3RyaW5nIH1bXVxuICA+KCk7XG5cbiAgcHVibGljIGdldERlZmF1bHRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRlZmF1bHRMYW5nO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZUxhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVMYW5nLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlTGFuZyhsYW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobGFuZyAhPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSkge1xuICAgICAgdGhpcy5hY3RpdmVMYW5nLm5leHQobGFuZyk7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICB0eXBlOiBBWEV2ZW50VHlwZXMuQVhMYW5ndWFnZUNoYW5nZWQsXG4gICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc2luZ2xldG9uSW5zdGFuY2UgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIGxvYWRMYW5ndWFnZXNBbmRTY29wZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSwgc2NvcGVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbGFuZ3VhZ2VzLmZsYXRNYXAoKGxhbmcpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ10/LltzY29wZV0pIHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy50cmFuc2xhdGlvbkNhY2hlW2xhbmddW3Njb3BlXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUcmFuc2xhdGlvbkZpbGVzKGxhbmcsIHNjb3BlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFRyYW5zbGF0aW9uRmlsZXMobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBWFRyYW5zbGF0ZUhhc2hNYXA8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBgJHtsYW5nfV8ke3Njb3BlfWA7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBpZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMub25nb2luZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzLmdldChyZXF1ZXN0S2V5KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRyYW5zbGF0aW9ucyBpZiBub3QgaW4gY2FjaGUgb3Igb25nb2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JzZXJ2YWJsZSA9IHRoaXMubG9hZGVyLmdldFRyYW5zbGF0aW9uKHsgbGFuZywgc2NvcGUgfSkucGlwZShcbiAgICAgIHRhcCgodHJhbnNsYXRpb25zKSA9PiB0aGlzLnNldFRyYW5zbGF0aW9uQ2FjaGUobGFuZywgc2NvcGUsIHRyYW5zbGF0aW9ucykpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihgRXJyb3IgbG9hZGluZyB0cmFuc2xhdGlvbnMgZm9yIGxhbmc6ICR7bGFuZ30sIHNjb3BlOiAke3Njb3BlfWAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXRFdmVudCh7XG4gICAgICAgICAgdHlwZTogQVhFdmVudFR5cGVzLkFYTGFuZ3VhZ2VMb2FkZWQsXG4gICAgICAgICAgcGF5bG9hZDogbGFuZyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25nb2luZ1JlcXVlc3RzLmRlbGV0ZShyZXF1ZXN0S2V5KTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgKTtcblxuICAgIHRoaXMub25nb2luZ1JlcXVlc3RzLnNldChyZXF1ZXN0S2V5LCB0cmFuc2xhdGlvbk9ic2VydmFibGUpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbk9ic2VydmFibGU7XG4gIH1cblxuICAvLyNyZWdpb24gIEhlbHBlcnMgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRpb24gZGF0YSBpbnRvIGNhY2hlXG4gICAqL1xuICBwcml2YXRlIHNldFRyYW5zbGF0aW9uQ2FjaGUobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nLCB0cmFuc2xhdGlvbnM6IEFYVHJhbnNsYXRlSGFzaE1hcDxzdHJpbmc+KTogdm9pZCB7XG4gICAgbG9kYXNoU2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX1gLCB0cmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gbG9hZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCwga2V5KSBhcyBzdHJpbmc7XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlS2V5KGtleTogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHBhcmFtcz86IEFYVHJhbnNsYXRlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAvLyBUcmlnZ2VyIGFzeW5jIHByZWxvYWRpbmcgd2l0aG91dCBibG9ja2luZyBleGVjdXRpb25cbiAgICB0aGlzLmxvYWRMYW5ndWFnZXNBbmRTY29wZXMoW2xhbmddLCBbc2NvcGVdKS5zdWJzY3JpYmUoe1xuICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuaGFuZGxlRXJyb3IoYEVycm9yIHByZWxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciAke2xhbmd9LCAke3Njb3BlfWAsIGVyciksXG4gICAgfSk7XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gdGhlIGtleVxuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nLCBzY29wZSwga2V5KTtcblxuICAgIC8vIFJlcGxhY2UgcGFyYW1zIGxpa2Uge3sgbmFtZSB9fVxuICAgIGlmIChwYXJhbXMgJiYgdHlwZW9mIHRyYW5zbGF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccyoke3BhcmFtS2V5fVxcXFxzKn19YCwgJ2cnKSxcbiAgICAgICAgICBwYXJhbXNbcGFyYW1LZXldIGFzIHN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2xhdGlvbiB8fCBrZXk7XG4gIH1cblxuICBwcml2YXRlIGlzRXhwcmVzc2lvbiA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcygndCgnKTtcblxuICBwcml2YXRlIGRlY29kZUV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICApOiB7IGtleTogc3RyaW5nOyBzY29wZT86IHN0cmluZzsgbGFuZz86IHN0cmluZzsgZnVsbE1hdGNoOiBzdHJpbmcgfVtdIHtcbiAgICBpZiAodGhpcy5leHByZXNzaW9uQ2FjaGUuaGFzKGV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uQ2FjaGUuZ2V0KGV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2V4ID0gL3RcXChbXCInXShbXlwiJ10rKVtcIiddXFxzKig/OixcXHMqKFxcey4qP1xcfSkpP1xcKS9nO1xuICAgIGNvbnN0IG1hdGNoZXM6IHsga2V5OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nOyBsYW5nPzogc3RyaW5nOyBmdWxsTWF0Y2g6IHN0cmluZyB9W10gPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhleHByZXNzaW9uKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgcmF3T3B0aW9ucyA9IG1hdGNoWzJdO1xuXG4gICAgICBpZiAoIXJhd09wdGlvbnMpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHsga2V5LCBzY29wZTogbnVsbCwgbGFuZzogbnVsbCwgZnVsbE1hdGNoOiBtYXRjaFswXSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSByYXdPcHRpb25zXG4gICAgICAgICAgLnJlcGxhY2UoLyhbJ1wiXSk/KFthLXpBLVowLTlfXSspKFsnXCJdKT9cXHMqOi9nLCAnXCIkMlwiOicpIC8vIEVuc3VyZSBrZXlzIGFyZSBxdW90ZWRcbiAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnXCInKTsgLy8gUmVwbGFjZSBzaW5nbGUgcXVvdGVzIHdpdGggZG91YmxlIHF1b3Rlc1xuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblxuICAgICAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBzY29wZTogb3B0aW9ucy5zY29wZSB8fCBudWxsLFxuICAgICAgICAgIGxhbmc6IG9wdGlvbnMubGFuZyB8fCBudWxsLFxuICAgICAgICAgIGZ1bGxNYXRjaDogbWF0Y2hbMF0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIG9wdGlvbnMgZm9yIGtleSBcIiR7a2V5fVwiOmAsIGVycm9yKTtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHsga2V5LCBzY29wZTogbnVsbCwgbGFuZzogbnVsbCwgZnVsbE1hdGNoOiBtYXRjaFswXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25DYWNoZS5zZXQoZXhwcmVzc2lvbiwgbWF0Y2hlcyk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpO1xuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXRFdmVudCh7XG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgcGF5bG9hZDogeyBtZXNzYWdlLCBlcnJvciB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEFzeW5jIFRyYW5zbGF0aW9uIE1ldGhvZHNcblxuICBwcml2YXRlIHRyYW5zbGF0ZVRleHQoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNvbnRleHRMYW5nOiBzdHJpbmcsXG4gICAgY29udGV4dFNjb3BlOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMsXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLmlzRXhwcmVzc2lvbih0ZXh0KSkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMudHJhbnNsYXRlS2V5KHRleHQsIGNvbnRleHRMYW5nLCBjb250ZXh0U2NvcGUsIHBhcmFtcykpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5kZWNvZGVFeHByZXNzaW9uKHRleHQpO1xuXG4gICAgLy8gRXh0cmFjdCB1bmlxdWUgbGFuZ3VhZ2VzIGFuZCBzY29wZXMgZm9yIGJhdGNoIGxvYWRpbmdcbiAgICBjb25zdCBsYW5nU2NvcGVTZXQgPSBuZXcgU2V0KFxuICAgICAgbWF0Y2hlcy5tYXAoKHsgbGFuZywgc2NvcGUgfSkgPT4gYCR7bGFuZyB8fCBjb250ZXh0TGFuZ31fJHtzY29wZSB8fCBjb250ZXh0U2NvcGV9YCksXG4gICAgKTtcblxuICAgIGNvbnN0IGxhbmdzID0gQXJyYXkuZnJvbShuZXcgU2V0KEFycmF5LmZyb20obGFuZ1Njb3BlU2V0KS5tYXAoKHBhaXIpID0+IHBhaXIuc3BsaXQoJ18nKVswXSkpKTtcbiAgICBjb25zdCBzY29wZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoQXJyYXkuZnJvbShsYW5nU2NvcGVTZXQpLm1hcCgocGFpcikgPT4gcGFpci5zcGxpdCgnXycpWzFdKSkpO1xuXG4gICAgLy8gTG9hZCBhbGwgcmVxdWlyZWQgbGFuZ3VhZ2VzIGFuZCBzY29wZXNcbiAgICByZXR1cm4gdGhpcy5sb2FkTGFuZ3VhZ2VzQW5kU2NvcGVzKGxhbmdzLCBzY29wZXMpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAvLyBSZXNvbHZlIHRyYW5zbGF0aW9ucyBhZnRlciBsb2FkaW5nXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1hdGNoZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHsga2V5LCBzY29wZSwgbGFuZywgZnVsbE1hdGNoIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2NvcGUgPSBzY29wZSB8fCBjb250ZXh0U2NvcGU7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZExhbmcgPSBsYW5nIHx8IGNvbnRleHRMYW5nO1xuXG4gICAgICAgICAgICBhY2NbZnVsbE1hdGNoXSA9IHRoaXMudHJhbnNsYXRlS2V5KGtleSwgcmVzb2x2ZWRMYW5nLCByZXNvbHZlZFNjb3BlLCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyBpbiB0aGUgdGV4dCB3aXRoIHRoZWlyIHJlc29sdmVkIHRyYW5zbGF0aW9uc1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoXG4gICAgICAgICAgKHJlc3VsdCwgeyBmdWxsTWF0Y2ggfSkgPT5cbiAgICAgICAgICAgIHJlc3VsdC5yZXBsYWNlKFxuICAgICAgICAgICAgICBuZXcgUmVnRXhwKGZ1bGxNYXRjaC5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyksICdnJyksXG4gICAgICAgICAgICAgIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGBFcnJvciBkdXJpbmcgdHJhbnNsYXRpb246YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gb2YodGV4dCk7IC8vIEZhbGxiYWNrIHRvIHRoZSBvcmlnaW5hbCB0ZXh0XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRyYW5zbGF0ZSQodGV4dDogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAob3B0aW9ucz8ubGFuZykge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgb3B0aW9ucy5sYW5nLFxuICAgICAgICBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsXG4gICAgICAgIG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoKGxhbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dCh0ZXh0LCBsYW5nLCBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsIG9wdGlvbnM/LnBhcmFtcyk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYW5zbGF0ZUFzeW5jKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMudHJhbnNsYXRlJCh0ZXh0LCBvcHRpb25zKSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU3luYyBUcmFuc2xhdGlvbiBNZXRob2RzXG5cbiAgcHVibGljIHRyYW5zbGF0ZVN5bmModGV4dDogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFeHByZXNzaW9uKHRleHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVUZXh0U3luYyhcbiAgICAgICAgdGV4dCxcbiAgICAgICAgb3B0aW9ucz8ubGFuZyA/PyB0aGlzLmdldEFjdGl2ZUxhbmcoKSxcbiAgICAgICAgb3B0aW9ucz8uc2NvcGUgPz8gdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlS2V5KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBvcHRpb25zPy5sYW5nID8/IHRoaXMuZ2V0QWN0aXZlTGFuZygpLFxuICAgICAgICBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dFN5bmMoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNvbnRleHRMYW5nOiBzdHJpbmcsXG4gICAgY29udGV4dFNjb3BlOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZGVjb2RlRXhwcmVzc2lvbih0ZXh0KTtcblxuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1hdGNoZXMucmVkdWNlKFxuICAgICAgKGFjYywgeyBrZXksIHNjb3BlLCBsYW5nLCBmdWxsTWF0Y2ggfSkgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZFNjb3BlID0gc2NvcGUgfHwgY29udGV4dFNjb3BlO1xuICAgICAgICBjb25zdCByZXNvbHZlZExhbmcgPSBsYW5nIHx8IGNvbnRleHRMYW5nO1xuXG4gICAgICAgIC8vIENhY2hlIHRyYW5zbGF0aW9uIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nXG4gICAgICAgIGlmICghYWNjW2Z1bGxNYXRjaF0pIHtcbiAgICAgICAgICBhY2NbZnVsbE1hdGNoXSA9IHRoaXMudHJhbnNsYXRlS2V5KGtleSwgcmVzb2x2ZWRMYW5nLCByZXNvbHZlZFNjb3BlLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICApO1xuXG4gICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyBpbiBvbmUgZ29cbiAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB7IGZ1bGxNYXRjaCB9KSA9PiByZXN1bHQucmVwbGFjZShmdWxsTWF0Y2gsIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdKSxcbiAgICAgIHRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
@@ -12,7 +12,7 @@ export class AXTranslatorDirective {
12
12
  this.viewContainer.clear();
13
13
  this.viewContainer.createEmbeddedView(this.templateRef, {
14
14
  $implicit: (key, options) => {
15
- return this.translationService.translate(key, options);
15
+ return this.translationService.translate$(key, options);
16
16
  },
17
17
  });
18
18
  }
@@ -25,4 +25,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
25
25
  selector: '[translate]',
26
26
  }]
27
27
  }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1.AXTranslationService }] });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdHJhbnNsYXRpb24vc3JjL2xpYi90cmFuc2xhdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBTTdELE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDVSxXQUE2QixFQUM3QixhQUErQixFQUMvQixrQkFBd0M7UUFGeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO0lBQy9DLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDdEQsU0FBUyxFQUFFLENBQUMsR0FBVyxFQUFFLE9BQTRCLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6RCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FkVSxxQkFBcUI7a0dBQXJCLHFCQUFxQjs7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsYXRlXScsXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZiwge1xuICAgICAgJGltcGxpY2l0OiAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShrZXksIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvdHJhbnNsYXRpb24vc3JjL2xpYi90cmFuc2xhdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBTTdELE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsWUFDVSxXQUE2QixFQUM3QixhQUErQixFQUMvQixrQkFBd0M7UUFGeEMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO0lBQy9DLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDdEQsU0FBUyxFQUFFLENBQUMsR0FBVyxFQUFFLE9BQTRCLEVBQUUsRUFBRTtnQkFDdkQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMxRCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FkVSxxQkFBcUI7a0dBQXJCLHFCQUFxQjs7MkZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdHJhbnNsYXRlXScsXG59KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZiwge1xuICAgICAgJGltcGxpY2l0OiAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSQoa2V5LCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -11,7 +11,7 @@ export class AXTranslatorPipe {
11
11
  if (!key) {
12
12
  return of(''); // Return an empty observable if the key is not provided
13
13
  }
14
- return this.service.translate(key, options);
14
+ return this.service.translate$(key, options);
15
15
  }
16
16
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslatorPipe, deps: [{ token: i1.AXTranslationService }], target: i0.ɵɵFactoryTarget.Pipe }); }
17
17
  static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.0", ngImport: i0, type: AXTranslatorPipe, name: "translate" }); }
@@ -20,4 +20,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
20
20
  type: Pipe,
21
21
  args: [{ name: 'translate', pure: true }]
22
22
  }], ctorParameters: () => [{ type: i1.AXTranslationService }] });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3RyYW5zbGF0aW9uL3NyYy9saWIvdHJhbnNsYXRvci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUk3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO0lBQUcsQ0FBQztJQUVyRCxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTRCO1FBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0RBQXdEO1FBQ3pFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDOzhHQVJVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5AUGlwZSh7IG5hbWU6ICd0cmFuc2xhdGUnLCBwdXJlOiB0cnVlIH0pIC8vIFRoZSBwaXBlIGNhbiBub3cgYmUgcHVyZVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSkge31cblxuICB0cmFuc2Zvcm0oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gb2YoJycpOyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JzZXJ2YWJsZSBpZiB0aGUga2V5IGlzIG5vdCBwcm92aWRlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnRyYW5zbGF0ZShrZXksIG9wdGlvbnMpO1xuICB9XG59XG4iXX0=
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3RyYW5zbGF0aW9uL3NyYy9saWIvdHJhbnNsYXRvci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUk3RCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO0lBQUcsQ0FBQztJQUVyRCxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTRCO1FBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0RBQXdEO1FBQ3pFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDOzhHQVJVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFYVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFYVHJhbnNsYXRlT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5AUGlwZSh7IG5hbWU6ICd0cmFuc2xhdGUnLCBwdXJlOiB0cnVlIH0pIC8vIFRoZSBwaXBlIGNhbiBub3cgYmUgcHVyZVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRvclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBBWFRyYW5zbGF0aW9uU2VydmljZSkge31cblxuICB0cmFuc2Zvcm0oa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gb2YoJycpOyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JzZXJ2YWJsZSBpZiB0aGUga2V5IGlzIG5vdCBwcm92aWRlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnRyYW5zbGF0ZSQoa2V5LCBvcHRpb25zKTtcbiAgfVxufVxuIl19