@decaf-ts/for-nest 0.11.2-refactor.2 → 0.11.2-refactor.4
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/README.md +273 -1
- package/dist/for-nest.cjs +219 -193
- package/dist/for-nest.js +235 -208
- package/lib/cjs/auth/AuthInterceptor.cjs +6 -3
- package/lib/cjs/auth/DecafAuthModule.cjs +2 -8
- package/lib/cjs/decaf-model/DecafModelModule.cjs +7 -2
- package/lib/cjs/decaf-model/FromModelController.cjs +121 -68
- package/lib/cjs/decaf-model/decorators/utils.cjs +4 -3
- package/lib/cjs/decaf-model/utils.cjs +10 -4
- package/lib/cjs/decorators.cjs +4 -3
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/request/DecafRequestContext.cjs +5 -2
- package/lib/esm/auth/AuthInterceptor.js +6 -3
- package/lib/esm/auth/DecafAuthModule.js +1 -7
- package/lib/esm/decaf-model/DecafModelModule.js +6 -1
- package/lib/esm/decaf-model/FromModelController.js +122 -69
- package/lib/esm/decaf-model/decorators/utils.js +3 -2
- package/lib/esm/decaf-model/utils.js +9 -3
- package/lib/esm/decorators.js +3 -2
- package/lib/esm/index.js +3 -3
- package/lib/esm/request/DecafRequestContext.js +4 -1
- package/lib/types/decaf-model/FromModelController.d.cts +3 -0
- package/lib/types/decaf-model/FromModelController.d.mts +3 -0
- package/lib/types/index.d.cts +3 -3
- package/lib/types/index.d.mts +3 -3
- package/lib/types/request/DecafRequestContext.d.cts +1 -0
- package/lib/types/request/DecafRequestContext.d.mts +1 -0
- package/package.json +1 -1
package/dist/for-nest.js
CHANGED
|
@@ -2,17 +2,17 @@ import { apply, Metadata, Decoration, DecorationKeys } from "@decaf-ts/decoratio
|
|
|
2
2
|
|
|
3
3
|
import { InjectablesKeys, DefaultInjectablesConfig } from "@decaf-ts/injectable-decorators";
|
|
4
4
|
|
|
5
|
-
import { Delete, Patch, Put, Post, Get, applyDecorators, createParamDecorator as createParamDecorator$1, InternalServerErrorException, Injectable, Scope, Inject, Optional, UseInterceptors, SetMetadata, Query, Module, Controller,
|
|
5
|
+
import { Delete, Patch, Put, Post, Get, applyDecorators, createParamDecorator as createParamDecorator$1, InternalServerErrorException, Injectable, Scope, Inject, Optional, UseInterceptors, SetMetadata, Query, Module, Controller, Param, Response, NotFoundException, NotAcceptableException, Catch, UseFilters, Logger, Global, Sse } from "@nestjs/common";
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { Model, ValidationKeys, ModelBuilder } from "@decaf-ts/decorator-validation";
|
|
8
8
|
|
|
9
|
-
import { isOperationBlocked, PreparedStatementKeys, UUID, Adapter, OrderDirection, ModelService, AuthorizationError,
|
|
9
|
+
import { isOperationBlocked, PreparedStatementKeys, UUID, Adapter, UnsupportedError, OrderDirection, ModelService, AuthorizationError, Service as Service$1, Repository as Repository$1, TransactionOperationKeys, Context, PersistenceKeys, ForbiddenError, DefaultAdapterFlags, injectableServiceKey, PersistenceService } from "@decaf-ts/core";
|
|
10
10
|
|
|
11
11
|
import { pickBy, negate, isUndefined as isUndefined$1, isArray, isString } from "lodash";
|
|
12
12
|
|
|
13
13
|
import { ApiExcludeEndpoint, ApiParam, ApiBearerAuth, ApiSecurity, ApiQuery, ApiOperation, ApiOkResponse, ApiNoContentResponse, ApiTags, ApiExtraModels, ApiBody, ApiCreatedResponse, getSchemaPath, ApiBadRequestResponse, ApiUnprocessableEntityResponse, ApiNotFoundResponse, DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
|
|
14
14
|
|
|
15
|
-
import { OperationKeys, BulkCrudOperationKeys, InternalError, DBKeys, ValidationError
|
|
15
|
+
import { OperationKeys, BulkCrudOperationKeys, BaseError, InternalError, DBKeys, ValidationError } from "@decaf-ts/db-decorators";
|
|
16
16
|
|
|
17
17
|
import { __decorate, __param, __metadata } from "tslib";
|
|
18
18
|
|
|
@@ -459,6 +459,9 @@ let DecafRequestContext = class DecafRequestContext extends RequestContext {
|
|
|
459
459
|
this.uuid = UUID.instance.generate();
|
|
460
460
|
this.request = req;
|
|
461
461
|
}
|
|
462
|
+
get headers() {
|
|
463
|
+
return this.getOrUndefined("headers");
|
|
464
|
+
}
|
|
462
465
|
put(record) {
|
|
463
466
|
let overrides;
|
|
464
467
|
try {
|
|
@@ -518,7 +521,8 @@ let AuthInterceptor = class AuthInterceptor {
|
|
|
518
521
|
for (const flavour of flavours) {
|
|
519
522
|
const transformer = Adapter.transformerFor(flavour);
|
|
520
523
|
if (!transformer) continue;
|
|
521
|
-
const
|
|
524
|
+
const instance = transformer.from ? transformer : new transformer;
|
|
525
|
+
const from = await instance.from(this.requestContext);
|
|
522
526
|
if (from) this.requestContext.accumulate(from);
|
|
523
527
|
}
|
|
524
528
|
}
|
|
@@ -553,7 +557,7 @@ function HttpVerbToDecorator(verb) {
|
|
|
553
557
|
};
|
|
554
558
|
const decorator = httpToCrud[verb];
|
|
555
559
|
if (!decorator) {
|
|
556
|
-
throw new
|
|
560
|
+
throw new UnsupportedError(`Unsupported HTTP verb "${verb}". No NestJS decorator mapping was found.`);
|
|
557
561
|
}
|
|
558
562
|
return decorator;
|
|
559
563
|
}
|
|
@@ -567,6 +571,11 @@ const apiParamSpec = name => ({
|
|
|
567
571
|
type: String
|
|
568
572
|
});
|
|
569
573
|
|
|
574
|
+
function toDecafError(error, fallbackMessage) {
|
|
575
|
+
if (error instanceof BaseError) return error;
|
|
576
|
+
return new InternalError(error instanceof Error ? `${fallbackMessage}: ${error.message}` : fallbackMessage);
|
|
577
|
+
}
|
|
578
|
+
|
|
570
579
|
function getApiDecorators(methodName, routePath, httpVerb, includeQueryParams = false) {
|
|
571
580
|
const NestHttpRouteDec = HttpVerbToDecorator(httpVerb);
|
|
572
581
|
const apiPathParams = extractPathParams(routePath).map(apiParamSpec);
|
|
@@ -610,7 +619,7 @@ function resolvePersistenceMethod(persistence, methodName, ...args) {
|
|
|
610
619
|
return typeof persistence[methodName] === "function" ? persistence[methodName](...args) : persistence.statement(methodName, ...args);
|
|
611
620
|
}
|
|
612
621
|
if (typeof persistence[methodName] === "function") return persistence[methodName](...args);
|
|
613
|
-
throw new
|
|
622
|
+
throw new InternalError(`Persistence method "${methodName}" not found on ${persistence?.constructor?.name}`);
|
|
614
623
|
}
|
|
615
624
|
|
|
616
625
|
function createRouteHandler(methodName) {
|
|
@@ -622,7 +631,7 @@ function createRouteHandler(methodName) {
|
|
|
622
631
|
return await resolvePersistenceMethod(this.persistence(), methodName, ...pathParams.valuesInOrder, direction, limit, offset);
|
|
623
632
|
} catch (e) {
|
|
624
633
|
log.error(`Custom query "${methodName}" failed`, e);
|
|
625
|
-
throw e;
|
|
634
|
+
throw toDecafError(e, `Custom query "${methodName}" failed`);
|
|
626
635
|
}
|
|
627
636
|
};
|
|
628
637
|
}
|
|
@@ -653,115 +662,11 @@ class DecafAuthHandler extends AuthHandler {
|
|
|
653
662
|
|
|
654
663
|
class DecafRoleAuthHandler extends DecafAuthHandler {}
|
|
655
664
|
|
|
656
|
-
Adapter.transformerFor = function toContextFlags(adapter) {
|
|
657
|
-
const alias = typeof adapter === "string" ? adapter : adapter.alias;
|
|
658
|
-
return Metadata["innerGet"](Symbol.for("transformers"), alias);
|
|
659
|
-
}.bind(Adapter);
|
|
660
|
-
|
|
661
|
-
Adapter.flavoursToTransform = function requestTransformers() {
|
|
662
|
-
const meta = Metadata["innerGet"](Symbol.for("transformers"));
|
|
663
|
-
if (!meta) return undefined;
|
|
664
|
-
return Object.keys(meta);
|
|
665
|
-
}.bind(Adapter);
|
|
666
|
-
|
|
667
|
-
Context.prototype.toResponse = function toResponse(res) {
|
|
668
|
-
const pending = this.pending();
|
|
669
|
-
if (pending) res.header("x-pending-task", JSON.stringify(pending));
|
|
670
|
-
return res;
|
|
671
|
-
};
|
|
672
|
-
|
|
673
|
-
const prototype = ModelBuilder.prototype;
|
|
674
|
-
|
|
675
|
-
if (!prototype.decorateClass) {
|
|
676
|
-
prototype.decorateClass = function(decorator) {
|
|
677
|
-
if (!this._classDecorators) {
|
|
678
|
-
this._classDecorators = [];
|
|
679
|
-
}
|
|
680
|
-
this._classDecorators.push(decorator);
|
|
681
|
-
return this;
|
|
682
|
-
};
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
prototype.Auth = function(model) {
|
|
686
|
-
return this.decorateClass(Auth(model));
|
|
687
|
-
};
|
|
688
|
-
|
|
689
|
-
if (!prototype.__hasClassDecoratorSupport) {
|
|
690
|
-
const originalBuild = prototype.build;
|
|
691
|
-
prototype.build = function() {
|
|
692
|
-
let result = originalBuild.call(this);
|
|
693
|
-
const decorators = this._classDecorators;
|
|
694
|
-
if (decorators?.length) {
|
|
695
|
-
for (const decorator of decorators) {
|
|
696
|
-
const decorated = decorator(result);
|
|
697
|
-
if (decorated) {
|
|
698
|
-
result = decorated;
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
return result;
|
|
703
|
-
};
|
|
704
|
-
prototype.__hasClassDecoratorSupport = true;
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
var DecafRequestHandlerInterceptor_1;
|
|
708
|
-
|
|
709
|
-
let DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
|
|
710
|
-
constructor(requestContext, executor) {
|
|
711
|
-
this.requestContext = requestContext;
|
|
712
|
-
this.executor = executor;
|
|
713
|
-
}
|
|
714
|
-
async contextualize(req) {
|
|
715
|
-
const headers = req.headers;
|
|
716
|
-
const flags = {
|
|
717
|
-
headers: headers,
|
|
718
|
-
overrides: {}
|
|
719
|
-
};
|
|
720
|
-
const ip = extractIp(req);
|
|
721
|
-
const logger = Logging.get().for({
|
|
722
|
-
ip: ip
|
|
723
|
-
});
|
|
724
|
-
this.requestContext.accumulate(Object.assign({}, DefaultAdapterFlags, {
|
|
725
|
-
logger: logger,
|
|
726
|
-
timestamp: new Date,
|
|
727
|
-
operation: `${req.method} ${req.url}`
|
|
728
|
-
}, flags));
|
|
729
|
-
}
|
|
730
|
-
async intercept(context, next) {
|
|
731
|
-
const req = context.switchToHttp().getRequest();
|
|
732
|
-
const res = context.switchToHttp().getResponse();
|
|
733
|
-
const log = Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
|
|
734
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
|
|
735
|
-
await this.contextualize(req);
|
|
736
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
|
|
737
|
-
await this.executor.exec(req, res);
|
|
738
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
|
|
739
|
-
return next.handle();
|
|
740
|
-
}
|
|
741
|
-
};
|
|
742
|
-
|
|
743
|
-
DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = __decorate([ Injectable({
|
|
744
|
-
scope: Scope.REQUEST
|
|
745
|
-
}), __metadata("design:paramtypes", [ DecafRequestContext, DecafHandlerExecutor ]) ], DecafRequestHandlerInterceptor);
|
|
746
|
-
|
|
747
|
-
function extractIp(req) {
|
|
748
|
-
const headers = req.headers;
|
|
749
|
-
function parseIpHeader(value) {
|
|
750
|
-
if (!value) return undefined;
|
|
751
|
-
const candidate = Array.isArray(value) ? value[0] : value;
|
|
752
|
-
return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
|
|
753
|
-
}
|
|
754
|
-
return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
|
|
755
|
-
}
|
|
756
|
-
|
|
757
665
|
var DecafAuthModule_1;
|
|
758
666
|
|
|
759
667
|
let DecafAuthModule = DecafAuthModule_1 = class DecafAuthModule {
|
|
760
668
|
static forRoot(options = {}) {
|
|
761
|
-
const providers = [ AuthInterceptor
|
|
762
|
-
provide: APP_INTERCEPTOR,
|
|
763
|
-
useClass: DecafRequestHandlerInterceptor
|
|
764
|
-
} ];
|
|
669
|
+
const providers = [ AuthInterceptor ];
|
|
765
670
|
if (options.handler) {
|
|
766
671
|
providers.push(options.handler);
|
|
767
672
|
providers.push({
|
|
@@ -1052,12 +957,67 @@ function getDtoCache(op) {
|
|
|
1052
957
|
return dtoCache.get(op);
|
|
1053
958
|
}
|
|
1054
959
|
|
|
960
|
+
Adapter.transformerFor = function toContextFlags(adapter) {
|
|
961
|
+
const alias = typeof adapter === "string" ? adapter : adapter.alias;
|
|
962
|
+
return Metadata["innerGet"](Symbol.for("transformers"), alias);
|
|
963
|
+
}.bind(Adapter);
|
|
964
|
+
|
|
965
|
+
Adapter.flavoursToTransform = function requestTransformers() {
|
|
966
|
+
const meta = Metadata["innerGet"](Symbol.for("transformers"));
|
|
967
|
+
if (!meta) return undefined;
|
|
968
|
+
return Object.keys(meta);
|
|
969
|
+
}.bind(Adapter);
|
|
970
|
+
|
|
971
|
+
Context.prototype.toResponse = function toResponse(res) {
|
|
972
|
+
const pending = this.pending();
|
|
973
|
+
if (pending) res.header("x-pending-task", JSON.stringify(pending));
|
|
974
|
+
return res;
|
|
975
|
+
};
|
|
976
|
+
|
|
977
|
+
const prototype = ModelBuilder.prototype;
|
|
978
|
+
|
|
979
|
+
if (!prototype.decorateClass) {
|
|
980
|
+
prototype.decorateClass = function(decorator) {
|
|
981
|
+
if (!this._classDecorators) {
|
|
982
|
+
this._classDecorators = [];
|
|
983
|
+
}
|
|
984
|
+
this._classDecorators.push(decorator);
|
|
985
|
+
return this;
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
prototype.Auth = function(model) {
|
|
990
|
+
return this.decorateClass(Auth(model));
|
|
991
|
+
};
|
|
992
|
+
|
|
993
|
+
if (!prototype.__hasClassDecoratorSupport) {
|
|
994
|
+
const originalBuild = prototype.build;
|
|
995
|
+
prototype.build = function() {
|
|
996
|
+
let result = originalBuild.call(this);
|
|
997
|
+
const decorators = this._classDecorators;
|
|
998
|
+
if (decorators?.length) {
|
|
999
|
+
for (const decorator of decorators) {
|
|
1000
|
+
const decorated = decorator(result);
|
|
1001
|
+
if (decorated) {
|
|
1002
|
+
result = decorated;
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
return result;
|
|
1007
|
+
};
|
|
1008
|
+
prototype.__hasClassDecoratorSupport = true;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1055
1011
|
var DynamicModelController_1;
|
|
1056
1012
|
|
|
1057
1013
|
class FromModelController {
|
|
1058
1014
|
static {
|
|
1059
1015
|
this.log = Logging.for(FromModelController.name);
|
|
1060
1016
|
}
|
|
1017
|
+
static toDecafError(error, fallbackMessage) {
|
|
1018
|
+
if (error instanceof BaseError) return error;
|
|
1019
|
+
return new InternalError(error instanceof Error ? `${fallbackMessage}: ${error.message}` : fallbackMessage);
|
|
1020
|
+
}
|
|
1061
1021
|
static getPersistence(ModelClazz) {
|
|
1062
1022
|
try {
|
|
1063
1023
|
return Service$1.get(ModelClazz);
|
|
@@ -1076,7 +1036,7 @@ class FromModelController {
|
|
|
1076
1036
|
const routeMethods = Metadata.get(persistence.constructor, Metadata.key(DECAF_ROUTE)) ?? {};
|
|
1077
1037
|
class QueryController extends DecafModelController {
|
|
1078
1038
|
get class() {
|
|
1079
|
-
throw new
|
|
1039
|
+
throw new InternalError("Method not implemented.");
|
|
1080
1040
|
}
|
|
1081
1041
|
constructor(clientContext, name) {
|
|
1082
1042
|
super(clientContext, name);
|
|
@@ -1160,13 +1120,14 @@ class FromModelController {
|
|
|
1160
1120
|
return 0;
|
|
1161
1121
|
});
|
|
1162
1122
|
for (const route of sortedRoutes) {
|
|
1163
|
-
const
|
|
1123
|
+
const methodName = route.implementation?.name || route.method.toLowerCase();
|
|
1124
|
+
const registration = FromModelController.matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName, factoryPersistence);
|
|
1164
1125
|
if (!registration) continue;
|
|
1165
|
-
const {methodName:
|
|
1166
|
-
const descriptor = FromModelController.defineMethod(DynamicModelController,
|
|
1126
|
+
const {methodName: registeredMethodName, handler: handler, decorators: decorators, paramDecorators: paramDecorators} = registration;
|
|
1127
|
+
const descriptor = FromModelController.defineMethod(DynamicModelController, registeredMethodName, handler);
|
|
1167
1128
|
if (descriptor) {
|
|
1168
1129
|
const httpDecorator = HttpVerbToDecorator(route.method)(route.path.replace(/^\/+|\/+$/g, "") || undefined);
|
|
1169
|
-
FromModelController.applyDecorators(DynamicModelController,
|
|
1130
|
+
FromModelController.applyDecorators(DynamicModelController, registeredMethodName, [ httpDecorator, ...decorators ], paramDecorators);
|
|
1170
1131
|
}
|
|
1171
1132
|
}
|
|
1172
1133
|
}
|
|
@@ -1192,6 +1153,24 @@ class FromModelController {
|
|
|
1192
1153
|
getPK: (...params) => composed?.separator ? params.join(composed.separator) : params.join("")
|
|
1193
1154
|
};
|
|
1194
1155
|
}
|
|
1156
|
+
static routeParamDecorators(path) {
|
|
1157
|
+
let paramIndex = 0;
|
|
1158
|
+
return path.split("/").filter(Boolean).flatMap(segment => {
|
|
1159
|
+
if (segment.startsWith(":")) {
|
|
1160
|
+
return [ {
|
|
1161
|
+
decorator: Param(segment.slice(1)),
|
|
1162
|
+
index: paramIndex++
|
|
1163
|
+
} ];
|
|
1164
|
+
}
|
|
1165
|
+
if (segment.startsWith("*")) {
|
|
1166
|
+
return [ {
|
|
1167
|
+
decorator: Param(segment.slice(1)),
|
|
1168
|
+
index: paramIndex++
|
|
1169
|
+
} ];
|
|
1170
|
+
}
|
|
1171
|
+
return [];
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1195
1174
|
static defineMethod(target, methodName, handler) {
|
|
1196
1175
|
Object.defineProperty(target.prototype || target, methodName, {
|
|
1197
1176
|
value: handler,
|
|
@@ -1207,11 +1186,12 @@ class FromModelController {
|
|
|
1207
1186
|
methodDecorators.forEach(d => d(proto, methodName, descriptor));
|
|
1208
1187
|
paramDecorators.forEach(({decorator: decorator, index: index}) => decorator(proto, methodName, index));
|
|
1209
1188
|
}
|
|
1210
|
-
static matchRoute(route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName, persistence) {
|
|
1189
|
+
static matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName, persistence) {
|
|
1211
1190
|
const {method: method, path: path} = route;
|
|
1212
1191
|
const normalizedPath = path.replace(/^\/+|\/+$/g, "");
|
|
1192
|
+
const handler = route.implementation;
|
|
1213
1193
|
if (method === "POST" && normalizedPath === "") {
|
|
1214
|
-
return FromModelController.createRegistration("create",
|
|
1194
|
+
return FromModelController.createRegistration("create", handler, FromModelController.createCreateDecorators(ModelConstr, modelClazzName), [ {
|
|
1215
1195
|
decorator: DecafBody(),
|
|
1216
1196
|
index: 0
|
|
1217
1197
|
}, {
|
|
@@ -1222,7 +1202,7 @@ class FromModelController {
|
|
|
1222
1202
|
} ]);
|
|
1223
1203
|
}
|
|
1224
1204
|
if (method === "POST" && normalizedPath === "bulk") {
|
|
1225
|
-
return FromModelController.createRegistration("createAll",
|
|
1205
|
+
return FromModelController.createRegistration("createAll", handler, FromModelController.bulkCreateDecorators(ModelConstr, modelClazzName), [ {
|
|
1226
1206
|
decorator: DecafBody(),
|
|
1227
1207
|
index: 0
|
|
1228
1208
|
}, {
|
|
@@ -1233,13 +1213,13 @@ class FromModelController {
|
|
|
1233
1213
|
} ]);
|
|
1234
1214
|
}
|
|
1235
1215
|
if (method === "GET" && normalizedPath === "bulk") {
|
|
1236
|
-
return FromModelController.createRegistration("readAll",
|
|
1216
|
+
return FromModelController.createRegistration("readAll", handler, FromModelController.bulkReadDecorators(ModelConstr, modelClazzName), [ {
|
|
1237
1217
|
decorator: Query("ids"),
|
|
1238
1218
|
index: 0
|
|
1239
1219
|
} ]);
|
|
1240
1220
|
}
|
|
1241
1221
|
if (method === "PUT" && normalizedPath === "bulk") {
|
|
1242
|
-
return FromModelController.createRegistration("updateAll",
|
|
1222
|
+
return FromModelController.createRegistration("updateAll", handler, FromModelController.bulkUpdateDecorators(ModelConstr, modelClazzName, apiProperties), [ {
|
|
1243
1223
|
decorator: DecafBody(),
|
|
1244
1224
|
index: 0
|
|
1245
1225
|
}, {
|
|
@@ -1250,7 +1230,7 @@ class FromModelController {
|
|
|
1250
1230
|
} ]);
|
|
1251
1231
|
}
|
|
1252
1232
|
if (method === "DELETE" && normalizedPath === "bulk") {
|
|
1253
|
-
return FromModelController.createRegistration("deleteAll",
|
|
1233
|
+
return FromModelController.createRegistration("deleteAll", handler, FromModelController.bulkDeleteDecorators(ModelConstr, modelClazzName, apiProperties), [ {
|
|
1254
1234
|
decorator: Query("ids"),
|
|
1255
1235
|
index: 0
|
|
1256
1236
|
}, {
|
|
@@ -1261,35 +1241,21 @@ class FromModelController {
|
|
|
1261
1241
|
} ]);
|
|
1262
1242
|
}
|
|
1263
1243
|
if (method === "GET" && normalizedPath === pkPath) {
|
|
1264
|
-
return FromModelController.createRegistration("read",
|
|
1265
|
-
decorator: DecafParams(apiProperties),
|
|
1266
|
-
index: 0
|
|
1267
|
-
} ]);
|
|
1244
|
+
return FromModelController.createRegistration("read", handler, FromModelController.readDecorators(ModelConstr, modelClazzName, apiProperties, pkPath), FromModelController.routeParamDecorators(normalizedPath));
|
|
1268
1245
|
}
|
|
1269
1246
|
if (method === "PUT" && normalizedPath === pkPath) {
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
index: 0
|
|
1273
|
-
}, {
|
|
1247
|
+
const routeParams = FromModelController.routeParamDecorators(normalizedPath);
|
|
1248
|
+
return FromModelController.createRegistration("update", handler, FromModelController.updateDecorators(ModelConstr, modelClazzName, apiProperties, pkPath), [ {
|
|
1274
1249
|
decorator: DecafBody(),
|
|
1275
|
-
index:
|
|
1276
|
-
}, {
|
|
1277
|
-
decorator:
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
index: 2
|
|
1281
|
-
} ]);
|
|
1250
|
+
index: 0
|
|
1251
|
+
}, ...routeParams.map(({decorator: decorator, index: index}) => ({
|
|
1252
|
+
decorator: decorator,
|
|
1253
|
+
index: index + 1
|
|
1254
|
+
})) ]);
|
|
1282
1255
|
}
|
|
1283
1256
|
if (method === "DELETE" && normalizedPath === pkPath) {
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
index: 0
|
|
1287
|
-
}, {
|
|
1288
|
-
decorator: Response({
|
|
1289
|
-
passthrough: true
|
|
1290
|
-
}),
|
|
1291
|
-
index: 1
|
|
1292
|
-
} ]);
|
|
1257
|
+
const routeParams = FromModelController.routeParamDecorators(normalizedPath);
|
|
1258
|
+
return FromModelController.createRegistration("delete", handler, FromModelController.deleteDecorators(ModelConstr, modelClazzName, apiProperties, pkPath), routeParams);
|
|
1293
1259
|
}
|
|
1294
1260
|
const fallbackSegments = normalizedPath.split("/").filter(Boolean);
|
|
1295
1261
|
const isAllParams = fallbackSegments.length > 0 && fallbackSegments.every(s => s.startsWith(":"));
|
|
@@ -1301,40 +1267,25 @@ class FromModelController {
|
|
|
1301
1267
|
type: String
|
|
1302
1268
|
}));
|
|
1303
1269
|
const suffix = fallbackSegments.map(s => s.slice(1)).join("And");
|
|
1270
|
+
const routeParams = FromModelController.routeParamDecorators(normalizedPath);
|
|
1304
1271
|
if (method === "GET") {
|
|
1305
|
-
return FromModelController.createRegistration(`readBy${suffix}`,
|
|
1306
|
-
decorator: DecafParams(fallbackApiProps),
|
|
1307
|
-
index: 0
|
|
1308
|
-
} ]);
|
|
1272
|
+
return FromModelController.createRegistration(`readBy${suffix}`, handler, FromModelController.readDecorators(ModelConstr, modelClazzName, fallbackApiProps, normalizedPath), routeParams);
|
|
1309
1273
|
}
|
|
1310
1274
|
if (method === "PUT") {
|
|
1311
|
-
return FromModelController.createRegistration(`updateBy${suffix}`,
|
|
1312
|
-
decorator: DecafParams(fallbackApiProps),
|
|
1313
|
-
index: 0
|
|
1314
|
-
}, {
|
|
1275
|
+
return FromModelController.createRegistration(`updateBy${suffix}`, handler, FromModelController.updateDecorators(ModelConstr, modelClazzName, fallbackApiProps, normalizedPath), [ {
|
|
1315
1276
|
decorator: DecafBody(),
|
|
1316
|
-
index:
|
|
1317
|
-
}, {
|
|
1318
|
-
decorator:
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
index: 2
|
|
1322
|
-
} ]);
|
|
1277
|
+
index: 0
|
|
1278
|
+
}, ...routeParams.map(({decorator: decorator, index: index}) => ({
|
|
1279
|
+
decorator: decorator,
|
|
1280
|
+
index: index + 1
|
|
1281
|
+
})) ]);
|
|
1323
1282
|
}
|
|
1324
1283
|
if (method === "DELETE") {
|
|
1325
|
-
return FromModelController.createRegistration(`deleteBy${suffix}`,
|
|
1326
|
-
decorator: DecafParams(fallbackApiProps),
|
|
1327
|
-
index: 0
|
|
1328
|
-
}, {
|
|
1329
|
-
decorator: Response({
|
|
1330
|
-
passthrough: true
|
|
1331
|
-
}),
|
|
1332
|
-
index: 1
|
|
1333
|
-
} ]);
|
|
1284
|
+
return FromModelController.createRegistration(`deleteBy${suffix}`, handler, FromModelController.deleteDecorators(ModelConstr, modelClazzName, fallbackApiProps, normalizedPath), routeParams);
|
|
1334
1285
|
}
|
|
1335
1286
|
}
|
|
1336
1287
|
if (method === "GET" && normalizedPath === "statement/:method/*args") {
|
|
1337
|
-
return FromModelController.createRegistration("statement",
|
|
1288
|
+
return FromModelController.createRegistration("statement", handler, FromModelController.statementDecorators(ModelConstr, modelClazzName), [ {
|
|
1338
1289
|
decorator: Param("method"),
|
|
1339
1290
|
index: 0
|
|
1340
1291
|
}, {
|
|
@@ -1345,6 +1296,9 @@ class FromModelController {
|
|
|
1345
1296
|
index: 2
|
|
1346
1297
|
} ]);
|
|
1347
1298
|
}
|
|
1299
|
+
if (method === "GET" && normalizedPath === "findOneBy/:key/:value") {
|
|
1300
|
+
return FromModelController.createRegistration("findOneBy", handler, FromModelController.statementShortcutDecorators(ModelConstr, modelClazzName, normalizedPath, PreparedStatementKeys.FIND_ONE_BY), FromModelController.statementShortcutParams(normalizedPath));
|
|
1301
|
+
}
|
|
1348
1302
|
const statementRoutes = {
|
|
1349
1303
|
"listBy/:key": PreparedStatementKeys.LIST_BY,
|
|
1350
1304
|
"paginateBy/:key/:page": PreparedStatementKeys.PAGE_BY,
|
|
@@ -1362,32 +1316,28 @@ class FromModelController {
|
|
|
1362
1316
|
};
|
|
1363
1317
|
const statementKey = statementRoutes[normalizedPath];
|
|
1364
1318
|
if (statementKey && method === "GET") {
|
|
1365
|
-
return FromModelController.createRegistration(FromModelController.statementMethodName(normalizedPath),
|
|
1319
|
+
return FromModelController.createRegistration(FromModelController.statementMethodName(normalizedPath), handler, FromModelController.statementShortcutDecorators(ModelConstr, modelClazzName, normalizedPath, statementKey), FromModelController.statementShortcutParams(normalizedPath));
|
|
1366
1320
|
}
|
|
1367
1321
|
if (method === "GET" && normalizedPath.startsWith("query/")) {
|
|
1368
1322
|
const queryMethod = normalizedPath.replace(/^query\//, "").split("/")[0];
|
|
1369
|
-
return FromModelController.createRegistration(queryMethod,
|
|
1323
|
+
return FromModelController.createRegistration(queryMethod, handler, FromModelController.getQueryDecorators(queryMethod, normalizedPath, "GET", true), FromModelController.complexQueryParams(normalizedPath));
|
|
1370
1324
|
}
|
|
1371
1325
|
const pathSegments = normalizedPath.split("/").filter(Boolean);
|
|
1372
1326
|
const knownPrefixes = new Set([ "listBy", "findBy", "findByPaginate", "findOneBy", "paginateBy", "find", "page", "countOf", "maxOf", "minOf", "avgOf", "sumOf", "distinctOf", "groupOf", "statement", "bulk", "query" ]);
|
|
1373
|
-
if (pathSegments.length > 0 && !normalizedPath.startsWith("query/") && !knownPrefixes.has(pathSegments[0])) {
|
|
1374
|
-
const
|
|
1375
|
-
const matchedEntry = Object.entries(routeMetadata).find(([, info]) => info && typeof info === "object" && info.path?.replace(/^\/+|\/+$/g, "") === normalizedPath);
|
|
1376
|
-
const actualMethodName = matchedEntry?.[0] || pathSegments[0];
|
|
1377
|
-
const paramSegments = pathSegments.filter(s => s.startsWith(":"));
|
|
1378
|
-
const apiPathParams = paramSegments.map(s => s.slice(1)).map(name => ({
|
|
1327
|
+
if (pathSegments.length > 0 && !normalizedPath.startsWith("query/") && !normalizedPath.startsWith("statement/") && !knownPrefixes.has(pathSegments[0])) {
|
|
1328
|
+
const apiPathParams = pathSegments.filter(s => s.startsWith(":")).map(s => s.slice(1)).map(name => ({
|
|
1379
1329
|
name: name,
|
|
1380
1330
|
description: `${name} parameter for the query`,
|
|
1381
1331
|
required: true,
|
|
1382
1332
|
type: String
|
|
1383
1333
|
}));
|
|
1384
|
-
return FromModelController.createRegistration(
|
|
1385
|
-
summary: `Retrieve records using "${
|
|
1334
|
+
return FromModelController.createRegistration(methodName, handler, [ ...apiPathParams.map(p => ApiParam(p)), ApiOperation({
|
|
1335
|
+
summary: `Retrieve records using "${methodName}".`
|
|
1386
1336
|
}), ApiOkResponse({
|
|
1387
1337
|
description: "Result successfully retrieved."
|
|
1388
1338
|
}), ApiNoContentResponse({
|
|
1389
1339
|
description: "No content returned by the method."
|
|
1390
|
-
}) ], FromModelController.
|
|
1340
|
+
}) ], FromModelController.routeParamDecorators(normalizedPath));
|
|
1391
1341
|
}
|
|
1392
1342
|
return undefined;
|
|
1393
1343
|
}
|
|
@@ -1448,7 +1398,7 @@ class FromModelController {
|
|
|
1448
1398
|
created = await this.persistence(ctx).create(data, ctx);
|
|
1449
1399
|
} catch (e) {
|
|
1450
1400
|
log.error(`Failed to create new ${modelClazzName}`, e);
|
|
1451
|
-
throw e;
|
|
1401
|
+
throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
|
|
1452
1402
|
}
|
|
1453
1403
|
log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
|
|
1454
1404
|
if (resp) ctx.toResponse(resp);
|
|
@@ -1464,7 +1414,7 @@ class FromModelController {
|
|
|
1464
1414
|
created = await this.persistence(ctx).createAll(data.map(d => new ModelConstr(d)), ctx);
|
|
1465
1415
|
} catch (e) {
|
|
1466
1416
|
log.error(`Failed to create new ${modelClazzName}`, e);
|
|
1467
|
-
throw e;
|
|
1417
|
+
throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
|
|
1468
1418
|
}
|
|
1469
1419
|
log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
|
|
1470
1420
|
if (resp) ctx.toResponse(resp);
|
|
@@ -1481,7 +1431,7 @@ class FromModelController {
|
|
|
1481
1431
|
read = await this.persistence(ctx).readAll(normalizedIds, ctx);
|
|
1482
1432
|
} catch (e) {
|
|
1483
1433
|
log.error(`Failed to read ${modelClazzName}`, e);
|
|
1484
|
-
throw e;
|
|
1434
|
+
throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName}`);
|
|
1485
1435
|
}
|
|
1486
1436
|
log.info(`read ${read.length} ${modelClazzName}`);
|
|
1487
1437
|
return read;
|
|
@@ -1496,7 +1446,7 @@ class FromModelController {
|
|
|
1496
1446
|
updated = await this.persistence(ctx).updateAll(body, ctx);
|
|
1497
1447
|
} catch (e) {
|
|
1498
1448
|
log.error(e);
|
|
1499
|
-
throw e;
|
|
1449
|
+
throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName}`);
|
|
1500
1450
|
}
|
|
1501
1451
|
if (resp) ctx.toResponse(resp);
|
|
1502
1452
|
return updated;
|
|
@@ -1512,7 +1462,7 @@ class FromModelController {
|
|
|
1512
1462
|
read = await this.persistence(ctx).deleteAll(normalizedIds, ctx);
|
|
1513
1463
|
} catch (e) {
|
|
1514
1464
|
log.error(`Failed to delete ${modelClazzName}`, e);
|
|
1515
|
-
throw e;
|
|
1465
|
+
throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName}`);
|
|
1516
1466
|
}
|
|
1517
1467
|
log.info(`deleted ${read.length} ${modelClazzName}`);
|
|
1518
1468
|
if (resp) ctx.toResponse(resp);
|
|
@@ -1530,7 +1480,7 @@ class FromModelController {
|
|
|
1530
1480
|
readResult = await this.persistence(ctx).read(id, ctx);
|
|
1531
1481
|
} catch (e) {
|
|
1532
1482
|
log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
|
|
1533
|
-
throw e;
|
|
1483
|
+
throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName} with id ${id}`);
|
|
1534
1484
|
}
|
|
1535
1485
|
log.info(`read ${modelClazzName} with id ${readResult[this.pk]}`);
|
|
1536
1486
|
return readResult;
|
|
@@ -1551,7 +1501,7 @@ class FromModelController {
|
|
|
1551
1501
|
}), ctx);
|
|
1552
1502
|
} catch (e) {
|
|
1553
1503
|
log.error(e);
|
|
1554
|
-
throw e;
|
|
1504
|
+
throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName} with id ${id}`);
|
|
1555
1505
|
}
|
|
1556
1506
|
if (resp) ctx.toResponse(resp);
|
|
1557
1507
|
return updated;
|
|
@@ -1568,7 +1518,7 @@ class FromModelController {
|
|
|
1568
1518
|
del = await this.persistence(ctx).delete(id, ctx);
|
|
1569
1519
|
} catch (e) {
|
|
1570
1520
|
log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
|
|
1571
|
-
throw e;
|
|
1521
|
+
throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName} with id ${id}`);
|
|
1572
1522
|
}
|
|
1573
1523
|
log.info(`deleted ${modelClazzName} with id ${id}`);
|
|
1574
1524
|
if (resp) ctx.toResponse(resp);
|
|
@@ -1676,7 +1626,7 @@ class FromModelController {
|
|
|
1676
1626
|
const [field] = args;
|
|
1677
1627
|
return this.persistence(ctx).statement(statementKey, field, ctx);
|
|
1678
1628
|
}
|
|
1679
|
-
throw new
|
|
1629
|
+
throw new InternalError(`Unknown statement: ${statementKey}`);
|
|
1680
1630
|
}
|
|
1681
1631
|
};
|
|
1682
1632
|
}
|
|
@@ -1687,17 +1637,23 @@ class FromModelController {
|
|
|
1687
1637
|
if (log) log.debug(`Invoking custom query "${methodName}"`);
|
|
1688
1638
|
const {ctx: ctx} = (await this.logCtx([], methodName, true)).for(complexQuery);
|
|
1689
1639
|
const persistence = this.persistence(ctx);
|
|
1690
|
-
const spreadArgs = FromModelController.
|
|
1640
|
+
const spreadArgs = FromModelController.normalizeQueryArgs(args);
|
|
1641
|
+
if (persistence?.repo && typeof persistence.repo[methodName] === "function") {
|
|
1642
|
+
return persistence.repo[methodName](...spreadArgs);
|
|
1643
|
+
}
|
|
1691
1644
|
if (typeof persistence[methodName] === "function") {
|
|
1692
|
-
return persistence[methodName](...spreadArgs
|
|
1645
|
+
return persistence[methodName](...spreadArgs);
|
|
1646
|
+
}
|
|
1647
|
+
if (persistence?.query && typeof persistence.query === "function") {
|
|
1648
|
+
return persistence.query(methodName, ...spreadArgs);
|
|
1693
1649
|
}
|
|
1694
1650
|
if (typeof persistence.statement === "function") {
|
|
1695
1651
|
return persistence.statement(methodName, ...spreadArgs, ctx);
|
|
1696
1652
|
}
|
|
1697
|
-
throw new
|
|
1653
|
+
throw new InternalError(`Persistence method "${methodName}" not found on ${persistence?.constructor?.name}`);
|
|
1698
1654
|
} catch (e) {
|
|
1699
1655
|
if (log) log.error(`Custom query "${methodName}" failed`, e);
|
|
1700
|
-
throw e;
|
|
1656
|
+
throw FromModelController.toDecafError(e, `Custom query "${methodName}" failed`);
|
|
1701
1657
|
}
|
|
1702
1658
|
};
|
|
1703
1659
|
}
|
|
@@ -1706,17 +1662,17 @@ class FromModelController {
|
|
|
1706
1662
|
const log = this.log?.for?.(customRoute);
|
|
1707
1663
|
const {ctx: ctx} = (await this.logCtx([], methodName, true)).for(customRoute);
|
|
1708
1664
|
const persistence = this.persistence(ctx);
|
|
1709
|
-
const spreadArgs = FromModelController.
|
|
1710
|
-
if (typeof persistence[methodName] === "function") {
|
|
1711
|
-
return persistence[methodName](...spreadArgs, ctx);
|
|
1712
|
-
}
|
|
1665
|
+
const spreadArgs = FromModelController.normalizeQueryArgs(args);
|
|
1713
1666
|
if (persistence?.repo && typeof persistence.repo[methodName] === "function") {
|
|
1714
|
-
return persistence.repo[methodName](...spreadArgs
|
|
1667
|
+
return persistence.repo[methodName](...spreadArgs);
|
|
1668
|
+
}
|
|
1669
|
+
if (typeof persistence[methodName] === "function") {
|
|
1670
|
+
return persistence[methodName](...spreadArgs);
|
|
1715
1671
|
}
|
|
1716
1672
|
if (typeof persistence.statement === "function") {
|
|
1717
1673
|
return persistence.statement(methodName, ...spreadArgs, ctx);
|
|
1718
1674
|
}
|
|
1719
|
-
throw new
|
|
1675
|
+
throw new InternalError(`Method "${methodName}" not found on ${persistence?.constructor?.name} or its repo`);
|
|
1720
1676
|
};
|
|
1721
1677
|
}
|
|
1722
1678
|
static extractQueryArgs(args) {
|
|
@@ -1736,6 +1692,26 @@ class FromModelController {
|
|
|
1736
1692
|
}
|
|
1737
1693
|
return args;
|
|
1738
1694
|
}
|
|
1695
|
+
static normalizeQueryArgs(args) {
|
|
1696
|
+
const normalized = FromModelController.extractQueryArgs(args);
|
|
1697
|
+
if (normalized.length === 0) return normalized;
|
|
1698
|
+
const last = normalized[normalized.length - 1];
|
|
1699
|
+
if (!last || typeof last !== "object" || Array.isArray(last)) {
|
|
1700
|
+
return normalized;
|
|
1701
|
+
}
|
|
1702
|
+
const queryObj = last;
|
|
1703
|
+
const hasQueryFields = queryObj.direction !== undefined || queryObj.limit !== undefined || queryObj.offset !== undefined || queryObj.bookmark !== undefined;
|
|
1704
|
+
if (!hasQueryFields) {
|
|
1705
|
+
normalized.pop();
|
|
1706
|
+
return normalized;
|
|
1707
|
+
}
|
|
1708
|
+
normalized.pop();
|
|
1709
|
+
if (queryObj.direction !== undefined) normalized.push(queryObj.direction);
|
|
1710
|
+
if (queryObj.limit !== undefined) normalized.push(queryObj.limit);
|
|
1711
|
+
if (queryObj.offset !== undefined) normalized.push(queryObj.offset);
|
|
1712
|
+
if (queryObj.bookmark !== undefined) normalized.push(queryObj.bookmark);
|
|
1713
|
+
return normalized;
|
|
1714
|
+
}
|
|
1739
1715
|
static createCreateDecorators(ModelConstr, modelClazzName) {
|
|
1740
1716
|
return [ ApiOperationFromModel(ModelConstr, "POST"), ApiOperation({
|
|
1741
1717
|
summary: `Create a new ${modelClazzName}.`
|
|
@@ -2026,6 +2002,7 @@ function getModuleFor(flavour) {
|
|
|
2026
2002
|
const log = this.log.for(this.forRoot);
|
|
2027
2003
|
log.info(`Generating controllers for flavour...`);
|
|
2028
2004
|
const trackedModels = Adapter.models(flavour).filter(model => this.isExposed(model, options.controllerExposure));
|
|
2005
|
+
for (const model of trackedModels) ModelService.forModel(model);
|
|
2029
2006
|
let modelServices = [];
|
|
2030
2007
|
if (options.autoServices) {
|
|
2031
2008
|
log.info("Auto-services enabled. Initializing service generation.");
|
|
@@ -2403,6 +2380,56 @@ class NestBootstraper {
|
|
|
2403
2380
|
}
|
|
2404
2381
|
}
|
|
2405
2382
|
|
|
2383
|
+
var DecafRequestHandlerInterceptor_1;
|
|
2384
|
+
|
|
2385
|
+
let DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
|
|
2386
|
+
constructor(requestContext, executor) {
|
|
2387
|
+
this.requestContext = requestContext;
|
|
2388
|
+
this.executor = executor;
|
|
2389
|
+
}
|
|
2390
|
+
async contextualize(req) {
|
|
2391
|
+
const headers = req.headers;
|
|
2392
|
+
const flags = {
|
|
2393
|
+
headers: headers,
|
|
2394
|
+
overrides: {}
|
|
2395
|
+
};
|
|
2396
|
+
const ip = extractIp(req);
|
|
2397
|
+
const logger = Logging.get().for({
|
|
2398
|
+
ip: ip
|
|
2399
|
+
});
|
|
2400
|
+
this.requestContext.accumulate(Object.assign({}, DefaultAdapterFlags, {
|
|
2401
|
+
logger: logger,
|
|
2402
|
+
timestamp: new Date,
|
|
2403
|
+
operation: `${req.method} ${req.url}`
|
|
2404
|
+
}, flags));
|
|
2405
|
+
}
|
|
2406
|
+
async intercept(context, next) {
|
|
2407
|
+
const req = context.switchToHttp().getRequest();
|
|
2408
|
+
const res = context.switchToHttp().getResponse();
|
|
2409
|
+
const log = Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
|
|
2410
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
|
|
2411
|
+
await this.contextualize(req);
|
|
2412
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
|
|
2413
|
+
await this.executor.exec(req, res);
|
|
2414
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
|
|
2415
|
+
return next.handle();
|
|
2416
|
+
}
|
|
2417
|
+
};
|
|
2418
|
+
|
|
2419
|
+
DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = __decorate([ Injectable({
|
|
2420
|
+
scope: Scope.REQUEST
|
|
2421
|
+
}), __metadata("design:paramtypes", [ DecafRequestContext, DecafHandlerExecutor ]) ], DecafRequestHandlerInterceptor);
|
|
2422
|
+
|
|
2423
|
+
function extractIp(req) {
|
|
2424
|
+
const headers = req.headers;
|
|
2425
|
+
function parseIpHeader(value) {
|
|
2426
|
+
if (!value) return undefined;
|
|
2427
|
+
const candidate = Array.isArray(value) ? value[0] : value;
|
|
2428
|
+
return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
|
|
2429
|
+
}
|
|
2430
|
+
return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2406
2433
|
const pendingProviders = new Map;
|
|
2407
2434
|
|
|
2408
2435
|
function getRegisteredDecafProviders() {
|
|
@@ -2437,7 +2464,7 @@ function Service(key) {
|
|
|
2437
2464
|
resolved = paramTypes[parameterIndex];
|
|
2438
2465
|
}
|
|
2439
2466
|
if (typeof resolved === "undefined") {
|
|
2440
|
-
throw new
|
|
2467
|
+
throw new InternalError(`@Service() could not determine an injection type for parameter ${parameterIndex} of ${target.name}. Provide an explicit argument, e.g. @Service(SomeService).`);
|
|
2441
2468
|
}
|
|
2442
2469
|
const asModel = typeof resolved !== "string" && isModelConstructor(resolved);
|
|
2443
2470
|
const token = asModel ? modelServiceToken(resolved) : injectableServiceKey(resolved);
|
|
@@ -2738,11 +2765,11 @@ function repoForModel(model) {
|
|
|
2738
2765
|
return repo;
|
|
2739
2766
|
}
|
|
2740
2767
|
|
|
2741
|
-
const VERSION = "0.11.2-refactor.
|
|
2768
|
+
const VERSION = "0.11.2-refactor.4";
|
|
2742
2769
|
|
|
2743
|
-
const COMMIT = "
|
|
2770
|
+
const COMMIT = "55b8f3e";
|
|
2744
2771
|
|
|
2745
|
-
const FULL_VERSION = "0.11.2-refactor.
|
|
2772
|
+
const FULL_VERSION = "0.11.2-refactor.4-55b8f3e";
|
|
2746
2773
|
|
|
2747
2774
|
const PACKAGE_NAME = "@decaf-ts/for-nest";
|
|
2748
2775
|
|
|
@@ -2753,4 +2780,4 @@ Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
|
2753
2780
|
Metadata.allowReregistration(false);
|
|
2754
2781
|
|
|
2755
2782
|
export { AUTH_HANDLER, AUTH_META_KEY, ApiOperationFromModel, ApiParamsFromModel, ApiProperty, Auth, AuthInterceptor, BulkApiOperationFromModel, COMMIT, CorsError, DECAF_ADAPTER_ID, DECAF_CONTEXT_KEY, DECAF_CONTROLLER_CONFIG, DECAF_EXPOSE, DECAF_HANDLERS, DECAF_MODULE_OPTIONS, DECAF_ROUTE, DECAF_TASK_SERVICE_ID, DECORATORS, DECORATORS_PREFIX, DecafAuthHandler, DecafAuthModule, DecafBody, DecafController, DecafCoreModule, DecafExceptionFilter, DecafHandlerExecutor, DecafModelController, DecafModule, DecafParams, DecafRequestContext, DecafRequestHandlerInterceptor, DecafResponseInterceptor, DecafRoleAuthHandler, DecafStreamModule, DtoFor, EventsController, FULL_VERSION, FromModelController, IS_PUBLIC_KEY, NestBootstraper, PACKAGE_NAME, Public, REQUIRED_ROLES_KEY, Repository, RequireRoles, SKIP_MODEL_ROLES_KEY, Service, SwaggerBuilder, UseDecafFilter, UseDecafHeaders, VERSION, applyApiDecorators, controllerConfig, createApiPropertyDecorator, createPropertyDecorator, createRouteHandler, defineRouteMethod, expose, getApiDecorators, getEnumType, getEnumValues, getModuleFor, getRegisteredDecafProviders, isUndefined, repoForModel, resolvePersistenceMethod, runMigrations };
|
|
2756
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9Gcm9tTW9kZWxDb250cm9sbGVyLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0RlY2FmTW9kZWxNb2R1bGUudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy9jb3JzLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL3Rocm90dGxpbmcudHMiLCIuLi9zcmMvZmFjdG9yeS9leGNlcHRpb25zL0RlY2FmRXJyb3JGaWx0ZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9leGNlcHRpb25zL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL2NvbnN0YW50cy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckN1c3RvbVVJLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQnVpbGRlci50cyIsIi4uL3NyYy9mYWN0b3J5L05lc3RCb290c3RyYXBlci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1RhcmdldChcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8QyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHg+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgQVVUSF9IQU5ETEVSLCBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVksIFNLSVBfTU9ERUxfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXCJvcmdhbml6YXRpb25cIiBhcyBhbnkpO1xuICAgIGlmICh1c2VyIHx8IG9yZ2FuaXphdGlvbikge1xuICAgICAgY29uc3QgY3VycmVudExvZyA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0KFwibG9nZ2VyXCIgYXMgYW55KTtcbiAgICAgIGNvbnN0IGNoaWxkTG9nID0gY3VycmVudExvZy5mb3IoeyB1c2VyLCBvcmdhbml6YXRpb24gfSk7XG4gICAgICB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoeyBsb2dnZXI6IGNoaWxkTG9nIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhcHBseVRyYW5zZm9ybWVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmbGF2b3VycyA9IEFkYXB0ZXIuZmxhdm91cnNUb1RyYW5zZm9ybSgpO1xuICAgIGlmICghZmxhdm91cnMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZmxhdm91ciBvZiBmbGF2b3Vycykge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBBZGFwdGVyLnRyYW5zZm9ybWVyRm9yKFxuICAgICAgICBmbGF2b3VyXG4gICAgICApIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+O1xuICAgICAgaWYgKCF0cmFuc2Zvcm1lcikgY29udGludWU7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgdHJhbnNmb3JtZXIuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5zdXBwb3J0ZWQgSFRUUCB2ZXJiIFwiJHt2ZXJifVwiLiBObyBOZXN0SlMgZGVjb3JhdG9yIG1hcHBpbmcgd2FzIGZvdW5kLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cbiIsImltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IHR5cGUgRGVjb3JhdG9yQnVuZGxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgRGVjYWZBcGlQcm9wZXJ0eSxcbiAgdHlwZSBEZWNhZlBhcmFtUHJvcHMsXG4gIERlY2FmUGFyYW1zLFxufSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBSZXBvLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlEZWNvcmF0b3JzKFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIHJvdXRlUGF0aDogc3RyaW5nLFxuICBodHRwVmVyYjogSHR0cFZlcmJzLFxuICBpbmNsdWRlUXVlcnlQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZVxuKTogRGVjb3JhdG9yQnVuZGxlIHtcbiAgY29uc3QgTmVzdEh0dHBSb3V0ZURlYyA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoaHR0cFZlcmIpO1xuICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoYXBpUGFyYW1TcGVjKTtcblxuICBjb25zdCBzd2FnZ2VyUXVlcnlQYXJhbXMgPSBbXTtcbiAgaWYgKGh0dHBWZXJiID09PSBcIkdFVFwiICYmIGluY2x1ZGVRdWVyeVBhcmFtcykge1xuICAgIHN3YWdnZXJRdWVyeVBhcmFtcy5wdXNoKFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IFtcbiAgICAgIE5lc3RIdHRwUm91dGVEZWMocm91dGVQYXRoKSxcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKEFwaVBhcmFtKSxcbiAgICAgIC4uLnN3YWdnZXJRdWVyeVBhcmFtcyxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIGFjY29yZGluZyB0byBcIiR7bWV0aG9kTmFtZX1cIi5gLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLmAsXG4gICAgICB9KSxcbiAgICBdLFxuICAgIHBhcmFtczogW0RlY2FmUGFyYW1zKGFwaVBhdGhQYXJhbXMpLCBRdWVyeSgpXSwgLy8gLCBEZWNhZkJvZHkoKV0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFwaURlY29yYXRvcnMoXG4gIHRhcmdldDogYW55LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcbiAgZGVjb3JhdG9yczogRGVjb3JhdG9yQnVuZGxlXG4pIHtcbiAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gIGRlY29yYXRvcnMubWV0aG9kLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgZGVjb3JhdG9ycy5wYXJhbXM/LmZvckVhY2goKGQsIGluZGV4KSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBhbnkge1xuICBpZiAocGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UpIHtcbiAgICByZXR1cm4gdHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIDogcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJvdXRlTWV0aG9kKFxuICBDb250cm9sbGVyQ2xhc3M6IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgIENvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUgfHwgQ29udHJvbGxlckNsYXNzLFxuICAgIG1ldGhvZE5hbWUsXG4gICAge1xuICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgIENvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUgfHwgQ29udHJvbGxlckNsYXNzLFxuICAgIG1ldGhvZE5hbWVcbiAgKTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIsIEF1dGhEYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbi8qKlxuICogU2ltcGxlIGF1dGggaGFuZGxlciB0aGF0IHJlYWRzIGEgcm9sZSBzdHJpbmcgZnJvbSB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8cm9sZT5gIGhlYWRlci5cbiAqXG4gKiBPbmx5IG92ZXJyaWRlcyB7QGxpbmsgQXV0aEhhbmRsZXIuZXh0cmFjdEZyb21BdXRofSB0byByZXR1cm4gdGhlIGJlYXJlciB0b2tlbiBhc1xuICogYm90aCB0aGUgdXNlciBpZGVudGlmaWVyIGFuZCB0aGUgc2luZ2xlIHJvbGUuIFRoZSBiYXNlIGNsYXNzIGBiaW5kVG9Db250ZXh0YFxuICogKGBjdHguYWNjdW11bGF0ZShkYXRhKWApIGlzIHN1ZmZpY2llbnQg4oCUIHRoZSB0cmFuc2Zvcm1lci9hZGFwdGVyIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgbWFwcGluZyBjb250ZXh0IGZpZWxkcyB0byBhZGFwdGVyLXNwZWNpZmljIGtleXMgbGlrZSBgVVVJRGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhIYW5kbGVyIGV4dGVuZHMgQXV0aEhhbmRsZXI8XG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIERlY2FmUmVxdWVzdENvbnRleHQsXG4gIEF1dGhEYXRhXG4+IHtcbiAgcHJvdGVjdGVkIHBhcnNlUmVxdWVzdChyZXE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlclJvbGUgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdChcIiBcIilbMV0gYXMgc3RyaW5nO1xuICAgIHJldHVybiB1c2VyUm9sZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHRyYWN0RnJvbUF1dGgoY3R4OiBFeGVjdXRpb25Db250ZXh0KTogQXV0aERhdGEge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgdXNlclJvbGUgPSB0aGlzLnBhcnNlUmVxdWVzdChyZXEpO1xuICAgIGlmICghdXNlclJvbGUpIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXCJVbmF1dGhlbnRpY2F0ZWRcIik7XG4gICAgcmV0dXJuIHsgdXNlcjogdXNlclJvbGUsIHJvbGVzOiBbdXNlclJvbGVdIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIERlY2FmQXV0aEhhbmRsZXJ9IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKiBUaGUgXCJyb2xlXCIgdmFyaWFudCBwcmV2aW91c2x5IHJldHVybmVkIHJvbGVzIGZyb20gYGF1dGhvcml6ZWA7IHdpdGggdGhlIGJhc2VcbiAqIGNsYXNzIG5vdyBvcmNoZXN0cmF0aW5nIHJvbGUgY2hlY2tzIGludGVybmFsbHksIHRoZSB0d28gY2xhc3NlcyBhcmUgZXF1aXZhbGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmUm9sZUF1dGhIYW5kbGVyIGV4dGVuZHMgRGVjYWZBdXRoSGFuZGxlciB7fVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciwgQ29udGV4dE9mLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbihBZGFwdGVyIGFzIGFueSkudHJhbnNmb3JtZXJGb3IgPSBmdW5jdGlvbiB0b0NvbnRleHRGbGFnczxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pixcbj4oYWRhcHRlcjogQSB8IHN0cmluZyk6IENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxDb250ZXh0T2Y8QT4+PiB7XG4gIGNvbnN0IGFsaWFzID1cbiAgICB0eXBlb2YgYWRhcHRlciA9PT0gXCJzdHJpbmdcIiA/IGFkYXB0ZXIgOiAoYWRhcHRlci5hbGlhcyBhcyBzdHJpbmcpO1xuICByZXR1cm4gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpLCBhbGlhcyk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihBZGFwdGVyIGFzIGFueSkuZmxhdm91cnNUb1RyYW5zZm9ybSA9IGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2Zvcm1lcnMoKTpcbiAgfCBzdHJpbmdbXVxuICB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIikpO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKENvbnRleHQgYXMgYW55KS5wcm90b3R5cGUudG9SZXNwb25zZSA9IGZ1bmN0aW9uIHRvUmVzcG9uc2U8XG4gIFJFUyBleHRlbmRzIHsgaGVhZGVyOiBhbnkgfSxcbj4odGhpczogQ29udGV4dCwgcmVzOiBSRVMpOiBSRVMge1xuICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nKCk7XG4gIGlmIChwZW5kaW5nKSByZXMuaGVhZGVyKFwieC1wZW5kaW5nLXRhc2tcIiwgSlNPTi5zdHJpbmdpZnkocGVuZGluZykpO1xuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsQnVpbGRlciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi4vZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy9kZWNvcmF0b3JzXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgQXV0aChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgZGVjb3JhdGVDbGFzcyhkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIEF1dGg6IChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUuQXV0aCA9IGZ1bmN0aW9uIChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhBdXRoKG1vZGVsKSk7XG59O1xuXG5pZiAoIShwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCkge1xuICBjb25zdCBvcmlnaW5hbEJ1aWxkID0gcHJvdG90eXBlLmJ1aWxkO1xuICBwcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG9yaWdpbmFsQnVpbGQuY2FsbCh0aGlzKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzO1xuICAgIGlmIChkZWNvcmF0b3JzPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHJlc3VsdCBhcyBhbnkpIGFzIHR5cGVvZiByZXN1bHQgfCB2b2lkO1xuICAgICAgICBpZiAoZGVjb3JhdGVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZGVjb3JhdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIChwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCA9IHRydWU7XG59XG4iLCJpbXBvcnQge1xuICBDYWxsSGFuZGxlcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBEZWZhdWx0QWRhcHRlckZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckZsYWdzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnRlcmNlcHRvciByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIGFsbCByZWdpc3RlcmVkIERlY2FmIHJlcXVlc3QgaGFuZGxlcnNcbiAqIGJlZm9yZSB0aGUgY29udHJvbGxlciBtZXRob2QgaXMgaW52b2tlZC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3J9IGludGVncmF0ZXMgdGhlIERlY2FmIHJlcXVlc3QtaGFuZGxpbmcgcGlwZWxpbmVcbiAqIGludG8gTmVzdEpTJyBpbnRlcmNlcHRvciBtZWNoYW5pc20uIEJlZm9yZSBwYXNzaW5nIGV4ZWN1dGlvbiB0byB0aGUgbmV4dCBoYW5kbGVyIGluIHRoZVxuICogTmVzdEpTIGNoYWluLCBpdCBkZWxlZ2F0ZXMgcmVxdWVzdCBwcm9jZXNzaW5nIHRvIHRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9LCB3aGljaFxuICogc2VxdWVudGlhbGx5IHJ1bnMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcy4gVGhpcyBhbGxvd3NcbiAqIGJlaGF2aW9ycyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBsb2dnaW5nLCB0ZW5hbnQgcmVzb2x1dGlvbiwgb3IgbWV0YWRhdGEgZW5yaWNobWVudFxuICogdG8gb2NjdXIgcHJpb3IgdG8gY29udHJvbGxlciBleGVjdXRpb24uXG4gKlxuICogQGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQXBwbHkgZ2xvYmFsbHk6XG4gKiBhcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKG5ldyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IoZXhlY3V0b3IpKTtcbiAqXG4gKiAvLyBPciBpbiBhIG1vZHVsZTpcbiAqIEBNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gKiAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEludGVyY2VwdG9yXG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBDb250cm9sbGVyXG4gKlxuICogICAgIENsaWVudC0+PkludGVyY2VwdG9yOiBIVFRQIFJlcXVlc3RcbiAqICAgICBJbnRlcmNlcHRvci0+PkV4ZWN1dG9yOiBleGVjKHJlcXVlc3QpXG4gKiAgICAgRXhlY3V0b3ItLT4+SW50ZXJjZXB0b3I6IGhhbmRsZXJzIGNvbXBsZXRlZFxuICogICAgIEludGVyY2VwdG9yLT4+Q29udHJvbGxlcjogbmV4dC5oYW5kbGUoKVxuICogICAgIENvbnRyb2xsZXItLT4+Q2xpZW50OiBSZXNwb25zZVxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRvcjogRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb250ZXh0dWFsaXplKHJlcTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICAgIGNvbnN0IGZsYWdzOiBEZWNhZlNlcnZlckZsYWdzID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBpcCA9IGV4dHJhY3RJcChyZXEpO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHsgaXAgfSk7XG5cbiAgICB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgRGVmYXVsdEFkYXB0ZXJGbGFncyxcbiAgICAgICAge1xuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgb3BlcmF0aW9uOiBgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YCxcbiAgICAgICAgfSxcbiAgICAgICAgZmxhZ3NcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKSB7XG4gICAgY29uc3QgcmVxID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVzID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcikuZm9yKHRoaXMuaW50ZXJjZXB0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRleHR1YWxpemUocmVxKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gY29udGV4dHVhbGl6ZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZXhlY3V0b3IuZXhlYyhyZXEsIHJlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGV4ZWN1dG9ycyBmaW5pc2hlZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJcChyZXE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgZnVuY3Rpb24gcGFyc2VJcEhlYWRlcih2YWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilbMF07XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtZm9yd2FyZGVkLWZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtcmVhbC1pcFwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtRm9yd2FyZGVkLUZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtUmVhbC1JUFwiXSkgPz9cbiAgICByZXEuaXBcbiAgKTtcbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIH0gZnJvbSBcIi4uL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7XG4gIGdsb2JhbD86IGJvb2xlYW47XG4gIGhhbmRsZXI/OiBUeXBlPEF1dGhIYW5kbGVyPjtcbn07XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoXG4gICAgb3B0aW9uczogRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHt9XG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IHByb3ZpZGVyczogRHluYW1pY01vZHVsZVtcInByb3ZpZGVyc1wiXSA9IFtcbiAgICAgIEF1dGhJbnRlcmNlcHRvcixcbiAgICAgIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgcHJvdmlkZXJzLnB1c2gob3B0aW9ucy5oYW5kbGVyKTtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVVUSF9IQU5ETEVSLFxuICAgICAgICB1c2VDbGFzczogb3B0aW9ucy5oYW5kbGVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsKSB7XG4gICAgICAocHJvdmlkZXJzIGFzIGFueVtdKS5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICB1c2VFeGlzdGluZzogQXV0aEludGVyY2VwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZBdXRoTW9kdWxlLFxuICAgICAgZ2xvYmFsOiBvcHRpb25zLmdsb2JhbCA/PyBmYWxzZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICAgIGV4cG9ydHM6IFtBdXRoSW50ZXJjZXB0b3IsIEFVVEhfSEFORExFUl0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcbmltcG9ydCB7IHR5cGUgRGVjYWZSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfSEFORExFUlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlcn0gaW5zdGFuY2VzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LFxuICogcHJvdmlkaW5nIHRoZW0gd2l0aCBhIHNoYXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0Q29udGV4dH0uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBvcmNoZXN0cmF0aW5nIGFuZCBleGVjdXRpbmdcbiAqIGEgc2VxdWVuY2Ugb2YgcmVxdWVzdCBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIHJlY2VpdmVzIHRoZSBzYW1lIHJlcXVlc3Qtc2NvcGVkIGNvbnRleHQsXG4gKiBhbGxvd2luZyBjb29yZGluYXRlZCBwcm9jZXNzaW5nIHN1Y2ggYXMgYXV0aGVudGljYXRpb24sIG1ldGFkYXRhIGV4dHJhY3Rpb24sIGF1ZGl0aW5nLFxuICogYW5kIGN1c3RvbSBwaXBlbGluZSBiZWhhdmlvci4gSGFuZGxlcnMgYXJlIGluamVjdGVkIHZpYSB0aGUge0BsaW5rIERFQ0FGX0hBTkRMRVJTfSB0b2tlbixcbiAqIGVuc3VyaW5nIGV4dGVuc2liaWxpdHkgYW5kIGxvb3NlIGNvdXBsaW5nLlxuICpcbiAqIEBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gRXhhbXBsZSBoYW5kbGVyOlxuICogY2xhc3MgQXV0aEhhbmRsZXIgaW1wbGVtZW50cyBEZWNhZlJlcXVlc3RIYW5kbGVyIHtcbiAqICAgYXN5bmMgaGFuZGxlKGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIHJlcTogUmVxdWVzdCkge1xuICogICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcnNbXCJhdXRob3JpemF0aW9uXCJdO1xuICogICAgIGNvbnN0IHJlc3VsdCA9IE15U2VydmljZS5kb1NvbWV0aGluZyh0b2tlbik7XG4gKiAgICAgY29udGV4dC5zZXQoXCJteS1rZXlcIiwgcmVzdWx0KTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4ZWN1dG9yIHVzYWdlIGluIGEgcmVxdWVzdDpcbiAqIGF3YWl0IGV4ZWN1dG9yLmV4ZWMocmVxdWVzdCk7XG4gKiAvLyBBbGwgaGFuZGxlcnMgd2lsbCBydW4gaW4gc2VxdWVuY2VcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBFeGVjdXRvclxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJBXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckJcbiAqXG4gKiAgICAgQ2xpZW50LT4+RXhlY3V0b3I6IGV4ZWMocmVxKVxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckE6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckEtLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckI6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckItLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLS0+PkNsaWVudDogcHJvY2Vzc2luZyBmaW5pc2hlZFxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX0hBTkRMRVJTKSBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBEZWNhZlJlcXVlc3RIYW5kbGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0XG4gICkge31cblxuICBhc3luYyBleGVjKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmSGFuZGxlckV4ZWN1dG9yLm5hbWUpLmZvcih0aGlzLmV4ZWMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5jb250ZXh0LnV1aWR9IHJ1bm5pbmcgJHt0aGlzLmhhbmRsZXJzLmxlbmd0aH0gaGFuZGxlcnMgZm9yIHJlcXVlc3QgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRoaXMuY29udGV4dCwgcmVxLCByZXMpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBDYWxsSGFuZGxlcixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjdHg6IERlY2FmUmVxdWVzdENvbnRleHQpIHt9XG5cbiAgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlc3BvbnNlKCk7XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKS5waXBlKFxuICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgIHJlc3BvbnNlID0gdGhpcy5jdHgudG9SZXNwb25zZShyZXNwb25zZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgUmVxdWVzdCB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgYXMgSHR0cERlY2FmQ29udHJvbGxlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29udHJvbGxlcjxcbiAgQ09OVEVYVCBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgSHR0cERlY2FmQ29udHJvbGxlcjxSZXF1ZXN0LCBhbnksIERlY2FmUmVxdWVzdENvbnRleHQ+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmTW9kZWxDb250cm9sbGVyPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxDPiB7XG4gIHByaXZhdGUgX3BlcnNpc3RlbmNlPzogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBfbmFtZSk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxNPjtcblxuICBwZXJzaXN0ZW5jZShjdHg/OiBDb250ZXh0PGFueT4pOiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBTZXJ2aWNlLmdldDxNb2RlbFNlcnZpY2U8TT4+KHRoaXMuY2xhc3MpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBNb2RlbFNlcnZpY2UuZ2V0U2VydmljZShcbiAgICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgICApIGFzIE1vZGVsU2VydmljZTxNPjtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5jbGFzcykgYXMgUmVwbzxNPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5jbGllbnRDb250ZXh0LnRvT3ZlcnJpZGVzKCk7XG5cbiAgICByZXR1cm4gY3R4XG4gICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlIGluc3RhbmNlb2YgUmVwb3NpdG9yeVxuICAgICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlLm92ZXJyaWRlKG92ZXJyaWRlcylcbiAgICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZS5mb3Iob3ZlcnJpZGVzKVxuICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9jb25zdGFudHNcIjtcblxuY29uc3QgZHRvQ2FjaGUgPSBuZXcgTWFwPFxuICBPcGVyYXRpb25LZXlzLFxuICBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+XG4+KCk7XG5cbi8qKlxuICogQnVpbGRzIGEgTmVzdC9Td2FnZ2VyIERUTyBjbGFzcyBmb3IgdGhlIGdpdmVuIG1vZGVsIGFuZCBDUlVEIG9wZXJhdGlvbi5cbiAqXG4gKiBSdWxlczpcbiAqICAtIE9ubHkgQ1JFQVRFIGFuZCBVUERBVEUgKGFuZCB0aGVpciBidWxrIHZhcmlhbnRzKSBwcm9kdWNlIGEgRFRPO1xuICogICAgYWxsIG90aGVyIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBvcmlnaW5hbCBtb2RlbCBjbGFzcyB1bmNoYW5nZWQuXG4gKiAgLSBAZ2VuZXJhdGVkKCkgcHJvcGVydGllcyAoY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGNyZWF0ZWRCeSwgdXBkYXRlZEJ5LFxuICogICAgdXVpZCwgdmVyc2lvbiwgQGNvbXBvc2VkIHBrcywg4oCmKSBhcmUgKipuZXZlcioqIGV4cG9zZWQgaW4gYW55IERUTy5cbiAqICAtIFRoZSBAcGsoKSBwcm9wZXJ0eTpcbiAqICAgICAg4oCiIFVQREFURSDigJMgYWx3YXlzIGluY2x1ZGVkLlxuICogICAgICDigKIgQ1JFQVRFICDigJMgaW5jbHVkZWQgb25seSB3aGVuIHRoZSBwayBpcyBOT1QgYXV0by1nZW5lcmF0ZWRcbiAqICAgICAgICAgICAgICAgICAgKGNoZWNrZWQgdmlhIE1vZGVsLnBrUHJvcHMoKS5nZW5lcmF0ZWQgQU5EIE1vZGVsLmdlbmVyYXRlZCgpKS5cbiAqICAtIFJlbGF0aW9uIHByb3BlcnRpZXMgKEBvbmVUb09uZSwgQG9uZVRvTWFueSwg4oCmKTpcbiAqICAgICAg4oCiIENSRUFURSAg4oCTIG5lc3RlZCBhcyBEdG9Gb3IoQ1JFQVRFLCBSZWxhdGVkTW9kZWwpLiBXaGVuIHRoZSByZWxhdGlvblxuICogICAgICAgICAgICAgICAgICBjcmVhdGVzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIChtb2RlbCBBIOKGkiBtb2RlbCBCIOKGkiBtb2RlbCBBKSxcbiAqICAgICAgICAgICAgICAgICAgdGhlIGJhY2stcmVmZXJlbmNlIHVzZXMgdGhlIHJlbGF0ZWQgbW9kZWwncyBQSyB0eXBlXG4gKiAgICAgICAgICAgICAgICAgIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWsgdGhlIGN5Y2xlLlxuICogICAgICDigKIgVVBEQVRFICDigJMgdW5pb24gb2YgRHRvRm9yKFVQREFURSwgUmVsYXRlZE1vZGVsKSAqKm9yKiogdGhlXG4gKiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgbW9kZWwncyBwcmltYXJ5LWtleSB0eXBlIChzdHJpbmcgLyBpbnRlZ2VyKSxcbiAqICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgU3dhZ2dlciBvbmVPZi4gQ2lyY3VsYXIgYmFjay1yZWZlcmVuY2VzXG4gKiAgICAgICAgICAgICAgICAgIG9taXQgdGhlIERUTyAkcmVmIGFuZCBvbmx5IGluY2x1ZGUgdGhlIFBLIHR5cGUuXG4gKlxuICogTWV0YWRhdGEucHJvcGVydGllcygpIG5vdyByZXR1cm5zIEFMTCBwcm9wZXJ0aWVzIGFjcm9zcyB0aGUgcHJvdG90eXBlIGNoYWluLFxuICogc28gRFRPIGluaGVyaXRhbmNlIGlzIG5vIGxvbmdlciBuZWVkZWQ7IGV2ZXJ5IERUTyBpcyBhIGZsYXQgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEdG9Gb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgc3RhY2s6IFNldDxDb25zdHJ1Y3Rvcjxhbnk+PiA9IG5ldyBTZXQoKVxuKTogQ29uc3RydWN0b3I8YW55PiB7XG4gIGlmICghVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLmluY2x1ZGVzKG9wKSkge1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RHRvQ2FjaGUob3ApO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobW9kZWwpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IGlzVXBkYXRlT3AgPSBbXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gIF0uaW5jbHVkZXMob3AgYXMgYW55KTtcblxuICBjbGFzcyBEeW5hbWljRFRPIHt9XG4gIGNhY2hlLnNldChtb2RlbCwgRHluYW1pY0RUTyk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8sIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGAke3RvUGFzY2FsQ2FzZShtb2RlbC5uYW1lKX0ke3RvUGFzY2FsQ2FzZShvcCl9RFRPYCxcbiAgfSk7XG5cbiAgY29uc3QgcGtQcm9wID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE1vZGVsLnBrKG1vZGVsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KSgpO1xuXG4gIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IHBrUHJvcCA/IE1vZGVsLnBrUHJvcHMobW9kZWwgYXMgYW55KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtEZXNpZ25UeXBlID0gcGtQcm9wXG4gICAgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwa1Byb3AgYXMgc3RyaW5nKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa1R5cGVJc051bWVyaWMgPVxuICAgIHBrRGVzaWduVHlwZSA9PT0gTnVtYmVyIHx8IHBrRGVzaWduVHlwZSA9PT0gQmlnSW50O1xuICBjb25zdCBwa0lzR2VuZXJhdGVkID1cbiAgICAhIXBrUHJvcHNNZXRhZGF0YT8uZ2VuZXJhdGVkIHx8XG4gICAgKHBrUHJvcFxuICAgICAgPyBNb2RlbC5nZW5lcmF0ZWRCeVNlcXVlbmNlKG1vZGVsIGFzIGFueSwgcGtQcm9wIGFzIGFueSkgfHxcbiAgICAgICAgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwa1Byb3AgYXMgc3RyaW5nKSB8fFxuICAgICAgICBwa1R5cGVJc051bWVyaWNcbiAgICAgIDogZmFsc2UpO1xuXG4gIGNvbnN0IGFsbFByb3BzID0gQXJyYXkuZnJvbShuZXcgU2V0KE1ldGFkYXRhLnByb3BlcnRpZXMobW9kZWwpIHx8IFtdKSk7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigoTW9kZWwucmVsYXRpb25zKG1vZGVsKSBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICBjb25zdCBzY2FsYXJQcm9wczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgYWxsUHJvcHMpIHtcbiAgICBpZiAoIXByb3ApIGNvbnRpbnVlO1xuICAgIGlmIChyZWxhdGlvbnMuaGFzKHByb3ApKSBjb250aW51ZTtcblxuICAgIGlmIChwcm9wID09PSBwa1Byb3AgJiYgIWlzVXBkYXRlT3AgJiYgcGtJc0dlbmVyYXRlZCkgY29udGludWU7XG4gICAgaWYgKHByb3AgIT09IHBrUHJvcCAmJiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApKVxuICAgICAgY29udGludWU7XG5cbiAgICBzY2FsYXJQcm9wcy5wdXNoKHByb3ApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHNjYWxhclByb3BzKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhdmFsaWRhdGlvbj8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcbiAgICBjb25zdCB0eXBlSGludCA9XG4gICAgICBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApID8/XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIH07XG4gICAgaWYgKHR5cGVIaW50KSBhcGlPcHRpb25zLnR5cGUgPSB0eXBlSGludDtcblxuICAgIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGRlc2lnblR5cGUgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCkgPz8gdHlwZUhpbnQ7XG4gICAgaWYgKHR5cGVvZiBkZXNpZ25UeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIGRlc2lnblR5cGUsXG4gICAgICAgIER5bmFtaWNEVE8ucHJvdG90eXBlLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmVsYXRpb24gb2YgcmVsYXRpb25zKSB7XG4gICAgY29uc3QgcmVsYXRpb25NZXRhID0gTWV0YWRhdGEucmVsYXRpb25zKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGlmICghcmVsYXRpb25NZXRhKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTWV0YWRhdGEgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGxldCByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPVxuICAgICAgcmVsYXRpb25NZXRhLmNsYXNzIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgaWYgKHR5cGVvZiByZWxhdGlvblR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhcmVsYXRpb25UeXBlLm5hbWUpIHtcbiAgICAgIHJlbGF0aW9uVHlwZSA9IChyZWxhdGlvblR5cGUgYXMgYW55KSgpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0aW9uVHlwZSB8fCB0eXBlb2YgcmVsYXRpb25UeXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUeXBlIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKCFNb2RlbC5nZXQocmVsYXRpb25UeXBlLm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBjb25zdCBpc0FycmF5ID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuTElTVF07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcblxuICAgIC8vIERldGVjdCBjaXJjdWxhciByZWZlcmVuY2U6IGlmIHRoZSByZWxhdGVkIG1vZGVsIGlzIGFscmVhZHkgaW4gdGhlXG4gICAgLy8gcmVjdXJzaW9uIHN0YWNrLCB1c2UgdGhlIFBLIHR5cGUgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWtcbiAgICAvLyB0aGUgY3ljbGUuIFRoaXMgcHJldmVudHMgQG5lc3Rqcy9zd2FnZ2VyJ3MgU2NoZW1hT2JqZWN0RmFjdG9yeSBmcm9tXG4gICAgLy8gaW5maW5pdGVseSByZWN1cnNpbmcgd2hlbiBleHBsb3JpbmcgdGhlIHNjaGVtYXMuXG4gICAgY29uc3QgaXNDaXJjdWxhciA9IHN0YWNrLmhhcyhyZWxhdGlvblR5cGUpO1xuXG4gICAgaWYgKGlzQ2lyY3VsYXIpIHtcbiAgICAgIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gICAgICBhZGRSZWxhdGlvblBrUmVmKER5bmFtaWNEVE8sIHJlbGF0aW9uLCBwa1R5cGVOYW1lLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uRHRvID0gRHRvRm9yKG9wLCByZWxhdGlvblR5cGUsIG5ldyBTZXQoc3RhY2spLmFkZChtb2RlbCkpO1xuXG4gICAgaWYgKGlzVXBkYXRlT3ApIHtcbiAgICAgIGFkZFJlbGF0aW9uVXBkYXRlKFxuICAgICAgICBEeW5hbWljRFRPLFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICAgcmVsYXRpb25UeXBlLFxuICAgICAgICByZWxhdGlvbkR0byxcbiAgICAgICAgaXNBcnJheSxcbiAgICAgICAgaXNSZXF1aXJlZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUmVsYXRpb24oRHluYW1pY0RUTywgcmVsYXRpb24sIHJlbGF0aW9uRHRvLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHluYW1pY0RUTztcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb24oXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgdHlwZTogcmVsYXRpb25EdG8sXG4gICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgaXNBcnJheSxcbiAgfTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IHJlbGF0aW9uRHRvLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgYSByZWxhdGlvbiBwcm9wZXJ0eSB0aGF0IHVzZXMgdGhlIFBLIHR5cGUgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mXG4gKiBhIGZ1bGwgRFRPIGNsYXNzLiBVc2VkIHRvIGJyZWFrIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gQ3VzdG9tZXIg4oaSIE9yZGVyIOKGkiBDdXN0b21lcikuXG4gKi9cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uUGtSZWYoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHBrVHlwZU5hbWU6IHN0cmluZyxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogcGtUeXBlTmFtZSB9LCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nLCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSk7XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiAocGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcpLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvblVwZGF0ZShcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFNb2RlbHMgPVxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLCBEdG9DbGFzcykgfHwgW107XG4gIGlmICghZXh0cmFNb2RlbHMuaW5jbHVkZXMocmVsYXRpb25EdG8pKSB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUyxcbiAgICAgIFsuLi5leHRyYU1vZGVscywgcmVsYXRpb25EdG9dLFxuICAgICAgRHRvQ2xhc3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZHRvUmVmID0gYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7cmVsYXRpb25EdG8ubmFtZX1gO1xuICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICBjb25zdCBvbmVPZkl0ZW1zID0gW3sgJHJlZjogZHRvUmVmIH0sIHsgdHlwZTogcGtUeXBlTmFtZSB9XTtcblxuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KTtcblxuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogT2JqZWN0LFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gTW9kZWwucGtQcm9wcyhyZWxhdGlvblR5cGUgYXMgYW55KTtcbiAgICBjb25zdCBwa1R5cGUgPSBwa1Byb3BzTWV0YWRhdGE/LnR5cGU7XG4gICAgaWYgKHBrVHlwZSA9PT0gTnVtYmVyIHx8IHBrVHlwZSA9PT0gQmlnSW50KSByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgaWYgKE1vZGVsLmdlbmVyYXRlZChjdXJyZW50LCBwcm9wIGFzIGFueSkpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKGN1cnJlbnQsIHByb3AgYXMgYW55KTtcbiAgICBpZiAodmFsaWRhdGlvbikgcmV0dXJuIHZhbGlkYXRpb24gYXMgYW55O1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpOiBhbnkge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKGN1cnJlbnQsIHByb3ApO1xuICAgIGlmICh0eXBlKSByZXR1cm4gdHlwZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldER0b0NhY2hlKFxuICBvcDogT3BlcmF0aW9uS2V5c1xuKTogV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PiB7XG4gIGlmICghZHRvQ2FjaGUuaGFzKG9wKSkge1xuICAgIGR0b0NhY2hlLnNldChvcCwgbmV3IFdlYWtNYXAoKSk7XG4gIH1cbiAgcmV0dXJuIGR0b0NhY2hlLmdldChvcCkhO1xufVxuIiwiaW1wb3J0IHsgQ29udHJvbGxlciwgUGFyYW0sIFF1ZXJ5LCBSZXNwb25zZSwgU2V0TWV0YWRhdGEgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFwaUJhZFJlcXVlc3RSZXNwb25zZSxcbiAgQXBpQm9keSxcbiAgQXBpQ3JlYXRlZFJlc3BvbnNlLFxuICBBcGlFeHRyYU1vZGVscyxcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICB0eXBlIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBEQktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZQYXJhbXMsXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBNb2RlbENvbnN0cjogQ29uc3RydWN0b3IgPSByZXBvLmNsYXNzO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIG9ialZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlNZXRob2RzKSkge1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqVmFsdWVzLmZpZWxkcyA/PyBbXTtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwcmVmaXgsIG1ldGhvZE5hbWUsIC4uLmZpZWxkcy5tYXAoKGYpID0+IGA6JHtmfWApXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoXCJHRVRcIiBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBnZXRQSywgYXBpUHJvcGVydGllcywgcGF0aDogcGtQYXRoIH0gPVxuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwoTW9kZWxDb25zdHIpO1xuXG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7ZmFjdG9yeVJvdXRlcz8ubGVuZ3RoID8/IDB9IGZhY3Rvcnkgcm91dGVzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdXRoQ29uZmlnOiBBdXRoQ29uZmlnIHwgdW5kZWZpbmVkID0gbWVyZ2VkQ29uZmlnLmF1dGg7XG5cbiAgICBmdW5jdGlvbiBhcHBseUNsYXNzQXV0aCh0YXJnZXQ6IGFueSkge1xuICAgICAgaWYgKGF1dGhDb25maWc/LnB1YmxpYykge1xuICAgICAgICBQdWJsaWMoKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChhdXRoQ29uZmlnPy5yb2xlcz8ubGVuZ3RoKSB7XG4gICAgICAgIFJlcXVpcmVSb2xlcyguLi5hdXRoQ29uZmlnLnJvbGVzKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aChNb2RlbENvbnN0cikodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoQ29uZmlnPy5za2lwTW9kZWxSb2xlcykge1xuICAgICAgICBTZXRNZXRhZGF0YShTS0lQX01PREVMX1JPTEVTX0tFWSwgdHJ1ZSkodGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAQ29udHJvbGxlcihyb3V0ZVBhdGgpXG4gICAgQEFwaVRhZ3MobW9kZWxDbGF6ek5hbWUpXG4gICAgQEFwaUV4dHJhTW9kZWxzKE1vZGVsQ29uc3RyKVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmcgPSBNb2RlbC5wayhNb2RlbENvbnN0cikgYXMgc3RyaW5nO1xuXG4gICAgICBwcm90ZWN0ZWQgc3RhdGljIGdldCBjbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBEeW5hbWljTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgUmVnaXN0ZXJpbmcgZHluYW1pYyBjb250cm9sbGVyIGZvciBtb2RlbDogJHt0aGlzLmNsYXNzLm5hbWV9IHJvdXRlOiAvJHtyb3V0ZVBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcGx5Q2xhc3NBdXRoKER5bmFtaWNNb2RlbENvbnRyb2xsZXIpO1xuXG4gICAgaWYgKGZhY3RvcnlSb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZFJvdXRlcyA9IFsuLi5mYWN0b3J5Um91dGVzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFTZWdtZW50cyA9IGEucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBiU2VnbWVudHMgPSBiLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYVBhcmFtQ291bnQgPSBhU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJQYXJhbUNvdW50ID0gYlNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBhTGl0ZXJhbENvdW50ID0gYVNlZ21lbnRzLmxlbmd0aCAtIGFQYXJhbUNvdW50O1xuICAgICAgICBjb25zdCBiTGl0ZXJhbENvdW50ID0gYlNlZ21lbnRzLmxlbmd0aCAtIGJQYXJhbUNvdW50O1xuICAgICAgICBpZiAoYUxpdGVyYWxDb3VudCAhPT0gYkxpdGVyYWxDb3VudClcbiAgICAgICAgICByZXR1cm4gYkxpdGVyYWxDb3VudCAtIGFMaXRlcmFsQ291bnQ7XG4gICAgICAgIGlmIChhUGFyYW1Db3VudCAhPT0gYlBhcmFtQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNvcnRlZFJvdXRlcykge1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgcGtQYXRoLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgZ2V0UEssXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVnaXN0cmF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9ID1cbiAgICAgICAgICByZWdpc3RyYXRpb247XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihyb3V0ZS5tZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdLFxuICAgICAgICAgICAgcGFyYW1EZWNvcmF0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXTtcbiAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKE1vZGVsQ2xhenopIGFzIGtleW9mIE1vZGVsPGFueT47XG4gICAgY29uc3QgY29tcG9zZWQgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENsYXp6LFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5DT01QT1NFRCwgcGspXG4gICAgKTtcbiAgICBjb25zdCBjb21wb3NlZEtleXMgPSBjb21wb3NlZD8uYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPVxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb3NlZEtleXMpICYmIGNvbXBvc2VkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jb21wb3NlZEtleXNdKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoW3BrXSkpO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6KSA/PyBcIlwiO1xuICAgIGNvbnN0IHBhdGggPSBgOiR7dW5pcXVlS2V5cy5qb2luKFwiLzpcIil9YDtcbiAgICBjb25zdCBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10gPSB1bmlxdWVLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6LCBrZXkpLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+XG4gICAgICAgIGNvbXBvc2VkPy5zZXBhcmF0b3IgPyBwYXJhbXMuam9pbihjb21wb3NlZC5zZXBhcmF0b3IpIDogcGFyYW1zLmpvaW4oXCJcIiksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlZmluZU1ldGhvZChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgdGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsXG4gICAgICBtZXRob2ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFwcGx5RGVjb3JhdG9ycyhcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgbWV0aG9kRGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXVxuICApIHtcbiAgICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kTmFtZSk7XG4gICAgbWV0aG9kRGVjb3JhdG9ycy5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gICAgcGFyYW1EZWNvcmF0b3JzLmZvckVhY2goKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PlxuICAgICAgZGVjb3JhdG9yKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hSb3V0ZShcbiAgICByb3V0ZTogU2VydmVyUm91dGUsXG4gICAgcGtQYXRoOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwZXJzaXN0ZW5jZT86IGFueVxuICApOiB7XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+O1xuICB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVIYW5kbGVyKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVCdWxrQ3JlYXRlSGFuZGxlcihNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZEFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtSZWFkSGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1JlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrVXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtEZWxldGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrRGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVhZEhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVVcGRhdGVIYW5kbGVyKGdldFBLLCBNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGFwaVByb3BlcnRpZXMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVEZWxldGVIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlZCBQSyBmYWxsYmFjayByb3V0ZXMgKGZpbHRlckVtcHR5KSDigJQgcGF0aCBkaWZmZXJzIGZyb20gcGtQYXRoXG4gICAgY29uc3QgZmFsbGJhY2tTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgaXNBbGxQYXJhbXMgPSBmYWxsYmFja1NlZ21lbnRzLmxlbmd0aCA+IDAgJiYgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWFkSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhmYWxsYmFja0FwaVByb3BzKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlVXBkYXRlSGFuZGxlcihnZXRQSywgTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYGRlbGV0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZURlbGV0ZUhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwic3RhdGVtZW50XCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlU3RhdGVtZW50SGFuZGxlcihtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50RGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwibWV0aG9kXCIpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJhcmdzXCIpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcImxpc3RCeS86a2V5XCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZLFxuICAgICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgICAgXCJwYWdlLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSxcbiAgICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgICAgXCJtaW5PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRixcbiAgICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgICAgXCJkaXN0aW5jdE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsXG4gICAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhdGVtZW50S2V5ID0gc3RhdGVtZW50Um91dGVzW25vcm1hbGl6ZWRQYXRoXTtcbiAgICBpZiAoc3RhdGVtZW50S2V5ICYmIG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudE1ldGhvZE5hbWUobm9ybWFsaXplZFBhdGgpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlcihzdGF0ZW1lbnRLZXksIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBub3JtYWxpemVkUGF0aCwgc3RhdGVtZW50S2V5KSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBjb25zdCBxdWVyeU1ldGhvZCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihxdWVyeU1ldGhvZCksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKHF1ZXJ5TWV0aG9kLCBub3JtYWxpemVkUGF0aCwgXCJHRVRcIiwgdHJ1ZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgY3VzdG9tIEByb3V0ZSgpIHBhdGhzIChlLmcuIFwibWV0YWRhdGEvZm9yLXByb2R1Y3QvOnByb2R1Y3RDb2RlXCIpXG4gICAgY29uc3QgcGF0aFNlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBrbm93blByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIFwibGlzdEJ5XCIsIFwiZmluZEJ5XCIsIFwiZmluZEJ5UGFnaW5hdGVcIiwgXCJmaW5kT25lQnlcIiwgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIiwgXCJwYWdlXCIsIFwiY291bnRPZlwiLCBcIm1heE9mXCIsIFwibWluT2ZcIiwgXCJhdmdPZlwiLCBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIiwgXCJncm91cE9mXCIsIFwic3RhdGVtZW50XCIsIFwiYnVsa1wiLCBcInF1ZXJ5XCIsXG4gICAgXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpICYmXG4gICAgICAha25vd25QcmVmaXhlcy5oYXMocGF0aFNlZ21lbnRzWzBdKVxuICAgICkge1xuICAgICAgLy8gTG9vayB1cCB0aGUgYWN0dWFsIG1ldGhvZCBuYW1lIGZyb20gQHJvdXRlIG1ldGFkYXRhIGJ5IG1hdGNoaW5nIHRoZSBwYXRoLlxuICAgICAgLy8gVGhlIEByb3V0ZSBkZWNvcmF0b3Igc3RvcmVzIHsgcGF0aCwgaHR0cE1ldGhvZCwgaGFuZGxlciB9IGtleWVkIGJ5IG1ldGhvZCBuYW1lXG4gICAgICAvLyBvbiB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3Rvci5cbiAgICAgIGNvbnN0IHJvdXRlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgICAgKHBlcnNpc3RlbmNlIGFzIGFueSk/LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICAgKSA/PyB7fTtcbiAgICAgIGNvbnN0IG1hdGNoZWRFbnRyeSA9IE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0YWRhdGEpLmZpbmQoXG4gICAgICAgIChbLCBpbmZvXSkgPT5cbiAgICAgICAgICBpbmZvICYmXG4gICAgICAgICAgdHlwZW9mIGluZm8gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBpbmZvLnBhdGg/LnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpID09PSBub3JtYWxpemVkUGF0aFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGFjdHVhbE1ldGhvZE5hbWUgPSBtYXRjaGVkRW50cnk/LlswXSB8fCBwYXRoU2VnbWVudHNbMF07XG5cbiAgICAgIGNvbnN0IHBhcmFtU2VnbWVudHMgPSBwYXRoU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBwYXJhbVNlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIGFjdHVhbE1ldGhvZE5hbWUsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKGFjdHVhbE1ldGhvZE5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7YWN0dWFsTWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIiB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGUpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGUoZGF0YSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsoY3JlYXRlZCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGNyZWF0ZUFsbCk7XG4gICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBsZXQgY3JlYXRlZDogYW55W107XG4gICAgICB0cnkge1xuICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmNyZWF0ZUFsbChcbiAgICAgICAgICBkYXRhLm1hcCgoZCkgPT4gbmV3IE1vZGVsQ29uc3RyKGQpKSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsoY3JlYXRlZCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtSZWFkSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWRBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpZHM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIHRydWUpXG4gICAgICApLmZvcihyZWFkQWxsKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZHMgPSBBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXTtcbiAgICAgIGxldCByZWFkOiBNb2RlbFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bm9ybWFsaXplZElkc30gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5yZWFkQWxsKG5vcm1hbGl6ZWRJZHMgYXMgYW55LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgYm9keTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGVBbGwpO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7Ym9keS5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlQWxsKGJvZHksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrRGVsZXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGRlbGV0ZUFsbCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRzID0gQXJyYXkuaXNBcnJheShpZHMpID8gaWRzIDogW2lkc107XG4gICAgICBsZXQgcmVhZDogTW9kZWxbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgZGVsZXRpbmcgJHtub3JtYWxpemVkSWRzLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5kZWxldGVBbGwobm9ybWFsaXplZElkcywgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlYWRIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKVxuICAgICAgKS5mb3IocmVhZCk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHJlYWRSZXN1bHQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICByZWFkUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWQoaWQsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhyZWFkUmVzdWx0IGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICByZXR1cm4gcmVhZFJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVXBkYXRlSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICBib2R5OiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuVVBEQVRFLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlKFxuICAgICAgICAgIG5ldyBNb2RlbENvbnN0cih7IC4uLnBheWxvYWQsIFt0aGlzLnBrXTogaWQgfSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVEZWxldGVIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsIHRydWUpXG4gICAgICApLmZvcihyZW1vdmUpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCBkZWw6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBkZWxldGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgZGVsID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmRlbGV0ZShpZCwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBkZWxldGVkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBkZWw7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVN0YXRlbWVudEhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBzdGF0ZW1lbnQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBhcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgZGV0YWlsczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIFBlcnNpc3RlbmNlS2V5cy5TVEFURU1FTlQsIHRydWUpXG4gICAgICApLmZvcihzdGF0ZW1lbnQpO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIG9mZnNldCwgbGltaXQsIGJvb2ttYXJrIH0gPSBkZXRhaWxzO1xuICAgICAgYXJncyA9IGFyZ3MubWFwKFxuICAgICAgICAoYSkgPT4gKHR5cGVvZiBhID09PSBcInN0cmluZ1wiID8gcGFyc2VJbnQoYSBhcyBzdHJpbmcpIDogYSkgfHwgYVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IHBhdGhEaXJlY3Rpb24gPSBhcmdzLmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb2x2ZWREaXJlY3Rpb24gPSAoZGlyZWN0aW9uID8/IHBhdGhEaXJlY3Rpb24pIGFzXG4gICAgICAgIHwgc3RyaW5nXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHJlc29sdmVkRGlyZWN0aW9uICYmIGFyZ3MubGVuZ3RoID4gMSkgYXJnc1sxXSA9IHJlc29sdmVkRGlyZWN0aW9uO1xuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6XG4gICAgICAgICAgYXJncy5wdXNoKGRpcmVjdGlvbiBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOlxuICAgICAgICAgIGFyZ3MgPSBbXG4gICAgICAgICAgICBhcmdzWzBdLFxuICAgICAgICAgICAgcmVzb2x2ZWREaXJlY3Rpb24gYXMgYW55LFxuICAgICAgICAgICAgeyBsaW1pdCwgb2Zmc2V0LCBib29rbWFyayB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0Y6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnN0YXRlbWVudChuYW1lLCAuLi5hcmdzLCBjdHgpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTdGF0ZW1lbnRTaG9ydGN1dEhhbmRsZXIoXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc3RhdGVtZW50U2hvcnRjdXQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgc3RhdGVtZW50S2V5LCB0cnVlKVxuICAgICAgKS5mb3Ioc3RhdGVtZW50U2hvcnRjdXQpO1xuXG4gICAgICBzd2l0Y2ggKHN0YXRlbWVudEtleSkge1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkubGlzdEJ5KFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgICAgY3R4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgcGFnZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkucGFnaW5hdGVCeShcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGltaXQ6IChkZXRhaWxzIGFzIGFueSk/LmxpbWl0LFxuICAgICAgICAgICAgICBvZmZzZXQ6IChkZXRhaWxzIGFzIGFueSk/Lm9mZnNldCxcbiAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgY3R4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOiB7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiA/PyBPcmRlckRpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5maW5kID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UuZmluZCh2YWx1ZSwgZGlyZWN0aW9uLCBjdHgpO1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsIHZhbHVlLCBkaXJlY3Rpb24sIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRToge1xuICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHJlZiA9IHtcbiAgICAgICAgICAgIG9mZnNldDogKGRldGFpbHMgYXMgYW55KT8ub2Zmc2V0ID8/IDEsXG4gICAgICAgICAgICBsaW1pdDogKGRldGFpbHMgYXMgYW55KT8ubGltaXQgPz8gMTAsXG4gICAgICAgICAgICBib29rbWFyazogKGRldGFpbHMgYXMgYW55KT8uYm9va21hcmssXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gPz8gT3JkZXJEaXJlY3Rpb24uQVNDO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2UucGFnZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnBhZ2UodmFsdWUsIGRpcmVjdGlvbiwgcmVmLCBjdHgpO1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQoUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsIHZhbHVlLCBkaXJlY3Rpb24sIHJlZiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5maW5kT25lQnkoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpXG4gICAgICAgICAgICAuZm9yKGN0eC50b092ZXJyaWRlcygpKVxuICAgICAgICAgICAgLmZpbmRCeShrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBbZmllbGRdID0gYXJncztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuc3RhdGVtZW50KHN0YXRlbWVudEtleSwgZmllbGQsIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZW1lbnQ6ICR7c3RhdGVtZW50S2V5fWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICAgKS5mb3IoY29tcGxleFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2Uuc3RhdGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjdXN0b21Sb3V0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgKS5mb3IoY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuXG4gICAgICAvLyBUcnkgdGhlIHBlcnNpc3RlbmNlIGRpcmVjdGx5ICh3b3JrcyB3aGVuIGl0J3MgYSBjdXN0b20gUmVwb3NpdG9yeSlcbiAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIC8vIFdoZW4gcGVyc2lzdGVuY2UgaXMgYSBNb2RlbFNlcnZpY2UsIHRoZSBtZXRob2QgbGl2ZXMgb24gdGhlIHVuZGVybHlpbmcgcmVwb1xuICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgYmFjayB0byBzdGF0ZW1lbnQgZ2F0ZXdheVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfSBvciBpdHMgcmVwb2BcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RRdWVyeUFyZ3MoYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gYXJncztcbiAgICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChcbiAgICAgIGxhc3QgJiZcbiAgICAgIHR5cGVvZiBsYXN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShsYXN0KVxuICAgICkge1xuICAgICAgY29uc3QgcXVlcnlPYmogPSBhcmdzLnBvcCgpO1xuICAgICAgY29uc3QgaGFzRGlyZWN0aW9uID0gcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNMaW1pdCA9IHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNPZmZzZXQgPSBxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaGFzRGlyZWN0aW9uICYmICFoYXNMaW1pdCAmJiAhaGFzT2Zmc2V0KSByZXR1cm4gYXJncztcbiAgICAgIGNvbnN0IGV4dHJhczogYW55W10gPSBbXTtcbiAgICAgIGlmIChoYXNEaXJlY3Rpb24pIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmRpcmVjdGlvbik7XG4gICAgICBlbHNlIGlmIChoYXNMaW1pdCB8fCBoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFzTGltaXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICAgIGlmIChoYXNPZmZzZXQpIGV4dHJhcy5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgICByZXR1cm4gWy4uLmFyZ3MsIC4uLmV4dHJhc107XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0NyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrUmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgd2l0aCBuZXcgcGF5bG9hZHMuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIHJlY29yZHMgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgJHJlZjogZ2V0U2NoZW1hUGF0aChEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrRGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYEV4ZWN1dGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50IG9uICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICB9KSxcbiAgICAgIEFwaVBhcmFtKHsgbmFtZTogXCJtZXRob2RcIiwgZGVzY3JpcHRpb246IFwidGhlIHByZXBhcmVkIHN0YXRlbWVudCB0byBleGVjdXRlXCIgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiYXJnc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBsaXN0ZWQgZm91bmQuYCB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgYmFzZTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGF0aCksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3Jkcy5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcIm9mZnNldFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJib29rbWFya1wiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImJvb2ttYXJrIGZvciBjdXJzb3IgcGFnaW5hdGlvblwiIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kT25lQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcImZpbmRCeS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0ZcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGBSZXN1bHQgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsIHR5cGU6IE51bWJlciB9KSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRikge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYERpc3RpbmN0IHZhbHVlcyBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogW1N0cmluZ10gfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgIF07XG5cbiAgICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29yYXRvcnM7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgUHJvdmlkZXIgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE1vZGVsU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRnJvbU1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuL0Zyb21Nb2RlbENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZUZvcihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgQE1vZHVsZSh7fSlcbiAgY2xhc3MgRGVjYWZNb2RlbE1vZHVsZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUubmFtZSkuZm9yKGZsYXZvdXIpO1xuXG4gICAgc3RhdGljIGNyZWF0ZU1vZGVsU2VydmljZXM8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICAgIG1vZGVsczogTW9kZWxDb25zdHJ1Y3RvcjxUPltdXG4gICAgKTogUHJvdmlkZXJbXSB7XG4gICAgICByZXR1cm4gbW9kZWxzLm1hcCgobW9kZWwpID0+ICh7XG4gICAgICAgIHByb3ZpZGU6IGAke21vZGVsLm5hbWV9U2VydmljZWAsXG4gICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0V4cG9zZWQoXG4gICAgICBtb2RlbDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgZXhwb3N1cmU/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nW10+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4cG9zdXJlPy5bbW9kZWwubmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gb3ZlcnJpZGVcbiAgICAgICAgICA6IE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KERFQ0FGX0VYUE9TRSkpO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmbGF2b3VyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yUm9vdChcbiAgICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM6IFBhcnRpYWw8RGVjYWZNb2R1bGVPcHRpb25zPiA9IHt9XG4gICAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIGNvbnRyb2xsZXJzIGZvciBmbGF2b3VyLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKS5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICB0aGlzLmlzRXhwb3NlZChtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUpXG4gICAgICApO1xuXG4gICAgICBsZXQgbW9kZWxTZXJ2aWNlczogUHJvdmlkZXJbXSA9IFtdO1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1NlcnZpY2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiQXV0by1zZXJ2aWNlcyBlbmFibGVkLiBJbml0aWFsaXppbmcgc2VydmljZSBnZW5lcmF0aW9uLlwiKTtcbiAgICAgICAgbW9kZWxTZXJ2aWNlcyA9IHRoaXMuY3JlYXRlTW9kZWxTZXJ2aWNlcyh0cmFja2VkTW9kZWxzKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYEF1dG8tc2VydmljZXMgY29tcGxldGVkLiAke21vZGVsU2VydmljZXMubGVuZ3RofSBzZXJ2aWNlcyBpbml0aWFsaXplZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdsb2JhbERlZmF1bHRzOiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+ID0ge307XG4gICAgICBpZiAob3B0aW9ucy5hZ2dyZWdhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGdsb2JhbERlZmF1bHRzLmFsbG93R3JvdXBpbmdRdWVyaWVzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAoKG1vZGVsKSA9PlxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZShtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLCBnbG9iYWxEZWZhdWx0cylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5qZWN0YWJsZVNlcnZpY2VLZXksXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSBhcyBDb3JlUmVwb3NpdG9yeSxcbiAgU2VydmljZSBhcyBDb3JlU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZGYWN0b3J5UHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IHN0cmluZztcbiAgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bjtcbn07XG5cbmNvbnN0IHBlbmRpbmdQcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgRGVjYWZGYWN0b3J5UHJvdmlkZXI+KCk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERyYWlucyB0aGUgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIFNlcnZpY2V9L3tAbGluayBSZXBvc2l0b3J5fSB1c2FnZXMuXG4gKiBAc3VtbWFyeSBDb25zdW1lZCBieSB7QGxpbmsgRGVjYWZDb3JlTW9kdWxlLmZvclJvb3R9IHRvIHdpcmUgdGhlIHRva2VucyB0aGF0IHRob3NlIHBhcmFtZXRlclxuICogZGVjb3JhdG9ycyByZWZlcmVuY2UgYmFjayBpbnRvIE5lc3QncyBESSBjb250YWluZXIsIHNpbmNlIGEgcGFyYW1ldGVyIGRlY29yYXRvciBhbG9uZSBjYW5ub3RcbiAqIHN1cHBseSBhIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk6IERlY2FmRmFjdG9yeVByb3ZpZGVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShwZW5kaW5nUHJvdmlkZXJzLnZhbHVlcygpKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcih0b2tlbjogc3RyaW5nLCB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwZW5kaW5nUHJvdmlkZXJzLmhhcyh0b2tlbikpIHJldHVybjtcbiAgcGVuZGluZ1Byb3ZpZGVycy5zZXQodG9rZW4sIHsgcHJvdmlkZTogdG9rZW4sIHVzZUZhY3RvcnkgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTW9kZWxDb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnN0cnVjdG9yPGFueT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgdmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kZWw7XG59XG5cbmZ1bmN0aW9uIG1vZGVsU2VydmljZVRva2VuKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZGVsLm5hbWV9U2VydmljZWA7XG59XG5cbmZ1bmN0aW9uIG1vZGVsUmVwb3NpdG9yeVRva2VuKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZsYXZvdXIgPyBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlAJHtmbGF2b3VyfWAgOiBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlgO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHNlcnZpY2UuXG4gKiBAc3VtbWFyeSBUcmFuc2xhdGVzIGRlY2FmJ3Mgc2VydmljZSByZXNvbHV0aW9uIEFQSXMgaW50byBhIE5lc3QgYEBJbmplY3QoKWAgY2FsbDpcbiAqIC0gYEBTZXJ2aWNlKFNvbWVNb2RlbClgIGluamVjdHMgdGhlIGBNb2RlbFNlcnZpY2U8U29tZU1vZGVsPmAgc2luZ2xldG9uIGZvciB0aGF0IG1vZGVsXG4gKiAgICh2aWEge0BsaW5rIE1vZGVsU2VydmljZS5mb3JNb2RlbH0pLlxuICogLSBgQFNlcnZpY2UoU29tZVNlcnZpY2VDbGFzcylgIG9yIGBAU2VydmljZShcImFsaWFzXCIpYCBpbmplY3RzIHRoZSBtYXRjaGluZyBgQHNlcnZpY2UoKWAtZGVjb3JhdGVkXG4gKiAgIGRlY2FmIHtAbGluayBDb3JlU2VydmljZX0gKHZpYSB7QGxpbmsgQ29yZVNlcnZpY2UuZ2V0fSkuXG4gKiAtIGBAU2VydmljZSgpYCBpbmZlcnMgdGhlIHBhcmFtZXRlcidzIHR5cGUgZnJvbSBlbWl0dGVkIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGFuZCByZXNvbHZlcyBpdCB0aGVcbiAqICAgc2FtZSB3YXksIHByb3ZpZGVkIHRoZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYSBjb25jcmV0ZSBjbGFzcyAoZ2VuZXJpY3MgbGlrZSBgTW9kZWxTZXJ2aWNlPFg+YFxuICogICBhcmUgZXJhc2VkIGF0IHJ1bnRpbWUsIHNvIHRoZSBtb2RlbC1zZXJ2aWNlIGZvcm0gYWx3YXlzIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGFyZ3VtZW50KS5cbiAqIEBwYXJhbSBrZXkgdGhlIG1vZGVsIGNsYXNzLCBzZXJ2aWNlIGNsYXNzLCBvciBhbGlhcyB0byByZXNvbHZlLiBPbWl0IHRvIGluZmVyIGZyb20gdGhlIHBhcmFtZXRlciB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2VydmljZShrZXk/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHJlc29sdmVkOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0ga2V5O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZXM6IGFueVtdID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIHRhcmdldCkgfHwgW107XG4gICAgICByZXNvbHZlZCA9IHBhcmFtVHlwZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBAU2VydmljZSgpIGNvdWxkIG5vdCBkZXRlcm1pbmUgYW4gaW5qZWN0aW9uIHR5cGUgZm9yIHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fSBvZiAkeyh0YXJnZXQgYXMgQ29uc3RydWN0b3I8YW55PikubmFtZX0uIFByb3ZpZGUgYW4gZXhwbGljaXQgYXJndW1lbnQsIGUuZy4gQFNlcnZpY2UoU29tZVNlcnZpY2UpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNNb2RlbCA9IHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIiAmJiBpc01vZGVsQ29uc3RydWN0b3IocmVzb2x2ZWQpO1xuICAgIGNvbnN0IHRva2VuID0gYXNNb2RlbFxuICAgICAgPyBtb2RlbFNlcnZpY2VUb2tlbihyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgICAgOiBpbmplY3RhYmxlU2VydmljZUtleShyZXNvbHZlZCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTtcblxuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IHtcbiAgICAgIGlmIChhc01vZGVsKSByZXR1cm4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZClcbiAgICAgICAgOiBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYge0BsaW5rIENvcmVSZXBvc2l0b3J5fSBmb3IgYG1vZGVsYC5cbiAqIEBzdW1tYXJ5IFVubGlrZSB7QGxpbmsgU2VydmljZX0sIGBtb2RlbGAgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYSBNb2RlbCBjbGFzczogdGhlIHNhbWUgY2xhc3MgcGFzc2VkXG4gKiB0byBgQFNlcnZpY2UobW9kZWwpYCBhbmQgYEBSZXBvc2l0b3J5KG1vZGVsKWAgcmVzb2x2ZXMgdG8gdHdvIGRpZmZlcmVudCBpbmplY3RlZCBvYmplY3RzIChhXG4gKiBgTW9kZWxTZXJ2aWNlPE0+YCB2cyBhIGBSZXBvc2l0b3J5PE0+YCByZXNwZWN0aXZlbHkpLCB2aWEge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgY2xhc3MgdG8gcmVzb2x2ZSBhIHJlcG9zaXRvcnkgZm9yLlxuICogQHBhcmFtIGZsYXZvdXIgb3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLCBmb3J3YXJkZWQgdG8ge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlcG9zaXRvcnkoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IG1vZGVsUmVwb3NpdG9yeVRva2VuKG1vZGVsLCBmbGF2b3VyKTtcbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCwgZmxhdm91cikpO1xuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBUFBfSU5URVJDRVBUT1IsIE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFQ0FGX0FEQVBURVJfSUQsXG4gIERFQ0FGX0hBTkRMRVJTLFxuICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VTZXJ2aWNlLCBTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbiAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5AR2xvYmFsKClcbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZDb3JlTW9kdWxlPENPTkYsIEFEQVBURVIgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnk+PlxuICBpbXBsZW1lbnRzIE9uQXBwbGljYXRpb25TaHV0ZG93blxue1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3BlcnNpc3RlbmNlPzogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgcGVyc2lzdGVuY2UoKTogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlBlcnNpc3RlbmNlIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZkNvcmVNb2R1bGUpO1xuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX01PRFVMRV9PUFRJT05TKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zPENPTkYsIEFEQVBURVI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVmOiBNb2R1bGVSZWZcbiAgKSB7fVxuXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9ucyk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgIGNvbnN0IGRlY2FmUHJvdmlkZXJzID0gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfTU9EVUxFX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCwgdXNlVmFsdWU6IHRoaXMucGVyc2lzdGVuY2U/LmNsaWVudCB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogREVDQUZfSEFORExFUlMsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgIG9wdGlvbnMuaGFuZGxlcnM/Lm1hcCgoSCkgPT4ge1xuICAgICAgICAgICAgICBsb2cuaW5mbyhgUmVnaXN0ZXJlZCByZXF1ZXN0IGhhbmRsZXI6ICR7SC5uYW1lfWApO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IEgoKTtcbiAgICAgICAgICAgIH0pID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycyxcbiAgICAgIF0sXG4gICAgICBleHBvcnRzOiBbXG4gICAgICAgIERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgICBERUNBRl9BREFQVEVSX0lELFxuICAgICAgICBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLm1hcCgocHJvdmlkZXIpID0+IHByb3ZpZGVyLnByb3ZpZGUpLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGJvb3RQZXJzaXN0ZW5jZShcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJvb3RQZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gb3B0aW9ucy5jb25mLm1hcCgoW2NvbnRyLCBjZmcsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCFwb3NzaWJsZSkgcmV0dXJuIFtjb250ciwgY2ZnXTtcbiAgICAgICAgcmV0dXJuIFtjb250ciwgY2ZnLCAuLi5hcmdzXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7XG4gICAgICBhd2FpdCB0aGlzLl9wZXJzaXN0ZW5jZS5ib290KHRyaW1tZWQpO1xuICAgICAgY29uc3QgY2xpZW50cyA9IHRoaXMuX3BlcnNpc3RlbmNlLmNsaWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gb3B0aW9ucy5jb25mW2ldO1xuICAgICAgICBjb25zdCBwb3NzaWJsZVRyYW5zZiA9IGMuc2xpY2UoMiwgYy5sZW5ndGgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtZXIgPSBwb3NzaWJsZVRyYW5zZi5wb3AoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0cmFuc2Zvcm1lciB8fFxuICAgICAgICAgICEodHJhbnNmb3JtZXIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHIgPSBBZGFwdGVyLnRyYW5zZm9ybWVyRm9yKGNsaWVudHNbaV0uZmxhdm91cik7XG4gICAgICAgICAgaWYgKCFjb250cilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gdHJhbnNmb3JtZXIgZm91bmQgZm9yIGZsYXZvdXIgJHtjbGllbnRzW2ldLmZsYXZvdXJ9LiB5b3Ugc2hvdWxkIGVpdGhlciBAcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIG9yIHByb3ZpZGUgYSB0cmFuc2Zvcm1lciBpbiB0aGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSAoY29udHIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgICAgICAgPyBjb250clxuICAgICAgICAgICAgICA6IG5ldyAoY29udHIgYXMgQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4+KSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGJvb3QgdHJhbnNmb3JtZXIgZm9yICR7Y2xpZW50c1tpXS5mbGF2b3VyfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcihjbGllbnRzW2ldLmZsYXZvdXIpKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKFwicGVyc2lzdGVuY2UgbGF5ZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsaXphdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbjogJHtlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgdGhpcy5tb2R1bGVSZWYuZ2V0PGFueT4oREVDQUZfQURBUFRFUl9JRCk7XG4gICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIGFkYXB0ZXJzKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2h1dHRpbmcgZG93biAke2FkYXB0ZXIudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICBhd2FpdCBhZGFwdGVyLnNodXRkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gYXBwbGljYXRpb25gLCBlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgU2VydmljZS5zaHV0ZG93bigpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2VzYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTID0gU3ltYm9sKFxuICBcIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSU1wiXG4pO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3M6IGFueVtdKTogdW5rbm93bltdIHtcbiAgY29uc3QgW21vZGVsQ29uc3RyLCBvcGVyYXRpb24sIGlkLCBwYXlsb2FkXSA9IGFyZ3M7XG5cbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDb25zdHI/Lm5hbWUgPz8gbW9kZWxDb25zdHI7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFBheWxvYWQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpXG4gICAgPyBwYXlsb2FkLm1hcCgoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZS5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGUuc2VyaWFsaXplKCk7XG5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgUGF5bG9hZCBpdGVtIGZvciAke21vZGVsTmFtZX0gZG9lcyBub3QgaGF2ZSBzZXJpYWxpemUgbWV0aG9kIGFuZCBpcyBhbiAke3R5cGVvZiBlfSwgYXR0ZW1wdGluZyB0byBzdHJpbmdpZnkgZGlyZWN0bHkuIEl0ZW06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09IFwic3RyaW5nXCIgPyBlIDogSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBwYXlsb2FkIGZvciAke21vZGVsTmFtZX06ICR7ZXJyfWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHBheWxvYWQuc2VyaWFsaXplKClcbiAgICAgIDogdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXlsb2FkXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgY29uc29sZS5kZWJ1ZyhcbiAgICBgTm9ybWFsaXplZCBldmVudCByZXNwb25zZSBmb3IgbW9kZWwgJHttb2RlbE5hbWV9LCBvcGVyYXRpb24gJHtvcGVyYXRpb259LCBpZCAke2lkfTpgLFxuICAgIHNlcmlhbGl6ZWRQYXlsb2FkXG4gICk7XG5cbiAgcmV0dXJuIFttb2RlbE5hbWUsIG9wZXJhdGlvbiwgaWQsIHNlcmlhbGl6ZWRQYXlsb2FkXTtcbn1cbiIsImltcG9ydCB7IERlY2FmQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBPYnNlcnZlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgSW5qZWN0LCBNZXNzYWdlRXZlbnQsIFF1ZXJ5LCBTc2UgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGludGVydmFsLCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVFdmVudFJlc3BvbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb250cm9sbGVyKClcbmV4cG9ydCBjbGFzcyBFdmVudHNDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPERlY2FmU2VydmVyQ3R4PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQEluamVjdChMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMpIGZsYXZvdXJzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuICAgIHRoaXMuYWRhcHRlcnMgPSBmbGF2b3Vycy5tYXAoKGZsYXZvdXIpID0+IChBZGFwdGVyIGFzIGFueSkuZ2V0KGZsYXZvdXIpKTsgLy8gY2hhbmdlIHRvIEFkYXB0ZXIuY2FjaGUoXCJcIilcbiAgfVxuXG4gIEBTc2UoKVxuICBsaXN0ZW4oKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgY29uc3QgZXZlbnRzJCA9IG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZlcklkID1cbiAgICAgICAgYEItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ3JlYXRpbmcgU1NFIG9ic2VydmVyOiAke29ic2VydmVySWR9IGZvciBjbGllbnQgJHt0aGlzLmNsaWVudENvbnRleHQudXVpZH1gXG4gICAgICApO1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICBvYnNlcnZlcklkID0gb2JzZXJ2ZXJJZDtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IHJlY2VpdmVkIHJlZnJlc2ggZXZlbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBcIm1lc3NhZ2VcIiwgZGF0YSB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gZXZlbnQgcHVzaGVkIHRvIGNsaWVudGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBhY3Jvc3MgJHt0aGlzLmFkYXB0ZXJzLmxlbmd0aH0gYWRhcHRlcihzKWBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWdpc3RlciBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENsZWFuaW5nIHVwIFNTRSBvYnNlcnZlciAke29ic2VydmVySWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgVW5yZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGZyb20gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgZHVyaW5nIGNsZWFudXAgb2Ygb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDE1MDAwO1xuICAgIGNvbnN0IGhlYXJ0YmVhdCQgPSBpbnRlcnZhbChIRUFSVEJFQVRfSU5URVJWQUxfTVMpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTZW5kaW5nIGhlYXJ0YmVhdFwiKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKFxuICAgICAgICAoKTogTWVzc2FnZUV2ZW50ID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJoZWFydGJlYXRcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBtZXJnZShldmVudHMkLCBoZWFydGJlYXQkKTtcbiAgfVxuXG4gIEBTc2UoXCIvOm1vZGVsXCIpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbGlzdGVuRm9yTW9kZWwoQFF1ZXJ5KFwibW9kZWxcIikgbW9kZWw6IHN0cmluZyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGRhdGE6IGFyZ3MgfSBhcyBhbnkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihgRmFpbGVkIHRvIG9ic2VydmUgZXZlbnQ6ICR7ZS5tZXNzYWdlIHx8IGV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBFdmVudHNDb250cm9sbGVyIH0gZnJvbSBcIi4vRXZlbnRzQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmU3RyZWFtTW9kdWxlIHtcbiAgc3RhdGljIGZvckZsYXZvdXJzKFxuICAgIGZsYXZvdXJzOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmcgPSBcImV2ZW50c1wiXG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnM6IFtFdmVudHNDb250cm9sbGVyXSxcbiAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgUm91dGVyTW9kdWxlLnJlZ2lzdGVyKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSxcbiAgICAgICAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMsXG4gICAgICAgICAgdXNlVmFsdWU6IGZsYXZvdXJzID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBGb3J3YXJkUmVmZXJlbmNlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZkNvcmVNb2R1bGUgfSBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlRm9yIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWwvaW5kZXhcIjtcbmltcG9ydCB7IERlY2FmU3RyZWFtTW9kdWxlIH0gZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZHVsZSB7XG4gIHN0YXRpYyBhc3luYyBmb3JSb290QXN5bmMoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xuICAgIGNvbnN0IHsgYXV0b0NvbnRyb2xsZXJzLCBhdXRvU2VydmljZXMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmJvb3RQZXJzaXN0ZW5jZShvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VycyA9IGFkYXB0ZXJzLm1hcCgoYWRhcHRlcikgPT4gYWRhcHRlci5mbGF2b3VyKTtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgICBmbGF2b3Vycy5mb3JFYWNoKChmbGF2b3VyKSA9PiB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICAgICAgZ2V0TW9kdWxlRm9yKGZsYXZvdXIpLmZvclJvb3QoZmxhdm91ciwge1xuICAgICAgICAgICAgICBhdXRvU2VydmljZXMsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJFeHBvc3VyZTogb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJDb25maWc6IG9wdGlvbnMuY29udHJvbGxlckNvbmZpZyxcbiAgICAgICAgICAgICAgYWdncmVnYXRpb25zOiBvcHRpb25zLmFnZ3JlZ2F0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlck9wdGlvbnM/LmVuYWJsZU9ic2VydmVyRXZlbnRzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgIERlY2FmU3RyZWFtTW9kdWxlLmZvckZsYXZvdXJzKFxuICAgICAgICAgIG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zLm9ic2VydmVyRmxhdm91cnMgfHwgZmxhdm91cnNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHt9XG4iLCJpbXBvcnQge01vZGVsfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge0ludGVybmFsRXJyb3J9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtSZXBvc2l0b3J5fSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9Gb3JNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IG0gPSBNb2RlbC5nZXQobW9kZWwpO1xuXHRpZiAoIW0pXG5cdFx0dGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YClcblx0Y29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cdHJldHVybiByZXBvO1xufSIsIi8qKlxuICogQG1vZHVsZSBmb3ItbmVzdFxuICogQGRlc2NyaXB0aW9uIFRoaXMgbW9kdWxlIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHRzLXdvcmtzcGFjZSBsaWJyYXJ5LiBJdCBhZ2dyZWdhdGVzIGFuZCBleHBvcnRzXG4gKiBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCB1dGlsaXRpZXMgd2l0aGluIHRoZSBwcm9qZWN0LlxuICpcbiAqIFRoZSBtb2R1bGUgaW5jbHVkZXM6XG4gKiAxLiBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgXCIuL3V0aWxzXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGVzZSBsaWtlbHkgY29udGFpbiBoZWxwZXIgZnVuY3Rpb25zLCBjb21tb24gdHlwZXMsIGFuZCBzaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3QuXG4gKiAgICAtIE1heSBpbmNsdWRlIG9wZXJhdGlvbnMgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLCB0eXBlIGNoZWNraW5nLCBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2UgdXRpbGl0aWVzLlxuICpcbiAqIDIuIEEgbmFtZXNwYWNlIGFuZCByZWxhdGVkIHR5cGVzIGZyb20gdGhlIFwiLi9uYW1lc3BhY2VcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoaXMgY291bGQgY29udGFpbiBkb21haW4tc3BlY2lmaWMgY29kZSBvciBhIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuICogICAgLSBNaWdodCBpbmNsdWRlIGludGVyZmFjZXMsIHR5cGVzLCBvciBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGNvcmUgY29uY2VwdHMgaW4gdGhlIGxpYnJhcnkuXG4gKlxuICogMy4gQSBWRVJTSU9OIGNvbnN0YW50OlxuICogICAgLSBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqICAgIC0gVXNlZnVsIGZvciB2ZXJzaW9uIGNoZWNraW5nIGFuZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICpcbiAqIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIGEgY2xlYW4gYW5kIG9yZ2FuaXplZCBleHBvcnQgb2YgdGhlIG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHksIGFsbG93aW5nIGNvbnN1bWVyc1xuICogdG8gZWFzaWx5IGltcG9ydCBhbmQgdXNlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IGFzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IFwiLi9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRpb25cIjsgLy8gb24gdG9wIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL292ZXJyaWRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWVzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250cm9sbGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi93ZWJob29rc1wiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHMtd29ya3NwYWNlIG1vZHVsZS5cbiAqIFRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgaXMgcmVwbGFjZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24odHJ1ZSk7XG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24oZmFsc2UpO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlNfUFJFRklYIiwiREVDT1JBVE9SUyIsIkFQSV9PUEVSQVRJT04iLCJBUElfUkVTUE9OU0UiLCJBUElfUFJPRFVDRVMiLCJBUElfQ09OU1VNRVMiLCJBUElfVEFHUyIsIkFQSV9DQUxMQkFDS1MiLCJBUElfUEFSQU1FVEVSUyIsIkFQSV9IRUFERVJTIiwiQVBJX01PREVMX1BST1BFUlRJRVMiLCJBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSIsIkFQSV9TRUNVUklUWSIsIkFQSV9FWENMVURFX0VORFBPSU5UIiwiQVBJX0VYQ0xVREVfQ09OVFJPTExFUiIsIkFQSV9FWFRSQV9NT0RFTFMiLCJBUElfRVhURU5TSU9OIiwiQVBJX1NDSEVNQSIsIkFQSV9ERUZBVUxUX0dFVFRFUiIsIkFQSV9MSU5LIiwiaXNDb25zdHJ1Y3RvciIsInZhbCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsIk1FVEhPRF9NRVRBREFUQSIsImNyZWF0ZU1ldGhvZERlY29yYXRvciIsIm1ldGFrZXkiLCJtZXRhZGF0YSIsIm92ZXJyaWRlRXhpc3RpbmciLCJ0YXJnZXQiLCJrZXkiLCJkZXNjcmlwdG9yIiwicHJldlZhbHVlIiwiUmVmbGVjdCIsImdldE1ldGFkYXRhIiwidmFsdWUiLCJkZWZpbmVNZXRhZGF0YSIsImNyZWF0ZUNsYXNzRGVjb3JhdG9yIiwiY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IiLCJwcm9wZXJ0eUtleSIsInByb3BlcnRpZXMiLCJpbmNsdWRlcyIsImV4aXN0aW5nTWV0YWRhdGEiLCJuZXdNZXRhZGF0YSIsInBpY2tCeSIsIm5lZ2F0ZSIsImlzVW5kZWZpbmVkIiwibWV0YWRhdGFUb1NhdmUiLCJ0eXBlIiwiY29uc3RydWN0b3IiLCJjcmVhdGVNaXhlZERlY29yYXRvciIsIm1ldGFkYXRhcyIsIkFycmF5IiwiaXNBcnJheSIsInByZXZpb3VzTWV0YWRhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJjcmVhdGVQYXJhbURlY29yYXRvciIsImluaXRpYWwiLCJwYXJhbU9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwicHJvcGVydHlLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsIm1ldGhvZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJpc0FwaU1ldGhvZCIsImhhc01ldGFkYXRhIiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImlucHV0IiwiaXNBcnJheUZsYWciLCJpc0lucHV0QXJyYXkiLCJvYmoiLCJnZXRFbnVtVmFsdWVzIiwiZW51bVR5cGUiLCJudW1lcmljVmFsdWVzIiwidmFsdWVzIiwiZmlsdGVyIiwibWFwIiwidG9TdHJpbmciLCJrZXlzIiwiZ2V0RW51bVR5cGUiLCJoYXNTdHJpbmciLCJpc1N0cmluZyIsImxlbmd0aCIsInJlcXVpcmVkIiwiaXNFbnVtQXJyYXkiLCJvcHRzIiwiZW51bSIsInVuZGVmaW5lZCIsIkFwaVByb3BlcnR5Iiwib3B0aW9ucyIsImNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yIiwiZW51bVZhbHVlcyIsIml0ZW1zIiwiQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiTW9kZWxDb25zdHJ1Y3RvciIsInZlcmIiLCJwYXRoIiwiaHR0cFRvQ3J1ZCIsIkdFVCIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiR2V0IiwiUE9TVCIsIkNSRUFURSIsIlBvc3QiLCJQVVQiLCJVUERBVEUiLCJQdXQiLCJQQVRDSCIsIlBhdGNoIiwiREVMRVRFIiwiRGVsZXRlIiwiY3J1ZE9wIiwiSHR0cE1ldGhvZERlY29yYXRvciIsInJlc29sdmVCbG9ja1RhcmdldCIsImNvcmVJc09wZXJhdGlvbkJsb2NrZWQiLCJraW5kIiwiYXBwbHkiLCJBcGlFeGNsdWRlRW5kcG9pbnQiLCJCdWxrQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiUkVBRF9BTEwiLCJDUkVBVEVfQUxMIiwiVVBEQVRFX0FMTCIsIkRFTEVURV9BTEwiLCJub3JtYWxpemVkIiwicmVwbGFjZSIsInN0YXRlbWVudFRhcmdldHMiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJMSVNUX0JZIiwiUEFHRV9CWSIsIkZJTkQiLCJQQUdFIiwiRklORF9PTkVfQlkiLCJGSU5EX0JZIiwiQ09VTlRfT0YiLCJNQVhfT0YiLCJNSU5fT0YiLCJBVkdfT0YiLCJTVU1fT0YiLCJESVNUSU5DVF9PRiIsIkdST1VQX09GIiwic3RhcnRzV2l0aCIsInN0YXRlbWVudFZhbHVlIiwiQXBpUGFyYW1zRnJvbU1vZGVsIiwicHJvcHMiLCJkZWNvcmF0b3JzIiwicCIsIkFwaVBhcmFtRGVjIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiU3RyaW5nIiwiYXBwbHlEZWNvcmF0b3JzIiwiRGVjYWZCb2R5IiwiZGF0YSIsImN0eCIsInJlcXVlc3QiLCJzd2l0Y2hUb0h0dHAiLCJnZXRSZXF1ZXN0IiwiYm9keSIsImNvbnRyb2xsZXIiLCJnZXRDbGFzcyIsIk1vZGVsQ29uc3RyIiwiY2xhc3MiLCJJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIiwiaXRlbSIsIk9yZGVyZWRQYXJhbXMiLCJvcmRlciIsInJlcSIsIm9yaWdpbmFsIiwicGFyYW1zIiwib3JkZXJMaXN0Iiwib3JkZXJlZCIsImsiLCJyYXciLCJ2YWx1ZXNJbk9yZGVyIiwia2V5c0luT3JkZXIiLCJEZWNhZlBhcmFtcyIsIkRlY2FmUXVlcnkiLCJfIiwicXVlcnkiLCJwYXJzZWQiLCJsaW1pdCIsIm4iLCJOdW1iZXIiLCJpc05hTiIsIm9mZnNldCIsImJvb2ttYXJrIiwiREVDQUZfTU9EVUxFX09QVElPTlMiLCJERUNBRl9BREFQVEVSX0lEIiwiREVDQUZfVEFTS19TRVJWSUNFX0lEIiwiREVDQUZfUk9VVEUiLCJERUNBRl9IQU5ETEVSUyIsIlN5bWJvbCIsIkRFQ0FGX0VYUE9TRSIsIkRFQ0FGX0NPTlRST0xMRVJfQ09ORklHIiwiREVDQUZfQ09OVEVYVF9LRVkiLCJleHBvc2UiLCJmbGF2b3VycyIsIk1ldGFkYXRhIiwic2V0IiwiY29udHJvbGxlckNvbmZpZyIsImNvbmZpZyIsImNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IiLCJBVVRIX0hBTkRMRVIiLCJBVVRIX01FVEFfS0VZIiwiSVNfUFVCTElDX0tFWSIsIlJFUVVJUkVEX1JPTEVTX0tFWSIsIlNLSVBfTU9ERUxfUk9MRVNfS0VZIiwiRGVjYWZSZXF1ZXN0Q29udGV4dCIsIlJlcXVlc3RDb250ZXh0Iiwic3VwZXIiLCJoZWFkZXJzT2YiLCJoZWFkZXJzIiwidGhpcyIsInV1aWQiLCJVVUlEIiwiaW5zdGFuY2UiLCJnZW5lcmF0ZSIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwiZ2V0T3JVbmRlZmluZWQiLCJvcmdhbml6YXRpb24iLCJjdXJyZW50TG9nIiwiY2hpbGRMb2ciLCJsb2dnZXIiLCJoYW5kbGUiLCJBZGFwdGVyIiwiZmxhdm91cnNUb1RyYW5zZm9ybSIsImZsYXZvdXIiLCJ0cmFuc2Zvcm1lciIsInRyYW5zZm9ybWVyRm9yIiwiZnJvbSIsIk9wdGlvbmFsIiwiUmVmbGVjdG9yIiwiQXV0aCIsIm1vZGVsIiwicmVzb3VyY2UiLCJkZWNzIiwiQXBpQmVhcmVyQXV0aCIsIlVzZUludGVyY2VwdG9ycyIsInB1c2giLCJTZXRNZXRhZGF0YSIsIlB1YmxpYyIsIlJlcXVpcmVSb2xlcyIsInJvbGVzIiwiQXBpU2VjdXJpdHkiLCJIdHRwVmVyYlRvRGVjb3JhdG9yIiwiZGVjb3JhdG9yIiwiRXJyb3IiLCJleHRyYWN0UGF0aFBhcmFtcyIsInJvdXRlUGF0aCIsInNwbGl0Iiwic2xpY2UiLCJhcGlQYXJhbVNwZWMiLCJnZXRBcGlEZWNvcmF0b3JzIiwibWV0aG9kTmFtZSIsImh0dHBWZXJiIiwiaW5jbHVkZVF1ZXJ5UGFyYW1zIiwiTmVzdEh0dHBSb3V0ZURlYyIsImFwaVBhdGhQYXJhbXMiLCJzd2FnZ2VyUXVlcnlQYXJhbXMiLCJBcGlRdWVyeSIsIk9yZGVyRGlyZWN0aW9uIiwibWV0aG9kIiwiQXBpUGFyYW0iLCJBcGlPcGVyYXRpb24iLCJzdW1tYXJ5IiwiQXBpT2tSZXNwb25zZSIsIkFwaU5vQ29udGVudFJlc3BvbnNlIiwiUXVlcnkiLCJhcHBseUFwaURlY29yYXRvcnMiLCJwcm90byIsImZvckVhY2giLCJkIiwiaW5kZXgiLCJyZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QiLCJwZXJzaXN0ZW5jZSIsImFyZ3MiLCJNb2RlbFNlcnZpY2UiLCJzdGF0ZW1lbnQiLCJjcmVhdGVSb3V0ZUhhbmRsZXIiLCJhc3luYyIsInBhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXJlY3Rpb24iLCJlcnJvciIsImRlZmluZVJvdXRlTWV0aG9kIiwiQ29udHJvbGxlckNsYXNzIiwiaGFuZGxlciIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJEZWNhZkF1dGhIYW5kbGVyIiwiQXV0aEhhbmRsZXIiLCJwYXJzZVJlcXVlc3QiLCJ1c2VyUm9sZSIsImF1dGhvcml6YXRpb24iLCJleHRyYWN0RnJvbUF1dGgiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJEZWNhZlJvbGVBdXRoSGFuZGxlciIsInRvQ29udGV4dEZsYWdzIiwiYWRhcHRlciIsImFsaWFzIiwiYmluZCIsInJlcXVlc3RUcmFuc2Zvcm1lcnMiLCJtZXRhIiwiQ29udGV4dCIsInRvUmVzcG9uc2UiLCJyZXMiLCJwZW5kaW5nIiwiaGVhZGVyIiwiTW9kZWxCdWlsZGVyIiwiZGVjb3JhdGVDbGFzcyIsIl9jbGFzc0RlY29yYXRvcnMiLCJfX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCIsIm9yaWdpbmFsQnVpbGQiLCJidWlsZCIsInJlc3VsdCIsImNhbGwiLCJkZWNvcmF0ZWQiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JfMSIsImV4ZWN1dG9yIiwiY29udGV4dHVhbGl6ZSIsImZsYWdzIiwiaXAiLCJleHRyYWN0SXAiLCJEZWZhdWx0QWRhcHRlckZsYWdzIiwidGltZXN0YW1wIiwiRGF0ZSIsIm9wZXJhdGlvbiIsInVybCIsImNvbnRleHQiLCJnZXRSZXNwb25zZSIsImV4ZWMiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJzZWdtZW50IiwidHJpbSIsIkJvb2xlYW4iLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwiQVBQX0lOVEVSQ0VQVE9SIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IiLCJyZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJEZWNhZkNvbnRyb2xsZXIiLCJIdHRwRGVjYWZDb250cm9sbGVyIiwiY2xpZW50Q29udGV4dCIsIl9uYW1lIiwiRGVjYWZNb2RlbENvbnRyb2xsZXIiLCJfcGVyc2lzdGVuY2UiLCJTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIlJlcG9zaXRvcnkiLCJmb3JNb2RlbCIsInRvT3ZlcnJpZGVzIiwib3ZlcnJpZGUiLCJkdG9DYWNoZSIsIk1hcCIsIkR0b0ZvciIsIm9wIiwic3RhY2siLCJTZXQiLCJUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMiLCJjYWNoZSIsImdldER0b0NhY2hlIiwiY2FjaGVkIiwiaXNVcGRhdGVPcCIsIkR5bmFtaWNEVE8iLCJ0b1Bhc2NhbENhc2UiLCJwa1Byb3AiLCJNb2RlbCIsInBrIiwicGtQcm9wc01ldGFkYXRhIiwicGtQcm9wcyIsInBrRGVzaWduVHlwZSIsInBrVHlwZUlzTnVtZXJpYyIsIkJpZ0ludCIsInBrSXNHZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRCeVNlcXVlbmNlIiwiaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlIiwiYWxsUHJvcHMiLCJyZWxhdGlvbnMiLCJzY2FsYXJQcm9wcyIsInByb3AiLCJoYXMiLCJ2YWxpZGF0aW9uIiwiZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlIiwiaXNSZXF1aXJlZCIsIlZhbGlkYXRpb25LZXlzIiwiUkVRVUlSRUQiLCJ0eXBlSGludCIsImdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZSIsImFwaU9wdGlvbnMiLCJkZXNpZ25UeXBlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInJlbGF0aW9uIiwicmVsYXRpb25NZXRhIiwiSW50ZXJuYWxFcnJvciIsInJlbGF0aW9uVHlwZSIsInZhbGlkYXRpb25Gb3IiLCJMSVNUIiwiaXNDaXJjdWxhciIsInBrVHlwZU5hbWUiLCJnZXRQa09wZW5BcGlUeXBlIiwiYWRkUmVsYXRpb25Qa1JlZiIsInJlbGF0aW9uRHRvIiwiYWRkIiwiYWRkUmVsYXRpb25VcGRhdGUiLCJhZGRSZWxhdGlvbiIsIkR0b0NsYXNzIiwiZXh0cmFNb2RlbHMiLCJkdG9SZWYiLCJvbmVPZkl0ZW1zIiwiJHJlZiIsIm9uZU9mIiwicGtUeXBlIiwiY3VycmVudCIsIkZ1bmN0aW9uIiwiZ2V0UHJvdG90eXBlT2YiLCJXZWFrTWFwIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsImdsb2JhbERlZmF1bHRzIiwidGFibGVOYW1lIiwidG9LZWJhYkNhc2UiLCJtb2RlbENsYXp6TmFtZSIsImZhY3RvcnlQZXJzaXN0ZW5jZSIsImRlY29yYXRvckNvbmZpZyIsIm1vZHVsZU92ZXJyaWRlIiwibWVyZ2VkQ29uZmlnIiwiRmFjdG9yeUNvbnRyb2xsZXIiLCJNb2RlbENvbnRyb2xsZXJGYWN0b3J5IiwiZmFjdG9yeVJvdXRlcyIsIl9fcm91dGVzX18iLCJnZXRQSyIsImFwaVByb3BlcnRpZXMiLCJwa1BhdGgiLCJnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwiLCJhdXRoQ29uZmlnIiwiYXV0aCIsImFwcGx5Q2xhc3NBdXRoIiwicHVibGljIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwicmVnaXN0cmF0aW9uIiwibWF0Y2hSb3V0ZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlSGFuZGxlciIsImNyZWF0ZUNyZWF0ZURlY29yYXRvcnMiLCJSZXNwb25zZSIsInBhc3N0aHJvdWdoIiwiY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIiLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImNyZWF0ZUJ1bGtSZWFkSGFuZGxlciIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyIiwiYnVsa1VwZGF0ZURlY29yYXRvcnMiLCJjcmVhdGVCdWxrRGVsZXRlSGFuZGxlciIsImJ1bGtEZWxldGVEZWNvcmF0b3JzIiwiY3JlYXRlUmVhZEhhbmRsZXIiLCJyZWFkRGVjb3JhdG9ycyIsImNyZWF0ZVVwZGF0ZUhhbmRsZXIiLCJ1cGRhdGVEZWNvcmF0b3JzIiwiY3JlYXRlRGVsZXRlSGFuZGxlciIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyIiwic3RhdGVtZW50RGVjb3JhdG9ycyIsIlBhcmFtIiwic3RhdGVtZW50Um91dGVzIiwic3RhdGVtZW50S2V5Iiwic3RhdGVtZW50TWV0aG9kTmFtZSIsImNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlciIsInN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0UGFyYW1zIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwicm91dGVNZXRhZGF0YSIsIm1hdGNoZWRFbnRyeSIsImZpbmQiLCJhY3R1YWxNZXRob2ROYW1lIiwicGFyYW1TZWdtZW50cyIsImNyZWF0ZUN1c3RvbVJvdXRlSGFuZGxlciIsImZpcnN0U2VnbWVudCIsInNlZ21lbnRzIiwic2VnIiwiaSIsInJlc3AiLCJsb2dDdHgiLCJjcmVhdGVkIiwiY3JlYXRlQWxsIiwicmVhZEFsbCIsImlkcyIsIm5vcm1hbGl6ZWRJZHMiLCJyZWFkIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsImRlbGV0ZUFsbCIsInJvdXRlUGFyYW1zIiwiaWQiLCJWYWxpZGF0aW9uRXJyb3IiLCJyZWFkUmVzdWx0IiwidXBkYXRlIiwicGF5bG9hZCIsInBhcnNlIiwicmVtb3ZlIiwiZGVsIiwiZGVsZXRlIiwiZGV0YWlscyIsIlNUQVRFTUVOVCIsInBhcnNlSW50IiwicGF0aERpcmVjdGlvbiIsInJlc29sdmVkRGlyZWN0aW9uIiwic3RhdGVtZW50U2hvcnRjdXQiLCJsaXN0QnkiLCJwYWdlIiwicGFnaW5hdGVCeSIsIkFTQyIsInJlZiIsImZpbmRPbmVCeSIsImZpbmRCeSIsImZpZWxkIiwiY29tcGxleFF1ZXJ5Iiwic3ByZWFkQXJncyIsImV4dHJhY3RRdWVyeUFyZ3MiLCJjdXN0b21Sb3V0ZSIsImxhc3QiLCJxdWVyeU9iaiIsInBvcCIsImhhc0RpcmVjdGlvbiIsImhhc0xpbWl0IiwiaGFzT2Zmc2V0IiwiZXh0cmFzIiwiQXBpQm9keSIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsInNjaGVtYSIsImdldFNjaGVtYVBhdGgiLCJBcGlCYWRSZXF1ZXN0UmVzcG9uc2UiLCJBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiYmFzZSIsImdldE1vZHVsZUZvciIsIkRlY2FmTW9kZWxNb2R1bGUiLCJEZWNhZk1vZGVsTW9kdWxlXzEiLCJjcmVhdGVNb2RlbFNlcnZpY2VzIiwibW9kZWxzIiwidXNlRmFjdG9yeSIsImlzRXhwb3NlZCIsImV4cG9zdXJlIiwidHJhY2tlZE1vZGVscyIsImNvbnRyb2xsZXJFeHBvc3VyZSIsIm1vZGVsU2VydmljZXMiLCJhdXRvU2VydmljZXMiLCJhZ2dyZWdhdGlvbnMiLCJhbGxvd0dyb3VwaW5nUXVlcmllcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkJhc2VFcnJvciIsIkRlY2FmRXhjZXB0aW9uRmlsdGVyIiwiZXhjZXB0aW9uIiwiaG9zdCIsImlzUHJvZHVjdGlvbiIsIkxvZ2dlZEVudmlyb25tZW50IiwiZW52Iiwic3RhdHVzQ29kZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiVW5zdXBwb3J0ZWRFcnJvciIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJtZXNzYWdlIiwiZ2V0U3RhdHVzIiwic3RhdHVzIiwiY29kZSIsImpzb24iLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJzY2hlbWUiLCJiZWFyZXJGb3JtYXQiLCJpbiIsInBlcnNpc3RBdXRob3JpemF0aW9uIiwidG9wYmFyQmdDb2xvciIsIlN3YWdnZXJDdXN0b21VSSIsImN1c3RvbUNTUyIsImNzcyIsInRvcGJhckljb25QYXRoIiwiaW1nIiwiYjY0IiwiZ2V0Q3VzdG9tT3B0aW9ucyIsImZhdmljb24iLCJmYXZpY29uUGF0aCIsImN1c3RvbVNpdGVUaXRsZSIsImN1c3RvbUNzcyIsInN3YWdnZXJPcHRpb25zIiwiZmlsZSIsImZpbGVQYXRoIiwiYXNzZXRzUGF0aCIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiU3dhZ2dlckJ1aWxkZXIiLCJhcHAiLCJjcmVhdGVEb2N1bWVudCIsIm9wZW5BcGlKc29uUGF0aCIsIm9wZW5BcGlZYW1sUGF0aCIsIkRvY3VtZW50QnVpbGRlciIsInNldFRpdGxlIiwic2V0RGVzY3JpcHRpb24iLCJzZXRWZXJzaW9uIiwiYWRkQmVhcmVyQXV0aCIsIlN3YWdnZXJNb2R1bGUiLCJyZWdpc3Rlck9wZW5BcGlSb3V0ZSIsImNvbnRlbnRUeXBlIiwiYm9keUZhY3RvcnkiLCJodHRwQWRhcHRlciIsImdldEh0dHBBZGFwdGVyIiwiX3JlcSIsInJlcGx5Iiwic2V0dXBTd2FnZ2VyIiwiZG9jdW1lbnQiLCJzd2FnZ2VyVUkiLCJzZXR1cCIsImpzb25Eb2N1bWVudFVybCIsInlhbWxEb2N1bWVudFVybCIsIllBTUwiLCJOZXN0Qm9vdHN0cmFwZXIiLCJfbG9nZ2VyIiwiTG9nZ2VyIiwiaW5pdGlhbGl6ZSIsImVuYWJsZUxvZ2dlciIsImN1c3RvbUxvZ2dlciIsInVzZUxvZ2dlciIsImVuYWJsZUNvcnMiLCJvcmlnaW5zIiwiYWxsb3dNZXRob2RzIiwiYWxsb3dlZE9yaWdpbnMiLCJvIiwidG9Mb3dlckNhc2UiLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwicGVuZGluZ1Byb3ZpZGVycyIsImdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyIsInJlZ2lzdGVyUHJvdmlkZXIiLCJ0b2tlbiIsImlzTW9kZWxDb25zdHJ1Y3RvciIsIm1vZGVsU2VydmljZVRva2VuIiwibW9kZWxSZXBvc2l0b3J5VG9rZW4iLCJwYXJhbWV0ZXJJbmRleCIsInJlc29sdmVkIiwicGFyYW1UeXBlcyIsImFzTW9kZWwiLCJpbmplY3RhYmxlU2VydmljZUtleSIsIkNvcmVTZXJ2aWNlIiwiQ29yZVJlcG9zaXRvcnkiLCJEZWNhZkNvcmVNb2R1bGUiLCJEZWNhZkNvcmVNb2R1bGVfMSIsIm1vZHVsZVJlZiIsImRlY2FmUHJvdmlkZXJzIiwidXNlVmFsdWUiLCJjbGllbnQiLCJIIiwicHJvdmlkZXIiLCJib290UGVyc2lzdGVuY2UiLCJ0cmltbWVkIiwiY29uZiIsImNvbnRyIiwicG9zc2libGUiLCJQZXJzaXN0ZW5jZVNlcnZpY2UiLCJib290IiwiY2xpZW50cyIsImMiLCJwb3NzaWJsZVRyYW5zZiIsInJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciIsImluaXRpYWxpemF0aW9uIiwib25BcHBsaWNhdGlvblNodXRkb3duIiwiYWRhcHRlcnMiLCJzaHV0ZG93biIsIkdsb2JhbCIsIk1vZHVsZVJlZiIsIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyIsIm5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UiLCJtb2RlbENvbnN0ciIsInNlcmlhbGl6ZWRQYXlsb2FkIiwic2VyaWFsaXplIiwiY29uc29sZSIsImVyciIsIkV2ZW50c0NvbnRyb2xsZXIiLCJFdmVudHNDb250cm9sbGVyXzEiLCJldmVudHMkIiwiT2JzZXJ2YWJsZSIsIm9ic2VydmVyIiwib2JzZXJ2ZXJJZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1VwcGVyQ2FzZSIsImNiIiwicmVmcmVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWRhcHRlck5hbWUiLCJvYnNlcnZlIiwidW5PYnNlcnZlIiwiSEVBUlRCRUFUX0lOVEVSVkFMX01TIiwiaGVhcnRiZWF0JCIsImludGVydmFsIiwidHMiLCJtZXJnZSIsImxpc3RlbkZvck1vZGVsIiwiU3NlIiwiRGVjYWZTdHJlYW1Nb2R1bGUiLCJEZWNhZlN0cmVhbU1vZHVsZV8xIiwiZm9yRmxhdm91cnMiLCJpbXBvcnRzIiwiUm91dGVyTW9kdWxlIiwicmVnaXN0ZXIiLCJEZWNhZk1vZHVsZSIsIkRlY2FmTW9kdWxlXzEiLCJmb3JSb290QXN5bmMiLCJhdXRvQ29udHJvbGxlcnMiLCJvYnNlcnZlck9wdGlvbnMiLCJlbmFibGVPYnNlcnZlckV2ZW50cyIsIm9ic2VydmVyRmxhdm91cnMiLCJydW5NaWdyYXRpb25zIiwicmVwb0Zvck1vZGVsIiwibSIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJhbGxvd1JlcmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sTUFBTUEsb0JBQW9COztBQUMxQixNQUFNQyxhQUFhO0lBQ3hCQyxlQUFlLEdBQUdGO0lBQ2xCRyxjQUFjLEdBQUdIO0lB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
|
|
2783
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aE1vZHVsZS50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmSGFuZGxlckV4ZWN1dG9yLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXNwb25zZUludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2NvbnRyb2xsZXJzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL01vZGVsQnVpbGRlckV4dGVuc2lvbnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRnJvbU1vZGVsQ29udHJvbGxlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9EZWNhZk1vZGVsTW9kdWxlLnRzIiwiLi4vc3JjL2RlY29yYXRpb24udHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvY29ycy50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy90aHJvdHRsaW5nLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9EZWNhZkVycm9yRmlsdGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9jb25zdGFudHMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJDdXN0b21VSS50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckJ1aWxkZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9OZXN0Qm9vdHN0cmFwZXIudHMiLCIuLi9zcmMvaW50ZXJjZXB0b3JzL0RlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1RhcmdldChcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8QyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHg+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmZ1bmN0aW9uIHRvRGVjYWZFcnJvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICBDT05URVhUIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBIdHRwRGVjYWZDb250cm9sbGVyPFJlcXVlc3QsIGFueSwgRGVjYWZSZXF1ZXN0Q29udGV4dD4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZNb2RlbENvbnRyb2xsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPEM+IHtcbiAgcHJpdmF0ZSBfcGVyc2lzdGVuY2U/OiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIF9uYW1lKTtcbiAgfVxuXG4gIGFic3RyYWN0IGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPE0+O1xuXG4gIHBlcnNpc3RlbmNlKGN0eD86IENvbnRleHQ8YW55Pik6IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxNPj4odGhpcy5jbGFzcyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICAgICkgYXMgTW9kZWxTZXJ2aWNlPE0+O1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmNsaWVudENvbnRleHQudG9PdmVycmlkZXMoKTtcblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUob3ZlcnJpZGVzKVxuICAgICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlLmZvcihvdmVycmlkZXMpXG4gICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkdG9DYWNoZSA9IG5ldyBNYXA8XG4gIE9wZXJhdGlvbktleXMsXG4gIFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj5cbj4oKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBOZXN0L1N3YWdnZXIgRFRPIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIENSVUQgb3BlcmF0aW9uLlxuICpcbiAqIFJ1bGVzOlxuICogIC0gT25seSBDUkVBVEUgYW5kIFVQREFURSAoYW5kIHRoZWlyIGJ1bGsgdmFyaWFudHMpIHByb2R1Y2UgYSBEVE87XG4gKiAgICBhbGwgb3RoZXIgb3BlcmF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIG1vZGVsIGNsYXNzIHVuY2hhbmdlZC5cbiAqICAtIEBnZW5lcmF0ZWQoKSBwcm9wZXJ0aWVzIChjcmVhdGVkQXQsIHVwZGF0ZWRBdCwgY3JlYXRlZEJ5LCB1cGRhdGVkQnksXG4gKiAgICB1dWlkLCB2ZXJzaW9uLCBAY29tcG9zZWQgcGtzLCDigKYpIGFyZSAqKm5ldmVyKiogZXhwb3NlZCBpbiBhbnkgRFRPLlxuICogIC0gVGhlIEBwaygpIHByb3BlcnR5OlxuICogICAgICDigKIgVVBEQVRFIOKAkyBhbHdheXMgaW5jbHVkZWQuXG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBpbmNsdWRlZCBvbmx5IHdoZW4gdGhlIHBrIGlzIE5PVCBhdXRvLWdlbmVyYXRlZFxuICogICAgICAgICAgICAgICAgICAoY2hlY2tlZCB2aWEgTW9kZWwucGtQcm9wcygpLmdlbmVyYXRlZCBBTkQgTW9kZWwuZ2VuZXJhdGVkKCkpLlxuICogIC0gUmVsYXRpb24gcHJvcGVydGllcyAoQG9uZVRvT25lLCBAb25lVG9NYW55LCDigKYpOlxuICogICAgICDigKIgQ1JFQVRFICDigJMgbmVzdGVkIGFzIER0b0ZvcihDUkVBVEUsIFJlbGF0ZWRNb2RlbCkuIFdoZW4gdGhlIHJlbGF0aW9uXG4gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgKG1vZGVsIEEg4oaSIG1vZGVsIEIg4oaSIG1vZGVsIEEpLFxuICogICAgICAgICAgICAgICAgICB0aGUgYmFjay1yZWZlcmVuY2UgdXNlcyB0aGUgcmVsYXRlZCBtb2RlbCdzIFBLIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVhayB0aGUgY3ljbGUuXG4gKiAgICAgIOKAoiBVUERBVEUgIOKAkyB1bmlvbiBvZiBEdG9Gb3IoVVBEQVRFLCBSZWxhdGVkTW9kZWwpICoqb3IqKiB0aGVcbiAqICAgICAgICAgICAgICAgICAgcmVsYXRlZCBtb2RlbCdzIHByaW1hcnkta2V5IHR5cGUgKHN0cmluZyAvIGludGVnZXIpLFxuICogICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBTd2FnZ2VyIG9uZU9mLiBDaXJjdWxhciBiYWNrLXJlZmVyZW5jZXNcbiAqICAgICAgICAgICAgICAgICAgb21pdCB0aGUgRFRPICRyZWYgYW5kIG9ubHkgaW5jbHVkZSB0aGUgUEsgdHlwZS5cbiAqXG4gKiBNZXRhZGF0YS5wcm9wZXJ0aWVzKCkgbm93IHJldHVybnMgQUxMIHByb3BlcnRpZXMgYWNyb3NzIHRoZSBwcm90b3R5cGUgY2hhaW4sXG4gKiBzbyBEVE8gaW5oZXJpdGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZXZlcnkgRFRPIGlzIGEgZmxhdCBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIER0b0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBzdGFjazogU2V0PENvbnN0cnVjdG9yPGFueT4+ID0gbmV3IFNldCgpXG4pOiBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgaWYgKCFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMuaW5jbHVkZXMob3ApKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXREdG9DYWNoZShvcCk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtb2RlbCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgaXNVcGRhdGVPcCA9IFtcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgXS5pbmNsdWRlcyhvcCBhcyBhbnkpO1xuXG4gIGNsYXNzIER5bmFtaWNEVE8ge31cbiAgY2FjaGUuc2V0KG1vZGVsLCBEeW5hbWljRFRPKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTywgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYCR7dG9QYXNjYWxDYXNlKG1vZGVsLm5hbWUpfSR7dG9QYXNjYWxDYXNlKG9wKX1EVE9gLFxuICB9KTtcblxuICBjb25zdCBwa1Byb3AgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTW9kZWwucGsobW9kZWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gcGtQcm9wID8gTW9kZWwucGtQcm9wcyhtb2RlbCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa0Rlc2lnblR5cGUgPSBwa1Byb3BcbiAgICA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHBrUHJvcCBhcyBzdHJpbmcpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrVHlwZUlzTnVtZXJpYyA9XG4gICAgcGtEZXNpZ25UeXBlID09PSBOdW1iZXIgfHwgcGtEZXNpZ25UeXBlID09PSBCaWdJbnQ7XG4gIGNvbnN0IHBrSXNHZW5lcmF0ZWQgPVxuICAgICEhcGtQcm9wc01ldGFkYXRhPy5nZW5lcmF0ZWQgfHxcbiAgICAocGtQcm9wXG4gICAgICA/IE1vZGVsLmdlbmVyYXRlZEJ5U2VxdWVuY2UobW9kZWwgYXMgYW55LCBwa1Byb3AgYXMgYW55KSB8fFxuICAgICAgICBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHBrUHJvcCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHBrVHlwZUlzTnVtZXJpY1xuICAgICAgOiBmYWxzZSk7XG5cbiAgY29uc3QgYWxsUHJvcHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoTWV0YWRhdGEucHJvcGVydGllcyhtb2RlbCkgfHwgW10pKTtcbiAgY29uc3QgcmVsYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KChNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gIGNvbnN0IHNjYWxhclByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBhbGxQcm9wcykge1xuICAgIGlmICghcHJvcCkgY29udGludWU7XG4gICAgaWYgKHJlbGF0aW9ucy5oYXMocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByb3AgPT09IHBrUHJvcCAmJiAhaXNVcGRhdGVPcCAmJiBwa0lzR2VuZXJhdGVkKSBjb250aW51ZTtcbiAgICBpZiAocHJvcCAhPT0gcGtQcm9wICYmIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHNjYWxhclByb3BzLnB1c2gocHJvcCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGFyUHJvcHMpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISF2YWxpZGF0aW9uPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuICAgIGNvbnN0IHR5cGVIaW50ID1cbiAgICAgIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkgPz9cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgfTtcbiAgICBpZiAodHlwZUhpbnQpIGFwaU9wdGlvbnMudHlwZSA9IHR5cGVIaW50O1xuXG4gICAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKSA/PyB0eXBlSGludDtcbiAgICBpZiAodHlwZW9mIGRlc2lnblR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgZGVzaWduVHlwZSxcbiAgICAgICAgRHluYW1pY0RUTy5wcm90b3R5cGUsXG4gICAgICAgIHByb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSBNZXRhZGF0YS5yZWxhdGlvbnMobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgaWYgKCFyZWxhdGlvbk1ldGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNZXRhZGF0YSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9XG4gICAgICByZWxhdGlvbk1ldGEuY2xhc3MgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICBpZiAodHlwZW9mIHJlbGF0aW9uVHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICFyZWxhdGlvblR5cGUubmFtZSkge1xuICAgICAgcmVsYXRpb25UeXBlID0gKHJlbGF0aW9uVHlwZSBhcyBhbnkpKCk7XG4gICAgfVxuICAgIGlmICghcmVsYXRpb25UeXBlIHx8IHR5cGVvZiByZWxhdGlvblR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFR5cGUgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoIU1vZGVsLmdldChyZWxhdGlvblR5cGUubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGNvbnN0IGlzQXJyYXkgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5MSVNUXTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuXG4gICAgLy8gRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZTogaWYgdGhlIHJlbGF0ZWQgbW9kZWwgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAvLyByZWN1cnNpb24gc3RhY2ssIHVzZSB0aGUgUEsgdHlwZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVha1xuICAgIC8vIHRoZSBjeWNsZS4gVGhpcyBwcmV2ZW50cyBAbmVzdGpzL3N3YWdnZXIncyBTY2hlbWFPYmplY3RGYWN0b3J5IGZyb21cbiAgICAvLyBpbmZpbml0ZWx5IHJlY3Vyc2luZyB3aGVuIGV4cGxvcmluZyB0aGUgc2NoZW1hcy5cbiAgICBjb25zdCBpc0NpcmN1bGFyID0gc3RhY2suaGFzKHJlbGF0aW9uVHlwZSk7XG5cbiAgICBpZiAoaXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgICAgIGFkZFJlbGF0aW9uUGtSZWYoRHluYW1pY0RUTywgcmVsYXRpb24sIHBrVHlwZU5hbWUsIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25EdG8gPSBEdG9Gb3Iob3AsIHJlbGF0aW9uVHlwZSwgbmV3IFNldChzdGFjaykuYWRkKG1vZGVsKSk7XG5cbiAgICBpZiAoaXNVcGRhdGVPcCkge1xuICAgICAgYWRkUmVsYXRpb25VcGRhdGUoXG4gICAgICAgIER5bmFtaWNEVE8sXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICByZWxhdGlvblR5cGUsXG4gICAgICAgIHJlbGF0aW9uRHRvLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBpc1JlcXVpcmVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRSZWxhdGlvbihEeW5hbWljRFRPLCByZWxhdGlvbiwgcmVsYXRpb25EdG8sIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEeW5hbWljRFRPO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvbihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICB0eXBlOiByZWxhdGlvbkR0byxcbiAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICBpc0FycmF5LFxuICB9O1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogcmVsYXRpb25EdG8sXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHJlbGF0aW9uIHByb3BlcnR5IHRoYXQgdXNlcyB0aGUgUEsgdHlwZSAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2ZcbiAqIGEgZnVsbCBEVE8gY2xhc3MuIFVzZWQgdG8gYnJlYWsgY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBDdXN0b21lciDihpIgT3JkZXIg4oaSIEN1c3RvbWVyKS5cbiAqL1xuZnVuY3Rpb24gYWRkUmVsYXRpb25Qa1JlZihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcGtUeXBlTmFtZTogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBwa1R5cGVOYW1lIH0sIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogcGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcsIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IChwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZyksXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uVXBkYXRlKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4sXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBleHRyYU1vZGVscyA9XG4gICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsIER0b0NsYXNzKSB8fCBbXTtcbiAgaWYgKCFleHRyYU1vZGVscy5pbmNsdWRlcyhyZWxhdGlvbkR0bykpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLFxuICAgICAgWy4uLmV4dHJhTW9kZWxzLCByZWxhdGlvbkR0b10sXG4gICAgICBEdG9DbGFzc1xuICAgICk7XG4gIH1cblxuICBjb25zdCBkdG9SZWYgPSBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHtyZWxhdGlvbkR0by5uYW1lfWA7XG4gIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gIGNvbnN0IG9uZU9mSXRlbXMgPSBbeyAkcmVmOiBkdG9SZWYgfSwgeyB0eXBlOiBwa1R5cGVOYW1lIH1dO1xuXG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpO1xuXG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiBPYmplY3QsXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBNb2RlbC5wa1Byb3BzKHJlbGF0aW9uVHlwZSBhcyBhbnkpO1xuICAgIGNvbnN0IHBrVHlwZSA9IHBrUHJvcHNNZXRhZGF0YT8udHlwZTtcbiAgICBpZiAocGtUeXBlID09PSBOdW1iZXIgfHwgcGtUeXBlID09PSBCaWdJbnQpIHJldHVybiBcImludGVnZXJcIjtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBpZiAoTW9kZWwuZ2VuZXJhdGVkKGN1cnJlbnQsIHByb3AgYXMgYW55KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IoY3VycmVudCwgcHJvcCBhcyBhbnkpO1xuICAgIGlmICh2YWxpZGF0aW9uKSByZXR1cm4gdmFsaWRhdGlvbiBhcyBhbnk7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZyk6IGFueSB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoY3VycmVudCwgcHJvcCk7XG4gICAgaWYgKHR5cGUpIHJldHVybiB0eXBlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RHRvQ2FjaGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzXG4pOiBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+IHtcbiAgaWYgKCFkdG9DYWNoZS5oYXMob3ApKSB7XG4gICAgZHRvQ2FjaGUuc2V0KG9wLCBuZXcgV2Vha01hcCgpKTtcbiAgfVxuICByZXR1cm4gZHRvQ2FjaGUuZ2V0KG9wKSE7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IENvbnRyb2xsZXIsIFBhcmFtLCBRdWVyeSwgUmVzcG9uc2UsIFNldE1ldGFkYXRhIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UsXG4gIEFwaUJvZHksXG4gIEFwaUNyZWF0ZWRSZXNwb25zZSxcbiAgQXBpRXh0cmFNb2RlbHMsXG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbiAgQXBpVGFncyxcbiAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlLFxuICBnZXRTY2hlbWFQYXRoLFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgdHlwZSBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgREJLZXlzLFxuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuLi9hdXRoL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aCwgUHVibGljLCBSZXF1aXJlUm9sZXMgfSBmcm9tIFwiLi4vYXV0aC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgQXV0aENvbmZpZyxcbiAgdHlwZSBTZXJ2ZXJSb3V0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEZyb21Nb2RlbENvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIHRvRGVjYWZFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuICApOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBNb2RlbENvbnN0cjogQ29uc3RydWN0b3IgPSByZXBvLmNsYXNzO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgcGFyYW1zXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcGFyYW1zLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIildXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQ6IHN0cmluZykgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHBhcmFtcy5odHRwTWV0aG9kIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgcGFyYW1zLmh0dHBNZXRob2RcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVlcnlDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4sXG4gICAgZ2xvYmFsRGVmYXVsdHM/OiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihnbG9iYWxEZWZhdWx0cyB8fCB7fSksXG4gICAgICAuLi4oZGVjb3JhdG9yQ29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLihtb2R1bGVPdmVycmlkZSB8fCB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IEZhY3RvcnlDb250cm9sbGVyID0gTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGU8VD4oXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZSxcbiAgICAgIG1lcmdlZENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgZmFjdG9yeVJvdXRlcyA9IChGYWN0b3J5Q29udHJvbGxlciBhcyBhbnkpLl9fcm91dGVzX18gYXNcbiAgICAgIHwgU2VydmVyUm91dGVbXVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7IGdldFBLLCBhcGlQcm9wZXJ0aWVzLCBwYXRoOiBwa1BhdGggfSA9XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudClcbiAgICAgICAgICByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWRSb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IHJvdXRlLmltcGxlbWVudGF0aW9uPy5uYW1lIHx8IHJvdXRlLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBmYWN0b3J5UGVyc2lzdGVuY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtZXRob2ROYW1lOiByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICAgcGFyYW1EZWNvcmF0b3JzLFxuICAgICAgICB9ID0gcmVnaXN0cmF0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHJvdXRlLm1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICAgICAgcm91dGUucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdLFxuICAgICAgICAgICAgcGFyYW1EZWNvcmF0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXTtcbiAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKE1vZGVsQ2xhenopIGFzIGtleW9mIE1vZGVsPGFueT47XG4gICAgY29uc3QgY29tcG9zZWQgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENsYXp6LFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5DT01QT1NFRCwgcGspXG4gICAgKTtcbiAgICBjb25zdCBjb21wb3NlZEtleXMgPSBjb21wb3NlZD8uYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPVxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb3NlZEtleXMpICYmIGNvbXBvc2VkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jb21wb3NlZEtleXNdKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoW3BrXSkpO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6KSA/PyBcIlwiO1xuICAgIGNvbnN0IHBhdGggPSBgOiR7dW5pcXVlS2V5cy5qb2luKFwiLzpcIil9YDtcbiAgICBjb25zdCBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10gPSB1bmlxdWVLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6LCBrZXkpLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+XG4gICAgICAgIGNvbXBvc2VkPy5zZXBhcmF0b3IgPyBwYXJhbXMuam9pbihjb21wb3NlZC5zZXBhcmF0b3IpIDogcGFyYW1zLmpvaW4oXCJcIiksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJvdXRlUGFyYW1EZWNvcmF0b3JzKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBsZXQgcGFyYW1JbmRleCA9IDA7XG4gICAgcmV0dXJuIHBhdGhcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5mbGF0TWFwKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmaW5lTWV0aG9kKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdXG4gICkge1xuICAgIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2ROYW1lKTtcbiAgICBtZXRob2REZWNvcmF0b3JzLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgICBwYXJhbURlY29yYXRvcnMuZm9yRWFjaCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+XG4gICAgICBkZWNvcmF0b3IocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaFJvdXRlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZTogU2VydmVyUm91dGUsXG4gICAgcGtQYXRoOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwZXJzaXN0ZW5jZT86IGFueVxuICApOiB7XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+O1xuICB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbiBhcyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrUmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1VwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrRGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2VkIFBLIGZhbGxiYWNrIHJvdXRlcyAoZmlsdGVyRW1wdHkpIOKAlCBwYXRoIGRpZmZlcnMgZnJvbSBwa1BhdGhcbiAgICBjb25zdCBmYWxsYmFja1NlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpc0FsbFBhcmFtcyA9IGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJiBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9IEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCArIDEsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYGRlbGV0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcIm1ldGhvZFwiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwiYXJnc1wiKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQllcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICAgIFwicGFnaW5hdGVCeS86a2V5LzpwYWdlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLFxuICAgICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgICBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksXG4gICAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICAgIFwiY291bnRPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLFxuICAgICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgICBcImF2Z09mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GLFxuICAgICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgICAgXCJncm91cE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEtleSA9IHN0YXRlbWVudFJvdXRlc1tub3JtYWxpemVkUGF0aF07XG4gICAgaWYgKHN0YXRlbWVudEtleSAmJiBtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRNZXRob2ROYW1lKG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBub3JtYWxpemVkUGF0aCwgc3RhdGVtZW50S2V5KSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBjb25zdCBxdWVyeU1ldGhvZCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKHF1ZXJ5TWV0aG9kLCBub3JtYWxpemVkUGF0aCwgXCJHRVRcIiwgdHJ1ZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIiwgXCJmaW5kQnlcIiwgXCJmaW5kQnlQYWdpbmF0ZVwiLCBcImZpbmRPbmVCeVwiLCBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLCBcInBhZ2VcIiwgXCJjb3VudE9mXCIsIFwibWF4T2ZcIiwgXCJtaW5PZlwiLCBcImF2Z09mXCIsIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLCBcImdyb3VwT2ZcIiwgXCJzdGF0ZW1lbnRcIiwgXCJidWxrXCIsIFwicXVlcnlcIixcbiAgICBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwic3RhdGVtZW50L1wiKSAmJlxuICAgICAgIWtub3duUHJlZml4ZXMuaGFzKHBhdGhTZWdtZW50c1swXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBwYXRoU2VnbWVudHNcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgW1xuICAgICAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGUpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGUoZGF0YSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KGNyZWF0ZWQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrQ3JlYXRlSGFuZGxlcihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGRhdGE6IGFueVtdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGVBbGwpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGVBbGwoXG4gICAgICAgICAgZGF0YS5tYXAoKGQpID0+IG5ldyBNb2RlbENvbnN0cihkKSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZEFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWRBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHtub3JtYWxpemVkSWRzfSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWRBbGwobm9ybWFsaXplZElkcyBhcyBhbnksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgYm9keTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGVBbGwpO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7Ym9keS5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlQWxsKGJvZHksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSAke21vZGVsQ2xhenpOYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrRGVsZXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGRlbGV0ZUFsbCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRzID0gQXJyYXkuaXNBcnJheShpZHMpID8gaWRzIDogW2lkc107XG4gICAgICBsZXQgcmVhZDogTW9kZWxbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgZGVsZXRpbmcgJHtub3JtYWxpemVkSWRzLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5kZWxldGVBbGwobm9ybWFsaXplZElkcywgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlYWRIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKVxuICAgICAgKS5mb3IocmVhZCk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHJlYWRSZXN1bHQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICByZWFkUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWQoaWQsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhyZWFkUmVzdWx0IGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICByZXR1cm4gcmVhZFJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVXBkYXRlSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICBib2R5OiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuVVBEQVRFLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlKFxuICAgICAgICAgIG5ldyBNb2RlbENvbnN0cih7IC4uLnBheWxvYWQsIFt0aGlzLnBrXTogaWQgfSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZURlbGV0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlbW92ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IGRlbDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBkZWwgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gZGVsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc3RhdGVtZW50KFxuICAgICAgdGhpczogYW55LFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIGRldGFpbHM6IERpcmVjdGlvbkxpbWl0T2Zmc2V0XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICAgKS5mb3Ioc3RhdGVtZW50KTtcbiAgICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBvZmZzZXQsIGxpbWl0LCBib29rbWFyayB9ID0gZGV0YWlscztcbiAgICAgIGFyZ3MgPSBhcmdzLm1hcChcbiAgICAgICAgKGEpID0+ICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KGEgYXMgc3RyaW5nKSA6IGEpIHx8IGFcbiAgICAgICkgYXMgYW55W107XG4gICAgICBjb25zdCBwYXRoRGlyZWN0aW9uID0gYXJncy5sZW5ndGggPiAxID8gYXJnc1sxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc29sdmVkRGlyZWN0aW9uID0gKGRpcmVjdGlvbiA/PyBwYXRoRGlyZWN0aW9uKSBhc1xuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNvbHZlZERpcmVjdGlvbiAmJiBhcmdzLmxlbmd0aCA+IDEpIGFyZ3NbMV0gPSByZXNvbHZlZERpcmVjdGlvbjtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24gYXMgc3RyaW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgICBhcmdzID0gW1xuICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgIHJlc29sdmVkRGlyZWN0aW9uIGFzIGFueSxcbiAgICAgICAgICAgIHsgbGltaXQsIG9mZnNldCwgYm9va21hcmsgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQobmFtZSwgLi4uYXJncywgY3R4KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyKFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudFNob3J0Y3V0KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIHN0YXRlbWVudEtleSwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudFNob3J0Y3V0KTtcblxuICAgICAgc3dpdGNoIChzdGF0ZW1lbnRLZXkpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmxpc3RCeShcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHBhZ2UsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnBhZ2luYXRlQnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCxcbiAgICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQsXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDoge1xuICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9XG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gPz8gT3JkZXJEaXJlY3Rpb24uQVNDO1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2UuZmluZCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLmZpbmQodmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB2YWx1ZSwgZGlyZWN0aW9uLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCByZWYgPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IChkZXRhaWxzIGFzIGFueSk/Lm9mZnNldCA/PyAxLFxuICAgICAgICAgICAgbGltaXQ6IChkZXRhaWxzIGFzIGFueSk/LmxpbWl0ID8/IDEwLFxuICAgICAgICAgICAgYm9va21hcms6IChkZXRhaWxzIGFzIGFueSk/LmJvb2ttYXJrLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnBhZ2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5wYWdlKHZhbHVlLCBkaXJlY3Rpb24sIHJlZiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLCB2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZmluZE9uZUJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KVxuICAgICAgICAgICAgLmZvcihjdHgudG9PdmVycmlkZXMoKSlcbiAgICAgICAgICAgIC5maW5kQnkoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgW2ZpZWxkXSA9IGFyZ3M7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnN0YXRlbWVudChzdGF0ZW1lbnRLZXksIGZpZWxkLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5rbm93biBzdGF0ZW1lbnQ6ICR7c3RhdGVtZW50S2V5fWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICAgKS5mb3IoY29tcGxleFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLm5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5xdWVyeSAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucXVlcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5xdWVyeShtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjdXN0b21Sb3V0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgKS5mb3IoY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5ub3JtYWxpemVRdWVyeUFyZ3MoYXJncyk7XG5cbiAgICAgIC8vIFRyeSB0aGUgcGVyc2lzdGVuY2UgZGlyZWN0bHkgKHdvcmtzIHdoZW4gaXQncyBhIGN1c3RvbSBSZXBvc2l0b3J5KVxuICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXRlbWVudCBnYXRld2F5XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX0gb3IgaXRzIHJlcG9gXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0UXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFyZ3M7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBpZiAoXG4gICAgICBsYXN0ICYmXG4gICAgICB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkobGFzdClcbiAgICApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFtub3JtYWxpemVkLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdCB8fCB0eXBlb2YgbGFzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeU9iaiA9IGxhc3QgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBoYXNRdWVyeUZpZWxkcyA9XG4gICAgICBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWhhc1F1ZXJ5RmllbGRzKSB7XG4gICAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICBpZiAocXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgIGlmIChxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgIGlmIChxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5ib29rbWFyayk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oeyBuYW1lOiBcIm1ldGhvZFwiLCBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIiB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJhcmdzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGxpc3RlZCBmb3VuZC5gIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBiYXNlOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwYXRoKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImJvb2ttYXJrXCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiYm9va21hcmsgZm9yIGN1cnNvciBwYWdpbmF0aW9uXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogTnVtYmVyIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GKSB7XG4gICAgICBiYXNlLnB1c2goQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgRGlzdGluY3QgdmFsdWVzIGZvciAke21vZGVsQ2xhenpOYW1lfS5gLCB0eXBlOiBbU3RyaW5nXSB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHAuc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIiB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGcm9tTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4vRnJvbU1vZGVsQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlRm9yKGZsYXZvdXI6IHN0cmluZykge1xuICBATW9kdWxlKHt9KVxuICBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZNb2RlbE1vZHVsZS5uYW1lKS5mb3IoZmxhdm91cik7XG5cbiAgICBzdGF0aWMgY3JlYXRlTW9kZWxTZXJ2aWNlczxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgICAgbW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPFQ+W11cbiAgICApOiBQcm92aWRlcltdIHtcbiAgICAgIHJldHVybiBtb2RlbHMubWFwKChtb2RlbCkgPT4gKHtcbiAgICAgICAgcHJvdmlkZTogYCR7bW9kZWwubmFtZX1TZXJ2aWNlYCxcbiAgICAgICAgdXNlRmFjdG9yeTogKCkgPT4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRXhwb3NlZChcbiAgICAgIG1vZGVsOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBleHBvc3VyZT86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmdbXT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXhwb3N1cmU/Llttb2RlbC5uYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgdHlwZW9mIG92ZXJyaWRlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyBvdmVycmlkZVxuICAgICAgICAgIDogTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoREVDQUZfRVhQT1NFKSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZsYXZvdXIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JSb290KFxuICAgICAgZmxhdm91cjogc3RyaW5nLFxuICAgICAgb3B0aW9uczogUGFydGlhbDxEZWNhZk1vZHVsZU9wdGlvbnM+ID0ge31cbiAgICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpLmZpbHRlcigobW9kZWwpID0+XG4gICAgICAgIHRoaXMuaXNFeHBvc2VkKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnRyb2xsZXJzIGFsd2F5cyByZWx5IG9uIGEgYmFja2luZyBNb2RlbFNlcnZpY2UsIGV2ZW4gd2hlbiBOZXN0IHByb3ZpZGVyc1xuICAgICAgLy8gYXJlIG5vdCBhdXRvLXJlZ2lzdGVyZWQuIFdhcm0gdGhlIHNpbmdsZXRvbiByZWdpc3RyeSBoZXJlIHNvIHNodXRkb3duIGNhblxuICAgICAgLy8gc2VlIHRoZSBsaXZlIHNlcnZpY2VzIGNyZWF0ZWQgZm9yIHRoZSBnZW5lcmF0ZWQgY29udHJvbGxlcnMuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRyYWNrZWRNb2RlbHMpIE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpO1xuXG4gICAgICBsZXQgbW9kZWxTZXJ2aWNlczogUHJvdmlkZXJbXSA9IFtdO1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1NlcnZpY2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiQXV0by1zZXJ2aWNlcyBlbmFibGVkLiBJbml0aWFsaXppbmcgc2VydmljZSBnZW5lcmF0aW9uLlwiKTtcbiAgICAgICAgbW9kZWxTZXJ2aWNlcyA9IHRoaXMuY3JlYXRlTW9kZWxTZXJ2aWNlcyh0cmFja2VkTW9kZWxzKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYEF1dG8tc2VydmljZXMgY29tcGxldGVkLiAke21vZGVsU2VydmljZXMubGVuZ3RofSBzZXJ2aWNlcyBpbml0aWFsaXplZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdsb2JhbERlZmF1bHRzOiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+ID0ge307XG4gICAgICBpZiAob3B0aW9ucy5hZ2dyZWdhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGdsb2JhbERlZmF1bHRzLmFsbG93R3JvdXBpbmdRdWVyaWVzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAoKG1vZGVsKSA9PlxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZShtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLCBnbG9iYWxEZWZhdWx0cylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBJbmplY3QgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBpbmplY3RhYmxlU2VydmljZUtleSxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvc2l0b3J5IGFzIENvcmVSZXBvc2l0b3J5LFxuICBTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkZhY3RvcnlQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogc3RyaW5nO1xuICB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duO1xufTtcblxuY29uc3QgcGVuZGluZ1Byb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWNhZkZhY3RvcnlQcm92aWRlcj4oKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRHJhaW5zIHRoZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgU2VydmljZX0ve0BsaW5rIFJlcG9zaXRvcnl9IHVzYWdlcy5cbiAqIEBzdW1tYXJ5IENvbnN1bWVkIGJ5IHtAbGluayBEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdH0gdG8gd2lyZSB0aGUgdG9rZW5zIHRoYXQgdGhvc2UgcGFyYW1ldGVyXG4gKiBkZWNvcmF0b3JzIHJlZmVyZW5jZSBiYWNrIGludG8gTmVzdCdzIERJIGNvbnRhaW5lciwgc2luY2UgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIGFsb25lIGNhbm5vdFxuICogc3VwcGx5IGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTogRGVjYWZGYWN0b3J5UHJvdmlkZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBlbmRpbmdQcm92aWRlcnMudmFsdWVzKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHRva2VuOiBzdHJpbmcsIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBlbmRpbmdQcm92aWRlcnMuaGFzKHRva2VuKSkgcmV0dXJuO1xuICBwZW5kaW5nUHJvdmlkZXJzLnNldCh0b2tlbiwgeyBwcm92aWRlOiB0b2tlbiwgdXNlRmFjdG9yeSB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RlbENvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc3RydWN0b3I8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBNb2RlbDtcbn1cblxuZnVuY3Rpb24gbW9kZWxTZXJ2aWNlVG9rZW4obW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bW9kZWwubmFtZX1TZXJ2aWNlYDtcbn1cblxuZnVuY3Rpb24gbW9kZWxSZXBvc2l0b3J5VG9rZW4oXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZmxhdm91ciA/IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeUAke2ZsYXZvdXJ9YCA6IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeWA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYgc2VydmljZS5cbiAqIEBzdW1tYXJ5IFRyYW5zbGF0ZXMgZGVjYWYncyBzZXJ2aWNlIHJlc29sdXRpb24gQVBJcyBpbnRvIGEgTmVzdCBgQEluamVjdCgpYCBjYWxsOlxuICogLSBgQFNlcnZpY2UoU29tZU1vZGVsKWAgaW5qZWN0cyB0aGUgYE1vZGVsU2VydmljZTxTb21lTW9kZWw+YCBzaW5nbGV0b24gZm9yIHRoYXQgbW9kZWxcbiAqICAgKHZpYSB7QGxpbmsgTW9kZWxTZXJ2aWNlLmZvck1vZGVsfSkuXG4gKiAtIGBAU2VydmljZShTb21lU2VydmljZUNsYXNzKWAgb3IgYEBTZXJ2aWNlKFwiYWxpYXNcIilgIGluamVjdHMgdGhlIG1hdGNoaW5nIGBAc2VydmljZSgpYC1kZWNvcmF0ZWRcbiAqICAgZGVjYWYge0BsaW5rIENvcmVTZXJ2aWNlfSAodmlhIHtAbGluayBDb3JlU2VydmljZS5nZXR9KS5cbiAqIC0gYEBTZXJ2aWNlKClgIGluZmVycyB0aGUgcGFyYW1ldGVyJ3MgdHlwZSBmcm9tIGVtaXR0ZWQgY29uc3RydWN0b3IgbWV0YWRhdGEgYW5kIHJlc29sdmVzIGl0IHRoZVxuICogICBzYW1lIHdheSwgcHJvdmlkZWQgdGhlIHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIGNvbmNyZXRlIGNsYXNzIChnZW5lcmljcyBsaWtlIGBNb2RlbFNlcnZpY2U8WD5gXG4gKiAgIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgc28gdGhlIG1vZGVsLXNlcnZpY2UgZm9ybSBhbHdheXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgYXJndW1lbnQpLlxuICogQHBhcmFtIGtleSB0aGUgbW9kZWwgY2xhc3MsIHNlcnZpY2UgY2xhc3MsIG9yIGFsaWFzIHRvIHJlc29sdmUuIE9taXQgdG8gaW5mZXIgZnJvbSB0aGUgcGFyYW1ldGVyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXJ2aWNlKGtleT86IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPSBrZXk7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgcGFyYW1UeXBlczogYW55W10gPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIHJlc29sdmVkID0gcGFyYW1UeXBlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQFNlcnZpY2UoKSBjb3VsZCBub3QgZGV0ZXJtaW5lIGFuIGluamVjdGlvbiB0eXBlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH0gb2YgJHsodGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4pLm5hbWV9LiBQcm92aWRlIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCBlLmcuIEBTZXJ2aWNlKFNvbWVTZXJ2aWNlKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFzTW9kZWwgPSB0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgJiYgaXNNb2RlbENvbnN0cnVjdG9yKHJlc29sdmVkKTtcbiAgICBjb25zdCB0b2tlbiA9IGFzTW9kZWxcbiAgICAgID8gbW9kZWxTZXJ2aWNlVG9rZW4ocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55PilcbiAgICAgIDogaW5qZWN0YWJsZVNlcnZpY2VLZXkocmVzb2x2ZWQgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik7XG5cbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiB7XG4gICAgICBpZiAoYXNNb2RlbCkgcmV0dXJuIE1vZGVsU2VydmljZS5mb3JNb2RlbChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQpXG4gICAgICAgIDogQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHtAbGluayBDb3JlUmVwb3NpdG9yeX0gZm9yIGBtb2RlbGAuXG4gKiBAc3VtbWFyeSBVbmxpa2Uge0BsaW5rIFNlcnZpY2V9LCBgbW9kZWxgIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGEgTW9kZWwgY2xhc3M6IHRoZSBzYW1lIGNsYXNzIHBhc3NlZFxuICogdG8gYEBTZXJ2aWNlKG1vZGVsKWAgYW5kIGBAUmVwb3NpdG9yeShtb2RlbClgIHJlc29sdmVzIHRvIHR3byBkaWZmZXJlbnQgaW5qZWN0ZWQgb2JqZWN0cyAoYVxuICogYE1vZGVsU2VydmljZTxNPmAgdnMgYSBgUmVwb3NpdG9yeTxNPmAgcmVzcGVjdGl2ZWx5KSwgdmlhIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGNsYXNzIHRvIHJlc29sdmUgYSByZXBvc2l0b3J5IGZvci5cbiAqIEBwYXJhbSBmbGF2b3VyIG9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcywgZm9yd2FyZGVkIHRvIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXBvc2l0b3J5KFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBtb2RlbFJlcG9zaXRvcnlUb2tlbihtb2RlbCwgZmxhdm91cik7XG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4gQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWwsIGZsYXZvdXIpKTtcbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEeW5hbWljTW9kdWxlLFxuICBHbG9iYWwsXG4gIEluamVjdCxcbiAgTW9kdWxlLFxuICBPbkFwcGxpY2F0aW9uU2h1dGRvd24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SLCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUNBRl9BREFQVEVSX0lELFxuICBERUNBRl9IQU5ETEVSUyxcbiAgREVDQUZfTU9EVUxFX09QVElPTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlU2VydmljZSwgU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG4gIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxDT05GLCBBREFQVEVSIGV4dGVuZHMgQWRhcHRlcjxDT05GLCBhbnksIGFueSwgYW55Pj5cbiAgaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByaXZhdGUgc3RhdGljIF9wZXJzaXN0ZW5jZT86IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IHBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJQZXJzaXN0ZW5jZSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikgdGhpcy5fbG9nZ2VyID0gTG9nZ2luZy5mb3IoRGVjYWZDb3JlTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9NT0RVTEVfT1BUSU9OUylcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uczxDT05GLCBBREFQVEVSPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlZjogTW9kdWxlUmVmXG4gICkge31cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBjb25zdCBkZWNhZlByb3ZpZGVycyA9IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQ29yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX0FEQVBURVJfSUQsIHVzZVZhbHVlOiB0aGlzLnBlcnNpc3RlbmNlPy5jbGllbnQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBvcHRpb25zLmhhbmRsZXJzPy5tYXAoKEgpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oYFJlZ2lzdGVyZWQgcmVxdWVzdCBoYW5kbGVyOiAke0gubmFtZX1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIKCk7XG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMsXG4gICAgICBdLFxuICAgICAgZXhwb3J0czogW1xuICAgICAgICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbiAgICAgICAgREVDQUZfQURBUFRFUl9JRCxcbiAgICAgICAgREVDQUZfSEFORExFUlMsXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycy5tYXAoKHByb3ZpZGVyKSA9PiBwcm92aWRlci5wcm92aWRlKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBib290UGVyc2lzdGVuY2UoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290UGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IG9wdGlvbnMuY29uZi5tYXAoKFtjb250ciwgY2ZnLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghcG9zc2libGUpIHJldHVybiBbY29udHIsIGNmZ107XG4gICAgICAgIHJldHVybiBbY29udHIsIGNmZywgLi4uYXJnc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fcGVyc2lzdGVuY2UuYm9vdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLl9wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IG9wdGlvbnMuY29uZltpXTtcbiAgICAgICAgY29uc3QgcG9zc2libGVUcmFuc2YgPSBjLnNsaWNlKDIsIGMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVyID0gcG9zc2libGVUcmFuc2YucG9wKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdHJhbnNmb3JtZXIgfHxcbiAgICAgICAgICAhKHRyYW5zZm9ybWVyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihjbGllbnRzW2ldLmZsYXZvdXIpO1xuICAgICAgICAgIGlmICghY29udHIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHRyYW5zZm9ybWVyIGZvdW5kIGZvciBmbGF2b3VyICR7Y2xpZW50c1tpXS5mbGF2b3VyfS4geW91IHNob3VsZCBlaXRoZXIgQHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciBvciBwcm92aWRlIGEgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gKGNvbnRyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICAgICAgID8gY29udHJcbiAgICAgICAgICAgICAgOiBuZXcgKGNvbnRyIGFzIENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+PikoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBib290IHRyYW5zZm9ybWVyIGZvciAke2NsaWVudHNbaV0uZmxhdm91cn06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIoY2xpZW50c1tpXS5mbGF2b3VyKSh0cmFuc2Zvcm1lcik7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhcInBlcnNpc3RlbmNlIGxheWVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbGl6YXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIG9uQXBwbGljYXRpb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBEZWNhZkNvcmVNb2R1bGUubG9nLmZvcih0aGlzLm9uQXBwbGljYXRpb25TaHV0ZG93bik7XG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIHRoaXMubW9kdWxlUmVmLmdldDxhbnk+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJnZXRPclVuZGVmaW5lZCIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIlVuc3VwcG9ydGVkRXJyb3IiLCJleHRyYWN0UGF0aFBhcmFtcyIsInJvdXRlUGF0aCIsInNwbGl0Iiwic2xpY2UiLCJhcGlQYXJhbVNwZWMiLCJ0b0RlY2FmRXJyb3IiLCJlcnJvciIsImZhbGxiYWNrTWVzc2FnZSIsIkJhc2VFcnJvciIsIkludGVybmFsRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJnZXRBcGlEZWNvcmF0b3JzIiwibWV0aG9kTmFtZSIsImh0dHBWZXJiIiwiaW5jbHVkZVF1ZXJ5UGFyYW1zIiwiTmVzdEh0dHBSb3V0ZURlYyIsImFwaVBhdGhQYXJhbXMiLCJzd2FnZ2VyUXVlcnlQYXJhbXMiLCJBcGlRdWVyeSIsIk9yZGVyRGlyZWN0aW9uIiwibWV0aG9kIiwiQXBpUGFyYW0iLCJBcGlPcGVyYXRpb24iLCJzdW1tYXJ5IiwiQXBpT2tSZXNwb25zZSIsIkFwaU5vQ29udGVudFJlc3BvbnNlIiwiUXVlcnkiLCJhcHBseUFwaURlY29yYXRvcnMiLCJwcm90byIsImZvckVhY2giLCJkIiwiaW5kZXgiLCJyZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QiLCJwZXJzaXN0ZW5jZSIsImFyZ3MiLCJNb2RlbFNlcnZpY2UiLCJzdGF0ZW1lbnQiLCJjcmVhdGVSb3V0ZUhhbmRsZXIiLCJhc3luYyIsInBhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXJlY3Rpb24iLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJBUFBfSU5URVJDRVBUT1IiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yXzEiLCJoYW5kbGVycyIsImNvbnRleHQiLCJleGVjIiwicmVzIiwidXJsIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJ0b1Jlc3BvbnNlIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsInJlbGF0aW9uVHlwZSIsIm1ldGEiLCJ2YWxpZGF0aW9uRm9yIiwiTElTVCIsImlzQ2lyY3VsYXIiLCJwa1R5cGVOYW1lIiwiZ2V0UGtPcGVuQXBpVHlwZSIsImFkZFJlbGF0aW9uUGtSZWYiLCJyZWxhdGlvbkR0byIsImFkZCIsImFkZFJlbGF0aW9uVXBkYXRlIiwiYWRkUmVsYXRpb24iLCJEdG9DbGFzcyIsImV4dHJhTW9kZWxzIiwiZHRvUmVmIiwib25lT2ZJdGVtcyIsIiRyZWYiLCJvbmVPZiIsInBrVHlwZSIsImN1cnJlbnQiLCJGdW5jdGlvbiIsImdldFByb3RvdHlwZU9mIiwiV2Vha01hcCIsInRvQ29udGV4dEZsYWdzIiwiYWRhcHRlciIsImFsaWFzIiwiYmluZCIsInJlcXVlc3RUcmFuc2Zvcm1lcnMiLCJDb250ZXh0IiwicGVuZGluZyIsImhlYWRlciIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJzZWdtZW50IiwidHJpbSIsImpvaW4iLCJjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyIiwiZGVmaW5lTWV0aG9kIiwiaHR0cERlY29yYXRvciIsImh0dHBNZXRob2QiLCJnZXRRdWVyeURlY29yYXRvcnMiLCJvYmpWYWx1ZXMiLCJmaWVsZHMiLCJmIiwiY3JlYXRlIiwibW9kdWxlQ29uZmlnT3ZlcnJpZGVzIiwiZ2xvYmFsRGVmYXVsdHMiLCJ0YWJsZU5hbWUiLCJ0b0tlYmFiQ2FzZSIsIm1vZGVsQ2xhenpOYW1lIiwiZmFjdG9yeVBlcnNpc3RlbmNlIiwiZGVjb3JhdG9yQ29uZmlnIiwibW9kdWxlT3ZlcnJpZGUiLCJtZXJnZWRDb25maWciLCJGYWN0b3J5Q29udHJvbGxlciIsIk1vZGVsQ29udHJvbGxlckZhY3RvcnkiLCJmYWN0b3J5Um91dGVzIiwiX19yb3V0ZXNfXyIsImdldFBLIiwiYXBpUHJvcGVydGllcyIsInBrUGF0aCIsImdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbCIsImF1dGhDb25maWciLCJhdXRoIiwiYXBwbHlDbGFzc0F1dGgiLCJwdWJsaWMiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyIiwiRHluYW1pY01vZGVsQ29udHJvbGxlcl8xIiwiaW5mbyIsIkNvbnRyb2xsZXIiLCJBcGlUYWdzIiwiQXBpRXh0cmFNb2RlbHMiLCJzb3J0ZWRSb3V0ZXMiLCJzb3J0IiwiYSIsImIiLCJhU2VnbWVudHMiLCJCb29sZWFuIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwiaW1wbGVtZW50YXRpb24iLCJ0b0xvd2VyQ2FzZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJyZWdpc3RlcmVkTWV0aG9kTmFtZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwicm91dGVQYXJhbURlY29yYXRvcnMiLCJwYXJhbUluZGV4IiwiZmxhdE1hcCIsIlBhcmFtIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyIsIlJlc3BvbnNlIiwicGFzc3Rocm91Z2giLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiYnVsa0RlbGV0ZURlY29yYXRvcnMiLCJyZWFkRGVjb3JhdG9ycyIsInJvdXRlUGFyYW1zIiwidXBkYXRlRGVjb3JhdG9ycyIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJzdGF0ZW1lbnREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXRQYXJhbXMiLCJzdGF0ZW1lbnRSb3V0ZXMiLCJzdGF0ZW1lbnRLZXkiLCJzdGF0ZW1lbnRNZXRob2ROYW1lIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwiZmlyc3RTZWdtZW50Iiwic2VnbWVudHMiLCJzZWciLCJpIiwiY3JlYXRlQ3JlYXRlSGFuZGxlciIsInJlc3AiLCJsb2dDdHgiLCJjcmVhdGVkIiwiY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIiLCJjcmVhdGVBbGwiLCJjcmVhdGVCdWxrUmVhZEhhbmRsZXIiLCJyZWFkQWxsIiwiaWRzIiwibm9ybWFsaXplZElkcyIsInJlYWQiLCJjcmVhdGVCdWxrVXBkYXRlSGFuZGxlciIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJjcmVhdGVCdWxrRGVsZXRlSGFuZGxlciIsImRlbGV0ZUFsbCIsImNyZWF0ZVJlYWRIYW5kbGVyIiwiaWQiLCJWYWxpZGF0aW9uRXJyb3IiLCJyZWFkUmVzdWx0IiwiY3JlYXRlVXBkYXRlSGFuZGxlciIsInVwZGF0ZSIsInBheWxvYWQiLCJwYXJzZSIsImNyZWF0ZURlbGV0ZUhhbmRsZXIiLCJyZW1vdmUiLCJkZWwiLCJkZWxldGUiLCJjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyIiwiZGV0YWlscyIsIlNUQVRFTUVOVCIsInBhcnNlSW50IiwicGF0aERpcmVjdGlvbiIsInJlc29sdmVkRGlyZWN0aW9uIiwiY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyIiwic3RhdGVtZW50U2hvcnRjdXQiLCJsaXN0QnkiLCJwYWdlIiwicGFnaW5hdGVCeSIsIkFTQyIsImZpbmQiLCJyZWYiLCJmaW5kT25lQnkiLCJmaW5kQnkiLCJmaWVsZCIsImNvbXBsZXhRdWVyeSIsInNwcmVhZEFyZ3MiLCJub3JtYWxpemVRdWVyeUFyZ3MiLCJjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIiLCJjdXN0b21Sb3V0ZSIsImV4dHJhY3RRdWVyeUFyZ3MiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsImhhc1F1ZXJ5RmllbGRzIiwiQXBpQm9keSIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsInNjaGVtYSIsImdldFNjaGVtYVBhdGgiLCJBcGlCYWRSZXF1ZXN0UmVzcG9uc2UiLCJBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiYmFzZSIsImdldE1vZHVsZUZvciIsIkRlY2FmTW9kZWxNb2R1bGUiLCJEZWNhZk1vZGVsTW9kdWxlXzEiLCJjcmVhdGVNb2RlbFNlcnZpY2VzIiwibW9kZWxzIiwidXNlRmFjdG9yeSIsImlzRXhwb3NlZCIsImV4cG9zdXJlIiwidHJhY2tlZE1vZGVscyIsImNvbnRyb2xsZXJFeHBvc3VyZSIsIm1vZGVsU2VydmljZXMiLCJhdXRvU2VydmljZXMiLCJhZ2dyZWdhdGlvbnMiLCJhbGxvd0dyb3VwaW5nUXVlcmllcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkRlY2FmRXhjZXB0aW9uRmlsdGVyIiwiZXhjZXB0aW9uIiwiaG9zdCIsImlzUHJvZHVjdGlvbiIsIkxvZ2dlZEVudmlyb25tZW50IiwiZW52Iiwic3RhdHVzQ29kZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiTm90QWNjZXB0YWJsZUV4Y2VwdGlvbiIsImdldFN0YXR1cyIsInN0YXR1cyIsImNvZGUiLCJqc29uIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQ2F0Y2giLCJVc2VEZWNhZkZpbHRlciIsIlVzZUZpbHRlcnMiLCJVc2VEZWNhZkhlYWRlcnMiLCJTV0FHR0VSX1VJX0NPTlNUQU5UUyIsInRpdGxlIiwidmVyc2lvbiIsImZhdmljb25GaWxlUGF0aCIsInRvcGJhckljb25GaWxlUGF0aCIsInNjaGVtZSIsImJlYXJlckZvcm1hdCIsImluIiwicGVyc2lzdEF1dGhvcml6YXRpb24iLCJ0b3BiYXJCZ0NvbG9yIiwiU3dhZ2dlckN1c3RvbVVJIiwiY3VzdG9tQ1NTIiwiY3NzIiwidG9wYmFySWNvblBhdGgiLCJpbWciLCJiNjQiLCJnZXRDdXN0b21PcHRpb25zIiwiZmF2aWNvbiIsImZhdmljb25QYXRoIiwiY3VzdG9tU2l0ZVRpdGxlIiwiY3VzdG9tQ3NzIiwic3dhZ2dlck9wdGlvbnMiLCJmaWxlIiwiZmlsZVBhdGgiLCJhc3NldHNQYXRoIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJTd2FnZ2VyQnVpbGRlciIsImFwcCIsImNyZWF0ZURvY3VtZW50Iiwib3BlbkFwaUpzb25QYXRoIiwib3BlbkFwaVlhbWxQYXRoIiwiRG9jdW1lbnRCdWlsZGVyIiwic2V0VGl0bGUiLCJzZXREZXNjcmlwdGlvbiIsInNldFZlcnNpb24iLCJhZGRCZWFyZXJBdXRoIiwiU3dhZ2dlck1vZHVsZSIsInJlZ2lzdGVyT3BlbkFwaVJvdXRlIiwiY29udGVudFR5cGUiLCJib2R5RmFjdG9yeSIsImh0dHBBZGFwdGVyIiwiZ2V0SHR0cEFkYXB0ZXIiLCJfcmVxIiwicmVwbHkiLCJzZXR1cFN3YWdnZXIiLCJkb2N1bWVudCIsInN3YWdnZXJVSSIsInNldHVwIiwianNvbkRvY3VtZW50VXJsIiwieWFtbERvY3VtZW50VXJsIiwiWUFNTCIsIk5lc3RCb290c3RyYXBlciIsIl9sb2dnZXIiLCJMb2dnZXIiLCJpbml0aWFsaXplIiwiZW5hYmxlTG9nZ2VyIiwiY3VzdG9tTG9nZ2VyIiwidXNlTG9nZ2VyIiwiZW5hYmxlQ29ycyIsIm9yaWdpbnMiLCJhbGxvd01ldGhvZHMiLCJhbGxvd2VkT3JpZ2lucyIsIm8iLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsIm9wZXJhdGlvbiIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJwZW5kaW5nUHJvdmlkZXJzIiwiZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIiwicmVnaXN0ZXJQcm92aWRlciIsInRva2VuIiwiaXNNb2RlbENvbnN0cnVjdG9yIiwibW9kZWxTZXJ2aWNlVG9rZW4iLCJtb2RlbFJlcG9zaXRvcnlUb2tlbiIsInBhcmFtZXRlckluZGV4IiwicmVzb2x2ZWQiLCJwYXJhbVR5cGVzIiwiYXNNb2RlbCIsImluamVjdGFibGVTZXJ2aWNlS2V5IiwiQ29yZVNlcnZpY2UiLCJDb3JlUmVwb3NpdG9yeSIsIkRlY2FmQ29yZU1vZHVsZSIsIkRlY2FmQ29yZU1vZHVsZV8xIiwibW9kdWxlUmVmIiwiZGVjYWZQcm92aWRlcnMiLCJ1c2VWYWx1ZSIsImNsaWVudCIsIkgiLCJwcm92aWRlciIsImJvb3RQZXJzaXN0ZW5jZSIsInRyaW1tZWQiLCJjb25mIiwiY29udHIiLCJwb3NzaWJsZSIsIlBlcnNpc3RlbmNlU2VydmljZSIsImJvb3QiLCJjbGllbnRzIiwiYyIsInBvc3NpYmxlVHJhbnNmIiwicmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIiwiaW5pdGlhbGl6YXRpb24iLCJvbkFwcGxpY2F0aW9uU2h1dGRvd24iLCJhZGFwdGVycyIsInNodXRkb3duIiwiR2xvYmFsIiwiTW9kdWxlUmVmIiwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIiwibm9ybWFsaXplRXZlbnRSZXNwb25zZSIsIm1vZGVsQ29uc3RyIiwic2VyaWFsaXplZFBheWxvYWQiLCJzZXJpYWxpemUiLCJjb25zb2xlIiwiZXJyIiwiRXZlbnRzQ29udHJvbGxlciIsIkV2ZW50c0NvbnRyb2xsZXJfMSIsImV2ZW50cyQiLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlcklkIiwiTWF0aCIsInJhbmRvbSIsInRvVXBwZXJDYXNlIiwiY2IiLCJyZWZyZXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGFwdGVyTmFtZSIsIm9ic2VydmUiLCJ1bk9ic2VydmUiLCJIRUFSVEJFQVRfSU5URVJWQUxfTVMiLCJoZWFydGJlYXQkIiwiaW50ZXJ2YWwiLCJ0cyIsIm1lcmdlIiwibGlzdGVuRm9yTW9kZWwiLCJTc2UiLCJEZWNhZlN0cmVhbU1vZHVsZSIsIkRlY2FmU3RyZWFtTW9kdWxlXzEiLCJmb3JGbGF2b3VycyIsImltcG9ydHMiLCJSb3V0ZXJNb2R1bGUiLCJyZWdpc3RlciIsIkRlY2FmTW9kdWxlIiwiRGVjYWZNb2R1bGVfMSIsImZvclJvb3RBc3luYyIsImF1dG9Db250cm9sbGVycyIsIm9ic2VydmVyT3B0aW9ucyIsImVuYWJsZU9ic2VydmVyRXZlbnRzIiwib2JzZXJ2ZXJGbGF2b3VycyIsInJ1bk1pZ3JhdGlvbnMiLCJyZXBvRm9yTW9kZWwiLCJtIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsImFsbG93UmVyZWdpc3RyYXRpb24iLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTyxNQUFNQSxvQkFBb0I7O0FBQzFCLE1BQU1DLGFBQWE7SUFDeEJDLGVBQWUsR0FBR0Y7SUFDbEJHLGNBQWMsR0FBR0g7SUFDakJJLGNBQWMsR0FBR0o7SUFDakJLLGNBQWMsR0FBR0w7SUFDakJNLFVBQVUsR0FBR047SUFDYk8sZUFBZSxHQUFHUDtJQUNsQlEsZ0JBQWdCLEdBQUdSO0lBQ25CUyxhQUFhLEdBQUdUO0lBQ2hCVSxzQkFBc0IsR0FBR1Y7SUFDekJXLDRCQUE0QixHQUFHWDtJQUMvQlksY0FBYyxHQUFHWjtJQUNqQmEsc0JBQXNCLEdBQUdiO0lBQ3pCYyx3QkFBd0IsR0FBR2Q7SUFDM0JlLGtCQUFrQixHQUFHZjtJQUNyQmdCLGVBQWUsR0FBR2hCO0lBQ2xCaUIsWUFBWSxHQUFHakI7SUFDZmtCLG9CQUFvQixHQUFHbEI7SUFDdkJtQixVQUFVLEdBQUduQjs7O0FDaEJSLE1BQU1vQixnQkFBaUJDLE9BQXNCQSxRQUFROztBQUNyRCxNQUFNQyx3QkFBd0I7O0FBRTlCLE1BQU1DLGtCQUFrQjs7QUFFekIsU0FBVUMsc0JBQ2RDLFNBQ0FDLFdBQ0FDLGtCQUFFQSxvQkFBcUI7SUFBRUEsa0JBQWtCOztJQUUzQyxPQUFPLENBQ0xDLFFBQ0FDLEtBQ0FDO1FBRUEsV0FBV0osYUFB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
|