@esfaenza/httpservice 13.3.1 → 13.4.1

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.
@@ -2,8 +2,8 @@
2
2
  import { HttpErrorResponse, HttpEventType, HttpHeaders } from "@angular/common/http";
3
3
  import { Injectable, Inject, Optional } from "@angular/core";
4
4
  // Direttive, Componenti, Librerie
5
- import { catchError, delay, finalize, map, scan } from "rxjs/operators";
6
- import { forkJoin, Observable, of, throwError } from "rxjs";
5
+ import { catchError, concatMap, delay, finalize, map, scan } from "rxjs/operators";
6
+ import { forkJoin, from, Observable, of, throwError } from "rxjs";
7
7
  // Chiamate ai Repository / tokens
8
8
  import { HTTP_INVALIDATION, CLIENT_CACHE_DURATION_S, BACKEND_URL, HTTP_LOCALE, APP_NAME, CACHE_BY_USER, DEBUG_MODE } from './tokens';
9
9
  // Modelli
@@ -14,6 +14,7 @@ import * as i0 from "@angular/core";
14
14
  import * as i1 from "./config/HttpServiceExtensions";
15
15
  import * as i2 from "@angular/common/http";
16
16
  import * as i3 from "@esfaenza/preferences";
17
+ import * as i4 from "@esfaenza/extensions";
17
18
  /**
18
19
  * Servizio utilizzato per effettuare qualsiasi tipo di chiamata HTTP dall'applicazione, gestisce errori e cache delle risposte nativamente e ne può essere
19
20
  * esteso/modificato il comportamento implementando la classe di "hook" **IHttpServiceExtensions** e registrandola nel provider della classe **HttpServiceExtensions**
@@ -22,7 +23,7 @@ export class HTTPService {
22
23
  /**
23
24
  * @ignore
24
25
  */
25
- constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http, localStorage) {
26
+ constructor(BACKEND_URL, EXTENSION_CLASS, HTTP_INVALIDATION, LOCALE, APP_NAME, CLIENT_CACHE_DURATION_S, CACHE_BY_USER, DEBUG_MODE, http, localStorage, utisExts) {
26
27
  this.BACKEND_URL = BACKEND_URL;
27
28
  this.EXTENSION_CLASS = EXTENSION_CLASS;
28
29
  this.HTTP_INVALIDATION = HTTP_INVALIDATION;
@@ -33,6 +34,7 @@ export class HTTPService {
33
34
  this.DEBUG_MODE = DEBUG_MODE;
34
35
  this.http = http;
35
36
  this.localStorage = localStorage;
37
+ this.utisExts = utisExts;
36
38
  /** Cache dello stato delle chiamate HTTP attualmente effettuate. Ogni chiamata è rappresentata da un GUID e lo status assume valore **false** solo sugli errori */
37
39
  this.callStatus = {};
38
40
  /** Nome della cache in cui vengono storicizzate le informazioni sulle risposte delle chiamate sotto forma di dictionary */
@@ -90,25 +92,27 @@ export class HTTPService {
90
92
  * @returns {Observable<T>} Observable che contiene il risultato della chiamata
91
93
  */
92
94
  get(url, params = null, transaction = "", succesfulResultMandatory = true, errorCallback = null) {
93
- let myGuid = this.defaultStartCall(url);
94
- let cachedInfos = this.tryGetCacheInformations(url, params);
95
- if (cachedInfos.cache && cachedInfos.cacheItem) {
96
- this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
97
- return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
98
- }
99
- var httpCall = this.http.get(cachedInfos.finalUrl, { headers: this.getHeaders(transaction), params: params });
100
- return httpCall.pipe(map((res) => {
101
- let responseItem = res;
102
- if (cachedInfos.cache) {
103
- this.cacheResponse(responseItem, cachedInfos);
104
- this.log(this.loc("Cached result for") + " " + url);
95
+ // TODO provare e testare
96
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
97
+ let cachedInfos = this.tryGetCacheInformations(url, params);
98
+ if (cachedInfos.cache && cachedInfos.cacheItem) {
99
+ this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
100
+ return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
105
101
  }
106
- return responseItem;
107
- }), catchError((err, caught) => {
108
- if (errorCallback)
109
- errorCallback();
110
- return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
111
- }), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
102
+ var httpCall = this.http.get(cachedInfos.finalUrl, { headers: this.getHeaders(transaction), params: params });
103
+ return httpCall.pipe(map((res) => {
104
+ let responseItem = res;
105
+ if (cachedInfos.cache) {
106
+ this.cacheResponse(this.utisExts.deepClone(responseItem), cachedInfos);
107
+ this.log(this.loc("Cached result for") + " " + url);
108
+ }
109
+ return responseItem;
110
+ }), catchError((err, caught) => {
111
+ if (errorCallback)
112
+ errorCallback();
113
+ return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
114
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
115
+ }));
112
116
  }
113
117
  /**
114
118
  * Esecuzione di una GET HTTP con eventualmente la gestione della cache qualora la chiamata termini con la convenzione "#cache"
@@ -126,24 +130,25 @@ export class HTTPService {
126
130
  * @returns {Observable<Blob | ArrayBuffer>} Observable che contiene il risultato della chiamata
127
131
  */
128
132
  getRaw(url, params = null, type = "arraybuffer", transaction = "", succesfulResultMandatory = true, errorCallback = null) {
129
- let myGuid = this.defaultStartCall(url);
130
- let cachedInfos = this.tryGetCacheInformations(url, params);
131
- if (cachedInfos.cache && cachedInfos.cacheItem) {
132
- this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
133
- return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
134
- }
135
- var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: type, headers: this.getHeaders(transaction), params: params });
136
- return httpCall.pipe(map((blob) => {
137
- if (cachedInfos.cache) {
138
- this.cacheResponse(blob, cachedInfos);
139
- this.log(this.loc("Cached result for") + " " + url);
133
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
134
+ let cachedInfos = this.tryGetCacheInformations(url, params);
135
+ if (cachedInfos.cache && cachedInfos.cacheItem) {
136
+ this.log(this.loc("Result for") + " " + url + " " + this.loc("retrieved from cache"));
137
+ return of(cachedInfos.cacheItem).pipe(delay(0), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
140
138
  }
141
- return blob;
142
- }), catchError((err, caught) => {
143
- if (errorCallback)
144
- errorCallback();
145
- return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
146
- }), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
139
+ var httpCall = this.http.get(cachedInfos.finalUrl, { responseType: type, headers: this.getHeaders(transaction), params: params });
140
+ return httpCall.pipe(map((blob) => {
141
+ if (cachedInfos.cache) {
142
+ this.cacheResponse(blob, cachedInfos);
143
+ this.log(this.loc("Cached result for") + " " + url);
144
+ }
145
+ return blob;
146
+ }), catchError((err, caught) => {
147
+ if (errorCallback)
148
+ errorCallback();
149
+ return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
150
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid, cachedInfos); }));
151
+ }));
147
152
  }
148
153
  /**
149
154
  * Esecuzione di una POST HTTP
@@ -158,14 +163,12 @@ export class HTTPService {
158
163
  * @returns {Observable<T>} Observable che contiene il risultato della chiamata
159
164
  */
160
165
  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); }));
166
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
167
+ var httpCall = this.http.post(url, bodyData, { headers: this.getHeaders(transaction), params: params });
168
+ return httpCall.pipe(catchError((err, caught) => {
169
+ return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
170
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
171
+ }));
169
172
  }
170
173
  /**
171
174
  * Esecuzione di una DELETE HTTP
@@ -179,14 +182,12 @@ export class HTTPService {
179
182
  * @returns {Observable<T>} Observable che contiene il risultato della chiamata
180
183
  */
181
184
  delete(url, params = null, transaction = "", succesfulResultMandatory = true) {
182
- let myGuid = this.defaultStartCall(url);
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); }));
185
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
186
+ var httpCall = this.http.delete(url, { headers: this.getHeaders(transaction), params: params });
187
+ return httpCall.pipe(catchError((err, caught) => {
188
+ return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
189
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
190
+ }));
190
191
  }
191
192
  /**
192
193
  * Esecuzione di una PUT HTTP
@@ -201,14 +202,12 @@ export class HTTPService {
201
202
  * @returns {Observable<T>} Observable che contiene il risultato della chiamata
202
203
  */
203
204
  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 });
206
- return httpCall.pipe(map((res) => {
207
- let responseItem = res;
208
- return responseItem;
209
- }), catchError((err, caught) => {
210
- return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
211
- }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
205
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
206
+ var httpCall = this.http.put(url, bodyData, { headers: this.getHeaders(transaction), params: params });
207
+ return httpCall.pipe(catchError((err, caught) => {
208
+ return !succesfulResultMandatory ? throwError(err) : this.registerErrorAndReturnEmptyObservable(err, myGuid);
209
+ }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
210
+ }));
212
211
  }
213
212
  /**
214
213
  * Esecuzione di una POST HTTP
@@ -221,12 +220,13 @@ export class HTTPService {
221
220
  *
222
221
  * @returns {Observable<T>} Observable che contiene il risultato della chiamata
223
222
  */
224
- postwithFiles(url, bodyData, fileArrayOrFile) {
225
- let myGuid = this.defaultStartCall(url);
226
- var formData = this.getFilesFormData(fileArrayOrFile);
227
- formData.append("body", JSON.stringify(bodyData));
228
- var httpCall = this.http.post(url, formData, { headers: this.getHeaders(null, true, null, null) });
229
- return httpCall.pipe(catchError((err, caught) => { return this.registerErrorAndReturnEmptyObservable(err, myGuid); }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
223
+ postwithFiles(url, bodyData, fileArrayOrFile, params = null) {
224
+ return from([this.defaultStartCall(url)]).pipe(concatMap((myGuid) => {
225
+ var formData = this.getFilesFormData(fileArrayOrFile);
226
+ formData.append("body", JSON.stringify(bodyData));
227
+ var httpCall = this.http.post(url, formData, { params: params, headers: this.getHeaders(null, true, null, null) });
228
+ return httpCall.pipe(catchError((err, caught) => { return this.registerErrorAndReturnEmptyObservable(err, myGuid); }), finalize(() => { this.tryFinalizeByGuid(myGuid); }));
229
+ }));
230
230
  }
231
231
  /**
232
232
  * Esecuzione di una POST HTTP
@@ -289,7 +289,12 @@ export class HTTPService {
289
289
  * @param {HttpParams} params Parametri della chiamata
290
290
  */
291
291
  getFileNative(url, params = null) {
292
- let finalUrl = url + (params ? "?" + params.toString() : "");
292
+ // Encodo tutti i parametri per evitare casi particolari
293
+ // var encodedParams = new HttpParams();
294
+ // let parKeys = params.keys();
295
+ // for (let i = 0; i < parKeys.length; i++)
296
+ // encodedParams = encodedParams.set(parKeys[i], encodeURIComponent(params.get(parKeys[i])));
297
+ let finalUrl = url + (params ? "?" + params.toString().replace(/\+/g, '%2b') : "");
293
298
  window.location.href = finalUrl;
294
299
  }
295
300
  /**
@@ -387,17 +392,20 @@ export class HTTPService {
387
392
  * che mi cambi sotto l'oggetto di cache mentre sto salvando le informazioni
388
393
  */
389
394
  async tryFinalizeByGuid(guid, cacheInfos) {
390
- this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));
391
- // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
392
- // e riiniziare a valutare errori di javashit
393
- if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())
394
- this.ExtensionsImpl.writeRedirectionStatus(false);
395
- // Aggiungo la chiamata alla lista delle ultime 3 completate
396
- this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url);
397
- if (this.LastThreeCompletedCalls.length > 3)
398
- this.LastThreeCompletedCalls.pop();
399
- // In ogni caso questa posso rimuoverla
400
- delete this.callStatus[guid];
395
+ this.log(this.loc("Finalizing call") + " " + guid + " " + this.loc("with status") + ": " + (!this.callStatus[guid] ? 'Unknown' : this.callStatus[guid].success ? this.loc('Success') : this.loc('Failure')));
396
+ // TODO: Perdere 3-4 ore per capire perché ogni tanto arriva null in casi pesanti di Observable spammati a random
397
+ if (this.callStatus[guid]) {
398
+ // Alla prima chiamata buona, significa che almeno il login ce l'ho. Posso mettermi in modalità redirectInProgress false
399
+ // e riiniziare a valutare errori di javashit
400
+ if (this.callStatus[guid].success && this.ExtensionsImpl.readRedirectionStatus())
401
+ this.ExtensionsImpl.writeRedirectionStatus(false);
402
+ // Aggiungo la chiamata alla lista delle ultime 3 completate
403
+ this.LastThreeCompletedCalls.unshift(this.callStatus[guid].url);
404
+ if (this.LastThreeCompletedCalls.length > 3)
405
+ this.LastThreeCompletedCalls.pop();
406
+ // In ogni caso questa posso rimuoverla
407
+ delete this.callStatus[guid];
408
+ }
401
409
  // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
402
410
  if (cacheInfos && cacheInfos.cache) {
403
411
  this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;
@@ -612,7 +620,7 @@ export class HTTPService {
612
620
  * @returns {CacheInfos} Oggetto contenente le informazioni sulla cache per l'oggetto specificato
613
621
  */
614
622
  tryGetCacheInformations(url, params) {
615
- let cachingKey = null, cacheTime = null, cache = null, item = null;
623
+ let cachingKey = null, cacheTime = null, item = null;
616
624
  let useCaching = !!(/#cache/gi.exec(url));
617
625
  if (useCaching) {
618
626
  let tmp = /#cache(:?-(\d+))/gi.exec(url);
@@ -632,7 +640,8 @@ export class HTTPService {
632
640
  item = cache[cachingKey];
633
641
  }
634
642
  }
635
- return new CacheInfos(url, useCaching, cachingKey, cacheTime, item);
643
+ // Per assicurarmi che il rifeirmento degli oggetti sia diverso utilizzo il deepClone
644
+ return new CacheInfos(url, useCaching, cachingKey, cacheTime, this.utisExts.deepClone(item));
636
645
  }
637
646
  /**
638
647
  * Inserisce un oggetto nella cache appropriata in base alle informazioni contenute nel parametro **cacheInfos**
@@ -729,9 +738,9 @@ export class HTTPService {
729
738
  return Loc[message][this.LOCALE];
730
739
  }
731
740
  }
732
- HTTPService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: HTTPService, deps: [{ token: BACKEND_URL }, { token: i1.HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: HTTP_LOCALE, optional: true }, { token: APP_NAME, optional: true }, { token: CLIENT_CACHE_DURATION_S, optional: true }, { token: CACHE_BY_USER, optional: true }, { token: DEBUG_MODE, optional: true }, { token: i2.HttpClient }, { token: i3.PreferencesService }], target: i0.ɵɵFactoryTarget.Injectable });
733
- HTTPService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: HTTPService });
734
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: HTTPService, decorators: [{
741
+ HTTPService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService, deps: [{ token: BACKEND_URL }, { token: i1.HttpServiceExtensions }, { token: HTTP_INVALIDATION, optional: true }, { token: HTTP_LOCALE, optional: true }, { token: APP_NAME, optional: true }, { token: CLIENT_CACHE_DURATION_S, optional: true }, { token: CACHE_BY_USER, optional: true }, { token: DEBUG_MODE, optional: true }, { token: i2.HttpClient }, { token: i3.CacheService }, { token: i4.UtilityService }], target: i0.ɵɵFactoryTarget.Injectable });
742
+ HTTPService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService });
743
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService, decorators: [{
735
744
  type: Injectable
736
745
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
737
746
  type: Inject,
@@ -766,5 +775,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
766
775
  }, {
767
776
  type: Inject,
768
777
  args: [DEBUG_MODE]
769
- }] }, { type: i2.HttpClient }, { type: i3.PreferencesService }]; } });
770
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQStDLE1BQU0sc0JBQXNCLENBQUM7QUFDekosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzdELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJJLFdBQVc7QUFDWCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQVFqRDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sV0FBVztJQTJCdEI7O09BRUc7SUFDSCxZQUMrQixXQUFXLEVBQ2hDLGVBQXNDLEVBQ0MsaUJBQWlCLEVBQ3ZCLE1BQU0sRUFDVCxRQUFRLEVBQ08sdUJBQXVCLEVBQ2pDLGFBQXNCLEVBQ3pCLFVBQW1CLEVBQ25ELElBQWdCLEVBQ2hCLFlBQWdDO1FBVFgs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clxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBQcm9ncmVzc0V2ZW50LCBIdHRwUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFcyBGYWVuemFcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9wcmVmZXJlbmNlc1wiO1xyXG5cclxuLy8gRGlyZXR0aXZlLCBDb21wb25lbnRpLCBMaWJyZXJpZVxyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgZmluYWxpemUsIG1hcCwgc2NhbiB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLy8gQ2hpYW1hdGUgYWkgUmVwb3NpdG9yeSAvIHRva2Vuc1xyXG5pbXBvcnQgeyBIVFRQX0lOVkFMSURBVElPTiwgQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MsIEJBQ0tFTkRfVVJMLCBIVFRQX0xPQ0FMRSwgQVBQX05BTUUsIENBQ0hFX0JZX1VTRVIsIERFQlVHX01PREUgfSBmcm9tICcuL3Rva2Vucyc7XHJcblxyXG4vLyBNb2RlbGxpIFxyXG5pbXBvcnQgeyBIdHRwU2VydmljZUV4dGVuc2lvbnMgfSBmcm9tICcuL2NvbmZpZy9IdHRwU2VydmljZUV4dGVuc2lvbnMnO1xyXG5pbXBvcnQgeyBEb3dubG9hZCB9IGZyb20gJy4vbW9kZWxzL0Rvd25sb2FkJztcclxuaW1wb3J0IHsgTG9jIH0gZnJvbSAnLi9odHRwc2VydmljZS5zZXJ2aWNlLmxvYyc7XHJcbmltcG9ydCB7IENhY2hlSW5mb3MgfSBmcm9tIFwiLi9tb2RlbHMvQ2FjaGVJbmZvc1wiO1xyXG5cclxuLyoqXHJcbiAqIERpY2hpYXJhemlvbmUgZGVsbGEgdmFyaWFiaWxlIGdsb2JhbGUgZGF5anMuIEwnb25lcmUgZGkgXCJjcmVhcmxhXCIgw6ggYWZmaWRhdG8gYWxsJ2FwcGxpY2F6aW9uZSBjaGUgdXRpbGl6emEgcXVlc3RhIGxpYnJlcmlhLCBcclxuICogY2hlIGRvdnLDoCBpbXBvcnRhcmUgbG8gc2NyaXB0IGdsb2JhbGUgZGkgZGF5anMgbmVsbGEgQ0xJXHJcbiAqL1xyXG5kZWNsYXJlIHZhciBkYXlqczogYW55O1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpemlvIHV0aWxpenphdG8gcGVyIGVmZmV0dHVhcmUgcXVhbHNpYXNpIHRpcG8gZGkgY2hpYW1hdGEgSFRUUCBkYWxsJ2FwcGxpY2F6aW9uZSwgZ2VzdGlzY2UgZXJyb3JpIGUgY2FjaGUgZGVsbGUgcmlzcG9zdGUgbmF0aXZhbWVudGUgZSBuZSBwdcOyIGVzc2VyZSBcclxuICogZXN0ZXNvL21vZGlmaWNhdG8gaWwgY29tcG9ydGFtZW50byBpbXBsZW1lbnRhbmRvIGxhIGNsYXNzZSBkaSBcImhvb2tcIiAqKklIdHRwU2VydmljZUV4dGVuc2lvbnMqKiBlIHJlZ2lzdHJhbmRvbGEgbmVsIHByb3ZpZGVyIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBIVFRQU2VydmljZSB7XHJcblxyXG4gIC8qKiBDYWNoZSBkZWxsbyBzdGF0byBkZWxsZSBjaGlhbWF0ZSBIVFRQIGF0dHVhbG1lbnRlIGVmZmV0dHVhdGUuIE9nbmkgY2hpYW1hdGEgw6ggcmFwcHJlc2VudGF0YSBkYSB1biBHVUlEIGUgbG8gc3RhdHVzIGFzc3VtZSB2YWxvcmUgKipmYWxzZSoqIHNvbG8gc3VnbGkgZXJyb3JpICovXHJcbiAgcHJpdmF0ZSBjYWxsU3RhdHVzOiB7IFtpZDogc3RyaW5nXTogeyB1cmw6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiB9IH0gPSB7fTtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnkgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5LCBzb2xvIHBlciBsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGVmaW5pdG8gZGkgY2FjaGluZyAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgPSBudWxsO1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbG8gc2NhZGVyZSBkZWxsYSBjYWNoZSBzdGVzc2EgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSA9IG51bGw7XHJcbiAgLyoqIElkZW50aXTDoCBjb2xsZWdhdGEgYWwgdG9rZW4gZGkgYXV0ZW50aWNhemlvbmUgZGEgdXNhcmUsIHJpY2hpZXN0YSBhbCBwcm9ncmFtbWEgY2hlIHV0aWxpenphIGxhIGxpYnJlcmlhIGF0dHJhdmVyc28gbCdob29rICoqcmV0cmlldmVJZGVudGl0eSoqIGRlbGxhICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogKi9cclxuICBwcml2YXRlIG1lOiB7IElkdGVuYW50OiBzdHJpbmcsIElkVXNlcjogc3RyaW5nIH0gPSBudWxsO1xyXG4gIC8qKiBJbmRpY2EgY2hlIGxhIGNhY2hlIGEgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgc2VuemEgbGltaXRpIGRpIHRlbXBvIGRldidlc3NlcmUgcGVyc2lzdGl0YSBpbCBwcmltYSBwb3NzaWJpbGUgKi9cclxuICBwcml2YXRlIFBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEltcGxlbWVudGF6aW9uZSBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZSBwZXIgY29sbGVnYXJlIGkgY29tcG9ydGFtZW50aSBkZWxsYSBsaWJyZXJpYSBhbGwnYXBwbGljYXppb25lIGluIGN1aSDDqCB1c2F0YS4gXHJcbiAgICogXHJcbiAgICogU2Ugw6ggc3RhdG8gZWZmZXR0dWF0byBpbCBwcm92aWRlIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIHZlcnLDoCB1c2F0byBxdWVsIHByb3ZpZGVyLCBhbHRyaW1lbnRpIHZlcnLDoCBjcmVhdGEgdW5hIG51b3ZhIGlzdGFuemEgZGkgZGVmYXVsdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgRXh0ZW5zaW9uc0ltcGw6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucztcclxuXHJcbiAgLyoqIExpc3RhIGRlbGxlIHVsdGltZSAzIGNoaWFtYXRlIGNvbXBsZXRhdGUgY29uIHN1Y2Nlc3NvIGluIG9yZGluZSBkaSBjb21wbGV0YW1lbnRvIChpbiBwb3NpemlvbmUgMCBjJ8OoIGwndWx0aW1hIGNvbXBsZXRhdGEgZWNjZXRlcmEuLi4pICovXHJcbiAgcHVibGljIExhc3RUaHJlZUNvbXBsZXRlZENhbGxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KEJBQ0tFTkRfVVJMKSBwcml2YXRlIEJBQ0tFTkRfVVJMLFxyXG4gICAgcHJpdmF0ZSBFWFRFTlNJT05fQ0xBU1M6IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSFRUUF9JTlZBTElEQVRJT04pIHByaXZhdGUgSFRUUF9JTlZBTElEQVRJT04sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfTE9DQUxFKSBwcml2YXRlIExPQ0FMRSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX05BTUUpIHByaXZhdGUgQVBQX05BTUUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENMSUVOVF9DQUNIRV9EVVJBVElPTl9TKSBwcml2YXRlIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDQUNIRV9CWV9VU0VSKSBwcml2YXRlIENBQ0hFX0JZX1VTRVI6IGJvb2xlYW4sXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERFQlVHX01PREUpIHByaXZhdGUgREVCVUdfTU9ERTogYm9vbGVhbixcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgbG9jYWxTdG9yYWdlOiBQcmVmZXJlbmNlc1NlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlICYmIGNhY2hlZEluZm9zLmNhY2hlSXRlbSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLmdldDxUPihjYWNoZWRJbmZvcy5maW5hbFVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG5cclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgIHRoaXMuY2FjaGVSZXNwb25zZShyZXNwb25zZUl0ZW0sIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQsIGNhY2hlZEluZm9zKTsgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUCBjb24gZXZlbnR1YWxtZW50ZSBsYSBnZXN0aW9uZSBkZWxsYSBjYWNoZSBxdWFsb3JhIGxhIGNoaWFtYXRhIHRlcm1pbmkgY29uIGxhIGNvbnZlbnppb25lIFwiI2NhY2hlXCJcclxuICAgKiBcclxuICAgKiBDYXNvIHNwZWNpZmljbyBkaSBjaGlhbWF0YSBjaGUgZGV2ZSByZXN0aXR1aXJlIHVuIEJsb2IgbyB1biBBcnJheUJ1ZmZlciBuYXRpdm8gZGEgZWxhYm9yYXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge1wiYXJyYXlidWZmZXJcInwgXCJibG9iXCJ9IHR5cGUgVGlwbyBkaSByaXRvcm5vIHJpY2hpZXN0b1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJvckNhbGxiYWNrIENhbGxiYWNrIGNoaWFtYXRvIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8QmxvYiB8IEFycmF5QnVmZmVyPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIGdldFJhdyh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHlwZTogXCJhcnJheWJ1ZmZlclwiIHwgXCJibG9iXCIgPSBcImFycmF5YnVmZmVyXCIsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSwgZXJyb3JDYWxsYmFjayA9IG51bGwpOiBPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlICYmIGNhY2hlZEluZm9zLmNhY2hlSXRlbSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgIHJldHVybiBvZjxhbnk+KGNhY2hlZEluZm9zLmNhY2hlSXRlbSkucGlwZShkZWxheSgwKSwgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChibG9iOiBCbG9iIHwgQXJyYXlCdWZmZXIpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UoYmxvYiwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZWQgcmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBibG9iO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICBpZiAoZXJyb3JDYWxsYmFjaykgZXJyb3JDYWxsYmFjaygpO1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQsIGNhY2hlZEluZm9zKTsgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICogXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlSXRlbSA9IDxUPnJlcztcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VJdGVtO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICByZXR1cm4gIXN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSA/IHRocm93RXJyb3IoZXJyKSA6IHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZGVsZXRlPFQ+KHVybCwgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgbWFwKChyZXM6IFQpID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2VJdGVtID0gPFQ+cmVzO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4ge1xyXG4gICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBVVCBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbiBDb2RpY2UgdHJhbnNhemlvbmUgY29sbGVnYXRvIGEgcXVlc3RhIGNoaWFtYXRhLiBWaWVuZSBpbnNlcml0byBuZWxsJ0hlYWRlciBcIlgtVFgtSURcIiBlIGxhdG8gQmFja2VuZCBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gZGkgY29uc2VndWVuemFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHB1dDxUPih1cmw6IHN0cmluZywgYm9keURhdGE6IGFueSwgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgdHJhbnNhY3Rpb24gPSBcIlwiLCBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnk6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdmFyIGh0dHBDYWxsID0gdGhpcy5odHRwLnB1dDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBtYXAoKHJlczogVCkgPT4ge1xyXG4gICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSXRlbTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgUE9TVCBIVFRQXHJcbiAgICogXHJcbiAgICogQ2FzaXN0aWNhIHBhcnRpY29sYXJlIGluIGN1aSBiaXNvZ25hIGFuY2hlIGludmlhcmUgZGVpIEZpbGVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7YW55fSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtGaWxlW10gfCBGaWxlfSBmaWxlQXJyYXlPckZpbGUgU2luZ29sbyBmaWxlIG8gbGlzdGEgZGkgZmlsZSBkYSBpbnZpYXJlLiBJbCB0aXBvICoqRmlsZSoqIMOoIHF1ZWxsbyBuYXRpdm8gZGVsIEphdmFzY3JpcHRcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3R3aXRoRmlsZXM8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIGZpbGVBcnJheU9yRmlsZTogRmlsZVtdIHwgRmlsZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHZhciBmb3JtRGF0YSA9IHRoaXMuZ2V0RmlsZXNGb3JtRGF0YShmaWxlQXJyYXlPckZpbGUpO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgZm9ybURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKG51bGwsIHRydWUsIG51bGwsIG51bGwpIH0pO1xyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8VD4gPT4geyByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTsgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtLfSBib2R5RGF0YSBEVE8gcGVyIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgcG9zdEdldEZpbGU8Sz4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBLLCBmaWxlbmFtZTogc3RyaW5nLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55LCBhZnRlckdldEZpbGU6ICgpID0+IGFueSA9IG51bGwsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSwgcGFycz86IEh0dHBQYXJhbXMpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHlEYXRhLCB7IHBhcmFtczogcGFycywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIEdFVCBIVFRQXHJcbiAgICogXHJcbiAgICogQ2FzaXN0aWNhIHBhcnRpY29sYXJlIGluIGN1aSB2aWVuZSByZXN0aXR1aXRvIHVuIGZpbGUgZ2VzdGl0byBjb21lIE9iamVjdFVSTCBpbCBjdWkgVVJMIHNpIHB1w7IgZ2VzdGlyZSBkYWwgcGFyYW1ldHJvIGRpIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKiouIFxyXG4gICAqIExhIGNoaWFtYXRhIG5vbiBoYSB1biB0aXBvIHJlc3RpdHVpdG8gaW4gcXVhbnRvIGlsIHJpc3VsdGF0byBkZXYnZXNzZXJlIGdlc3RpdG8gYXR0cmF2ZXJzbyBsYSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWUgTm9tZSBkZWwgZmlsZSBjaGUgc2kgc3RhIHJpY2hpZWRlbmRvLCByaW1hbmUgbGF0byBGcm9udGVuZCBlIHNlcnZlIHBlciBhc3NlZ25hcmUgYXJiaXRyYXJpYW1lbnRlIHVuIG5vbWUgYWwgZmlsZSByZXN0aXR1aXRvLCBzZSB2dW90byB2aWVuZSB1dGlsaXp6YXRhIGxhIENvbnRlbnQtRGlzcG9zaXRpb24gZGVsbGEgcmlzcG9zdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXJHZXRGaWxlIENhbGxiYWNrIGRhIGNoaWFtYXJlIGRvcG8gYXZlciBnZXN0aXRvIGxhIHJpc3Bvc3RhIGRlbCAqKmdldEZpbGVDYWxsYmFjayoqLCBpbiBjYXNvICoqaGFuZGxlRXJyb3IqKiBmb3NzZSAqKmZhbHNlKiogdmVycsOgIHJpY2hpYW1hdG8gYW5jaGUgaW4gY2FzbyBkaSBlcnJvcmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBkaSBkZWZhdWx0IGdsaSBlcnJvcmkgZGV2b25vIGVzc2VyZSBnZXN0aXRpIGRhbGxhIGxpYnJlcmlhIG8gc2UgZGV2b25vIGVzc2VyZSBpZ25vcmF0aVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBmaWxlbmFtZTogc3RyaW5nLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55LCBhZnRlckdldEZpbGU6ICgpID0+IGFueSA9IG51bGwsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQodXJsLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSwgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIsIGNhdWdodCk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgaWYgKGFmdGVyR2V0RmlsZSAmJiAhaGFuZGxlRXJyb3IpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQsIGhhbmRsZUVycm9yKTtcclxuICAgICAgfSksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8QmxvYj4pID0+IHtcclxuICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICBsZXQgZm4gPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpPy5zcGxpdCgnOycpWzFdPy5zcGxpdCgnZmlsZW5hbWUnKVsxXT8uc3BsaXQoJz0nKVsxXT8udHJpbSgpLnJlcGxhY2UoL1xcXCIvZywgJycpO1xyXG5cclxuICAgICAgZ2V0RmlsZUNhbGxiYWNrKHJldFVybCwgZmlsZW5hbWUgfHwgZm4pO1xyXG4gICAgICBpZiAoYWZ0ZXJHZXRGaWxlKSBhZnRlckdldEZpbGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgbmF0aXZvIGRpIHVuIGZpbGUuIEludGVybmFtZW50ZSB1dGlsaXp6YSBpbCBwYXR0ZXJuICoqd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi4uLlwiKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlTmF0aXZlKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsKTogdm9pZCB7XHJcbiAgICBsZXQgZmluYWxVcmwgPSB1cmwgKyAocGFyYW1zID8gIFwiP1wiICsgcGFyYW1zLnRvU3RyaW5nKCkgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc2NhbigocHJldmlvdXM6IERvd25sb2FkLCBldmVudDogSHR0cEV2ZW50PEJsb2I+KTogRG93bmxvYWQgPT4ge1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGV2ZW50LnRvdGFsID8gKGV2ZW50LmxvYWRlZCA+IGV2ZW50LnRvdGFsID8gMTAwIDogTWF0aC5yb3VuZCgoMTAwICogZXZlbnQubG9hZGVkKSAvIGV2ZW50LnRvdGFsKSkgOiBwcmV2aW91cy5wcm9ncmVzcztcclxuICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNkaXNwID0gZXZlbnQuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGNkaXNwRmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiAxMDAsIHN0YXRlOiAnRE9ORScsIGNvbnRlbnQ6IGV2ZW50LmJvZHkgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7IHN0YXRlOiAnUEVORElORycsIHByb2dyZXNzOiAwLCBjb250ZW50OiBudWxsIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCkgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICAgcHJpdmF0ZSBpc0h0dHBSZXNwb25zZTxUPihldmVudDogSHR0cEV2ZW50PFQ+KTogZXZlbnQgaXMgSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUHJvZ3Jlc3NFdmVudCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50OiBIdHRwRXZlbnQ8dW5rbm93bj4pOiBldmVudCBpcyBIdHRwUHJvZ3Jlc3NFdmVudCB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3NcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpb25lIGRlbGwnaW5pemlvIGRpIHVuYSBjaGlhbWF0YSBhZCB1biBjZXJ0byBVUkwsIHZpZW5lIGdlbmVyYXRvIHVuIEdVSUQgZGEgYXNzZWduYXJjaSwgY29udHJvbGxhdGEgbGEgc2NhZGVuemEgZGVsbGEgY2FjaGUsIFxyXG4gICAqIGUgZXZlbnR1YWxtZW50ZSBsb2dnYXRvIGlsIGZhdHRvIGNoZSBzdGEgcGVyIGVzc2VyZSBlZmZldHR1YXRhIHVuYSBjaGlhbWF0YSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVcmwgYSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdVSUQgYXNzZWduYXRvIGFsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwcml2YXRlIGRlZmF1bHRTdGFydENhbGwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZ2V0R1VJRCgpO1xyXG4gICAgdGhpcy5jaGVja0NhY2hlSW52YWxpZGF0aW9uKHVybCk7XHJcbiAgICB0aGlzLmNhbGxTdGF0dXNbbXlHdWlkXSA9IHsgdXJsOiB1cmwsIHN1Y2Nlc3M6IHRydWUgfTtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU3RhcnRpbmcgY2FsbFwiKSArIFwiIFwiICsgbXlHdWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcImF0IFVSTFwiKSArIFwiOiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbXlHdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biB1cmwgdmVuZ29ubyBjb250cm9sbGF0ZSBsZSBpbmZvcm1hemlvbmkgc3UgdHV0dGkgZ2xpIHVybCBkYSBpbnZhbGlkYXJlIGNvbGxlZ2F0aSBhbGwndXJsIGNoaWFtYXRvIGUsIHNlIHByZXNlbnRpIGluIGNhY2hlLCBpbnZhbGlkYXRpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgcGVyIGN1aSBjb250cm9sbGFyZSBzZSBjaSBzb25vIGNoaWFtYXRlIGluIGNhY2hlIGRhIGludmFsaWRhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCBjYWNoZSA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbTxhbnk+KHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgbGV0IGNhY2hlVGltZSA9IHRtcCA/IHRtcFsyXSA6IG51bGw7XHJcbiAgICBsZXQgbm9ybWFsaXplZFVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIikucmVwbGFjZSh0aGlzLkJBQ0tFTkRfVVJMLCBcIlwiKTtcclxuXHJcbiAgICBpZiAoIWNhY2hlIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGFwaXNUb0ludmFsaWRhdGU6IHN0cmluZ1tdID0gdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXTtcclxuICAgIGlmICghYXBpc1RvSW52YWxpZGF0ZSB8fCBhcGlzVG9JbnZhbGlkYXRlLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGtleXNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGFwaXNUb0ludmFsaWRhdGUuZm9yRWFjaChhcGkgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSB0aGlzLm1ha2VDYWNoZUtleShhcGksIG51bGwpO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIGluIGNhY2hlKVxyXG4gICAgICAgIGlmIChpdGVtLmluZGV4T2YoY2FjaGVLZXkpICE9IC0xKVxyXG4gICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goaXRlbSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgayA9IGtleXNUb1JlbW92ZVtpXTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZsYWxpZGF0aW5nIGNhY2hlIGVsZW1lbnRcIikgKyBcIiBcIiArIGspO1xyXG4gICAgICBkZWxldGUgY2FjaGVba107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluYWxpenphemlvbmUgZGkgdW5hIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgR1VJRCBjb2xsZWdhdG8gYWxsYSBjaGlhbWF0YSBhcHBlbmEgdGVybWluYXRhXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBwZXJzaXN0Q2FjaGVJZklkbGUgRWZmZXR0dWEgaWwgcGVyc2lzdCBkZWxsYSBjYWNoZSBIVFRQIHNvbG8gc2Ugbm9uIGNpIHNvbm8gYWx0cmUgY2hpYW1hdGUgaW4gY29yc28sIHBlciBldml0YXJlXHJcbiAgICogY2hlIG1pIGNhbWJpIHNvdHRvIGwnb2dnZXR0byBkaSBjYWNoZSBtZW50cmUgc3RvIHNhbHZhbmRvIGxlIGluZm9ybWF6aW9uaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgdHJ5RmluYWxpemVCeUd1aWQoZ3VpZDogc3RyaW5nLCBjYWNoZUluZm9zPzogQ2FjaGVJbmZvcykge1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJGaW5hbGl6aW5nIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCBzdGF0dXNcIikgKyBcIjogXCIgKyAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIEFsbGEgcHJpbWEgY2hpYW1hdGEgYnVvbmEsIHNpZ25pZmljYSBjaGUgYWxtZW5vIGlsIGxvZ2luIGNlIGwnaG8uIFBvc3NvIG1ldHRlcm1pIGluIG1vZGFsaXTDoCByZWRpcmVjdEluUHJvZ3Jlc3MgZmFsc2VcclxuICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXS5zdWNjZXNzICYmIHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZFJlZGlyZWN0aW9uU3RhdHVzKCkpXHJcbiAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyhmYWxzZSk7XHJcblxyXG4gICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICB0aGlzLkxhc3RUaHJlZUNvbXBsZXRlZENhbGxzLnVuc2hpZnQodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnVybClcclxuICAgIGlmICh0aGlzLkxhc3RUaHJlZUNvbXBsZXRlZENhbGxzLmxlbmd0aCA+IDMpXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgLy8gSW4gb2duaSBjYXNvIHF1ZXN0YSBwb3NzbyByaW11b3ZlcmxhXHJcbiAgICBkZWxldGUgdGhpcy5jYWxsU3RhdHVzW2d1aWRdO1xyXG5cclxuICAgIC8vIFNlIHZlbmdvIGRhIHVuYSBjaGlhbWF0YSBjaGUgaGEgYWdnaW9ybmF0byBsYSBjYWNoZSBhIHRpbWVyIG8gZ2xvYmFsZSBtYXJjbyBpbCBmYXR0byBjaGUgcXVlbGxhIGNhY2hlIGRldidlc3NlcmUgYWdnaW9ybmF0YVxyXG4gICAgaWYgKGNhY2hlSW5mb3MgJiYgY2FjaGVJbmZvcy5jYWNoZSkge1xyXG4gICAgICB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCA9IHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8ICEhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhY2FjaGVJbmZvcy5jYWNoZVRpbWU7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiTWFya2luZyBjYWNoZSB0byBiZSBwZXJzaXN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgdW5hIGRlbGxlIGR1ZSBjYWNoZSBkZXZvbm8gZXNzZXJlIGFnZ2lvcm5hdGUgZSBub24gaG8gbmVzc3VuYSBjaGlhbWF0YSBpbiBjb3JzbyBlZmZldHR1byBsJ2FnZ2lvcm5hbWVudG8gaW4gYmFzZSBhIHF1YWxlIGRlbGxlIGR1ZSB2YSBhZ2dpb3JuYXRhXHJcbiAgICAvLyBBbGxhIGZpbmUgZGkgdHV0dG8gbWFyY28gY29tZSBmYXR0b1xyXG4gICAgaWYgKCh0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSAmJiBPYmplY3Qua2V5cyh0aGlzLmNhbGxTdGF0dXMpLmxlbmd0aCA9PSAwKSB7XHJcblxyXG4gICAgICB2YXIgdG9DYWxsID0gW107XHJcbiAgICAgIGxldCB0bXBLZXkgPSBcIlwiO1xyXG4gICAgICBpZiAodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5O1xyXG4gICAgICAgIHRvQ2FsbC5wdXNoKHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odG1wS2V5LCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0odG1wS2V5KSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkge1xyXG4gICAgICAgIHRtcEtleSA9IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5O1xyXG4gICAgICAgIHRvQ2FsbC5wdXNoKHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odG1wS2V5LCB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0odG1wS2V5KSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk5vIG1vcmUgSFRUUCBjYWxscyB0byBiZSBleGVjdXRlZCwgZW50ZXJpbmcgaWRsZSBzdGF0ZSBhbmQgcGVyc2lzdGluZyBtb2RpZmllZCBjYWNoZXNcIikgKyBcIi4uLlwiKTtcclxuICAgICAgdmFyIHJldCA9IGF3YWl0IGZvcmtKb2luKHRvQ2FsbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXQpXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpKTtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBkYXRvIHVuIHVuaWNvIEZpbGUgbyB1bmEgbGlzdGEgZGkgRmlsZSBjcmVhIHVuIG9nZ2V0dG8gRm9ybURhdGEgY2hlIHB1w7IgZXNzZXJlIGludmlhdG8gY29tb2RhbWVudGUgXHJcbiAgICogYWQgdW4gYmFja2VuZCBBU1AuTkVUIGRhIGN1aSBzaSBwb3Ryw6AgYWNjZWRlcmUgYSBSZXF1ZXN0LkZvcm0uRmlsZXNcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0ZpbGUgfCBGaWxlW119IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIEZpbGUgbyBsaXN0YSBkaSBGaWxlLiBOLkI6IG5lbGxhIGZpcm1hIGRlbGxhIGZ1bnppb25lIHZpZW5lIGNvbnNpZGVyYXRvICoqYW55KiogcGVyIGZhcmUgdGVzdCBzdWxsZSBwcm9wcmlldMOgIFxyXG4gICAqIGludmVjZSBjaGUgZmFyZSB0ZXN0IGNvbiBsJyoqaXN0YW5jZW9mKipcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IEZvcm1EYXRhIGNvbnRlbmVudGUgdHV0dGkgaSBmaWxlIHBhc3NhdGlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlOiBhbnkpOiBGb3JtRGF0YSB7XHJcbiAgICB2YXIgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgaWYgKGZpbGVBcnJheU9yRmlsZSkge1xyXG4gICAgICBpZiAoZmlsZUFycmF5T3JGaWxlLmxlbmd0aClcclxuICAgICAgICBmaWxlQXJyYXlPckZpbGUuZm9yRWFjaCh0ID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCB0LCB0Lm5hbWUpOyB9KTtcclxuICAgICAgZWxzZSBpZiAoZmlsZUFycmF5T3JGaWxlLm5hbWUpXHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZUFycmF5T3JGaWxlLCBmaWxlQXJyYXlPckZpbGUubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBkaXNwb25pYmlsaSBnZW5lcmEgZ2xpIEhlYWRlciBIVFRQIHBlciBsYSBjaGlhbWF0YSBkYSBlZmZldHR1YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQ29udGVudC1UeXBlXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkFjY2VwdFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUF1dGggSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBdXRob3JpemF0aW9uXCIsIHZhbG9yaXp6YXRvIGNvbCB0b2tlbiByZWN1cGVyYXRvIGRhbGwnaG9vayAqKnJldHJpZXZlQWNjZXNzVG9rZW4qKiBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbklkIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiWC1UWC1JRFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtIdHRwSGVhZGVyc30gSGVhZGVyIGdlbmVyYXRpIGluIGJhc2UgYWkgcGFyYW1ldHJpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHRyYW5zYWN0aW9uSWQgPSBcIlwiLCBpbmNsdWRlQXV0aDogYm9vbGVhbiA9IHRydWUsIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIiwgYWNjZXB0OiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IEh0dHBIZWFkZXJzIHtcclxuICAgIHZhciBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICB2YXIgYXV0aHRva2VuID0gdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUFjY2Vzc1Rva2VuKCk7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xyXG5cclxuICAgIGlmICh0cmFuc2FjdGlvbklkKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJYLVRYLUlEXCIsIHRyYW5zYWN0aW9uSWQpO1xyXG5cclxuICAgIGlmIChhdXRodG9rZW4gJiYgaW5jbHVkZUF1dGgpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBhdXRodG9rZW4pO1xyXG5cclxuICAgIGlmIChhY2NlcHQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdFwiLCBhY2NlcHQpO1xyXG5cclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdC1MYW5ndWFnZVwiLCB0aGlzLkxPQ0FMRSA/PyAnaXQtSVQnKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgY2FjaGUgPSBudWxsLCBpdGVtID0gbnVsbDtcclxuICAgIGxldCB1c2VDYWNoaW5nID0gISEoLyNjYWNoZS9naS5leGVjKHVybCkpO1xyXG5cclxuICAgIGlmICh1c2VDYWNoaW5nKSB7XHJcbiAgICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgICBjYWNoZVRpbWUgPSB0bXAgPyB0bXBbMl0gOiBudWxsO1xyXG5cclxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKTtcclxuICAgICAgaWYgKHRoaXMudW50aW1lZENhY2hlRXhwaXJlZCgpICYmICFjYWNoZVRpbWUpXHJcbiAgICAgICAgdGhpcy5yZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCk7XHJcblxyXG4gICAgICBjYWNoaW5nS2V5ID0gdGhpcy5tYWtlQ2FjaGVLZXkodXJsLCBwYXJhbXMpO1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSBjYWNoZVRpbWUgPyB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5IDogdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXlcclxuICAgICAgbGV0IGNhY2hlTHMgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0oY2FjaGVLZXkpO1xyXG4gICAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgICAgaWYgKGNhY2hlICYmIGNhY2hlW2NhY2hpbmdLZXldICYmICF0aGlzLnRpbWVkQ2FjaGVJdGVtRXhwaXJlZChjYWNoZVtjYWNoaW5nS2V5XSkpIHtcclxuICAgICAgICAvLyBTZSBnZXN0aXNjbyBpbCB0ZW1wbyBlc2F0dG8gZGVsbGEgY2FjaGUgcHJpbWEgZGkgcmVzdGl0dWlyZSBsJ29nZ2V0dG8gY2FjaGF0byBsbyByaXB1bGlzY28gXHJcbiAgICAgICAgLy8gZGFsbGUgcHJvcHJpZXTDoCBpbnRlcm5lIGNoZSBnbGkgaG8gYWdnaXVudG8gcGVyIGNvbnRyb2xsYXJuZSBsYSBzY2FkZW56YVxyXG4gICAgICAgIGlmIChjYWNoZVRpbWUpXHJcbiAgICAgICAgICBkZWxldGUgY2FjaGVbY2FjaGluZ0tleV0uX19leHBpcmU7XHJcblxyXG4gICAgICAgIGl0ZW0gPSBjYWNoZVtjYWNoaW5nS2V5XVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBDYWNoZUluZm9zKHVybCwgdXNlQ2FjaGluZywgY2FjaGluZ0tleSwgY2FjaGVUaW1lLCBpdGVtKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VyaXNjZSB1biBvZ2dldHRvIG5lbGxhIGNhY2hlIGFwcHJvcHJpYXRhIGluIGJhc2UgYWxsZSBpbmZvcm1hemlvbmkgY29udGVudXRlIG5lbCBwYXJhbWV0cm8gKipjYWNoZUluZm9zKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1R9IGl0ZW0gT2dnZXR0byBkYSBpbnNlcmlyZSBuZWxsYSBjYWNoZVxyXG4gICAqIEBwYXJhbSB7Q2FjaGVJbmZvc30gY2FjaGVJbmZvcyBJbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcmVjdXBlcmF0ZSBkYSB1bmEgY2hpYW1hdGEgcHJlY2VkZW50ZSBhICoqdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnMqKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2FjaGVSZXNwb25zZTxUPihpdGVtOiBULCBjYWNoZUluZm9zOiBDYWNoZUluZm9zKTogdm9pZCB7XHJcbiAgICBsZXQgY2FjaGVLZXkgPSBjYWNoZUluZm9zLmNhY2hlVGltZSA/IHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkgOiB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleVxyXG4gICAgbGV0IGNhY2hlTHMgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0oY2FjaGVLZXkpO1xyXG4gICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICBjYWNoZVtjYWNoZUluZm9zLmNhY2hlS2V5XSA9IGl0ZW07XHJcbiAgICBpZiAoY2FjaGVJbmZvcy5jYWNoZVRpbWUpXHJcbiAgICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldLl9fZXhwaXJlID0gZGF5anMoKS5hZGQoY2FjaGVJbmZvcy5jYWNoZVRpbWUsIFwic2Vjb25kc1wiKTtcclxuXHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zZXRMb2NhbEl0ZW0oY2FjaGVLZXksIGNhY2hlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBzZSBsYSBjYWNoZSBwZXIgbGUgY2hpYW1hdGUgc2VuemEgZXhwaXJlIHRpbWUgw6ggc2NhZHV0YVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsYSBjYWNoZSDDqCBzY2FkdXRhIGUgZGV2J2Vzc2VyZSByaXB1bGl0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgKi9cclxuICBwcml2YXRlIHVudGltZWRDYWNoZUV4cGlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXhwaXJlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSkpO1xyXG4gICAgcmV0dXJuICFleHBpcmUgfHwgZXhwaXJlICYmIGRheWpzKGV4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciB1bmEgY2hpYW1hdGEgY2hlIGhhIHVuIHRlbXBvIGRpIHZpdGEgYmVuIGRlZmluaXRvIMOoIHNjYWR1dGEgbyBtZW5vXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byByZWN1cGVyYXRvIGRhbGxhIGNhY2hlIGEgY3VpIGhvIGFnZ2l1bnRvIGxhIGNoaWF2ZSBpbnRlcm5hIF9fZXhwaXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdGltZWRDYWNoZUl0ZW1FeHBpcmVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGRheWpzKGl0ZW0uX19leHBpcmUpIDwgZGF5anMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpcHVsaXNjZSBsYSBjYWNoZSBlIGltcG9zdGEgbGEgcHJvc3NpbWEgc2NhZGVuemEgYWQgYWRlc3NvICsgKipDTElFTlRfQ0FDSEVfRFVSQVRJT05fUyoqICh0b2tlbiB2YWxvcml6emF0byBpbiBmYXNlIGRpIGNvbmZpZ3VyYXppb25lIGRhbGxhIHByb3ByaWV0w6AgKipjbGllbnRDYWNoZUR1cmF0aW9uUyoqIGRlbGxhIGNsYXNzZSAqKkh0dHBTZXJ2aWNlTW9kdWxlQ29uZmlnKiopXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHJlc2V0SHR0cFVudGltZWRDYWNoZVN0b3JhZ2UoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCB7fSkudG9Qcm9taXNlKCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUV4cGlyZUtleSwgSlNPTi5zdHJpbmdpZnkoZGF5anMoKS5hZGQodGhpcy5DTElFTlRfQ0FDSEVfRFVSQVRJT05fUyA/PyAzNjAwLCBcInNlY29uZFwiKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkaSBleHBpcmUgZGVmaW5pdG9cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVGltZWRDYWNoZVN0b3JhZ2UoKSB7XHJcbiAgICBhd2FpdCB0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYSB1bmEgY2hpYXZlIHBlciBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBpbiBiYXNlIGFkIFVSTCBlIFBhcmFtZXRyaSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGlhdmUgY2hlIHJhcHByZXNlbnRhIGluIG1hbmllcmEgdW5pdm9jYSBsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gICBwcml2YXRlIG1ha2VDYWNoZUtleSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIGxldCBhdXRoS2V5UGFydCA9ICh0aGlzLm1lID8gdGhpcy5tZS5JZHRlbmFudCA6IFwiXCIpICsgKHRoaXMubWUgJiYgdGhpcy5DQUNIRV9CWV9VU0VSID8gdGhpcy5tZS5JZFVzZXIgOiBcIlwiKTtcclxuICAgIGxldCBwYXJhbXNLZXlQYXJ0ID0gcGFyYW1zICYmIHBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMCA/IHBhcmFtcy5rZXlzKCkucmVkdWNlKChwcmV2OiBhbnksIG5leHQ6IGFueSkgPT4gcHJldiArIFwiLFwiICsgbmV4dCArICc9JyArIHBhcmFtcy5nZXQobmV4dCksIFwiXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBhdXRoS2V5UGFydCArIFwiX1wiICsgdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZihcImFwaVwiKSArIDQpICsgXCI/XCIgKyBwYXJhbXNLZXlQYXJ0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhemlvbmUgR1VJRFxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE51b3ZvIEdVSUQgZ2VuZXJhdG8gaW4gbWFuaWVyYSBjYXN1YWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRHVUlEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBzY3JpdmVyZSBsb2cgYSBjb25zb2xlIHF1YWxvcmEgKipERUJVR19NT0RFKiogcmlzdWx0YXNzZSAqKnRydWUqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkaSBsb2dcclxuICAgKi9cclxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLkRFQlVHX01PREUpXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQGh0dHBzZXJ2aWNlOiBcIiArIG1lc3NhZ2UpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgcGVyIGxhIGxvY2FsaXp6YXppb25lIGRlaSBtZXNzYWdnaVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2dpbyBkYSBsb2NhbGl6emFyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE1lc3NhZ2dpbyBsb2NhbGl6emF0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9jKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIUxvY1ttZXNzYWdlXSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJVbnRyYW5zbGF0ZWQgbWVzc2FnZTogXCIgKyBtZXNzYWdlKVxyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBMb2NbbWVzc2FnZV1bdGhpcy5MT0NBTEVdO1xyXG4gIH1cclxufSJdfQ==
778
+ }] }, { type: i2.HttpClient }, { type: i3.CacheService }, { type: i4.UtilityService }]; } });
779
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFjLGlCQUFpQixFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQStDLE1BQU0sc0JBQXNCLENBQUM7QUFDekosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTdELGtDQUFrQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsRSxrQ0FBa0M7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFckksV0FBVztBQUNYLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQVFqRDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sV0FBVztJQTJCdEI7O09BRUc7SUFDSCxZQUMrQixXQUFXLEVBQ2hDLGVBQXNDLEVBQ0MsaUJBQWlCLEVBQ3ZCLE1BQU0sRUFDVCxRQUFRLEVBQ08sdUJBQXVCLEVBQ2pDLGFBQXNCLEVBQ3pCLFVBQW1CLEVBQ25ELElB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T0FBZTtRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLENBQUE7WUFDaEQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDOzt3R0FoMkJVLFdBQVcsa0JBK0JaLFdBQVcsa0RBRUMsaUJBQWlCLDZCQUNqQixXQUFXLDZCQUNYLFFBQVEsNkJBQ1IsdUJBQXVCLDZCQUN2QixhQUFhLDZCQUNiLFVBQVU7NEdBdENyQixXQUFXOzJGQUFYLFdBQVc7a0JBRHZCLFVBQVU7OzBCQWdDTixNQUFNOzJCQUFDLFdBQVc7OzBCQUVsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3BDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVzs7MEJBQzlCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsUUFBUTs7MEJBQzNCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsdUJBQXVCOzswQkFDMUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxhQUFhOzswQkFDaEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFByb2dyZXNzRXZlbnQsIEh0dHBSZXNwb25zZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzIEZhZW56YVxyXG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL3ByZWZlcmVuY2VzXCI7XHJcbmltcG9ydCB7IFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbmFsaXplLCBtYXAsIHNjYW4gfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgZm9ya0pvaW4sIGZyb20sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8vIENoaWFtYXRlIGFpIFJlcG9zaXRvcnkgLyB0b2tlbnNcclxuaW1wb3J0IHsgSFRUUF9JTlZBTElEQVRJT04sIENMSUVOVF9DQUNIRV9EVVJBVElPTl9TLCBCQUNLRU5EX1VSTCwgSFRUUF9MT0NBTEUsIEFQUF9OQU1FLCBDQUNIRV9CWV9VU0VSLCBERUJVR19NT0RFIH0gZnJvbSAnLi90b2tlbnMnO1xyXG5cclxuLy8gTW9kZWxsaSBcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VFeHRlbnNpb25zIH0gZnJvbSAnLi9jb25maWcvSHR0cFNlcnZpY2VFeHRlbnNpb25zJztcclxuaW1wb3J0IHsgRG93bmxvYWQgfSBmcm9tICcuL21vZGVscy9Eb3dubG9hZCc7XHJcbmltcG9ydCB7IExvYyB9IGZyb20gJy4vaHR0cHNlcnZpY2Uuc2VydmljZS5sb2MnO1xyXG5pbXBvcnQgeyBDYWNoZUluZm9zIH0gZnJvbSBcIi4vbW9kZWxzL0NhY2hlSW5mb3NcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuZGVjbGFyZSB2YXIgZGF5anM6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyB1dGlsaXp6YXRvIHBlciBlZmZldHR1YXJlIHF1YWxzaWFzaSB0aXBvIGRpIGNoaWFtYXRhIEhUVFAgZGFsbCdhcHBsaWNhemlvbmUsIGdlc3Rpc2NlIGVycm9yaSBlIGNhY2hlIGRlbGxlIHJpc3Bvc3RlIG5hdGl2YW1lbnRlIGUgbmUgcHXDsiBlc3NlcmUgXHJcbiAqIGVzdGVzby9tb2RpZmljYXRvIGlsIGNvbXBvcnRhbWVudG8gaW1wbGVtZW50YW5kbyBsYSBjbGFzc2UgZGkgXCJob29rXCIgKipJSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogZSByZWdpc3RyYW5kb2xhIG5lbCBwcm92aWRlciBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSFRUUFNlcnZpY2Uge1xyXG5cclxuICAvKiogQ2FjaGUgZGVsbG8gc3RhdG8gZGVsbGUgY2hpYW1hdGUgSFRUUCBhdHR1YWxtZW50ZSBlZmZldHR1YXRlLiBPZ25pIGNoaWFtYXRhIMOoIHJhcHByZXNlbnRhdGEgZGEgdW4gR1VJRCBlIGxvIHN0YXR1cyBhc3N1bWUgdmFsb3JlICoqZmFsc2UqKiBzb2xvIHN1Z2xpIGVycm9yaSAqL1xyXG4gIHByaXZhdGUgY2FsbFN0YXR1czogeyBbaWQ6IHN0cmluZ106IHsgdXJsOiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4gfSB9ID0ge307XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSByaXNwb3N0ZSBkZWxsZSBjaGlhbWF0ZSBzb3R0byBmb3JtYSBkaSBkaWN0aW9uYXJ5ICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSBudWxsO1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSwgc29sbyBwZXIgbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRlZmluaXRvIGRpIGNhY2hpbmcgKi9cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5ID0gbnVsbDtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxvIHNjYWRlcmUgZGVsbGEgY2FjaGUgc3Rlc3NhICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkgPSBudWxsO1xyXG4gIC8qKiBJZGVudGl0w6AgY29sbGVnYXRhIGFsIHRva2VuIGRpIGF1dGVudGljYXppb25lIGRhIHVzYXJlLCByaWNoaWVzdGEgYWwgcHJvZ3JhbW1hIGNoZSB1dGlsaXp6YSBsYSBsaWJyZXJpYSBhdHRyYXZlcnNvIGwnaG9vayAqKnJldHJpZXZlSWRlbnRpdHkqKiBkZWxsYSAqKkh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqICovXHJcbiAgcHJpdmF0ZSBtZTogeyBJZHRlbmFudDogc3RyaW5nLCBJZFVzZXI6IHN0cmluZyB9ID0gbnVsbDtcclxuICAvKiogSW5kaWNhIGNoZSBsYSBjYWNoZSBhIHRlbXBvIGRldidlc3NlcmUgcGVyc2lzdGl0YSBpbCBwcmltYSBwb3NzaWJpbGUgKi9cclxuICBwcml2YXRlIFBlcnNpc3RUaW1lZENhY2hlQVNBUDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBJbmRpY2EgY2hlIGxhIGNhY2hlIHNlbnphIGxpbWl0aSBkaSB0ZW1wbyBkZXYnZXNzZXJlIHBlcnNpc3RpdGEgaWwgcHJpbWEgcG9zc2liaWxlICovXHJcbiAgcHJpdmF0ZSBQZXJzaXN0VW50aW1lZENhY2hlQVNBUDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBJbXBsZW1lbnRhemlvbmUgZGVsbGEgY2xhc3NlIGRpIGVzdGVuc2lvbmUgcGVyIGNvbGxlZ2FyZSBpIGNvbXBvcnRhbWVudGkgZGVsbGEgbGlicmVyaWEgYWxsJ2FwcGxpY2F6aW9uZSBpbiBjdWkgw6ggdXNhdGEuIFxyXG4gICAqIFxyXG4gICAqIFNlIMOoIHN0YXRvIGVmZmV0dHVhdG8gaWwgcHJvdmlkZSBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKiB2ZXJyw6AgdXNhdG8gcXVlbCBwcm92aWRlciwgYWx0cmltZW50aSB2ZXJyw6AgY3JlYXRhIHVuYSBudW92YSBpc3RhbnphIGRpIGRlZmF1bHRcclxuICAgKi9cclxuICBwcml2YXRlIEV4dGVuc2lvbnNJbXBsOiBIdHRwU2VydmljZUV4dGVuc2lvbnM7XHJcblxyXG4gIC8qKiBMaXN0YSBkZWxsZSB1bHRpbWUgMyBjaGlhbWF0ZSBjb21wbGV0YXRlIGNvbiBzdWNjZXNzbyBpbiBvcmRpbmUgZGkgY29tcGxldGFtZW50byAoaW4gcG9zaXppb25lIDAgYyfDqCBsJ3VsdGltYSBjb21wbGV0YXRhIGVjY2V0ZXJhLi4uKSAqL1xyXG4gIHB1YmxpYyBMYXN0VGhyZWVDb21wbGV0ZWRDYWxsczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChCQUNLRU5EX1VSTCkgcHJpdmF0ZSBCQUNLRU5EX1VSTCxcclxuICAgIHByaXZhdGUgRVhURU5TSU9OX0NMQVNTOiBIdHRwU2VydmljZUV4dGVuc2lvbnMsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfSU5WQUxJREFUSU9OKSBwcml2YXRlIEhUVFBfSU5WQUxJREFUSU9OLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0xPQ0FMRSkgcHJpdmF0ZSBMT0NBTEUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9OQU1FKSBwcml2YXRlIEFQUF9OQU1FLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDTElFTlRfQ0FDSEVfRFVSQVRJT05fUykgcHJpdmF0ZSBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0FDSEVfQllfVVNFUikgcHJpdmF0ZSBDQUNIRV9CWV9VU0VSOiBib29sZWFuLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChERUJVR19NT0RFKSBwcml2YXRlIERFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlzRXh0czogVXRpbGl0eVNlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgLy8gVE9ETyBwcm92YXJlIGUgdGVzdGFyZVxyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UodGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUocmVzcG9uc2VJdGVtKSwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQ2FzbyBzcGVjaWZpY28gZGkgY2hpYW1hdGEgY2hlIGRldmUgcmVzdGl0dWlyZSB1biBCbG9iIG8gdW4gQXJyYXlCdWZmZXIgbmF0aXZvIGRhIGVsYWJvcmFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtcImFycmF5YnVmZmVyXCJ8IFwiYmxvYlwifSB0eXBlIFRpcG8gZGkgcml0b3JubyByaWNoaWVzdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSYXcodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHR5cGU6IFwiYXJyYXlidWZmZXJcIiB8IFwiYmxvYlwiID0gXCJhcnJheWJ1ZmZlclwiLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2sgPSBudWxsKTogT2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgICAgICByZXR1cm4gb2Y8YW55PihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKGJsb2IsIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkLCBjYWNoZWRJbmZvcyk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICogXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuXHJcbiAgICByZXR1cm4gZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKG15R3VpZDogc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQVVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgYmlzb2duYSBhbmNoZSBpbnZpYXJlIGRlaSBGaWxlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RmlsZVtdIHwgRmlsZX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gZmlsZSBvIGxpc3RhIGRpIGZpbGUgZGEgaW52aWFyZS4gSWwgdGlwbyAqKkZpbGUqKiDDqCBxdWVsbG8gbmF0aXZvIGRlbCBKYXZhc2NyaXB0XHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0d2l0aEZpbGVzPFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBmaWxlQXJyYXlPckZpbGU6IEZpbGVbXSB8IEZpbGUsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7IH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7S30gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3RHZXRGaWxlPEs+KHVybDogc3RyaW5nLCBib2R5RGF0YTogSywgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUsIHBhcnM/OiBIdHRwUGFyYW1zKTogdm9pZCB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5RGF0YSwgeyBwYXJhbXM6IHBhcnMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc2NhbigocHJldmlvdXM6IERvd25sb2FkLCBldmVudDogSHR0cEV2ZW50PEJsb2I+KTogRG93bmxvYWQgPT4ge1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGV2ZW50LnRvdGFsID8gKGV2ZW50LmxvYWRlZCA+IGV2ZW50LnRvdGFsID8gMTAwIDogTWF0aC5yb3VuZCgoMTAwICogZXZlbnQubG9hZGVkKSAvIGV2ZW50LnRvdGFsKSkgOiBwcmV2aW91cy5wcm9ncmVzcztcclxuICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNkaXNwID0gZXZlbnQuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGNkaXNwRmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiAxMDAsIHN0YXRlOiAnRE9ORScsIGNvbnRlbnQ6IGV2ZW50LmJvZHkgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7IHN0YXRlOiAnUEVORElORycsIHByb2dyZXNzOiAwLCBjb250ZW50OiBudWxsIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCkgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICAgcHJpdmF0ZSBpc0h0dHBSZXNwb25zZTxUPihldmVudDogSHR0cEV2ZW50PFQ+KTogZXZlbnQgaXMgSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUHJvZ3Jlc3NFdmVudCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50OiBIdHRwRXZlbnQ8dW5rbm93bj4pOiBldmVudCBpcyBIdHRwUHJvZ3Jlc3NFdmVudCB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3NcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpb25lIGRlbGwnaW5pemlvIGRpIHVuYSBjaGlhbWF0YSBhZCB1biBjZXJ0byBVUkwsIHZpZW5lIGdlbmVyYXRvIHVuIEdVSUQgZGEgYXNzZWduYXJjaSwgY29udHJvbGxhdGEgbGEgc2NhZGVuemEgZGVsbGEgY2FjaGUsIFxyXG4gICAqIGUgZXZlbnR1YWxtZW50ZSBsb2dnYXRvIGlsIGZhdHRvIGNoZSBzdGEgcGVyIGVzc2VyZSBlZmZldHR1YXRhIHVuYSBjaGlhbWF0YSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVcmwgYSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdVSUQgYXNzZWduYXRvIGFsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwcml2YXRlIGRlZmF1bHRTdGFydENhbGwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZ2V0R1VJRCgpO1xyXG4gICAgdGhpcy5jaGVja0NhY2hlSW52YWxpZGF0aW9uKHVybCk7XHJcbiAgICB0aGlzLmNhbGxTdGF0dXNbbXlHdWlkXSA9IHsgdXJsOiB1cmwsIHN1Y2Nlc3M6IHRydWUgfTtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU3RhcnRpbmcgY2FsbFwiKSArIFwiIFwiICsgbXlHdWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcImF0IFVSTFwiKSArIFwiOiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbXlHdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biB1cmwgdmVuZ29ubyBjb250cm9sbGF0ZSBsZSBpbmZvcm1hemlvbmkgc3UgdHV0dGkgZ2xpIHVybCBkYSBpbnZhbGlkYXJlIGNvbGxlZ2F0aSBhbGwndXJsIGNoaWFtYXRvIGUsIHNlIHByZXNlbnRpIGluIGNhY2hlLCBpbnZhbGlkYXRpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgcGVyIGN1aSBjb250cm9sbGFyZSBzZSBjaSBzb25vIGNoaWFtYXRlIGluIGNhY2hlIGRhIGludmFsaWRhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCBjYWNoZSA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbTxhbnk+KHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgbGV0IGNhY2hlVGltZSA9IHRtcCA/IHRtcFsyXSA6IG51bGw7XHJcbiAgICBsZXQgbm9ybWFsaXplZFVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIikucmVwbGFjZSh0aGlzLkJBQ0tFTkRfVVJMLCBcIlwiKTtcclxuXHJcbiAgICBpZiAoIWNhY2hlIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGFwaXNUb0ludmFsaWRhdGU6IHN0cmluZ1tdID0gdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXTtcclxuICAgIGlmICghYXBpc1RvSW52YWxpZGF0ZSB8fCBhcGlzVG9JbnZhbGlkYXRlLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGtleXNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGFwaXNUb0ludmFsaWRhdGUuZm9yRWFjaChhcGkgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSB0aGlzLm1ha2VDYWNoZUtleShhcGksIG51bGwpO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIGluIGNhY2hlKVxyXG4gICAgICAgIGlmIChpdGVtLmluZGV4T2YoY2FjaGVLZXkpICE9IC0xKVxyXG4gICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goaXRlbSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgayA9IGtleXNUb1JlbW92ZVtpXTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZsYWxpZGF0aW5nIGNhY2hlIGVsZW1lbnRcIikgKyBcIiBcIiArIGspO1xyXG4gICAgICBkZWxldGUgY2FjaGVba107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluYWxpenphemlvbmUgZGkgdW5hIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgR1VJRCBjb2xsZWdhdG8gYWxsYSBjaGlhbWF0YSBhcHBlbmEgdGVybWluYXRhXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBwZXJzaXN0Q2FjaGVJZklkbGUgRWZmZXR0dWEgaWwgcGVyc2lzdCBkZWxsYSBjYWNoZSBIVFRQIHNvbG8gc2Ugbm9uIGNpIHNvbm8gYWx0cmUgY2hpYW1hdGUgaW4gY29yc28sIHBlciBldml0YXJlXHJcbiAgICogY2hlIG1pIGNhbWJpIHNvdHRvIGwnb2dnZXR0byBkaSBjYWNoZSBtZW50cmUgc3RvIHNhbHZhbmRvIGxlIGluZm9ybWF6aW9uaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgdHJ5RmluYWxpemVCeUd1aWQoZ3VpZDogc3RyaW5nLCBjYWNoZUluZm9zPzogQ2FjaGVJbmZvcykge1xyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJGaW5hbGl6aW5nIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCBzdGF0dXNcIikgKyBcIjogXCIgKyAoIXRoaXMuY2FsbFN0YXR1c1tndWlkXSA/ICdVbmtub3duJyA6IHRoaXMuY2FsbFN0YXR1c1tndWlkXS5zdWNjZXNzID8gdGhpcy5sb2MoJ1N1Y2Nlc3MnKSA6IHRoaXMubG9jKCdGYWlsdXJlJykpKTtcclxuXHJcbiAgICAvLyBUT0RPOiBQZXJkZXJlIDMtNCBvcmUgcGVyIGNhcGlyZSBwZXJjaMOpIG9nbmkgdGFudG8gYXJyaXZhIG51bGwgaW4gY2FzaSBwZXNhbnRpIGRpIE9ic2VydmFibGUgc3BhbW1hdGkgYSByYW5kb21cclxuICAgIGlmICh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0pIHtcclxuICAgICAgLy8gQWxsYSBwcmltYSBjaGlhbWF0YSBidW9uYSwgc2lnbmlmaWNhIGNoZSBhbG1lbm8gaWwgbG9naW4gY2UgbCdoby4gUG9zc28gbWV0dGVybWkgaW4gbW9kYWxpdMOgIHJlZGlyZWN0SW5Qcm9ncmVzcyBmYWxzZVxyXG4gICAgICAvLyBlIHJpaW5pemlhcmUgYSB2YWx1dGFyZSBlcnJvcmkgZGkgamF2YXNoaXRcclxuICAgICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXS5zdWNjZXNzICYmIHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVhZFJlZGlyZWN0aW9uU3RhdHVzKCkpXHJcbiAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW9uU3RhdHVzKGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIEFnZ2l1bmdvIGxhIGNoaWFtYXRhIGFsbGEgbGlzdGEgZGVsbGUgdWx0aW1lIDMgY29tcGxldGF0ZVxyXG4gICAgICB0aGlzLkxhc3RUaHJlZUNvbXBsZXRlZENhbGxzLnVuc2hpZnQodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnVybClcclxuICAgICAgaWYgKHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMubGVuZ3RoID4gMylcclxuICAgICAgICB0aGlzLkxhc3RUaHJlZUNvbXBsZXRlZENhbGxzLnBvcCgpO1xyXG5cclxuICAgICAgLy8gSW4gb2duaSBjYXNvIHF1ZXN0YSBwb3NzbyByaW11b3ZlcmxhXHJcbiAgICAgIGRlbGV0ZSB0aGlzLmNhbGxTdGF0dXNbZ3VpZF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgdmVuZ28gZGEgdW5hIGNoaWFtYXRhIGNoZSBoYSBhZ2dpb3JuYXRvIGxhIGNhY2hlIGEgdGltZXIgbyBnbG9iYWxlIG1hcmNvIGlsIGZhdHRvIGNoZSBxdWVsbGEgY2FjaGUgZGV2J2Vzc2VyZSBhZ2dpb3JuYXRhXHJcbiAgICBpZiAoY2FjaGVJbmZvcyAmJiBjYWNoZUluZm9zLmNhY2hlKSB7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgISFjYWNoZUluZm9zLmNhY2hlVGltZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8ICFjYWNoZUluZm9zLmNhY2hlVGltZTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJNYXJraW5nIGNhY2hlIHRvIGJlIHBlcnNpc3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB1bmEgZGVsbGUgZHVlIGNhY2hlIGRldm9ubyBlc3NlcmUgYWdnaW9ybmF0ZSBlIG5vbiBobyBuZXNzdW5hIGNoaWFtYXRhIGluIGNvcnNvIGVmZmV0dHVvIGwnYWdnaW9ybmFtZW50byBpbiBiYXNlIGEgcXVhbGUgZGVsbGUgZHVlIHZhIGFnZ2lvcm5hdGFcclxuICAgIC8vIEFsbGEgZmluZSBkaSB0dXR0byBtYXJjbyBjb21lIGZhdHRvXHJcbiAgICBpZiAoKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8IHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApICYmIE9iamVjdC5rZXlzKHRoaXMuY2FsbFN0YXR1cykubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgIHZhciB0b0NhbGwgPSBbXTtcclxuICAgICAgbGV0IHRtcEtleSA9IFwiXCI7XHJcbiAgICAgIGlmICh0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCkge1xyXG4gICAgICAgIHRtcEtleSA9IHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXk7XHJcbiAgICAgICAgdG9DYWxsLnB1c2godGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0bXBLZXksIHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbSh0bXBLZXkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXk7XHJcbiAgICAgICAgdG9DYWxsLnB1c2godGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0bXBLZXksIHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbSh0bXBLZXkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiTm8gbW9yZSBIVFRQIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCBlbnRlcmluZyBpZGxlIHN0YXRlIGFuZCBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiKSArIFwiLi4uXCIpO1xyXG4gICAgICB2YXIgcmV0ID0gYXdhaXQgZm9ya0pvaW4odG9DYWxsKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJldClcclxuICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlcyBzdWNjZXNmdWxseSBwZXJzaXN0ZWRcIikpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvcnMgcGVyc2lzdGluZyBtb2RpZmllZCBjYWNoZXNcIikpO1xyXG4gICAgICB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgY2hlIGRhdG8gdW4gdW5pY28gRmlsZSBvIHVuYSBsaXN0YSBkaSBGaWxlIGNyZWEgdW4gb2dnZXR0byBGb3JtRGF0YSBjaGUgcHXDsiBlc3NlcmUgaW52aWF0byBjb21vZGFtZW50ZSBcclxuICAgKiBhZCB1biBiYWNrZW5kIEFTUC5ORVQgZGEgY3VpIHNpIHBvdHLDoCBhY2NlZGVyZSBhIFJlcXVlc3QuRm9ybS5GaWxlc1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7RmlsZSB8IEZpbGVbXX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gRmlsZSBvIGxpc3RhIGRpIEZpbGUuIE4uQjogbmVsbGEgZmlybWEgZGVsbGEgZnVuemlvbmUgdmllbmUgY29uc2lkZXJhdG8gKiphbnkqKiBwZXIgZmFyZSB0ZXN0IHN1bGxlIHByb3ByaWV0w6AgXHJcbiAgICogaW52ZWNlIGNoZSBmYXJlIHRlc3QgY29uIGwnKippc3RhbmNlb2YqKlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gRm9ybURhdGEgY29udGVuZW50ZSB0dXR0aSBpIGZpbGUgcGFzc2F0aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsZXNGb3JtRGF0YShmaWxlQXJyYXlPckZpbGU6IGFueSk6IEZvcm1EYXRhIHtcclxuICAgIHZhciBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICBpZiAoZmlsZUFycmF5T3JGaWxlKSB7XHJcbiAgICAgIGlmIChmaWxlQXJyYXlPckZpbGUubGVuZ3RoKVxyXG4gICAgICAgIGZpbGVBcnJheU9yRmlsZS5mb3JFYWNoKHQgPT4geyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIHQsIHQubmFtZSk7IH0pO1xyXG4gICAgICBlbHNlIGlmIChmaWxlQXJyYXlPckZpbGUubmFtZSlcclxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmaWxlQXJyYXlPckZpbGUsIGZpbGVBcnJheU9yRmlsZS5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybURhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgY2hlIGluIGJhc2UgYWkgcGFyYW1ldHJpIGRpc3BvbmliaWxpIGdlbmVyYSBnbGkgSGVhZGVyIEhUVFAgcGVyIGxhIGNoaWFtYXRhIGRhIGVmZmV0dHVhcmVcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFR5cGUgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJDb250ZW50LVR5cGVcIiwgdmFsb3JpenphdG8gYWwgdmFsb3JlIGRlbCBwYXJhbWV0cm9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWNjZXB0IEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQWNjZXB0XCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQXV0aCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkF1dGhvcml6YXRpb25cIiwgdmFsb3JpenphdG8gY29sIHRva2VuIHJlY3VwZXJhdG8gZGFsbCdob29rICoqcmV0cmlldmVBY2Nlc3NUb2tlbioqIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uSWQgSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJYLVRYLUlEXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0h0dHBIZWFkZXJzfSBIZWFkZXIgZ2VuZXJhdGkgaW4gYmFzZSBhaSBwYXJhbWV0cmlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEhlYWRlcnModHJhbnNhY3Rpb25JZCA9IFwiXCIsIGluY2x1ZGVBdXRoOiBib29sZWFuID0gdHJ1ZSwgY29udGVudFR5cGU6IHN0cmluZyA9IFwiYXBwbGljYXRpb24vanNvblwiLCBhY2NlcHQ6IHN0cmluZyA9IFwiYXBwbGljYXRpb24vanNvblwiKTogSHR0cEhlYWRlcnMge1xyXG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIHZhciBhdXRodG9rZW4gPSB0aGlzLkV4dGVuc2lvbnNJbXBsLnJldHJpZXZlQWNjZXNzVG9rZW4oKTtcclxuXHJcbiAgICBpZiAoY29udGVudFR5cGUpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkNvbnRlbnQtVHlwZVwiLCBjb250ZW50VHlwZSk7XHJcblxyXG4gICAgaWYgKHRyYW5zYWN0aW9uSWQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIlgtVFgtSURcIiwgdHJhbnNhY3Rpb25JZCk7XHJcblxyXG4gICAgaWYgKGF1dGh0b2tlbiAmJiBpbmNsdWRlQXV0aClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIiArIGF1dGh0b2tlbik7XHJcblxyXG4gICAgaWYgKGFjY2VwdClcclxuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQWNjZXB0XCIsIGFjY2VwdCk7XHJcblxyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFwiQWNjZXB0LUxhbmd1YWdlXCIsIHRoaXMuTE9DQUxFID8/ICdpdC1JVCcpO1xyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXN0aW9uZSBkaSBkZWZhdWx0IGRlZ2xpIGVycm9yaVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIG9uRXJyb3IocmVzOiBIdHRwRXJyb3JSZXNwb25zZSB8IFR5cGVFcnJvciwgZ3VpZDogc3RyaW5nKSB7XHJcbiAgICBpZih0aGlzLmNhbGxTdGF0dXNbZ3VpZF0pXHJcbiAgICAgIHRoaXMuY2FsbFN0YXR1c1tndWlkXS5zdWNjZXNzID0gZmFsc2U7XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdHV0dGkgZ2xpIGVycm9yaSBkdXJhbnRlIGlsIHJlZGlyZWN0IGFsIGxvZ2luIHZlbmdhbm8gaWdub3JhdGlcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGluZ1RvTG9naW4oKSkge1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlZGlyZWN0aW5nIHRvIExvZ2luLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9NaSBhc3NpY3VybyBjaGUgdmVuZ2EgZ2VzdGl0byB1biBzb2xvIGVycm9yZSBwZXIgdm9sdGFcclxuICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRIYW5kbGluZ0Vycm9yU3RhdHVzKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJBbHJlYWR5IEhhbmRsaW5nIGFuIGVycm9yLCBpZ25vcmluZyBIVFRQIGVycm9yIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVIYW5kbGluZ0Vycm9yU3RhdHVzKHRydWUpO1xyXG5cclxuICAgIGxldCBmaW5hbEVycm9yID0gXCJcIjtcclxuICAgIGxldCBmaW5hbFN0YXR1cyA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5pc1R5cGVFcnJvcihyZXMpKSB7XHJcbiAgICAgIGZpbmFsRXJyb3IgPSByZXMubWVzc2FnZTtcclxuICAgICAgZmluYWxTdGF0dXMgPSBcIkhUVFAgU2VydmljZSBJbnRlcm5hbCBFcnJvclwiO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5pc0h0dHBFcnJvclJlc3BvbnNlKHJlcykpIHtcclxuXHJcbiAgICAgIGZpbmFsRXJyb3IgPSBhd2FpdCB0aGlzLmdldEh0dHBFcnJvclRleHQocmVzLmVycm9yKTtcclxuICAgICAgZmluYWxTdGF0dXMgPSByZXMuc3RhdHVzLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICBzd2l0Y2ggKHJlcy5zdGF0dXMpIHtcclxuICAgICAgICAvLyBVbmF1dGhvcml6ZWRcclxuICAgICAgICBjYXNlIDQwMTpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwid2l0aCByZWRpcmVjdCBhbHJlYWR5IGluIHByb2dyZXNzLiBJZ25vcmluZyB0aGlzIGV2ZW50XCIpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0MDEgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZWRpcmVjdGluZyB0byBsb2dpbi5cIikpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW9uU3RhdHVzKHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC53cml0ZVJlZGlyZWN0aW5nVG9Mb2dpbih0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwucmVkaXJlY3RUb0xvZ2luKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gSGFuZGxlZCBleGNlcHRpb25cclxuICAgICAgICBjYXNlIDQwMDpcclxuICAgICAgICAvLyBObyBQZXJtaXNzaW9uc1xyXG4gICAgICAgIGNhc2UgNDAzOlxyXG4gICAgICAgICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVCbG9ja2luZ0V4Y2VwdGlvbihyZXMuc3RhdHVzLCBmaW5hbEVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3QgZm91bmRcclxuICAgICAgICBjYXNlIDQwNDpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgdGhpcy5sb2MoXCJSZXNvdXJjZSBub3QgZm91bmRcIikpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIE5vdENvbmZpZ3VyZWRFeGNlcHRpb25cclxuICAgICAgICBjYXNlIDQ0NDpcclxuICAgICAgICAgIGlmICh0aGlzLkV4dGVuc2lvbnNJbXBsLnJlYWRSZWRpcmVjdGlvblN0YXR1cygpKVxyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQ0NCBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICBlbHNlIGlmICghdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVOb3RDb25maWd1cmVkRXhjZXB0aW9uKCkpXHJcbiAgICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgZmluYWxFcnJvciA9IFwiU2VydmVyIG1pZ2h0IGJlIG9mZmxpbmVcIiArIChyZXMuc3RhdHVzVGV4dCA/IFwiIChcIiArIHJlcy5zdGF0dXNUZXh0ICsgXCIpIFwiIDogXCJcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUV4Y2VwdGlvbihmaW5hbFN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIGVycm9yZSByZXN0aXR1aXNjZSB1bmEgcHJvbWlzZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmUgaW4gbW9kbyBkYSBwb3RlciBmYXJlIHVuIGF3YWl0XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIGNoZSByaXNvbHZlIGNvbiBsYSBzdHJpbmdhIGZpbmFsZSBkZWxsJ2Vycm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHR0cEVycm9yVGV4dChlcnI6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAvLyBTZSBobyB1biBCbG9iIHB1w7IgZXNzZXJlIG8gdW4gQ2FsbFJlc3VsdCBvIHN1cHBvbmdvIHVuYSBzZW1wbGljZSBzdHJpbmdhLFxyXG4gICAgLy8gYWx0cmltZW50aSBwb3RyZWJiZSBlc3NlcmUgZGlyZXR0YW1lbnRlIHVuIENhbGxSZXN1bHQsIG9wcHVyZSB1bmEgc2VtcGxpY2Ugc3RyaW5nYVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBsZXQgZXJyTXNnID0gKDxhbnk+ZS50YXJnZXQpLnJlc3VsdDtcclxuICAgICAgICAgIGxldCBqc29uZXJyTXNnOiBhbnk7XHJcbiAgICAgICAgICB0cnkgeyBqc29uZXJyTXNnID0gSlNPTi5wYXJzZShlcnJNc2cpOyB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKGpzb25lcnJNc2cgJiYgdGhpcy5pc0NhbGxSZXN1bHQoanNvbmVyck1zZykgPyBqc29uZXJyTXNnLmVycm9yLm1lc3NhZ2UgOiBlcnJNc2cpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZXJyKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuaXNDYWxsUmVzdWx0KGVycikpXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyPy50b1N0cmluZygpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnb2dnZXR0byDDqCBkaSB0aXBvICoqQ2FsbFJlc3VsdCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzQ2FsbFJlc3VsdChlcnI6IGFueSk6IGVyciBpcyB7IGVycm9yOiB7IG1lc3NhZ2U6IHN0cmluZyB9IH0ge1xyXG4gICAgcmV0dXJuICEhZXJyPy5lcnJvcj8ubWVzc2FnZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2Vycm9yZSDDqCBkaSB0aXBvICoqSHR0cEVycm9yUmVzcG9uc2UqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBFcnJvclJlc3BvbnNlKGVycjogYW55KTogZXJyIGlzIEh0dHBFcnJvclJlc3BvbnNlIHtcclxuICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZTtcclxuICB9XHJcblxyXG4gICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKlR5cGVFcnJvcioqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IGVyciBFcnJvcmUgZGEgY29udHJvbGxhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGlzVHlwZUVycm9yKGVycjogYW55KTogZXJyIGlzIFR5cGVFcnJvciB7XHJcbiAgICByZXR1cm4gZXJyLm5hbWUgPT0gXCJUeXBlRXJyb3JcIjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbWUgZGljZSBpbCBub21lLCByZWdpc3RyYSB1biBlcnJvcmUgZSByZXN0aXR1aXNjZSB1biBPYnNlcnZhYmxlIHZ1b3RvIGNvbWUgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHthbnl9IHJlcyBSaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIElkZW50aWZpY2F0aXZvIEdVSUQgZGVsbGEgY2hpYW1hdGEgZWZmZXR0dWF0YVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGdlc3RpcmUgbCdlcnJvcmUgdmlhIGxpYnJlcmlhIG8gc2UgbGltaXRhcnNpIGEgcmVzdGl0dWlyZSBsJ09ic2VydmFibGUgdnVvdG9cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fSBPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKHJlczogYW55LCBndWlkOiBzdHJpbmcsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoaGFuZGxlRXJyb3IpXHJcbiAgICAgIHRoaXMub25FcnJvcihyZXMsIGd1aWQpO1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCgpID0+IHsgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRvIHVuIFVybCBlIGRlaSBwYXJhbWV0cmkgY2VyY2EgZGkgcmVjdXBlcmFyZSBsJ2V2ZW50dWFsZSBvZ2dldHRvIGdpw6Agc2FsdmF0byBpbiBjYWNoZSBjb24gbGUgaW5mb3JtYXppb25pIGJhc2UgZGVsbGEgY2FjaGUgc3Rlc3NhXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGEgKG51bGxpIGluIGNhc28gZGkgUE9TVClcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Q2FjaGVJbmZvc30gT2dnZXR0byBjb250ZW5lbnRlIGxlIGluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSBwZXIgbCdvZ2dldHRvIHNwZWNpZmljYXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zKTogQ2FjaGVJbmZvcyB7XHJcblxyXG4gICAgbGV0IGNhY2hpbmdLZXkgPSBudWxsLCBjYWNoZVRpbWUgPSBudWxsLCBpdGVtID0gbnVsbDtcclxuICAgIGxldCB1c2VDYWNoaW5nID0gISEoLyNjYWNoZS9naS5leGVjKHVybCkpO1xyXG5cclxuICAgIGlmICh1c2VDYWNoaW5nKSB7XHJcbiAgICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgICBjYWNoZVRpbWUgPSB0bXAgPyB0bXBbMl0gOiBudWxsO1xyXG5cclxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKTtcclxuICAgICAgaWYgKHRoaXMudW50aW1lZENhY2hlRXhwaXJlZCgpICYmICFjYWNoZVRpbWUpXHJcbiAgICAgICAgdGhpcy5yZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCk7XHJcblxyXG4gICAgICBjYWNoaW5nS2V5ID0gdGhpcy5tYWtlQ2FjaGVLZXkodXJsLCBwYXJhbXMpO1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSBjYWNoZVRpbWUgPyB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5IDogdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXlcclxuICAgICAgbGV0IGNhY2hlTHMgPSB0aGlzLmxvY2FsU3RvcmFnZS5nZXRMb2NhbEl0ZW0oY2FjaGVLZXkpO1xyXG4gICAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgICAgaWYgKGNhY2hlICYmIGNhY2hlW2NhY2hpbmdLZXldICYmICF0aGlzLnRpbWVkQ2FjaGVJdGVtRXhwaXJlZChjYWNoZVtjYWNoaW5nS2V5XSkpIHtcclxuICAgICAgICAvLyBTZSBnZXN0aXNjbyBpbCB0ZW1wbyBlc2F0dG8gZGVsbGEgY2FjaGUgcHJpbWEgZGkgcmVzdGl0dWlyZSBsJ29nZ2V0dG8gY2FjaGF0byBsbyByaXB1bGlzY28gXHJcbiAgICAgICAgLy8gZGFsbGUgcHJvcHJpZXTDoCBpbnRlcm5lIGNoZSBnbGkgaG8gYWdnaXVudG8gcGVyIGNvbnRyb2xsYXJuZSBsYSBzY2FkZW56YVxyXG4gICAgICAgIGlmIChjYWNoZVRpbWUpXHJcbiAgICAgICAgICBkZWxldGUgY2FjaGVbY2FjaGluZ0tleV0uX19leHBpcmU7XHJcblxyXG4gICAgICAgIGl0ZW0gPSBjYWNoZVtjYWNoaW5nS2V5XVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyIGFzc2ljdXJhcm1pIGNoZSBpbCByaWZlaXJtZW50byBkZWdsaSBvZ2dldHRpIHNpYSBkaXZlcnNvIHV0aWxpenpvIGlsIGRlZXBDbG9uZVxyXG4gICAgcmV0dXJuIG5ldyBDYWNoZUluZm9zKHVybCwgdXNlQ2FjaGluZywgY2FjaGluZ0tleSwgY2FjaGVUaW1lLCB0aGlzLnV0aXNFeHRzLmRlZXBDbG9uZShpdGVtKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnNlcmlzY2UgdW4gb2dnZXR0byBuZWxsYSBjYWNoZSBhcHByb3ByaWF0YSBpbiBiYXNlIGFsbGUgaW5mb3JtYXppb25pIGNvbnRlbnV0ZSBuZWwgcGFyYW1ldHJvICoqY2FjaGVJbmZvcyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtUfSBpdGVtIE9nZ2V0dG8gZGEgaW5zZXJpcmUgbmVsbGEgY2FjaGVcclxuICAgKiBAcGFyYW0ge0NhY2hlSW5mb3N9IGNhY2hlSW5mb3MgSW5mb3JtYXppb25pIHN1bGxhIGNhY2hlIHJlY3VwZXJhdGUgZGEgdW5hIGNoaWFtYXRhIHByZWNlZGVudGUgYSAqKnRyeUdldENhY2hlSW5mb3JtYXRpb25zKipcclxuICAgKi9cclxuICBwcml2YXRlIGNhY2hlUmVzcG9uc2U8VD4oaXRlbTogVCwgY2FjaGVJbmZvczogQ2FjaGVJbmZvcyk6IHZvaWQge1xyXG4gICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVJbmZvcy5jYWNoZVRpbWUgPyB0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5IDogdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXlcclxuICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgIGxldCBjYWNoZSA9IGNhY2hlTHMgPyBjYWNoZUxzIDoge307XHJcblxyXG4gICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0gPSBpdGVtO1xyXG4gICAgaWYgKGNhY2hlSW5mb3MuY2FjaGVUaW1lKVxyXG4gICAgICBjYWNoZVtjYWNoZUluZm9zLmNhY2hlS2V5XS5fX2V4cGlyZSA9IGRheWpzKCkuYWRkKGNhY2hlSW5mb3MuY2FjaGVUaW1lLCBcInNlY29uZHNcIik7XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0TG9jYWxJdGVtKGNhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIGxlIGNoaWFtYXRlIHNlbnphIGV4cGlyZSB0aW1lIMOoIHNjYWR1dGFcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bnRpbWVkQ2FjaGVFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXkpKTtcclxuICAgIHJldHVybiAhZXhwaXJlIHx8IGV4cGlyZSAmJiBkYXlqcyhleHBpcmUpIDwgZGF5anMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xsYSBzZSBsYSBjYWNoZSBwZXIgdW5hIGNoaWFtYXRhIGNoZSBoYSB1biB0ZW1wbyBkaSB2aXRhIGJlbiBkZWZpbml0byDDqCBzY2FkdXRhIG8gbWVub1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gcmVjdXBlcmF0byBkYWxsYSBjYWNoZSBhIGN1aSBobyBhZ2dpdW50byBsYSBjaGlhdmUgaW50ZXJuYSBfX2V4cGlyZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsYSBjYWNoZSDDqCBzY2FkdXRhIGUgZGV2J2Vzc2VyZSByaXB1bGl0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgKi9cclxuICBwcml2YXRlIHRpbWVkQ2FjaGVJdGVtRXhwaXJlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXlqcyhpdGVtLl9fZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZSBpbXBvc3RhIGxhIHByb3NzaW1hIHNjYWRlbnphIGFkIGFkZXNzbyArICoqQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MqKiAodG9rZW4gdmFsb3JpenphdG8gaW4gZmFzZSBkaSBjb25maWd1cmF6aW9uZSBkYWxsYSBwcm9wcmlldMOgICoqY2xpZW50Q2FjaGVEdXJhdGlvblMqKiBkZWxsYSBjbGFzc2UgKipIdHRwU2VydmljZU1vZHVsZUNvbmZpZyoqKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZXNldEh0dHBVbnRpbWVkQ2FjaGVTdG9yYWdlKCkge1xyXG4gICAgYXdhaXQgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwge30pLnRvUHJvbWlzZSgpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVFeHBpcmVLZXksIEpTT04uc3RyaW5naWZ5KGRheWpzKCkuYWRkKHRoaXMuQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MgPz8gMzYwMCwgXCJzZWNvbmRcIikpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpcHVsaXNjZSBsYSBjYWNoZSBkZWxsZSBjaGlhbWF0ZSBjb24gdW4gdGVtcG8gZGkgZXhwaXJlIGRlZmluaXRvXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHJlc2V0SHR0cFRpbWVkQ2FjaGVTdG9yYWdlKCkge1xyXG4gICAgYXdhaXQgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCB7fSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmEgdW5hIGNoaWF2ZSBwZXIgbGEgY2FjaGUgZGVsbGUgY2hpYW1hdGUgaW4gYmFzZSBhZCBVUkwgZSBQYXJhbWV0cmkgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gQ2hpYXZlIGNoZSByYXBwcmVzZW50YSBpbiBtYW5pZXJhIHVuaXZvY2EgbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICAgcHJpdmF0ZSBtYWtlQ2FjaGVLZXkodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICBsZXQgYXV0aEtleVBhcnQgPSAodGhpcy5tZSA/IHRoaXMubWUuSWR0ZW5hbnQgOiBcIlwiKSArICh0aGlzLm1lICYmIHRoaXMuQ0FDSEVfQllfVVNFUiA/IHRoaXMubWUuSWRVc2VyIDogXCJcIik7XHJcbiAgICBsZXQgcGFyYW1zS2V5UGFydCA9IHBhcmFtcyAmJiBwYXJhbXMua2V5cygpLmxlbmd0aCA+IDAgPyBwYXJhbXMua2V5cygpLnJlZHVjZSgocHJldjogYW55LCBuZXh0OiBhbnkpID0+IHByZXYgKyBcIixcIiArIG5leHQgKyAnPScgKyBwYXJhbXMuZ2V0KG5leHQpLCBcIlwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gYXV0aEtleVBhcnQgKyBcIl9cIiArIHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoXCJhcGlcIikgKyA0KSArIFwiP1wiICsgcGFyYW1zS2V5UGFydDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXppb25lIEdVSURcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBOdW92byBHVUlEIGdlbmVyYXRvIGluIG1hbmllcmEgY2FzdWFsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0R1VJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcclxuICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgc2NyaXZlcmUgbG9nIGEgY29uc29sZSBxdWFsb3JhICoqREVCVUdfTU9ERSoqIHJpc3VsdGFzc2UgKip0cnVlKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGkgbG9nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ERUJVR19NT0RFKVxyXG4gICAgICBjb25zb2xlLmxvZyhcIkBodHRwc2VydmljZTogXCIgKyBtZXNzYWdlKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIHBlciBsYSBsb2NhbGl6emF6aW9uZSBkZWkgbWVzc2FnZ2lcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBNZXNzYWdnaW8gZGEgbG9jYWxpenphcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNZXNzYWdnaW8gbG9jYWxpenphdG9cclxuICAgKi9cclxuICBwcml2YXRlIGxvYyhtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFMb2NbbWVzc2FnZV0pIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiVW50cmFuc2xhdGVkIG1lc3NhZ2U6IFwiICsgbWVzc2FnZSlcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTG9jW21lc3NhZ2VdW3RoaXMuTE9DQUxFXTtcclxuICB9XHJcbn0iXX0=