@libs-ui/utils 0.2.8 → 0.2.10-6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cache.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  export declare class UtilsCache {
2
- private static typeKeyClearLocalStorage;
3
- private static listKeyKeepWhenClearALll;
2
+ static readonly CACHE_EXPIRE_TIME_DEFAULT: number;
3
+ static readonly CACHE_EXPIRE_NONE = -1;
4
+ static readonly idService: string;
5
+ static typeKeyClearLocalStorage: string;
4
6
  private static languageKeyCache;
7
+ private static listKeyKeepWhenClearALll;
5
8
  private static initdEvent?;
6
- private static readonly CACHE_EXPIRE_TIME_DEFAULT;
7
- private static readonly CACHE_EXPIRE_NONE;
8
- private static language;
9
- private static idService;
10
9
  private static storage;
11
10
  private static dbName;
12
11
  private static itemIndexByKey;
@@ -16,26 +15,27 @@ export declare class UtilsCache {
16
15
  indexedDBName?: string;
17
16
  languageKeyCache?: string;
18
17
  typeKeyClearLocalStorage?: string;
19
- listKeyKeepWhenClearALll?: Array<string>;
18
+ listKeyKeepWhenClearAll?: Array<string>;
20
19
  }): void;
21
20
  static setLang(lang: string): void;
22
- static getLang(): string;
21
+ static getLang(): 'vi' | 'en';
23
22
  private static openDB;
24
23
  private static getObjectStore;
25
24
  private static get LocalStorage();
26
25
  private static getLocalStorageFakeOnSafari;
27
26
  private static getLocalStorageFake;
28
- static GetAsync(key: string, default_value?: any, isKeyMD5?: boolean): Promise<any>;
29
- static Get(key: string, default_value?: any): any;
30
- private static GetDefaultValueBySpecificKey;
31
- static SetAsync(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<unknown>;
32
- static Set(key: string, value: any, expireTimeBySecond?: number): void;
33
- static ClearAsync(key: string, isMD5?: boolean): Promise<unknown>;
27
+ static GetAsync<T = any>(key: string, default_value?: any, isKeyMD5?: boolean): Promise<T>;
28
+ static Get<T = any>(key: string, default_value?: any): T;
29
+ static GetDefaultValueBySpecificKey(key: string, default_value: any): any;
30
+ static SetAsync<T = any>(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<T>;
31
+ static Set(key: string, value: any, expireTimeBySecond?: number): boolean;
32
+ static ClearAsync(key: string, isMD5?: boolean): Promise<void>;
34
33
  static Clear(key: string): void;
35
- static ClearAllAsync(): Promise<unknown>;
34
+ static ClearAllAsync(): Promise<void>;
36
35
  static ClearAll(): void;
37
36
  private static GetDataByKeys;
38
37
  private static SetDataByKey;
39
38
  static DeleteKeyStartWithAsync(keyCacheStartWith: string, isKeyMD5?: boolean): Promise<unknown>;
40
39
  static DeleteKeyStartWith(keyCache: string, isMD5?: boolean): void;
40
+ static DeleteDatabaseIndexDB(dbName: string): Promise<unknown>;
41
41
  }
@@ -1,17 +1,18 @@
1
1
  import { Subject } from "rxjs";
2
+ export declare class UtilsCommunicateMicroKeyGlobal {
3
+ static KEY_MESSAGE_MODAL: string;
4
+ }
2
5
  export declare class UtilsCommunicateMicro {
3
- private static readonly KEY_GET_ALL_MESSAGE;
4
6
  static readonly PREFIX_TYPE = "3RD_INTEGRATE_MICRO_SITE_";
7
+ private static readonly KEY_GET_ALL_MESSAGE;
5
8
  private static initdEvent?;
6
9
  private static subs;
7
10
  private static allMessageSub;
8
- static initEvent(currentWindow: Window): void;
11
+ static initEvent(currentWindow: Window, onDestroy: Subject<void>): void;
9
12
  static PostMessageToParent(data: any): void;
10
13
  static PostMessageToChildren(data: any): void;
11
14
  static PostMessageToOpener(data: any): void;
12
15
  private static convertData;
13
16
  static GetMessage(messageType: string | Array<string>): Subject<MessageEvent>;
14
17
  private static initSubject;
15
- postMessageToParent(data: unknown): void;
16
- postMessageToChildren(data: unknown): void;
17
18
  }
package/constants.d.ts CHANGED
@@ -5,3 +5,4 @@ export declare const ERROR_MESSAGE_MAX_VALID = "i18n_message_error_input_max_val
5
5
  export declare const ERROR_MESSAGE_MIN_LENGTH = "i18n_message_error_input_min_length";
6
6
  export declare const ERROR_MESSAGE_MAX_LENGTH = "i18n_message_error_input_max_length";
7
7
  export declare const CHARACTER_DATA_EMPTY = "__";
8
+ export declare const DEFAULT_START_PAGE_0 = "defaultStartPage0";
@@ -0,0 +1 @@
1
+ export declare const endCodeUrl: (objectData: any, isBody: boolean) => string;
package/esm2022/cache.mjs CHANGED
@@ -1,22 +1,20 @@
1
1
  /* eslint-disable no-async-promise-executor */
2
2
  /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { signal } from '@angular/core';
4
- import { filter } from 'rxjs';
5
3
  import { UtilsCommunicateMicro } from './communicate-micro';
6
4
  import { decrypt, encrypt, md5 } from './crypto';
7
5
  import { getPlatFromBrowser } from './dom';
6
+ import { isEmbedFrame } from './function-check-embed-frame';
8
7
  import { isNil } from './helpers';
9
8
  import { UtilsLanguageConstants } from './language';
10
9
  import { uuid } from './uuid';
11
10
  export class UtilsCache {
12
- static typeKeyClearLocalStorage = 'LIBS_UI_CLEAR_LOCAL_STORAGE_EVENT';
13
- static listKeyKeepWhenClearALll = Array();
14
- static languageKeyCache = 'SR3xQKxHgffiCevPQRralg';
15
- static initdEvent;
16
11
  static CACHE_EXPIRE_TIME_DEFAULT = 5 * 60;
17
12
  static CACHE_EXPIRE_NONE = -1;
18
- static language = signal(UtilsLanguageConstants.defaultLang);
19
13
  static idService = uuid();
14
+ static typeKeyClearLocalStorage = 'LIBS_UI_CLEAR_LOCAL_STORAGE_EVENT';
15
+ static languageKeyCache = 'SR3xQKxHgffiCevPQRralg';
16
+ static listKeyKeepWhenClearALll = Array();
17
+ static initdEvent;
20
18
  static storage;
21
19
  static dbName = 'libs-ui-cache';
22
20
  static itemIndexByKey = 'key';
@@ -33,25 +31,21 @@ export class UtilsCache {
33
31
  if (config.typeKeyClearLocalStorage) {
34
32
  UtilsCache.typeKeyClearLocalStorage = config.typeKeyClearLocalStorage;
35
33
  }
36
- if (config.listKeyKeepWhenClearALll) {
37
- UtilsCache.listKeyKeepWhenClearALll = config.listKeyKeepWhenClearALll;
34
+ if (config.listKeyKeepWhenClearAll) {
35
+ UtilsCache.listKeyKeepWhenClearALll = config.listKeyKeepWhenClearAll;
38
36
  }
39
37
  if (config.languageKeyCache) {
40
38
  UtilsCache.languageKeyCache = config.languageKeyCache;
41
39
  }
42
- UtilsCommunicateMicro.GetMessage(UtilsCache.typeKeyClearLocalStorage).pipe(filter(e => e.data.response !== UtilsCache.idService)).subscribe(() => {
43
- UtilsCache.ClearAll();
44
- });
45
40
  }
46
41
  static setLang(lang) {
47
42
  if (lang !== UtilsLanguageConstants.VI && lang !== UtilsLanguageConstants.EN) {
48
43
  throw Error('Language support vi | en');
49
44
  }
50
- UtilsCache.language.set(lang);
51
- UtilsCache.Set(UtilsCache.languageKeyCache, lang);
45
+ UtilsCache.Set(UtilsCache.languageKeyCache, lang, UtilsCache.CACHE_EXPIRE_NONE);
52
46
  }
53
47
  static getLang() {
54
- return UtilsCache.language();
48
+ return UtilsCache.Get(UtilsCache.languageKeyCache, UtilsLanguageConstants.defaultLang);
55
49
  }
56
50
  static openDB() {
57
51
  return new Promise(resolve => {
@@ -59,15 +53,12 @@ export class UtilsCache {
59
53
  request.onupgradeneeded = (event) => {
60
54
  const db = event.target.result;
61
55
  if (!db.objectStoreNames.contains(UtilsCache.dbName)) {
62
- const objectStore = db.createObjectStore(UtilsCache.dbName, { keyPath: 'id', autoIncrement: true });
56
+ const objectStore = db.createObjectStore(UtilsCache.dbName, { keyPath: UtilsCache.itemIndexByKey, autoIncrement: true });
63
57
  objectStore.createIndex(UtilsCache.itemIndexByKey, UtilsCache.itemIndexByKey, { unique: true });
64
58
  }
65
59
  };
66
60
  request.onsuccess = () => {
67
61
  UtilsCache.db = request.result;
68
- setTimeout(() => {
69
- UtilsCache.DeleteKeyStartWithAsync('');
70
- }, 2000);
71
62
  resolve(true);
72
63
  };
73
64
  request.onerror = (event) => {
@@ -81,7 +72,10 @@ export class UtilsCache {
81
72
  await UtilsCache.openDB();
82
73
  }
83
74
  const transaction = UtilsCache.db?.transaction([UtilsCache.dbName], 'readwrite');
84
- return transaction?.objectStore(UtilsCache.dbName);
75
+ if (!transaction) {
76
+ return null;
77
+ }
78
+ return transaction.objectStore(UtilsCache.dbName);
85
79
  }
86
80
  static get LocalStorage() {
87
81
  try {
@@ -155,8 +149,7 @@ export class UtilsCache {
155
149
  if (!objectStore) {
156
150
  return resolve(default_value);
157
151
  }
158
- const index = objectStore.index(UtilsCache.itemIndexByKey);
159
- const request = index.get(key);
152
+ const request = objectStore.get(key);
160
153
  request.onsuccess = () => {
161
154
  if (!request.result) {
162
155
  return resolve(default_value);
@@ -187,7 +180,7 @@ export class UtilsCache {
187
180
  try {
188
181
  const data = JSON.parse(decrypt(cachedData));
189
182
  if (data.expire === UtilsCache.CACHE_EXPIRE_NONE) {
190
- return data.value;
183
+ return data.value ?? default_value;
191
184
  }
192
185
  const currentMillisecond = (new Date().valueOf() / 1000);
193
186
  if (data.expire < currentMillisecond) {
@@ -205,52 +198,31 @@ export class UtilsCache {
205
198
  }
206
199
  static async SetAsync(key, value, expireTimeBySecond = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, isKeyMD5 = false) {
207
200
  return new Promise(async (resolve, reject) => {
208
- let objectStore = await UtilsCache.getObjectStore();
201
+ const objectStore = await UtilsCache.getObjectStore();
209
202
  key = isKeyMD5 ? key : md5(key);
210
203
  try {
211
204
  const currentMillisecond = expireTimeBySecond === UtilsCache.CACHE_EXPIRE_NONE ? UtilsCache.CACHE_EXPIRE_NONE : (new Date().valueOf() / 1000) + expireTimeBySecond;
212
205
  const data = {
213
- key: key,
214
206
  value: encrypt(JSON.stringify({ json: value, expire: currentMillisecond })),
215
207
  };
208
+ data[UtilsCache.itemIndexByKey] = key;
216
209
  if (!objectStore) {
217
- return resolve(-1);
210
+ return reject(new Error('Can not open object store'));
218
211
  }
219
- const index = objectStore.index(UtilsCache.itemIndexByKey);
220
- const getIndexKeyRequest = index.get(key);
221
- getIndexKeyRequest.onsuccess = async () => {
222
- const item = getIndexKeyRequest.result;
223
- if (item) {
224
- await UtilsCache.ClearAsync(key, true);
225
- objectStore = await UtilsCache.getObjectStore();
226
- }
227
- if (!objectStore) {
228
- return resolve(-1);
229
- }
230
- const request = objectStore.add(data);
231
- request.onsuccess = () => {
232
- resolve(request.result);
233
- };
234
- request.onerror = () => {
235
- console.log(request.error);
236
- return resolve(-1);
237
- };
212
+ const request = objectStore?.put(data);
213
+ request.onsuccess = () => {
214
+ resolve(request.result);
238
215
  };
239
- getIndexKeyRequest.onerror = (event) => {
240
- console.error('Error fetching item by name:', event.target.error);
241
- reject(event.target.error);
216
+ request.onerror = () => {
217
+ reject(request.error);
242
218
  };
243
219
  }
244
220
  catch (error) {
245
- console.log(error);
246
- resolve({});
221
+ reject(error);
247
222
  }
248
223
  });
249
224
  }
250
225
  static Set(key, value, expireTimeBySecond = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT) {
251
- if (value === undefined || value === null || value === '') {
252
- return;
253
- }
254
226
  const currentMillisecond = expireTimeBySecond === UtilsCache.CACHE_EXPIRE_NONE ? UtilsCache.CACHE_EXPIRE_NONE : (new Date().valueOf() / 1000) + expireTimeBySecond;
255
227
  const data = {
256
228
  value: value,
@@ -258,35 +230,25 @@ export class UtilsCache {
258
230
  };
259
231
  try {
260
232
  this.LocalStorage.setItem(key, encrypt(JSON.stringify(data)));
233
+ return true;
261
234
  }
262
235
  catch (error) {
263
236
  console.log(error);
237
+ return false;
264
238
  }
265
239
  }
266
240
  static async ClearAsync(key, isMD5 = false) {
267
241
  return new Promise(async (resolve) => {
268
242
  const objectStore = await UtilsCache.getObjectStore();
269
243
  if (!objectStore) {
270
- return resolve({});
244
+ return resolve();
271
245
  }
272
- const index = objectStore.index(UtilsCache.itemIndexByKey);
273
- const getRequest = index.get(isMD5 ? key : md5(key));
274
- getRequest.onsuccess = () => {
275
- const result = getRequest.result;
276
- if (result) {
277
- const deleteRequest = objectStore.delete(result.id); // Xóa theo id của item tìm được
278
- deleteRequest.onsuccess = () => {
279
- resolve({});
280
- };
281
- deleteRequest.onerror = () => {
282
- resolve({});
283
- };
284
- return;
285
- }
286
- resolve({});
246
+ const request = objectStore.delete(isMD5 ? key : md5(key));
247
+ request.onsuccess = () => {
248
+ resolve();
287
249
  };
288
- getRequest.onerror = () => {
289
- resolve({});
250
+ request.onerror = () => {
251
+ resolve();
290
252
  };
291
253
  });
292
254
  }
@@ -297,22 +259,32 @@ export class UtilsCache {
297
259
  this.LocalStorage.removeItem(key);
298
260
  }
299
261
  static ClearAllAsync() {
300
- return new Promise((resolve, reject) => {
301
- const request = indexedDB.deleteDatabase(this.dbName);
262
+ return new Promise(async (resolve, reject) => {
263
+ const objectStore = await UtilsCache.getObjectStore();
264
+ if (!objectStore) {
265
+ return resolve();
266
+ }
267
+ const request = objectStore.clear();
302
268
  request.onsuccess = () => {
303
269
  console.log('Database deleted successfully');
304
- resolve(true);
270
+ resolve();
305
271
  };
306
272
  request.onerror = (event) => {
307
273
  console.error('Error deleting database:', event.target.error);
308
274
  reject(event.target.error);
309
275
  };
310
- request.onblocked = () => {
311
- console.warn('Delete request is blocked');
312
- };
313
276
  });
314
277
  }
315
278
  static ClearAll() {
279
+ if (isEmbedFrame()) {
280
+ const data = {
281
+ type: UtilsCache.typeKeyClearLocalStorage,
282
+ response: {
283
+ idEvent: this.idService
284
+ }
285
+ };
286
+ UtilsCommunicateMicro.PostMessageToParent(data);
287
+ }
316
288
  const keys = [...UtilsCache.listKeyKeepWhenClearALll];
317
289
  Object.keys(this.LocalStorage).forEach(key => {
318
290
  if (key.includes('kc-callback-')) {
@@ -322,13 +294,6 @@ export class UtilsCache {
322
294
  const stores = UtilsCache.GetDataByKeys(Array.from(keys));
323
295
  this.LocalStorage.clear();
324
296
  UtilsCache.SetDataByKey(stores);
325
- const data = {
326
- type: UtilsCache.typeKeyClearLocalStorage,
327
- response: {
328
- idEvent: this.idService
329
- }
330
- };
331
- UtilsCommunicateMicro.PostMessageToParent(data);
332
297
  }
333
298
  static GetDataByKeys(keys) {
334
299
  const stores = new Map();
@@ -359,9 +324,8 @@ export class UtilsCache {
359
324
  if (!objectStore) {
360
325
  return resolve({});
361
326
  }
362
- const index = objectStore.index(UtilsCache.itemIndexByKey);
363
327
  // Lấy tất cả các keys từ index
364
- const request = index.getAll();
328
+ const request = objectStore.getAll();
365
329
  keyCacheStartWith = isKeyMD5 ? keyCacheStartWith : md5(keyCacheStartWith);
366
330
  request.onsuccess = (e) => {
367
331
  const data = e.target.result;
@@ -369,8 +333,8 @@ export class UtilsCache {
369
333
  return resolve({});
370
334
  }
371
335
  data.forEach(obj => {
372
- if (obj.key.startsWith(keyCacheStartWith)) {
373
- UtilsCache.ClearAsync(obj.key, true);
336
+ if (obj[UtilsCache.itemIndexByKey].startsWith(keyCacheStartWith)) {
337
+ UtilsCache.ClearAsync(obj[UtilsCache.itemIndexByKey], true);
374
338
  }
375
339
  });
376
340
  return resolve({});
@@ -392,5 +356,21 @@ export class UtilsCache {
392
356
  }
393
357
  });
394
358
  }
359
+ static DeleteDatabaseIndexDB(dbName) {
360
+ return new Promise((resolve, reject) => {
361
+ const request = indexedDB.deleteDatabase(dbName);
362
+ request.onsuccess = () => {
363
+ console.log('Database deleted successfully');
364
+ resolve(true);
365
+ };
366
+ request.onerror = (event) => {
367
+ console.error('Error deleting database:', event.target.error);
368
+ reject(event.target.error);
369
+ };
370
+ request.onblocked = () => {
371
+ console.warn('Delete request is blocked');
372
+ };
373
+ });
374
+ }
395
375
  }
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsdURBQXVEO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsTUFBTSxPQUFPLFVBQVU7SUFDYixNQUFNLENBQUMsd0JBQXdCLEdBQUcsbUNBQW1DLENBQUM7SUFDdEUsTUFBTSxDQUFDLHdCQUF3QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztJQUNuRCxNQUFNLENBQUMsVUFBVSxDQUFXO0lBQzVCLE1BQU0sQ0FBVSx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBUyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRSxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQTZCO0lBQzND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SUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFV0aWxzQ29tbXVuaWNhdGVNaWNybyB9IGZyb20gJy4vY29tbXVuaWNhdGUtbWljcm8nO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCwgbWQ1IH0gZnJvbSAnLi9jcnlwdG8nO1xuaW1wb3J0IHsgZ2V0UGxhdEZyb21Ccm93c2VyIH0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgVXRpbHNMYW5ndWFnZUNvbnN0YW50cyB9IGZyb20gJy4vbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4vdXVpZCc7XG5cbmV4cG9ydCBjbGFzcyBVdGlsc0NhY2hlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgdHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gJ0xJQlNfVUlfQ0xFQVJfTE9DQUxfU1RPUkFHRV9FVkVOVCc7XG4gIHByaXZhdGUgc3RhdGljIGxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbCA9IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgbGFuZ3VhZ2VLZXlDYWNoZSA9ICdTUjN4UUt4SGdmZmlDZXZQUVJyYWxnJztcbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGRFdmVudD86IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQgPSA1ICogNjA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0VYUElSRV9OT05FID0gLTE7XG4gIHByaXZhdGUgc3RhdGljIGxhbmd1YWdlID0gc2lnbmFsPHN0cmluZz4oVXRpbHNMYW5ndWFnZUNvbnN0YW50cy5kZWZhdWx0TGFuZyk7XG4gIHByaXZhdGUgc3RhdGljIGlkU2VydmljZSA9IHV1aWQoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgc3RvcmFnZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG4gIHByaXZhdGUgc3RhdGljIGRiTmFtZSA9ICdsaWJzLXVpLWNhY2hlJztcbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbUluZGV4QnlLZXkgPSAna2V5JztcbiAgcHJpdmF0ZSBzdGF0aWMgZGJWZXJzaW9uID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHN0YXRpYyBpbml0KGNvbmZpZzogeyBpbmRleGVkREJOYW1lPzogc3RyaW5nLCBsYW5ndWFnZUtleUNhY2hlPzogc3RyaW5nLCB0eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2U/OiBzdHJpbmcsIGxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbD86IEFycmF5PHN0cmluZz4gfSkge1xuICAgIGlmIChVdGlsc0NhY2hlLmluaXRkRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgVXRpbHNDYWNoZS5pbml0ZEV2ZW50ID0gdHJ1ZTtcbiAgICBpZiAoY29uZmlnLmluZGV4ZWREQk5hbWUpIHtcbiAgICAgIFV0aWxzQ2FjaGUuZGJOYW1lID0gY29uZmlnLmluZGV4ZWREQk5hbWU7XG4gICAgfVxuICAgIGlmIChjb25maWcudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlKSB7XG4gICAgICBVdGlsc0NhY2hlLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZSA9IGNvbmZpZy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2U7XG4gICAgfVxuICAgIGlmIChjb25maWcubGlzdEtleUtlZXBXaGVuQ2xlYXJBTGxsKSB7XG4gICAgICBVdGlsc0NhY2hlLmxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbCA9IGNvbmZpZy5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGw7XG4gICAgfVxuICAgIGlmIChjb25maWcubGFuZ3VhZ2VLZXlDYWNoZSkge1xuICAgICAgVXRpbHNDYWNoZS5sYW5ndWFnZUtleUNhY2hlID0gY29uZmlnLmxhbmd1YWdlS2V5Q2FjaGU7XG4gICAgfVxuICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5HZXRNZXNzYWdlKFV0aWxzQ2FjaGUudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlKS5waXBlKGZpbHRlcihlID0+IGUuZGF0YS5yZXNwb25zZSAhPT0gVXRpbHNDYWNoZS5pZFNlcnZpY2UpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgVXRpbHNDYWNoZS5DbGVhckFsbCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXRMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIGlmIChsYW5nICE9PSBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzLlZJICYmIGxhbmcgIT09IFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMuRU4pIHtcbiAgICAgIHRocm93IEVycm9yKCdMYW5ndWFnZSBzdXBwb3J0IHZpIHwgZW4nKTtcbiAgICB9XG4gICAgVXRpbHNDYWNoZS5sYW5ndWFnZS5zZXQobGFuZyk7XG4gICAgVXRpbHNDYWNoZS5TZXQoVXRpbHNDYWNoZS5sYW5ndWFnZUtleUNhY2hlLCBsYW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZygpIHtcbiAgICByZXR1cm4gVXRpbHNDYWNoZS5sYW5ndWFnZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb3BlbkRCKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihVdGlsc0NhY2hlLmRiTmFtZSwgVXRpbHNDYWNoZS5kYlZlcnNpb24pO1xuXG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudDogSURCVmVyc2lvbkNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRiID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG5cbiAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFV0aWxzQ2FjaGUuZGJOYW1lKSkge1xuICAgICAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gZGIuY3JlYXRlT2JqZWN0U3RvcmUoVXRpbHNDYWNoZS5kYk5hbWUsIHsga2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDogdHJ1ZSB9KTtcblxuICAgICAgICAgIG9iamVjdFN0b3JlLmNyZWF0ZUluZGV4KFV0aWxzQ2FjaGUuaXRlbUluZGV4QnlLZXksIFV0aWxzQ2FjaGUuaXRlbUluZGV4QnlLZXksIHsgdW5pcXVlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgVXRpbHNDYWNoZS5kYiA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBVdGlsc0NhY2hlLkRlbGV0ZUtleVN0YXJ0V2l0aEFzeW5jKCcnKTtcbiAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb3BlbmluZyBJbmRleGVkREI6JywgZXZlbnQpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRPYmplY3RTdG9yZSgpIHtcbiAgICBpZiAoIVV0aWxzQ2FjaGUuZGIpIHtcbiAgICAgIGF3YWl0IFV0aWxzQ2FjaGUub3BlbkRCKCk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gVXRpbHNDYWNoZS5kYj8udHJhbnNhY3Rpb24oW1V0aWxzQ2FjaGUuZGJOYW1lXSwgJ3JlYWR3cml0ZScpO1xuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uPy5vYmplY3RTdG9yZShVdGlsc0NhY2hlLmRiTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQgTG9jYWxTdG9yYWdlKCk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgT1MgPSBnZXRQbGF0RnJvbUJyb3dzZXIoKTtcblxuICAgICAgICBpZiAoT1MuaW5jbHVkZXMoJ1NhZmFyaScpICYmIHBhcnNlRmxvYXQoT1Muc3BsaXQoJyAnKS5wb3AoKSB8fCAnMCcpID49IDE2KSB7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlT25TYWZhcmkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldExvY2FsU3RvcmFnZUZha2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxTdG9yYWdlRmFrZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2VPblNhZmFyaSgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnICYmICFVdGlsc0NhY2hlLnN0b3JhZ2UgJiYgT2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHsgLi4ubG9jYWxTdG9yYWdlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zdG9yYWdlIHx8IGlzTmlsKHRoaXMuc3RvcmFnZVtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB0aGlzLnN0b3JhZ2Vba2V5XSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2UoKSB7XG4gICAgaWYgKCFVdGlsc0NhY2hlLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBHZXRBc3luYyhrZXk6IHN0cmluZywgZGVmYXVsdF92YWx1ZT86IGFueSwgaXNLZXlNRDUgPSBmYWxzZSkge1xuICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IFV0aWxzQ2FjaGUuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuXG4gICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChVdGlsc0NhY2hlLml0ZW1JbmRleEJ5S2V5KTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleC5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KHJlcXVlc3QucmVzdWx0LnZhbHVlKSk7XG5cbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YS5qc29uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSAobmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwKTtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcblxuICAgICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YS5qc29uKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgR2V0KGtleTogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlPzogYW55KSB7IC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgdGjhu4MgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBpZiAoIWtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgaWYgKCFjYWNoZWREYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KGNhY2hlZERhdGEpKTtcblxuICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE1pbGxpc2Vjb25kID0gKG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMCk7XG5cbiAgICAgIGlmIChkYXRhLmV4cGlyZSA8IGN1cnJlbnRNaWxsaXNlY29uZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcblxuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIEdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5OiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlO1xuXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIFNldEFzeW5jKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBleHBpcmVUaW1lQnlTZWNvbmQgPSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQsIGlzS2V5TUQ1ID0gZmFsc2UpIHsgLy8gc3VwcG9ydCBpbmplY3QgVXRpbHNDYWNoZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgb2JqZWN0U3RvcmUgPSBhd2FpdCBVdGlsc0NhY2hlLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IFV0aWxzQ2FjaGUuQ0FDSEVfRVhQSVJFX05PTkUgPyBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FIDogKG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMCkgKyBleHBpcmVUaW1lQnlTZWNvbmQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IGVuY3J5cHQoSlNPTi5zdHJpbmdpZnkoeyBqc29uOiB2YWx1ZSwgZXhwaXJlOiBjdXJyZW50TWlsbGlzZWNvbmQgfSkpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChVdGlsc0NhY2hlLml0ZW1JbmRleEJ5S2V5KTtcbiAgICAgICAgY29uc3QgZ2V0SW5kZXhLZXlSZXF1ZXN0ID0gaW5kZXguZ2V0KGtleSk7XG5cbiAgICAgICAgZ2V0SW5kZXhLZXlSZXF1ZXN0Lm9uc3VjY2VzcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gZ2V0SW5kZXhLZXlSZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBhd2FpdCBVdGlsc0NhY2hlLkNsZWFyQXN5bmMoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIG9iamVjdFN0b3JlID0gYXdhaXQgVXRpbHNDYWNoZS5nZXRPYmplY3RTdG9yZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmFkZChkYXRhKTtcblxuICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcXVlc3QuZXJyb3IpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgtMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRJbmRleEtleVJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBpdGVtIGJ5IG5hbWU6JywgKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvcik7XG4gICAgICAgICAgcmVqZWN0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgc3RhdGljIFNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZXhwaXJlVGltZUJ5U2Vjb25kID0gVXRpbHNDYWNoZS5DQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxUKSB7IC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudE1pbGxpc2Vjb25kID0gZXhwaXJlVGltZUJ5U2Vjb25kID09PSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FID8gVXRpbHNDYWNoZS5DQUNIRV9FWFBJUkVfTk9ORSA6IChuZXcgRGF0ZSgpLnZhbHVlT2YoKSAvIDEwMDApICsgZXhwaXJlVGltZUJ5U2Vjb25kO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBleHBpcmU6IGN1cnJlbnRNaWxsaXNlY29uZFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIGVuY3J5cHQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgQ2xlYXJBc3luYyhrZXk6IHN0cmluZywgaXNNRDUgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCBVdGlsc0NhY2hlLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChVdGlsc0NhY2hlLml0ZW1JbmRleEJ5S2V5KTtcblxuICAgICAgY29uc3QgZ2V0UmVxdWVzdCA9IGluZGV4LmdldChpc01ENSA/IGtleSA6IG1kNShrZXkpKTtcblxuICAgICAgZ2V0UmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldFJlcXVlc3QucmVzdWx0O1xuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVSZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZGVsZXRlKHJlc3VsdC5pZCk7IC8vIFjDs2EgdGhlbyBpZCBj4bunYSBpdGVtIHTDrG0gxJHGsOG7o2NcblxuICAgICAgICAgIGRlbGV0ZVJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBkZWxldGVSZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgfTtcblxuICAgICAgZ2V0UmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgQ2xlYXIoa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENsZWFyQWxsQXN5bmMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UodGhpcy5kYk5hbWUpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0RhdGFiYXNlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIGRhdGFiYXNlOicsIChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IpO1xuICAgICAgICByZWplY3QoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvcik7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uYmxvY2tlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdEZWxldGUgcmVxdWVzdCBpcyBibG9ja2VkJyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIENsZWFyQWxsKCkge1xuICAgIGNvbnN0IGtleXMgPSBbLi4uVXRpbHNDYWNoZS5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGxdO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuTG9jYWxTdG9yYWdlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0b3JlcyA9IFV0aWxzQ2FjaGUuR2V0RGF0YUJ5S2V5cyhBcnJheS5mcm9tKGtleXMpKTtcblxuICAgIHRoaXMuTG9jYWxTdG9yYWdlLmNsZWFyKCk7XG5cbiAgICBVdGlsc0NhY2hlLlNldERhdGFCeUtleShzdG9yZXMpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB0eXBlOiBVdGlsc0NhY2hlLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZSxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIGlkRXZlbnQ6IHRoaXMuaWRTZXJ2aWNlXG4gICAgICB9XG4gICAgfTtcblxuICAgIFV0aWxzQ29tbXVuaWNhdGVNaWNyby5Qb3N0TWVzc2FnZVRvUGFyZW50KGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgR2V0RGF0YUJ5S2V5cyhrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgY29uc3Qgc3RvcmVzID0gbmV3IE1hcCgpO1xuXG4gICAga2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgICAgc3RvcmVzLnNldChrZXksIHRoaXMuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3RvcmVzLnNldChrZXksIFV0aWxzQ2FjaGUuR2V0KGtleSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0b3JlcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIFNldERhdGFCeUtleShzdG9yZXM6IE1hcDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdG9yZXMuZm9yRWFjaCgodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICAgIHRoaXMuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gVXRpbHNDYWNoZS5sYW5ndWFnZUtleUNhY2hlKSB7XG4gICAgICAgIHJldHVybiBVdGlsc0NhY2hlLnNldExhbmcodmFsdWUpO1xuICAgICAgfVxuICAgICAgVXRpbHNDYWNoZS5TZXQoa2V5LCB2YWx1ZSwgVXRpbHNDYWNoZS5DQUNIRV9FWFBJUkVfTk9ORSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIERlbGV0ZUtleVN0YXJ0V2l0aEFzeW5jKGtleUNhY2hlU3RhcnRXaXRoOiBzdHJpbmcsIGlzS2V5TUQ1ID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgVXRpbHNDYWNoZS5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gb2JqZWN0U3RvcmUuaW5kZXgoVXRpbHNDYWNoZS5pdGVtSW5kZXhCeUtleSk7XG5cbiAgICAgIC8vIEzhuqV5IHThuqV0IGPhuqMgY8OhYyBrZXlzIHThu6sgaW5kZXhcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleC5nZXRBbGwoKTtcblxuICAgICAga2V5Q2FjaGVTdGFydFdpdGggPSBpc0tleU1ENSA/IGtleUNhY2hlU3RhcnRXaXRoIDogbWQ1KGtleUNhY2hlU3RhcnRXaXRoKTtcblxuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGUudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxhbnk+O1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuZm9yRWFjaChvYmogPT4ge1xuICAgICAgICAgIGlmIChvYmoua2V5LnN0YXJ0c1dpdGgoa2V5Q2FjaGVTdGFydFdpdGgpKSB7XG4gICAgICAgICAgICBVdGlsc0NhY2hlLkNsZWFyQXN5bmMob2JqLmtleSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIERlbGV0ZUtleVN0YXJ0V2l0aChrZXlDYWNoZTogc3RyaW5nLCBpc01ENSA9IGZhbHNlKSB7XG4gICAga2V5Q2FjaGUgPSBpc01ENSA/IG1kNShrZXlDYWNoZSkgOiBrZXlDYWNoZTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoVXRpbHNDYWNoZS5Mb2NhbFN0b3JhZ2UpO1xuXG4gICAgaWYgKCFrZXlzIHx8ICFrZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGtleUNhY2hlKSkge1xuICAgICAgICB0aGlzLkNsZWFyKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsdURBQXVEO0FBRXZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsTUFBTSxPQUFPLFVBQVU7SUFDZCxNQUFNLENBQVUseUJBQXlCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuRCxNQUFNLENBQVUsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxNQUFNLENBQUMsd0JBQXdCLEdBQUcsbUNBQW1DLENBQUM7SUFFckUsTUFBTSxDQUFDLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO0lBQ25ELE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUNsRCxNQUFNLENBQUMsVUFBVSxDQUFXO0lBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQTZCO0lBQzNDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFD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S0FBSyxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDO1lBRUYsT0FBTyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IFV0aWxzQ29tbXVuaWNhdGVNaWNybyB9IGZyb20gJy4vY29tbXVuaWNhdGUtbWljcm8nO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCwgbWQ1IH0gZnJvbSAnLi9jcnlwdG8nO1xuaW1wb3J0IHsgZ2V0UGxhdEZyb21Ccm93c2VyIH0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHsgaXNFbWJlZEZyYW1lIH0gZnJvbSAnLi9mdW5jdGlvbi1jaGVjay1lbWJlZC1mcmFtZSc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzIH0gZnJvbSAnLi9sYW5ndWFnZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi91dWlkJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzQ2FjaGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQgPSA1ICogNjA7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0FDSEVfRVhQSVJFX05PTkUgPSAtMTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZFNlcnZpY2UgPSB1dWlkKCk7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gJ0xJQlNfVUlfQ0xFQVJfTE9DQUxfU1RPUkFHRV9FVkVOVCc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbGFuZ3VhZ2VLZXlDYWNoZSA9ICdTUjN4UUt4SGdmZmlDZXZQUVJyYWxnJztcbiAgcHJpdmF0ZSBzdGF0aWMgbGlzdEtleUtlZXBXaGVuQ2xlYXJBTGxsID0gQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIHN0YXRpYyBpbml0ZEV2ZW50PzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzdGF0aWMgc3RvcmFnZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG4gIHByaXZhdGUgc3RhdGljIGRiTmFtZSA9ICdsaWJzLXVpLWNhY2hlJztcbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbUluZGV4QnlLZXkgPSAna2V5JztcbiAgcHJpdmF0ZSBzdGF0aWMgZGJWZXJzaW9uID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHN0YXRpYyBpbml0KGNvbmZpZzogeyBpbmRleGVkREJOYW1lPzogc3RyaW5nLCBsYW5ndWFnZUtleUNhY2hlPzogc3RyaW5nLCB0eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2U/OiBzdHJpbmcsIGxpc3RLZXlLZWVwV2hlbkNsZWFyQWxsPzogQXJyYXk8c3RyaW5nPiB9KSB7XG4gICAgaWYgKFV0aWxzQ2FjaGUuaW5pdGRFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBVdGlsc0NhY2hlLmluaXRkRXZlbnQgPSB0cnVlO1xuICAgIGlmIChjb25maWcuaW5kZXhlZERCTmFtZSkge1xuICAgICAgVXRpbHNDYWNoZS5kYk5hbWUgPSBjb25maWcuaW5kZXhlZERCTmFtZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIFV0aWxzQ2FjaGUudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gY29uZmlnLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5saXN0S2V5S2VlcFdoZW5DbGVhckFsbCkge1xuICAgICAgVXRpbHNDYWNoZS5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGwgPSBjb25maWcubGlzdEtleUtlZXBXaGVuQ2xlYXJBbGw7XG4gICAgfVxuICAgIGlmIChjb25maWcubGFuZ3VhZ2VLZXlDYWNoZSkge1xuICAgICAgVXRpbHNDYWNoZS5sYW5ndWFnZUtleUNhY2hlID0gY29uZmlnLmxhbmd1YWdlS2V5Q2FjaGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXRMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIGlmIChsYW5nICE9PSBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzLlZJICYmIGxhbmcgIT09IFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMuRU4pIHtcbiAgICAgIHRocm93IEVycm9yKCdMYW5ndWFnZSBzdXBwb3J0IHZpIHwgZW4nKTtcbiAgICB9XG4gICAgVXRpbHNDYWNoZS5TZXQoVXRpbHNDYWNoZS5sYW5ndWFnZUtleUNhY2hlLCBsYW5nLCBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZygpOiAndmknIHwgJ2VuJyB7XG4gICAgcmV0dXJuIFV0aWxzQ2FjaGUuR2V0KFV0aWxzQ2FjaGUubGFuZ3VhZ2VLZXlDYWNoZSwgVXRpbHNMYW5ndWFnZUNvbnN0YW50cy5kZWZhdWx0TGFuZyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvcGVuREIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKFV0aWxzQ2FjaGUuZGJOYW1lLCBVdGlsc0NhY2hlLmRiVmVyc2lvbik7XG5cbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50OiBJREJWZXJzaW9uQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcblxuICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoVXRpbHNDYWNoZS5kYk5hbWUpKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShVdGlsc0NhY2hlLmRiTmFtZSwgeyBrZXlQYXRoOiBVdGlsc0NhY2hlLml0ZW1JbmRleEJ5S2V5LCBhdXRvSW5jcmVtZW50OiB0cnVlIH0pO1xuXG4gICAgICAgICAgb2JqZWN0U3RvcmUuY3JlYXRlSW5kZXgoVXRpbHNDYWNoZS5pdGVtSW5kZXhCeUtleSwgVXRpbHNDYWNoZS5pdGVtSW5kZXhCeUtleSwgeyB1bmlxdWU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBVdGlsc0NhY2hlLmRiID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb3BlbmluZyBJbmRleGVkREI6JywgZXZlbnQpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRPYmplY3RTdG9yZSgpIHtcbiAgICBpZiAoIVV0aWxzQ2FjaGUuZGIpIHtcbiAgICAgIGF3YWl0IFV0aWxzQ2FjaGUub3BlbkRCKCk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gVXRpbHNDYWNoZS5kYj8udHJhbnNhY3Rpb24oW1V0aWxzQ2FjaGUuZGJOYW1lXSwgJ3JlYWR3cml0ZScpO1xuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShVdGlsc0NhY2hlLmRiTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXQgTG9jYWxTdG9yYWdlKCk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgT1MgPSBnZXRQbGF0RnJvbUJyb3dzZXIoKTtcblxuICAgICAgICBpZiAoT1MuaW5jbHVkZXMoJ1NhZmFyaScpICYmIHBhcnNlRmxvYXQoT1Muc3BsaXQoJyAnKS5wb3AoKSB8fCAnMCcpID49IDE2KSB7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlT25TYWZhcmkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldExvY2FsU3RvcmFnZUZha2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxTdG9yYWdlRmFrZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2VPblNhZmFyaSgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnICYmICFVdGlsc0NhY2hlLnN0b3JhZ2UgJiYgT2JqZWN0LmtleXMobG9jYWxTdG9yYWdlKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHsgLi4ubG9jYWxTdG9yYWdlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zdG9yYWdlIHx8IGlzTmlsKHRoaXMuc3RvcmFnZVtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB0aGlzLnN0b3JhZ2Vba2V5XSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2UoKSB7XG4gICAgaWYgKCFVdGlsc0NhY2hlLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBHZXRBc3luYzxUID0gYW55PihrZXk6IHN0cmluZywgZGVmYXVsdF92YWx1ZT86IGFueSwgaXNLZXlNRDUgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCBVdGlsc0NhY2hlLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KHJlcXVlc3QucmVzdWx0LnZhbHVlKSk7XG5cbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YS5qc29uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSAobmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwKTtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcblxuICAgICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YS5qc29uKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgR2V0PFQgPSBhbnk+KGtleTogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlPzogYW55KTogVCB7IC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgdGjhu4MgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBpZiAoIWtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgaWYgKCFjYWNoZWREYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KGNhY2hlZERhdGEpKTtcblxuICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlID8/IGRlZmF1bHRfdmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSAobmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwKTtcblxuICAgICAgaWYgKGRhdGEuZXhwaXJlIDwgY3VycmVudE1pbGxpc2Vjb25kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5LCBkZWZhdWx0X3ZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuXG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleTogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcblxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBTZXRBc3luYzxUID0gYW55PihrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZXhwaXJlVGltZUJ5U2Vjb25kID0gVXRpbHNDYWNoZS5DQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxULCBpc0tleU1ENSA9IGZhbHNlKTogUHJvbWlzZTxUPiB7IC8vIHN1cHBvcnQgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCBVdGlsc0NhY2hlLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IFV0aWxzQ2FjaGUuQ0FDSEVfRVhQSVJFX05PTkUgPyBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FIDogKG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMCkgKyBleHBpcmVUaW1lQnlTZWNvbmQ7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgICB2YWx1ZTogZW5jcnlwdChKU09OLnN0cmluZ2lmeSh7IGpzb246IHZhbHVlLCBleHBpcmU6IGN1cnJlbnRNaWxsaXNlY29uZCB9KSksXG4gICAgICAgIH07XG4gICAgICAgIGRhdGFbVXRpbHNDYWNoZS5pdGVtSW5kZXhCeUtleV0gPSBrZXk7XG5cbiAgICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDYW4gbm90IG9wZW4gb2JqZWN0IHN0b3JlJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZT8ucHV0KGRhdGEpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzdWx0IGFzIGFueSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgc3RhdGljIFNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgZXhwaXJlVGltZUJ5U2Vjb25kID0gVXRpbHNDYWNoZS5DQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxUKTogYm9vbGVhbiB7IC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IFV0aWxzQ2FjaGUuQ0FDSEVfRVhQSVJFX05PTkUgPyBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FIDogKG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMCkgKyBleHBpcmVUaW1lQnlTZWNvbmQ7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGV4cGlyZTogY3VycmVudE1pbGxpc2Vjb25kXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLkxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgZW5jcnlwdChKU09OLnN0cmluZ2lmeShkYXRhKSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIENsZWFyQXN5bmMoa2V5OiBzdHJpbmcsIGlzTUQ1ID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgVXRpbHNDYWNoZS5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZGVsZXRlKGlzTUQ1ID8ga2V5IDogbWQ1KGtleSkpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgc3RhdGljIENsZWFyKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDbGVhckFsbEFzeW5jKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IFV0aWxzQ2FjaGUuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmUuY2xlYXIoKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRGF0YWJhc2UgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyBkYXRhYmFzZTonLCAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yKTtcbiAgICAgICAgcmVqZWN0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBDbGVhckFsbCgpIHtcbiAgICBpZiAoaXNFbWJlZEZyYW1lKCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIHR5cGU6IFV0aWxzQ2FjaGUudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGlkRXZlbnQ6IHRoaXMuaWRTZXJ2aWNlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBVdGlsc0NvbW11bmljYXRlTWljcm8uUG9zdE1lc3NhZ2VUb1BhcmVudChkYXRhKTtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IFsuLi5VdGlsc0NhY2hlLmxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbF07XG4gICAgT2JqZWN0LmtleXModGhpcy5Mb2NhbFN0b3JhZ2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVzID0gVXRpbHNDYWNoZS5HZXREYXRhQnlLZXlzKEFycmF5LmZyb20oa2V5cykpO1xuXG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcblxuICAgIFV0aWxzQ2FjaGUuU2V0RGF0YUJ5S2V5KHN0b3Jlcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBHZXREYXRhQnlLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBjb25zdCBzdG9yZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgICBzdG9yZXMuc2V0KGtleSwgdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdG9yZXMuc2V0KGtleSwgVXRpbHNDYWNoZS5HZXQoa2V5KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgU2V0RGF0YUJ5S2V5KHN0b3JlczogTWFwPHN0cmluZywgYW55Pikge1xuICAgIHN0b3Jlcy5mb3JFYWNoKCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgICAgdGhpcy5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBVdGlsc0NhY2hlLmxhbmd1YWdlS2V5Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIFV0aWxzQ2FjaGUuc2V0TGFuZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBVdGlsc0NhY2hlLlNldChrZXksIHZhbHVlLCBVdGlsc0NhY2hlLkNBQ0hFX0VYUElSRV9OT05FKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRGVsZXRlS2V5U3RhcnRXaXRoQXN5bmMoa2V5Q2FjaGVTdGFydFdpdGg6IHN0cmluZywgaXNLZXlNRDUgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCBVdGlsc0NhY2hlLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfVxuXG4gICAgICAvLyBM4bqleSB04bqldCBj4bqjIGPDoWMga2V5cyB04burIGluZGV4XG4gICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG5cbiAgICAgIGtleUNhY2hlU3RhcnRXaXRoID0gaXNLZXlNRDUgPyBrZXlDYWNoZVN0YXJ0V2l0aCA6IG1kNShrZXlDYWNoZVN0YXJ0V2l0aCk7XG5cblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlLnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8YW55PjtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmZvckVhY2gob2JqID0+IHtcbiAgICAgICAgICBpZiAob2JqW1V0aWxzQ2FjaGUuaXRlbUluZGV4QnlLZXldLnN0YXJ0c1dpdGgoa2V5Q2FjaGVTdGFydFdpdGgpKSB7XG4gICAgICAgICAgICBVdGlsc0NhY2hlLkNsZWFyQXN5bmMob2JqW1V0aWxzQ2FjaGUuaXRlbUluZGV4QnlLZXldLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRGVsZXRlS2V5U3RhcnRXaXRoKGtleUNhY2hlOiBzdHJpbmcsIGlzTUQ1ID0gZmFsc2UpIHtcbiAgICBrZXlDYWNoZSA9IGlzTUQ1ID8gbWQ1KGtleUNhY2hlKSA6IGtleUNhY2hlO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhVdGlsc0NhY2hlLkxvY2FsU3RvcmFnZSk7XG5cbiAgICBpZiAoIWtleXMgfHwgIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5Q2FjaGUpKSB7XG4gICAgICAgIHRoaXMuQ2xlYXIoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRGVsZXRlRGF0YWJhc2VJbmRleERCKGRiTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEYXRhYmFzZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyBkYXRhYmFzZTonLCAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yKTtcbiAgICAgICAgcmVqZWN0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmJsb2NrZWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignRGVsZXRlIHJlcXVlc3QgaXMgYmxvY2tlZCcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19