@cloudbase/oauth 2.23.3 → 2.24.0
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/dist/cjs/auth/apis.js +170 -14
- package/dist/cjs/auth/auth-error.js +32 -0
- package/dist/cjs/auth/consts.js +24 -2
- package/dist/cjs/auth/models.js +1 -1
- package/dist/cjs/captcha/captcha-dom.js +223 -0
- package/dist/cjs/captcha/captcha.js +11 -102
- package/dist/cjs/index.js +25 -3
- package/dist/cjs/oauth2client/interface.js +1 -1
- package/dist/cjs/oauth2client/models.js +1 -1
- package/dist/cjs/oauth2client/oauth2client.js +384 -110
- package/dist/cjs/utils/base64.js +15 -2
- package/dist/esm/auth/apis.js +113 -2
- package/dist/esm/auth/auth-error.js +9 -0
- package/dist/esm/auth/consts.js +22 -0
- package/dist/esm/captcha/captcha-dom.js +129 -0
- package/dist/esm/captcha/captcha.js +14 -97
- package/dist/esm/index.js +18 -2
- package/dist/esm/oauth2client/oauth2client.js +162 -36
- package/dist/esm/utils/base64.js +12 -0
- package/dist/miniprogram/index.js +1 -1
- package/dist/types/auth/apis.d.ts +19 -1
- package/dist/types/auth/auth-error.d.ts +6 -0
- package/dist/types/auth/consts.d.ts +22 -0
- package/dist/types/auth/models.d.ts +2 -0
- package/dist/types/captcha/captcha-dom.d.ts +3 -0
- package/dist/types/captcha/captcha.d.ts +3 -1
- package/dist/types/index.d.ts +11 -2
- package/dist/types/oauth2client/interface.d.ts +1 -1
- package/dist/types/oauth2client/models.d.ts +14 -0
- package/dist/types/oauth2client/oauth2client.d.ts +58 -2
- package/dist/types/utils/base64.d.ts +5 -0
- package/package.json +4 -4
- package/src/auth/apis.ts +189 -4
- package/src/auth/auth-error.ts +21 -0
- package/src/auth/consts.ts +28 -0
- package/src/auth/models.ts +2 -0
- package/src/captcha/captcha-dom.ts +178 -0
- package/src/captcha/captcha.ts +25 -115
- package/src/index.ts +51 -3
- package/src/oauth2client/interface.ts +1 -1
- package/src/oauth2client/models.ts +28 -0
- package/src/oauth2client/oauth2client.ts +254 -34
- package/src/utils/base64.ts +12 -0
|
@@ -46,6 +46,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
50
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
51
|
+
if (ar || !(i in from)) {
|
|
52
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
53
|
+
ar[i] = from[i];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
57
|
+
};
|
|
49
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
59
|
exports.OAuth2Client = exports.defaultStorage = exports.generateRequestId = exports.toResponseError = exports.defaultRequest = void 0;
|
|
51
60
|
var consts_1 = require("./consts");
|
|
@@ -321,6 +330,10 @@ var LocalCredentials = (function () {
|
|
|
321
330
|
var OAuth2Client = exports.OAuth2Client = (function () {
|
|
322
331
|
function OAuth2Client(options) {
|
|
323
332
|
var _this = this;
|
|
333
|
+
var _a;
|
|
334
|
+
this.initializePromise = null;
|
|
335
|
+
this.lockAcquired = false;
|
|
336
|
+
this.pendingInLock = [];
|
|
324
337
|
this.singlePromise = null;
|
|
325
338
|
if (!options.clientSecret) {
|
|
326
339
|
options.clientSecret = '';
|
|
@@ -332,6 +345,7 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
332
345
|
this.apiPath = options.apiPath || consts_2.AUTH_API_PREFIX;
|
|
333
346
|
this.clientId = options.clientId;
|
|
334
347
|
this.i18n = options.i18n;
|
|
348
|
+
this.eventBus = options.eventBus;
|
|
335
349
|
this.singlePromise = new single_promise_1.SinglePromise({ clientId: this.clientId });
|
|
336
350
|
this.retry = this.formatRetry(options.retry, OAuth2Client.defaultRetry);
|
|
337
351
|
if (options.baseRequest) {
|
|
@@ -367,13 +381,64 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
367
381
|
this.refreshTokenFunc = options.refreshTokenFunc || this.defaultRefreshTokenFunc;
|
|
368
382
|
this.anonymousSignInFunc = options.anonymousSignInFunc;
|
|
369
383
|
this.onCredentialsError = options.onCredentialsError;
|
|
384
|
+
this.getInitialSession = options.getInitialSession;
|
|
385
|
+
this.onInitialSessionObtained = options.onInitialSessionObtained;
|
|
386
|
+
this.logDebugMessages = (_a = options.debug) !== null && _a !== void 0 ? _a : false;
|
|
370
387
|
utilities_1.langEvent.bus.on(utilities_1.langEvent.LANG_CHANGE_EVENT, function (params) {
|
|
371
388
|
var _a;
|
|
372
389
|
_this.i18n = ((_a = params.data) === null || _a === void 0 ? void 0 : _a.i18n) || _this.i18n;
|
|
373
390
|
});
|
|
374
391
|
}
|
|
392
|
+
OAuth2Client.prototype.setGetInitialSession = function (callback) {
|
|
393
|
+
this.getInitialSession = callback;
|
|
394
|
+
};
|
|
395
|
+
OAuth2Client.prototype.setOnInitialSessionObtained = function (callback) {
|
|
396
|
+
this.onInitialSessionObtained = callback;
|
|
397
|
+
};
|
|
398
|
+
OAuth2Client.prototype.initialize = function () {
|
|
399
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
400
|
+
var _this = this;
|
|
401
|
+
return __generator(this, function (_a) {
|
|
402
|
+
switch (_a.label) {
|
|
403
|
+
case 0:
|
|
404
|
+
if (!this.initializePromise) return [3, 2];
|
|
405
|
+
return [4, this.initializePromise];
|
|
406
|
+
case 1: return [2, _a.sent()];
|
|
407
|
+
case 2:
|
|
408
|
+
this.initializePromise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
409
|
+
var _this = this;
|
|
410
|
+
return __generator(this, function (_a) {
|
|
411
|
+
switch (_a.label) {
|
|
412
|
+
case 0: return [4, this._acquireLock(-1, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
413
|
+
switch (_a.label) {
|
|
414
|
+
case 0: return [4, this._initialize()];
|
|
415
|
+
case 1: return [2, _a.sent()];
|
|
416
|
+
}
|
|
417
|
+
}); }); })];
|
|
418
|
+
case 1: return [2, _a.sent()];
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
}); })();
|
|
422
|
+
return [4, this.initializePromise];
|
|
423
|
+
case 3: return [2, _a.sent()];
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
};
|
|
375
428
|
OAuth2Client.prototype.setCredentials = function (credentials) {
|
|
376
|
-
return this
|
|
429
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
430
|
+
var _this = this;
|
|
431
|
+
return __generator(this, function (_a) {
|
|
432
|
+
switch (_a.label) {
|
|
433
|
+
case 0: return [4, this.initializePromise];
|
|
434
|
+
case 1:
|
|
435
|
+
_a.sent();
|
|
436
|
+
return [2, this._acquireLock(-1, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
437
|
+
return [2, this.localCredentials.setCredentials(credentials)];
|
|
438
|
+
}); }); })];
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
});
|
|
377
442
|
};
|
|
378
443
|
OAuth2Client.prototype.setAccessKeyCredentials = function (credentials) {
|
|
379
444
|
return this.localCredentials.setAccessKeyCredentials(credentials);
|
|
@@ -383,8 +448,11 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
383
448
|
var credentials, respErr;
|
|
384
449
|
return __generator(this, function (_a) {
|
|
385
450
|
switch (_a.label) {
|
|
386
|
-
case 0: return [4, this.
|
|
451
|
+
case 0: return [4, this.initializePromise];
|
|
387
452
|
case 1:
|
|
453
|
+
_a.sent();
|
|
454
|
+
return [4, this.getCredentials()];
|
|
455
|
+
case 2:
|
|
388
456
|
credentials = _a.sent();
|
|
389
457
|
if (credentials === null || credentials === void 0 ? void 0 : credentials.access_token) {
|
|
390
458
|
return [2, Promise.resolve(credentials.access_token)];
|
|
@@ -398,16 +466,16 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
398
466
|
OAuth2Client.prototype.request = function (url, options) {
|
|
399
467
|
var _a, _b;
|
|
400
468
|
return __awaiter(this, void 0, void 0, function () {
|
|
401
|
-
var retry, deviceId, credentials, response, maxRequestTimes, requestTime, responseError_1;
|
|
402
|
-
var
|
|
403
|
-
return __generator(this, function (
|
|
404
|
-
switch (
|
|
469
|
+
var retry, deviceId, credentials, _c, response, maxRequestTimes, requestTime, responseError_1;
|
|
470
|
+
var _d;
|
|
471
|
+
return __generator(this, function (_f) {
|
|
472
|
+
switch (_f.label) {
|
|
405
473
|
case 0:
|
|
406
474
|
if (!options) {
|
|
407
475
|
options = {};
|
|
408
476
|
}
|
|
409
477
|
retry = this.formatRetry(options.retry, this.retry);
|
|
410
|
-
options.headers = __assign(__assign({}, options.headers), (
|
|
478
|
+
options.headers = __assign(__assign({}, options.headers), (_d = {}, _d[(_a = this.i18n) === null || _a === void 0 ? void 0 : _a.LANG_HEADER_KEY] = (_b = this.i18n) === null || _b === void 0 ? void 0 : _b.lang, _d));
|
|
411
479
|
if (this.headers) {
|
|
412
480
|
options.headers = __assign(__assign({}, this.headers), options.headers);
|
|
413
481
|
}
|
|
@@ -417,17 +485,25 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
417
485
|
if (!!options.headers[DeviceIdHeaderName]) return [3, 2];
|
|
418
486
|
return [4, this.getDeviceId()];
|
|
419
487
|
case 1:
|
|
420
|
-
deviceId =
|
|
488
|
+
deviceId = _f.sent();
|
|
421
489
|
options.headers[DeviceIdHeaderName] = deviceId;
|
|
422
|
-
|
|
490
|
+
_f.label = 2;
|
|
423
491
|
case 2:
|
|
424
492
|
if ((options === null || options === void 0 ? void 0 : options.withBasicAuth) && this.basicAuth) {
|
|
425
493
|
options.headers.Authorization = this.basicAuth;
|
|
426
494
|
}
|
|
427
|
-
if (!(options === null || options === void 0 ? void 0 : options.withCredentials)) return [3,
|
|
428
|
-
return [
|
|
495
|
+
if (!(options === null || options === void 0 ? void 0 : options.withCredentials)) return [3, 7];
|
|
496
|
+
if (!options.getCredentials) return [3, 4];
|
|
497
|
+
return [4, options.getCredentials()];
|
|
429
498
|
case 3:
|
|
430
|
-
|
|
499
|
+
_c = _f.sent();
|
|
500
|
+
return [3, 6];
|
|
501
|
+
case 4: return [4, this.getCredentials()];
|
|
502
|
+
case 5:
|
|
503
|
+
_c = _f.sent();
|
|
504
|
+
_f.label = 6;
|
|
505
|
+
case 6:
|
|
506
|
+
credentials = _c;
|
|
431
507
|
if (credentials) {
|
|
432
508
|
if (this.tokenInURL) {
|
|
433
509
|
if (url.indexOf('?') < 0) {
|
|
@@ -439,56 +515,56 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
439
515
|
options.headers.Authorization = "".concat(credentials.token_type, " ").concat(credentials.access_token);
|
|
440
516
|
}
|
|
441
517
|
}
|
|
442
|
-
return [3,
|
|
443
|
-
case
|
|
518
|
+
return [3, 8];
|
|
519
|
+
case 7:
|
|
444
520
|
if (this.clientId && url.indexOf('client_id') < 0) {
|
|
445
521
|
url += url.indexOf('?') < 0 ? '?' : '&';
|
|
446
522
|
url += "client_id=".concat(this.clientId);
|
|
447
523
|
}
|
|
448
|
-
|
|
449
|
-
case
|
|
524
|
+
_f.label = 8;
|
|
525
|
+
case 8:
|
|
450
526
|
if (url.startsWith('/')) {
|
|
451
527
|
url = "".concat(this.apiOrigin).concat(this.apiPath).concat(url);
|
|
452
528
|
}
|
|
453
529
|
response = null;
|
|
454
530
|
maxRequestTimes = retry + 1;
|
|
455
531
|
requestTime = 0;
|
|
456
|
-
|
|
457
|
-
case
|
|
458
|
-
if (!(requestTime < maxRequestTimes)) return [3,
|
|
459
|
-
|
|
460
|
-
case 7:
|
|
461
|
-
_d.trys.push([7, 12, , 15]);
|
|
462
|
-
if (!(options.useWxCloud || this.useWxCloud)) return [3, 9];
|
|
463
|
-
return [4, this.wxCloudCallFunction(url, options)];
|
|
464
|
-
case 8:
|
|
465
|
-
response = _d.sent();
|
|
466
|
-
return [3, 11];
|
|
467
|
-
case 9: return [4, this.baseRequest(url, options)];
|
|
532
|
+
_f.label = 9;
|
|
533
|
+
case 9:
|
|
534
|
+
if (!(requestTime < maxRequestTimes)) return [3, 21];
|
|
535
|
+
_f.label = 10;
|
|
468
536
|
case 10:
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
case
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
537
|
+
_f.trys.push([10, 15, , 18]);
|
|
538
|
+
if (!(options.useWxCloud || this.useWxCloud)) return [3, 12];
|
|
539
|
+
return [4, this.wxCloudCallFunction(url, options)];
|
|
540
|
+
case 11:
|
|
541
|
+
response = _f.sent();
|
|
542
|
+
return [3, 14];
|
|
543
|
+
case 12: return [4, this.baseRequest(url, options)];
|
|
476
544
|
case 13:
|
|
477
|
-
|
|
545
|
+
response = _f.sent();
|
|
546
|
+
_f.label = 14;
|
|
547
|
+
case 14: return [3, 21];
|
|
548
|
+
case 15:
|
|
549
|
+
responseError_1 = _f.sent();
|
|
550
|
+
if (!(options.withCredentials && responseError_1 && responseError_1.error === consts_1.ErrorType.UNAUTHENTICATED)) return [3, 17];
|
|
551
|
+
return [4, this.setCredentials(null)];
|
|
552
|
+
case 16:
|
|
553
|
+
_f.sent();
|
|
478
554
|
return [2, Promise.reject(responseError_1)];
|
|
479
|
-
case
|
|
555
|
+
case 17:
|
|
480
556
|
if (requestTime === retry || !responseError_1 || responseError_1.error !== 'unreachable') {
|
|
481
557
|
return [2, Promise.reject(responseError_1)];
|
|
482
558
|
}
|
|
483
|
-
return [3,
|
|
484
|
-
case
|
|
485
|
-
case
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
case
|
|
559
|
+
return [3, 18];
|
|
560
|
+
case 18: return [4, this.sleep(OAuth2Client.retryInterval)];
|
|
561
|
+
case 19:
|
|
562
|
+
_f.sent();
|
|
563
|
+
_f.label = 20;
|
|
564
|
+
case 20:
|
|
489
565
|
requestTime++;
|
|
490
|
-
return [3,
|
|
491
|
-
case
|
|
566
|
+
return [3, 9];
|
|
567
|
+
case 21: return [2, response];
|
|
492
568
|
}
|
|
493
569
|
});
|
|
494
570
|
});
|
|
@@ -556,51 +632,16 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
556
632
|
});
|
|
557
633
|
};
|
|
558
634
|
OAuth2Client.prototype.getCredentials = function () {
|
|
559
|
-
var _a, _b, _c;
|
|
560
635
|
return __awaiter(this, void 0, void 0, function () {
|
|
561
|
-
var
|
|
562
|
-
return __generator(this, function (
|
|
563
|
-
switch (
|
|
564
|
-
case 0: return [4, this.
|
|
636
|
+
var _this = this;
|
|
637
|
+
return __generator(this, function (_a) {
|
|
638
|
+
switch (_a.label) {
|
|
639
|
+
case 0: return [4, this.initializePromise];
|
|
565
640
|
case 1:
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
return [2, this.unAuthenticatedError(msg)];
|
|
571
|
-
}
|
|
572
|
-
if (!isCredentialsExpired(credentials)) return [3, 12];
|
|
573
|
-
if (!credentials.refresh_token) return [3, 9];
|
|
574
|
-
_d.label = 2;
|
|
575
|
-
case 2:
|
|
576
|
-
_d.trys.push([2, 4, , 8]);
|
|
577
|
-
return [4, this.refreshToken(credentials)];
|
|
578
|
-
case 3:
|
|
579
|
-
credentials = _d.sent();
|
|
580
|
-
return [3, 8];
|
|
581
|
-
case 4:
|
|
582
|
-
error_5 = _d.sent();
|
|
583
|
-
if (!(credentials.scope === 'anonymous')) return [3, 6];
|
|
584
|
-
return [4, this.anonymousLogin(credentials)];
|
|
585
|
-
case 5:
|
|
586
|
-
credentials = _d.sent();
|
|
587
|
-
return [3, 7];
|
|
588
|
-
case 6:
|
|
589
|
-
(_b = this.onCredentialsError) === null || _b === void 0 ? void 0 : _b.call(this, { msg: error_5.error_description });
|
|
590
|
-
return [2, Promise.reject(error_5)];
|
|
591
|
-
case 7: return [3, 8];
|
|
592
|
-
case 8: return [3, 12];
|
|
593
|
-
case 9:
|
|
594
|
-
if (!(credentials.scope === 'anonymous')) return [3, 11];
|
|
595
|
-
return [4, this.anonymousLogin(credentials)];
|
|
596
|
-
case 10:
|
|
597
|
-
credentials = _d.sent();
|
|
598
|
-
return [3, 12];
|
|
599
|
-
case 11:
|
|
600
|
-
msg = 'no refresh token found in credentials';
|
|
601
|
-
(_c = this.onCredentialsError) === null || _c === void 0 ? void 0 : _c.call(this, { msg: msg });
|
|
602
|
-
return [2, this.unAuthenticatedError(msg)];
|
|
603
|
-
case 12: return [2, credentials];
|
|
641
|
+
_a.sent();
|
|
642
|
+
return [2, this._acquireLock(-1, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
643
|
+
return [2, this._getCredentials()];
|
|
644
|
+
}); }); })];
|
|
604
645
|
}
|
|
605
646
|
});
|
|
606
647
|
});
|
|
@@ -650,43 +691,62 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
650
691
|
});
|
|
651
692
|
});
|
|
652
693
|
};
|
|
653
|
-
OAuth2Client.prototype.refreshToken = function (credentials) {
|
|
694
|
+
OAuth2Client.prototype.refreshToken = function (credentials, options) {
|
|
695
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
696
|
+
var _this = this;
|
|
697
|
+
return __generator(this, function (_a) {
|
|
698
|
+
switch (_a.label) {
|
|
699
|
+
case 0: return [4, this.initializePromise];
|
|
700
|
+
case 1:
|
|
701
|
+
_a.sent();
|
|
702
|
+
return [2, this._acquireLock(-1, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
703
|
+
return [2, this._refreshToken(credentials, options)];
|
|
704
|
+
}); }); })];
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
};
|
|
709
|
+
OAuth2Client.prototype._refreshToken = function (credentials, options) {
|
|
654
710
|
return __awaiter(this, void 0, void 0, function () {
|
|
655
711
|
var _this = this;
|
|
656
712
|
return __generator(this, function (_a) {
|
|
657
713
|
return [2, this.singlePromise.run('_refreshToken', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
658
|
-
var msg, newCredentials,
|
|
659
|
-
var _a, _b, _c;
|
|
660
|
-
return __generator(this, function (
|
|
661
|
-
switch (
|
|
714
|
+
var msg, newCredentials, error_5, msg;
|
|
715
|
+
var _a, _b, _c, _d;
|
|
716
|
+
return __generator(this, function (_f) {
|
|
717
|
+
switch (_f.label) {
|
|
662
718
|
case 0:
|
|
663
719
|
if (!credentials || !credentials.refresh_token) {
|
|
664
720
|
msg = 'no refresh token found in credentials';
|
|
665
721
|
(_a = this.onCredentialsError) === null || _a === void 0 ? void 0 : _a.call(this, { msg: msg });
|
|
666
722
|
return [2, this.unAuthenticatedError(msg)];
|
|
667
723
|
}
|
|
668
|
-
|
|
724
|
+
_f.label = 1;
|
|
669
725
|
case 1:
|
|
670
|
-
|
|
726
|
+
_f.trys.push([1, 4, , 7]);
|
|
671
727
|
return [4, this.refreshTokenFunc(credentials.refresh_token, credentials)];
|
|
672
728
|
case 2:
|
|
673
|
-
newCredentials =
|
|
729
|
+
newCredentials = _f.sent();
|
|
674
730
|
return [4, this.localCredentials.setCredentials(newCredentials)];
|
|
675
731
|
case 3:
|
|
676
|
-
|
|
732
|
+
_f.sent();
|
|
733
|
+
(_b = this.eventBus) === null || _b === void 0 ? void 0 : _b.fire(consts_2.EVENTS.AUTH_STATE_CHANGED, { event: consts_2.AUTH_STATE_CHANGED_TYPE.TOKEN_REFRESHED });
|
|
677
734
|
return [2, newCredentials];
|
|
678
735
|
case 4:
|
|
679
|
-
|
|
680
|
-
if (
|
|
736
|
+
error_5 = _f.sent();
|
|
737
|
+
if (options === null || options === void 0 ? void 0 : options.throwError) {
|
|
738
|
+
throw error_5;
|
|
739
|
+
}
|
|
740
|
+
if (!(error_5.error === consts_1.ErrorType.INVALID_GRANT)) return [3, 6];
|
|
681
741
|
return [4, this.localCredentials.setCredentials(null)];
|
|
682
742
|
case 5:
|
|
683
|
-
|
|
684
|
-
msg =
|
|
685
|
-
(
|
|
743
|
+
_f.sent();
|
|
744
|
+
msg = error_5.error_description;
|
|
745
|
+
(_c = this.onCredentialsError) === null || _c === void 0 ? void 0 : _c.call(this, { msg: msg });
|
|
686
746
|
return [2, this.unAuthenticatedError(msg)];
|
|
687
747
|
case 6:
|
|
688
|
-
(
|
|
689
|
-
return [2, Promise.reject(
|
|
748
|
+
(_d = this.onCredentialsError) === null || _d === void 0 ? void 0 : _d.call(this, { msg: error_5.error_description });
|
|
749
|
+
return [2, Promise.reject(error_5)];
|
|
690
750
|
case 7: return [2];
|
|
691
751
|
}
|
|
692
752
|
});
|
|
@@ -762,7 +822,7 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
762
822
|
var _this = this;
|
|
763
823
|
return __generator(this, function (_a) {
|
|
764
824
|
return [2, this.singlePromise.run('_anonymous', function () { return __awaiter(_this, void 0, void 0, function () {
|
|
765
|
-
var newCredentials,
|
|
825
|
+
var newCredentials, error_6;
|
|
766
826
|
return __generator(this, function (_a) {
|
|
767
827
|
switch (_a.label) {
|
|
768
828
|
case 0:
|
|
@@ -784,13 +844,13 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
784
844
|
_a.sent();
|
|
785
845
|
return [2, newCredentials];
|
|
786
846
|
case 4:
|
|
787
|
-
|
|
788
|
-
if (!(
|
|
847
|
+
error_6 = _a.sent();
|
|
848
|
+
if (!(error_6.error === consts_1.ErrorType.INVALID_GRANT)) return [3, 6];
|
|
789
849
|
return [4, this.localCredentials.setCredentials(null)];
|
|
790
850
|
case 5:
|
|
791
851
|
_a.sent();
|
|
792
|
-
return [2, this.unAuthenticatedError(
|
|
793
|
-
case 6: return [2, Promise.reject(
|
|
852
|
+
return [2, this.unAuthenticatedError(error_6.error_description)];
|
|
853
|
+
case 6: return [2, Promise.reject(error_6)];
|
|
794
854
|
case 7: return [2];
|
|
795
855
|
}
|
|
796
856
|
});
|
|
@@ -862,10 +922,224 @@ var OAuth2Client = exports.OAuth2Client = (function () {
|
|
|
862
922
|
};
|
|
863
923
|
return Promise.reject(respErr);
|
|
864
924
|
};
|
|
925
|
+
OAuth2Client.prototype._debug = function () {
|
|
926
|
+
var args = [];
|
|
927
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
928
|
+
args[_i] = arguments[_i];
|
|
929
|
+
}
|
|
930
|
+
if (this.logDebugMessages) {
|
|
931
|
+
console.log.apply(console, __spreadArray(['[OAuth2Client]'], args, false));
|
|
932
|
+
}
|
|
933
|
+
};
|
|
934
|
+
OAuth2Client.prototype._initialize = function () {
|
|
935
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
936
|
+
var data, error, callbackError_1, err_1, error_7;
|
|
937
|
+
var _a;
|
|
938
|
+
return __generator(this, function (_b) {
|
|
939
|
+
switch (_b.label) {
|
|
940
|
+
case 0:
|
|
941
|
+
_b.trys.push([0, 11, 12, 13]);
|
|
942
|
+
if (!this.getInitialSession) {
|
|
943
|
+
this._debug('#_initialize()', 'no getInitialSession callback set, skipping');
|
|
944
|
+
return [2, { error: null }];
|
|
945
|
+
}
|
|
946
|
+
this._debug('#_initialize()', 'calling getInitialSession callback');
|
|
947
|
+
_b.label = 1;
|
|
948
|
+
case 1:
|
|
949
|
+
_b.trys.push([1, 9, , 10]);
|
|
950
|
+
return [4, this.getInitialSession()];
|
|
951
|
+
case 2:
|
|
952
|
+
data = (_a = _b.sent(), _a.data), error = _a.error;
|
|
953
|
+
if (!(data === null || data === void 0 ? void 0 : data.session)) return [3, 4];
|
|
954
|
+
this._debug('#_initialize()', 'session obtained from getInitialSession', data.session);
|
|
955
|
+
return [4, this.localCredentials.setCredentials(data === null || data === void 0 ? void 0 : data.session)];
|
|
956
|
+
case 3:
|
|
957
|
+
_b.sent();
|
|
958
|
+
_b.label = 4;
|
|
959
|
+
case 4:
|
|
960
|
+
if (!this.onInitialSessionObtained) return [3, 8];
|
|
961
|
+
this._debug('#_initialize()', 'calling onInitialSessionObtained callback');
|
|
962
|
+
_b.label = 5;
|
|
963
|
+
case 5:
|
|
964
|
+
_b.trys.push([5, 7, , 8]);
|
|
965
|
+
return [4, this.onInitialSessionObtained(data, error)];
|
|
966
|
+
case 6:
|
|
967
|
+
_b.sent();
|
|
968
|
+
return [3, 8];
|
|
969
|
+
case 7:
|
|
970
|
+
callbackError_1 = _b.sent();
|
|
971
|
+
this._debug('#_initialize()', 'error in onInitialSessionObtained', callbackError_1);
|
|
972
|
+
return [3, 8];
|
|
973
|
+
case 8:
|
|
974
|
+
if (error) {
|
|
975
|
+
this._debug('#_initialize()', 'error from getInitialSession', error);
|
|
976
|
+
return [2, { error: error }];
|
|
977
|
+
}
|
|
978
|
+
return [2, { error: null }];
|
|
979
|
+
case 9:
|
|
980
|
+
err_1 = _b.sent();
|
|
981
|
+
this._debug('#_initialize()', 'exception during getInitialSession', err_1);
|
|
982
|
+
return [2, { error: err_1 instanceof Error ? err_1 : new Error(String(err_1)) }];
|
|
983
|
+
case 10: return [3, 13];
|
|
984
|
+
case 11:
|
|
985
|
+
error_7 = _b.sent();
|
|
986
|
+
this._debug('#_initialize()', 'unexpected error', error_7);
|
|
987
|
+
return [2, { error: error_7 instanceof Error ? error_7 : new Error(String(error_7)) }];
|
|
988
|
+
case 12:
|
|
989
|
+
this._debug('#_initialize()', 'end');
|
|
990
|
+
return [7];
|
|
991
|
+
case 13: return [2];
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
});
|
|
995
|
+
};
|
|
996
|
+
OAuth2Client.prototype._acquireLock = function (acquireTimeout, fn) {
|
|
997
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
998
|
+
var last_1, result_1, result_2, waitOn;
|
|
999
|
+
var _this = this;
|
|
1000
|
+
return __generator(this, function (_a) {
|
|
1001
|
+
switch (_a.label) {
|
|
1002
|
+
case 0:
|
|
1003
|
+
this._debug('#_acquireLock', 'begin', acquireTimeout);
|
|
1004
|
+
_a.label = 1;
|
|
1005
|
+
case 1:
|
|
1006
|
+
_a.trys.push([1, , 10, 11]);
|
|
1007
|
+
if (this.lockAcquired) {
|
|
1008
|
+
last_1 = this.pendingInLock.length ? this.pendingInLock[this.pendingInLock.length - 1] : Promise.resolve();
|
|
1009
|
+
result_1 = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1010
|
+
return __generator(this, function (_a) {
|
|
1011
|
+
switch (_a.label) {
|
|
1012
|
+
case 0: return [4, last_1];
|
|
1013
|
+
case 1:
|
|
1014
|
+
_a.sent();
|
|
1015
|
+
return [4, fn()];
|
|
1016
|
+
case 2: return [2, _a.sent()];
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
}); })();
|
|
1020
|
+
this.pendingInLock.push((function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1021
|
+
var _e_1;
|
|
1022
|
+
return __generator(this, function (_a) {
|
|
1023
|
+
switch (_a.label) {
|
|
1024
|
+
case 0:
|
|
1025
|
+
_a.trys.push([0, 2, , 3]);
|
|
1026
|
+
return [4, result_1];
|
|
1027
|
+
case 1:
|
|
1028
|
+
_a.sent();
|
|
1029
|
+
return [3, 3];
|
|
1030
|
+
case 2:
|
|
1031
|
+
_e_1 = _a.sent();
|
|
1032
|
+
return [3, 3];
|
|
1033
|
+
case 3: return [2];
|
|
1034
|
+
}
|
|
1035
|
+
});
|
|
1036
|
+
}); })());
|
|
1037
|
+
return [2, result_1];
|
|
1038
|
+
}
|
|
1039
|
+
this._debug('#_acquireLock', 'acquiring lock for client', this.clientId);
|
|
1040
|
+
_a.label = 2;
|
|
1041
|
+
case 2:
|
|
1042
|
+
_a.trys.push([2, , 8, 9]);
|
|
1043
|
+
this.lockAcquired = true;
|
|
1044
|
+
result_2 = fn();
|
|
1045
|
+
this.pendingInLock.push((function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1046
|
+
var _e_2;
|
|
1047
|
+
return __generator(this, function (_a) {
|
|
1048
|
+
switch (_a.label) {
|
|
1049
|
+
case 0:
|
|
1050
|
+
_a.trys.push([0, 2, , 3]);
|
|
1051
|
+
return [4, result_2];
|
|
1052
|
+
case 1:
|
|
1053
|
+
_a.sent();
|
|
1054
|
+
return [3, 3];
|
|
1055
|
+
case 2:
|
|
1056
|
+
_e_2 = _a.sent();
|
|
1057
|
+
return [3, 3];
|
|
1058
|
+
case 3: return [2];
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
}); })());
|
|
1062
|
+
return [4, result_2];
|
|
1063
|
+
case 3:
|
|
1064
|
+
_a.sent();
|
|
1065
|
+
_a.label = 4;
|
|
1066
|
+
case 4:
|
|
1067
|
+
if (!this.pendingInLock.length) return [3, 6];
|
|
1068
|
+
waitOn = __spreadArray([], this.pendingInLock, true);
|
|
1069
|
+
return [4, Promise.all(waitOn)];
|
|
1070
|
+
case 5:
|
|
1071
|
+
_a.sent();
|
|
1072
|
+
this.pendingInLock.splice(0, waitOn.length);
|
|
1073
|
+
return [3, 4];
|
|
1074
|
+
case 6: return [4, result_2];
|
|
1075
|
+
case 7: return [2, _a.sent()];
|
|
1076
|
+
case 8:
|
|
1077
|
+
this._debug('#_acquireLock', 'releasing lock for client', this.clientId);
|
|
1078
|
+
this.lockAcquired = false;
|
|
1079
|
+
return [7];
|
|
1080
|
+
case 9: return [3, 11];
|
|
1081
|
+
case 10:
|
|
1082
|
+
this._debug('#_acquireLock', 'end');
|
|
1083
|
+
return [7];
|
|
1084
|
+
case 11: return [2];
|
|
1085
|
+
}
|
|
1086
|
+
});
|
|
1087
|
+
});
|
|
1088
|
+
};
|
|
1089
|
+
OAuth2Client.prototype._getCredentials = function () {
|
|
1090
|
+
var _a, _b, _c;
|
|
1091
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1092
|
+
var credentials, msg, error_8, msg;
|
|
1093
|
+
return __generator(this, function (_d) {
|
|
1094
|
+
switch (_d.label) {
|
|
1095
|
+
case 0: return [4, this.localCredentials.getCredentials()];
|
|
1096
|
+
case 1:
|
|
1097
|
+
credentials = _d.sent();
|
|
1098
|
+
if (!credentials) {
|
|
1099
|
+
msg = 'credentials not found';
|
|
1100
|
+
(_a = this.onCredentialsError) === null || _a === void 0 ? void 0 : _a.call(this, { msg: msg });
|
|
1101
|
+
return [2, this.unAuthenticatedError(msg)];
|
|
1102
|
+
}
|
|
1103
|
+
if (!isCredentialsExpired(credentials)) return [3, 12];
|
|
1104
|
+
if (!credentials.refresh_token) return [3, 9];
|
|
1105
|
+
_d.label = 2;
|
|
1106
|
+
case 2:
|
|
1107
|
+
_d.trys.push([2, 4, , 8]);
|
|
1108
|
+
return [4, this._refreshToken(credentials)];
|
|
1109
|
+
case 3:
|
|
1110
|
+
credentials = _d.sent();
|
|
1111
|
+
return [3, 8];
|
|
1112
|
+
case 4:
|
|
1113
|
+
error_8 = _d.sent();
|
|
1114
|
+
if (!(credentials.scope === 'anonymous')) return [3, 6];
|
|
1115
|
+
return [4, this.anonymousLogin(credentials)];
|
|
1116
|
+
case 5:
|
|
1117
|
+
credentials = _d.sent();
|
|
1118
|
+
return [3, 7];
|
|
1119
|
+
case 6:
|
|
1120
|
+
(_b = this.onCredentialsError) === null || _b === void 0 ? void 0 : _b.call(this, { msg: error_8.error_description });
|
|
1121
|
+
return [2, Promise.reject(error_8)];
|
|
1122
|
+
case 7: return [3, 8];
|
|
1123
|
+
case 8: return [3, 12];
|
|
1124
|
+
case 9:
|
|
1125
|
+
if (!(credentials.scope === 'anonymous')) return [3, 11];
|
|
1126
|
+
return [4, this.anonymousLogin(credentials)];
|
|
1127
|
+
case 10:
|
|
1128
|
+
credentials = _d.sent();
|
|
1129
|
+
return [3, 12];
|
|
1130
|
+
case 11:
|
|
1131
|
+
msg = 'no refresh token found in credentials';
|
|
1132
|
+
(_c = this.onCredentialsError) === null || _c === void 0 ? void 0 : _c.call(this, { msg: msg });
|
|
1133
|
+
return [2, this.unAuthenticatedError(msg)];
|
|
1134
|
+
case 12: return [2, credentials];
|
|
1135
|
+
}
|
|
1136
|
+
});
|
|
1137
|
+
});
|
|
1138
|
+
};
|
|
865
1139
|
OAuth2Client.defaultRetry = 2;
|
|
866
1140
|
OAuth2Client.minRetry = 0;
|
|
867
1141
|
OAuth2Client.maxRetry = 5;
|
|
868
1142
|
OAuth2Client.retryInterval = 1000;
|
|
869
1143
|
return OAuth2Client;
|
|
870
1144
|
}());
|
|
871
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29hdXRoMmNsaWVudC9vYXV0aDJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBb0M7QUFDcEMseUNBQW9FO0FBYXBFLHNDQUFzQztBQUN0Qyx3Q0FBNEM7QUFFNUMsbUVBQWdFO0FBQ2hFLDBDQUF3QztBQUN4QyxrQ0FBa0M7QUFHbEMsa0RBQWdEO0FBRWhELElBQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFBO0FBQzFDLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQ3hDLElBQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFBO0FBV2hDLElBQU0sY0FBYyxHQUFvQixVQUFtQixHQUFXLEVBQUUsT0FBd0I7Ozs7OztvQkFDakcsTUFBTSxHQUFhLElBQUksQ0FBQTtvQkFDdkIsYUFBYSxHQUF5QixJQUFJLENBQUE7Ozs7b0JBR3RDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtvQkFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7d0JBQ3ZCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO3FCQUMzQjtvQkFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDNUQsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDcEQ7b0JBQ2dDLFdBQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBQTs7b0JBQXhELGNBQWMsR0FBYSxTQUE2QjtvQkFDekMsV0FBTSxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUE7O29CQUExQyxZQUFZ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QjtJQU1PLDJDQUFvQixHQUE1QixVQUFnQyxHQUFZO1FBQzFDLElBQU0sT0FBTyxHQUFrQjtZQUM3QixLQUFLLEVBQUUsa0JBQVMsQ0FBQyxlQUFlO1lBQ2hDLGlCQUFpQixFQUFFLEdBQUc7U0FDdkIsQ0FBQTtRQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBbGRjLHlCQUFZLEdBQUcsQ0FBQyxBQUFKLENBQUk7SUFDaEIscUJBQVEsR0FBRyxDQUFDLEFBQUosQ0FBSTtJQUNaLHFCQUFRLEdBQUcsQ0FBQyxBQUFKLENBQUk7SUFDWiwwQkFBYSxHQUFHLElBQUksQUFBUCxDQUFPO0lBZ2RyQyxtQkFBQztDQUFBLEFBcGRELElBb2RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXJyb3JUeXBlIH0gZnJvbSAnLi9jb25zdHMnXG5pbXBvcnQgeyBBcGlVcmxzLCBBcGlVcmxzVjIsIEFVVEhfQVBJX1BSRUZJWCB9IGZyb20gJy4uL2F1dGgvY29uc3RzJ1xuXG5pbXBvcnQgeyBBdXRoQ2xpZW50LCBTaW1wbGVTdG9yYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UnXG5cbmltcG9ydCB7XG4gIENyZWRlbnRpYWxzLFxuICBSZXNwb25zZUVycm9yLFxuICBSZXF1ZXN0T3B0aW9ucyxcbiAgUmVxdWVzdEZ1bmN0aW9uLFxuICBPQXV0aDJDbGllbnRPcHRpb25zLFxuICBBdXRoQ2xpZW50UmVxdWVzdE9wdGlvbnMsXG59IGZyb20gJy4vbW9kZWxzJ1xuXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tICcuLi91dGlscy91dWlkJ1xuaW1wb3J0IHsgZ2V0UGF0aE5hbWUgfSBmcm9tICcuLi91dGlscy9pbmRleCdcblxuaW1wb3J0IHsgU2luZ2xlUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL2Z1bmN0aW9uL3NpbmdsZS1wcm9taXNlJ1xuaW1wb3J0IHsgd2VCdG9hIH0gZnJvbSAnLi4vdXRpbHMvYmFzZTY0J1xuaW1wb3J0IHsgaXNNcCB9IGZyb20gJy4uL3V0aWxzL21wJ1xuaW1wb3J0IHsgQXV0aE9wdGlvbnMgfSBmcm9tICcuLi9hdXRoL2FwaXMnXG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ29uZmlnIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcydcbmltcG9ydCB7IGxhbmdFdmVudCB9IGZyb20gJ0BjbG91ZGJhc2UvdXRpbGl0aWVzJ1xuXG5jb25zdCBSZXF1ZXN0SWRIZWFkZXJOYW1lID0gJ3gtcmVxdWVzdC1pZCdcbmNvbnN0IERldmljZUlkSGVhZGVyTmFtZSA9ICd4LWRldmljZS1pZCdcbmNvbnN0IERldmljZUlkU2VjdGlvbk5hbWUgPSAnZGV2aWNlX2lkJ1xuXG5kZWNsYXJlIGNvbnN0IHd4OiBhbnlcblxuZXhwb3J0IGludGVyZmFjZSBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zIHtcbiAgZXJyb3I/OiBFcnJvclR5cGVcbiAgZXJyb3JfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsXG4gIGVycm9yX3VyaT86IHN0cmluZyB8IG51bGxcbiAgZGV0YWlscz86IGFueSB8IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0OiBSZXF1ZXN0RnVuY3Rpb24gPSBhc3luYyBmdW5jdGlvbiA8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICBsZXQgcmVzdWx0OiBUIHwgbnVsbCA9IG51bGxcbiAgbGV0IHJlc3BvbnNlRXJyb3I6IFJlc3BvbnNlRXJyb3IgfCBudWxsID0gbnVsbFxuICB0cnkge1xuICAgIC8vIE9iamVjdHMgbXVzdCBiZSBjb3BpZWQgdG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgZGF0YSBzdWNoIGFzIGJvZHkuXG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKVxuICAgIGlmICghY29weU9wdGlvbnMubWV0aG9kKSB7XG4gICAgICBjb3B5T3B0aW9ucy5tZXRob2QgPSAnR0VUJ1xuICAgIH1cbiAgICBpZiAoY29weU9wdGlvbnMuYm9keSAmJiB0eXBlb2YgY29weU9wdGlvbnMuYm9keSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvcHlPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShjb3B5T3B0aW9ucy5ib2R5KVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZVJlc3VsdDogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGNvcHlPcHRpb25zKVxuICAgIGNvbnN0IGpzb25SZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlUmVzdWx0Lmpzb24oKVxuICAgIGlmIChqc29uUmVzcG9uc2U/LmVycm9yKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ganNvblJlc3BvbnNlIGFzIFJlc3BvbnNlRXJyb3JcbiAgICAgIHJlc3BvbnNlRXJyb3IuZXJyb3JfdXJpID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGpzb25SZXNwb25zZSBhcyBUXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlc3BvbnNlRXJyb3IgPSB7XG4gICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2UsXG4gICAgICBlcnJvcl91cmk6IG5ldyBVUkwodXJsKS5wYXRobmFtZSxcbiAgICB9XG4gIH1cbiAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b1Jlc3BvbnNlRXJyb3IgPSAoZXJyb3I6IFJlc3BvbnNlRXJyb3IgfCBFcnJvciwgb3B0aW9ucz86IFRvUmVzcG9uc2VFcnJvck9wdGlvbnMpOiBSZXNwb25zZUVycm9yID0+IHtcbiAgbGV0IHJlc3BvbnNlRXJyb3I6IFJlc3BvbnNlRXJyb3JcbiAgY29uc3QgZm9ybWF0T3B0aW9uczogVG9SZXNwb25zZUVycm9yT3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgZXJyb3I6IGZvcm1hdE9wdGlvbnMuZXJyb3IgfHwgRXJyb3JUeXBlLkxPQ0FMLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGZvcm1hdE9wdGlvbnMuZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IubWVzc2FnZSxcbiAgICAgIGVycm9yX3VyaTogZm9ybWF0T3B0aW9ucy5lcnJvcl91cmksXG4gICAgICBkZXRhaWxzOiBmb3JtYXRPcHRpb25zLmRldGFpbHMgfHwgZXJyb3Iuc3RhY2ssXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZvcm1hdEVycm9yOiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zID0gZXJyb3IgfHwge31cbiAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgZXJyb3I6IGZvcm1hdE9wdGlvbnMuZXJyb3IgfHwgZm9ybWF0RXJyb3IuZXJyb3IgfHwgRXJyb3JUeXBlLkxPQ0FMLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGZvcm1hdE9wdGlvbnMuZXJyb3JfZGVzY3JpcHRpb24gfHwgZm9ybWF0RXJyb3IuZXJyb3JfZGVzY3JpcHRpb24sXG4gICAgICBlcnJvcl91cmk6IGZvcm1hdE9wdGlvbnMuZXJyb3JfdXJpIHx8IGZvcm1hdEVycm9yLmVycm9yX3VyaSxcbiAgICAgIGRldGFpbHM6IGZvcm1hdE9wdGlvbnMuZGV0YWlscyB8fCBmb3JtYXRFcnJvci5kZXRhaWxzLFxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2VFcnJvclxufVxuXG4vKipcbiAqIEdlbmVyYXRlIHJlcXVlc3QgaWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJlcXVlc3RJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXVpZHY0KClcbn1cblxuLyoqXG4gKiBEZWZhdWx0IFN0b3JhZ2UuXG4gKi9cbmNsYXNzIERlZmF1bHRTdG9yYWdlIGltcGxlbWVudHMgU2ltcGxlU3RvcmFnZSB7XG4gIC8qKlxuICAgKiDnvJPlrZhrZXnnu5/kuIDkvb/nlKjlkI7nvIDljLrliIZcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBfZW52OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogeyBlbnY6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5fZW52ID0gb3B0cz8uZW52IHx8ICcnXG4gIH1cbiAgLyoqXG4gICAqIEdldCBpdGVtLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqL1xuICBhc3luYyBnZXRJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtrZXl9JHt0aGlzLl9lbnZ9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtrZXl9JHt0aGlzLl9lbnZ9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaXRlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICovXG4gIGFzeW5jIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWAsIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpdGVtIHN5bmMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICovXG4gIGdldEl0ZW1TeW5jKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtrZXl9JHt0aGlzLl9lbnZ9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaXRlbSBzeW5jLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqL1xuICByZW1vdmVJdGVtU3luYyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtrZXl9JHt0aGlzLl9lbnZ9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaXRlbSBzeW5jLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgc2V0SXRlbVN5bmMoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWAsIHZhbHVlKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RvcmFnZSA9IG5ldyBEZWZhdWx0U3RvcmFnZSgpXG5cbmludGVyZmFjZSBMb2NhbENyZWRlbnRpYWxzT3B0aW9ucyB7XG4gIHRva2VuU2VjdGlvbk5hbWU6IHN0cmluZ1xuICBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlXG4gIGNsaWVudElkOiBzdHJpbmdcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNyZWRlbnRpYWxzIGlzIGV4cGlyZWQuXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gIGxldCBpc0V4cGlyZWQgPSB0cnVlXG4gIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19hdCAmJiBjcmVkZW50aWFscz8uYWNjZXNzX3Rva2VuKSB7XG4gICAgaXNFeHBpcmVkID0gY3JlZGVudGlhbHMuZXhwaXJlc19hdCA8IG5ldyBEYXRlKClcbiAgfVxuICByZXR1cm4gaXNFeHBpcmVkXG59XG5cbi8qKlxuICogTG9jYWwgY3JlZGVudGlhbHMuXG4gKiBMb2NhbCBjcmVkZW50aWFscywgd2l0aCBtZW1vcnkgY2FjaGUgYW5kIHN0b3JhZ2UgY2FjaGUuXG4gKiBJZiB0aGUgbWVtb3J5IGNhY2hlIGV4cGlyZXMsIHRoZSBzdG9yYWdlIGNhY2hlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkLlxuICovXG5jbGFzcyBMb2NhbENyZWRlbnRpYWxzIHtcbiAgcHJpdmF0ZSB0b2tlblNlY3Rpb25OYW1lOiBzdHJpbmdcblxuICBwcml2YXRlIHN0b3JhZ2U6IFNpbXBsZVN0b3JhZ2VcblxuICBwcml2YXRlIGNsaWVudElkOiBzdHJpbmdcblxuICBwcml2YXRlIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IG51bGwgPSBudWxsXG4gIC8vIOadpeiHqmFjY2Vzc0tleeeahOi6q+S7ve+8jOS4jeaMgeS5heWMllxuICBwcml2YXRlIGFjY2Vzc0tleUNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBzaW5nbGVQcm9taXNlOiBTaW5nbGVQcm9taXNlID0gbnVsbFxuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0xvY2FsQ3JlZGVudGlhbHNPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbENyZWRlbnRpYWxzT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW5TZWN0aW9uTmFtZSA9IG9wdGlvbnMudG9rZW5TZWN0aW9uTmFtZVxuICAgIHRoaXMuc3RvcmFnZSA9IG9wdGlvbnMuc3RvcmFnZVxuICAgIHRoaXMuY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkXG4gICAgdGhpcy5zaW5nbGVQcm9taXNlID0gbmV3IFNpbmdsZVByb21pc2UoeyBjbGllbnRJZDogdGhpcy5jbGllbnRJZCB9KVxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IG51bGxcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGxcbiAgICBjb25zdCB0b2tlblN0cjogc3RyaW5nID0gdGhpcy5zdG9yYWdlLmdldEl0ZW1TeW5jKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICBpZiAodG9rZW5TdHIgIT09IHVuZGVmaW5lZCAmJiB0b2tlblN0ciAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKHRva2VuU3RyKVxuICAgICAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICBjcmVkZW50aWFscy5leHBpcmVzX2F0ID0gbmV3IERhdGUoY3JlZGVudGlhbHMuZXhwaXJlc19hdClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lKVxuICAgICAgICBjcmVkZW50aWFscyA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzXG4gIH1cblxuICAvKipcbiAgICogc2V0Q3JlZGVudGlhbHMgUHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgZmV0Y2ggYXBpIHJlcXVlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBhdXRoIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19pbikge1xuICAgICAgaWYgKCFjcmVkZW50aWFscz8uZXhwaXJlc19hdCkge1xuICAgICAgICBjcmVkZW50aWFscy5leHBpcmVzX2F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIChjcmVkZW50aWFscy5leHBpcmVzX2luIC0gMzApICogMTAwMClcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNyZWRlbnRpYWxzKVxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnRva2VuU2VjdGlvbk5hbWUsIHRva2VuU3RyKVxuICAgICAgfVxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lKVxuICAgICAgfVxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0IGNyZWRlbnRpYWxzIGZyb20gYWNjZXNzS2V5XG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqL1xuICBwdWJsaWMgc2V0QWNjZXNzS2V5Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscykge1xuICAgIHRoaXMuYWNjZXNzS2V5Q3JlZGVudGlhbHMgPSBjcmVkZW50aWFsc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjcmVkZW50aWFscy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ2dldENyZWRlbnRpYWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGlzQ3JlZGVudGlhbHNFeHBpcmVkKHRoaXMuY3JlZGVudGlhbHMpKSB7XG4gICAgICAgIGNvbnN0IHsgY3JlZGVudGlhbHMsIGlzQWNjZXNzS2V5Q3JlZGVudGlhbHMgfSA9IGF3YWl0IHRoaXMuZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKClcbiAgICAgICAgaWYgKGlzQWNjZXNzS2V5Q3JlZGVudGlhbHMpIHtcbiAgICAgICAgICByZXR1cm4gY3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gY3JlZGVudGlhbHNcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBjcmVkZW50aWFscy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKCk6IFByb21pc2U8eyBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCBudWxsOyBpc0FjY2Vzc0tleUNyZWRlbnRpYWxzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5zaW5nbGVQcm9taXNlLnJ1bignX2dldFN0b3JhZ2VDcmVkZW50aWFscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBudWxsXG4gICAgICBsZXQgaXNBY2Nlc3NLZXlDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgICBjb25zdCB0b2tlblN0cjogc3RyaW5nID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lKVxuICAgICAgaWYgKCEhdG9rZW5TdHIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjcmVkZW50aWFscyA9IEpTT04ucGFyc2UodG9rZW5TdHIpXG4gICAgICAgICAgaWYgKGNyZWRlbnRpYWxzPy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBjcmVkZW50aWFscy5leHBpcmVzX2F0ID0gbmV3IERhdGUoY3JlZGVudGlhbHMuZXhwaXJlc19hdClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lKVxuICAgICAgICAgIGNyZWRlbnRpYWxzID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcmVkZW50aWFscyA9IHRoaXMuYWNjZXNzS2V5Q3JlZGVudGlhbHMgfHwgbnVsbFxuICAgICAgICBpc0FjY2Vzc0tleUNyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY3JlZGVudGlhbHMsIGlzQWNjZXNzS2V5Q3JlZGVudGlhbHMgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBPQXV0aDJDbGllbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoMkNsaWVudCBpbXBsZW1lbnRzIEF1dGhDbGllbnQge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0UmV0cnkgPSAyXG4gIHByaXZhdGUgc3RhdGljIG1pblJldHJ5ID0gMFxuICBwcml2YXRlIHN0YXRpYyBtYXhSZXRyeSA9IDVcbiAgcHJpdmF0ZSBzdGF0aWMgcmV0cnlJbnRlcnZhbCA9IDEwMDBcblxuICBwcml2YXRlIGFwaU9yaWdpbjogc3RyaW5nXG4gIHByaXZhdGUgYXBpUGF0aDogc3RyaW5nXG4gIHByaXZhdGUgY2xpZW50SWQ6IHN0cmluZ1xuICBwcml2YXRlIGkxOG46IElDbG91ZGJhc2VDb25maWdbJ2kxOG4nXVxuICBwcml2YXRlIHJldHJ5OiBudW1iZXJcbiAgcHJpdmF0ZSBjbGllbnRTZWNyZXQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSBiYXNlUmVxdWVzdDogPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VD5cbiAgcHJpdmF0ZSBsb2NhbENyZWRlbnRpYWxzOiBMb2NhbENyZWRlbnRpYWxzXG4gIHByaXZhdGUgc3RvcmFnZTogU2ltcGxlU3RvcmFnZVxuICBwcml2YXRlIGRldmljZUlEPzogc3RyaW5nXG4gIHByaXZhdGUgdG9rZW5JblVSTD86IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5GdW5jOiAocmVmcmVzaFRva2VuPzogc3RyaW5nLCBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzKSA9PiBQcm9taXNlPENyZWRlbnRpYWxzPlxuICBwcml2YXRlIGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4gIHByaXZhdGUgc2luZ2xlUHJvbWlzZTogU2luZ2xlUHJvbWlzZSA9IG51bGxcbiAgcHJpdmF0ZSBhbm9ueW1vdXNTaWduSW5GdW5jOiAoQ3JlZGVudGlhbHMpID0+IFByb21pc2U8Q3JlZGVudGlhbHMgfCB2b2lkPlxuICBwcml2YXRlIHd4Q2xvdWQ6IGFueVxuICBwcml2YXRlIHVzZVd4Q2xvdWQ6IGJvb2xlYW5cbiAgcHJpdmF0ZSBiYXNpY0F1dGg6IHN0cmluZ1xuICBwcml2YXRlIG9uQ3JlZGVudGlhbHNFcnJvcjogQXV0aE9wdGlvbnNbJ29uQ3JlZGVudGlhbHNFcnJvciddIHwgdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T0F1dGgyQ2xpZW50T3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT0F1dGgyQ2xpZW50T3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5jbGllbnRTZWNyZXQpIHtcbiAgICAgIG9wdGlvbnMuY2xpZW50U2VjcmV0ID0gJydcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuY2xpZW50SWQgJiYgb3B0aW9ucy5lbnYpIHtcbiAgICAgIG9wdGlvbnMuY2xpZW50SWQgPSBvcHRpb25zLmVudlxuICAgIH1cblxuICAgIHRoaXMuYXBpT3JpZ2luID0gb3B0aW9ucy5hcGlPcmlnaW5cbiAgICB0aGlzLmFwaVBhdGggPSBvcHRpb25zLmFwaVBhdGggfHwgQVVUSF9BUElfUFJFRklYXG4gICAgdGhpcy5jbGllbnRJZCA9IG9wdGlvbnMuY2xpZW50SWRcbiAgICB0aGlzLmkxOG4gPSBvcHRpb25zLmkxOG5cbiAgICB0aGlzLnNpbmdsZVByb21pc2UgPSBuZXcgU2luZ2xlUHJvbWlzZSh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkIH0pXG4gICAgdGhpcy5yZXRyeSA9IHRoaXMuZm9ybWF0UmV0cnkob3B0aW9ucy5yZXRyeSwgT0F1dGgyQ2xpZW50LmRlZmF1bHRSZXRyeSlcbiAgICBpZiAob3B0aW9ucy5iYXNlUmVxdWVzdCkge1xuICAgICAgdGhpcy5iYXNlUmVxdWVzdCA9IG9wdGlvbnMuYmFzZVJlcXVlc3RcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iYXNlUmVxdWVzdCA9IGRlZmF1bHRSZXF1ZXN0XG4gICAgfVxuICAgIHRoaXMudG9rZW5JblVSTCA9IG9wdGlvbnMudG9rZW5JblVSTFxuICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVyc1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnN0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2UgfHwgZGVmYXVsdFN0b3JhZ2VcbiAgICB0aGlzLmxvY2FsQ3JlZGVudGlhbHMgPSBuZXcgTG9jYWxDcmVkZW50aWFscyh7XG4gICAgICB0b2tlblNlY3Rpb25OYW1lOiBgY3JlZGVudGlhbHNfJHtvcHRpb25zLmNsaWVudElkfWAsXG4gICAgICBzdG9yYWdlOiB0aGlzLnN0b3JhZ2UsXG4gICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZCxcbiAgICB9KVxuXG4gICAgdGhpcy5jbGllbnRTZWNyZXQgPSBvcHRpb25zLmNsaWVudFNlY3JldFxuICAgIGlmIChvcHRpb25zLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmJhc2ljQXV0aCA9IGBCYXNpYyAke3dlQnRvYShgJHtvcHRpb25zLmNsaWVudElkfToke3RoaXMuY2xpZW50U2VjcmV0fWApfWBcbiAgICB9XG4gICAgdGhpcy53eENsb3VkID0gb3B0aW9ucy53eENsb3VkXG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc01wKCkpIHtcbiAgICAgICAgdGhpcy51c2VXeENsb3VkID0gb3B0aW9ucy51c2VXeENsb3VkXG4gICAgICAgIGlmICh0aGlzLnd4Q2xvdWQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmVudikge1xuICAgICAgICAgIHd4LmNsb3VkLmluaXQoeyBlbnY6IG9wdGlvbnMuZW52IH0pXG4gICAgICAgICAgdGhpcy53eENsb3VkID0gd3guY2xvdWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvL1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hUb2tlbkZ1bmMgPSBvcHRpb25zLnJlZnJlc2hUb2tlbkZ1bmMgfHwgdGhpcy5kZWZhdWx0UmVmcmVzaFRva2VuRnVuY1xuICAgIHRoaXMuYW5vbnltb3VzU2lnbkluRnVuYyA9IG9wdGlvbnMuYW5vbnltb3VzU2lnbkluRnVuY1xuICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yID0gb3B0aW9ucy5vbkNyZWRlbnRpYWxzRXJyb3JcblxuICAgIGxhbmdFdmVudC5idXMub24obGFuZ0V2ZW50LkxBTkdfQ0hBTkdFX0VWRU5ULCAocGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLmkxOG4gPSBwYXJhbXMuZGF0YT8uaTE4biB8fCB0aGlzLmkxOG5cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIHNldENyZWRlbnRpYWxzIFByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIGZldGNoIGFwaSByZXF1ZXN0IGltcGxlbWVudGF0aW9uIHdpdGggYXV0aCBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcHVibGljIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCBjcmVkZW50aWFscyBmcm9tIGFjY2Vzc0tleVxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIHNldEFjY2Vzc0tleUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHMpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldEFjY2Vzc0tleUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEFjY2Vzc1Rva2VuIHJldHVybiBhIHZhbGlkYXRlIGFjY2VzcyB0b2tlblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5nZXRDcmVkZW50aWFscygpXG4gICAgaWYgKGNyZWRlbnRpYWxzPy5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuKVxuICAgIH1cbiAgICBjb25zdCByZXNwRXJyOiBSZXNwb25zZUVycm9yID0geyBlcnJvcjogRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BFcnIpXG4gIH1cblxuICAvKipcbiAgICogcmVxdWVzdCBodHRwIGxpa2Ugc2ltcGxlIGZldGNoIGFwaSwgZXhwOnJlcXVlc3QoJy92MS91c2VyL21lJywge3dpdGhDcmVkZW50aWFsczp0cnVlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0F1dGhDbGllbnRSZXF1ZXN0T3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3Q8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBBdXRoQ2xpZW50UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cbiAgICBjb25zdCByZXRyeTogbnVtYmVyID0gdGhpcy5mb3JtYXRSZXRyeShvcHRpb25zLnJldHJ5LCB0aGlzLnJldHJ5KVxuICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzLCBbdGhpcy5pMThuPy5MQU5HX0hFQURFUl9LRVldOiB0aGlzLmkxOG4/LmxhbmcgfVxuICAgIGlmICh0aGlzLmhlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4udGhpcy5oZWFkZXJzLFxuICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW1JlcXVlc3RJZEhlYWRlck5hbWVdKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnNbUmVxdWVzdElkSGVhZGVyTmFtZV0gPSBnZW5lcmF0ZVJlcXVlc3RJZCgpXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW0RldmljZUlkSGVhZGVyTmFtZV0pIHtcbiAgICAgIGNvbnN0IGRldmljZUlkID0gYXdhaXQgdGhpcy5nZXREZXZpY2VJZCgpXG4gICAgICBvcHRpb25zLmhlYWRlcnNbRGV2aWNlSWRIZWFkZXJOYW1lXSA9IGRldmljZUlkXG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQmFzaWNBdXRoICYmIHRoaXMuYmFzaWNBdXRoKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IHRoaXMuYmFzaWNBdXRoXG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5nZXRDcmVkZW50aWFscygpXG4gICAgICBpZiAoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5JblVSTCkge1xuICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgICAgdXJsICs9ICc/J1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cmwgKz0gYGFjY2Vzc190b2tlbj0ke2NyZWRlbnRpYWxzLmFjY2Vzc190b2tlbn1gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgJHtjcmVkZW50aWFscy50b2tlbl90eXBlfSAke2NyZWRlbnRpYWxzLmFjY2Vzc190b2tlbn1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2xpZW50SWQgJiYgdXJsLmluZGV4T2YoJ2NsaWVudF9pZCcpIDwgMCkge1xuICAgICAgICB1cmwgKz0gdXJsLmluZGV4T2YoJz8nKSA8IDAgPyAnPycgOiAnJidcbiAgICAgICAgdXJsICs9IGBjbGllbnRfaWQ9JHt0aGlzLmNsaWVudElkfWBcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIHVybCA9IGAke3RoaXMuYXBpT3JpZ2lufSR7dGhpcy5hcGlQYXRofSR7dXJsfWBcbiAgICB9XG4gICAgbGV0IHJlc3BvbnNlOiBUIHwgbnVsbCA9IG51bGxcbiAgICBjb25zdCBtYXhSZXF1ZXN0VGltZXM6IG51bWJlciA9IHJldHJ5ICsgMVxuICAgIGZvciAobGV0IHJlcXVlc3RUaW1lID0gMDsgcmVxdWVzdFRpbWUgPCBtYXhSZXF1ZXN0VGltZXM7IHJlcXVlc3RUaW1lKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChvcHRpb25zLnVzZVd4Q2xvdWQgfHwgdGhpcy51c2VXeENsb3VkKSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnd4Q2xvdWRDYWxsRnVuY3Rpb248VD4odXJsLCBvcHRpb25zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iYXNlUmVxdWVzdDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICYmIHJlc3BvbnNlRXJyb3IgJiYgcmVzcG9uc2VFcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3JlZGVudGlhbHMobnVsbClcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2VFcnJvcilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0VGltZSA9PT0gcmV0cnkgfHwgIXJlc3BvbnNlRXJyb3IgfHwgcmVzcG9uc2VFcnJvci5lcnJvciAhPT0gJ3VucmVhY2hhYmxlJykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZUVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNsZWVwKE9BdXRoMkNsaWVudC5yZXRyeUludGVydmFsKVxuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3eENsb3VkQ2FsbEZ1bmN0aW9uPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgcmVzdWx0OiBUIHwgbnVsbCA9IG51bGxcbiAgICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsXG4gICAgdHJ5IHtcbiAgICAgIGxldCB1c2VyQWdlbnQgPSAnJ1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlckFnZW50ID0gYXdhaXQgd3guZ2V0UmVuZGVyZXJVc2VyQWdlbnQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICBjb25zdCB7IHJlc3VsdDogcmVzcG9uc2VSZXN1bHQgfSA9IGF3YWl0IHRoaXMud3hDbG91ZC5jYWxsRnVuY3Rpb24oe1xuICAgICAgICBuYW1lOiAnaHR0cE92ZXJDYWxsRnVuY3Rpb24nLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgb3JpZ2luOiAnaHR0cHM6Ly9zZXJ2aWNld2VjaGF0LmNvbScsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IHVzZXJBZ2VudCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IG9wdGlvbnMuYm9keSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChyZXNwb25zZVJlc3VsdD8uYm9keT8uZXJyb3JfY29kZSkge1xuICAgICAgICByZXNwb25zZUVycm9yID0gcmVzcG9uc2VSZXN1bHQ/LmJvZHkgYXMgUmVzcG9uc2VFcnJvclxuICAgICAgICByZXNwb25zZUVycm9yLmVycm9yX3VyaSA9IGdldFBhdGhOYW1lKHVybClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlUmVzdWx0Py5ib2R5IGFzIFRcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgICAgZXJyb3I6IEVycm9yVHlwZS5VTlJFQUNIQUJMRSxcbiAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIGVycm9yX3VyaTogZ2V0UGF0aE5hbWUodXJsKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VFcnJvcikge1xuICAgICAgdGhyb3cgcmVzcG9uc2VFcnJvclxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjcmVkZW50aWFscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDcmVkZW50aWFscygpOiBQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgIGlmICghY3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IG1zZyA9ICdjcmVkZW50aWFscyBub3QgZm91bmQnXG4gICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnIH0pXG4gICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihtc2cpXG4gICAgfVxuICAgIGlmIChpc0NyZWRlbnRpYWxzRXhwaXJlZChjcmVkZW50aWFscykpIHtcbiAgICAgIGlmIChjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihjcmVkZW50aWFscylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhbm9ueW1vdXMnKSB7XG4gICAgICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuYW5vbnltb3VzTG9naW4oY3JlZGVudGlhbHMpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yPy4oeyBtc2c6IGVycm9yLmVycm9yX2Rlc2NyaXB0aW9uIH0pXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNyZWRlbnRpYWxzLnNjb3BlID09PSAnYW5vbnltb3VzJykge1xuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuYW5vbnltb3VzTG9naW4oY3JlZGVudGlhbHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtc2cgPSAnbm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjcmVkZW50aWFscydcbiAgICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihtc2cpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIOW6n+W8g+aOpeWPo++8jOWLv+eUqC4g5aaC6ZyA6I635Y+W5Yet6K+B5L+h5oGv6K+35L2/55SoIGdldENyZWRlbnRpYWxzIOaWueazlVxuICAgKi9cbiAgcHVibGljIGdldENyZWRlbnRpYWxzU3luYygpOiBDcmVkZW50aWFscyB8IG51bGwge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKClcbiAgICByZXR1cm4gY3JlZGVudGlhbHNcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcmVkZW50aWFsc0FzeW5jKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3JlZGVudGlhbHMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICBpZiAoIWNyZWRlbnRpYWxzKSB7XG4gICAgICBjb25zdCBtc2cgPSAnY3JlZGVudGlhbHMgbm90IGZvdW5kJ1xuICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHMuc2NvcGVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRHcm91cHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgY29uc3QgbXNnID0gJ2NyZWRlbnRpYWxzIG5vdCBmb3VuZCdcbiAgICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yPy4oeyBtc2cgfSlcbiAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKG1zZylcbiAgICB9XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzLmdyb3Vwc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggZXhwaXJlZCB0b2tlbi5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5zaW5nbGVQcm9taXNlLnJ1bignX3JlZnJlc2hUb2tlbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgIWNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ25vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gY3JlZGVudGlhbHMnXG4gICAgICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yPy4oeyBtc2cgfSlcbiAgICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW5GdW5jKGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW4sIGNyZWRlbnRpYWxzKVxuICAgICAgICBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobmV3Q3JlZGVudGlhbHMpXG4gICAgICAgIHJldHVybiBuZXdDcmVkZW50aWFsc1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmVycm9yID09PSBFcnJvclR5cGUuSU5WQUxJRF9HUkFOVCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhudWxsKVxuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycm9yLmVycm9yX2Rlc2NyaXB0aW9uXG4gICAgICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKG1zZylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnOiBlcnJvci5lcnJvcl9kZXNjcmlwdGlvbiB9KVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYW5vbnltb3VzTG9naW4oY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ19hbm9ueW1vdXNMb2dpbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmFub255bW91c1NpZ25JbkZ1bmMpIHtcbiAgICAgICAgY29uc3QgYyA9IGF3YWl0IHRoaXMuYW5vbnltb3VzU2lnbkluRnVuYyhjcmVkZW50aWFscylcbiAgICAgICAgY3JlZGVudGlhbHMgPSBjIHx8IChhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5hbm9ueW1vdXNTaWduSW4oY3JlZGVudGlhbHMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVkZW50aWFsc1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgcmV0cnkgdmFsdWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXRyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBwcml2YXRlIGNoZWNrUmV0cnkocmV0cnk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3BvbnNlRXJyb3I6IFJlc3BvbnNlRXJyb3IgfCBudWxsID0gbnVsbFxuICAgIGlmICh0eXBlb2YgcmV0cnkgIT09ICdudW1iZXInIHx8IHJldHJ5IDwgT0F1dGgyQ2xpZW50Lm1pblJldHJ5IHx8IHJldHJ5ID4gT0F1dGgyQ2xpZW50Lm1heFJldHJ5KSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogJ3dyb25nIG9wdGlvbnMgcGFyYW06IHJldHJ5JyxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3BvbnNlRXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHJldHJ5XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWxlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0UmV0cnkocmV0cnk6IG51bWJlciwgZGVmYXVsdFZhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRyeSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja1JldHJ5KHJldHJ5KVxuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSwgbXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBhbm9ueW1vdXMgc2lnbkluXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhbm9ueW1vdXNTaWduSW4oY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLnNpbmdsZVByb21pc2UucnVuKCdfYW5vbnltb3VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5zY29wZSAhPT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IoJ25vIGFub255bW91cyBpbiBjcmVkZW50aWFscycpXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdDcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlcXVlc3QoQXBpVXJscy5BVVRIX1NJR05fSU5fQU5PTllNT1VTTFlfVVJMLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgd2l0aEJhc2ljQXV0aDogdHJ1ZSxcbiAgICAgICAgICBib2R5OiB7fSxcbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKVxuICAgICAgICByZXR1cm4gbmV3Q3JlZGVudGlhbHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLklOVkFMSURfR1JBTlQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobnVsbClcbiAgICAgICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihlcnJvci5lcnJvcl9kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJlZnJlc2ggdG9rZW4gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZyZXNoVG9rZW5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlZmF1bHRSZWZyZXNoVG9rZW5GdW5jKHJlZnJlc2hUb2tlbj86IHN0cmluZywgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBpZiAocmVmcmVzaFRva2VuID09PSB1bmRlZmluZWQgfHwgcmVmcmVzaFRva2VuID09PSAnJykge1xuICAgICAgY29uc3QgbXNnID0gJ3JlZnJlc2ggdG9rZW4gbm90IGZvdW5kJ1xuICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyA9IEFwaVVybHMuQVVUSF9UT0tFTl9VUkxcblxuICAgIGlmIChjcmVkZW50aWFscz8udmVyc2lvbiA9PT0gJ3YyJykge1xuICAgICAgdXJsID0gQXBpVXJsc1YyLkFVVEhfVE9LRU5fVVJMXG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiB7XG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHsgLi4ubmV3Q3JlZGVudGlhbHMsIHZlcnNpb246IGNyZWRlbnRpYWxzPy52ZXJzaW9uIHx8ICd2MScgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXZpY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREZXZpY2VJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRldmljZUlEKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXZpY2VJRFxuICAgIH1cbiAgICBsZXQgZGV2aWNlSWQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJdGVtKERldmljZUlkU2VjdGlvbk5hbWUpXG4gICAgaWYgKCEodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBkZXZpY2VJZC5sZW5ndGggPj0gMTYgJiYgZGV2aWNlSWQubGVuZ3RoIDw9IDQ4KSkge1xuICAgICAgZGV2aWNlSWQgPSB1dWlkdjQoKVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldEl0ZW0oRGV2aWNlSWRTZWN0aW9uTmFtZSwgZGV2aWNlSWQpXG4gICAgfVxuICAgIHRoaXMuZGV2aWNlSUQgPSBkZXZpY2VJZFxuICAgIHJldHVybiBkZXZpY2VJZFxuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bkF1dGhlbnRpY2F0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn1cbiAgICovXG4gIHByaXZhdGUgdW5BdXRoZW50aWNhdGVkRXJyb3I8VD4oZXJyPzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcEVycjogUmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBFcnJvclR5cGUuVU5BVVRIRU5USUNBVEVELFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycixcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BFcnIpXG4gIH1cbn1cbiJdfQ==
|
|
1145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29hdXRoMmNsaWVudC9vYXV0aDJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBb0M7QUFDcEMseUNBQXFHO0FBYXJHLHNDQUFzQztBQUN0Qyx3Q0FBNEM7QUFFNUMsbUVBQWdFO0FBQ2hFLDBDQUF3QztBQUN4QyxrQ0FBa0M7QUFHbEMsa0RBQWdEO0FBRWhELElBQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFBO0FBQzFDLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQ3hDLElBQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFBO0FBV2hDLElBQU0sY0FBYyxHQUFvQixVQUFtQixHQUFXLEVBQUUsT0FBd0I7Ozs7OztvQkFDakcsTUFBTSxHQUFhLElBQUksQ0FBQTtvQkFDdkIsYUFBYSxHQUF5QixJQUFJLENBQUE7Ozs7b0JBR3RDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtvQkFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7d0JBQ3ZCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO3FCQUMzQjtvQkFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTt3QkFDNUQsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDcEQ7b0JBQ2dDLFdBQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBQTs7b0JBQXhELGNBQWMsR0FBYSxTQUE2QjtvQkFDekMsV0FBTSxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUE7O29C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TSxDQUFDLE9BQUssQ0FBQyxFQUFBOzs7OzZCQUd2QixDQUFBLFdBQVcsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFBLEVBQWpDLGVBQWlDO3dCQUM1QixXQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUE7O3dCQUFwRCxXQUFXLEdBQUcsU0FBc0MsQ0FBQTs7O3dCQUU5QyxHQUFHLEdBQUcsdUNBQXVDLENBQUE7d0JBQ25ELE1BQUEsSUFBSSxDQUFDLGtCQUFrQixxREFBRyxFQUFFLEdBQUcsS0FBQSxFQUFFLENBQUMsQ0FBQTt3QkFDbEMsV0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUE7NkJBR3pDLFdBQU8sV0FBVyxFQUFBOzs7O0tBQ25CO0lBOXFCYyx5QkFBWSxHQUFHLENBQUMsQUFBSixDQUFJO0lBQ2hCLHFCQUFRLEdBQUcsQ0FBQyxBQUFKLENBQUk7SUFDWixxQkFBUSxHQUFHLENBQUMsQUFBSixDQUFJO0lBQ1osMEJBQWEsR0FBRyxJQUFJLEFBQVAsQ0FBTztJQTRxQnJDLG1CQUFDO0NBQUEsQUFockJELElBZ3JCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVycm9yVHlwZSB9IGZyb20gJy4vY29uc3RzJ1xuaW1wb3J0IHsgQXBpVXJscywgQXBpVXJsc1YyLCBBVVRIX0FQSV9QUkVGSVgsIEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLCBFVkVOVFMgfSBmcm9tICcuLi9hdXRoL2NvbnN0cydcblxuaW1wb3J0IHsgQXV0aENsaWVudCwgU2ltcGxlU3RvcmFnZSB9IGZyb20gJy4vaW50ZXJmYWNlJ1xuXG5pbXBvcnQge1xuICBDcmVkZW50aWFscyxcbiAgUmVzcG9uc2VFcnJvcixcbiAgUmVxdWVzdE9wdGlvbnMsXG4gIFJlcXVlc3RGdW5jdGlvbixcbiAgT0F1dGgyQ2xpZW50T3B0aW9ucyxcbiAgQXV0aENsaWVudFJlcXVlc3RPcHRpb25zLFxufSBmcm9tICcuL21vZGVscydcblxuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSAnLi4vdXRpbHMvdXVpZCdcbmltcG9ydCB7IGdldFBhdGhOYW1lIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgnXG5cbmltcG9ydCB7IFNpbmdsZVByb21pc2UgfSBmcm9tICcuLi91dGlscy9mdW5jdGlvbi9zaW5nbGUtcHJvbWlzZSdcbmltcG9ydCB7IHdlQnRvYSB9IGZyb20gJy4uL3V0aWxzL2Jhc2U2NCdcbmltcG9ydCB7IGlzTXAgfSBmcm9tICcuLi91dGlscy9tcCdcbmltcG9ydCB7IEF1dGhPcHRpb25zIH0gZnJvbSAnLi4vYXV0aC9hcGlzJ1xuaW1wb3J0IHsgSUNsb3VkYmFzZUNvbmZpZyB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMnXG5pbXBvcnQgeyBsYW5nRXZlbnQgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcblxuY29uc3QgUmVxdWVzdElkSGVhZGVyTmFtZSA9ICd4LXJlcXVlc3QtaWQnXG5jb25zdCBEZXZpY2VJZEhlYWRlck5hbWUgPSAneC1kZXZpY2UtaWQnXG5jb25zdCBEZXZpY2VJZFNlY3Rpb25OYW1lID0gJ2RldmljZV9pZCdcblxuZGVjbGFyZSBjb25zdCB3eDogYW55XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9SZXNwb25zZUVycm9yT3B0aW9ucyB7XG4gIGVycm9yPzogRXJyb3JUeXBlXG4gIGVycm9yX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxuICBlcnJvcl91cmk/OiBzdHJpbmcgfCBudWxsXG4gIGRldGFpbHM/OiBhbnkgfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UmVxdWVzdDogUmVxdWVzdEZ1bmN0aW9uID0gYXN5bmMgZnVuY3Rpb24gPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgbGV0IHJlc3VsdDogVCB8IG51bGwgPSBudWxsXG4gIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yIHwgbnVsbCA9IG51bGxcbiAgdHJ5IHtcbiAgICAvLyBPYmplY3RzIG11c3QgYmUgY29waWVkIHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIGRhdGEgc3VjaCBhcyBib2R5LlxuICAgIGNvbnN0IGNvcHlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucylcbiAgICBpZiAoIWNvcHlPcHRpb25zLm1ldGhvZCkge1xuICAgICAgY29weU9wdGlvbnMubWV0aG9kID0gJ0dFVCdcbiAgICB9XG4gICAgaWYgKGNvcHlPcHRpb25zLmJvZHkgJiYgdHlwZW9mIGNvcHlPcHRpb25zLmJvZHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb3B5T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoY29weU9wdGlvbnMuYm9keSlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VSZXN1bHQ6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBjb3B5T3B0aW9ucylcbiAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZVJlc3VsdC5qc29uKClcbiAgICBpZiAoanNvblJlc3BvbnNlPy5lcnJvcikge1xuICAgICAgcmVzcG9uc2VFcnJvciA9IGpzb25SZXNwb25zZSBhcyBSZXNwb25zZUVycm9yXG4gICAgICByZXNwb25zZUVycm9yLmVycm9yX3VyaSA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBqc29uUmVzcG9uc2UgYXMgVFxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgZXJyb3I6IEVycm9yVHlwZS5VTlJFQUNIQUJMRSxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnJvci5tZXNzYWdlLFxuICAgICAgZXJyb3JfdXJpOiBuZXcgVVJMKHVybCkucGF0aG5hbWUsXG4gICAgfVxuICB9XG4gIGlmIChyZXNwb25zZUVycm9yKSB7XG4gICAgdGhyb3cgcmVzcG9uc2VFcnJvclxuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdG9SZXNwb25zZUVycm9yID0gKGVycm9yOiBSZXNwb25zZUVycm9yIHwgRXJyb3IsIG9wdGlvbnM/OiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zKTogUmVzcG9uc2VFcnJvciA9PiB7XG4gIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yXG4gIGNvbnN0IGZvcm1hdE9wdGlvbnM6IFRvUmVzcG9uc2VFcnJvck9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBmb3JtYXRPcHRpb25zLmVycm9yIHx8IEVycm9yVHlwZS5MT0NBTCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBmb3JtYXRPcHRpb25zLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGVycm9yLm1lc3NhZ2UsXG4gICAgICBlcnJvcl91cmk6IGZvcm1hdE9wdGlvbnMuZXJyb3JfdXJpLFxuICAgICAgZGV0YWlsczogZm9ybWF0T3B0aW9ucy5kZXRhaWxzIHx8IGVycm9yLnN0YWNrLFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmb3JtYXRFcnJvcjogVG9SZXNwb25zZUVycm9yT3B0aW9ucyA9IGVycm9yIHx8IHt9XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBmb3JtYXRPcHRpb25zLmVycm9yIHx8IGZvcm1hdEVycm9yLmVycm9yIHx8IEVycm9yVHlwZS5MT0NBTCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBmb3JtYXRPcHRpb25zLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGZvcm1hdEVycm9yLmVycm9yX2Rlc2NyaXB0aW9uLFxuICAgICAgZXJyb3JfdXJpOiBmb3JtYXRPcHRpb25zLmVycm9yX3VyaSB8fCBmb3JtYXRFcnJvci5lcnJvcl91cmksXG4gICAgICBkZXRhaWxzOiBmb3JtYXRPcHRpb25zLmRldGFpbHMgfHwgZm9ybWF0RXJyb3IuZGV0YWlscyxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlRXJyb3Jcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSByZXF1ZXN0IGlkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHV1aWR2NCgpXG59XG5cbi8qKlxuICogRGVmYXVsdCBTdG9yYWdlLlxuICovXG5jbGFzcyBEZWZhdWx0U3RvcmFnZSBpbXBsZW1lbnRzIFNpbXBsZVN0b3JhZ2Uge1xuICAvKipcbiAgICog57yT5a2Ya2V557uf5LiA5L2/55So5ZCO57yA5Yy65YiGXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Vudjogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Iob3B0cz86IHsgZW52OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX2VudiA9IG9wdHM/LmVudiB8fCAnJ1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaXRlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKi9cbiAgYXN5bmMgZ2V0SXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWApXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGl0ZW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICovXG4gIGFzeW5jIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWApXG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0ZW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqL1xuICBhc3luYyBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke2tleX0ke3RoaXMuX2Vudn1gLCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaXRlbSBzeW5jLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqL1xuICBnZXRJdGVtU3luYyhrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWApXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGl0ZW0gc3luYy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKi9cbiAgcmVtb3ZlSXRlbVN5bmMoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7a2V5fSR7dGhpcy5fZW52fWApXG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0ZW0gc3luYy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICovXG4gIHNldEl0ZW1TeW5jKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGAke2tleX0ke3RoaXMuX2Vudn1gLCB2YWx1ZSlcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0b3JhZ2UgPSBuZXcgRGVmYXVsdFN0b3JhZ2UoKVxuXG5pbnRlcmZhY2UgTG9jYWxDcmVkZW50aWFsc09wdGlvbnMge1xuICB0b2tlblNlY3Rpb25OYW1lOiBzdHJpbmdcbiAgc3RvcmFnZTogU2ltcGxlU3RvcmFnZVxuICBjbGllbnRJZDogc3RyaW5nXG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBjcmVkZW50aWFscyBpcyBleHBpcmVkLlxuICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQ3JlZGVudGlhbHNFeHBpcmVkKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICBsZXQgaXNFeHBpcmVkID0gdHJ1ZVxuICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQgJiYgY3JlZGVudGlhbHM/LmFjY2Vzc190b2tlbikge1xuICAgIGlzRXhwaXJlZCA9IGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPCBuZXcgRGF0ZSgpXG4gIH1cbiAgcmV0dXJuIGlzRXhwaXJlZFxufVxuXG4vKipcbiAqIExvY2FsIGNyZWRlbnRpYWxzLlxuICogTG9jYWwgY3JlZGVudGlhbHMsIHdpdGggbWVtb3J5IGNhY2hlIGFuZCBzdG9yYWdlIGNhY2hlLlxuICogSWYgdGhlIG1lbW9yeSBjYWNoZSBleHBpcmVzLCB0aGUgc3RvcmFnZSBjYWNoZSBpcyBhdXRvbWF0aWNhbGx5IGxvYWRlZC5cbiAqL1xuY2xhc3MgTG9jYWxDcmVkZW50aWFscyB7XG4gIHByaXZhdGUgdG9rZW5TZWN0aW9uTmFtZTogc3RyaW5nXG5cbiAgcHJpdmF0ZSBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlXG5cbiAgcHJpdmF0ZSBjbGllbnRJZDogc3RyaW5nXG5cbiAgcHJpdmF0ZSBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCBudWxsID0gbnVsbFxuICAvLyDmnaXoh6phY2Nlc3NLZXnnmoTouqvku73vvIzkuI3mjIHkuYXljJZcbiAgcHJpdmF0ZSBhY2Nlc3NLZXlDcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgc2luZ2xlUHJvbWlzZTogU2luZ2xlUHJvbWlzZSA9IG51bGxcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtMb2NhbENyZWRlbnRpYWxzT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTG9jYWxDcmVkZW50aWFsc09wdGlvbnMpIHtcbiAgICB0aGlzLnRva2VuU2VjdGlvbk5hbWUgPSBvcHRpb25zLnRva2VuU2VjdGlvbk5hbWVcbiAgICB0aGlzLnN0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2VcbiAgICB0aGlzLmNsaWVudElkID0gb3B0aW9ucy5jbGllbnRJZFxuICAgIHRoaXMuc2luZ2xlUHJvbWlzZSA9IG5ldyBTaW5nbGVQcm9taXNlKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfSlcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCBudWxsXG4gIH1cblxuICBwdWJsaWMgZ2V0U3RvcmFnZUNyZWRlbnRpYWxzU3luYygpOiBDcmVkZW50aWFscyB8IG51bGwge1xuICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBudWxsXG4gICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtU3luYyh0aGlzLnRva2VuU2VjdGlvbk5hbWUpXG4gICAgaWYgKHRva2VuU3RyICE9PSB1bmRlZmluZWQgJiYgdG9rZW5TdHIgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gSlNPTi5wYXJzZSh0b2tlblN0cilcbiAgICAgICAgaWYgKGNyZWRlbnRpYWxzPy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMuZXhwaXJlc19hdCA9IG5ldyBEYXRlKGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICAgICAgY3JlZGVudGlhbHMgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgLyoqXG4gICAqIHNldENyZWRlbnRpYWxzIFByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIGZldGNoIGFwaSByZXF1ZXN0IGltcGxlbWVudGF0aW9uIHdpdGggYXV0aCBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfaW4pIHtcbiAgICAgIGlmICghY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgY3JlZGVudGlhbHMuZXhwaXJlc19hdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAoY3JlZGVudGlhbHMuZXhwaXJlc19pbiAtIDMwKSAqIDEwMDApXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdG9yYWdlKSB7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjcmVkZW50aWFscylcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldEl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lLCB0b2tlblN0cilcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBjcmVkZW50aWFsc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zdG9yYWdlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCBjcmVkZW50aWFscyBmcm9tIGFjY2Vzc0tleVxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIHNldEFjY2Vzc0tleUNyZWRlbnRpYWxzKGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHMpIHtcbiAgICB0aGlzLmFjY2Vzc0tleUNyZWRlbnRpYWxzID0gY3JlZGVudGlhbHNcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlZGVudGlhbHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDcmVkZW50aWFscygpOiBQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnNpbmdsZVByb21pc2UucnVuKCdnZXRDcmVkZW50aWFscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChpc0NyZWRlbnRpYWxzRXhwaXJlZCh0aGlzLmNyZWRlbnRpYWxzKSkge1xuICAgICAgICBjb25zdCB7IGNyZWRlbnRpYWxzLCBpc0FjY2Vzc0tleUNyZWRlbnRpYWxzIH0gPSBhd2FpdCB0aGlzLmdldFN0b3JhZ2VDcmVkZW50aWFscygpXG4gICAgICAgIGlmIChpc0FjY2Vzc0tleUNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JhZ2UgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFN0b3JhZ2VDcmVkZW50aWFscygpOiBQcm9taXNlPHsgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzIHwgbnVsbDsgaXNBY2Nlc3NLZXlDcmVkZW50aWFsczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ19nZXRTdG9yYWdlQ3JlZGVudGlhbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gbnVsbFxuICAgICAgbGV0IGlzQWNjZXNzS2V5Q3JlZGVudGlhbHMgPSBmYWxzZVxuICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICAgIGlmICghIXRva2VuU3RyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKHRva2VuU3RyKVxuICAgICAgICAgIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgY3JlZGVudGlhbHMuZXhwaXJlc19hdCA9IG5ldyBEYXRlKGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICAgICAgICBjcmVkZW50aWFscyA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSB0aGlzLmFjY2Vzc0tleUNyZWRlbnRpYWxzIHx8IG51bGxcbiAgICAgICAgaXNBY2Nlc3NLZXlDcmVkZW50aWFscyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNyZWRlbnRpYWxzLCBpc0FjY2Vzc0tleUNyZWRlbnRpYWxzIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogT0F1dGgyQ2xpZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBPQXV0aDJDbGllbnQgaW1wbGVtZW50cyBBdXRoQ2xpZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJldHJ5ID0gMlxuICBwcml2YXRlIHN0YXRpYyBtaW5SZXRyeSA9IDBcbiAgcHJpdmF0ZSBzdGF0aWMgbWF4UmV0cnkgPSA1XG4gIHByaXZhdGUgc3RhdGljIHJldHJ5SW50ZXJ2YWwgPSAxMDAwXG5cbiAgcHVibGljIGxvY2FsQ3JlZGVudGlhbHM6IExvY2FsQ3JlZGVudGlhbHNcbiAgLyoqXG4gICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBhc3luYyBjbGllbnQgaW5pdGlhbGl6YXRpb24uXG4gICAqIFdoZW4gbnVsbCBvciBub3QgeWV0IHJlc29sdmVkIHRoZSBhdXRoIHN0YXRlIGlzIGB1bmtub3duYFxuICAgKiBPbmNlIHJlc29sdmVkIHRoZSBhdXRoIHN0YXRlIGlzIGtub3duIGFuZCBpdCdzIHNhZmUgdG8gY2FsbCBhbnkgZnVydGhlciBjbGllbnQgbWV0aG9kcy5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplUHJvbWlzZTogUHJvbWlzZTx7IGVycm9yOiBFcnJvciB8IG51bGwgfT4gfCBudWxsID0gbnVsbFxuICBwcm90ZWN0ZWQgbG9ja0FjcXVpcmVkID0gZmFsc2VcbiAgcHJvdGVjdGVkIHBlbmRpbmdJbkxvY2s6IFByb21pc2U8YW55PltdID0gW11cbiAgcHJvdGVjdGVkIGxvZ0RlYnVnTWVzc2FnZXM6IGJvb2xlYW5cbiAgcHJvdGVjdGVkIGdldEluaXRpYWxTZXNzaW9uPzogKCkgPT4gUHJvbWlzZTx7XG4gICAgZGF0YTogeyBzZXNzaW9uOiBDcmVkZW50aWFsczsgdXNlcj86IGFueSB9IHwgbnVsbFxuICAgIGVycm9yOiBFcnJvciB8IG51bGxcbiAgfT5cbiAgcHJpdmF0ZSBhcGlPcmlnaW46IHN0cmluZ1xuICBwcml2YXRlIGFwaVBhdGg6IHN0cmluZ1xuICBwcml2YXRlIGNsaWVudElkOiBzdHJpbmdcbiAgcHJpdmF0ZSBpMThuOiBJQ2xvdWRiYXNlQ29uZmlnWydpMThuJ11cbiAgcHJpdmF0ZSByZXRyeTogbnVtYmVyXG4gIHByaXZhdGUgY2xpZW50U2VjcmV0Pzogc3RyaW5nXG4gIHByaXZhdGUgYmFzZVJlcXVlc3Q6IDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFQ+XG4gIHByaXZhdGUgc3RvcmFnZTogU2ltcGxlU3RvcmFnZVxuICBwcml2YXRlIGRldmljZUlEPzogc3RyaW5nXG4gIHByaXZhdGUgdG9rZW5JblVSTD86IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5GdW5jOiAocmVmcmVzaFRva2VuPzogc3RyaW5nLCBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzKSA9PiBQcm9taXNlPENyZWRlbnRpYWxzPlxuICBwcml2YXRlIGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG4gIHByaXZhdGUgc2luZ2xlUHJvbWlzZTogU2luZ2xlUHJvbWlzZSA9IG51bGxcbiAgcHJpdmF0ZSBhbm9ueW1vdXNTaWduSW5GdW5jOiAoQ3JlZGVudGlhbHMpID0+IFByb21pc2U8Q3JlZGVudGlhbHMgfCB2b2lkPlxuICBwcml2YXRlIHd4Q2xvdWQ6IGFueVxuICBwcml2YXRlIHVzZVd4Q2xvdWQ6IGJvb2xlYW5cbiAgcHJpdmF0ZSBldmVudEJ1czogYW55XG4gIHByaXZhdGUgYmFzaWNBdXRoOiBzdHJpbmdcbiAgcHJpdmF0ZSBvbkNyZWRlbnRpYWxzRXJyb3I6IEF1dGhPcHRpb25zWydvbkNyZWRlbnRpYWxzRXJyb3InXSB8IHVuZGVmaW5lZFxuICBwcml2YXRlIG9uSW5pdGlhbFNlc3Npb25PYnRhaW5lZD86IChkYXRhOiB7IHNlc3Npb246IENyZWRlbnRpYWxzOyB1c2VyPzogYW55IH0sIGVycm9yPzogYW55KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPlxuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09BdXRoMkNsaWVudE9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9BdXRoMkNsaWVudE9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMuY2xpZW50U2VjcmV0KSB7XG4gICAgICBvcHRpb25zLmNsaWVudFNlY3JldCA9ICcnXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmNsaWVudElkICYmIG9wdGlvbnMuZW52KSB7XG4gICAgICBvcHRpb25zLmNsaWVudElkID0gb3B0aW9ucy5lbnZcbiAgICB9XG5cbiAgICB0aGlzLmFwaU9yaWdpbiA9IG9wdGlvbnMuYXBpT3JpZ2luXG4gICAgdGhpcy5hcGlQYXRoID0gb3B0aW9ucy5hcGlQYXRoIHx8IEFVVEhfQVBJX1BSRUZJWFxuICAgIHRoaXMuY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkXG4gICAgdGhpcy5pMThuID0gb3B0aW9ucy5pMThuXG4gICAgdGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXNcbiAgICB0aGlzLnNpbmdsZVByb21pc2UgPSBuZXcgU2luZ2xlUHJvbWlzZSh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkIH0pXG4gICAgdGhpcy5yZXRyeSA9IHRoaXMuZm9ybWF0UmV0cnkob3B0aW9ucy5yZXRyeSwgT0F1dGgyQ2xpZW50LmRlZmF1bHRSZXRyeSlcbiAgICBpZiAob3B0aW9ucy5iYXNlUmVxdWVzdCkge1xuICAgICAgdGhpcy5iYXNlUmVxdWVzdCA9IG9wdGlvbnMuYmFzZVJlcXVlc3RcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iYXNlUmVxdWVzdCA9IGRlZmF1bHRSZXF1ZXN0XG4gICAgfVxuICAgIHRoaXMudG9rZW5JblVSTCA9IG9wdGlvbnMudG9rZW5JblVSTFxuICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVyc1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnN0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2UgfHwgZGVmYXVsdFN0b3JhZ2VcbiAgICB0aGlzLmxvY2FsQ3JlZGVudGlhbHMgPSBuZXcgTG9jYWxDcmVkZW50aWFscyh7XG4gICAgICB0b2tlblNlY3Rpb25OYW1lOiBgY3JlZGVudGlhbHNfJHtvcHRpb25zLmNsaWVudElkfWAsXG4gICAgICBzdG9yYWdlOiB0aGlzLnN0b3JhZ2UsXG4gICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZCxcbiAgICB9KVxuXG4gICAgdGhpcy5jbGllbnRTZWNyZXQgPSBvcHRpb25zLmNsaWVudFNlY3JldFxuICAgIGlmIChvcHRpb25zLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmJhc2ljQXV0aCA9IGBCYXNpYyAke3dlQnRvYShgJHtvcHRpb25zLmNsaWVudElkfToke3RoaXMuY2xpZW50U2VjcmV0fWApfWBcbiAgICB9XG4gICAgdGhpcy53eENsb3VkID0gb3B0aW9ucy53eENsb3VkXG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc01wKCkpIHtcbiAgICAgICAgdGhpcy51c2VXeENsb3VkID0gb3B0aW9ucy51c2VXeENsb3VkXG4gICAgICAgIGlmICh0aGlzLnd4Q2xvdWQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmVudikge1xuICAgICAgICAgIHd4LmNsb3VkLmluaXQoeyBlbnY6IG9wdGlvbnMuZW52IH0pXG4gICAgICAgICAgdGhpcy53eENsb3VkID0gd3guY2xvdWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvL1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hUb2tlbkZ1bmMgPSBvcHRpb25zLnJlZnJlc2hUb2tlbkZ1bmMgfHwgdGhpcy5kZWZhdWx0UmVmcmVzaFRva2VuRnVuY1xuICAgIHRoaXMuYW5vbnltb3VzU2lnbkluRnVuYyA9IG9wdGlvbnMuYW5vbnltb3VzU2lnbkluRnVuY1xuICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yID0gb3B0aW9ucy5vbkNyZWRlbnRpYWxzRXJyb3JcblxuICAgIC8vIE5ldyBvcHRpb25zIGZvciBzZXNzaW9uIGRldGVjdGlvblxuICAgIHRoaXMuZ2V0SW5pdGlhbFNlc3Npb24gPSBvcHRpb25zLmdldEluaXRpYWxTZXNzaW9uXG4gICAgdGhpcy5vbkluaXRpYWxTZXNzaW9uT2J0YWluZWQgPSBvcHRpb25zLm9uSW5pdGlhbFNlc3Npb25PYnRhaW5lZFxuICAgIHRoaXMubG9nRGVidWdNZXNzYWdlcyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcblxuICAgIGxhbmdFdmVudC5idXMub24obGFuZ0V2ZW50LkxBTkdfQ0hBTkdFX0VWRU5ULCAocGFyYW1zOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaTE4biA9IHBhcmFtcy5kYXRhPy5pMThuIHx8IHRoaXMuaTE4blxuICAgIH0pXG5cbiAgICAvLyBOb3RlOiBBdXRvLWluaXRpYWxpemUgaXMgTk9UIGNhbGxlZCBoZXJlIHRvIGFsbG93IENsb3VkYmFzZU9BdXRoIHRvIHNldCBnZXRJbml0aWFsU2Vzc2lvbiBmaXJzdFxuICAgIC8vIENsb3VkYmFzZU9BdXRoLmNvbnN0cnVjdG9yIHdpbGwgY2FsbCBpbml0aWFsaXplKCkgYWZ0ZXIgc2V0dGluZyB1cCB0aGUgY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnZXRJbml0aWFsU2Vzc2lvbiBjYWxsYmFjay5cbiAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemUoKSB0byBnZXQgdGhlIGluaXRpYWwgc2Vzc2lvbiAoZS5nLiwgZnJvbSBPQXV0aCBjYWxsYmFjayBpbiBVUkwpLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCBpbml0aWFsIHNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBzZXRHZXRJbml0aWFsU2Vzc2lvbihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTx7XG4gICAgZGF0YTogeyBzZXNzaW9uOiBDcmVkZW50aWFsczsgdXNlcj86IGFueSB9IHwgbnVsbFxuICAgIGVycm9yOiBFcnJvciB8IG51bGxcbiAgfT4sKTogdm9pZCB7XG4gICAgdGhpcy5nZXRJbml0aWFsU2Vzc2lvbiA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb25Jbml0aWFsU2Vzc2lvbk9idGFpbmVkIGNhbGxiYWNrLlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgaW5pdGlhbCBzZXNzaW9uIGlzIG9idGFpbmVkIGFuZCBzdG9yZWQsXG4gICAqIGFsbG93aW5nIHVwcGVyIGxheWVycyB0byBoYW5kbGUgdXNlciBpbmZvIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIHNlc3Npb24gYW5kIHVzZXIgZGF0YVxuICAgKi9cbiAgcHVibGljIHNldE9uSW5pdGlhbFNlc3Npb25PYnRhaW5lZChjYWxsYmFjazogKGRhdGE6IHsgc2Vzc2lvbjogQ3JlZGVudGlhbHM7IHVzZXI/OiBhbnkgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sKTogdm9pZCB7XG4gICAgdGhpcy5vbkluaXRpYWxTZXNzaW9uT2J0YWluZWQgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjbGllbnQgc2Vzc2lvbiBlaXRoZXIgZnJvbSB0aGUgdXJsIG9yIGZyb20gc3RvcmFnZS5cbiAgICogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBjbGllbnQgd2l0aCBkZXRlY3RTZXNzaW9uSW5Vcmw9dHJ1ZSxcbiAgICogYnV0IHNob3VsZCBhbHNvIGJlIGNhbGxlZCBtYW51YWxseSB3aGVuIGNoZWNraW5nIGZvciBhbiBlcnJvciBmcm9tIGFuIGF1dGggcmVkaXJlY3QuXG4gICAqIEBwYXJhbSBvbkluaXRpYWxTZXNzaW9uT2J0YWluZWQgT3B0aW9uYWwgY2FsbGJhY2sgdG8gc2V0IGJlZm9yZSBpbml0aWFsaXphdGlvbiBzdGFydHNcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx7IGVycm9yOiBFcnJvciB8IG51bGwgfT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWlzdXNlZC1wcm9taXNlc1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZVxuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZVByb21pc2UgPSAoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2luaXRpYWxpemUoKSkpKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogc2V0Q3JlZGVudGlhbHMgUHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgZmV0Y2ggYXBpIHJlcXVlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBhdXRoIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIElmIGluaXRpYWxpemF0aW9uIGlzIGluIHByb2dyZXNzLCB3YWl0IGZvciBpdCBmaXJzdFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2VcbiAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHRoaXMubG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhjcmVkZW50aWFscykpXG4gIH1cblxuICAvKipcbiAgICogc2V0IGNyZWRlbnRpYWxzIGZyb20gYWNjZXNzS2V5XG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqL1xuICBwdWJsaWMgc2V0QWNjZXNzS2V5Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscykge1xuICAgIHJldHVybiB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0QWNjZXNzS2V5Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpXG4gIH1cblxuICAvKipcbiAgICogZ2V0QWNjZXNzVG9rZW4gcmV0dXJuIGEgdmFsaWRhdGUgYWNjZXNzIHRva2VuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBpcyBpbiBwcm9ncmVzcywgd2FpdCBmb3IgaXQgZmlyc3RcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlXG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5nZXRDcmVkZW50aWFscygpXG4gICAgaWYgKGNyZWRlbnRpYWxzPy5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuKVxuICAgIH1cbiAgICBjb25zdCByZXNwRXJyOiBSZXNwb25zZUVycm9yID0geyBlcnJvcjogRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BFcnIpXG4gIH1cblxuICAvKipcbiAgICogcmVxdWVzdCBodHRwIGxpa2Ugc2ltcGxlIGZldGNoIGFwaSwgZXhwOnJlcXVlc3QoJy92MS91c2VyL21lJywge3dpdGhDcmVkZW50aWFsczp0cnVlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0F1dGhDbGllbnRSZXF1ZXN0T3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3Q8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBBdXRoQ2xpZW50UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cbiAgICBjb25zdCByZXRyeTogbnVtYmVyID0gdGhpcy5mb3JtYXRSZXRyeShvcHRpb25zLnJldHJ5LCB0aGlzLnJldHJ5KVxuICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4ub3B0aW9ucy5oZWFkZXJzLCBbdGhpcy5pMThuPy5MQU5HX0hFQURFUl9LRVldOiB0aGlzLmkxOG4/LmxhbmcgfVxuICAgIGlmICh0aGlzLmhlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4udGhpcy5oZWFkZXJzLFxuICAgICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW1JlcXVlc3RJZEhlYWRlck5hbWVdKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnNbUmVxdWVzdElkSGVhZGVyTmFtZV0gPSBnZW5lcmF0ZVJlcXVlc3RJZCgpXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW0RldmljZUlkSGVhZGVyTmFtZV0pIHtcbiAgICAgIGNvbnN0IGRldmljZUlkID0gYXdhaXQgdGhpcy5nZXREZXZpY2VJZCgpXG4gICAgICBvcHRpb25zLmhlYWRlcnNbRGV2aWNlSWRIZWFkZXJOYW1lXSA9IGRldmljZUlkXG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQmFzaWNBdXRoICYmIHRoaXMuYmFzaWNBdXRoKSB7XG4gICAgICBvcHRpb25zLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IHRoaXMuYmFzaWNBdXRoXG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIC8vIFVzZSBjdXN0b20gZ2V0Q3JlZGVudGlhbHMgZnVuY3Rpb24gaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgZGVmYXVsdFxuICAgICAgLy8gQ3VzdG9tIGdldENyZWRlbnRpYWxzIGF2b2lkcyBkZWZhdWx0IGdldENyZWRlbnRpYWxzKCkgY2FsbCB3aGljaCBtYXkgY2F1c2UgZGVhZGxvY2sgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IG9wdGlvbnMuZ2V0Q3JlZGVudGlhbHMgPyBhd2FpdCBvcHRpb25zLmdldENyZWRlbnRpYWxzKCkgOiBhd2FpdCB0aGlzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBpZiAodGhpcy50b2tlbkluVVJMKSB7XG4gICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJz8nXG4gICAgICAgICAgfVxuICAgICAgICAgIHVybCArPSBgYWNjZXNzX3Rva2VuPSR7Y3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGAke2NyZWRlbnRpYWxzLnRva2VuX3R5cGV9ICR7Y3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jbGllbnRJZCAmJiB1cmwuaW5kZXhPZignY2xpZW50X2lkJykgPCAwKSB7XG4gICAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpIDwgMCA/ICc/JyA6ICcmJ1xuICAgICAgICB1cmwgKz0gYGNsaWVudF9pZD0ke3RoaXMuY2xpZW50SWR9YFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gYCR7dGhpcy5hcGlPcmlnaW59JHt0aGlzLmFwaVBhdGh9JHt1cmx9YFxuICAgIH1cbiAgICBsZXQgcmVzcG9uc2U6IFQgfCBudWxsID0gbnVsbFxuICAgIGNvbnN0IG1heFJlcXVlc3RUaW1lczogbnVtYmVyID0gcmV0cnkgKyAxXG4gICAgZm9yIChsZXQgcmVxdWVzdFRpbWUgPSAwOyByZXF1ZXN0VGltZSA8IG1heFJlcXVlc3RUaW1lczsgcmVxdWVzdFRpbWUrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlV3hDbG91ZCB8fCB0aGlzLnVzZVd4Q2xvdWQpIHtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMud3hDbG91ZENhbGxGdW5jdGlvbjxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJhc2VSZXF1ZXN0PFQ+KHVybCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcikge1xuICAgICAgICBpZiAob3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgJiYgcmVzcG9uc2VFcnJvciAmJiByZXNwb25zZUVycm9yLmVycm9yID09PSBFcnJvclR5cGUuVU5BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRDcmVkZW50aWFscyhudWxsKVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZUVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RUaW1lID09PSByZXRyeSB8fCAhcmVzcG9uc2VFcnJvciB8fCByZXNwb25zZUVycm9yLmVycm9yICE9PSAndW5yZWFjaGFibGUnKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlRXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2xlZXAoT0F1dGgyQ2xpZW50LnJldHJ5SW50ZXJ2YWwpXG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHd4Q2xvdWRDYWxsRnVuY3Rpb248VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIGxldCByZXN1bHQ6IFQgfCBudWxsID0gbnVsbFxuICAgIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yIHwgbnVsbCA9IG51bGxcbiAgICB0cnkge1xuICAgICAgbGV0IHVzZXJBZ2VudCA9ICcnXG4gICAgICB0cnkge1xuICAgICAgICB1c2VyQWdlbnQgPSBhd2FpdCB3eC5nZXRSZW5kZXJlclVzZXJBZ2VudCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIGNvbnN0IHsgcmVzdWx0OiByZXNwb25zZVJlc3VsdCB9ID0gYXdhaXQgdGhpcy53eENsb3VkLmNhbGxGdW5jdGlvbih7XG4gICAgICAgIG5hbWU6ICdodHRwT3ZlckNhbGxGdW5jdGlvbicsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBvcmlnaW46ICdodHRwczovL3NlcnZpY2V3ZWNoYXQuY29tJyxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogdXNlckFnZW50LFxuICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogb3B0aW9ucy5ib2R5LFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3BvbnNlUmVzdWx0Py5ib2R5Py5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHJlc3BvbnNlRXJyb3IgPSByZXNwb25zZVJlc3VsdD8uYm9keSBhcyBSZXNwb25zZUVycm9yXG4gICAgICAgIHJlc3BvbnNlRXJyb3IuZXJyb3JfdXJpID0gZ2V0UGF0aE5hbWUodXJsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2VSZXN1bHQ/LmJvZHkgYXMgVFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgZXJyb3JfdXJpOiBnZXRQYXRoTmFtZSh1cmwpLFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZUVycm9yKSB7XG4gICAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgLy8gSWYgaW5pdGlhbGl6YXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IGZpcnN0XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZVxuXG4gICAgcmV0dXJuIHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB0aGlzLl9nZXRDcmVkZW50aWFscygpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIOW6n+W8g+aOpeWPo++8jOWLv+eUqC4g5aaC6ZyA6I635Y+W5Yet6K+B5L+h5oGv6K+35L2/55SoIGdldENyZWRlbnRpYWxzIOaWueazlVxuICAgKi9cbiAgcHVibGljIGdldENyZWRlbnRpYWxzU3luYygpOiBDcmVkZW50aWFscyB8IG51bGwge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKClcbiAgICByZXR1cm4gY3JlZGVudGlhbHNcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcmVkZW50aWFsc0FzeW5jKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3JlZGVudGlhbHMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICBpZiAoIWNyZWRlbnRpYWxzKSB7XG4gICAgICBjb25zdCBtc2cgPSAnY3JlZGVudGlhbHMgbm90IGZvdW5kJ1xuICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHMuc2NvcGVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRHcm91cHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgY29uc3QgbXNnID0gJ2NyZWRlbnRpYWxzIG5vdCBmb3VuZCdcbiAgICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yPy4oeyBtc2cgfSlcbiAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKG1zZylcbiAgICB9XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzLmdyb3Vwc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggZXhwaXJlZCB0b2tlbi5cbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscywgb3B0aW9ucz86IHsgdGhyb3dFcnJvcj86IGJvb2xlYW4gfSk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBpcyBpbiBwcm9ncmVzcywgd2FpdCBmb3IgaXQgZmlyc3RcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlXG5cbiAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHRoaXMuX3JlZnJlc2hUb2tlbihjcmVkZW50aWFscywgb3B0aW9ucykpXG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVmcmVzaCB0b2tlbiBtZXRob2QgKGNhbGxlZCB3aXRoaW4gbG9jaylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlZnJlc2hUb2tlbihjcmVkZW50aWFsczogQ3JlZGVudGlhbHMsIG9wdGlvbnM/OiB7IHRocm93RXJyb3I/OiBib29sZWFuIH0pOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ19yZWZyZXNoVG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICFjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICdubyByZWZyZXNoIHRva2VuIGZvdW5kIGluIGNyZWRlbnRpYWxzJ1xuICAgICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnIH0pXG4gICAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKG1zZylcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld0NyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuRnVuYyhjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuLCBjcmVkZW50aWFscylcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKVxuXG4gICAgICAgIHRoaXMuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVE9LRU5fUkVGUkVTSEVEIH0pXG5cbiAgICAgICAgcmV0dXJuIG5ld0NyZWRlbnRpYWxzXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob3B0aW9ucz8udGhyb3dFcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLmVycm9yID09PSBFcnJvclR5cGUuSU5WQUxJRF9HUkFOVCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhudWxsKVxuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycm9yLmVycm9yX2Rlc2NyaXB0aW9uXG4gICAgICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKG1zZylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnOiBlcnJvci5lcnJvcl9kZXNjcmlwdGlvbiB9KVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYW5vbnltb3VzTG9naW4oY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ19hbm9ueW1vdXNMb2dpbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmFub255bW91c1NpZ25JbkZ1bmMpIHtcbiAgICAgICAgY29uc3QgYyA9IGF3YWl0IHRoaXMuYW5vbnltb3VzU2lnbkluRnVuYyhjcmVkZW50aWFscylcbiAgICAgICAgY3JlZGVudGlhbHMgPSBjIHx8IChhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5hbm9ueW1vdXNTaWduSW4oY3JlZGVudGlhbHMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVkZW50aWFsc1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgcmV0cnkgdmFsdWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZXRyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBwcml2YXRlIGNoZWNrUmV0cnkocmV0cnk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3BvbnNlRXJyb3I6IFJlc3BvbnNlRXJyb3IgfCBudWxsID0gbnVsbFxuICAgIGlmICh0eXBlb2YgcmV0cnkgIT09ICdudW1iZXInIHx8IHJldHJ5IDwgT0F1dGgyQ2xpZW50Lm1pblJldHJ5IHx8IHJldHJ5ID4gT0F1dGgyQ2xpZW50Lm1heFJldHJ5KSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogJ3dyb25nIG9wdGlvbnMgcGFyYW06IHJldHJ5JyxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3BvbnNlRXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHJldHJ5XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWxlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0UmV0cnkocmV0cnk6IG51bWJlciwgZGVmYXVsdFZhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRyeSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja1JldHJ5KHJldHJ5KVxuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSwgbXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBhbm9ueW1vdXMgc2lnbkluXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhbm9ueW1vdXNTaWduSW4oY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLnNpbmdsZVByb21pc2UucnVuKCdfYW5vbnltb3VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5zY29wZSAhPT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IoJ25vIGFub255bW91cyBpbiBjcmVkZW50aWFscycpXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdDcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlcXVlc3QoQXBpVXJscy5BVVRIX1NJR05fSU5fQU5PTllNT1VTTFlfVVJMLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgd2l0aEJhc2ljQXV0aDogdHJ1ZSxcbiAgICAgICAgICBib2R5OiB7fSxcbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKVxuICAgICAgICByZXR1cm4gbmV3Q3JlZGVudGlhbHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLklOVkFMSURfR1JBTlQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobnVsbClcbiAgICAgICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihlcnJvci5lcnJvcl9kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJlZnJlc2ggdG9rZW4gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZyZXNoVG9rZW5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlZmF1bHRSZWZyZXNoVG9rZW5GdW5jKHJlZnJlc2hUb2tlbj86IHN0cmluZywgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBpZiAocmVmcmVzaFRva2VuID09PSB1bmRlZmluZWQgfHwgcmVmcmVzaFRva2VuID09PSAnJykge1xuICAgICAgY29uc3QgbXNnID0gJ3JlZnJlc2ggdG9rZW4gbm90IGZvdW5kJ1xuICAgICAgdGhpcy5vbkNyZWRlbnRpYWxzRXJyb3I/Lih7IG1zZyB9KVxuICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgIH1cblxuICAgIGxldCB1cmw6IHN0cmluZyA9IEFwaVVybHMuQVVUSF9UT0tFTl9VUkxcblxuICAgIGlmIChjcmVkZW50aWFscz8udmVyc2lvbiA9PT0gJ3YyJykge1xuICAgICAgdXJsID0gQXBpVXJsc1YyLkFVVEhfVE9LRU5fVVJMXG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiB7XG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHsgLi4ubmV3Q3JlZGVudGlhbHMsIHZlcnNpb246IGNyZWRlbnRpYWxzPy52ZXJzaW9uIHx8ICd2MScgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXZpY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREZXZpY2VJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRldmljZUlEKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXZpY2VJRFxuICAgIH1cbiAgICBsZXQgZGV2aWNlSWQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJdGVtKERldmljZUlkU2VjdGlvbk5hbWUpXG4gICAgaWYgKCEodHlwZW9mIGRldmljZUlkID09PSAnc3RyaW5nJyAmJiBkZXZpY2VJZC5sZW5ndGggPj0gMTYgJiYgZGV2aWNlSWQubGVuZ3RoIDw9IDQ4KSkge1xuICAgICAgZGV2aWNlSWQgPSB1dWlkdjQoKVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldEl0ZW0oRGV2aWNlSWRTZWN0aW9uTmFtZSwgZGV2aWNlSWQpXG4gICAgfVxuICAgIHRoaXMuZGV2aWNlSUQgPSBkZXZpY2VJZFxuICAgIHJldHVybiBkZXZpY2VJZFxuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bkF1dGhlbnRpY2F0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn1cbiAgICovXG4gIHByaXZhdGUgdW5BdXRoZW50aWNhdGVkRXJyb3I8VD4oZXJyPzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcEVycjogUmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBFcnJvclR5cGUuVU5BVVRIRU5USUNBVEVELFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycixcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BFcnIpXG4gIH1cblxuICAvKipcbiAgICogRGVidWcgbG9nZ2luZyBoZWxwZXJcbiAgICovXG4gIHByaXZhdGUgX2RlYnVnKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9nRGVidWdNZXNzYWdlcykge1xuICAgICAgY29uc29sZS5sb2coJ1tPQXV0aDJDbGllbnRdJywgLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSU1QT1JUQU5UOlxuICAgKiAxLiBOZXZlciB0aHJvdyBpbiB0aGlzIG1ldGhvZCwgYXMgaXQgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yXG4gICAqIDIuIE5ldmVyIHJldHVybiBhIHNlc3Npb24gZnJvbSB0aGlzIG1ldGhvZCBhcyBpdCB3b3VsZCBiZSBjYWNoZWQgb3ZlclxuICAgKiAgICB0aGUgd2hvbGUgbGlmZXRpbWUgb2YgdGhlIGNsaWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHsgZXJyb3I6IEVycm9yIHwgbnVsbCB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElmIG5vIGdldEluaXRpYWxTZXNzaW9uIGNhbGxiYWNrIGlzIHNldCwgbm90aGluZyB0byBkb1xuICAgICAgaWYgKCF0aGlzLmdldEluaXRpYWxTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2luaXRpYWxpemUoKScsICdubyBnZXRJbml0aWFsU2Vzc2lvbiBjYWxsYmFjayBzZXQsIHNraXBwaW5nJylcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnY2FsbGluZyBnZXRJbml0aWFsU2Vzc2lvbiBjYWxsYmFjaycpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuZ2V0SW5pdGlhbFNlc3Npb24oKVxuXG4gICAgICAgIGlmIChkYXRhPy5zZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ3Nlc3Npb24gb2J0YWluZWQgZnJvbSBnZXRJbml0aWFsU2Vzc2lvbicsIGRhdGEuc2Vzc2lvbilcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMoZGF0YT8uc2Vzc2lvbilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEludm9rZSBjYWxsYmFjayBmb3IgdXBwZXIgbGF5ZXIgdG8gaGFuZGxlIHVzZXIgc3RvcmFnZVxuICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCBCRUZPUkUgbG9jayBpcyByZWxlYXNlZCBzbyB1c2VyIHN0b3JhZ2UgaXMgYXRvbWljIHdpdGggc2Vzc2lvblxuICAgICAgICBpZiAodGhpcy5vbkluaXRpYWxTZXNzaW9uT2J0YWluZWQpIHtcbiAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnY2FsbGluZyBvbkluaXRpYWxTZXNzaW9uT2J0YWluZWQgY2FsbGJhY2snKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uSW5pdGlhbFNlc3Npb25PYnRhaW5lZChkYXRhLCBlcnJvcilcbiAgICAgICAgICB9IGNhdGNoIChjYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnZXJyb3IgaW4gb25Jbml0aWFsU2Vzc2lvbk9idGFpbmVkJywgY2FsbGJhY2tFcnJvcilcbiAgICAgICAgICAgIC8vIERvbid0IGZhaWwgaW5pdGlhbGl6YXRpb24gaWYgY2FsbGJhY2sgZmFpbHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2Vycm9yIGZyb20gZ2V0SW5pdGlhbFNlc3Npb24nLCBlcnJvcilcbiAgICAgICAgICByZXR1cm4geyBlcnJvciB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2V4Y2VwdGlvbiBkdXJpbmcgZ2V0SW5pdGlhbFNlc3Npb24nLCBlcnIpXG4gICAgICAgIHJldHVybiB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSkgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAndW5leHBlY3RlZCBlcnJvcicsIGVycm9yKVxuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2RlYnVnKCcjX2luaXRpYWxpemUoKScsICdlbmQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlcyBhIGdsb2JhbCBsb2NrIGJhc2VkIG9uIHRoZSBjbGllbnQgSUQuXG4gICAqIFRoaXMgZW5zdXJlcyB0aGF0IG9ubHkgb25lIG9wZXJhdGlvbiBjYW4gbW9kaWZ5IGNyZWRlbnRpYWxzIGF0IGEgdGltZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2FjcXVpcmVMb2NrPFI+KGFjcXVpcmVUaW1lb3V0OiBudW1iZXIsIGZuOiAoKSA9PiBQcm9taXNlPFI+KTogUHJvbWlzZTxSPiB7XG4gICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnYmVnaW4nLCBhY3F1aXJlVGltZW91dClcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5sb2NrQWNxdWlyZWQpIHtcbiAgICAgICAgLy8gTG9jayBpcyBhbHJlYWR5IGFjcXVpcmVkLCBxdWV1ZSB0aGUgb3BlcmF0aW9uXG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBlbmRpbmdJbkxvY2subGVuZ3RoID8gdGhpcy5wZW5kaW5nSW5Mb2NrW3RoaXMucGVuZGluZ0luTG9jay5sZW5ndGggLSAxXSA6IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBsYXN0XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKClcbiAgICAgICAgfSkoKVxuXG4gICAgICAgIHRoaXMucGVuZGluZ0luTG9jay5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VsdFxuICAgICAgICAgIH0gY2F0Y2ggKF9lOiBhbnkpIHtcbiAgICAgICAgICAgIC8vIHdlIGp1c3QgY2FyZSBpZiBpdCBmaW5pc2hlZFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSwpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuXG4gICAgICAvLyBBY3F1aXJlIHRoZSBsb2NrXG4gICAgICB0aGlzLl9kZWJ1ZygnI19hY3F1aXJlTG9jaycsICdhY3F1aXJpbmcgbG9jayBmb3IgY2xpZW50JywgdGhpcy5jbGllbnRJZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2NrQWNxdWlyZWQgPSB0cnVlXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKVxuXG4gICAgICAgIHRoaXMucGVuZGluZ0luTG9jay5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VsdFxuICAgICAgICAgIH0gY2F0Y2ggKF9lOiBhbnkpIHtcbiAgICAgICAgICAgIC8vIHdlIGp1c3QgY2FyZSBpZiBpdCBmaW5pc2hlZFxuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSwpXG5cbiAgICAgICAgYXdhaXQgcmVzdWx0XG5cbiAgICAgICAgLy8ga2VlcCBkcmFpbmluZyB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBub3RoaW5nIHRvIHdhaXQgb25cbiAgICAgICAgd2hpbGUgKHRoaXMucGVuZGluZ0luTG9jay5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB3YWl0T24gPSBbLi4udGhpcy5wZW5kaW5nSW5Mb2NrXVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRPbilcbiAgICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2suc3BsaWNlKDAsIHdhaXRPbi5sZW5ndGgpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdWx0XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19hY3F1aXJlTG9jaycsICdyZWxlYXNpbmcgbG9jayBmb3IgY2xpZW50JywgdGhpcy5jbGllbnRJZClcbiAgICAgICAgdGhpcy5sb2NrQWNxdWlyZWQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9kZWJ1ZygnI19hY3F1aXJlTG9jaycsICdlbmQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gZ2V0IGNyZWRlbnRpYWxzIChjYWxsZWQgd2l0aGluIGxvY2spXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRDcmVkZW50aWFscygpOiBQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgIGlmICghY3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IG1zZyA9ICdjcmVkZW50aWFscyBub3QgZm91bmQnXG4gICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnIH0pXG4gICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihtc2cpXG4gICAgfVxuICAgIGlmIChpc0NyZWRlbnRpYWxzRXhwaXJlZChjcmVkZW50aWFscykpIHtcbiAgICAgIGlmIChjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLl9yZWZyZXNoVG9rZW4oY3JlZGVudGlhbHMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGNyZWRlbnRpYWxzLnNjb3BlID09PSAnYW5vbnltb3VzJykge1xuICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmFub255bW91c0xvZ2luKGNyZWRlbnRpYWxzKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uQ3JlZGVudGlhbHNFcnJvcj8uKHsgbXNnOiBlcnJvci5lcnJvcl9kZXNjcmlwdGlvbiB9KVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjcmVkZW50aWFscy5zY29wZSA9PT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmFub255bW91c0xvZ2luKGNyZWRlbnRpYWxzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ25vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gY3JlZGVudGlhbHMnXG4gICAgICAgIHRoaXMub25DcmVkZW50aWFsc0Vycm9yPy4oeyBtc2cgfSlcbiAgICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IobXNnKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHNcbiAgfVxufVxuIl19
|