tnx-shared 5.2.20 → 5.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app-context/component-context.service.d.ts.map +1 -1
- package/classes/base/component-base.d.ts +1 -1
- package/classes/public-function.d.ts +3 -2
- package/classes/public-function.d.ts.map +1 -1
- package/components/chat/chat-box/chat-box.component.d.ts +1 -1
- package/components/dropdown/services/dropdown.service.d.ts.map +1 -1
- package/components/file-explorer/services/file-explorer-new.service.d.ts.map +1 -1
- package/components/file-explorer/services/file-explorer.service.d.ts.map +1 -1
- package/components/file-explorer/services/file-version.service.d.ts.map +1 -1
- package/components/file-explorer/services/folder.service.d.ts.map +1 -1
- package/components/file-explorer/services/ky-so-sim-signPDF.service.d.ts.map +1 -1
- package/components/file-explorer/services/my-drive.service.d.ts.map +1 -1
- package/components/tn-app-help/services/path-name.service.d.ts.map +1 -1
- package/congviec/congviec/services/congviec-dinhkem.service.d.ts.map +1 -1
- package/esm2020/app-context/component-context.service.mjs +4 -5
- package/esm2020/classes/base/component-base.mjs +2 -2
- package/esm2020/components/common-app-component/common-app-component.mjs +2 -2
- package/esm2020/components/crud/crud-form/crud-form.component.mjs +1 -1
- package/esm2020/components/dropdown/services/dropdown.service.mjs +5 -5
- package/esm2020/components/file-explorer/file-ky-so-sim/file-ky-so-sim.component.mjs +1 -1
- package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +2 -2
- package/esm2020/components/file-explorer/file-viewer/file-viewer.component.mjs +3 -3
- package/esm2020/components/file-explorer/services/file-explorer-new.service.mjs +39 -40
- package/esm2020/components/file-explorer/services/file-explorer.service.mjs +48 -51
- package/esm2020/components/file-explorer/services/file-version.service.mjs +5 -4
- package/esm2020/components/file-explorer/services/folder.service.mjs +3 -3
- package/esm2020/components/file-explorer/services/ky-so-sim-signPDF.service.mjs +3 -2
- package/esm2020/components/file-explorer/services/my-drive.service.mjs +34 -34
- package/esm2020/components/mask/mask.component.mjs +1 -1
- package/esm2020/components/number-picker-range/number-picker-range.component.mjs +1 -1
- package/esm2020/components/tn-app-help/services/path-name.service.mjs +4 -3
- package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +2 -2
- package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +1 -1
- package/esm2020/components/workflow/workflow-history-new/workflow-history-new.component.mjs +1 -1
- package/esm2020/congviec/cauhinh-workflow/cauhinh-workflow.component.mjs +1 -1
- package/esm2020/congviec/congviec/services/congviec-dinhkem.service.mjs +5 -4
- package/esm2020/services/article.service.mjs +10 -13
- package/esm2020/services/base.service.mjs +36 -41
- package/esm2020/services/custom-router.service.mjs +4 -5
- package/esm2020/services/entity-picker.service.mjs +4 -3
- package/esm2020/services/file-object-v4.service.mjs +5 -7
- package/esm2020/services/high-performance.service.mjs +4 -3
- package/esm2020/services/master-data.service.mjs +23 -30
- package/esm2020/services/organization.service.mjs +18 -23
- package/esm2020/services/template-v4.service.mjs +3 -2
- package/esm2020/services/template.service.mjs +19 -27
- package/esm2020/services/templateinstance.service.mjs +22 -31
- package/esm2020/services/tn-client.service.mjs +3 -3
- package/esm2020/services/unique-number.service.mjs +4 -3
- package/esm2020/services/user-v5.service.mjs +31 -39
- package/esm2020/services/user.service.mjs +32 -40
- package/fesm2015/tnx-shared.mjs +334 -409
- package/fesm2015/tnx-shared.mjs.map +1 -1
- package/fesm2020/tnx-shared.mjs +334 -409
- package/fesm2020/tnx-shared.mjs.map +1 -1
- package/package.json +2 -2
- package/services/article.service.d.ts.map +1 -1
- package/services/base.service.d.ts.map +1 -1
- package/services/common.service.d.ts +2 -2
- package/services/custom-router.service.d.ts.map +1 -1
- package/services/entity-picker.service.d.ts.map +1 -1
- package/services/file-object-v4.service.d.ts.map +1 -1
- package/services/high-performance.service.d.ts.map +1 -1
- package/services/master-data.service.d.ts.map +1 -1
- package/services/organization.service.d.ts.map +1 -1
- package/services/template-v4.service.d.ts.map +1 -1
- package/services/template.service.d.ts.map +1 -1
- package/services/templateinstance.service.d.ts.map +1 -1
- package/services/unique-number.service.d.ts.map +1 -1
- package/services/user-v5.service.d.ts.map +1 -1
- package/services/user.service.d.ts.map +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import * as JWT_ from 'jwt-decode';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
3
4
|
import { catchError, map, retry, shareReplay } from 'rxjs/operators';
|
|
4
5
|
import { ComCtxConstants } from '../configs/component-context.constant';
|
|
5
6
|
import { GridInfo } from '../models/grid-info';
|
|
@@ -96,8 +97,8 @@ export class UserService extends BaseService {
|
|
|
96
97
|
}
|
|
97
98
|
getForAutoComplete(key) {
|
|
98
99
|
const apiUrl = `${this.serviceUri}/GetForAutoComplete?key=${key}`;
|
|
99
|
-
return this._http.get(apiUrl)
|
|
100
|
-
.pipe(catchError((err) => this._exceptionHandlerService.handleError(err, this._injector)))
|
|
100
|
+
return firstValueFrom(this._http.get(apiUrl)
|
|
101
|
+
.pipe(catchError((err) => this._exceptionHandlerService.handleError(err, this._injector))));
|
|
101
102
|
}
|
|
102
103
|
populateCurrentUser() {
|
|
103
104
|
const storageItem = localStorage.getItem(this.CURRENT_USER_KEY);
|
|
@@ -205,7 +206,7 @@ export class UserService extends BaseService {
|
|
|
205
206
|
}
|
|
206
207
|
getStaffInfo(userId) {
|
|
207
208
|
const url = `${this.serviceUri}/${userId}`;
|
|
208
|
-
return this._http.get(url)
|
|
209
|
+
return firstValueFrom(this._http.get(url)
|
|
209
210
|
.pipe(catchError((err) => this.handleError(err, this._injector)), map(rs => {
|
|
210
211
|
const op = {
|
|
211
212
|
fullName: rs.data ? rs.data.fullName : '',
|
|
@@ -224,8 +225,7 @@ export class UserService extends BaseService {
|
|
|
224
225
|
}
|
|
225
226
|
}
|
|
226
227
|
return op;
|
|
227
|
-
}))
|
|
228
|
-
.toPromise();
|
|
228
|
+
})));
|
|
229
229
|
}
|
|
230
230
|
getId() {
|
|
231
231
|
const storageItem = localStorage.getItem(this.CURRENT_USER_KEY);
|
|
@@ -249,10 +249,9 @@ export class UserService extends BaseService {
|
|
|
249
249
|
}
|
|
250
250
|
registerOnline(formData) {
|
|
251
251
|
const apiUrl = `${this.serviceUri}/registerOnline`;
|
|
252
|
-
return this._http
|
|
252
|
+
return firstValueFrom(this._http
|
|
253
253
|
.post(apiUrl, formData)
|
|
254
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
255
|
-
.toPromise();
|
|
254
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
256
255
|
}
|
|
257
256
|
getBasicUserInfo(userId) {
|
|
258
257
|
const storageItem = localStorage.getItem(this.USER_INFO_KEY + '_' + userId);
|
|
@@ -271,11 +270,11 @@ export class UserService extends BaseService {
|
|
|
271
270
|
if (userId > 0) {
|
|
272
271
|
const svUrl = `${this.serviceUri}/GetBasicUserInfo?id=${userId}`;
|
|
273
272
|
try {
|
|
274
|
-
const result = await this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), map(repsonse => {
|
|
273
|
+
const result = await firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), map(repsonse => {
|
|
275
274
|
// save response to local storage here
|
|
276
275
|
localStorage.setItem(this.USER_INFO_KEY + '_' + repsonse.data.id, JSON.stringify(repsonse.data));
|
|
277
276
|
return repsonse.data;
|
|
278
|
-
}, catchError((err) => this.handleError(err, this._injector))))
|
|
277
|
+
}, catchError((err) => this.handleError(err, this._injector)))));
|
|
279
278
|
resolve(result);
|
|
280
279
|
}
|
|
281
280
|
catch {
|
|
@@ -302,7 +301,7 @@ export class UserService extends BaseService {
|
|
|
302
301
|
else {
|
|
303
302
|
return new Promise((resolve, reject) => {
|
|
304
303
|
const svUrl = `${this.serviceUri}/GetBasicUsersInfo?userIds=${userIds}`;
|
|
305
|
-
this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => repsonse.data))
|
|
304
|
+
firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => repsonse.data))).then(success => {
|
|
306
305
|
resolve(success);
|
|
307
306
|
}).catch(err => {
|
|
308
307
|
resolve([]);
|
|
@@ -330,11 +329,11 @@ export class UserService extends BaseService {
|
|
|
330
329
|
else {
|
|
331
330
|
if (userName != '') {
|
|
332
331
|
const svUrl = `${this.serviceUri}/GetBasicUserInfoByUserName?userName=${userName}`;
|
|
333
|
-
this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), map(repsonse => {
|
|
332
|
+
firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), map(repsonse => {
|
|
334
333
|
// save response to local storage here
|
|
335
334
|
localStorage.setItem(this.USER_INFO_KEY + '_' + repsonse.data.userName, JSON.stringify(repsonse.data));
|
|
336
335
|
return repsonse.data;
|
|
337
|
-
}, catchError((err) => this.handleError(err, this._injector))))
|
|
336
|
+
}, catchError((err) => this.handleError(err, this._injector))))).then(rss => {
|
|
338
337
|
resolve(rss);
|
|
339
338
|
}).catch(errr => {
|
|
340
339
|
resolve({});
|
|
@@ -359,13 +358,13 @@ export class UserService extends BaseService {
|
|
|
359
358
|
}
|
|
360
359
|
else {
|
|
361
360
|
const svUrl = `${this.serviceUri}/GetBasicUsersInfoByUserNames?userNames=${userNames}`;
|
|
362
|
-
return await this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => {
|
|
361
|
+
return await firstValueFrom(this._http.get(svUrl).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => {
|
|
363
362
|
localStorage.setItem(this.USER_INFO_KEY + '_' + repsonse.data.map(x => {
|
|
364
363
|
if (x.userName)
|
|
365
364
|
return x.userName;
|
|
366
365
|
}), JSON.stringify(repsonse.data));
|
|
367
366
|
return repsonse.data;
|
|
368
|
-
}))
|
|
367
|
+
}))).catch(err => []);
|
|
369
368
|
}
|
|
370
369
|
}
|
|
371
370
|
convertListUserIdToString(userIds) {
|
|
@@ -386,23 +385,20 @@ export class UserService extends BaseService {
|
|
|
386
385
|
return dataSource;
|
|
387
386
|
}
|
|
388
387
|
restorePassword(item) {
|
|
389
|
-
return this._http.put(`${this.serviceUri}/restorePassword`, item)
|
|
390
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
391
|
-
.toPromise();
|
|
388
|
+
return firstValueFrom(this._http.put(`${this.serviceUri}/restorePassword`, item)
|
|
389
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
392
390
|
}
|
|
393
391
|
changePassword(userId, item) {
|
|
394
392
|
const apiUrl = `${this.serviceUri}/ChangePassword`;
|
|
395
|
-
return this._http
|
|
393
|
+
return firstValueFrom(this._http
|
|
396
394
|
.post(apiUrl, item)
|
|
397
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
398
|
-
.toPromise();
|
|
395
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
399
396
|
}
|
|
400
397
|
resetPassword(item) {
|
|
401
398
|
const apiUrl = `${this.serviceUri}/resetPassword`;
|
|
402
|
-
return this._http
|
|
399
|
+
return firstValueFrom(this._http
|
|
403
400
|
.put(apiUrl, item)
|
|
404
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
405
|
-
.toPromise();
|
|
401
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
406
402
|
}
|
|
407
403
|
GetsByManagerIdArrayId(id) {
|
|
408
404
|
const apiUrl = `${this.serviceUri}/GetLowerStaffsByUserId?userId=${id}`;
|
|
@@ -410,17 +406,15 @@ export class UserService extends BaseService {
|
|
|
410
406
|
}
|
|
411
407
|
markAsAdmin(userId, isAdmin) {
|
|
412
408
|
const url = `${this.serviceUri}/markAsAdmin/${userId}/${isAdmin}`;
|
|
413
|
-
return this._http
|
|
409
|
+
return firstValueFrom(this._http
|
|
414
410
|
.put(url, isAdmin)
|
|
415
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
416
|
-
.toPromise();
|
|
411
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
417
412
|
}
|
|
418
413
|
markAsRepresent(userId, isRepresent) {
|
|
419
414
|
const url = `${this.serviceUri}/markAsRepresent/${userId}/${isRepresent}`;
|
|
420
|
-
return this._http
|
|
415
|
+
return firstValueFrom(this._http
|
|
421
416
|
.put(url, isRepresent)
|
|
422
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
423
|
-
.toPromise();
|
|
417
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
424
418
|
}
|
|
425
419
|
getsByOrganizationListId(pageOption, funGetName = '', optionParameter = '', defaultParameter = '') {
|
|
426
420
|
let queryString = `?key=${pageOption.query}`;
|
|
@@ -476,17 +470,15 @@ export class UserService extends BaseService {
|
|
|
476
470
|
}
|
|
477
471
|
lockUser(item) {
|
|
478
472
|
const apiUrl = `${this.serviceUri}/lockUserAccount`;
|
|
479
|
-
return this._http
|
|
473
|
+
return firstValueFrom(this._http
|
|
480
474
|
.post(apiUrl, item)
|
|
481
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
482
|
-
.toPromise();
|
|
475
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
483
476
|
}
|
|
484
477
|
unlockUser(item) {
|
|
485
478
|
const apiUrl = `${this.serviceUri}/unlockUserAccount`;
|
|
486
|
-
return this._http
|
|
479
|
+
return firstValueFrom(this._http
|
|
487
480
|
.post(apiUrl, item)
|
|
488
|
-
.pipe(catchError(err => this.handleError(err, this._injector)))
|
|
489
|
-
.toPromise();
|
|
481
|
+
.pipe(catchError(err => this.handleError(err, this._injector))));
|
|
490
482
|
}
|
|
491
483
|
isSuperUser() {
|
|
492
484
|
return this._applicationContext.getRootContext().data.currentUser
|
|
@@ -501,8 +493,8 @@ export class UserService extends BaseService {
|
|
|
501
493
|
}
|
|
502
494
|
getUsersByGroupCode(groupCode) {
|
|
503
495
|
const apiUrl = `${this.serviceUri}/GetUsersByGroupCode?groupCode=${groupCode}`;
|
|
504
|
-
return this._http.get(apiUrl)
|
|
505
|
-
.pipe(catchError((err) => this._exceptionHandlerService.handleError(err, this._injector)))
|
|
496
|
+
return firstValueFrom(this._http.get(apiUrl)
|
|
497
|
+
.pipe(catchError((err) => this._exceptionHandlerService.handleError(err, this._injector))));
|
|
506
498
|
}
|
|
507
499
|
getServiceEndpoint() {
|
|
508
500
|
return `${this.serviceUri}`;
|
|
@@ -548,7 +540,7 @@ export class UserService extends BaseService {
|
|
|
548
540
|
sorts: [],
|
|
549
541
|
filters: filters
|
|
550
542
|
});
|
|
551
|
-
this._http.post(svUrl, gridInfo).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => repsonse.data))
|
|
543
|
+
firstValueFrom(this._http.post(svUrl, gridInfo).pipe(shareReplay(this.REPLAY_COUNT), retry(this.RETRY_COUNT), catchError((err) => this.handleError(err, this._injector)), map(repsonse => repsonse.data))).then(success => {
|
|
552
544
|
resolve(success);
|
|
553
545
|
}).catch(err => {
|
|
554
546
|
resolve([]);
|
|
@@ -565,4 +557,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
|
|
|
565
557
|
providedIn: 'root'
|
|
566
558
|
}]
|
|
567
559
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.Injector }, { type: i2.EnvironmentService }, { type: i3.AuthenService }, { type: i4.OAuthService }, { type: i5.SignalRService }, { type: i6.ExceptionHandlerService }, { type: i7.ApplicationContextService }]; } });
|
|
568
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFckQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7OztBQUtqRCxxQkFBcUI7QUFDckIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBS2pCLE1BQU0sT0FBTyxXQUFZLFNBQVEsV0FBVztJQVV4QyxZQUNJLElBQWdCLEVBQ2hCLFFBQWtCLEVBQ1YsbUJBQXVDLEVBQ3ZDLGNBQTZCLEVBQzdCLGFBQTJCLEVBQzNCLGVBQStCLEVBQy9CLHdCQUFpRCxFQUNqRCxtQkFBOEM7UUFFdEQsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFQbEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUN2QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUF5QjtR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QUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0ICogYXMgSldUXyBmcm9tICdqd3QtZGVjb2RlJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29udGV4dC9hcHBsaWNhdGlvbi1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgQmFzaWNVc2VySW5mbyB9IGZyb20gJy4uL21vZGVscy9iYXNpYy11c2VyLWluZm8nO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvIH0gZnJvbSAnLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFBhZ2VPcHRpb25CYXNlIH0gZnJvbSAnLi4vbW9kZWxzL3BhZ2Utb3B0aW9uJztcclxuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4vZW52aXJvbm1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi9leGNlcHRpb24taGFuZGxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuL3NpZ25hbHIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIHByb2QgYnVpbGRcclxuY29uc3QgSldUID0gSldUXztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XHJcbiAgICBzZXJ2aWNlQ29kZSA9ICd1c2Vyb3JnJztcclxuICAgIHJlYWRvbmx5IFVTRVJfSU5GT19LRVkgPSAndXNlcl9pbmZvJztcclxuICAgIHJlYWRvbmx5IENVUlJFTlRfVVNFUl9LRVkgPSAnY3VycmVudF91c2VyX2luZm8nO1xyXG4gICAgcmVhZG9ubHkgUkVUUllfQ09VTlQ6IG51bWJlciA9IDA7XHJcbiAgICByZWFkb25seSBSRVBMQVlfQ09VTlQ6IG51bWJlciA9IDEwO1xyXG4gICAgcmVhZG9ubHkgREVGQVVMVF9BVkFUQVJfTUFMRTtcclxuICAgIHJlYWRvbmx5IERFRkFVTFRfQVZBVEFSX0ZFTUFMRTtcclxuICAgIHJlYWRvbmx5IG9yZ2FuaXphdGlvbkVuZHBvaW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgX2Vudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2F1dGhlblNlcnZpY2U6IEF1dGhlblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfb2F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfc2lnbmFsclNlcnZpY2U6IFNpZ25hbFJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2V4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlOiBFeGNlcHRpb25IYW5kbGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hcHBsaWNhdGlvbkNvbnRleHQ6IEFwcGxpY2F0aW9uQ29udGV4dFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGh0dHAsIGluamVjdG9yLCAnJyk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5kUG9pbnQgPSBfZW52aXJvbm1lbnRTZXJ2aWNlLmdldEh0dHBTZXJ2aWNlRW5kcG9pbnRXaXRoVmVyc2lvbih0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgICAgICB0aGlzLnNlcnZpY2VVcmkgPSBgJHt0aGlzLmVuZFBvaW50fS91c2VyYDtcclxuXHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlVXJpID0gdGhpcy5nZXRTZXJ2aWNlVXJsKCk7XHJcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25FbmRwb2ludCA9IHRoaXMuZ2V0U2VydmljZVVybCgpO1xyXG5cclxuICAgICAgICB0aGlzLkRFRkFVTFRfQVZBVEFSX01BTEUgPSBfZW52aXJvbm1lbnRTZXJ2aWNlLmdldERlZmF1bHRNYWxlQXZhdGFyKCk7XHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEUgPSBfZW52aXJvbm1lbnRTZXJ2aWNlLmdldERlZmF1bHRGZW1hbGVBdmF0YXIoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm9vdENvbnRleHRTdWIgPSB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQucm9vdENvbnRleHRMb2FkZWQuc3Vic2NyaWJlKHJzMSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyczEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGJpbmRpbmcgZXZlbnQgdXNlciBjaGFuZ2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0lORk9fQ0hBTkdFRCwgcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChycykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlQ3VycmVudFVzZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByb290Q29udGV4dFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NpZ25hbHJTZXJ2aWNlLnN0YXJ0KG51bGwsICdVU0VSX0lORk9fRURJVEVEJywgZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVXNlckluZm9DaGFuZ2UoZGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTZXJ2aWNlVXJsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuaXNVc2VPbGRTZXJ2aWNlKHRoaXMuc2VydmljZUNvZGUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJPbGRPcmdhbml6YXRpb24gPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0SHR0cFNlcnZpY2VFbmRwb2ludE9sZCh0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VzZXJPbGRPcmdhbml6YXRpb259L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck9yZ0VuZHBvaW50ID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEh0dHBTZXJ2aWNlRW5kcG9pbnRXaXRoVmVyc2lvbih0aGlzLnNlcnZpY2VDb2RlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VzZXJPcmdFbmRwb2ludH0vdXNlcmA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZ1bGxDYW5Cb0xhYmVsKGl0ZW0sIGdldERpc3BsYXlOYW1lID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgbGFiZWwgPSBnZXREaXNwbGF5TmFtZSAmJiBpdGVtLmRpc3BsYXlOYW1lID8gaXRlbS5kaXNwbGF5TmFtZSA6IHRoaXMuZ2V0VXNlck5hbWUoaXRlbSk7XHJcbiAgICAgICAgbGFiZWwgPSAoaXRlbS5tYUNodWNWdSA/IGAke2l0ZW0ubWFDaHVjVnV9LiBgIDogJycpICsgYCR7bGFiZWx9YCArIChpdGVtLnRlbkRvblZpID8gYCAtICR7aXRlbS50ZW5Eb25WaX1gIDogJycpO1xyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxXaXRoSW5mbyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFDdXN0b21Sb3V0ZSgnV2l0aEluZm8nLCBmaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQYWdlV2l0aEluZm8oZ3JpZEluZm86IEdyaWRJbmZvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlHcmlkUmVxdWVzdChncmlkSW5mbywgJ1dpdGhJbmZvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5mbyhpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChgJHt0aGlzLnNlcnZpY2VVcml9L0dldEluZm8vJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmZvRm9yV29ya2Zsb3coaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRJbmZvRm9yV29ya2Zsb3cvJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDbGFpbShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBKV1QuZGVmYXVsdCh0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZWRba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVVc2VySW5mb0NoYW5nZShkYXRhKSB7XHJcbiAgICAgICAgbGV0IGRhdGFPYmo7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGRhdGFPYmogPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbmZvVXNlciA9IEpTT04ucGFyc2UoZGF0YU9iai5tZXNzYWdlLmNvbnRlbnQpO1xyXG4gICAgICAgIGlmIChpbmZvVXNlci5JZCkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlVTRVJfSU5GT19LRVkgKyAnXycgKyBpbmZvVXNlci5JZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QmFzaWNVc2VySW5mbyhpbmZvVXNlci5JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZvckF1dG9Db21wbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0dldEZvckF1dG9Db21wbGV0ZT9rZXk9JHtrZXl9YDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihhcGlVcmwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fZXhjZXB0aW9uSGFuZGxlclNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpXHJcbiAgICAgICAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdWxhdGVDdXJyZW50VXNlcigpIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IDxUblVzZXI+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgaWYgKCF1c2VyLnVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdXNlci51c2VySWQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIub3JpZ2luSWQgPSB1c2VyLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXIuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZmlyZVJlcGxheUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLnJlcGxheVN1YnNjcmliZU9uY2UoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9SRUFEWSwgcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaW1lTG9naW4gPSBycyA/PyBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdGhpcy5fb2F1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkOiBhbnkgPSBKV1QuZGVmYXVsdChhY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgICAgICAgICAvLyBDaHV54buDbiDEkeG7lWkgc2FuZyBkw7luZyBpbnN0YW5jZUlkIG7hur91IMSRxINuZyBuaOG6rXAgYuG6sW5nIGlkZW50aXR5djQgbmjGsG5nIHBo4bqjaSBz4butIGThu6VuZyBiYXNlIHVzZXJPcmd2NVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gZGVjb2RlZC5zdWI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IHJhd1VzZXJJZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhZmZJbmZvKHVzZXJJZFJlc3VsdCkudGhlbihyczEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVG5Vc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlzc3VwZXJ1c2VyID0gZGVjb2RlZC5pc3N1cGVydXNlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pc2FkbWluID0gZGVjb2RlZC5pc2FkbWluO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXJJZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5mdWxsTmFtZSA9IGRlY29kZWQuZnVsbG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudXNlck5hbWUgPSBkZWNvZGVkLnVzZXJuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm1hQ2FuQm8gPSBkZWNvZGVkLm1hQ2FuQm87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWFOZ3VvaUhvYyA9IGRlY29kZWQubWFOZ3VvaUhvYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5hdmF0YXIgPSByczEuYXZhdGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uID0gcnMxLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnJvbGUgPSByczEucm9sZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5nZW5kZXIgPSByczEuZ2VuZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uQ29kZSA9IHJzMS5wb3NpdGlvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaW5zdGFuY2VpZCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pZENhbkJvID0gZGVjb2RlZC5pZENhbkJvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm9yaWdpbklkID0gZGVjb2RlZC5zdWI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZXIuYXZhdGFyIHx8IHVzZXIuYXZhdGFyID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlci5nZW5kZXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfTUFMRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50VXNlciA9IHVzZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWVMb2dpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuTkVFRF9DTEVBUl9QRVJNSVNTSU9OX0NBQ0hFKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmZpcmVSZXBsYXlFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0xPQURFRCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Byb2ZpbGVzJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzS2hvYVZpZW4oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIwJyB8fCBpZExvYWlEb25WaSA9PSAnNjAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQm9Nb24oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIxJztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50VXNlcigpOiBUblVzZXIge1xyXG4gICAgICAgIHJldHVybiA8VG5Vc2VyPih0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VyTmFtZShpdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5mdWxsTmFtZU5ld1xyXG4gICAgICAgICAgICA/IGAke2l0ZW0uZnVsbE5hbWVOZXd9YFxyXG4gICAgICAgICAgICA6IGAke2l0ZW0ubGFzdE5hbWV9ICR7aXRlbS5maXN0TmFtZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJJZENvbWJpbmUoKSB7XHJcbiAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdGhpcy5nZXRJZCgpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlcihyYXdVc2VySWQpO1xyXG4gICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAoIWlzTmFOKHVzZXJJZCkpIHtcclxuICAgICAgICAgICAgdXNlcklkUmVzdWx0ID0gdGhpcy5nZXRJbnN0YW5jZUlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB1c2VySWRSZXN1bHQgPSByYXdVc2VySWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1c2VySWRSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGFmZkluZm8odXNlcklkKTogUHJvbWlzZTxUblVzZXI+IHtcclxuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9LyR7dXNlcklkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0Pih1cmwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gPFRuVXNlcj57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBycy5kYXRhID8gcnMuZGF0YS5mdWxsTmFtZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBycy5kYXRhID8gcnMuZGF0YS5yb2xlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogcnMuZGF0YSA/IHJzLmRhdGEuYXZhdGFyIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmRlcjogcnMuZGF0YSA/IHJzLmRhdGEuZ2VuZGVyIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Db2RlOiBycy5kYXRhLnBvc2l0aW9uQ29kZSA/IHJzLmRhdGEucG9zaXRpb25Db2RlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlaWQ6IHJzLmRhdGEuaW5zdGFuY2VpZFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghb3AuYXZhdGFyIHx8IG9wLmF2YXRhciA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AuZ2VuZGVyID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfRkVNQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLnVzZXJJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRVc2VyKCkudXNlcklkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbnN0YW5jZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25saW5lKGZvcm1EYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3JlZ2lzdGVyT25saW5lYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBmb3JtRGF0YSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNpY1VzZXJJbmZvKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvPiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlcklkKTtcclxuICAgICAgICAvLyBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2VySW5mb3MgPyB1c2VySW5mb3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHVzZXJJZCkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VySWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJJbmZvP2lkPSR7dXNlcklkfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcmVzcG9uc2UgdG8gbG9jYWwgc3RvcmFnZSBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArIHJlcHNvbnNlLmRhdGEuaWQsIEpTT04uc3RyaW5naWZ5KHJlcHNvbnNlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2ljVXNlcnNJbmZvKHVzZXJJZHM6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mb1tdPiB7XHJcbiAgICAgICAgaWYgKCF1c2VySWRzIHx8IHVzZXJJZHMgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvW10+W10pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJbmZvcyA9IDxCYXNpY1VzZXJJbmZvW10+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZXJzID0gdXNlckluZm9zID8gdXNlckluZm9zLmZpbHRlcihpdGVtID0+IHVzZXJJZHMuaW5kZXhPZihgLCR7aXRlbS5pZH0sYCkgPiAtMSkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gdXNlckluZm9zID8gdXNlcklkcy5pbmRleE9mKHVzZXJJbmZvc1snaWQnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKHVzZXJJbmZvcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJzSW5mbz91c2VySWRzPSR7dXNlcklkc31gO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSMOgbSBkw7luZyDEkeG7gyBs4bqleSB0aMO0bmcgdGluIGPGoSBi4bqjbiBuaGnhu4F1IG5nxrDhu51pIGTDuW5nIGThu7FhIHbDoG8gdXNlck5hbWUsXHJcbiAgICAgKiBoaeG7h24gdOG6oWkgY2jGsGEgY8OzIHRow7RuZyB0aW4gduG7gSDEkcahbiB24buLIHbDoCBjaOG7qWMgduG7pSBuZ8aw4budaSBkw7luZyDEkeG7gyBnaeG6o20gbG9hZCB2w6AgdsOsIGNoxrBhIGTDuW5nIMSR4bq/blxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lXHJcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm9bXT5cclxuICAgICAqL1xyXG4gICAgZ2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWUodXNlck5hbWU6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mbz4ge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlck5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTmFtZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWU/dXNlck5hbWU9JHt1c2VyTmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSByZXNwb25zZSB0byBsb2NhbCBzdG9yYWdlIGhlcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkgKyAnXycgKyByZXBzb25zZS5kYXRhLnVzZXJOYW1lLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSg8YW55Pnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEjDoG0gZMO5bmcgxJHhu4MgbOG6pXkgdGjDtG5nIHRpbiBjxqEgYuG6o24gbmhp4buBdSBuZ8aw4budaSBkw7luZyBk4buxYSB2w6BvIHVzZXJOYW1lLFxyXG4gICAgICogaGnhu4duIHThuqFpIGNoxrBhIGPDsyB0aMO0bmcgdGluIHbhu4EgxJHGoW4gduG7iyB2w6AgY2jhu6ljIHbhu6UgbmfGsOG7nWkgZMO5bmcgxJHhu4MgZ2nhuqNtIGxvYWQgdsOgIHbDrCBjaMawYSBkw7luZyDEkeG6v25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZXNcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mb1tdPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYXNpY1VzZXJzSW5mb0J5VXNlck5hbWVzKHVzZXJOYW1lczogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvW10+IHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlckluZm9zID0gPEJhc2ljVXNlckluZm9bXT5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJOYW1lcy5pbmRleE9mKHVzZXJJbmZvc1sndXNlck5hbWUnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VySW5mb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcz91c2VyTmFtZXM9JHt1c2VyTmFtZXN9YDtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArICg8QmFzaWNVc2VySW5mb1tdPnJlcHNvbnNlLmRhdGEpLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgudXNlck5hbWUpIHJldHVybiB4LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvW10+cmVwc29uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICkudG9Qcm9taXNlKCkuY2F0Y2goZXJyID0+IFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydExpc3RVc2VySWRUb1N0cmluZyh1c2VySWRzOiBudW1iZXJbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHVzZXJJZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCwke3VzZXJJZHMuam9pbignLCcpfSxgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJywnO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbGxCYXNpY1VzZXJJbmZvKGRhdGFTb3VyY2U6IGFueVtdLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHVzZXJJZCA9IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA/IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA6IGl0ZW1bcHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHVzZXIgPT4gdXNlci5pZCA9PT0gdXNlcklkKTtcclxuICAgICAgICAgICAgLy8gaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgLy8gICAgIGl0ZW1bcHJvcGVydHlOYW1lXSA9IHVzZXI7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJlc3RvcmVQYXNzd29yZChpdGVtOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuc2VydmljZVVyaX0vcmVzdG9yZVBhc3N3b3JkYCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0NoYW5nZVBhc3N3b3JkYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UGFzc3dvcmQoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3Jlc2V0UGFzc3dvcmRgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRzQnlNYW5hZ2VySWRBcnJheUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRMb3dlclN0YWZmc0J5VXNlcklkP3VzZXJJZD0ke2lkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChhcGlVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc0FkbWluKHVzZXJJZDogbnVtYmVyLCBpc0FkbWluOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9tYXJrQXNBZG1pbi8ke3VzZXJJZH0vJHtpc0FkbWlufWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnB1dDxSZXNwb25zZVJlc3VsdD4odXJsLCBpc0FkbWluKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc1JlcHJlc2VudCh1c2VySWQ6IG51bWJlciwgaXNSZXByZXNlbnQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbWFya0FzUmVwcmVzZW50LyR7dXNlcklkfS8ke2lzUmVwcmVzZW50fWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KHVybCwgaXNSZXByZXNlbnQpXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uTGlzdElkKHBhZ2VPcHRpb246IFBhZ2VPcHRpb25CYXNlLCBmdW5HZXROYW1lOiBzdHJpbmcgPSAnJywgb3B0aW9uUGFyYW1ldGVyOiBzdHJpbmcgPSAnJywgZGVmYXVsdFBhcmFtZXRlcjogc3RyaW5nID0gJycpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVN0cmluZyA9IGA/a2V5PSR7cGFnZU9wdGlvbi5xdWVyeX1gO1xyXG5cclxuICAgICAgICBpZiAoIXBhZ2VPcHRpb24ub2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHBhZ2VPcHRpb24ub2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmb2Zmc2V0PSR7cGFnZU9wdGlvbi5vZmZzZXR9YDtcclxuXHJcblxyXG4gICAgICAgIGlmICghcGFnZU9wdGlvbi5saW1pdCkge1xyXG4gICAgICAgICAgICBwYWdlT3B0aW9uLmxpbWl0ID0gdGhpcy5MSU1JVF9ERUZBVUxUO1xyXG4gICAgICAgIH1cclxuICAgICAgICBxdWVyeVN0cmluZyArPSBgJmxpbWl0PSR7cGFnZU9wdGlvbi5saW1pdCArIDF9YDtcclxuXHJcblxyXG4gICAgICAgIGlmIChwYWdlT3B0aW9uLnNvcnRGaWVsZCkge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJnNvcnRGaWVsZD0ke3BhZ2VPcHRpb24uc29ydEZpZWxkfSZpc0FzYz0ke3BhZ2VPcHRpb24uaXNBc2N9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlZmF1bHRQYXJhbWV0ZXIgIT0gJycpIHtcclxuICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gYCYke2RlZmF1bHRQYXJhbWV0ZXJ9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvblBhcmFtZXRlciAhPSAnJykge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJiR7b3B0aW9uUGFyYW1ldGVyfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMub3JnYW5pemF0aW9uRW5kcG9pbnR9JHtmdW5HZXROYW1lfSR7cXVlcnlTdHJpbmd9YDtcclxuICAgICAgICBpZiAocGFnZU9wdGlvbi5pc0lnbm9yZUNsaWVudENhY2hlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElnbm9yZUNsaWVudENhY2hlKGFwaVVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uSWQob3JnYW5pemF0aW9uSWQ6IHN0cmluZywga2V5d29yZD86IHN0cmluZywgb2Zmc2V0PzogbnVtYmVyLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgaWYgKCFrZXl3b3JkKSB7XHJcbiAgICAgICAgICAgIGtleXdvcmQgPSAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9mZnNldCkge1xyXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFsaW1pdCkge1xyXG4gICAgICAgICAgICBsaW1pdCA9IDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRzQnlPcmdhbml6YXRpb25JZGBcclxuICAgICAgICAgICAgKyBgP29yZ2FuaXphdGlvbklkPSR7b3JnYW5pemF0aW9uSWR9YFxyXG4gICAgICAgICAgICArIGAma2V5d29yZD0ke2tleXdvcmR9YFxyXG4gICAgICAgICAgICArIGAmb2Zmc2V0PSR7b2Zmc2V0fWBcclxuICAgICAgICAgICAgKyBgJmxpbWl0PSR7bGltaXR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGVmYXVsdEF2YXRhcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGNvbW1vblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoQ29tbW9uU2VydmljZSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyb3IsIGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NrVXNlcihpdGVtOiBhbnkpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja1VzZXIoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3VubG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU3VwZXJVc2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNzdXBlcnVzZXIgPT09ICdUcnVlJztcclxuICAgIH1cclxuXHJcbiAgICBpc0FkbWluKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNhZG1pbiA9PT0gJ1RydWUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsaWRBY2Nlc3NUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2Vyc0J5R3JvdXBDb2RlKGdyb3VwQ29kZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0VXNlcnNCeUdyb3VwQ29kZT9ncm91cENvZGU9JHtncm91cENvZGV9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLl9leGNlcHRpb25IYW5kbGVyU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuc2VydmljZVVyaX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2luaFZpZW5BY2NvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHVzZXJMb2dpbiA9IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBpZiAodXNlckxvZ2luKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTG9naW4ubWFOZ3VvaUhvYykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBhZ2VVc2VySW5mbyh1c2VySWRzOiBzdHJpbmcpOiBQcm9taXNlPEJhc2ljVXNlckluZm9bXT4ge1xyXG4gICAgICAgIGlmICghdXNlcklkcyB8fCB1c2VySWRzID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8QmFzaWNVc2VySW5mb1tdPltdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZKTtcclxuICAgICAgICBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCB1c2VycyA9IHVzZXJJbmZvcyA/IHVzZXJJbmZvcy5maWx0ZXIoaXRlbSA9PiB1c2VySWRzLmluZGV4T2YoYCwke2l0ZW0uaWR9LGApID4gLTEpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJJZHMuaW5kZXhPZih1c2VySW5mb3NbJ2lkJ10pID4gLTEgOiBudWxsO1xyXG4gICAgICAgIGlmIChjaGVjaykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VySW5mb3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0UGFnZWRgO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXNlcklkc1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChpdGVtRmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAxMDAwMFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc29ydHM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGdyaWRJbmZvKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFckQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE9BQU8sRUFBVSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7O0FBS2pELHFCQUFxQjtBQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFLakIsTUFBTSxPQUFPLFdBQVksU0FBUSxXQUFXO0lBVXhDLFlBQ0ksSUFBZ0IsRUFDaEIsUUFBa0IsRUFDVixtQkFBdUMsRUFDdkMsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsZUFBK0IsRUFDL0Isd0JBQWlELEVBQ2pELG1CQUE4QztRQUV0RCxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQVBsQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLG9CQUFlLEdBQWYsZUFB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QUZSLE1BQU07MkZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XHJcbmltcG9ydCAqIGFzIEpXVF8gZnJvbSAnand0LWRlY29kZSc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgcmV0cnksIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwLWNvbnRleHQvYXBwbGljYXRpb24tY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IEJhc2ljVXNlckluZm8gfSBmcm9tICcuLi9tb2RlbHMvYmFzaWMtdXNlci1pbmZvJztcclxuaW1wb3J0IHsgRmlsdGVyLCBHcmlkSW5mbyB9IGZyb20gJy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBQYWdlT3B0aW9uQmFzZSB9IGZyb20gJy4uL21vZGVscy9wYWdlLW9wdGlvbic7XHJcbmltcG9ydCB7IFJlc3BvbnNlUmVzdWx0IH0gZnJvbSAnLi4vbW9kZWxzL3Jlc3BvbnNlLXJlc3VsdCc7XHJcbmltcG9ydCB7IFRuVXNlciB9IGZyb20gJy4uL21vZGVscy90bi11c2VyJztcclxuaW1wb3J0IHsgQXV0aGVuU2VydmljZSB9IGZyb20gJy4vYXV0aGVuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4vY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuL2Vudmlyb25tZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeGNlcHRpb25IYW5kbGVyU2VydmljZSB9IGZyb20gJy4vZXhjZXB0aW9uLWhhbmRsZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSAnLi9zaWduYWxyLnNlcnZpY2UnO1xyXG5cclxuLy8gZml4IGZvciBwcm9kIGJ1aWxkXHJcbmNvbnN0IEpXVCA9IEpXVF87XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2Uge1xyXG4gICAgc2VydmljZUNvZGUgPSAndXNlcm9yZyc7XHJcbiAgICByZWFkb25seSBVU0VSX0lORk9fS0VZID0gJ3VzZXJfaW5mbyc7XHJcbiAgICByZWFkb25seSBDVVJSRU5UX1VTRVJfS0VZID0gJ2N1cnJlbnRfdXNlcl9pbmZvJztcclxuICAgIHJlYWRvbmx5IFJFVFJZX0NPVU5UOiBudW1iZXIgPSAwO1xyXG4gICAgcmVhZG9ubHkgUkVQTEFZX0NPVU5UOiBudW1iZXIgPSAxMDtcclxuICAgIHJlYWRvbmx5IERFRkFVTFRfQVZBVEFSX01BTEU7XHJcbiAgICByZWFkb25seSBERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICByZWFkb25seSBvcmdhbml6YXRpb25FbmRwb2ludDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX29hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NpZ25hbHJTZXJ2aWNlOiBTaWduYWxSU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9leGNlcHRpb25IYW5kbGVyU2VydmljZTogRXhjZXB0aW9uSGFuZGxlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfYXBwbGljYXRpb25Db250ZXh0OiBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihodHRwLCBpbmplY3RvciwgJycpO1xyXG5cclxuICAgICAgICB0aGlzLmVuZFBvaW50ID0gX2Vudmlyb25tZW50U2VydmljZS5nZXRIdHRwU2VydmljZUVuZHBvaW50V2l0aFZlcnNpb24odGhpcy5zZXJ2aWNlQ29kZSk7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlVXJpID0gYCR7dGhpcy5lbmRQb2ludH0vdXNlcmA7XHJcblxyXG4gICAgICAgIHRoaXMuc2VydmljZVVyaSA9IHRoaXMuZ2V0U2VydmljZVVybCgpO1xyXG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uRW5kcG9pbnQgPSB0aGlzLmdldFNlcnZpY2VVcmwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFID0gX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0TWFsZUF2YXRhcigpO1xyXG4gICAgICAgIHRoaXMuREVGQVVMVF9BVkFUQVJfRkVNQUxFID0gX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0RmVtYWxlQXZhdGFyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJvb3RDb250ZXh0U3ViID0gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LnJvb3RDb250ZXh0TG9hZGVkLnN1YnNjcmliZShyczEgPT4ge1xyXG4gICAgICAgICAgICBpZiAocnMxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBiaW5kaW5nIGV2ZW50IHVzZXIgY2hhbmdlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9JTkZPX0NIQU5HRUQsIHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DVVJSRU5UX1VTRVJfS0VZKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZUN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcm9vdENvbnRleHRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS5zdGFydChudWxsLCAnVVNFUl9JTkZPX0VESVRFRCcsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbmZvQ2hhbmdlKGRhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U2VydmljZVVybCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmlzVXNlT2xkU2VydmljZSh0aGlzLnNlcnZpY2VDb2RlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyT2xkT3JnYW5pemF0aW9uID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEh0dHBTZXJ2aWNlRW5kcG9pbnRPbGQodGhpcy5zZXJ2aWNlQ29kZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt1c2VyT2xkT3JnYW5pemF0aW9ufS91c2VyYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJPcmdFbmRwb2ludCA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRIdHRwU2VydmljZUVuZHBvaW50V2l0aFZlcnNpb24odGhpcy5zZXJ2aWNlQ29kZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt1c2VyT3JnRW5kcG9pbnR9L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGdWxsQ2FuQm9MYWJlbChpdGVtLCBnZXREaXNwbGF5TmFtZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGxhYmVsID0gZ2V0RGlzcGxheU5hbWUgJiYgaXRlbS5kaXNwbGF5TmFtZSA/IGl0ZW0uZGlzcGxheU5hbWUgOiB0aGlzLmdldFVzZXJOYW1lKGl0ZW0pO1xyXG4gICAgICAgIGxhYmVsID0gKGl0ZW0ubWFDaHVjVnUgPyBgJHtpdGVtLm1hQ2h1Y1Z1fS4gYCA6ICcnKSArIGAke2xhYmVsfWAgKyAoaXRlbS50ZW5Eb25WaSA/IGAgLSAke2l0ZW0udGVuRG9uVml9YCA6ICcnKTtcclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsV2l0aEluZm8oZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRhQ3VzdG9tUm91dGUoJ1dpdGhJbmZvJywgZmlsdGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGFnZVdpdGhJbmZvKGdyaWRJbmZvOiBHcmlkSW5mbykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ5R3JpZFJlcXVlc3QoZ3JpZEluZm8sICdXaXRoSW5mbycpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluZm8oaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRJbmZvLyR7aWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5mb0ZvcldvcmtmbG93KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGAke3RoaXMuc2VydmljZVVyaX0vR2V0SW5mb0ZvcldvcmtmbG93LyR7aWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xhaW0oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBkZWNvZGVkID0gSldULmRlZmF1bHQodGhpcy5fb2F1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCkpO1xyXG4gICAgICAgIHJldHVybiBkZWNvZGVkW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVXNlckluZm9DaGFuZ2UoZGF0YSkge1xyXG4gICAgICAgIGxldCBkYXRhT2JqO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBkYXRhT2JqID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5mb1VzZXIgPSBKU09OLnBhcnNlKGRhdGFPYmoubWVzc2FnZS5jb250ZW50KTtcclxuICAgICAgICBpZiAoaW5mb1VzZXIuSWQpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEJhc2ljVXNlckluZm8oaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JBdXRvQ29tcGxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRGb3JBdXRvQ29tcGxldGU/a2V5PSR7a2V5fWA7XHJcblxyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2V4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKVxyXG4gICAgICAgICAgICApKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3B1bGF0ZUN1cnJlbnRVc2VyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DVVJSRU5UX1VTRVJfS0VZKTtcclxuICAgICAgICBjb25zdCB1c2VyID0gPFRuVXNlcj5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICBpZiAoIXVzZXIudXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmxvZ291dCgpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DVVJSRU5UX1VTRVJfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYXdVc2VySWQgPSB1c2VyLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlcihyYXdVc2VySWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih1c2VySWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlci5vcmlnaW5JZCA9IHVzZXIudXNlcklkO1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIudXNlcklkID0gdXNlci5pbnN0YW5jZWlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIgPSB1c2VyO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5maXJlUmVwbGF5RXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9MT0FERUQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkucmVwbGF5U3Vic2NyaWJlT25jZShDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX1JFQURZLCBycyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRpbWVMb2dpbiA9IHJzID8/IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWQ6IGFueSA9IEpXVC5kZWZhdWx0KGFjY2Vzc1Rva2VuKTtcclxuICAgICAgICAgICAgICAgIC8vIENodXnhu4NuIMSR4buVaSBzYW5nIGTDuW5nIGluc3RhbmNlSWQgbuG6v3UgxJHEg25nIG5o4bqtcCBi4bqxbmcgaWRlbnRpdHl2NCBuaMawbmcgcGjhuqNpIHPhu60gZOG7pW5nIGJhc2UgdXNlck9yZ3Y1XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYXdVc2VySWQgPSBkZWNvZGVkLnN1YjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlcihyYXdVc2VySWQpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHVzZXJJZFJlc3VsdCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTih1c2VySWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkUmVzdWx0ID0gZGVjb2RlZC5pbnN0YW5jZWlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkUmVzdWx0ID0gcmF3VXNlcklkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTdGFmZkluZm8odXNlcklkUmVzdWx0KS50aGVuKHJzMSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBUblVzZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaXNzdXBlcnVzZXIgPSBkZWNvZGVkLmlzc3VwZXJ1c2VyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlzYWRtaW4gPSBkZWNvZGVkLmlzYWRtaW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudXNlcklkID0gdXNlcklkUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmZ1bGxOYW1lID0gZGVjb2RlZC5mdWxsbmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci51c2VyTmFtZSA9IGRlY29kZWQudXNlcm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWFDYW5CbyA9IGRlY29kZWQubWFDYW5CbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5tYU5ndW9pSG9jID0gZGVjb2RlZC5tYU5ndW9pSG9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmF2YXRhciA9IHJzMS5hdmF0YXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIucG9zaXRpb24gPSByczEucG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIucm9sZSA9IHJzMS5yb2xlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmdlbmRlciA9IHJzMS5nZW5kZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIucG9zaXRpb25Db2RlID0gcnMxLnBvc2l0aW9uQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pbnN0YW5jZWlkID0gZGVjb2RlZC5pbnN0YW5jZWlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlkQ2FuQm8gPSBkZWNvZGVkLmlkQ2FuQm87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIub3JpZ2luSWQgPSBkZWNvZGVkLnN1YjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlci5hdmF0YXIgfHwgdXNlci5hdmF0YXIgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyLmdlbmRlciA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5hdmF0YXIgPSB0aGlzLkRFRkFVTFRfQVZBVEFSX0ZFTUFMRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VGltZUxvZ2luKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5ORUVEX0NMRUFSX1BFUk1JU1NJT05fQ0FDSEUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZmlyZVJlcGxheUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZmlsZUluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgncHJvZmlsZXMnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNLaG9hVmllbihpZExvYWlEb25WaSkge1xyXG4gICAgICAgIHJldHVybiBpZExvYWlEb25WaSA9PSAnMjAnIHx8IGlkTG9haURvblZpID09ICc2MCc7XHJcbiAgICB9XHJcblxyXG4gICAgaXNCb01vbihpZExvYWlEb25WaSkge1xyXG4gICAgICAgIHJldHVybiBpZExvYWlEb25WaSA9PSAnMjEnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRVc2VyKCk6IFRuVXNlciB7XHJcbiAgICAgICAgcmV0dXJuIDxUblVzZXI+KHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJOYW1lKGl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmZ1bGxOYW1lTmV3XHJcbiAgICAgICAgICAgID8gYCR7aXRlbS5mdWxsTmFtZU5ld31gXHJcbiAgICAgICAgICAgIDogYCR7aXRlbS5sYXN0TmFtZX0gJHtpdGVtLmZpc3ROYW1lfWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VXNlcklkQ29tYmluZSgpIHtcclxuICAgICAgICBjb25zdCByYXdVc2VySWQgPSB0aGlzLmdldElkKCk7XHJcbiAgICAgICAgY29uc3QgdXNlcklkID0gTnVtYmVyKHJhd1VzZXJJZCk7XHJcbiAgICAgICAgbGV0IHVzZXJJZFJlc3VsdCA9ICcnO1xyXG4gICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICB1c2VySWRSZXN1bHQgPSB0aGlzLmdldEluc3RhbmNlSWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IHJhd1VzZXJJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVzZXJJZFJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YWZmSW5mbyh1c2VySWQpOiBQcm9taXNlPFRuVXNlcj4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vJHt1c2VySWR9YDtcclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVybClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgIG1hcChycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3AgPSA8VG5Vc2VyPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWU6IHJzLmRhdGEgPyBycy5kYXRhLmZ1bGxOYW1lIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IHJzLmRhdGEgPyBycy5kYXRhLnJvbGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyOiBycy5kYXRhID8gcnMuZGF0YS5hdmF0YXIgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZGVyOiBycy5kYXRhID8gcnMuZGF0YS5nZW5kZXIgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNvZGU6IHJzLmRhdGEucG9zaXRpb25Db2RlID8gcnMuZGF0YS5wb3NpdGlvbkNvZGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VpZDogcnMuZGF0YS5pbnN0YW5jZWlkXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcC5hdmF0YXIgfHwgb3AuYXZhdGFyID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcC5nZW5kZXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5hdmF0YXIgPSB0aGlzLkRFRkFVTFRfQVZBVEFSX01BTEU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcDtcclxuICAgICAgICAgICAgICAgIH0pKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SWQoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IDxUblVzZXI+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVzZXIudXNlcklkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFVzZXIoKS51c2VySWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEluc3RhbmNlSWQoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IDxUblVzZXI+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVzZXIuaW5zdGFuY2VpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRVc2VyKCkuaW5zdGFuY2VpZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXJPbmxpbmUoZm9ybURhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vcmVnaXN0ZXJPbmxpbmVgO1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wb3N0PFJlc3BvbnNlUmVzdWx0PihhcGlVcmwsIGZvcm1EYXRhKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNpY1VzZXJJbmZvKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvPiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlcklkKTtcclxuICAgICAgICAvLyBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2VySW5mb3MgPyB1c2VySW5mb3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHVzZXJJZCkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VySWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJJbmZvP2lkPSR7dXNlcklkfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcmVzcG9uc2UgdG8gbG9jYWwgc3RvcmFnZSBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArIHJlcHNvbnNlLmRhdGEuaWQsIEpTT04uc3RyaW5naWZ5KHJlcHNvbnNlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCg8QmFzaWNVc2VySW5mbz57fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNpY1VzZXJzSW5mbyh1c2VySWRzOiBzdHJpbmcpOiBQcm9taXNlPEJhc2ljVXNlckluZm9bXT4ge1xyXG4gICAgICAgIGlmICghdXNlcklkcyB8fCB1c2VySWRzID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8QmFzaWNVc2VySW5mb1tdPltdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZKTtcclxuICAgICAgICBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCB1c2VycyA9IHVzZXJJbmZvcyA/IHVzZXJJbmZvcy5maWx0ZXIoaXRlbSA9PiB1c2VySWRzLmluZGV4T2YoYCwke2l0ZW0uaWR9LGApID4gLTEpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJJZHMuaW5kZXhPZih1c2VySW5mb3NbJ2lkJ10pID4gLTEgOiBudWxsO1xyXG4gICAgICAgIGlmIChjaGVjaykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VySW5mb3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2Vyc0luZm8/dXNlcklkcz0ke3VzZXJJZHN9YDtcclxuICAgICAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0cnkodGhpcy5SRVRSWV9DT1VOVCksXHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwKHJlcHNvbnNlID0+IDxCYXNpY1VzZXJJbmZvW10+cmVwc29uc2UuZGF0YSlcclxuICAgICAgICAgICAgICAgICkpLnRoZW4oc3VjY2VzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdWNjZXNzKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSg8QmFzaWNVc2VySW5mb1tdPltdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIw6BtIGTDuW5nIMSR4buDIGzhuqV5IHRow7RuZyB0aW4gY8ahIGLhuqNuIG5oaeG7gXUgbmfGsOG7nWkgZMO5bmcgZOG7sWEgdsOgbyB1c2VyTmFtZSxcclxuICAgICAqIGhp4buHbiB04bqhaSBjaMawYSBjw7MgdGjDtG5nIHRpbiB24buBIMSRxqFuIHbhu4sgdsOgIGNo4bupYyB24bulIG5nxrDhu51pIGTDuW5nIMSR4buDIGdp4bqjbSBsb2FkIHbDoCB2w6wgY2jGsGEgZMO5bmcgxJHhur9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlck5hbWVcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mb1tdPlxyXG4gICAgICovXHJcbiAgICBnZXRCYXNpY1VzZXJJbmZvQnlVc2VyTmFtZSh1c2VyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvPiB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkgKyAnXycgKyB1c2VyTmFtZSk7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IDxCYXNpY1VzZXJJbmZvPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKHVzZXIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlck5hbWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm8+e30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJOYW1lICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJJbmZvQnlVc2VyTmFtZT91c2VyTmFtZT0ke3VzZXJOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHJlcHNvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHJlc3BvbnNlIHRvIGxvY2FsIHN0b3JhZ2UgaGVyZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArIHJlcHNvbnNlLmRhdGEudXNlck5hbWUsIEpTT04uc3RyaW5naWZ5KHJlcHNvbnNlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEJhc2ljVXNlckluZm8+cmVwc29uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSg8YW55Pnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEjDoG0gZMO5bmcgxJHhu4MgbOG6pXkgdGjDtG5nIHRpbiBjxqEgYuG6o24gbmhp4buBdSBuZ8aw4budaSBkw7luZyBk4buxYSB2w6BvIHVzZXJOYW1lLFxyXG4gICAgICogaGnhu4duIHThuqFpIGNoxrBhIGPDsyB0aMO0bmcgdGluIHbhu4EgxJHGoW4gduG7iyB2w6AgY2jhu6ljIHbhu6UgbmfGsOG7nWkgZMO5bmcgxJHhu4MgZ2nhuqNtIGxvYWQgdsOgIHbDrCBjaMawYSBkw7luZyDEkeG6v25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZXNcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mb1tdPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYXNpY1VzZXJzSW5mb0J5VXNlck5hbWVzKHVzZXJOYW1lczogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvW10+IHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlckluZm9zID0gPEJhc2ljVXNlckluZm9bXT5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJOYW1lcy5pbmRleE9mKHVzZXJJbmZvc1sndXNlck5hbWUnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VySW5mb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcz91c2VyTmFtZXM9JHt1c2VyTmFtZXN9YDtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArICg8QmFzaWNVc2VySW5mb1tdPnJlcHNvbnNlLmRhdGEpLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgudXNlck5hbWUpIHJldHVybiB4LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvW10+cmVwc29uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICkpLmNhdGNoKGVyciA9PiBbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnZlcnRMaXN0VXNlcklkVG9TdHJpbmcodXNlcklkczogbnVtYmVyW10pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAsJHt1c2VySWRzLmpvaW4oJywnKX0sYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcsJztcclxuICAgIH1cclxuXHJcbiAgICBmaWxsQmFzaWNVc2VySW5mbyhkYXRhU291cmNlOiBhbnlbXSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAvLyBjb25zdCB1c2VySWQgPSBpdGVtW3Byb3BlcnR5TmFtZV0uaWQgPyBpdGVtW3Byb3BlcnR5TmFtZV0uaWQgOiBpdGVtW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zaGFkb3dlZC12YXJpYWJsZVxyXG4gICAgICAgICAgICAvLyBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1c2VyID0+IHVzZXIuaWQgPT09IHVzZXJJZCk7XHJcbiAgICAgICAgICAgIC8vIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBpdGVtW3Byb3BlcnR5TmFtZV0gPSB1c2VyO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhU291cmNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXN0b3JlUGFzc3dvcmQoaXRlbTogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAucHV0PFJlc3BvbnNlUmVzdWx0PihgJHt0aGlzLnNlcnZpY2VVcml9L3Jlc3RvcmVQYXNzd29yZGAsIGl0ZW0pXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlUGFzc3dvcmQodXNlcklkOiBzdHJpbmcsIGl0ZW06IGFueSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9DaGFuZ2VQYXNzd29yZGA7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRQYXNzd29yZChpdGVtOiBhbnkpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vcmVzZXRQYXNzd29yZGA7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnB1dDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRzQnlNYW5hZ2VySWRBcnJheUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRMb3dlclN0YWZmc0J5VXNlcklkP3VzZXJJZD0ke2lkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChhcGlVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc0FkbWluKHVzZXJJZDogbnVtYmVyLCBpc0FkbWluOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9tYXJrQXNBZG1pbi8ke3VzZXJJZH0vJHtpc0FkbWlufWA7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnB1dDxSZXNwb25zZVJlc3VsdD4odXJsLCBpc0FkbWluKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBtYXJrQXNSZXByZXNlbnQodXNlcklkOiBudW1iZXIsIGlzUmVwcmVzZW50OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L21hcmtBc1JlcHJlc2VudC8ke3VzZXJJZH0vJHtpc1JlcHJlc2VudH1gO1xyXG5cclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucHV0PFJlc3BvbnNlUmVzdWx0Pih1cmwsIGlzUmVwcmVzZW50KVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRzQnlPcmdhbml6YXRpb25MaXN0SWQocGFnZU9wdGlvbjogUGFnZU9wdGlvbkJhc2UsIGZ1bkdldE5hbWU6IHN0cmluZyA9ICcnLCBvcHRpb25QYXJhbWV0ZXI6IHN0cmluZyA9ICcnLCBkZWZhdWx0UGFyYW1ldGVyOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gYD9rZXk9JHtwYWdlT3B0aW9uLnF1ZXJ5fWA7XHJcblxyXG4gICAgICAgIGlmICghcGFnZU9wdGlvbi5vZmZzZXQpIHtcclxuICAgICAgICAgICAgcGFnZU9wdGlvbi5vZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcXVlcnlTdHJpbmcgKz0gYCZvZmZzZXQ9JHtwYWdlT3B0aW9uLm9mZnNldH1gO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKCFwYWdlT3B0aW9uLmxpbWl0KSB7XHJcbiAgICAgICAgICAgIHBhZ2VPcHRpb24ubGltaXQgPSB0aGlzLkxJTUlUX0RFRkFVTFQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmbGltaXQ9JHtwYWdlT3B0aW9uLmxpbWl0ICsgMX1gO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHBhZ2VPcHRpb24uc29ydEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmc29ydEZpZWxkPSR7cGFnZU9wdGlvbi5zb3J0RmllbGR9JmlzQXNjPSR7cGFnZU9wdGlvbi5pc0FzY31gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGVmYXVsdFBhcmFtZXRlciAhPSAnJykge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJiR7ZGVmYXVsdFBhcmFtZXRlcn1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3B0aW9uUGFyYW1ldGVyICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmJHtvcHRpb25QYXJhbWV0ZXJ9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5vcmdhbml6YXRpb25FbmRwb2ludH0ke2Z1bkdldE5hbWV9JHtxdWVyeVN0cmluZ31gO1xyXG4gICAgICAgIGlmIChwYWdlT3B0aW9uLmlzSWdub3JlQ2xpZW50Q2FjaGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SWdub3JlQ2xpZW50Q2FjaGUoYXBpVXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYXBpVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRzQnlPcmdhbml6YXRpb25JZChvcmdhbml6YXRpb25JZDogc3RyaW5nLCBrZXl3b3JkPzogc3RyaW5nLCBvZmZzZXQ/OiBudW1iZXIsIGxpbWl0PzogbnVtYmVyKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBpZiAoIWtleXdvcmQpIHtcclxuICAgICAgICAgICAga2V5d29yZCA9ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcclxuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWxpbWl0KSB7XHJcbiAgICAgICAgICAgIGxpbWl0ID0gMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0dldHNCeU9yZ2FuaXphdGlvbklkYFxyXG4gICAgICAgICAgICArIGA/b3JnYW5pemF0aW9uSWQ9JHtvcmdhbml6YXRpb25JZH1gXHJcbiAgICAgICAgICAgICsgYCZrZXl3b3JkPSR7a2V5d29yZH1gXHJcbiAgICAgICAgICAgICsgYCZvZmZzZXQ9JHtvZmZzZXR9YFxyXG4gICAgICAgICAgICArIGAmbGltaXQ9JHtsaW1pdH1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYXBpVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZWZhdWx0QXZhdGFyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkRFRkFVTFRfQVZBVEFSX01BTEU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSwgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgY29tbW9uU2VydmljZSA9IGluamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcclxuICAgICAgICByZXR1cm4gY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnJvciwgaW5qZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2tVc2VyKGl0ZW06IGFueSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9sb2NrVXNlckFjY291bnRgO1xyXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wb3N0PFJlc3BvbnNlUmVzdWx0PihhcGlVcmwsIGl0ZW0pXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja1VzZXIoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3VubG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1N1cGVyVXNlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50VXNlclxyXG4gICAgICAgICAgICAmJiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyLmlzc3VwZXJ1c2VyID09PSAnVHJ1ZSc7XHJcbiAgICB9XHJcblxyXG4gICAgaXNBZG1pbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50VXNlclxyXG4gICAgICAgICAgICAmJiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyLmlzYWRtaW4gPT09ICdUcnVlJztcclxuICAgIH1cclxuXHJcbiAgICBpc1ZhbGlkQWNjZXNzVG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VXNlcnNCeUdyb3VwQ29kZShncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0dldFVzZXJzQnlHcm91cENvZGU/Z3JvdXBDb2RlPSR7Z3JvdXBDb2RlfWA7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihhcGlVcmwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fZXhjZXB0aW9uSGFuZGxlclNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNlcnZpY2VFbmRwb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5zZXJ2aWNlVXJpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTaW5oVmllbkFjY291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgdXNlckxvZ2luID0gdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIGlmICh1c2VyTG9naW4pIHtcclxuICAgICAgICAgICAgaWYgKHVzZXJMb2dpbi5tYU5ndW9pSG9jKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGFnZVVzZXJJbmZvKHVzZXJJZHM6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mb1tdPiB7XHJcbiAgICAgICAgaWYgKCF1c2VySWRzIHx8IHVzZXJJZHMgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvW10+W10pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJbmZvcyA9IDxCYXNpY1VzZXJJbmZvW10+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZXJzID0gdXNlckluZm9zID8gdXNlckluZm9zLmZpbHRlcihpdGVtID0+IHVzZXJJZHMuaW5kZXhPZihgLCR7aXRlbS5pZH0sYCkgPiAtMSkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gdXNlckluZm9zID8gdXNlcklkcy5pbmRleE9mKHVzZXJJbmZvc1snaWQnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKHVzZXJJbmZvcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRQYWdlZGA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gW107XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnaWQnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiAnaW4nLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1c2VySWRzXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKGl0ZW1GaWx0ZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZEluZm8gPSBuZXcgR3JpZEluZm8oe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwMDAwXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzb3J0czogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZmlyc3RWYWx1ZUZyb20odGhpcy5faHR0cC5wb3N0PFJlc3BvbnNlUmVzdWx0PihzdlVybCwgZ3JpZEluZm8pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiA8QmFzaWNVc2VySW5mb1tdPnJlcHNvbnNlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICApKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|