@acorex/core 18.16.0-next.2 → 18.16.0-next.4

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, finalize, firstValueFrom, forkJoin, map, of, shareReplay, startWith, switchMap, tap, distinctUntilChanged, } 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,138 @@ 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);
150
133
  }
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
134
  }
168
- if (!translation) {
169
- translation = lodashGet(this.translationCache, `${this.getDefaultLang()}.${scope}.${key}`);
135
+ this.expressionCache.set(expression, matches);
136
+ return matches;
137
+ }
138
+ handleError(message, error) {
139
+ console.error(message, error);
140
+ this.eventService.emitEvent({
141
+ type: 'error',
142
+ payload: { message, error },
143
+ });
144
+ }
145
+ //#endregion
146
+ //#region Async Translation Methods
147
+ translateText(text, contextLang, contextScope, params) {
148
+ if (!this.isExpression(text)) {
149
+ return of(this.translateKey(text, contextLang, contextScope, params));
170
150
  }
171
- // Perform parameter replacement
172
- return this.getTranslation((translation || key), lang, scope, options?.params);
151
+ const matches = this.decodeExpression(text);
152
+ // Extract unique languages and scopes for batch loading
153
+ const langScopeSet = new Set(matches.map(({ lang, scope }) => `${lang || contextLang}_${scope || contextScope}`));
154
+ const langs = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[0])));
155
+ const scopes = Array.from(new Set(Array.from(langScopeSet).map((pair) => pair.split('_')[1])));
156
+ // Load all required languages and scopes
157
+ return this.loadLanguagesAndScopes(langs, scopes).pipe(map(() => {
158
+ // Resolve translations after loading
159
+ const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
160
+ const resolvedScope = scope || contextScope;
161
+ const resolvedLang = lang || contextLang;
162
+ acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
163
+ return acc;
164
+ }, {});
165
+ // Replace all matches in the text with their resolved translations
166
+ return matches.reduce((result, { fullMatch }) => result.replace(new RegExp(fullMatch.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), translations[fullMatch]), text);
167
+ }), catchError((error) => {
168
+ this.handleError(`Error during translation:`, error);
169
+ return of(text); // Fallback to the original text
170
+ }));
173
171
  }
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}`);
172
+ translate$(text, options) {
173
+ if (options?.lang) {
174
+ return this.translateText(text, options.lang, options?.scope ?? this.config.defaultScope, options?.params);
184
175
  }
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);
176
+ return this.langChanges$.pipe(startWith(this.getActiveLang()), distinctUntilChanged(), switchMap((lang) => {
177
+ return this.translateText(text, lang, options?.scope ?? this.config.defaultScope, options?.params);
178
+ }));
192
179
  }
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
- });
180
+ async translateAsync(text, options) {
181
+ return firstValueFrom(this.translate$(text, options));
182
+ }
183
+ //#endregion
184
+ //#region Sync Translation Methods
185
+ translateSync(text, options) {
186
+ if (this.isExpression(text)) {
187
+ return this.translateTextSync(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
188
+ }
189
+ else {
190
+ return this.translateKey(text, options?.lang ?? this.getActiveLang(), options?.scope ?? this.config.defaultScope);
230
191
  }
231
- return result;
232
192
  }
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));
193
+ translateTextSync(text, contextLang, contextScope, params) {
194
+ const matches = this.decodeExpression(text);
195
+ const translations = matches.reduce((acc, { key, scope, lang, fullMatch }) => {
196
+ const resolvedScope = scope || contextScope;
197
+ const resolvedLang = lang || contextLang;
198
+ // Cache translation to avoid redundant processing
199
+ if (!acc[fullMatch]) {
200
+ acc[fullMatch] = this.translateKey(key, resolvedLang, resolvedScope, params);
287
201
  }
288
- }
289
- // Use forkJoin to wait for all observables to complete
290
- return forkJoin(translationObservables).pipe(map((translatedParts) => translatedParts.join('')));
202
+ return acc;
203
+ }, {});
204
+ // Replace all matches in one go
205
+ return matches.reduce((result, { fullMatch }) => result.replace(fullMatch, translations[fullMatch]), text);
291
206
  }
292
207
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
293
208
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXTranslationService, providedIn: 'root' }); }
@@ -296,4 +211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
296
211
  type: Injectable,
297
212
  args: [{ providedIn: 'root' }]
298
213
  }], ctorParameters: () => [] });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLGFBQWEsRUFDYixHQUFHLEVBQ0gsRUFBRSxFQUNGLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFRN0QsSUFBSSxPQUE2QixDQUFDO0FBRWxDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUdELE1BQU0sT0FBTyxvQkFBb0I7SUFjL0I7O09BRUc7SUFDSDtRQWhCUSxXQUFNLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRDLHFC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Q0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDOzhHQXBXVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURQLE1BQU07OzJGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhFdmVudFNlcnZpY2UsIEFYRXZlbnRUeXBlcyB9IGZyb20gJ0BhY29yZXgvY29yZS9ldmVudHMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXQgYXMgbG9kYXNoR2V0LCBzZXQgYXMgbG9kYXNoU2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY2F0Y2hFcnJvcixcbiAgZmluYWxpemUsXG4gIGZpcnN0VmFsdWVGcm9tLFxuICBmb3JrSm9pbixcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBvZixcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fQ09ORklHIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgQVhfVFJBTlNMQVRJT05fTE9BREVSIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5sb2FkZXInO1xuaW1wb3J0IHtcbiAgQVhUcmFuc2xhdGVIYXNoTWFwLFxuICBBWFRyYW5zbGF0ZUxhbmcsXG4gIEFYVHJhbnNsYXRlT3B0aW9ucyxcbiAgQVhUcmFuc2xhdGVQYXJhbXMsXG59IGZyb20gJy4vdHJhbnNsYXRpb24udHlwZXMnO1xuXG5sZXQgc2VydmljZTogQVhUcmFuc2xhdGlvblNlcnZpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlcnZpY2UudHJhbnNsYXRlU3luYyhrZXksIG9wdGlvbnMpO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsb2FkZXIgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fQ09ORklHKTtcblxuICBwcml2YXRlIGV2ZW50U2VydmljZSA9IGluamVjdChBWEV2ZW50U2VydmljZSk7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGlvbkNhY2hlOiBBWFRyYW5zbGF0ZUhhc2hNYXA8QVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4+ID0ge307XG4gIHByaXZhdGUgb25nb2luZ1JlcXVlc3RzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgYWN0aXZlTGFuZzogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5nZXREZWZhdWx0TGFuZygpKTtcbiAgbGFuZ0NoYW5nZXMkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmFjdGl2ZUxhbmcuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBsYXN0QWN0aXZlTGFuZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIHNlcnZpY2UgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIGxvYWRMYW5ndWFnZXNBbmRTY29wZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSwgc2NvcGVzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gbGFuZ3VhZ2VzLmZsYXRNYXAoKGxhbmcpID0+XG4gICAgICBzY29wZXMubWFwKChzY29wZSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ10/LltzY29wZV0pIHtcbiAgICAgICAgICByZXR1cm4gb2YodGhpcy50cmFuc2xhdGlvbkNhY2hlW2xhbmddW3Njb3BlXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JMb2FkVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckxvYWRUcmFuc2xhdGlvbnMobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBWFRyYW5zbGF0ZUhhc2hNYXA8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBgJHtsYW5nfV8ke3Njb3BlfWA7XG5cbiAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgb2JzZXJ2YWJsZSBpZiB0aGUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMub25nb2luZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0S2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzLmdldChyZXF1ZXN0S2V5KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHRyYW5zbGF0aW9ucyBpZiBub3QgaW4gY2FjaGUgb3Igb25nb2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JzZXJ2YWJsZSA9IHRoaXMubG9hZGVyLmdldFRyYW5zbGF0aW9uKHsgbGFuZywgc2NvcGUgfSkucGlwZShcbiAgICAgIHRhcCgodHJhbnNsYXRpb25zKSA9PiB0aGlzLmNhY2hlVHJhbnNsYXRpb25zKGxhbmcsIHNjb3BlLCB0cmFuc2xhdGlvbnMpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciBsYW5nOiAke2xhbmd9LCBzY29wZTogJHtzY29wZX1gLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEFYRXZlbnRUeXBlcy5BWExhbmd1YWdlTG9hZGVkLFxuICAgICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5kZWxldGUocmVxdWVzdEtleSk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5zZXQocmVxdWVzdEtleSwgdHJhbnNsYXRpb25PYnNlcnZhYmxlKTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25PYnNlcnZhYmxlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVRyYW5zbGF0aW9ucyhsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHRyYW5zbGF0aW9uczogQVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4pOiB2b2lkIHtcbiAgICBsb2Rhc2hTZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHtsYW5nfS4ke3Njb3BlfWAsIHRyYW5zbGF0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVmYXVsdExhbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlTGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUxhbmcuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChsYW5nICE9IHRoaXMuZ2V0QWN0aXZlTGFuZygpKSB7XG4gICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCk7IC8vIFVwZGF0ZSBsYXN0IGFjdGl2ZSBsYW5ndWFnZVxuICAgICAgdGhpcy5hY3RpdmVMYW5nLm5leHQobGFuZyk7XG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICB0eXBlOiBBWEV2ZW50VHlwZXMuQVhMYW5ndWFnZUNoYW5nZWQsXG4gICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYW5nQXZhaWxhYmxlKCk6IEFYVHJhbnNsYXRlTGFuZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoa2V5OiBzdHJpbmcsIG9wdGlvbnM6IEFYVHJhbnNsYXRlT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBGdW5jdGlvbiB0byBmZXRjaCB0cmFuc2xhdGlvblxuICAgIGNvbnN0IGZldGNoVHJhbnNsYXRpb24gPSAobGFuZ3VhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2xhdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY2FjaGVcbiAgICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdKSB7XG4gICAgICAgIHJldHVybiBvZih0aGlzLmdldFRyYW5zbGF0aW9uKGtleSwgbGFuZ3VhZ2UsIHNjb3BlLCBvcHRpb25zLnBhcmFtcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdGhlIG5ldyBtZXRob2QgdG8gaGFuZGxlIG9uZ29pbmcgcmVxdWVzdHMgYW5kIGxvYWRpbmdcbiAgICAgIHJldHVybiB0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5ndWFnZSwgc2NvcGUpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ3VhZ2VdPy5bc2NvcGVdPy5ba2V5XSB8fCBrZXk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24sIGxhbmd1YWdlLCBzY29wZSwgb3B0aW9ucy5wYXJhbXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCh0cmFuc2xhdGVkVGV4dCkgPT4ge1xuICAgICAgICAgIGlmICh0cmFuc2xhdGVkVGV4dCA9PT0ga2V5ICYmIGxhbmd1YWdlICE9PSB0aGlzLmdldERlZmF1bHRMYW5nKCkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2xhdGlvbiBpcyBub3QgZm91bmQgYW5kIHRoZSBsYW5ndWFnZSBpcyBub3QgZGVmYXVsdCxcbiAgICAgICAgICAgIC8vIHRyeSBmZXRjaGluZyBmcm9tIHRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hUcmFuc2xhdGlvbih0aGlzLmdldERlZmF1bHRMYW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2YodHJhbnNsYXRlZFRleHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEZpcnN0LCB0cnkgdG8gZmV0Y2ggdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlXG4gICAgY29uc3QgdHJhbnNsYXRpb25Gb3JSZXF1ZXN0ZWRMYW5nID0gZmV0Y2hUcmFuc2xhdGlvbihsYW5nKTtcblxuICAgIC8vIElmIGxhc3RBY3RpdmVMYW5nIGlzIGF2YWlsYWJsZSBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHJlcXVlc3RlZCBsYW5ndWFnZSwgdXNlIGl0IGFzIGEgZmFsbGJhY2tcbiAgICBpZiAodGhpcy5sYXN0QWN0aXZlTGFuZyAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nICE9PSBsYW5nKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbihcbiAgICAgICAga2V5LFxuICAgICAgICB0aGlzLmxhc3RBY3RpdmVMYW5nLFxuICAgICAgICBzY29wZSxcbiAgICAgICAgb3B0aW9ucy5wYXJhbXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZy5waXBlKHN0YXJ0V2l0aCh0cmFuc2xhdGlvbkZvckxhc3RBY3RpdmVMYW5nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uRm9yUmVxdWVzdGVkTGFuZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZywgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXMpOiBzdHJpbmcge1xuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gKGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApIHx8IGtleSkgYXMgc3RyaW5nO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJhbXMgbGlrZSB7eyBuYW1lIH19XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbVZhbHVlID0gcGFyYW1zW3BhcmFtS2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7XFxcXHMqJHtwYXJhbUtleX1cXFxccyp9fWAsICdnJyksIHBhcmFtVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRyYW5zbGF0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtrZXl9IGlzIG5vdCBzdHJpbmdgLCB7IGtleSwgbGFuZywgc2NvcGUsIHBhcmFtcywgdHJhbnNsYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlcGxhY2UgdHJhbnNsYXRpb25zIGxpa2Uge3sgdCgna2V5JykgfX1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUGF0dGVybiA9IC97e1xccyp0XFwoJyhbXiddKyknXFwpXFxzKn19L2c7XG4gICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UodHJhbnNsYXRpb25QYXR0ZXJuLCAobWF0Y2gsIGlubmVyS2V5KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zbGF0aW9uKGlubmVyS2V5LCBsYW5nLCBzY29wZSwgcGFyYW1zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2xhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoa2V5KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ0NoYW5nZXMkLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLmdldEFjdGl2ZUxhbmcoKSksXG4gICAgICAgIHN3aXRjaE1hcCgobGFuZykgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZUFzeW5jQVhUcmFuc2xhdGUoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucz8ubGFuZykge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGtleSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5sYW5nQ2hhbmdlcyQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgICAgc3dpdGNoTWFwKChsYW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubG9hZChrZXksIHsgLi4ub3B0aW9ucywgbGFuZzogbGFuZyB9KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0cmFuc2xhdGVBc3luYyhrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksIHNjb3BlID0gdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuXG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIGlzIG5vdCBpbiB0aGUgY2FjaGUsIGxvYWQgaXRcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubG9hZChrZXksIHsgbGFuZywgc2NvcGUgfSkucGlwZSh0YWtlKDEpKSk7XG4gICAgICB0cmFuc2xhdGlvbiA9IGxvZGFzaEdldCh0aGlzLnRyYW5zbGF0aW9uQ2FjaGUsIGAke2xhbmd9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIElmIHN0aWxsIG5vdCBhdmFpbGFibGUsIHRyeSB0aGUgbGFzdCBhY3RpdmUgbGFuZ3VhZ2Ugb3IgZGVmYXVsdCBsYW5ndWFnZVxuICAgIGlmICghdHJhbnNsYXRpb24gJiYgdGhpcy5sYXN0QWN0aXZlTGFuZykge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG4gICAgaWYgKCF0cmFuc2xhdGlvbikge1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGVTeW5jKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSwgc2NvcGUgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBhY3RpdmUgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlXG4gICAgbGV0IHRyYW5zbGF0aW9uID0gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCk7XG5cbiAgICAvL1xuICAgIGNvbnN0IGxvYWRMYW5nID0gKCkgPT4gbGFzdFZhbHVlRnJvbSh0aGlzLmdldE9yTG9hZFRyYW5zbGF0aW9ucyhsYW5nLCBzY29wZSkpO1xuICAgIC8vIElmIG5vdCBhdmFpbGFibGUsIGNoZWNrIGxhc3RBY3RpdmVMYW5nXG4gICAgaWYgKCF0cmFuc2xhdGlvbiAmJiB0aGlzLmxhc3RBY3RpdmVMYW5nKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmxhc3RBY3RpdmVMYW5nfS4ke3Njb3BlfS4ke2tleX1gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICBpZiAoIXRyYW5zbGF0aW9uKSB7XG4gICAgICBsb2FkTGFuZygpO1xuICAgICAgdHJhbnNsYXRpb24gPSBsb2Rhc2hHZXQodGhpcy50cmFuc2xhdGlvbkNhY2hlLCBgJHt0aGlzLmdldERlZmF1bHRMYW5nKCl9LiR7c2NvcGV9LiR7a2V5fWApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gcGFyYW1ldGVyIHJlcGxhY2VtZW50XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNsYXRpb24oKHRyYW5zbGF0aW9uIHx8IGtleSkgYXMgYW55LCBsYW5nLCBzY29wZSwgb3B0aW9ucz8ucGFyYW1zKTtcbiAgfVxuICAvLyBwcml2YXRlIGZpbmRBWFRyYW5zbGF0ZU9wdGlvbnNGcm9tS2V5KFxuICAvLyAgIGlucHV0U3RyaW5nOiBzdHJpbmcsXG4gIC8vICk6IChPbWl0PEFYVHJhbnNsYXRlT3B0aW9ucywgJ3BhcmFtcyc+ICYgeyBrZXk6IHN0cmluZyB9KVtdIHtcbiAgLy8gICBjb25zdCByZWdleCA9IC88YXh0KD86XFxzK2xhbmc9XCIoW15cIl0qKVwiKT8oPzpcXHMrc2NvcGU9XCIoW15cIl0qKVwiKT8+KC4qPyk8XFwvYXh0Pi9nO1xuICAvLyAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgLy8gICBsZXQgbWF0Y2g7XG5cbiAgLy8gICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAvLyAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgLy8gICAgIHJlc3VsdC5wdXNoKHtcbiAgLy8gICAgICAgbGFuZzogbWF0Y2hbMV0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBzY29wZTogbWF0Y2hbMl0gfHwgdW5kZWZpbmVkLFxuICAvLyAgICAgICBrZXk6IG1hdGNoWzNdIHx8IHVuZGVmaW5lZCxcbiAgLy8gICAgIH0pO1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gcmVzdWx0O1xuICAvLyB9XG4gIHByaXZhdGUgZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkoXG4gICAgaW5wdXRTdHJpbmc6IHN0cmluZyxcbiAgKTogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL3RcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccyooPzosXFxzKlxce1xccyooW159XSopXFxzKlxcfSk/XFxzKlxcKS9nO1xuICAgIGNvbnN0IHJlc3VsdDogKE9taXQ8QVhUcmFuc2xhdGVPcHRpb25zLCAncGFyYW1zJz4gJiB7IGtleTogc3RyaW5nIH0pW10gPSBbXTtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIG1hdGNoZXMgaW4gdGhlIGlucHV0IHN0cmluZ1xuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGlucHV0U3RyaW5nKSkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdOyAvLyBFeHRyYWN0IHRoZSBrZXlcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBtYXRjaFsyXTsgLy8gRXh0cmFjdCB0aGUgb3B0aW9ucyBvYmplY3QsIGlmIHByZXNlbnRcblxuICAgICAgLy8gUGFyc2Ugb3B0aW9ucyBpbnRvIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgY29uc3QgcGFyc2VkT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5zcGxpdCgnLCcpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IG9wdGlvbi5zcGxpdCgnOicpLm1hcCgocykgPT4gcy50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCAnJykpO1xuICAgICAgICAgIHBhcnNlZE9wdGlvbnNba2V5XSA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBsYW5nOiBwYXJzZWRPcHRpb25zWydsYW5nJ10sXG4gICAgICAgIHNjb3BlOiBwYXJzZWRPcHRpb25zWydzY29wZSddLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgdHJhbnNsYXRlQXN5bmNBWFRyYW5zbGF0ZShrZXk6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gIC8vICAgY29uc3QgcmVnZXggPSAvKDxheHQoPzpcXHMrbGFuZz1cIlteXCJdKlwiKT8oPzpcXHMrc2NvcGU9XCJbXlwiXSpcIik/Pi4qPzxcXC9heHQ+KS9nO1xuICAvLyAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIDxheHQ+IHBhcnRzIGFuZCB0ZXh0IHBhcnRzXG5cbiAgLy8gICBjb25zdCB0cmFuc2xhdGlvbk9ic2VydmFibGVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gIC8vICAgZm9yIChjb25zdCBwYXJ0IG9mIHNwbGl0UGFydHMpIHtcbiAgLy8gICAgIGNvbnN0IG9wdGlvbnNGcm9tS2V5ID0gdGhpcy5maW5kQVhUcmFuc2xhdGVPcHRpb25zRnJvbUtleShwYXJ0KTtcblxuICAvLyAgICAgaWYgKG9wdGlvbnNGcm9tS2V5Lmxlbmd0aCA+IDApIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBhbiA8YXh0PiBwYXJ0LCB0cmFuc2xhdGUgaXRcbiAgLy8gICAgICAgZm9yIChjb25zdCBwYXJzZWQgb2Ygb3B0aW9uc0Zyb21LZXkpIHtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRMYW5nID0gcGFyc2VkLmxhbmcgfHwgb3B0aW9ucz8ubGFuZyB8fCB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgLy8gICAgICAgICBjb25zdCBwYXJzZWRTY29wZSA9IHBhcnNlZC5zY29wZSB8fCBvcHRpb25zPy5zY29wZSB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGU7XG4gIC8vICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gcGFyc2VkLmtleTtcblxuICAvLyAgICAgICAgIC8vIFB1c2ggdGhlIHRyYW5zbGF0aW9uIG9ic2VydmFibGUgdG8gdGhlIGFycmF5XG4gIC8vICAgICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKFxuICAvLyAgICAgICAgICAgdGhpcy5sb2FkKHBhcnNlZEtleSwge1xuICAvLyAgICAgICAgICAgICBsYW5nOiBwYXJzZWRMYW5nLFxuICAvLyAgICAgICAgICAgICBzY29wZTogcGFyc2VkU2NvcGUsXG4gIC8vICAgICAgICAgICAgIHBhcmFtczogb3B0aW9ucz8ucGFyYW1zLFxuICAvLyAgICAgICAgICAgfSksXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgLy8gVGhpcyBpcyBwbGFpbiB0ZXh0LCBzbyB3cmFwIGl0IGluIGFuIG9ic2VydmFibGVcbiAgLy8gICAgICAgdHJhbnNsYXRpb25PYnNlcnZhYmxlcy5wdXNoKG9mKHBhcnQpKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIG9ic2VydmFibGVzIHRvIGNvbXBsZXRlXG4gIC8vICAgcmV0dXJuIGZvcmtKb2luKHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMpLnBpcGUoXG4gIC8vICAgICBtYXAoKHRyYW5zbGF0ZWRQYXJ0cykgPT4gdHJhbnNsYXRlZFBhcnRzLmpvaW4oJycpKSwgLy8gSm9pbiBhbGwgdHJhbnNsYXRlZCBwYXJ0c1xuICAvLyAgICk7XG4gIC8vIH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBc3luY0FYVHJhbnNsYXRlKGtleTogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZWdleCA9IC8odFxcKFsnXCJdW14nXCJdK1snXCJdKD86LFxccypcXHtbXn1dKlxcfSk/XFwpKS9nOyAvLyBNYXRjaCB0KCdrZXknLCB7IC4uLiB9KSBjYWxsc1xuICAgIGNvbnN0IHNwbGl0UGFydHMgPSBrZXkuc3BsaXQocmVnZXgpOyAvLyBTcGxpdCBpbnRvIHQoKSBwYXJ0cyBhbmQgdGV4dCBwYXJ0c1xuXG4gICAgY29uc3QgdHJhbnNsYXRpb25PYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBzcGxpdFBhcnRzKSB7XG4gICAgICBjb25zdCBvcHRpb25zRnJvbUtleSA9IHRoaXMuZmluZEFYVHJhbnNsYXRlT3B0aW9uc0Zyb21LZXkocGFydCk7XG5cbiAgICAgIGlmIChvcHRpb25zRnJvbUtleS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSB0KCkgcGFydCwgdHJhbnNsYXRlIGl0XG4gICAgICAgIGZvciAoY29uc3QgcGFyc2VkIG9mIG9wdGlvbnNGcm9tS2V5KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGFuZyA9IHBhcnNlZC5sYW5nIHx8IG9wdGlvbnM/LmxhbmcgfHwgdGhpcy5nZXRBY3RpdmVMYW5nKCk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU2NvcGUgPSBwYXJzZWQuc2NvcGUgfHwgb3B0aW9ucz8uc2NvcGUgfHwgdGhpcy5jb25maWcuZGVmYXVsdFNjb3BlO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlZC5rZXk7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB0cmFuc2xhdGlvbiBvYnNlcnZhYmxlIHRvIHRoZSBhcnJheVxuICAgICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMubG9hZChwYXJzZWRLZXksIHtcbiAgICAgICAgICAgICAgbGFuZzogcGFyc2VkTGFuZyxcbiAgICAgICAgICAgICAgc2NvcGU6IHBhcnNlZFNjb3BlLFxuICAgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgcGxhaW4gdGV4dCwgc28gd3JhcCBpdCBpbiBhbiBvYnNlcnZhYmxlXG4gICAgICAgIHRyYW5zbGF0aW9uT2JzZXJ2YWJsZXMucHVzaChvZihwYXJ0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNlIGZvcmtKb2luIHRvIHdhaXQgZm9yIGFsbCBvYnNlcnZhYmxlcyB0byBjb21wbGV0ZVxuICAgIHJldHVybiBmb3JrSm9pbih0cmFuc2xhdGlvbk9ic2VydmFibGVzKS5waXBlKFxuICAgICAgbWFwKCh0cmFuc2xhdGVkUGFydHMpID0+IHRyYW5zbGF0ZWRQYXJ0cy5qb2luKCcnKSksIC8vIEpvaW4gYWxsIHRyYW5zbGF0ZWQgcGFydHNcbiAgICApO1xuICB9XG59XG4iXX0=
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS90cmFuc2xhdGlvbi9zcmMvbGliL3RyYW5zbGF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBRWYsVUFBVSxFQUNWLFFBQVEsRUFDUixjQUFjLEVBQ2QsUUFBUSxFQUNSLEdBQUcsRUFDSCxFQUFFLEVBQ0YsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNILG9CQUFvQixHQUNyQixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUc3RCxJQUFJLGlCQUF1QyxDQUFDO0FBRTVDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQTRCO0lBQ3JFLE9BQU8saUJBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBR0QsTUFBTSxPQUFPLG9CQUFvQjtJQWN4QixjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVNLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBWTtRQUMvQixJ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QyxDQUFDLEVBQzdFLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQzs4R0FsUlUsb0JBQW9CO2tIQUFwQixvQkFBb0IsY0FEUCxNQUFNOzsyRkFDbkIsb0JBQW9CO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYRXZlbnRTZXJ2aWNlLCBBWEV2ZW50VHlwZXMgfSBmcm9tICdAYWNvcmV4L2NvcmUvZXZlbnRzJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0IGFzIGxvZGFzaEdldCwgc2V0IGFzIGxvZGFzaFNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNhdGNoRXJyb3IsXG4gIGZpbmFsaXplLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZm9ya0pvaW4sXG4gIG1hcCxcbiAgb2YsXG4gIHNoYXJlUmVwbGF5LFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWF9UUkFOU0xBVElPTl9DT05GSUcgfSBmcm9tICcuL3RyYW5zbGF0aW9uLmNvbmZpZyc7XG5pbXBvcnQgeyBBWF9UUkFOU0xBVElPTl9MT0FERVIgfSBmcm9tICcuL3RyYW5zbGF0aW9uLmxvYWRlcic7XG5pbXBvcnQgeyBBWFRyYW5zbGF0ZUhhc2hNYXAsIEFYVHJhbnNsYXRlT3B0aW9ucywgQVhUcmFuc2xhdGVQYXJhbXMgfSBmcm9tICcuL3RyYW5zbGF0aW9uLnR5cGVzJztcblxubGV0IHNpbmdsZXRvbkluc3RhbmNlOiBBWFRyYW5zbGF0aW9uU2VydmljZTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZVN5bmMoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpOiBzdHJpbmcge1xuICByZXR1cm4gc2luZ2xldG9uSW5zdGFuY2UudHJhbnNsYXRlU3luYyhrZXksIG9wdGlvbnMpO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFYVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsb2FkZXIgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fTE9BREVSKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQVhfVFJBTlNMQVRJT05fQ09ORklHKTtcblxuICBwcml2YXRlIGV2ZW50U2VydmljZSA9IGluamVjdChBWEV2ZW50U2VydmljZSk7XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGlvbkNhY2hlOiBBWFRyYW5zbGF0ZUhhc2hNYXA8QVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4+ID0ge307XG4gIHByaXZhdGUgb25nb2luZ1JlcXVlc3RzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgYWN0aXZlTGFuZzogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5nZXREZWZhdWx0TGFuZygpKTtcbiAgbGFuZ0NoYW5nZXMkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmFjdGl2ZUxhbmcuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcHJpdmF0ZSBleHByZXNzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBrZXk6IHN0cmluZzsgc2NvcGU/OiBzdHJpbmc7IGxhbmc/OiBzdHJpbmc7IGZ1bGxNYXRjaDogc3RyaW5nIH1bXT4oKTtcblxuICBwdWJsaWMgZ2V0RGVmYXVsdExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVmYXVsdExhbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZlTGFuZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUxhbmcuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChsYW5nICE9IHRoaXMuZ2V0QWN0aXZlTGFuZygpKSB7XG4gICAgICB0aGlzLmFjdGl2ZUxhbmcubmV4dChsYW5nKTtcbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLmVtaXRFdmVudCh7XG4gICAgICAgIHR5cGU6IEFYRXZlbnRUeXBlcy5BWExhbmd1YWdlQ2hhbmdlZCxcbiAgICAgICAgcGF5bG9hZDogbGFuZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzaW5nbGV0b25JbnN0YW5jZSA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgbG9hZExhbmd1YWdlc0FuZFNjb3BlcyhsYW5ndWFnZXM6IHN0cmluZ1tdLCBzY29wZXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBsYW5ndWFnZXMuZmxhdE1hcCgobGFuZykgPT5cbiAgICAgIHNjb3Blcy5tYXAoKHNjb3BlKSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRyYW5zbGF0aW9ucyBhcmUgYWxyZWFkeSBjYWNoZWRcbiAgICAgICAgaWYgKHRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXT8uW3Njb3BlXSkge1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB0aGUgbmV3IG1ldGhvZCB0byBoYW5kbGUgb25nb2luZyByZXF1ZXN0cyBhbmQgbG9hZGluZ1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRyYW5zbGF0aW9uRmlsZXMobGFuZywgc2NvcGUpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hUcmFuc2xhdGlvbkZpbGVzKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyk6IE9ic2VydmFibGU8QVhUcmFuc2xhdGVIYXNoTWFwPHN0cmluZz4+IHtcbiAgICBjb25zdCByZXF1ZXN0S2V5ID0gYCR7bGFuZ31fJHtzY29wZX1gO1xuXG4gICAgLy8gUmV0dXJuIGV4aXN0aW5nIG9ic2VydmFibGUgaWYgdGhlIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgIGlmICh0aGlzLm9uZ29pbmdSZXF1ZXN0cy5oYXMocmVxdWVzdEtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5nZXQocmVxdWVzdEtleSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCB0cmFuc2xhdGlvbnMgaWYgbm90IGluIGNhY2hlIG9yIG9uZ29pbmcgcmVxdWVzdHNcbiAgICBjb25zdCB0cmFuc2xhdGlvbk9ic2VydmFibGUgPSB0aGlzLmxvYWRlci5nZXRUcmFuc2xhdGlvbih7IGxhbmcsIHNjb3BlIH0pLnBpcGUoXG4gICAgICB0YXAoKHRyYW5zbGF0aW9ucykgPT4gdGhpcy5zZXRUcmFuc2xhdGlvbkNhY2hlKGxhbmcsIHNjb3BlLCB0cmFuc2xhdGlvbnMpKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoYEVycm9yIGxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciBsYW5nOiAke2xhbmd9LCBzY29wZTogJHtzY29wZX1gLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IEFYRXZlbnRUeXBlcy5BWExhbmd1YWdlTG9hZGVkLFxuICAgICAgICAgIHBheWxvYWQ6IGxhbmcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uZ29pbmdSZXF1ZXN0cy5kZWxldGUocmVxdWVzdEtleSk7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcblxuICAgIHRoaXMub25nb2luZ1JlcXVlc3RzLnNldChyZXF1ZXN0S2V5LCB0cmFuc2xhdGlvbk9ic2VydmFibGUpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbk9ic2VydmFibGU7XG4gIH1cblxuICAvLyNyZWdpb24gIEhlbHBlcnMgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRpb24gZGF0YSBpbnRvIGNhY2hlXG4gICAqL1xuICBwcml2YXRlIHNldFRyYW5zbGF0aW9uQ2FjaGUobGFuZzogc3RyaW5nLCBzY29wZTogc3RyaW5nLCB0cmFuc2xhdGlvbnM6IEFYVHJhbnNsYXRlSGFzaE1hcDxzdHJpbmc+KTogdm9pZCB7XG4gICAgbG9kYXNoU2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX1gLCB0cmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gbG9hZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHRoaXMudHJhbnNsYXRpb25DYWNoZSwgYCR7bGFuZ30uJHtzY29wZX0uJHtrZXl9YCwga2V5KSBhcyBzdHJpbmc7XG4gIH1cblxuICBwdWJsaWMgaXNMYW5nQXZhaWxhYmxlKGxhbmc6IHN0cmluZywgc2NvcGU6IHN0cmluZyA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudHJhbnNsYXRpb25DYWNoZVtsYW5nXSAmJiAoIXNjb3BlIHx8ICF0aGlzLnRyYW5zbGF0aW9uQ2FjaGVbbGFuZ11bc2NvcGVdKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlS2V5KGtleTogc3RyaW5nLCBsYW5nOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHBhcmFtcz86IEFYVHJhbnNsYXRlUGFyYW1zKTogc3RyaW5nIHtcbiAgICAvLyBUcmlnZ2VyIGFzeW5jIHByZWxvYWRpbmcgd2l0aG91dCBibG9ja2luZyBleGVjdXRpb25cbiAgICB0aGlzLmxvYWRMYW5ndWFnZXNBbmRTY29wZXMoW2xhbmddLCBbc2NvcGVdKS5zdWJzY3JpYmUoe1xuICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuaGFuZGxlRXJyb3IoYEVycm9yIHByZWxvYWRpbmcgdHJhbnNsYXRpb25zIGZvciAke2xhbmd9LCAke3Njb3BlfWAsIGVyciksXG4gICAgfSk7XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgY2FjaGUgb3IgZmFsbGJhY2sgdG8gdGhlIGtleVxuICAgIGxldCB0cmFuc2xhdGlvbjogc3RyaW5nID0gdGhpcy5nZXRUcmFuc2xhdGlvbkZyb21DYWNoZShsYW5nLCBzY29wZSwga2V5KTtcblxuICAgIC8vIFJlcGxhY2UgcGFyYW1zIGxpa2Uge3sgbmFtZSB9fVxuICAgIGlmIChwYXJhbXMgJiYgdHlwZW9mIHRyYW5zbGF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwYXJhbUtleSkgPT4ge1xuICAgICAgICB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uLnJlcGxhY2UobmV3IFJlZ0V4cChge3tcXHMqJHtwYXJhbUtleX1cXHMqfX1gLCAnZycpLCBwYXJhbXNbcGFyYW1LZXldIGFzIHN0cmluZyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNsYXRpb24gfHwga2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0V4cHJlc3Npb24gPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUuaW5jbHVkZXMoJ3QoJyk7XG5cbiAgcHJpdmF0ZSBkZWNvZGVFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nOyBsYW5nPzogc3RyaW5nOyBmdWxsTWF0Y2g6IHN0cmluZyB9W10ge1xuICAgIGlmICh0aGlzLmV4cHJlc3Npb25DYWNoZS5oYXMoZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25DYWNoZS5nZXQoZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnZXggPSAvdFxcKFtcIiddKFteXCInXSspW1wiJ11cXHMqKD86LFxccyooXFx7Lio/XFx9KSk/XFwpL2c7XG4gICAgY29uc3QgbWF0Y2hlczogeyBrZXk6IHN0cmluZzsgc2NvcGU/OiBzdHJpbmc7IGxhbmc/OiBzdHJpbmc7IGZ1bGxNYXRjaDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGV4cHJlc3Npb24pKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCByYXdPcHRpb25zID0gbWF0Y2hbMl07XG5cbiAgICAgIGlmICghcmF3T3B0aW9ucykge1xuICAgICAgICBtYXRjaGVzLnB1c2goeyBrZXksIHNjb3BlOiBudWxsLCBsYW5nOiBudWxsLCBmdWxsTWF0Y2g6IG1hdGNoWzBdIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IHJhd09wdGlvbnNcbiAgICAgICAgICAucmVwbGFjZSgvKFsnXCJdKT8oW2EtekEtWjAtOV9dKykoWydcIl0pP1xccyo6L2csICdcIiQyXCI6JykgLy8gRW5zdXJlIGtleXMgYXJlIHF1b3RlZFxuICAgICAgICAgIC5yZXBsYWNlKC8nL2csICdcIicpOyAvLyBSZXBsYWNlIHNpbmdsZSBxdW90ZXMgd2l0aCBkb3VibGUgcXVvdGVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuXG4gICAgICAgIG1hdGNoZXMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHNjb3BlOiBvcHRpb25zLnNjb3BlIHx8IG51bGwsXG4gICAgICAgICAgbGFuZzogb3B0aW9ucy5sYW5nIHx8IG51bGwsXG4gICAgICAgICAgZnVsbE1hdGNoOiBtYXRjaFswXSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugb3B0aW9ucyBmb3Iga2V5IFwiJHtrZXl9XCI6YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZXhwcmVzc2lvbkNhY2hlLnNldChleHByZXNzaW9uLCBtYXRjaGVzKTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IobWVzc2FnZTogc3RyaW5nLCBlcnJvcjogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlLCBlcnJvcik7XG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZW1pdEV2ZW50KHtcbiAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICBwYXlsb2FkOiB7IG1lc3NhZ2UsIGVycm9yIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQXN5bmMgVHJhbnNsYXRpb24gTWV0aG9kc1xuXG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgY29udGV4dExhbmc6IHN0cmluZyxcbiAgICBjb250ZXh0U2NvcGU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBBWFRyYW5zbGF0ZVBhcmFtc1xuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5pc0V4cHJlc3Npb24odGV4dCkpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnRyYW5zbGF0ZUtleSh0ZXh0LCBjb250ZXh0TGFuZywgY29udGV4dFNjb3BlLCBwYXJhbXMpKTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZGVjb2RlRXhwcmVzc2lvbih0ZXh0KTtcblxuICAgIC8vIEV4dHJhY3QgdW5pcXVlIGxhbmd1YWdlcyBhbmQgc2NvcGVzIGZvciBiYXRjaCBsb2FkaW5nXG4gICAgY29uc3QgbGFuZ1Njb3BlU2V0ID0gbmV3IFNldChcbiAgICAgIG1hdGNoZXMubWFwKCh7IGxhbmcsIHNjb3BlIH0pID0+IGAke2xhbmcgfHwgY29udGV4dExhbmd9XyR7c2NvcGUgfHwgY29udGV4dFNjb3BlfWApXG4gICAgKTtcblxuICAgIGNvbnN0IGxhbmdzID0gQXJyYXkuZnJvbShuZXcgU2V0KEFycmF5LmZyb20obGFuZ1Njb3BlU2V0KS5tYXAoKHBhaXIpID0+IHBhaXIuc3BsaXQoJ18nKVswXSkpKTtcbiAgICBjb25zdCBzY29wZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoQXJyYXkuZnJvbShsYW5nU2NvcGVTZXQpLm1hcCgocGFpcikgPT4gcGFpci5zcGxpdCgnXycpWzFdKSkpO1xuXG4gICAgLy8gTG9hZCBhbGwgcmVxdWlyZWQgbGFuZ3VhZ2VzIGFuZCBzY29wZXNcbiAgICByZXR1cm4gdGhpcy5sb2FkTGFuZ3VhZ2VzQW5kU2NvcGVzKGxhbmdzLCBzY29wZXMpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAvLyBSZXNvbHZlIHRyYW5zbGF0aW9ucyBhZnRlciBsb2FkaW5nXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1hdGNoZXMucmVkdWNlKChhY2MsIHsga2V5LCBzY29wZSwgbGFuZywgZnVsbE1hdGNoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFNjb3BlID0gc2NvcGUgfHwgY29udGV4dFNjb3BlO1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkTGFuZyA9IGxhbmcgfHwgY29udGV4dExhbmc7XG5cbiAgICAgICAgICBhY2NbZnVsbE1hdGNoXSA9IHRoaXMudHJhbnNsYXRlS2V5KGtleSwgcmVzb2x2ZWRMYW5nLCByZXNvbHZlZFNjb3BlLCBwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIG1hdGNoZXMgaW4gdGhlIHRleHQgd2l0aCB0aGVpciByZXNvbHZlZCB0cmFuc2xhdGlvbnNcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMucmVkdWNlKFxuICAgICAgICAgIChyZXN1bHQsIHsgZnVsbE1hdGNoIH0pID0+XG4gICAgICAgICAgICByZXN1bHQucmVwbGFjZShuZXcgUmVnRXhwKGZ1bGxNYXRjaC5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyksICdnJyksIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdKSxcbiAgICAgICAgICB0ZXh0XG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoYEVycm9yIGR1cmluZyB0cmFuc2xhdGlvbjpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBvZih0ZXh0KTsgLy8gRmFsbGJhY2sgdG8gdGhlIG9yaWdpbmFsIHRleHRcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2xhdGUkKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IEFYVHJhbnNsYXRlT3B0aW9ucyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKG9wdGlvbnM/LmxhbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHQodGV4dCwgb3B0aW9ucy5sYW5nLCBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsIG9wdGlvbnM/LnBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHRoaXMuZ2V0QWN0aXZlTGFuZygpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAoKGxhbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlVGV4dCh0ZXh0LCBsYW5nLCBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUsIG9wdGlvbnM/LnBhcmFtcyk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJhbnNsYXRlQXN5bmModGV4dDogc3RyaW5nLCBvcHRpb25zPzogQVhUcmFuc2xhdGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy50cmFuc2xhdGUkKHRleHQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBTeW5jIFRyYW5zbGF0aW9uIE1ldGhvZHNcblxuICBwdWJsaWMgdHJhbnNsYXRlU3luYyh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBBWFRyYW5zbGF0ZU9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5pc0V4cHJlc3Npb24odGV4dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVRleHRTeW5jKHRleHQsIG9wdGlvbnM/LmxhbmcgPz8gdGhpcy5nZXRBY3RpdmVMYW5nKCksIG9wdGlvbnM/LnNjb3BlID8/IHRoaXMuY29uZmlnLmRlZmF1bHRTY29wZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZUtleSh0ZXh0LCBvcHRpb25zPy5sYW5nID8/IHRoaXMuZ2V0QWN0aXZlTGFuZygpLCBvcHRpb25zPy5zY29wZSA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0U2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dFN5bmMoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNvbnRleHRMYW5nOiBzdHJpbmcsXG4gICAgY29udGV4dFNjb3BlOiBzdHJpbmcsXG4gICAgcGFyYW1zPzogQVhUcmFuc2xhdGVQYXJhbXNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5kZWNvZGVFeHByZXNzaW9uKHRleHQpO1xuXG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gbWF0Y2hlcy5yZWR1Y2UoKGFjYywgeyBrZXksIHNjb3BlLCBsYW5nLCBmdWxsTWF0Y2ggfSkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWRTY29wZSA9IHNjb3BlIHx8IGNvbnRleHRTY29wZTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTGFuZyA9IGxhbmcgfHwgY29udGV4dExhbmc7XG5cbiAgICAgIC8vIENhY2hlIHRyYW5zbGF0aW9uIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nXG4gICAgICBpZiAoIWFjY1tmdWxsTWF0Y2hdKSB7XG4gICAgICAgIGFjY1tmdWxsTWF0Y2hdID0gdGhpcy50cmFuc2xhdGVLZXkoa2V5LCByZXNvbHZlZExhbmcsIHJlc29sdmVkU2NvcGUsIHBhcmFtcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xuXG4gICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyBpbiBvbmUgZ29cbiAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB7IGZ1bGxNYXRjaCB9KSA9PiByZXN1bHQucmVwbGFjZShmdWxsTWF0Y2gsIHRyYW5zbGF0aW9uc1tmdWxsTWF0Y2hdKSxcbiAgICAgIHRleHRcbiAgICApO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
@@ -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