@esfaenza/httpservice 11.2.30 → 11.2.34
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/bundles/esfaenza-httpservice.umd.js +184 -50
- package/bundles/esfaenza-httpservice.umd.js.map +1 -1
- package/bundles/esfaenza-httpservice.umd.min.js +2 -2
- package/bundles/esfaenza-httpservice.umd.min.js.map +1 -1
- package/esfaenza-httpservice.metadata.json +1 -1
- package/esm2015/lib/httpservice.service.js +143 -47
- package/esm2015/lib/httpservice.service.loc.js +7 -2
- package/esm2015/lib/models/CacheInfos.js +10 -0
- package/fesm2015/esfaenza-httpservice.js +156 -47
- package/fesm2015/esfaenza-httpservice.js.map +1 -1
- package/lib/httpservice.service.d.ts +49 -21
- package/lib/httpservice.service.loc.d.ts +20 -0
- package/lib/models/CacheInfos.d.ts +8 -0
- package/package.json +3 -2
|
@@ -2,14 +2,17 @@ import { __awaiter } from "tslib";
|
|
|
2
2
|
// Angular
|
|
3
3
|
import { HttpClient, HttpErrorResponse, HttpEventType, HttpHeaders } from "@angular/common/http";
|
|
4
4
|
import { Injectable, Inject, Optional } from "@angular/core";
|
|
5
|
+
// Es Faenza
|
|
6
|
+
import { PreferencesService } from "@esfaenza/preferences";
|
|
5
7
|
// Direttive, Componenti, Librerie
|
|
6
8
|
import { catchError, delay, finalize, map, scan } from "rxjs/operators";
|
|
7
|
-
import { Observable, of, throwError } from "rxjs";
|
|
9
|
+
import { forkJoin, Observable, of, throwError } from "rxjs";
|
|
8
10
|
// Chiamate ai Repository / tokens
|
|
9
11
|
import { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';
|
|
10
12
|
// Modelli
|
|
11
13
|
import { HttpServiceExtensions } from './config/HttpServiceExtensions';
|
|
12
14
|
import { Loc } from './httpservice.service.loc';
|
|
15
|
+
import { CacheInfos } from "./models/CacheInfos";
|
|
13
16
|
/**
|
|
14
17
|
* Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere
|
|
15
18
|
* esteso/modificato il comportamento implementando la classe di "hook" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**
|
|
@@ -18,7 +21,7 @@ export class HTTPService {
|
|
|
18
21
|
/**
|
|
19
22
|
* @ignore
|
|
20
23
|
*/
|
|
21
|
-
constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http) {
|
|
24
|
+
constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http, localStorage) {
|
|
22
25
|
var _a, _b;
|
|
23
26
|
this.BACKEND_URL = BACKEND_URL;
|
|
24
27
|
this.EXTENSION_CLASS = EXTENSION_CLASS;
|
|
@@ -29,34 +32,51 @@ export class HTTPService {
|
|
|
29
32
|
this.CACHE_BY_USER = CACHE_BY_USER;
|
|
30
33
|
this.DEBUG_MODE = DEBUG_MODE;
|
|
31
34
|
this.http = http;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*/
|
|
35
|
+
this.localStorage = localStorage;
|
|
36
|
+
/** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
|
|
35
37
|
this.callStatus = {};
|
|
36
|
-
/**
|
|
37
|
-
* Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary
|
|
38
|
-
*/
|
|
38
|
+
/** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */
|
|
39
39
|
this.localStorageHttpCacheKey = null;
|
|
40
|
-
/**
|
|
41
|
-
* Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching
|
|
42
|
-
*/
|
|
40
|
+
/** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary, solo per le chiamate con un tempo definito di caching */
|
|
43
41
|
this.localStorageHttpTimedCacheKey = null;
|
|
44
|
-
/**
|
|
45
|
-
* Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa
|
|
46
|
-
*/
|
|
42
|
+
/** Nome della cache in cui vengono storicizzate le informazioni sullo scadere della cache stessa */
|
|
47
43
|
this.localStorageHttpCacheExpireKey = null;
|
|
48
|
-
/**
|
|
49
|
-
* Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions**
|
|
50
|
-
*/
|
|
44
|
+
/** Identità collegata al token di autenticazione da usare, richiesta al programma che utilizza la libreria attraverso l'hook **retrieveIdentity** della **HttpServiceExtensions** */
|
|
51
45
|
this.me = null;
|
|
46
|
+
/** Indica che la cache a tempo dev'essere persistita il prima possibile */
|
|
47
|
+
this.PersistTimedCacheASAP = false;
|
|
48
|
+
/** Indica che la cache senza limiti di tempo dev'essere persistita il prima possibile */
|
|
49
|
+
this.PersistUntimedCacheASAP = false;
|
|
52
50
|
this.ExtensionsImpl = this.EXTENSION_CLASS || new HttpServiceExtensions();
|
|
53
51
|
this.me = this.ExtensionsImpl.retrieveIdentity();
|
|
54
52
|
this.localStorageHttpCacheKey = ((_a = this.APP_NAME) !== null && _a !== void 0 ? _a : "APP").replace(/\s/g, '_') + "_HttpCache";
|
|
55
53
|
this.localStorageHttpTimedCacheKey = ((_b = this.APP_NAME) !== null && _b !== void 0 ? _b : "APP").replace(/\s/g, '_') + "_HttpTimedCache";
|
|
56
54
|
this.localStorageHttpCacheExpireKey = this.localStorageHttpCacheKey + "_Expire";
|
|
55
|
+
this.adjustOldStorageSystem();
|
|
57
56
|
if (this.untimedCacheExpired())
|
|
58
57
|
this.resetHttpUntimedCacheStorage();
|
|
59
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Se vedo che ci sono elementi salvati nel localStorage provo a toglierli e a risalvarli via preference.
|
|
61
|
+
* Nel caso migliore li sposto dal localStorage al DB di preference, nel caso peggiore li tolgo e li risalvo nel localStorage
|
|
62
|
+
*/
|
|
63
|
+
adjustOldStorageSystem() {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
var lsTimed = localStorage.getItem(this.localStorageHttpTimedCacheKey);
|
|
66
|
+
var lsUntimed = localStorage.getItem(this.localStorageHttpCacheKey);
|
|
67
|
+
if (!lsTimed && !lsUntimed)
|
|
68
|
+
return;
|
|
69
|
+
localStorage.removeItem(this.localStorageHttpTimedCacheKey);
|
|
70
|
+
localStorage.removeItem(this.localStorageHttpCacheKey);
|
|
71
|
+
lsTimed = lsTimed ? JSON.parse(lsTimed) : {};
|
|
72
|
+
lsUntimed = lsUntimed ? JSON.parse(lsUntimed) : {};
|
|
73
|
+
yield forkJoin([
|
|
74
|
+
this.localStorage.store(this.localStorageHttpTimedCacheKey, lsTimed),
|
|
75
|
+
this.localStorage.store(this.localStorageHttpCacheKey, lsUntimed)
|
|
76
|
+
]).toPromise();
|
|
77
|
+
this.log(this.loc("Converted old storage system to new one"));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
60
80
|
/**
|
|
61
81
|
* Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
|
|
62
82
|
*
|
|
@@ -88,7 +108,7 @@ export class HTTPService {
|
|
|
88
108
|
if (errorCallback)
|
|
89
109
|
errorCallback();
|
|
90
110
|
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
91
|
-
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
111
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
|
|
92
112
|
}
|
|
93
113
|
/**
|
|
94
114
|
* Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
|
|
@@ -123,23 +143,66 @@ export class HTTPService {
|
|
|
123
143
|
if (errorCallback)
|
|
124
144
|
errorCallback();
|
|
125
145
|
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
126
|
-
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
146
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
|
|
127
147
|
}
|
|
128
148
|
/**
|
|
129
|
-
* Esecuzione di una POST HTTP
|
|
130
|
-
*
|
|
149
|
+
* Esecuzione di una POST HTTP
|
|
131
150
|
*
|
|
132
151
|
* @param {string} url URL su cui effettuare la chiamata
|
|
133
152
|
* @param {any} bodyData DTO per la chiamata
|
|
153
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
154
|
+
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
155
|
+
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
156
|
+
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
157
|
+
*
|
|
158
|
+
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
159
|
+
*/
|
|
160
|
+
post(url, bodyData, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
161
|
+
let myGuid = this.defaultStartCall(url);
|
|
162
|
+
var httpCall = this.http.post(url, bodyData, { headers: this.getHeaders(transaction), params: params });
|
|
163
|
+
return httpCall.pipe(map((res) => {
|
|
164
|
+
let responseItem = res;
|
|
165
|
+
return responseItem;
|
|
166
|
+
}), catchError((err, caught) => {
|
|
167
|
+
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
168
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Esecuzione di una DELETE HTTP
|
|
172
|
+
*
|
|
173
|
+
* @param {string} url URL su cui effettuare la chiamata
|
|
174
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
134
175
|
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
135
176
|
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
136
177
|
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
137
178
|
*
|
|
138
179
|
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
139
180
|
*/
|
|
140
|
-
|
|
181
|
+
delete(url, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
141
182
|
let myGuid = this.defaultStartCall(url);
|
|
142
|
-
var httpCall = this.http.
|
|
183
|
+
var httpCall = this.http.delete(url, { headers: this.getHeaders(transaction), params: params });
|
|
184
|
+
return httpCall.pipe(map((res) => {
|
|
185
|
+
let responseItem = res;
|
|
186
|
+
return responseItem;
|
|
187
|
+
}), catchError((err, caught) => {
|
|
188
|
+
return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
|
|
189
|
+
}), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Esecuzione di una PUT HTTP
|
|
193
|
+
*
|
|
194
|
+
* @param {string} url URL su cui effettuare la chiamata
|
|
195
|
+
* @param {any} bodyData DTO per la chiamata
|
|
196
|
+
* @param {HttpParams} params Parametri della chiamata
|
|
197
|
+
* @param {string} transaction Codice transazione collegato a questa chiamata. Viene inserito nell'Header "X-TX-ID" e lato Backend dovrà essere gestito di conseguenza
|
|
198
|
+
* @param {boolean} succesfulResultMandatory Indica che questa chiamata deve assolutamente andare bene. In caso contrario viene fisicamente fatto il throw che può essere
|
|
199
|
+
* raccolto da chi usa la libreria nella pipe "onError" dell'Observable restituito ed essere gestito in maniera non standard
|
|
200
|
+
*
|
|
201
|
+
* @returns {Observable<T>} Observable che contiene il risultato della chiamata
|
|
202
|
+
*/
|
|
203
|
+
put(url, bodyData, params = null, transaction = "", succesfulResultMandatory = true) {
|
|
204
|
+
let myGuid = this.defaultStartCall(url);
|
|
205
|
+
var httpCall = this.http.put(url, bodyData, { headers: this.getHeaders(transaction), params: params });
|
|
143
206
|
return httpCall.pipe(map((res) => {
|
|
144
207
|
let responseItem = res;
|
|
145
208
|
return responseItem;
|
|
@@ -295,7 +358,7 @@ export class HTTPService {
|
|
|
295
358
|
* @param {string} url URL per cui controllare se ci sono chiamate in cache da invalidare
|
|
296
359
|
*/
|
|
297
360
|
checkCacheInvalidation(url) {
|
|
298
|
-
let cache =
|
|
361
|
+
let cache = this.localStorage.retrieveLocal(this.localStorageHttpCacheKey);
|
|
299
362
|
let tmp = /#cache(:?-(\d+))/gi.exec(url);
|
|
300
363
|
let cacheTime = tmp ? tmp[2] : null;
|
|
301
364
|
let normalizedUrl = url.replace("#cache" + (cacheTime ? "-" + cacheTime : ""), "").replace(this.BACKEND_URL, "");
|
|
@@ -316,21 +379,53 @@ export class HTTPService {
|
|
|
316
379
|
this.log(this.loc("Invlalidating cache element") + " " + k);
|
|
317
380
|
delete cache[k];
|
|
318
381
|
}
|
|
319
|
-
localStorage.
|
|
382
|
+
this.localStorage.storeLocal(this.localStorageHttpCacheKey, cache);
|
|
320
383
|
}
|
|
321
384
|
/**
|
|
322
385
|
* Finalizzazione di una chiamata
|
|
323
386
|
*
|
|
324
387
|
* @param {string} guid GUID collegato alla chiamata appena terminata
|
|
388
|
+
* @param {boolean} persistCacheIfIdle Effettua il persist della cache HTTP solo se non ci sono altre chiamate in corso, per evitare
|
|
389
|
+
* che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni
|
|
325
390
|
*/
|
|
326
|
-
tryFinalizeByGuid(guid) {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
this.ExtensionsImpl.
|
|
332
|
-
|
|
333
|
-
|
|
391
|
+
tryFinalizeByGuid(guid, cacheInfos) {
|
|
392
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
393
|
+
this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (this.callStatus[guid] ? this.loc('Success') : this.loc('Failure')));
|
|
394
|
+
//Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
|
|
395
|
+
//e riiniziare a valutare errori di javashit
|
|
396
|
+
if (this.callStatus[guid] && this.ExtensionsImpl.readRedirectionStatus())
|
|
397
|
+
this.ExtensionsImpl.writeRedirectionStatus(false);
|
|
398
|
+
//In ogni caso questa posso rimuoverla
|
|
399
|
+
delete this.callStatus[guid];
|
|
400
|
+
// Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
|
|
401
|
+
if (cacheInfos && cacheInfos.cache) {
|
|
402
|
+
this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;
|
|
403
|
+
this.PersistUntimedCacheASAP = this.PersistTimedCacheASAP || !cacheInfos.cacheTime;
|
|
404
|
+
this.log(this.loc("Marking cache to be persisted as soon as possible"));
|
|
405
|
+
}
|
|
406
|
+
// Se una delle due cache devono essere aggiornate e non ho nessuna chiamata in corso effettuo l'aggiornamento in base a quale delle due va aggiornata
|
|
407
|
+
// Alla fine di tutto marco come fatto
|
|
408
|
+
if ((this.PersistTimedCacheASAP || this.PersistUntimedCacheASAP) && Object.keys(this.callStatus).length == 0) {
|
|
409
|
+
var toCall = [];
|
|
410
|
+
let tmpKey = "";
|
|
411
|
+
if (this.PersistTimedCacheASAP) {
|
|
412
|
+
tmpKey = this.localStorageHttpTimedCacheKey;
|
|
413
|
+
toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
|
|
414
|
+
}
|
|
415
|
+
if (this.PersistUntimedCacheASAP) {
|
|
416
|
+
tmpKey = this.localStorageHttpCacheKey;
|
|
417
|
+
toCall.push(this.localStorage.store(tmpKey, this.localStorage.retrieveLocal(tmpKey)));
|
|
418
|
+
}
|
|
419
|
+
this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches..."));
|
|
420
|
+
var ret = yield forkJoin(toCall).toPromise();
|
|
421
|
+
if (ret)
|
|
422
|
+
this.log(this.loc("Caches succesfully persisted"));
|
|
423
|
+
else
|
|
424
|
+
this.log(this.loc("Errors persisting modified caches"));
|
|
425
|
+
this.PersistTimedCacheASAP = false;
|
|
426
|
+
this.PersistUntimedCacheASAP = false;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
334
429
|
}
|
|
335
430
|
/**
|
|
336
431
|
* Helper che dato un unico File o una lista di File crea un oggetto FormData che può essere inviato comodamente
|
|
@@ -517,7 +612,7 @@ export class HTTPService {
|
|
|
517
612
|
* @param {string} url URL su cui effettuare la chiamata
|
|
518
613
|
* @param {HttpParams} params Parametri della chiamata (nulli in caso di POST)
|
|
519
614
|
*
|
|
520
|
-
* @returns {
|
|
615
|
+
* @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato
|
|
521
616
|
*/
|
|
522
617
|
tryGetCacheInformations(url, params) {
|
|
523
618
|
let cachingKey = null, cacheTime = null, cache = null, item = null;
|
|
@@ -530,8 +625,8 @@ export class HTTPService {
|
|
|
530
625
|
this.resetHttpUntimedCacheStorage();
|
|
531
626
|
cachingKey = this.makeCacheKey(url, params);
|
|
532
627
|
let cacheKey = cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
|
|
533
|
-
let cacheLs = localStorage.
|
|
534
|
-
let cache = cacheLs ?
|
|
628
|
+
let cacheLs = this.localStorage.retrieveLocal(cacheKey);
|
|
629
|
+
let cache = cacheLs ? cacheLs : {};
|
|
535
630
|
if (cache && cache[cachingKey] && !this.timedCacheItemExpired(cache[cachingKey])) {
|
|
536
631
|
// Se gestisco il tempo esatto della cache prima di restituire l'oggetto cachato lo ripulisco
|
|
537
632
|
// dalle proprietà interne che gli ho aggiunto per controllarne la scadenza
|
|
@@ -540,22 +635,22 @@ export class HTTPService {
|
|
|
540
635
|
item = cache[cachingKey];
|
|
541
636
|
}
|
|
542
637
|
}
|
|
543
|
-
return
|
|
638
|
+
return new CacheInfos(url, useCaching, cachingKey, cacheTime, item);
|
|
544
639
|
}
|
|
545
640
|
/**
|
|
546
641
|
* Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**
|
|
547
642
|
*
|
|
548
643
|
* @param {T} item Oggetto da inserire nella cache
|
|
549
|
-
* @param {
|
|
644
|
+
* @param {CacheInfos} cacheInfos Informazioni sulla cache recuperate da una chiamata precedente a **tryGetCacheInformations**
|
|
550
645
|
*/
|
|
551
646
|
cacheResponse(item, cacheInfos) {
|
|
552
647
|
let cacheKey = cacheInfos.cacheTime ? this.localStorageHttpTimedCacheKey : this.localStorageHttpCacheKey;
|
|
553
|
-
let cacheLs = localStorage.
|
|
554
|
-
let cache = cacheLs ?
|
|
648
|
+
let cacheLs = this.localStorage.retrieveLocal(cacheKey);
|
|
649
|
+
let cache = cacheLs ? cacheLs : {};
|
|
555
650
|
cache[cacheInfos.cacheKey] = item;
|
|
556
651
|
if (cacheInfos.cacheTime)
|
|
557
652
|
cache[cacheInfos.cacheKey].__expire = dayjs().add(cacheInfos.cacheTime, "seconds");
|
|
558
|
-
localStorage.
|
|
653
|
+
this.localStorage.storeLocal(cacheKey, cache);
|
|
559
654
|
}
|
|
560
655
|
/**
|
|
561
656
|
* Controlla se la cache per le chiamate senza expire time è scaduta
|
|
@@ -581,14 +676,14 @@ export class HTTPService {
|
|
|
581
676
|
*/
|
|
582
677
|
resetHttpUntimedCacheStorage() {
|
|
583
678
|
var _a;
|
|
584
|
-
localStorage.
|
|
679
|
+
this.localStorage.store(this.localStorageHttpCacheKey, {}).subscribe();
|
|
585
680
|
localStorage.setItem(this.localStorageHttpCacheExpireKey, JSON.stringify(dayjs().add((_a = this.CLIENT_CACHE_DURATION_S) !== null && _a !== void 0 ? _a : 3600, "second")));
|
|
586
681
|
}
|
|
587
682
|
/**
|
|
588
683
|
* Ripulisce la cache delle chiamate con un tempo di expire definito
|
|
589
684
|
*/
|
|
590
685
|
resetHttpTimedCacheStorage() {
|
|
591
|
-
localStorage.
|
|
686
|
+
this.localStorage.store(this.localStorageHttpTimedCacheKey, {});
|
|
592
687
|
}
|
|
593
688
|
/**
|
|
594
689
|
* Genera una chiave per la cache delle chiamate in base ad URL e Parametri HTTP
|
|
@@ -600,8 +695,8 @@ export class HTTPService {
|
|
|
600
695
|
*/
|
|
601
696
|
makeCacheKey(url, params) {
|
|
602
697
|
let authKeyPart = (this.me ? this.me.Idtenant : "") + (this.me && this.CACHE_BY_USER ? this.me.IdUser : "");
|
|
603
|
-
let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + next + '=' + params.get(next), "") : "";
|
|
604
|
-
return authKeyPart + url + paramsKeyPart;
|
|
698
|
+
let paramsKeyPart = params && params.keys().length > 0 ? params.keys().reduce((prev, next) => prev + "," + next + '=' + params.get(next), "") : "";
|
|
699
|
+
return authKeyPart + "_" + url.substring(url.indexOf("api") + 4) + "?" + paramsKeyPart;
|
|
605
700
|
}
|
|
606
701
|
/**
|
|
607
702
|
* Generazione GUID
|
|
@@ -650,6 +745,7 @@ HTTPService.ctorParameters = () => [
|
|
|
650
745
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CLIENT_CACHE_DURATION_S,] }] },
|
|
651
746
|
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [CACHE_BY_USER,] }] },
|
|
652
747
|
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [DEBUG_MODE,] }] },
|
|
653
|
-
{ type: HttpClient }
|
|
748
|
+
{ type: HttpClient },
|
|
749
|
+
{ type: PreferencesService }
|
|
654
750
|
];
|
|
655
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQWEsYUFBYSxFQUFFLFdBQVcsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0Qsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVySSxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUWhEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0N0Qjs7T0FFRztJQUNILFlBQytCLFdBQVcsRUFDaEMsZUFBc0MsRUFDQyxpQkFBaUIsRUFDdkIsTUFBTSxFQUNULFFBQVEsRUFDTyx1QkFBdUIsRUFDakMsYUFBc0IsRUFDekIsVUFBbUIsRUFDbkQsSUFBZ0I7O1FBUkssZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFDaEMsb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBQ0Msc0JB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QXVEekIsUUFBUSxZQUFJLE1BQU0sU0FBQyxpQkFBaUI7NENBQ3BDLFFBQVEsWUFBSSxNQUFNLFNBQUMsV0FBVzs0Q0FDOUIsUUFBUSxZQUFJLE1BQU0sU0FBQyxRQUFROzRDQUMzQixRQUFRLFlBQUksTUFBTSxTQUFDLHVCQUF1QjswQ0FDMUMsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhOzBDQUNoQyxRQUFRLFlBQUksTUFBTSxTQUFDLFVBQVU7WUF2RXpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUHJvZ3Jlc3NFdmVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgZmluYWxpemUsIG1hcCwgc2NhbiB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG4vLyBDaGlhbWF0ZSBhaSBSZXBvc2l0b3J5IC8gdG9rZW5zXHJcbmltcG9ydCB7IEhUVFBfSU5WQUxJREFUSU9OLCBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUywgQkFDS0VORF9VUkwsIEhUVFBfTE9DQUxFLCBBUFBfTkFNRSwgQ0FDSEVfQllfVVNFUiwgREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBMb2MgfSBmcm9tICcuL2h0dHBzZXJ2aWNlLnNlcnZpY2UubG9jJztcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSFRUUFNlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBDYWNoZSBkZWxsbyBzdGF0byBkZWxsZSBjaGlhbWF0ZSBIVFRQIGF0dHVhbG1lbnRlIGVmZmV0dHVhdGUuIE9nbmkgY2hpYW1hdGEgw6ggcmFwcHJlc2VudGF0YSBkYSB1biBHVUlEIGUgbG8gc3RhdHVzIGFzc3VtZSB2YWxvcmUgKipmYWxzZSoqIHNvbG8gc3VnbGkgZXJyb3JpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWxsU3RhdHVzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSwgc29sbyBwZXIgbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRlZmluaXRvIGRpIGNhY2hpbmdcclxuICAgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxvIHNjYWRlcmUgZGVsbGEgY2FjaGUgc3Rlc3NhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBJZGVudGl0w6AgY29sbGVnYXRhIGFsIHRva2VuIGRpIGF1dGVudGljYXppb25lIGRhIHVzYXJlLCByaWNoaWVzdGEgYWwgcHJvZ3JhbW1hIGNoZSB1dGlsaXp6YSBsYSBsaWJyZXJpYSBhdHRyYXZlcnNvIGwnaG9vayAqKnJldHJpZXZlSWRlbnRpdHkqKiBkZWxsYSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZTogeyBJZHRlbmFudDogc3RyaW5nLCBJZFVzZXI6IHN0cmluZyB9ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50YXppb25lIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lIHBlciBjb2xsZWdhcmUgaSBjb21wb3J0YW1lbnRpIGRlbGxhIGxpYnJlcmlhIGFsbCdhcHBsaWNhemlvbmUgaW4gY3VpIMOoIHVzYXRhLiBcclxuICAgKiBcclxuICAgKiBTZSDDqCBzdGF0byBlZmZldHR1YXRvIGlsIHByb3ZpZGUgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogdmVycsOgIHVzYXRvIHF1ZWwgcHJvdmlkZXIsIGFsdHJpbWVudGkgdmVycsOgIGNyZWF0YSB1bmEgbnVvdmEgaXN0YW56YSBkaSBkZWZhdWx0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBFeHRlbnNpb25zSW1wbDogSHR0cFNlcnZpY2VFeHRlbnNpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEJBQ0tFTkRfVVJMKSBwcml2YXRlIEJBQ0tFTkRfVVJMLFxyXG4gICAgcHJpdmF0ZSBFWFRFTlNJT05fQ0xBU1M6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSFRUUF9JTlZBTElEQVRJT04pIHByaXZhdGUgSFRUUF9JTlZBTElEQVRJT04sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfTE9DQUxFKSBwcml2YXRlIExPQ0FMRSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERFQlVHX01PREUpIHByaXZhdGUgREVCVUdfTU9ERTogYm9vbGVhbixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlICYmIGNhY2hlZEluZm9zLmNhY2hlSXRlbSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLmdldDxUPihjYWNoZWRJbmZvcy5maW5hbFVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG5cclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZShyZXNwb25zZUl0ZW0sIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBIVFRQIGNvbiBldmVudHVhbG1lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIGNhY2hlIHF1YWxvcmEgbGEgY2hpYW1hdGEgdGVybWluaSBjb24gbGEgY29udmVuemlvbmUgXCIjY2FjaGVcIlxyXG4gICAqIFxyXG4gICAqIENhc28gc3BlY2lmaWNvIGRpIGNoaWFtYXRhIGNoZSBkZXZlIHJlc3RpdHVpcmUgdW4gQmxvYiBvIHVuIEFycmF5QnVmZmVyIG5hdGl2byBkYSBlbGFib3JhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7XCJhcnJheWJ1ZmZlclwifCBcImJsb2JcIn0gdHlwZSBUaXBvIGRpIHJpdG9ybm8gcmljaGllc3RvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgQ2FsbGJhY2sgY2hpYW1hdG8gaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UmF3KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0eXBlOiBcImFycmF5YnVmZmVyXCIgfCBcImJsb2JcIiA9IFwiYXJyYXlidWZmZXJcIiwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlLCBlcnJvckNhbGxiYWNrID0gbnVsbCk6IE9ic2VydmFibGU8QmxvYiB8IEFycmF5QnVmZmVyPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgbGV0IGNhY2hlZEluZm9zID0gdGhpcy50cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmwsIHBhcmFtcyk7XHJcbiAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgcmV0dXJuIG9mPGFueT4oY2FjaGVkSW5mb3MuY2FjaGVJdGVtKS5waXBlKGRlbGF5KDApLCBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5nZXQoY2FjaGVkSW5mb3MuZmluYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiA8YW55PnR5cGUsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZShibG9iLCBjYWNoZWRJbmZvcyk7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJsb2I7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8QmxvYj4gPT4ge1xyXG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFAuIFRpcGl6emF0YSBzaWEgaW4gSW5wdXQgY2hlIGluIE91dHB1dFxyXG4gICogXHJcbiAgKiBcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgYmlzb2duYSBhbmNoZSBpbnZpYXJlIGRlaSBGaWxlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RmlsZVtdIHwgRmlsZX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gZmlsZSBvIGxpc3RhIGRpIGZpbGUgZGEgaW52aWFyZS4gSWwgdGlwbyAqKkZpbGUqKiDDqCBxdWVsbG8gbmF0aXZvIGRlbCBKYXZhc2NyaXB0XHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0d2l0aEZpbGVzPFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBmaWxlQXJyYXlPckZpbGU6IEZpbGVbXSB8IEZpbGUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB2YXIgZm9ybURhdGEgPSB0aGlzLmdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZChcImJvZHlcIiwgSlNPTi5zdHJpbmdpZnkoYm9keURhdGEpKTtcclxuXHJcbiAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyhudWxsLCB0cnVlLCBudWxsLCBudWxsKSB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7IH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7S30gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3RHZXRGaWxlPEs+KHVybDogc3RyaW5nLCBib2R5RGF0YTogSywgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbmFsVXJsID0gdXJsICsgKHBhcmFtcyA/ICBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpIDogXCJcIik7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGZpbmFsVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIGRpIHVuIGZpbGUgY2hlIGVtZXR0ZSBpIHZhcmkgZXZlbnRpIGRpIHByb2dyZXNzbyBkaSBkb3dubG9hZC5cclxuICAgKiBVdGlsaXp6YXJsYSBwZXIgb3ZlcnJpZGFyZSBsYSBkaWFsb2cgbmF0aXZhIGRpIHByb2dyZXNzIGRlbCBicm93c2VyIGUgc29zdGl0dWlybGEgY29uIHF1YWxjb3NhIHRpcG8gcXVlbGxvIGNoZSBmYSBNRUdBLlxyXG4gICAqIFxyXG4gICAqIEluIGNhc28gc2kgdm9nbGlhIG90dGVuZXJlIGlsIHJpc3VsdGF0byBuYXRpdm8gZGVsIGJyb3dzZXIgZGVsIGRvd25sb2FkIHV0aWxpenphcmUgKipnZXRGaWxlTmF0aXZlKHVybCwgcGFycykqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPERvd25sb2FkPn0gT2JzZXJ2YWJsZSBkZWkgdmFyaSBzdGVwIGRpIHByb2dyZXNzbyBkZWwgZG93bmxvYWRcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZVdpdGhQcm9ncmVzcyh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSk6IE9ic2VydmFibGU8RG93bmxvYWQ+IHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBwYXJhbXM6IHBhcmFtcywgb2JzZXJ2ZTogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzOiB0cnVlIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHNjYW4oKHByZXZpb3VzOiBEb3dubG9hZCwgZXZlbnQ6IEh0dHBFdmVudDxCbG9iPik6IERvd25sb2FkID0+IHtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50KSkge1xyXG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBldmVudC50b3RhbCA/IChldmVudC5sb2FkZWQgPiBldmVudC50b3RhbCA/IDEwMCA6IE1hdGgucm91bmQoKDEwMCAqIGV2ZW50LmxvYWRlZCkgLyBldmVudC50b3RhbCkpIDogcHJldmlvdXMucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiBwcm9ncmVzcywgc3RhdGU6ICdJTl9QUk9HUkVTUycsIGNvbnRlbnQ6IG51bGwgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFJlc3BvbnNlKGV2ZW50KSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuYm9keSkge1xyXG4gICAgICAgICAgICAgIGxldCBjZGlzcCA9IGV2ZW50LmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgICAgbGV0IGNkaXNwRmlsZW5hbWUgPSBjZGlzcC5zcGxpdCgnOycpWzFdLnNwbGl0KCdmaWxlbmFtZScpWzFdLnNwbGl0KCc9JylbMV0udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG4gICAgICAgICAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChldmVudC5ib2R5KTtcclxuICAgICAgICAgICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBjZGlzcEZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogMTAwLCBzdGF0ZTogJ0RPTkUnLCBjb250ZW50OiBldmVudC5ib2R5IH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICAgICAgfSwgeyBzdGF0ZTogJ1BFTkRJTkcnLCBwcm9ncmVzczogMCwgY29udGVudDogbnVsbCB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnIsIF8pOiBPYnNlcnZhYmxlPERvd25sb2FkPiA9PiB7IHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpIH0pLFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBSZXNwb25zZSoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgIHByaXZhdGUgaXNIdHRwUmVzcG9uc2U8VD4oZXZlbnQ6IEh0dHBFdmVudDxUPik6IGV2ZW50IGlzIEh0dHBSZXNwb25zZTxUPiB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFByb2dyZXNzRXZlbnQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwUHJvZ3Jlc3NFdmVudChldmVudDogSHR0cEV2ZW50PHVua25vd24+KTogZXZlbnQgaXMgSHR0cFByb2dyZXNzRXZlbnQge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuRG93bmxvYWRQcm9ncmVzcyB8fCBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aW9uZSBkZWxsJ2luaXppbyBkaSB1bmEgY2hpYW1hdGEgYWQgdW4gY2VydG8gVVJMLCB2aWVuZSBnZW5lcmF0byB1biBHVUlEIGRhIGFzc2VnbmFyY2ksIGNvbnRyb2xsYXRhIGxhIHNjYWRlbnphIGRlbGxhIGNhY2hlLCBcclxuICAgKiBlIGV2ZW50dWFsbWVudGUgbG9nZ2F0byBpbCBmYXR0byBjaGUgc3RhIHBlciBlc3NlcmUgZWZmZXR0dWF0YSB1bmEgY2hpYW1hdGEgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVXJsIGEgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHVUlEIGFzc2VnbmF0byBhbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWZhdWx0U3RhcnRDYWxsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmdldEdVSUQoKTtcclxuICAgIHRoaXMuY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmwpO1xyXG4gICAgdGhpcy5jYWxsU3RhdHVzW215R3VpZF0gPSB0cnVlO1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJTdGFydGluZyBjYWxsXCIpICsgXCIgXCIgKyBteUd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwiYXQgVVJMXCIpICsgXCI6IFwiICsgdXJsKTtcclxuICAgIHJldHVybiBteUd1aWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIHVybCB2ZW5nb25vIGNvbnRyb2xsYXRlIGxlIGluZm9ybWF6aW9uaSBzdSB0dXR0aSBnbGkgdXJsIGRhIGludmFsaWRhcmUgY29sbGVnYXRpIGFsbCd1cmwgY2hpYW1hdG8gZSwgc2UgcHJlc2VudGkgaW4gY2FjaGUsIGludmFsaWRhdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBwZXIgY3VpIGNvbnRyb2xsYXJlIHNlIGNpIHNvbm8gY2hpYW1hdGUgaW4gY2FjaGUgZGEgaW52YWxpZGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tDYWNoZUludmFsaWRhdGlvbih1cmw6IHN0cmluZykge1xyXG4gICAgbGV0IGNhY2hlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSkpO1xyXG4gICAgbGV0IHRtcCA9IC8jY2FjaGUoOj8tKFxcZCspKS9naS5leGVjKHVybCk7XHJcbiAgICBsZXQgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuICAgIGxldCBub3JtYWxpemVkVXJsID0gdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKS5yZXBsYWNlKHRoaXMuQkFDS0VORF9VUkwsIFwiXCIpO1xyXG5cclxuICAgIGlmICghY2FjaGUgfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT04gfHwgIXRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF0pXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgYXBpc1RvSW52YWxpZGF0ZTogc3RyaW5nW10gPSB0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdO1xyXG4gICAgaWYgKCFhcGlzVG9JbnZhbGlkYXRlIHx8IGFwaXNUb0ludmFsaWRhdGUubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQga2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgYXBpc1RvSW52YWxpZGF0ZS5mb3JFYWNoKGFwaSA9PiB7XHJcbiAgICAgIGxldCBjYWNoZUtleSA9IHRoaXMubWFrZUNhY2hlS2V5KGFwaSwgbnVsbCk7XHJcbiAgICAgIGZvciAobGV0IGl0ZW0gaW4gY2FjaGUpXHJcbiAgICAgICAgaWYgKGl0ZW0uaW5kZXhPZihjYWNoZUtleSkgIT0gLTEpXHJcbiAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChpdGVtKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrID0ga2V5c1RvUmVtb3ZlW2ldO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkludmxhbGlkYXRpbmcgY2FjaGUgZWxlbWVudFwiKSArIFwiIFwiICsgayk7XHJcbiAgICAgIGRlbGV0ZSBjYWNoZVtrXTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgSlNPTi5zdHJpbmdpZnkoY2FjaGUpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmFsaXp6YXppb25lIGRpIHVuYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIEdVSUQgY29sbGVnYXRvIGFsbGEgY2hpYW1hdGEgYXBwZW5hIHRlcm1pbmF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5RmluYWxpemVCeUd1aWQoZ3VpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0gPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vQWxsYSBwcmltYSBjaGlhbWF0YSBidW9uYSwgc2lnbmlmaWNhIGNoZSBhbG1lbm8gaWwgbG9naW4gY2UgbCdoby4gUG9zc28gbWV0dGVybWkgaW4gbW9kYWxpdMOgIHJlZGlyZWN0SW5Qcm9ncmVzcyBmYWxzZVxyXG4gICAgLy9lIHJpaW5pemlhcmUgYSB2YWx1dGFyZSBlcnJvcmkgZGkgamF2YXNoaXRcclxuICAgIGlmICh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0gJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW9uU3RhdHVzKGZhbHNlKTtcclxuXHJcbiAgICAvL0luIG9nbmkgY2FzbyBxdWVzdGEgcG9zc28gcmltdW92ZXJsYVxyXG4gICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgZGF0byB1biB1bmljbyBGaWxlIG8gdW5hIGxpc3RhIGRpIEZpbGUgY3JlYSB1biBvZ2dldHRvIEZvcm1EYXRhIGNoZSBwdcOyIGVzc2VyZSBpbnZpYXRvIGNvbW9kYW1lbnRlIFxyXG4gICAqIGFkIHVuIGJhY2tlbmQgQVNQLk5FVCBkYSBjdWkgc2kgcG90csOgIGFjY2VkZXJlIGEgUmVxdWVzdC5Gb3JtLkZpbGVzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtGaWxlIHwgRmlsZVtdfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBGaWxlIG8gbGlzdGEgZGkgRmlsZS4gTi5COiBuZWxsYSBmaXJtYSBkZWxsYSBmdW56aW9uZSB2aWVuZSBjb25zaWRlcmF0byAqKmFueSoqIHBlciBmYXJlIHRlc3Qgc3VsbGUgcHJvcHJpZXTDoCBcclxuICAgKiBpbnZlY2UgY2hlIGZhcmUgdGVzdCBjb24gbCcqKmlzdGFuY2VvZioqXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSBGb3JtRGF0YSBjb250ZW5lbnRlIHR1dHRpIGkgZmlsZSBwYXNzYXRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZTogYW55KTogRm9ybURhdGEge1xyXG4gICAgdmFyIGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuICAgIGlmIChmaWxlQXJyYXlPckZpbGUpIHtcclxuICAgICAgaWYgKGZpbGVBcnJheU9yRmlsZS5sZW5ndGgpXHJcbiAgICAgICAgZmlsZUFycmF5T3JGaWxlLmZvckVhY2godCA9PiB7IGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgdCwgdC5uYW1lKTsgfSk7XHJcbiAgICAgIGVsc2UgaWYgKGZpbGVBcnJheU9yRmlsZS5uYW1lKVxyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVzXCIsIGZpbGVBcnJheU9yRmlsZSwgZmlsZUFycmF5T3JGaWxlLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBjaGUgaW4gYmFzZSBhaSBwYXJhbWV0cmkgZGlzcG9uaWJpbGkgZ2VuZXJhIGdsaSBIZWFkZXIgSFRUUCBwZXIgbGEgY2hpYW1hdGEgZGEgZWZmZXR0dWFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkNvbnRlbnQtVHlwZVwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHQgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBY2NlcHRcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBdXRoIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQXV0aG9yaXphdGlvblwiLCB2YWxvcml6emF0byBjb2wgdG9rZW4gcmVjdXBlcmF0byBkYWxsJ2hvb2sgKipyZXRyaWV2ZUFjY2Vzc1Rva2VuKiogZGVsbGEgY2xhc3NlIGRpIGVzdGVuc2lvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIlgtVFgtSURcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7SHR0cEhlYWRlcnN9IEhlYWRlciBnZW5lcmF0aSBpbiBiYXNlIGFpIHBhcmFtZXRyaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SGVhZGVycyh0cmFuc2FjdGlvbklkID0gXCJcIiwgaW5jbHVkZUF1dGg6IGJvb2xlYW4gPSB0cnVlLCBjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIsIGFjY2VwdDogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpOiBIdHRwSGVhZGVycyB7XHJcbiAgICB2YXIgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgdmFyIGF1dGh0b2tlbiA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVBY2Nlc3NUb2tlbigpO1xyXG5cclxuICAgIGlmIChjb250ZW50VHlwZSlcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcclxuXHJcbiAgICBpZiAodHJhbnNhY3Rpb25JZClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiWC1UWC1JRFwiLCB0cmFuc2FjdGlvbklkKTtcclxuXHJcbiAgICBpZiAoYXV0aHRva2VuICYmIGluY2x1ZGVBdXRoKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiICsgYXV0aHRva2VuKTtcclxuXHJcbiAgICBpZiAoYWNjZXB0KVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJBY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xyXG5cclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdC1MYW5ndWFnZVwiLCB0aGlzLkxPQ0FMRSA/PyAnaXQtSVQnKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5jYWxsU3RhdHVzW2d1aWRdID0gZmFsc2U7XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdHV0dGkgZ2xpIGVycm9yaSBkdXJhbnRlIGlsIHJlZGlyZWN0IGFsIGxvZ2luIHZlbmdhbm8gaWdub3JhdGlcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGluZ1RvTG9naW4oKSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlZGlyZWN0aW5nIHRvIExvZ2luLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdmVuZ2EgZ2VzdGl0byB1biBzb2xvIGVycm9yZSBwZXIgdm9sdGFcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRIYW5kbGluZ0Vycm9yU3RhdHVzKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJBbHJlYWR5IEhhbmRsaW5nIGFuIGVycm9yLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVIYW5kbGluZ0Vycm9yU3RhdHVzKHRydWUpO1xyXG5cclxuICAgIGxldCBmaW5hbEVycm9yID0gXCJcIjtcclxuICAgIGxldCBmaW5hbFN0YXR1cyA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5pc1R5cGVFcnJvcihyZXMpKSB7XHJcbiAgICAgIGZpbmFsRXJyb3IgPSByZXMubWVzc2FnZTtcclxuICAgICAgZmluYWxTdGF0dXMgPSBcIkhUVFAgU2VydmljZSBJbnRlcm5hbCBFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc0h0dHBFcnJvclJlc3BvbnNlKHJlcykpIHtcclxuXHJcbiAgICAgIGZpbmFsRXJyb3IgPSBhd2FpdCB0aGlzLmdldEh0dHBFcnJvclRleHQocmVzLmVycm9yKTtcclxuICAgICAgZmluYWxTdGF0dXMgPSByZXMuc3RhdHVzLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHJlcy5zdGF0dXMpIHtcclxuICAgICAgICAvLyBVbmF1dGhvcml6ZWRcclxuICAgICAgICBjYXNlIDQwMTpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCByZWRpcmVjdCBhbHJlYWR5IGluIHByb2dyZXNzLiBJZ25vcmluZyB0aGlzIGV2ZW50XCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0MDEgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZWRpcmVjdGluZyB0byBsb2dpbi5cIikpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW9uU3RhdHVzKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW5nVG9Mb2dpbih0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVkaXJlY3RUb0xvZ2luKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gSGFuZGxlZCBleGNlcHRpb25cclxuICAgICAgICBjYXNlIDQwMDpcclxuICAgICAgICAvLyBObyBQZXJtaXNzaW9uc1xyXG4gICAgICAgIGNhc2UgNDAzOlxyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVCbG9ja2luZ0V4Y2VwdGlvbihyZXMuc3RhdHVzLCBmaW5hbEVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3QgZm91bmRcclxuICAgICAgICBjYXNlIDQwNDpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgdGhpcy5sb2MoXCJSZXNvdXJjZSBub3QgZm91bmRcIikpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIE5vdENvbmZpZ3VyZWRFeGNlcHRpb25cclxuICAgICAgICBjYXNlIDQ0NDpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKVxyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQ0NCBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICBlbHNlIGlmICghdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVOb3RDb25maWd1cmVkRXhjZXB0aW9uKCkpXHJcbiAgICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZmluYWxFcnJvciA9IFwiU2VydmVyIG1pZ2h0IGJlIG9mZmxpbmVcIiArIChyZXMuc3RhdHVzVGV4dCA/IFwiIChcIiArIHJlcy5zdGF0dXNUZXh0ICsgXCIpIFwiIDogXCJcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUV4Y2VwdGlvbihmaW5hbFN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIGVycm9yZSByZXN0aXR1aXNjZSB1bmEgcHJvbWlzZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmUgaW4gbW9kbyBkYSBwb3RlciBmYXJlIHVuIGF3YWl0XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIGNoZSByaXNvbHZlIGNvbiBsYSBzdHJpbmdhIGZpbmFsZSBkZWxsJ2Vycm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHR0cEVycm9yVGV4dChlcnI6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAvLyBTZSBobyB1biBCbG9iIHB1w7IgZXNzZXJlIG8gdW4gQ2FsbFJlc3VsdCBvIHN1cHBvbmdvIHVuYSBzZW1wbGljZSBzdHJpbmdhLFxyXG4gICAgLy8gYWx0cmltZW50aSBwb3RyZWJiZSBlc3NlcmUgZGlyZXR0YW1lbnRlIHVuIENhbGxSZXN1bHQsIG9wcHVyZSB1bmEgc2VtcGxpY2Ugc3RyaW5nYVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyTXNnID0gKDxhbnk+ZS50YXJnZXQpLnJlc3VsdDtcclxuICAgICAgICAgIGxldCBqc29uZXJyTXNnOiBhbnk7XHJcbiAgICAgICAgICB0cnkgeyBqc29uZXJyTXNnID0gSlNPTi5wYXJzZShlcnJNc2cpOyB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKGpzb25lcnJNc2cgJiYgdGhpcy5pc0NhbGxSZXN1bHQoanNvbmVyck1zZykgPyBqc29uZXJyTXNnLmVycm9yLm1lc3NhZ2UgOiBlcnJNc2cpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZXJyKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuaXNDYWxsUmVzdWx0KGVycikpXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyPy50b1N0cmluZygpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnb2dnZXR0byDDqCBkaSB0aXBvICoqQ2FsbFJlc3VsdCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzQ2FsbFJlc3VsdChlcnI6IGFueSk6IGVyciBpcyB7IGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9IH0ge1xyXG4gICAgcmV0dXJuICEhZXJyPy5lcnJvcj8ubWVzc2FnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2Vycm9yZSDDqCBkaSB0aXBvICoqSHR0cEVycm9yUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBFcnJvclJlc3BvbnNlKGVycjogYW55KTogZXJyIGlzIEh0dHBFcnJvclJlc3BvbnNlIHtcclxuICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZTtcclxuICB9XHJcblxyXG4gICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKlR5cGVFcnJvcioqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzVHlwZUVycm9yKGVycjogYW55KTogZXJyIGlzIFR5cGVFcnJvciB7XHJcbiAgICByZXR1cm4gZXJyLm5hbWUgPT0gXCJUeXBlRXJyb3JcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbWUgZGljZSBpbCBub21lLCByZWdpc3RyYSB1biBlcnJvcmUgZSByZXN0aXR1aXNjZSB1biBPYnNlcnZhYmxlIHZ1b3RvIGNvbWUgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IHJlcyBSaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIElkZW50aWZpY2F0aXZvIEdVSUQgZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGdlc3RpcmUgbCdlcnJvcmUgdmlhIGxpYnJlcmlhIG8gc2UgbGltaXRhcnNpIGEgcmVzdGl0dWlyZSBsJ09ic2VydmFibGUgdnVvdG9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fSBPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKHJlczogYW55LCBndWlkOiBzdHJpbmcsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoaGFuZGxlRXJyb3IpXHJcbiAgICAgIHRoaXMub25FcnJvcihyZXMsIGd1aWQpO1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCgpID0+IHsgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIFVybCBlIGRlaSBwYXJhbWV0cmkgY2VyY2EgZGkgcmVjdXBlcmFyZSBsJ2V2ZW50dWFsZSBvZ2dldHRvIGdpw6Agc2FsdmF0byBpbiBjYWNoZSBjb24gbGUgaW5mb3JtYXppb25pIGJhc2UgZGVsbGEgY2FjaGUgc3Rlc3NhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGEgKG51bGxpIGluIGNhc28gZGkgUE9TVClcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7eyBmaW5hbFVybDogc3RyaW5nLCBjYWNoZTogYm9vbGVhbiwgY2FjaGVLZXk6IHN0cmluZywgY2FjaGVUaW1lOiBzdHJpbmcsIGNhY2hlSXRlbTogYW55IH19IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IHsgZmluYWxVcmw6IHN0cmluZywgY2FjaGU6IGJvb2xlYW4sIGNhY2hlS2V5OiBzdHJpbmcsIGNhY2hlVGltZTogc3RyaW5nLCBjYWNoZUl0ZW06IGFueSB9IHtcclxuXHJcbiAgICBsZXQgY2FjaGluZ0tleSA9IG51bGwsIGNhY2hlVGltZSA9IG51bGwsIGNhY2hlID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oY2FjaGVLZXkpO1xyXG4gICAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gSlNPTi5wYXJzZShjYWNoZUxzKSA6IHt9O1xyXG5cclxuICAgICAgaWYgKGNhY2hlICYmIGNhY2hlW2NhY2hpbmdLZXldICYmICF0aGlzLnRpbWVkQ2FjaGVJdGVtRXhwaXJlZChjYWNoZVtjYWNoaW5nS2V5XSkpIHtcclxuICAgICAgICAvLyBTZSBnZXN0aXNjbyBpbCB0ZW1wbyBlc2F0dG8gZGVsbGEgY2FjaGUgcHJpbWEgZGkgcmVzdGl0dWlyZSBsJ29nZ2V0dG8gY2FjaGF0byBsbyByaXB1bGlzY28gXHJcbiAgICAgICAgLy8gZGFsbGUgcHJvcHJpZXTDoCBpbnRlcm5lIGNoZSBnbGkgaG8gYWdnaXVudG8gcGVyIGNvbnRyb2xsYXJuZSBsYSBzY2FkZW56YVxyXG4gICAgICAgIGlmIChjYWNoZVRpbWUpXHJcbiAgICAgICAgICBkZWxldGUgY2FjaGVbY2FjaGluZ0tleV0uX19leHBpcmU7XHJcblxyXG4gICAgICAgIGl0ZW0gPSBjYWNoZVtjYWNoaW5nS2V5XVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgZmluYWxVcmw6IHVybCwgY2FjaGU6IHVzZUNhY2hpbmcsIGNhY2hlS2V5OiBjYWNoaW5nS2V5LCBjYWNoZVRpbWU6IGNhY2hlVGltZSwgY2FjaGVJdGVtOiBpdGVtIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcmlzY2UgdW4gb2dnZXR0byBuZWxsYSBjYWNoZSBhcHByb3ByaWF0YSBpbiBiYXNlIGFsbGUgaW5mb3JtYXppb25pIGNvbnRlbnV0ZSBuZWwgcGFyYW1ldHJvICoqY2FjaGVJbmZvcyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtUfSBpdGVtIE9nZ2V0dG8gZGEgaW5zZXJpcmUgbmVsbGEgY2FjaGVcclxuICAgKiBAcGFyYW0ge3sgZmluYWxVcmw6IHN0cmluZywgY2FjaGU6IGJvb2xlYW4sIGNhY2hlS2V5OiBzdHJpbmcsIGNhY2hlVGltZTogc3RyaW5nLCBjYWNoZUl0ZW06IGFueSB9fSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IHsgZmluYWxVcmw6IHN0cmluZywgY2FjaGU6IGJvb2xlYW4sIGNhY2hlS2V5OiBzdHJpbmcsIGNhY2hlVGltZTogc3RyaW5nLCBjYWNoZUl0ZW06IGFueSB9KTogdm9pZCB7XHJcbiAgICBsZXQgY2FjaGVLZXkgPSBjYWNoZUluZm9zLmNhY2hlVGltZSA/IHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgOiB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleVxyXG4gICAgbGV0IGNhY2hlTHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gSlNPTi5wYXJzZShjYWNoZUxzKSA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGNhY2hlS2V5LCBKU09OLnN0cmluZ2lmeShjYWNoZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBKU09OLnN0cmluZ2lmeSh7fSkpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXksIEpTT04uc3RyaW5naWZ5KGRheWpzKCkuYWRkKHRoaXMuQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MgPz8gMzYwMCwgXCJzZWNvbmRcIikpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpcHVsaXNjZSBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGkgZXhwaXJlIGRlZmluaXRvXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2V0SHR0cFRpbWVkQ2FjaGVTdG9yYWdlKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwgSlNPTi5zdHJpbmdpZnkoe30pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFrZUNhY2hlS2V5KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgbGV0IGF1dGhLZXlQYXJ0ID0gKHRoaXMubWUgPyB0aGlzLm1lLklkdGVuYW50IDogXCJcIikgKyAodGhpcy5tZSAmJiB0aGlzLkNBQ0hFX0JZX1VTRVIgPyB0aGlzLm1lLklkVXNlciA6IFwiXCIpO1xyXG4gICAgbGV0IHBhcmFtc0tleVBhcnQgPSBwYXJhbXMgJiYgcGFyYW1zLmtleXMoKS5sZW5ndGggPiAwID8gcGFyYW1zLmtleXMoKS5yZWR1Y2UoKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiBwcmV2ICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIHVybCArIHBhcmFtc0tleVBhcnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF6aW9uZSBHVUlEXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTnVvdm8gR1VJRCBnZW5lcmF0byBpbiBtYW5pZXJhIGNhc3VhbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEdVSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNjcml2ZXJlIGxvZyBhIGNvbnNvbGUgcXVhbG9yYSAqKkRFQlVHX01PREUqKiByaXN1bHRhc3NlICoqdHJ1ZSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRpIGxvZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghTG9jW21lc3NhZ2VdKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIlVudHJhbnNsYXRlZCBtZXNzYWdlOiBcIiArIG1lc3NhZ2UpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIExvY1ttZXNzYWdlXVt0aGlzLkxPQ0FMRV07XHJcbiAgfVxyXG59Il19
|
|
751
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQWEsYUFBYSxFQUFFLFdBQVcsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsWUFBWTtBQUNaLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTNELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJJLFdBQVc7QUFDWCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBUWpEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBd0J0Qjs7T0FFRztJQUNILFlBQytCLFdBQVcsRUFDaEMsZUFBc0MsRUFDQyxpQkFBaUIsRUFDdkIsTUFBTSxFQUNULFFBQVEsRUFD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QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLENBQUE7WUFDaEQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7WUF0MEJGLFVBQVU7Ozs0Q0E2Qk4sTUFBTSxTQUFDLFdBQVc7WUE1Q2QscUJBQXFCOzRDQThDekIsUUFBUSxZQUFJLE1BQU0sU0FBQyxpQkFBaUI7NENBQ3BDLFFBQVEsWUFBSSxNQUFNLFNBQUMsV0FBVzs0Q0FDOUIsUUFBUSxZQUFJLE1BQU0sU0FBQyxRQUFROzRDQUMzQixRQUFRLFlBQUksTUFBTSxTQUFDLHVCQUF1QjswQ0FDMUMsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhOzBDQUNoQyxRQUFRLFlBQUksTUFBTSxTQUFDLFVBQVU7WUFqRXpCLFVBQVU7WUFJVixrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUHJvZ3Jlc3NFdmVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRXMgRmFlbnphXHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvcHJlZmVyZW5jZXNcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVsYXksIGZpbmFsaXplLCBtYXAsIHNjYW4gfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8vIENoaWFtYXRlIGFpIFJlcG9zaXRvcnkgLyB0b2tlbnNcclxuaW1wb3J0IHsgSFRUUF9JTlZBTElEQVRJT04sIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBCQUNLRU5EX1VSTCwgSFRUUF9MT0NBTEUsIEFQUF9OQU1FLCBDQUNIRV9CWV9VU0VSLCBERUJVR19NT0RFIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuLy8gTW9kZWxsaSBcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VFeHRlbnNpb25zIH0gZnJvbSAnLi9jb25maWcvSHR0cFNlcnZpY2VFeHRlbnNpb25zJztcclxuaW1wb3J0IHsgRG93bmxvYWQgfSBmcm9tICcuL21vZGVscy9Eb3dubG9hZCc7XHJcbmltcG9ydCB7IExvYyB9IGZyb20gJy4vaHR0cHNlcnZpY2Uuc2VydmljZS5sb2MnO1xyXG5pbXBvcnQgeyBDYWNoZUluZm9zIH0gZnJvbSBcIi4vbW9kZWxzL0NhY2hlSW5mb3NcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSFRUUFNlcnZpY2Uge1xyXG5cclxuICAvKiogQ2FjaGUgZGVsbG8gc3RhdG8gZGVsbGUgY2hpYW1hdGUgSFRUUCBhdHR1YWxtZW50ZSBlZmZldHR1YXRlLiBPZ25pIGNoaWFtYXRhIMOoIHJhcHByZXNlbnRhdGEgZGEgdW4gR1VJRCBlIGxvIHN0YXR1cyBhc3N1bWUgdmFsb3JlICoqZmFsc2UqKiBzb2xvIHN1Z2xpIGVycm9yaSAqL1xyXG4gIHByaXZhdGUgY2FsbFN0YXR1czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gbnVsbDtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnksIHNvbG8gcGVyIGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkZWZpbml0byBkaSBjYWNoaW5nICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsbyBzY2FkZXJlIGRlbGxhIGNhY2hlIHN0ZXNzYSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gbnVsbDtcclxuICAvKiogSWRlbnRpdMOgIGNvbGxlZ2F0YSBhbCB0b2tlbiBkaSBhdXRlbnRpY2F6aW9uZSBkYSB1c2FyZSwgcmljaGllc3RhIGFsIHByb2dyYW1tYSBjaGUgdXRpbGl6emEgbGEgbGlicmVyaWEgYXR0cmF2ZXJzbyBsJ2hvb2sgKipyZXRyaWV2ZUlkZW50aXR5KiogZGVsbGEgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKiAqL1xyXG4gIHByaXZhdGUgbWU6IHsgSWR0ZW5hbnQ6IHN0cmluZywgSWRVc2VyOiBzdHJpbmcgfSA9IG51bGw7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgYSB0ZW1wbyBkZXYnZXNzZXJlIHBlcnNpc3RpdGEgaWwgcHJpbWEgcG9zc2liaWxlICovXHJcbiAgcHJpdmF0ZSBQZXJzaXN0VGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogSW5kaWNhIGNoZSBsYSBjYWNoZSBzZW56YSBsaW1pdGkgZGkgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFVudGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50YXppb25lIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lIHBlciBjb2xsZWdhcmUgaSBjb21wb3J0YW1lbnRpIGRlbGxhIGxpYnJlcmlhIGFsbCdhcHBsaWNhemlvbmUgaW4gY3VpIMOoIHVzYXRhLiBcclxuICAgKiBcclxuICAgKiBTZSDDqCBzdGF0byBlZmZldHR1YXRvIGlsIHByb3ZpZGUgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogdmVycsOgIHVzYXRvIHF1ZWwgcHJvdmlkZXIsIGFsdHJpbWVudGkgdmVycsOgIGNyZWF0YSB1bmEgbnVvdmEgaXN0YW56YSBkaSBkZWZhdWx0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBFeHRlbnNpb25zSW1wbDogSHR0cFNlcnZpY2VFeHRlbnNpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEJBQ0tFTkRfVVJMKSBwcml2YXRlIEJBQ0tFTkRfVVJMLFxyXG4gICAgcHJpdmF0ZSBFWFRFTlNJT05fQ0xBU1M6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSFRUUF9JTlZBTElEQVRJT04pIHByaXZhdGUgSFRUUF9JTlZBTElEQVRJT04sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfTE9DQUxFKSBwcml2YXRlIExPQ0FMRSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERFQlVHX01PREUpIHByaXZhdGUgREVCVUdfTU9ERTogYm9vbGVhbixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgbG9jYWxTdG9yYWdlOiBQcmVmZXJlbmNlc1NlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc3RvcmUodGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwgbHNUaW1lZCksXHJcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnN0b3JlKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBsc1VudGltZWQpXHJcbiAgICBdKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNvbnZlcnRlZCBvbGQgc3RvcmFnZSBzeXN0ZW0gdG8gbmV3IG9uZVwiKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUCBjb24gZXZlbnR1YWxtZW50ZSBsYSBnZXN0aW9uZSBkZWxsYSBjYWNoZSBxdWFsb3JhIGxhIGNoaWFtYXRhIHRlcm1pbmkgY29uIGxhIGNvbnZlbnppb25lIFwiI2NhY2hlXCJcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIENhbGxiYWNrIGNoaWFtYXRvIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSwgZXJyb3JDYWxsYmFjazogRnVuY3Rpb24gPSBudWxsKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgbGV0IGNhY2hlZEluZm9zID0gdGhpcy50cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmwsIHBhcmFtcyk7XHJcbiAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgcmV0dXJuIG9mPFQ+KGNhY2hlZEluZm9zLmNhY2hlSXRlbSkucGlwZShkZWxheSgwKSwgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBtYXAoKHJlczogVCkgPT4ge1xyXG4gICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSkge1xyXG4gICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKHJlc3BvbnNlSXRlbSwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZWQgcmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBIVFRQIGNvbiBldmVudHVhbG1lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIGNhY2hlIHF1YWxvcmEgbGEgY2hpYW1hdGEgdGVybWluaSBjb24gbGEgY29udmVuemlvbmUgXCIjY2FjaGVcIlxyXG4gICAqIFxyXG4gICAqIENhc28gc3BlY2lmaWNvIGRpIGNoaWFtYXRhIGNoZSBkZXZlIHJlc3RpdHVpcmUgdW4gQmxvYiBvIHVuIEFycmF5QnVmZmVyIG5hdGl2byBkYSBlbGFib3JhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7XCJhcnJheWJ1ZmZlclwifCBcImJsb2JcIn0gdHlwZSBUaXBvIGRpIHJpdG9ybm8gcmljaGllc3RvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yQ2FsbGJhY2sgQ2FsbGJhY2sgY2hpYW1hdG8gaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UmF3KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0eXBlOiBcImFycmF5YnVmZmVyXCIgfCBcImJsb2JcIiA9IFwiYXJyYXlidWZmZXJcIiwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlLCBlcnJvckNhbGxiYWNrID0gbnVsbCk6IE9ic2VydmFibGU8QmxvYiB8IEFycmF5QnVmZmVyPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgbGV0IGNhY2hlZEluZm9zID0gdGhpcy50cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmwsIHBhcmFtcyk7XHJcbiAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgcmV0dXJuIG9mPGFueT4oY2FjaGVkSW5mb3MuY2FjaGVJdGVtKS5waXBlKGRlbGF5KDApLCBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5nZXQoY2FjaGVkSW5mb3MuZmluYWxVcmwsIHsgcmVzcG9uc2VUeXBlOiA8YW55PnR5cGUsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZShibG9iLCBjYWNoZWRJbmZvcyk7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJsb2I7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8QmxvYj4gPT4ge1xyXG4gICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgKiBcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgcG9zdDxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgKiBFc2VjdXppb25lIGRpIHVuYSBERUxFVEUgSFRUUFxyXG4gICpcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgKiBcclxuICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAqL1xyXG4gIHB1YmxpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBtYXAoKHJlczogVCkgPT4ge1xyXG4gICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSXRlbTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUFVUIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7YW55fSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5IEluZGljYSBjaGUgcXVlc3RhIGNoaWFtYXRhIGRldmUgYXNzb2x1dGFtZW50ZSBhbmRhcmUgYmVuZS4gSW4gY2FzbyBjb250cmFyaW8gdmllbmUgZmlzaWNhbWVudGUgZmF0dG8gaWwgdGhyb3cgY2hlIHB1w7IgZXNzZXJlIFxyXG4gICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlSXRlbSA9IDxUPnJlcztcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIGJpc29nbmEgYW5jaGUgaW52aWFyZSBkZWkgRmlsZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0ZpbGVbXSB8IEZpbGV9IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIGZpbGUgbyBsaXN0YSBkaSBmaWxlIGRhIGludmlhcmUuIElsIHRpcG8gKipGaWxlKiogw6ggcXVlbGxvIG5hdGl2byBkZWwgSmF2YXNjcmlwdFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgcG9zdHdpdGhGaWxlczxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgZmlsZUFycmF5T3JGaWxlOiBGaWxlW10gfCBGaWxlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJib2R5XCIsIEpTT04uc3RyaW5naWZ5KGJvZHlEYXRhKSk7XHJcblxyXG4gICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnBvc3Q8VD4odXJsLCBmb3JtRGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7IHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpOyB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgICogXHJcbiAgICogQ2FzaXN0aWNhIHBhcnRpY29sYXJlIGluIGN1aSB2aWVuZSByZXN0aXR1aXRvIHVuIGZpbGUgZ2VzdGl0byBjb21lIE9iamVjdFVSTCBpbCBjdWkgVVJMIHNpIHB1w7IgZ2VzdGlyZSBkYWwgcGFyYW1ldHJvIGRpIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKiouIFxyXG4gICAqIExhIGNoaWFtYXRhIG5vbiBoYSB1biB0aXBvIHJlc3RpdHVpdG8gaW4gcXVhbnRvIGlsIHJpc3VsdGF0byBkZXYnZXNzZXJlIGdlc3RpdG8gYXR0cmF2ZXJzbyBsYSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0t9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgTm9tZSBkZWwgZmlsZSBjaGUgc2kgc3RhIHJpY2hpZWRlbmRvLCByaW1hbmUgbGF0byBGcm9udGVuZCBlIHNlcnZlIHBlciBhc3NlZ25hcmUgYXJiaXRyYXJpYW1lbnRlIHVuIG5vbWUgYWwgZmlsZSByZXN0aXR1aXRvLCBzZSB2dW90byB2aWVuZSB1dGlsaXp6YXRhIGxhIENvbnRlbnQtRGlzcG9zaXRpb24gZGVsbGEgcmlzcG9zdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXJHZXRGaWxlIENhbGxiYWNrIGRhIGNoaWFtYXJlIGRvcG8gYXZlciBnZXN0aXRvIGxhIHJpc3Bvc3RhIGRlbCAqKmdldEZpbGVDYWxsYmFjayoqLCBpbiBjYXNvICoqaGFuZGxlRXJyb3IqKiBmb3NzZSAqKmZhbHNlKiogdmVycsOgIHJpY2hpYW1hdG8gYW5jaGUgaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBkaSBkZWZhdWx0IGdsaSBlcnJvcmkgZGV2b25vIGVzc2VyZSBnZXN0aXRpIGRhbGxhIGxpYnJlcmlhIG8gc2UgZGV2b25vIGVzc2VyZSBpZ25vcmF0aVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0R2V0RmlsZTxLPih1cmw6IHN0cmluZywgYm9keURhdGE6IEssIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5RGF0YSwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpbGUodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnksIGFmdGVyR2V0RmlsZTogKCkgPT4gYW55ID0gbnVsbCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdGhpcy5odHRwLmdldCh1cmwsIHsgcGFyYW1zOiBwYXJhbXMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZCBuYXRpdm8gZGkgdW4gZmlsZS4gSW50ZXJuYW1lbnRlIHV0aWxpenphIGlsIHBhdHRlcm4gKip3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiLi4uXCIqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpbGVOYXRpdmUodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwpOiB2b2lkIHtcclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyAgXCI/XCIgKyBwYXJhbXMudG9TdHJpbmcoKSA6IFwiXCIpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBmaW5hbFVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBkaSB1biBmaWxlIGNoZSBlbWV0dGUgaSB2YXJpIGV2ZW50aSBkaSBwcm9ncmVzc28gZGkgZG93bmxvYWQuXHJcbiAgICogVXRpbGl6emFybGEgcGVyIG92ZXJyaWRhcmUgbGEgZGlhbG9nIG5hdGl2YSBkaSBwcm9ncmVzcyBkZWwgYnJvd3NlciBlIHNvc3RpdHVpcmxhIGNvbiBxdWFsY29zYSB0aXBvIHF1ZWxsbyBjaGUgZmEgTUVHQS5cclxuICAgKiBcclxuICAgKiBJbiBjYXNvIHNpIHZvZ2xpYSBvdHRlbmVyZSBpbCByaXN1bHRhdG8gbmF0aXZvIGRlbCBicm93c2VyIGRlbCBkb3dubG9hZCB1dGlsaXp6YXJlICoqZ2V0RmlsZU5hdGl2ZSh1cmwsIHBhcnMpKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxEb3dubG9hZD59IE9ic2VydmFibGUgZGVpIHZhcmkgc3RlcCBkaSBwcm9ncmVzc28gZGVsIGRvd25sb2FkXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpbGVXaXRoUHJvZ3Jlc3ModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIGdldEZpbGVDYWxsYmFjazogKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBhbnkpOiBPYnNlcnZhYmxlPERvd25sb2FkPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdldmVudHMnLCByZXBvcnRQcm9ncmVzczogdHJ1ZSB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzY2FuKChwcmV2aW91czogRG93bmxvYWQsIGV2ZW50OiBIdHRwRXZlbnQ8QmxvYj4pOiBEb3dubG9hZCA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUHJvZ3Jlc3NFdmVudChldmVudCkpIHtcclxuICAgICAgICAgICAgbGV0IHByb2dyZXNzID0gZXZlbnQudG90YWwgPyAoZXZlbnQubG9hZGVkID4gZXZlbnQudG90YWwgPyAxMDAgOiBNYXRoLnJvdW5kKCgxMDAgKiBldmVudC5sb2FkZWQpIC8gZXZlbnQudG90YWwpKSA6IHByZXZpb3VzLnByb2dyZXNzO1xyXG4gICAgICAgICAgICByZXR1cm4geyBwcm9ncmVzczogcHJvZ3Jlc3MsIHN0YXRlOiAnSU5fUFJPR1JFU1MnLCBjb250ZW50OiBudWxsIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc0h0dHBSZXNwb25zZShldmVudCkpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJvZHkpIHtcclxuICAgICAgICAgICAgICBsZXQgY2Rpc3AgPSBldmVudC5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgIGxldCBjZGlzcEZpbGVuYW1lID0gY2Rpc3Auc3BsaXQoJzsnKVsxXS5zcGxpdCgnZmlsZW5hbWUnKVsxXS5zcGxpdCgnPScpWzFdLnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuICAgICAgICAgICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZXZlbnQuYm9keSk7XHJcbiAgICAgICAgICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgY2Rpc3BGaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IDEwMCwgc3RhdGU6ICdET05FJywgY29udGVudDogZXZlbnQuYm9keSB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgICAgIH0sIHsgc3RhdGU6ICdQRU5ESU5HJywgcHJvZ3Jlc3M6IDAsIGNvbnRlbnQ6IG51bGwgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBfKTogT2JzZXJ2YWJsZTxEb3dubG9hZD4gPT4geyByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKSB9KSxcclxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqL1xyXG4gICBwcml2YXRlIGlzSHR0cFJlc3BvbnNlPFQ+KGV2ZW50OiBIdHRwRXZlbnQ8VD4pOiBldmVudCBpcyBIdHRwUmVzcG9uc2U8VD4ge1xyXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXZlbnRvIEhUVFAgw6ggZGkgdGlwbyAqKkh0dHBQcm9ncmVzc0V2ZW50KiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICBwcml2YXRlIGlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQ6IEh0dHBFdmVudDx1bmtub3duPik6IGV2ZW50IGlzIEh0dHBQcm9ncmVzc0V2ZW50IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3MgfHwgZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzc1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGVsbCdpbml6aW8gZGkgdW5hIGNoaWFtYXRhIGFkIHVuIGNlcnRvIFVSTCwgdmllbmUgZ2VuZXJhdG8gdW4gR1VJRCBkYSBhc3NlZ25hcmNpLCBjb250cm9sbGF0YSBsYSBzY2FkZW56YSBkZWxsYSBjYWNoZSwgXHJcbiAgICogZSBldmVudHVhbG1lbnRlIGxvZ2dhdG8gaWwgZmF0dG8gY2hlIHN0YSBwZXIgZXNzZXJlIGVmZmV0dHVhdGEgdW5hIGNoaWFtYXRhIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVybCBhIGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gR1VJRCBhc3NlZ25hdG8gYWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVmYXVsdFN0YXJ0Q2FsbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5nZXRHVUlEKCk7XHJcbiAgICB0aGlzLmNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsKTtcclxuICAgIHRoaXMuY2FsbFN0YXR1c1tteUd1aWRdID0gdHJ1ZTtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU3RhcnRpbmcgY2FsbFwiKSArIFwiIFwiICsgbXlHdWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcImF0IFVSTFwiKSArIFwiOiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbXlHdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biB1cmwgdmVuZ29ubyBjb250cm9sbGF0ZSBsZSBpbmZvcm1hemlvbmkgc3UgdHV0dGkgZ2xpIHVybCBkYSBpbnZhbGlkYXJlIGNvbGxlZ2F0aSBhbGwndXJsIGNoaWFtYXRvIGUsIHNlIHByZXNlbnRpIGluIGNhY2hlLCBpbnZhbGlkYXRpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgcGVyIGN1aSBjb250cm9sbGFyZSBzZSBjaSBzb25vIGNoaWFtYXRlIGluIGNhY2hlIGRhIGludmFsaWRhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCBjYWNoZSA9IHRoaXMubG9jYWxTdG9yYWdlLnJldHJpZXZlTG9jYWw8YW55Pih0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgIGxldCBjYWNoZVRpbWUgPSB0bXAgPyB0bXBbMl0gOiBudWxsO1xyXG4gICAgbGV0IG5vcm1hbGl6ZWRVcmwgPSB1cmwucmVwbGFjZShcIiNjYWNoZVwiICsgKGNhY2hlVGltZSA/IFwiLVwiICsgY2FjaGVUaW1lIDogXCJcIiksIFwiXCIpLnJlcGxhY2UodGhpcy5CQUNLRU5EX1VSTCwgXCJcIik7XHJcblxyXG4gICAgaWYgKCFjYWNoZSB8fCAhdGhpcy5IVFRQX0lOVkFMSURBVElPTiB8fCAhdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBhcGlzVG9JbnZhbGlkYXRlOiBzdHJpbmdbXSA9IHRoaXMuSFRUUF9JTlZBTElEQVRJT05bbm9ybWFsaXplZFVybF07XHJcbiAgICBpZiAoIWFwaXNUb0ludmFsaWRhdGUgfHwgYXBpc1RvSW52YWxpZGF0ZS5sZW5ndGggPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGxldCBrZXlzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcbiAgICBhcGlzVG9JbnZhbGlkYXRlLmZvckVhY2goYXBpID0+IHtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gdGhpcy5tYWtlQ2FjaGVLZXkoYXBpLCBudWxsKTtcclxuICAgICAgZm9yIChsZXQgaXRlbSBpbiBjYWNoZSlcclxuICAgICAgICBpZiAoaXRlbS5pbmRleE9mKGNhY2hlS2V5KSAhPSAtMSlcclxuICAgICAgICAgIGtleXNUb1JlbW92ZS5wdXNoKGl0ZW0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzVG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGsgPSBrZXlzVG9SZW1vdmVbaV07XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiSW52bGFsaWRhdGluZyBjYWNoZSBlbGVtZW50XCIpICsgXCIgXCIgKyBrKTtcclxuICAgICAgZGVsZXRlIGNhY2hlW2tdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnN0b3JlTG9jYWwodGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIGNhY2hlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmFsaXp6YXppb25lIGRpIHVuYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIEdVSUQgY29sbGVnYXRvIGFsbGEgY2hpYW1hdGEgYXBwZW5hIHRlcm1pbmF0YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGVyc2lzdENhY2hlSWZJZGxlIEVmZmV0dHVhIGlsIHBlcnNpc3QgZGVsbGEgY2FjaGUgSFRUUCBzb2xvIHNlIG5vbiBjaSBzb25vIGFsdHJlIGNoaWFtYXRlIGluIGNvcnNvLCBwZXIgZXZpdGFyZVxyXG4gICAqIGNoZSBtaSBjYW1iaSBzb3R0byBsJ29nZ2V0dG8gZGkgY2FjaGUgbWVudHJlIHN0byBzYWx2YW5kbyBsZSBpbmZvcm1hemlvbmlcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHRyeUZpbmFsaXplQnlHdWlkKGd1aWQ6IHN0cmluZywgY2FjaGVJbmZvcz86IENhY2hlSW5mb3MpIHtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRmluYWxpemluZyBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggc3RhdHVzXCIpICsgXCI6IFwiICsgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSA/IHRoaXMubG9jKCdTdWNjZXNzJykgOiB0aGlzLmxvYygnRmFpbHVyZScpKSk7XHJcblxyXG4gICAgLy9BbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAvL2Ugcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSAmJiB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgIC8vSW4gb2duaSBjYXNvIHF1ZXN0YSBwb3NzbyByaW11b3ZlcmxhXHJcbiAgICBkZWxldGUgdGhpcy5jYWxsU3RhdHVzW2d1aWRdO1xyXG5cclxuICAgIC8vIFNlIHZlbmdvIGRhIHVuYSBjaGlhbWF0YSBjaGUgaGEgYWdnaW9ybmF0byBsYSBjYWNoZSBhIHRpbWVyIG8gZ2xvYmFsZSBtYXJjbyBpbCBmYXR0byBjaGUgcXVlbGxhIGNhY2hlIGRldidlc3NlcmUgYWdnaW9ybmF0YVxyXG4gICAgaWYgKGNhY2hlSW5mb3MgJiYgY2FjaGVJbmZvcy5jYWNoZSkge1xyXG4gICAgICB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCA9IHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8ICEhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiTWFya2luZyBjYWNoZSB0byBiZSBwZXJzaXN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgdW5hIGRlbGxlIGR1ZSBjYWNoZSBkZXZvbm8gZXNzZXJlIGFnZ2lvcm5hdGUgZSBub24gaG8gbmVzc3VuYSBjaGlhbWF0YSBpbiBjb3JzbyBlZmZldHR1byBsJ2FnZ2lvcm5hbWVudG8gaW4gYmFzZSBhIHF1YWxlIGRlbGxlIGR1ZSB2YSBhZ2dpb3JuYXRhXHJcbiAgICAvLyBBbGxhIGZpbmUgZGkgdHV0dG8gbWFyY28gY29tZSBmYXR0b1xyXG4gICAgaWYgKCh0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSAmJiBPYmplY3Qua2V5cyh0aGlzLmNhbGxTdGF0dXMpLmxlbmd0aCA9PSAwKSB7XHJcblxyXG4gICAgICB2YXIgdG9DYWxsID0gW107XHJcbiAgICAgIGxldCB0bXBLZXkgPSBcIlwiO1xyXG4gICAgICBpZiAodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5O1xyXG4gICAgICAgIHRvQ2FsbC5wdXNoKHRoaXMubG9jYWxTdG9yYWdlLnN0b3JlKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UucmV0cmlldmVMb2NhbCh0bXBLZXkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXk7XHJcbiAgICAgICAgdG9DYWxsLnB1c2godGhpcy5sb2NhbFN0b3JhZ2Uuc3RvcmUodG1wS2V5LCB0aGlzLmxvY2FsU3RvcmFnZS5yZXRyaWV2ZUxvY2FsKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJObyBtb3JlIEhUVFAgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIGVudGVyaW5nIGlkbGUgc3RhdGUgYW5kIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzLi4uXCIpKTtcclxuICAgICAgdmFyIHJldCA9IGF3YWl0IGZvcmtKb2luKHRvQ2FsbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXQpXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpKTtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBkYXRvIHVuIHVuaWNvIEZpbGUgbyB1bmEgbGlzdGEgZGkgRmlsZSBjcmVhIHVuIG9nZ2V0dG8gRm9ybURhdGEgY2hlIHB1w7IgZXNzZXJlIGludmlhdG8gY29tb2RhbWVudGUgXHJcbiAgICogYWQgdW4gYmFja2VuZCBBU1AuTkVUIGRhIGN1aSBzaSBwb3Ryw6AgYWNjZWRlcmUgYSBSZXF1ZXN0LkZvcm0uRmlsZXNcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0ZpbGUgfCBGaWxlW119IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIEZpbGUgbyBsaXN0YSBkaSBGaWxlLiBOLkI6IG5lbGxhIGZpcm1hIGRlbGxhIGZ1bnppb25lIHZpZW5lIGNvbnNpZGVyYXRvICoqYW55KiogcGVyIGZhcmUgdGVzdCBzdWxsZSBwcm9wcmlldMOgIFxyXG4gICAqIGludmVjZSBjaGUgZmFyZSB0ZXN0IGNvbiBsJyoqaXN0YW5jZW9mKipcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IEZvcm1EYXRhIGNvbnRlbmVudGUgdHV0dGkgaSBmaWxlIHBhc3NhdGlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlOiBhbnkpOiBGb3JtRGF0YSB7XHJcbiAgICB2YXIgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgaWYgKGZpbGVBcnJheU9yRmlsZSkge1xyXG4gICAgICBpZiAoZmlsZUFycmF5T3JGaWxlLmxlbmd0aClcclxuICAgICAgICBmaWxlQXJyYXlPckZpbGUuZm9yRWFjaCh0ID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCB0LCB0Lm5hbWUpOyB9KTtcclxuICAgICAgZWxzZSBpZiAoZmlsZUFycmF5T3JGaWxlLm5hbWUpXHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZUFycmF5T3JGaWxlLCBmaWxlQXJyYXlPckZpbGUubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBkaXNwb25pYmlsaSBnZW5lcmEgZ2xpIEhlYWRlciBIVFRQIHBlciBsYSBjaGlhbWF0YSBkYSBlZmZldHR1YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQ29udGVudC1UeXBlXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkFjY2VwdFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUF1dGggSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBdXRob3JpemF0aW9uXCIsIHZhbG9yaXp6YXRvIGNvbCB0b2tlbiByZWN1cGVyYXRvIGRhbGwnaG9vayAqKnJldHJpZXZlQWNjZXNzVG9rZW4qKiBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbklkIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiWC1UWC1JRFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtIdHRwSGVhZGVyc30gSGVhZGVyIGdlbmVyYXRpIGluIGJhc2UgYWkgcGFyYW1ldHJpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHRyYW5zYWN0aW9uSWQgPSBcIlwiLCBpbmNsdWRlQXV0aDogYm9vbGVhbiA9IHRydWUsIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIiwgYWNjZXB0OiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IEh0dHBIZWFkZXJzIHtcclxuICAgIHZhciBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICB2YXIgYXV0aHRva2VuID0gdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUFjY2Vzc1Rva2VuKCk7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xyXG5cclxuICAgIGlmICh0cmFuc2FjdGlvbklkKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJYLVRYLUlEXCIsIHRyYW5zYWN0aW9uSWQpO1xyXG5cclxuICAgIGlmIChhdXRodG9rZW4gJiYgaW5jbHVkZUF1dGgpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBhdXRodG9rZW4pO1xyXG5cclxuICAgIGlmIChhY2NlcHQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQWNjZXB0LUxhbmd1YWdlXCIsIHRoaXMuTE9DQUxFID8/ICdpdC1JVCcpO1xyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aW9uZSBkaSBkZWZhdWx0IGRlZ2xpIGVycm9yaVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIG9uRXJyb3IocmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IFR5cGVFcnJvciwgZ3VpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0gPSBmYWxzZTtcclxuXHJcbiAgICAvL01pIGFzc2ljdXJvIGNoZSB0dXR0aSBnbGkgZXJyb3JpIGR1cmFudGUgaWwgcmVkaXJlY3QgYWwgbG9naW4gdmVuZ2FubyBpZ25vcmF0aVxyXG4gICAgaWYgKHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZFJlZGlyZWN0aW5nVG9Mb2dpbigpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVkaXJlY3RpbmcgdG8gTG9naW4sIGlnbm9yaW5nIEhUVFAgZXJyb3Igb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL01pIGFzc2ljdXJvIGNoZSB2ZW5nYSBnZXN0aXRvIHVuIHNvbG8gZXJyb3JlIHBlciB2b2x0YVxyXG4gICAgaWYgKHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZEhhbmRsaW5nRXJyb3JTdGF0dXMoKSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkFscmVhZHkgSGFuZGxpbmcgYW4gZXJyb3IsIGlnbm9yaW5nIEhUVFAgZXJyb3Igb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZUhhbmRsaW5nRXJyb3JTdGF0dXModHJ1ZSk7XHJcblxyXG4gICAgbGV0IGZpbmFsRXJyb3IgPSBcIlwiO1xyXG4gICAgbGV0IGZpbmFsU3RhdHVzID0gXCJcIjtcclxuICAgIGlmICh0aGlzLmlzVHlwZUVycm9yKHJlcykpIHtcclxuICAgICAgZmluYWxFcnJvciA9IHJlcy5tZXNzYWdlO1xyXG4gICAgICBmaW5hbFN0YXR1cyA9IFwiSFRUUCBTZXJ2aWNlIEludGVybmFsIEVycm9yXCI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmlzSHR0cEVycm9yUmVzcG9uc2UocmVzKSkge1xyXG5cclxuICAgICAgZmluYWxFcnJvciA9IGF3YWl0IHRoaXMuZ2V0SHR0cEVycm9yVGV4dChyZXMuZXJyb3IpO1xyXG4gICAgICBmaW5hbFN0YXR1cyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAocmVzLnN0YXR1cykge1xyXG4gICAgICAgIC8vIFVuYXV0aG9yaXplZFxyXG4gICAgICAgIGNhc2UgNDAxOlxyXG4gICAgICAgICAgaWYgKHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZFJlZGlyZWN0aW9uU3RhdHVzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0MDEgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcInJlZGlyZWN0aW5nIHRvIGxvZ2luLlwiKSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXModHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3RpbmdUb0xvZ2luKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWRpcmVjdFRvTG9naW4oKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBIYW5kbGVkIGV4Y2VwdGlvblxyXG4gICAgICAgIGNhc2UgNDAwOlxyXG4gICAgICAgIC8vIE5vIFBlcm1pc3Npb25zXHJcbiAgICAgICAgY2FzZSA0MDM6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIE5vdCBmb3VuZFxyXG4gICAgICAgIGNhc2UgNDA0OlxyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVCbG9ja2luZ0V4Y2VwdGlvbihyZXMuc3RhdHVzLCB0aGlzLmxvYyhcIlJlc291cmNlIG5vdCBmb3VuZFwiKSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90Q29uZmlndXJlZEV4Y2VwdGlvblxyXG4gICAgICAgIGNhc2UgNDQ0OlxyXG4gICAgICAgICAgaWYgKHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZFJlZGlyZWN0aW9uU3RhdHVzKCkpXHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDQ0IG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCByZWRpcmVjdCBhbHJlYWR5IGluIHByb2dyZXNzLiBJZ25vcmluZyB0aGlzIGV2ZW50XCIpKTtcclxuICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZU5vdENvbmZpZ3VyZWRFeGNlcHRpb24oKSlcclxuICAgICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVCbG9ja2luZ0V4Y2VwdGlvbihyZXMuc3RhdHVzLCBmaW5hbEVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICBmaW5hbEVycm9yID0gXCJTZXJ2ZXIgbWlnaHQgYmUgb2ZmbGluZVwiICsgKHJlcy5zdGF0dXNUZXh0ID8gXCIgKFwiICsgcmVzLnN0YXR1c1RleHQgKyBcIikgXCIgOiBcIlwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlRXhjZXB0aW9uKGZpbmFsU3RhdHVzLCBmaW5hbEVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gZXJyb3JlIHJlc3RpdHVpc2NlIHVuYSBwcm9taXNlIGNvbiBsYSBzdHJpbmdhIGZpbmFsZSBkZWxsJ2Vycm9yZSBpbiBtb2RvIGRhIHBvdGVyIGZhcmUgdW4gYXdhaXRcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFByb21pc2UgY2hlIHJpc29sdmUgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIdHRwRXJyb3JUZXh0KGVycjogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIC8vIFNlIGhvIHVuIEJsb2IgcHXDsiBlc3NlcmUgbyB1biBDYWxsUmVzdWx0IG8gc3VwcG9uZ28gdW5hIHNlbXBsaWNlIHN0cmluZ2EsXHJcbiAgICAvLyBhbHRyaW1lbnRpIHBvdHJlYmJlIGVzc2VyZSBkaXJldHRhbWVudGUgdW4gQ2FsbFJlc3VsdCwgb3BwdXJlIHVuYSBzZW1wbGljZSBzdHJpbmdhXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgIGxldCBlcnJNc2cgPSAoPGFueT5lLnRhcmdldCkucmVzdWx0O1xyXG4gICAgICAgICAgbGV0IGpzb25lcnJNc2c6IGFueTtcclxuICAgICAgICAgIHRyeSB7IGpzb25lcnJNc2cgPSBKU09OLnBhcnNlKGVyck1zZyk7IH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoanNvbmVyck1zZyAmJiB0aGlzLmlzQ2FsbFJlc3VsdChqc29uZXJyTXNnKSA/IGpzb25lcnJNc2cuZXJyb3IubWVzc2FnZSA6IGVyck1zZyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzVGV4dChlcnIpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5pc0NhbGxSZXN1bHQoZXJyKSlcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShlcnIuZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShlcnI/LnRvU3RyaW5nKCkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdvZ2dldHRvIMOoIGRpIHRpcG8gKipDYWxsUmVzdWx0KiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNDYWxsUmVzdWx0KGVycjogYW55KTogZXJyIGlzIHsgZXJyb3I6IHsgbWVzc2FnZTogc3RyaW5nIH0gfSB7XHJcbiAgICByZXR1cm4gISFlcnI/LmVycm9yPy5tZXNzYWdlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipIdHRwRXJyb3JSZXNwb25zZSoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzSHR0cEVycm9yUmVzcG9uc2UoZXJyOiBhbnkpOiBlcnIgaXMgSHR0cEVycm9yUmVzcG9uc2Uge1xyXG4gICAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2Vycm9yZSDDqCBkaSB0aXBvICoqVHlwZUVycm9yKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNUeXBlRXJyb3IoZXJyOiBhbnkpOiBlcnIgaXMgVHlwZUVycm9yIHtcclxuICAgIHJldHVybiBlcnIubmFtZSA9PSBcIlR5cGVFcnJvclwiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tZSBkaWNlIGlsIG5vbWUsIHJlZ2lzdHJhIHVuIGVycm9yZSBlIHJlc3RpdHVpc2NlIHVuIE9ic2VydmFibGUgdnVvdG8gY29tZSByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZ2VzdGlyZSBsJ2Vycm9yZSB2aWEgbGlicmVyaWEgbyBzZSBsaW1pdGFyc2kgYSByZXN0aXR1aXJlIGwnT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59IE9ic2VydmFibGUgdnVvdG9cclxuICAgKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUocmVzOiBhbnksIGd1aWQ6IHN0cmluZywgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmIChoYW5kbGVFcnJvcilcclxuICAgICAgdGhpcy5vbkVycm9yKHJlcywgZ3VpZCk7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKCkgPT4geyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdG8gdW4gVXJsIGUgZGVpIHBhcmFtZXRyaSBjZXJjYSBkaSByZWN1cGVyYXJlIGwnZXZlbnR1YWxlIG9nZ2V0dG8gZ2nDoCBzYWx2YXRvIGluIGNhY2hlIGNvbiBsZSBpbmZvcm1hemlvbmkgYmFzZSBkZWxsYSBjYWNoZSBzdGVzc2FcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YSAobnVsbGkgaW4gY2FzbyBkaSBQT1NUKVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtDYWNoZUluZm9zfSBPZ2dldHRvIGNvbnRlbmVudGUgbGUgaW5mb3JtYXppb25pIHN1bGxhIGNhY2hlIHBlciBsJ29nZ2V0dG8gc3BlY2lmaWNhdG9cclxuICAgKi9cclxuICBwcml2YXRlIHRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBDYWNoZUluZm9zIHtcclxuXHJcbiAgICBsZXQgY2FjaGluZ0tleSA9IG51bGwsIGNhY2hlVGltZSA9IG51bGwsIGNhY2hlID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UucmV0cmlldmVMb2NhbChjYWNoZUtleSk7XHJcbiAgICAgIGxldCBjYWNoZSA9IGNhY2hlTHMgPyBjYWNoZUxzIDoge307XHJcblxyXG4gICAgICBpZiAoY2FjaGUgJiYgY2FjaGVbY2FjaGluZ0tleV0gJiYgIXRoaXMudGltZWRDYWNoZUl0ZW1FeHBpcmVkKGNhY2hlW2NhY2hpbmdLZXldKSkge1xyXG4gICAgICAgIC8vIFNlIGdlc3Rpc2NvIGlsIHRlbXBvIGVzYXR0byBkZWxsYSBjYWNoZSBwcmltYSBkaSByZXN0aXR1aXJlIGwnb2dnZXR0byBjYWNoYXRvIGxvIHJpcHVsaXNjbyBcclxuICAgICAgICAvLyBkYWxsZSBwcm9wcmlldMOgIGludGVybmUgY2hlIGdsaSBobyBhZ2dpdW50byBwZXIgY29udHJvbGxhcm5lIGxhIHNjYWRlbnphXHJcbiAgICAgICAgaWYgKGNhY2hlVGltZSlcclxuICAgICAgICAgIGRlbGV0ZSBjYWNoZVtjYWNoaW5nS2V5XS5fX2V4cGlyZTtcclxuXHJcbiAgICAgICAgaXRlbSA9IGNhY2hlW2NhY2hpbmdLZXldXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IENhY2hlSW5mb3ModXJsLCB1c2VDYWNoaW5nLCBjYWNoaW5nS2V5LCBjYWNoZVRpbWUsIGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLnJldHJpZXZlTG9jYWwoY2FjaGVLZXkpO1xyXG4gICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICBjYWNoZVtjYWNoZUluZm9zLmNhY2hlS2V5XSA9IGl0ZW07XHJcbiAgICBpZiAoY2FjaGVJbmZvcy5jYWNoZVRpbWUpXHJcbiAgICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldLl9fZXhwaXJlID0gZGF5anMoKS5hZGQoY2FjaGVJbmZvcy5jYWNoZVRpbWUsIFwic2Vjb25kc1wiKTtcclxuXHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zdG9yZUxvY2FsKGNhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIGxlIGNoaWFtYXRlIHNlbnphIGV4cGlyZSB0aW1lIMOoIHNjYWR1dGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bnRpbWVkQ2FjaGVFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkpKTtcclxuICAgIHJldHVybiAhZXhwaXJlIHx8IGV4cGlyZSAmJiBkYXlqcyhleHBpcmUpIDwgZGF5anMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBzZSBsYSBjYWNoZSBwZXIgdW5hIGNoaWFtYXRhIGNoZSBoYSB1biB0ZW1wbyBkaSB2aXRhIGJlbiBkZWZpbml0byDDqCBzY2FkdXRhIG8gbWVub1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gcmVjdXBlcmF0byBkYWxsYSBjYWNoZSBhIGN1aSBobyBhZ2dpdW50byBsYSBjaGlhdmUgaW50ZXJuYSBfX2V4cGlyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsYSBjYWNoZSDDqCBzY2FkdXRhIGUgZGV2J2Vzc2VyZSByaXB1bGl0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgKi9cclxuICBwcml2YXRlIHRpbWVkQ2FjaGVJdGVtRXhwaXJlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXlqcyhpdGVtLl9fZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZSBpbXBvc3RhIGxhIHByb3NzaW1hIHNjYWRlbnphIGFkIGFkZXNzbyArICoqQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MqKiAodG9rZW4gdmFsb3JpenphdG8gaW4gZmFzZSBkaSBjb25maWd1cmF6aW9uZSBkYWxsYSBwcm9wcmlldMOgICoqY2xpZW50Q2FjaGVEdXJhdGlvblMqKiBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZU1vZHVsZUNvbmZpZyoqKVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCkge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc3RvcmUodGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS5zdWJzY3JpYmUoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TID8/IDM2MDAsIFwic2Vjb25kXCIpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZGVsbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRpIGV4cGlyZSBkZWZpbml0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldEh0dHBUaW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnN0b3JlKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIHt9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gICBwcml2YXRlIG1ha2VDYWNoZUtleSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIGxldCBhdXRoS2V5UGFydCA9ICh0aGlzLm1lID8gdGhpcy5tZS5JZHRlbmFudCA6IFwiXCIpICsgKHRoaXMubWUgJiYgdGhpcy5DQUNIRV9CWV9VU0VSID8gdGhpcy5tZS5JZFVzZXIgOiBcIlwiKTtcclxuICAgIGxldCBwYXJhbXNLZXlQYXJ0ID0gcGFyYW1zICYmIHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCA/IHBhcmFtcy5rZXlzKCkucmVkdWNlKChwcmV2OiBhbnksIG5leHQ6IGFueSkgPT4gcHJldiArIFwiLFwiICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIFwiX1wiICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihcImFwaVwiKSArIDQpICsgXCI/XCIgKyBwYXJhbXNLZXlQYXJ0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhemlvbmUgR1VJRFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE51b3ZvIEdVSUQgZ2VuZXJhdG8gaW4gbWFuaWVyYSBjYXN1YWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzY3JpdmVyZSBsb2cgYSBjb25zb2xlIHF1YWxvcmEgKipERUJVR19NT0RFKiogcmlzdWx0YXNzZSAqKnRydWUqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkaSBsb2dcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkRFQlVHX01PREUpXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQGh0dHBzZXJ2aWNlOiBcIiArIG1lc3NhZ2UpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgcGVyIGxhIGxvY2FsaXp6YXppb25lIGRlaSBtZXNzYWdnaVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkYSBsb2NhbGl6emFyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE1lc3NhZ2dpbyBsb2NhbGl6emF0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9jKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIUxvY1ttZXNzYWdlXSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJVbnRyYW5zbGF0ZWQgbWVzc2FnZTogXCIgKyBtZXNzYWdlKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBMb2NbbWVzc2FnZV1bdGhpcy5MT0NBTEVdO1xyXG4gIH1cclxufSJdfQ==
|