@decaf-ts/for-nest 0.11.2-refactor.4 → 0.11.2-refactor.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-nest.cjs +8 -268
- package/dist/for-nest.js +9 -269
- package/lib/cjs/controllers.cjs +4 -6
- package/lib/cjs/decaf-model/FromModelController.cjs +116 -305
- package/lib/cjs/decaf-model/decorators/ApiOperationFromModel.cjs +2 -2
- package/lib/cjs/events-module/utils.cjs +2 -2
- package/lib/cjs/factory/NestBootstraper.cjs +3 -4
- package/lib/cjs/index.cjs +2 -2
- package/lib/cjs/request/DecafRequestContext.cjs +2 -3
- package/lib/cjs/request/DecafResponseInterceptor.cjs +5 -3
- package/lib/cjs/swagger-types.cjs +2 -2
- package/lib/cjs/types.cjs +2 -2
- package/lib/cjs/webhooks/DecafWebhookModule.cjs +3 -2
- package/lib/cjs/webhooks/controllers.cjs +50 -55
- package/lib/esm/controllers.js +3 -5
- package/lib/esm/decaf-model/FromModelController.js +117 -306
- package/lib/esm/decaf-model/decorators/ApiOperationFromModel.js +1 -1
- package/lib/esm/events-module/utils.js +1 -1
- package/lib/esm/factory/NestBootstraper.js +2 -3
- package/lib/esm/index.js +2 -2
- package/lib/esm/request/DecafRequestContext.js +1 -2
- package/lib/esm/request/DecafResponseInterceptor.js +4 -2
- package/lib/esm/swagger-types.js +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/esm/webhooks/DecafWebhookModule.js +2 -1
- package/lib/esm/webhooks/controllers.js +49 -54
- package/lib/types/decaf-model/FromModelController.d.cts +0 -11
- package/lib/types/decaf-model/FromModelController.d.mts +0 -11
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/package.json +7 -1
package/dist/for-nest.cjs
CHANGED
|
@@ -662,10 +662,10 @@
|
|
|
662
662
|
persistence(ctx) {
|
|
663
663
|
if (!this._persistence) try {
|
|
664
664
|
this._persistence = core.Service.get(this.class);
|
|
665
|
-
} catch
|
|
665
|
+
} catch {
|
|
666
666
|
try {
|
|
667
667
|
this._persistence = core.ModelService.getService(this.class);
|
|
668
|
-
} catch
|
|
668
|
+
} catch {
|
|
669
669
|
this._persistence = core.Repository.forModel(this.class);
|
|
670
670
|
}
|
|
671
671
|
}
|
|
@@ -934,7 +934,6 @@
|
|
|
934
934
|
}
|
|
935
935
|
static createQueryRoutesFromRepository(persistence, prefix = core.PersistenceKeys.QUERY) {
|
|
936
936
|
const repo = persistence instanceof core.ModelService ? persistence.repo : persistence;
|
|
937
|
-
const ModelConstr = repo.class;
|
|
938
937
|
const queryMethods = decoration.Metadata.get(repo.constructor, decoration.Metadata.key(core.PersistenceKeys.QUERY)) ?? {};
|
|
939
938
|
const routeMethods = decoration.Metadata.get(persistence.constructor, decoration.Metadata.key(DECAF_ROUTE)) ?? {};
|
|
940
939
|
class QueryController extends DecafModelController {
|
|
@@ -1024,7 +1023,7 @@
|
|
|
1024
1023
|
});
|
|
1025
1024
|
for (const route of sortedRoutes) {
|
|
1026
1025
|
const methodName = route.implementation?.name || route.method.toLowerCase();
|
|
1027
|
-
const registration = FromModelController.matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName
|
|
1026
|
+
const registration = FromModelController.matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName);
|
|
1028
1027
|
if (!registration) continue;
|
|
1029
1028
|
const {methodName: registeredMethodName, handler: handler, decorators: decorators, paramDecorators: paramDecorators} = registration;
|
|
1030
1029
|
const descriptor = FromModelController.defineMethod(DynamicModelController, registeredMethodName, handler);
|
|
@@ -1089,7 +1088,7 @@
|
|
|
1089
1088
|
methodDecorators.forEach(d => d(proto, methodName, descriptor));
|
|
1090
1089
|
paramDecorators.forEach(({decorator: decorator, index: index}) => decorator(proto, methodName, index));
|
|
1091
1090
|
}
|
|
1092
|
-
static matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName
|
|
1091
|
+
static matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName) {
|
|
1093
1092
|
const {method: method, path: path} = route;
|
|
1094
1093
|
const normalizedPath = path.replace(/^\/+|\/+$/g, "");
|
|
1095
1094
|
const handler = route.implementation;
|
|
@@ -1292,247 +1291,6 @@
|
|
|
1292
1291
|
}
|
|
1293
1292
|
return params;
|
|
1294
1293
|
}
|
|
1295
|
-
static createCreateHandler(ModelConstr, modelClazzName) {
|
|
1296
|
-
return async function create(data, resp) {
|
|
1297
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.OperationKeys.CREATE, true)).for(create);
|
|
1298
|
-
log.verbose(`creating new ${modelClazzName}`);
|
|
1299
|
-
let created;
|
|
1300
|
-
try {
|
|
1301
|
-
created = await this.persistence(ctx).create(data, ctx);
|
|
1302
|
-
} catch (e) {
|
|
1303
|
-
log.error(`Failed to create new ${modelClazzName}`, e);
|
|
1304
|
-
throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
|
|
1305
|
-
}
|
|
1306
|
-
log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
|
|
1307
|
-
if (resp) ctx.toResponse(resp);
|
|
1308
|
-
return created;
|
|
1309
|
-
};
|
|
1310
|
-
}
|
|
1311
|
-
static createBulkCreateHandler(ModelConstr, modelClazzName) {
|
|
1312
|
-
return async function createAll(data, resp) {
|
|
1313
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.BulkCrudOperationKeys.CREATE_ALL, true)).for(createAll);
|
|
1314
|
-
log.verbose(`creating new ${modelClazzName}`);
|
|
1315
|
-
let created;
|
|
1316
|
-
try {
|
|
1317
|
-
created = await this.persistence(ctx).createAll(data.map(d => new ModelConstr(d)), ctx);
|
|
1318
|
-
} catch (e) {
|
|
1319
|
-
log.error(`Failed to create new ${modelClazzName}`, e);
|
|
1320
|
-
throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
|
|
1321
|
-
}
|
|
1322
|
-
log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
|
|
1323
|
-
if (resp) ctx.toResponse(resp);
|
|
1324
|
-
return created;
|
|
1325
|
-
};
|
|
1326
|
-
}
|
|
1327
|
-
static createBulkReadHandler(modelClazzName) {
|
|
1328
|
-
return async function readAll(ids) {
|
|
1329
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.BulkCrudOperationKeys.READ_ALL, true)).for(readAll);
|
|
1330
|
-
const normalizedIds = Array.isArray(ids) ? ids : [ ids ];
|
|
1331
|
-
let read;
|
|
1332
|
-
try {
|
|
1333
|
-
log.debug(`reading ${normalizedIds} ${modelClazzName}`);
|
|
1334
|
-
read = await this.persistence(ctx).readAll(normalizedIds, ctx);
|
|
1335
|
-
} catch (e) {
|
|
1336
|
-
log.error(`Failed to read ${modelClazzName}`, e);
|
|
1337
|
-
throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName}`);
|
|
1338
|
-
}
|
|
1339
|
-
log.info(`read ${read.length} ${modelClazzName}`);
|
|
1340
|
-
return read;
|
|
1341
|
-
};
|
|
1342
|
-
}
|
|
1343
|
-
static createBulkUpdateHandler(modelClazzName) {
|
|
1344
|
-
return async function updateAll(body, resp) {
|
|
1345
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.BulkCrudOperationKeys.UPDATE_ALL, true)).for(updateAll);
|
|
1346
|
-
let updated;
|
|
1347
|
-
try {
|
|
1348
|
-
log.info(`updating ${body.length} ${modelClazzName}`);
|
|
1349
|
-
updated = await this.persistence(ctx).updateAll(body, ctx);
|
|
1350
|
-
} catch (e) {
|
|
1351
|
-
log.error(e);
|
|
1352
|
-
throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName}`);
|
|
1353
|
-
}
|
|
1354
|
-
if (resp) ctx.toResponse(resp);
|
|
1355
|
-
return updated;
|
|
1356
|
-
};
|
|
1357
|
-
}
|
|
1358
|
-
static createBulkDeleteHandler(modelClazzName) {
|
|
1359
|
-
return async function deleteAll(ids, resp) {
|
|
1360
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.BulkCrudOperationKeys.DELETE_ALL, true)).for(deleteAll);
|
|
1361
|
-
const normalizedIds = Array.isArray(ids) ? ids : [ ids ];
|
|
1362
|
-
let read;
|
|
1363
|
-
try {
|
|
1364
|
-
log.debug(`deleting ${normalizedIds.length} ${modelClazzName}`);
|
|
1365
|
-
read = await this.persistence(ctx).deleteAll(normalizedIds, ctx);
|
|
1366
|
-
} catch (e) {
|
|
1367
|
-
log.error(`Failed to delete ${modelClazzName}`, e);
|
|
1368
|
-
throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName}`);
|
|
1369
|
-
}
|
|
1370
|
-
log.info(`deleted ${read.length} ${modelClazzName}`);
|
|
1371
|
-
if (resp) ctx.toResponse(resp);
|
|
1372
|
-
return read;
|
|
1373
|
-
};
|
|
1374
|
-
}
|
|
1375
|
-
static createReadHandler(getPK, modelClazzName) {
|
|
1376
|
-
return async function read(routeParams) {
|
|
1377
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.OperationKeys.READ, true)).for(read);
|
|
1378
|
-
const id = getPK(...routeParams.valuesInOrder);
|
|
1379
|
-
if (typeof id === "undefined") throw new dbDecorators.ValidationError(`No ${this.pk} provided`);
|
|
1380
|
-
let readResult;
|
|
1381
|
-
try {
|
|
1382
|
-
log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
|
|
1383
|
-
readResult = await this.persistence(ctx).read(id, ctx);
|
|
1384
|
-
} catch (e) {
|
|
1385
|
-
log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
|
|
1386
|
-
throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName} with id ${id}`);
|
|
1387
|
-
}
|
|
1388
|
-
log.info(`read ${modelClazzName} with id ${readResult[this.pk]}`);
|
|
1389
|
-
return readResult;
|
|
1390
|
-
};
|
|
1391
|
-
}
|
|
1392
|
-
static createUpdateHandler(getPK, ModelConstr, modelClazzName) {
|
|
1393
|
-
return async function update(routeParams, body, resp) {
|
|
1394
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.OperationKeys.UPDATE, true)).for(update);
|
|
1395
|
-
const id = getPK(...routeParams.valuesInOrder);
|
|
1396
|
-
if (typeof id === "undefined") throw new dbDecorators.ValidationError(`No ${this.pk} provided`);
|
|
1397
|
-
let updated;
|
|
1398
|
-
try {
|
|
1399
|
-
log.info(`updating ${modelClazzName} with ${this.pk} ${id}`);
|
|
1400
|
-
const payload = JSON.parse(JSON.stringify(body));
|
|
1401
|
-
updated = await this.persistence(ctx).update(new ModelConstr({
|
|
1402
|
-
...payload,
|
|
1403
|
-
[this.pk]: id
|
|
1404
|
-
}), ctx);
|
|
1405
|
-
} catch (e) {
|
|
1406
|
-
log.error(e);
|
|
1407
|
-
throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName} with id ${id}`);
|
|
1408
|
-
}
|
|
1409
|
-
if (resp) ctx.toResponse(resp);
|
|
1410
|
-
return updated;
|
|
1411
|
-
};
|
|
1412
|
-
}
|
|
1413
|
-
static createDeleteHandler(getPK, modelClazzName) {
|
|
1414
|
-
return async function remove(routeParams, resp) {
|
|
1415
|
-
const {ctx: ctx, log: log} = (await this.logCtx([], dbDecorators.OperationKeys.DELETE, true)).for(remove);
|
|
1416
|
-
const id = getPK(...routeParams.valuesInOrder);
|
|
1417
|
-
if (typeof id === "undefined") throw new dbDecorators.ValidationError(`No ${this.pk} provided`);
|
|
1418
|
-
let del;
|
|
1419
|
-
try {
|
|
1420
|
-
log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
|
|
1421
|
-
del = await this.persistence(ctx).delete(id, ctx);
|
|
1422
|
-
} catch (e) {
|
|
1423
|
-
log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
|
|
1424
|
-
throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName} with id ${id}`);
|
|
1425
|
-
}
|
|
1426
|
-
log.info(`deleted ${modelClazzName} with id ${id}`);
|
|
1427
|
-
if (resp) ctx.toResponse(resp);
|
|
1428
|
-
return del;
|
|
1429
|
-
};
|
|
1430
|
-
}
|
|
1431
|
-
static createStatementHandler(modelClazzName) {
|
|
1432
|
-
return async function statement(name, args, details) {
|
|
1433
|
-
const {ctx: ctx} = (await this.logCtx([], core.PersistenceKeys.STATEMENT, true)).for(statement);
|
|
1434
|
-
const {direction: direction, offset: offset, limit: limit, bookmark: bookmark} = details;
|
|
1435
|
-
args = args.map(a => (typeof a === "string" ? parseInt(a) : a) || a);
|
|
1436
|
-
const pathDirection = args.length > 1 ? args[1] : undefined;
|
|
1437
|
-
const resolvedDirection = direction ?? pathDirection;
|
|
1438
|
-
if (resolvedDirection && args.length > 1) args[1] = resolvedDirection;
|
|
1439
|
-
switch (name) {
|
|
1440
|
-
case core.PreparedStatementKeys.FIND:
|
|
1441
|
-
case core.PreparedStatementKeys.FIND_BY:
|
|
1442
|
-
break;
|
|
1443
|
-
|
|
1444
|
-
case core.PreparedStatementKeys.LIST_BY:
|
|
1445
|
-
args.push(direction);
|
|
1446
|
-
break;
|
|
1447
|
-
|
|
1448
|
-
case core.PreparedStatementKeys.PAGE:
|
|
1449
|
-
case core.PreparedStatementKeys.PAGE_BY:
|
|
1450
|
-
args = [ args[0], resolvedDirection, {
|
|
1451
|
-
limit: limit,
|
|
1452
|
-
offset: offset,
|
|
1453
|
-
bookmark: bookmark
|
|
1454
|
-
} ];
|
|
1455
|
-
break;
|
|
1456
|
-
|
|
1457
|
-
case core.PreparedStatementKeys.FIND_ONE_BY:
|
|
1458
|
-
break;
|
|
1459
|
-
|
|
1460
|
-
case core.PreparedStatementKeys.COUNT_OF:
|
|
1461
|
-
case core.PreparedStatementKeys.MAX_OF:
|
|
1462
|
-
case core.PreparedStatementKeys.MIN_OF:
|
|
1463
|
-
case core.PreparedStatementKeys.AVG_OF:
|
|
1464
|
-
case core.PreparedStatementKeys.SUM_OF:
|
|
1465
|
-
case core.PreparedStatementKeys.DISTINCT_OF:
|
|
1466
|
-
case core.PreparedStatementKeys.GROUP_OF:
|
|
1467
|
-
break;
|
|
1468
|
-
}
|
|
1469
|
-
return this.persistence(ctx).statement(name, ...args, ctx);
|
|
1470
|
-
};
|
|
1471
|
-
}
|
|
1472
|
-
static createStatementShortcutHandler(statementKey, modelClazzName) {
|
|
1473
|
-
return async function statementShortcut(...args) {
|
|
1474
|
-
const {ctx: ctx} = (await this.logCtx([], statementKey, true)).for(statementShortcut);
|
|
1475
|
-
switch (statementKey) {
|
|
1476
|
-
case core.PreparedStatementKeys.LIST_BY:
|
|
1477
|
-
{
|
|
1478
|
-
const [key, details] = args;
|
|
1479
|
-
return this.persistence(ctx).listBy(key, details?.direction, ctx);
|
|
1480
|
-
}
|
|
1481
|
-
|
|
1482
|
-
case core.PreparedStatementKeys.PAGE_BY:
|
|
1483
|
-
{
|
|
1484
|
-
const [key, page, details] = args;
|
|
1485
|
-
return this.persistence(ctx).paginateBy(key, details?.direction, {
|
|
1486
|
-
limit: details?.limit,
|
|
1487
|
-
offset: details?.offset,
|
|
1488
|
-
page: page
|
|
1489
|
-
}, ctx);
|
|
1490
|
-
}
|
|
1491
|
-
|
|
1492
|
-
case core.PreparedStatementKeys.FIND:
|
|
1493
|
-
{
|
|
1494
|
-
const [value, details] = args;
|
|
1495
|
-
const direction = details?.direction ?? core.OrderDirection.ASC;
|
|
1496
|
-
const persistence = this.persistence(ctx);
|
|
1497
|
-
if (typeof persistence.find === "function") return persistence.find(value, direction, ctx);
|
|
1498
|
-
return persistence.statement(core.PreparedStatementKeys.FIND, value, direction, ctx);
|
|
1499
|
-
}
|
|
1500
|
-
|
|
1501
|
-
case core.PreparedStatementKeys.PAGE:
|
|
1502
|
-
{
|
|
1503
|
-
const [value, details] = args;
|
|
1504
|
-
const ref = {
|
|
1505
|
-
offset: details?.offset ?? 1,
|
|
1506
|
-
limit: details?.limit ?? 10,
|
|
1507
|
-
bookmark: details?.bookmark
|
|
1508
|
-
};
|
|
1509
|
-
const persistence = this.persistence(ctx);
|
|
1510
|
-
const direction = details?.direction ?? core.OrderDirection.ASC;
|
|
1511
|
-
if (typeof persistence.page === "function") return persistence.page(value, direction, ref, ctx);
|
|
1512
|
-
return persistence.statement(core.PreparedStatementKeys.PAGE, value, direction, ref, ctx);
|
|
1513
|
-
}
|
|
1514
|
-
|
|
1515
|
-
case core.PreparedStatementKeys.FIND_ONE_BY:
|
|
1516
|
-
{
|
|
1517
|
-
const [key, value] = args;
|
|
1518
|
-
return this.persistence(ctx).findOneBy(key, value, ctx);
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
case core.PreparedStatementKeys.FIND_BY:
|
|
1522
|
-
{
|
|
1523
|
-
const [key, value] = args;
|
|
1524
|
-
return this.persistence(ctx).for(ctx.toOverrides()).findBy(key, value, ctx);
|
|
1525
|
-
}
|
|
1526
|
-
|
|
1527
|
-
default:
|
|
1528
|
-
if (statementKey === core.PreparedStatementKeys.COUNT_OF || statementKey === core.PreparedStatementKeys.MAX_OF || statementKey === core.PreparedStatementKeys.MIN_OF || statementKey === core.PreparedStatementKeys.AVG_OF || statementKey === core.PreparedStatementKeys.SUM_OF || statementKey === core.PreparedStatementKeys.DISTINCT_OF || statementKey === core.PreparedStatementKeys.GROUP_OF) {
|
|
1529
|
-
const [field] = args;
|
|
1530
|
-
return this.persistence(ctx).statement(statementKey, field, ctx);
|
|
1531
|
-
}
|
|
1532
|
-
throw new dbDecorators.InternalError(`Unknown statement: ${statementKey}`);
|
|
1533
|
-
}
|
|
1534
|
-
};
|
|
1535
|
-
}
|
|
1536
1294
|
static createComplexQueryHandler(methodName) {
|
|
1537
1295
|
return async function complexQuery(...args) {
|
|
1538
1296
|
const log = this.log?.for?.(complexQuery);
|
|
@@ -1560,24 +1318,6 @@
|
|
|
1560
1318
|
}
|
|
1561
1319
|
};
|
|
1562
1320
|
}
|
|
1563
|
-
static createCustomRouteHandler(methodName) {
|
|
1564
|
-
return async function customRoute(...args) {
|
|
1565
|
-
const log = this.log?.for?.(customRoute);
|
|
1566
|
-
const {ctx: ctx} = (await this.logCtx([], methodName, true)).for(customRoute);
|
|
1567
|
-
const persistence = this.persistence(ctx);
|
|
1568
|
-
const spreadArgs = FromModelController.normalizeQueryArgs(args);
|
|
1569
|
-
if (persistence?.repo && typeof persistence.repo[methodName] === "function") {
|
|
1570
|
-
return persistence.repo[methodName](...spreadArgs);
|
|
1571
|
-
}
|
|
1572
|
-
if (typeof persistence[methodName] === "function") {
|
|
1573
|
-
return persistence[methodName](...spreadArgs);
|
|
1574
|
-
}
|
|
1575
|
-
if (typeof persistence.statement === "function") {
|
|
1576
|
-
return persistence.statement(methodName, ...spreadArgs, ctx);
|
|
1577
|
-
}
|
|
1578
|
-
throw new dbDecorators.InternalError(`Method "${methodName}" not found on ${persistence?.constructor?.name} or its repo`);
|
|
1579
|
-
};
|
|
1580
|
-
}
|
|
1581
1321
|
static extractQueryArgs(args) {
|
|
1582
1322
|
if (args.length === 0) return args;
|
|
1583
1323
|
const last = args[args.length - 1];
|
|
@@ -2214,7 +1954,7 @@
|
|
|
2214
1954
|
const helmet = require("helmet");
|
|
2215
1955
|
this.app.use(helmet(options));
|
|
2216
1956
|
this.logger.log("Helmet middleware enabled successfully.");
|
|
2217
|
-
} catch
|
|
1957
|
+
} catch {
|
|
2218
1958
|
this.logger.warn("Helmet not installed. Skipping middleware.");
|
|
2219
1959
|
}
|
|
2220
1960
|
return this;
|
|
@@ -2613,8 +2353,8 @@
|
|
|
2613
2353
|
return repo;
|
|
2614
2354
|
}
|
|
2615
2355
|
const VERSION = "0.11.2-refactor.4";
|
|
2616
|
-
const COMMIT = "
|
|
2617
|
-
const FULL_VERSION = "0.11.2-refactor.4-
|
|
2356
|
+
const COMMIT = "1b4f98c";
|
|
2357
|
+
const FULL_VERSION = "0.11.2-refactor.4-1b4f98c";
|
|
2618
2358
|
const PACKAGE_NAME = "@decaf-ts/for-nest";
|
|
2619
2359
|
decoration.Metadata.allowReregistration(true);
|
|
2620
2360
|
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
@@ -2677,4 +2417,4 @@
|
|
|
2677
2417
|
exports.resolvePersistenceMethod = resolvePersistenceMethod;
|
|
2678
2418
|
exports.runMigrations = runMigrations;
|
|
2679
2419
|
});
|
|
2680
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0Zyb21Nb2RlbENvbnRyb2xsZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRGVjYWZNb2RlbE1vZHVsZS50cyIsIi4uL3NyYy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL2NvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvdGhyb3R0bGluZy50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQ3VzdG9tVUkudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJCdWlsZGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5LCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpRXhjbHVkZUVuZHBvaW50IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBPcGVyYXRpb25LZXlzLFxuICBDcnVkT3BlcmF0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuaW1wb3J0IHsgaXNPcGVyYXRpb25CbG9ja2VkIGFzIGNvcmVJc09wZXJhdGlvbkJsb2NrZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFByZXBhcmVkU3RhdGVtZW50S2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIENSVUQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG9wZXJhdGlvbi1ibG9ja2luZyBoYW5kbGVyIG1ldGFkYXRhIHN0b3JlZCBvbiB0aGUgcHJvdmlkZWQgbW9kZWwgY29uc3RydWN0b3IgKHVuZGVyIGBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyBPcGVyYXRpb25LZXlzLkJMT0NLYCksIGV4ZWN1dGVzIGl0IChpZiBwcmVzZW50KSB3aXRoIGl0cyBwZXJzaXN0ZWQgYXJndW1lbnRzIHBsdXMgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24sIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBibG9ja2VkLiBJZiBubyBoYW5kbGVyIGV4aXN0cywgdGhlIG9wZXJhdGlvbiBpcyBjb25zaWRlcmVkIGFsbG93ZWQgKHJldHVybnMgYGZhbHNlYCkuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSB0YXJnZXQgbW9kZWwgY29uc3RydWN0b3Igd2hvc2UgbWV0YWRhdGEgbWF5IGluY2x1ZGUgYSBibG9ja2luZyBoYW5kbGVyLlxuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3AgLSBUaGUgQ1JVRCBvcGVyYXRpb24gdG8gZXZhbHVhdGUgKGUuZy4sIGBPcGVyYXRpb25LZXlzLkNSRUFURWAsIGBPcGVyYXRpb25LZXlzLlJFQURgLCBgT3BlcmF0aW9uS2V5cy5VUERBVEVgLCBgT3BlcmF0aW9uS2V5cy5ERUxFVEVgKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgZXhwbGljaXRseSBibG9ja2VkIGJ5IHRoZSBtb2RlbCdzIGhhbmRsZXI7IG90aGVyd2lzZSBgZmFsc2VgLlxuICogQGZ1bmN0aW9uIGlzT3BlcmF0aW9uQmxvY2tlZFxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0NydWRPcGVyYXRpb25zLCAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yXVxuICA+ID0ge1xuICAgIEdFVDogW09wZXJhdGlvbktleXMuUkVBRCwgR2V0XSxcbiAgICBQT1NUOiBbT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFBvc3RdLFxuICAgIFBVVDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQdXRdLFxuICAgIFBBVENIOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFBhdGNoXSxcbiAgICBERUxFVEU6IFtPcGVyYXRpb25LZXlzLkRFTEVURSwgRGVsZXRlXSxcbiAgfTtcblxuICBjb25zdCBbY3J1ZE9wLCBIdHRwTWV0aG9kRGVjb3JhdG9yXSA9IGh0dHBUb0NydWRbdmVyYl07XG4gIGNvbnN0IHRhcmdldCA9IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKTtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4PiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJoZWFkZXJzXCIgYXMgYW55KTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7XG4gIEFVVEhfSEFORExFUixcbiAgQVVUSF9NRVRBX0tFWSxcbiAgSVNfUFVCTElDX0tFWSxcbiAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXG4gICAgICBcIm9yZ2FuaXphdGlvblwiIGFzIGFueVxuICAgICk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gKHRyYW5zZm9ybWVyIGFzIGFueSkuZnJvbVxuICAgICAgICA/IHRyYW5zZm9ybWVyXG4gICAgICAgIDogbmV3ICh0cmFuc2Zvcm1lciBhcyBhbnkpKCk7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgaW5zdGFuY2UuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBIVFRQIHZlcmIgXCIke3ZlcmJ9XCIuIE5vIE5lc3RKUyBkZWNvcmF0b3IgbWFwcGluZyB3YXMgZm91bmQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIiwiaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBEZWNvcmF0b3JCdW5kbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBEZWNhZkFwaVByb3BlcnR5LFxuICB0eXBlIERlY2FmUGFyYW1Qcm9wcyxcbiAgRGVjYWZQYXJhbXMsXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG8sXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5mdW5jdGlvbiB0b0RlY2FmRXJyb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyb3I7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWAgOiBmYWxsYmFja01lc3NhZ2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURlY29yYXRvcnMoXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGh0dHBWZXJiOiBIdHRwVmVyYnMsXG4gIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4pOiBEZWNvcmF0b3JCdW5kbGUge1xuICBjb25zdCBOZXN0SHR0cFJvdXRlRGVjID0gSHR0cFZlcmJUb0RlY29yYXRvcihodHRwVmVyYik7XG4gIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcChhcGlQYXJhbVNwZWMpO1xuXG4gIGNvbnN0IHN3YWdnZXJRdWVyeVBhcmFtcyA9IFtdO1xuICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgc3dhZ2dlclF1ZXJ5UGFyYW1zLnB1c2goXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogW1xuICAgICAgTmVzdEh0dHBSb3V0ZURlYyhyb3V0ZVBhdGgpLFxuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoQXBpUGFyYW0pLFxuICAgICAgLi4uc3dhZ2dlclF1ZXJ5UGFyYW1zLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgYWNjb3JkaW5nIHRvIFwiJHttZXRob2ROYW1lfVwiLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuYCxcbiAgICAgIH0pLFxuICAgIF0sXG4gICAgcGFyYW1zOiBbRGVjYWZQYXJhbXMoYXBpUGF0aFBhcmFtcyksIFF1ZXJ5KCldLCAvLyAsIERlY2FmQm9keSgpXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXBpRGVjb3JhdG9ycyhcbiAgdGFyZ2V0OiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JCdW5kbGVcbikge1xuICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgZGVjb3JhdG9ycy5tZXRob2QuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICBkZWNvcmF0b3JzLnBhcmFtcz8uZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2Q8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbik6IGFueSB7XG4gIGlmIChwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSkge1xuICAgIHJldHVybiB0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgOiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpO1xuXG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSgpLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAuLi5wYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgdGhyb3cgdG9EZWNhZkVycm9yKGUsIGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUm91dGVNZXRob2QoXG4gIENvbnRyb2xsZXJDbGFzczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4pOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZSxcbiAgICB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZVxuICApO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciwgQXV0aERhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuLyoqXG4gKiBTaW1wbGUgYXV0aCBoYW5kbGVyIHRoYXQgcmVhZHMgYSByb2xlIHN0cmluZyBmcm9tIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxyb2xlPmAgaGVhZGVyLlxuICpcbiAqIE9ubHkgb3ZlcnJpZGVzIHtAbGluayBBdXRoSGFuZGxlci5leHRyYWN0RnJvbUF1dGh9IHRvIHJldHVybiB0aGUgYmVhcmVyIHRva2VuIGFzXG4gKiBib3RoIHRoZSB1c2VyIGlkZW50aWZpZXIgYW5kIHRoZSBzaW5nbGUgcm9sZS4gVGhlIGJhc2UgY2xhc3MgYGJpbmRUb0NvbnRleHRgXG4gKiAoYGN0eC5hY2N1bXVsYXRlKGRhdGEpYCkgaXMgc3VmZmljaWVudCDigJQgdGhlIHRyYW5zZm9ybWVyL2FkYXB0ZXIgaXMgcmVzcG9uc2libGVcbiAqIGZvciBtYXBwaW5nIGNvbnRleHQgZmllbGRzIHRvIGFkYXB0ZXItc3BlY2lmaWMga2V5cyBsaWtlIGBVVUlEYC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmQXV0aEhhbmRsZXIgZXh0ZW5kcyBBdXRoSGFuZGxlcjxcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgQXV0aERhdGFcbj4ge1xuICBwcm90ZWN0ZWQgcGFyc2VSZXF1ZXN0KHJlcTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KFwiIFwiKVsxXSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHVzZXJSb2xlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4dHJhY3RGcm9tQXV0aChjdHg6IEV4ZWN1dGlvbkNvbnRleHQpOiBBdXRoRGF0YSB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHRoaXMucGFyc2VSZXF1ZXN0KHJlcSk7XG4gICAgaWYgKCF1c2VyUm9sZSkgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcIlVuYXV0aGVudGljYXRlZFwiKTtcbiAgICByZXR1cm4geyB1c2VyOiB1c2VyUm9sZSwgcm9sZXM6IFt1c2VyUm9sZV0gfTtcbiAgfVxufVxuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgRGVjYWZBdXRoSGFuZGxlcn0ga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqIFRoZSBcInJvbGVcIiB2YXJpYW50IHByZXZpb3VzbHkgcmV0dXJuZWQgcm9sZXMgZnJvbSBgYXV0aG9yaXplYDsgd2l0aCB0aGUgYmFzZVxuICogY2xhc3Mgbm93IG9yY2hlc3RyYXRpbmcgcm9sZSBjaGVja3MgaW50ZXJuYWxseSwgdGhlIHR3byBjbGFzc2VzIGFyZSBlcXVpdmFsZW50LlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZSb2xlQXV0aEhhbmRsZXIgZXh0ZW5kcyBEZWNhZkF1dGhIYW5kbGVyIHt9XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcblxuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7XG4gIGdsb2JhbD86IGJvb2xlYW47XG4gIGhhbmRsZXI/OiBUeXBlPEF1dGhIYW5kbGVyPjtcbn07XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoXG4gICAgb3B0aW9uczogRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHt9XG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IHByb3ZpZGVyczogRHluYW1pY01vZHVsZVtcInByb3ZpZGVyc1wiXSA9IFtcbiAgICAgIEF1dGhJbnRlcmNlcHRvcixcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgcHJvdmlkZXJzLnB1c2gob3B0aW9ucy5oYW5kbGVyKTtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVVUSF9IQU5ETEVSLFxuICAgICAgICB1c2VDbGFzczogb3B0aW9ucy5oYW5kbGVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsKSB7XG4gICAgICAocHJvdmlkZXJzIGFzIGFueVtdKS5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICB1c2VFeGlzdGluZzogQXV0aEludGVyY2VwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZBdXRoTW9kdWxlLFxuICAgICAgZ2xvYmFsOiBvcHRpb25zLmdsb2JhbCA/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+PiB7XG4gIGlmICghZHRvQ2FjaGUuaGFzKG9wKSkge1xuICAgIGR0b0NhY2hlLnNldChvcCwgbmV3IFdlYWtNYXAoKSk7XG4gIH1cbiAgcmV0dXJuIGR0b0NhY2hlLmdldChvcCkhO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciwgQ29udGV4dE9mLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbihBZGFwdGVyIGFzIGFueSkudHJhbnNmb3JtZXJGb3IgPSBmdW5jdGlvbiB0b0NvbnRleHRGbGFnczxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pixcbj4oYWRhcHRlcjogQSB8IHN0cmluZyk6IENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxDb250ZXh0T2Y8QT4+PiB7XG4gIGNvbnN0IGFsaWFzID1cbiAgICB0eXBlb2YgYWRhcHRlciA9PT0gXCJzdHJpbmdcIiA/IGFkYXB0ZXIgOiAoYWRhcHRlci5hbGlhcyBhcyBzdHJpbmcpO1xuICByZXR1cm4gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpLCBhbGlhcyk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihBZGFwdGVyIGFzIGFueSkuZmxhdm91cnNUb1RyYW5zZm9ybSA9IGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2Zvcm1lcnMoKTpcbiAgfCBzdHJpbmdbXVxuICB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIikpO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKENvbnRleHQgYXMgYW55KS5wcm90b3R5cGUudG9SZXNwb25zZSA9IGZ1bmN0aW9uIHRvUmVzcG9uc2U8XG4gIFJFUyBleHRlbmRzIHsgaGVhZGVyOiBhbnkgfSxcbj4odGhpczogQ29udGV4dCwgcmVzOiBSRVMpOiBSRVMge1xuICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nKCk7XG4gIGlmIChwZW5kaW5nKSByZXMuaGVhZGVyKFwieC1wZW5kaW5nLXRhc2tcIiwgSlNPTi5zdHJpbmdpZnkocGVuZGluZykpO1xuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsQnVpbGRlciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi4vZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy9kZWNvcmF0b3JzXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgQXV0aChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgZGVjb3JhdGVDbGFzcyhkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIEF1dGg6IChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUuQXV0aCA9IGZ1bmN0aW9uIChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhBdXRoKG1vZGVsKSk7XG59O1xuXG5pZiAoIShwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCkge1xuICBjb25zdCBvcmlnaW5hbEJ1aWxkID0gcHJvdG90eXBlLmJ1aWxkO1xuICBwcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG9yaWdpbmFsQnVpbGQuY2FsbCh0aGlzKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzO1xuICAgIGlmIChkZWNvcmF0b3JzPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHJlc3VsdCBhcyBhbnkpIGFzIHR5cGVvZiByZXN1bHQgfCB2b2lkO1xuICAgICAgICBpZiAoZGVjb3JhdGVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZGVjb3JhdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIChwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCA9IHRydWU7XG59XG4iLCJpbXBvcnQgeyBDb250cm9sbGVyLCBQYXJhbSwgUXVlcnksIFJlc3BvbnNlLCBTZXRNZXRhZGF0YSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpTm90Rm91bmRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIHR5cGUgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvS2ViYWJDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIERCS2V5cyxcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwsXG4gIEFwaVBhcmFtc0Zyb21Nb2RlbCxcbiAgdHlwZSBEZWNhZkFwaVByb3BlcnR5LFxuICBEZWNhZkJvZHksXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyB0b0RlY2FmRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmdcbiAgKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWAgOiBmYWxsYmFja01lc3NhZ2VcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldFBlcnNpc3RlbmNlPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxUPj4oTW9kZWxDbGF6eik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKE1vZGVsQ2xhenopIGFzIE1vZGVsU2VydmljZTxUPjtcbiAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKE1vZGVsQ2xhenopIGFzIFJlcG88VD47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgICBwcmVmaXg6IHN0cmluZyA9IFBlcnNpc3RlbmNlS2V5cy5RVUVSWVxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IHJlcG86IFJlcG88VD4gPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG4gICAgY29uc3QgTW9kZWxDb25zdHI6IENvbnN0cnVjdG9yID0gcmVwby5jbGFzcztcbiAgICBjb25zdCBxdWVyeU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIHsgZmllbGRzPzogc3RyaW5nW10gfCB1bmRlZmluZWQgfT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICByZXBvLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoUGVyc2lzdGVuY2VLZXlzLlFVRVJZKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNvbnN0IHJvdXRlTWV0aG9kczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHBlcnNpc3RlbmNlLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yLFxuICAgICAgICBNZXRhZGF0YS5rZXkoREVDQUZfUk9VVEUpXG4gICAgICApID8/IHt9O1xuXG4gICAgY2xhc3MgUXVlcnlDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIG9ialZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlNZXRob2RzKSkge1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqVmFsdWVzLmZpZWxkcyA/PyBbXTtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwcmVmaXgsIG1ldGhvZE5hbWUsIC4uLmZpZWxkcy5tYXAoKGYpID0+IGA6JHtmfWApXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoXCJHRVRcIiBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeyBnZXRQSywgYXBpUHJvcGVydGllcywgcGF0aDogcGtQYXRoIH0gPVxuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwoTW9kZWxDb25zdHIpO1xuXG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7ZmFjdG9yeVJvdXRlcz8ubGVuZ3RoID8/IDB9IGZhY3Rvcnkgcm91dGVzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdXRoQ29uZmlnOiBBdXRoQ29uZmlnIHwgdW5kZWZpbmVkID0gbWVyZ2VkQ29uZmlnLmF1dGg7XG5cbiAgICBmdW5jdGlvbiBhcHBseUNsYXNzQXV0aCh0YXJnZXQ6IGFueSkge1xuICAgICAgaWYgKGF1dGhDb25maWc/LnB1YmxpYykge1xuICAgICAgICBQdWJsaWMoKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChhdXRoQ29uZmlnPy5yb2xlcz8ubGVuZ3RoKSB7XG4gICAgICAgIFJlcXVpcmVSb2xlcyguLi5hdXRoQ29uZmlnLnJvbGVzKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aChNb2RlbENvbnN0cikodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoQ29uZmlnPy5za2lwTW9kZWxSb2xlcykge1xuICAgICAgICBTZXRNZXRhZGF0YShTS0lQX01PREVMX1JPTEVTX0tFWSwgdHJ1ZSkodGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAQ29udHJvbGxlcihyb3V0ZVBhdGgpXG4gICAgQEFwaVRhZ3MobW9kZWxDbGF6ek5hbWUpXG4gICAgQEFwaUV4dHJhTW9kZWxzKE1vZGVsQ29uc3RyKVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmcgPSBNb2RlbC5wayhNb2RlbENvbnN0cikgYXMgc3RyaW5nO1xuXG4gICAgICBwcm90ZWN0ZWQgc3RhdGljIGdldCBjbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBEeW5hbWljTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgUmVnaXN0ZXJpbmcgZHluYW1pYyBjb250cm9sbGVyIGZvciBtb2RlbDogJHt0aGlzLmNsYXNzLm5hbWV9IHJvdXRlOiAvJHtyb3V0ZVBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcGx5Q2xhc3NBdXRoKER5bmFtaWNNb2RlbENvbnRyb2xsZXIpO1xuXG4gICAgaWYgKGZhY3RvcnlSb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZFJvdXRlcyA9IFsuLi5mYWN0b3J5Um91dGVzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFTZWdtZW50cyA9IGEucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBiU2VnbWVudHMgPSBiLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYVBhcmFtQ291bnQgPSBhU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJQYXJhbUNvdW50ID0gYlNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBhTGl0ZXJhbENvdW50ID0gYVNlZ21lbnRzLmxlbmd0aCAtIGFQYXJhbUNvdW50O1xuICAgICAgICBjb25zdCBiTGl0ZXJhbENvdW50ID0gYlNlZ21lbnRzLmxlbmd0aCAtIGJQYXJhbUNvdW50O1xuICAgICAgICBpZiAoYUxpdGVyYWxDb3VudCAhPT0gYkxpdGVyYWxDb3VudClcbiAgICAgICAgICByZXR1cm4gYkxpdGVyYWxDb3VudCAtIGFMaXRlcmFsQ291bnQ7XG4gICAgICAgIGlmIChhUGFyYW1Db3VudCAhPT0gYlBhcmFtQ291bnQpXG4gICAgICAgICAgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbj8ubmFtZSB8fCByb3V0ZS5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gRnJvbU1vZGVsQ29udHJvbGxlci5tYXRjaFJvdXRlKFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgcGtQYXRoLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgZ2V0UEssXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVnaXN0cmF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbWV0aG9kTmFtZTogcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBkZWNvcmF0b3JzLFxuICAgICAgICAgIHBhcmFtRGVjb3JhdG9ycyxcbiAgICAgICAgfSA9IHJlZ2lzdHJhdGlvbjtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihyb3V0ZS5tZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgfHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgICByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXSxcbiAgICAgICAgICAgIHBhcmFtRGVjb3JhdG9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gRHluYW1pY01vZGVsQ29udHJvbGxlciBhcyBhbnk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W107XG4gICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhNb2RlbENsYXp6KSBhcyBrZXlvZiBNb2RlbDxhbnk+O1xuICAgIGNvbnN0IGNvbXBvc2VkID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDbGF6eixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuQ09NUE9TRUQsIHBrKVxuICAgICk7XG4gICAgY29uc3QgY29tcG9zZWRLZXlzID0gY29tcG9zZWQ/LmFyZ3MgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVLZXlzID1cbiAgICAgIEFycmF5LmlzQXJyYXkoY29tcG9zZWRLZXlzKSAmJiBjb21wb3NlZEtleXMubGVuZ3RoID4gMFxuICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY29tcG9zZWRLZXlzXSkpXG4gICAgICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KFtwa10pKTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eikgPz8gXCJcIjtcbiAgICBjb25zdCBwYXRoID0gYDoke3VuaXF1ZUtleXMuam9pbihcIi86XCIpfWA7XG4gICAgY29uc3QgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gdW5pcXVlS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBkZXNjcmlwdGlvbjogTWV0YWRhdGEuZGVzY3JpcHRpb24oTW9kZWxDbGF6eiwga2V5KSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PlxuICAgICAgICBjb21wb3NlZD8uc2VwYXJhdG9yID8gcGFyYW1zLmpvaW4oY29tcG9zZWQuc2VwYXJhdG9yKSA6IHBhcmFtcy5qb2luKFwiXCIpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByb3V0ZVBhcmFtRGVjb3JhdG9ycyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuICAgIHJldHVybiBwYXRoXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZmxhdE1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiBbeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKlwiKSkge1xuICAgICAgICAgIHJldHVybiBbeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlZmluZU1ldGhvZChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgdGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsXG4gICAgICBtZXRob2ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFwcGx5RGVjb3JhdG9ycyhcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgbWV0aG9kRGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXVxuICApIHtcbiAgICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kTmFtZSk7XG4gICAgbWV0aG9kRGVjb3JhdG9ycy5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gICAgcGFyYW1EZWNvcmF0b3JzLmZvckVhY2goKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PlxuICAgICAgZGVjb3JhdG9yKHByb3RvLCBtZXRob2ROYW1lLCBpbmRleClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hSb3V0ZShcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgcm91dGU6IFNlcnZlclJvdXRlLFxuICAgIHBrUGF0aDogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGVyc2lzdGVuY2U/OiBhbnlcbiAgKToge1xuICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueTtcbiAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+O1xuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PjtcbiAgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBtZXRob2QsIHBhdGggfSA9IHJvdXRlO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKTtcbiAgICBjb25zdCBoYW5kbGVyID0gcm91dGUuaW1wbGVtZW50YXRpb24gYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1JlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtVcGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcyksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0RlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9IEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9IEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb3NlZCBQSyBmYWxsYmFjayByb3V0ZXMgKGZpbHRlckVtcHR5KSDigJQgcGF0aCBkaWZmZXJzIGZyb20gcGtQYXRoXG4gICAgY29uc3QgZmFsbGJhY2tTZWdtZW50cyA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgaXNBbGxQYXJhbXMgPSBmYWxsYmFja1NlZ21lbnRzLmxlbmd0aCA+IDAgJiYgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPSBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGByZWFkQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHVwZGF0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgLi4ucm91dGVQYXJhbXMubWFwKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT4gKHtcbiAgICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGBkZWxldGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBmYWxsYmFja0FwaVByb3BzLCBub3JtYWxpemVkUGF0aCksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJmaW5kT25lQnlcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgbm9ybWFsaXplZFBhdGgsIHN0YXRlbWVudEtleSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgY29uc3QgcXVlcnlNZXRob2QgPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF07XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIHF1ZXJ5TWV0aG9kLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhxdWVyeU1ldGhvZCwgbm9ybWFsaXplZFBhdGgsIFwiR0VUXCIsIHRydWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNvbXBsZXhRdWVyeVBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFNlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBrbm93blByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIFwibGlzdEJ5XCIsIFwiZmluZEJ5XCIsIFwiZmluZEJ5UGFnaW5hdGVcIiwgXCJmaW5kT25lQnlcIiwgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIiwgXCJwYWdlXCIsIFwiY291bnRPZlwiLCBcIm1heE9mXCIsIFwibWluT2ZcIiwgXCJhdmdPZlwiLCBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIiwgXCJncm91cE9mXCIsIFwic3RhdGVtZW50XCIsIFwiYnVsa1wiLCBcInF1ZXJ5XCIsXG4gICAgXSk7XG4gICAgaWYgKFxuICAgICAgcGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInN0YXRlbWVudC9cIikgJiZcbiAgICAgICFrbm93blByZWZpeGVzLmhhcyhwYXRoU2VnbWVudHNbMF0pXG4gICAgKSB7XG4gICAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gcGF0aFNlZ21lbnRzXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHttZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgICAgICBdLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PlxuICApIHtcbiAgICByZXR1cm4geyBtZXRob2ROYW1lLCBoYW5kbGVyLCBkZWNvcmF0b3JzLCBwYXJhbURlY29yYXRvcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudE1ldGhvZE5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaXJzdFNlZ21lbnQgPSBwYXRoLnNwbGl0KFwiL1wiKVswXTtcbiAgICByZXR1cm4gZmlyc3RTZWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJsaXN0QnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwiZmluZC9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpXG4gICAgKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbXBsZXhRdWVyeVBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlSGFuZGxlcihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPGFueT4+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuQ1JFQVRFLCB0cnVlKVxuICAgICAgKS5mb3IoY3JlYXRlKTtcbiAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGxldCBjcmVhdGVkOiBNb2RlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuY3JlYXRlKGRhdGEsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjcmVhdGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBkYXRhOiBhbnlbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IoY3JlYXRlQWxsKTtcbiAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGxldCBjcmVhdGVkOiBhbnlbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuY3JlYXRlQWxsKFxuICAgICAgICAgIGRhdGEubWFwKChkKSA9PiBuZXcgTW9kZWxDb25zdHIoZCkpLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsoY3JlYXRlZCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtSZWFkSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWRBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpZHM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIHRydWUpXG4gICAgICApLmZvcihyZWFkQWxsKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZHMgPSBBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXTtcbiAgICAgIGxldCByZWFkOiBNb2RlbFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bm9ybWFsaXplZElkc30gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5yZWFkQWxsKG5vcm1hbGl6ZWRJZHMgYXMgYW55LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHtyZWFkLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIHJldHVybiByZWFkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrVXBkYXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGJvZHk6IGFueVtdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8YW55W10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlQWxsKTtcbiAgICAgIGxldCB1cGRhdGVkOiBhbnlbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke2JvZHkubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnVwZGF0ZUFsbChib2R5LCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBkZWxldGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBpZHM6IHN0cmluZ1tdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIHRydWUpXG4gICAgICApLmZvcihkZWxldGVBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bm9ybWFsaXplZElkcy5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlQWxsKG5vcm1hbGl6ZWRJZHMsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHtyZWFkLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiByZWFkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWFkSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiByZWFkKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuUkVBRCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWQpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCByZWFkUmVzdWx0OiBNb2RlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgcmVhZFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5yZWFkKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHsocmVhZFJlc3VsdCBhcyBhbnkpW3RoaXMucGtdfWApO1xuICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVVwZGF0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiB1cGRhdGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55LFxuICAgICAgYm9keTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLlVQREFURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHVwZGF0ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgICB1cGRhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnVwZGF0ZShcbiAgICAgICAgICBuZXcgTW9kZWxDb25zdHIoeyAuLi5wYXlsb2FkLCBbdGhpcy5wa106IGlkIH0pLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVEZWxldGVIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsIHRydWUpXG4gICAgICApLmZvcihyZW1vdmUpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCBkZWw6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBkZWxldGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgZGVsID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmRlbGV0ZShpZCwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGRlbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50SGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICBkZXRhaWxzOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudCk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgb2Zmc2V0LCBsaW1pdCwgYm9va21hcmsgfSA9IGRldGFpbHM7XG4gICAgICBhcmdzID0gYXJncy5tYXAoXG4gICAgICAgIChhKSA9PiAodHlwZW9mIGEgPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChhIGFzIHN0cmluZykgOiBhKSB8fCBhXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgcGF0aERpcmVjdGlvbiA9IGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvbHZlZERpcmVjdGlvbiA9IChkaXJlY3Rpb24gPz8gcGF0aERpcmVjdGlvbikgYXNcbiAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVzb2x2ZWREaXJlY3Rpb24gJiYgYXJncy5sZW5ndGggPiAxKSBhcmdzWzFdID0gcmVzb2x2ZWREaXJlY3Rpb247XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgICAgYXJncyA9IFtcbiAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICByZXNvbHZlZERpcmVjdGlvbiBhcyBhbnksXG4gICAgICAgICAgICB7IGxpbWl0LCBvZmZzZXQsIGJvb2ttYXJrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRjpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuc3RhdGVtZW50KG5hbWUsIC4uLmFyZ3MsIGN0eCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlcihcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBzdGF0ZW1lbnRTaG9ydGN1dChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBzdGF0ZW1lbnRLZXksIHRydWUpXG4gICAgICApLmZvcihzdGF0ZW1lbnRTaG9ydGN1dCk7XG5cbiAgICAgIHN3aXRjaCAoc3RhdGVtZW50S2V5KSB7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5saXN0QnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBwYWdlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5wYWdpbmF0ZUJ5KFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW1pdDogKGRldGFpbHMgYXMgYW55KT8ubGltaXQsXG4gICAgICAgICAgICAgIG9mZnNldDogKGRldGFpbHMgYXMgYW55KT8ub2Zmc2V0LFxuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLmZpbmQgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5maW5kKHZhbHVlLCBkaXJlY3Rpb24sIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOiB7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3QgcmVmID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQgPz8gMSxcbiAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCA/PyAxMCxcbiAgICAgICAgICAgIGJvb2ttYXJrOiAoZGV0YWlscyBhcyBhbnkpPy5ib29rbWFyayxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiA/PyBPcmRlckRpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5wYWdlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucGFnZSh2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdmFsdWUsIGRpcmVjdGlvbiwgcmVmLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmZpbmRPbmVCeShrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eClcbiAgICAgICAgICAgIC5mb3IoY3R4LnRvT3ZlcnJpZGVzKCkpXG4gICAgICAgICAgICAuZmluZEJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0ZcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IFtmaWVsZF0gPSBhcmdzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQoc3RhdGVtZW50S2V5LCBmaWVsZCwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVua25vd24gc3RhdGVtZW50OiAke3N0YXRlbWVudEtleX1gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29tcGxleFF1ZXJ5KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgbG9nOiBhbnkgPSB0aGlzLmxvZz8uZm9yPy4oY29tcGxleFF1ZXJ5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5kZWJ1ZyhgSW52b2tpbmcgY3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiYCk7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIG1ldGhvZE5hbWUsIHRydWUpXG4gICAgICAgICkuZm9yKGNvbXBsZXhRdWVyeSk7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5ub3JtYWxpemVRdWVyeUFyZ3MoYXJncyk7XG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZT8ucmVwbyAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZT8ucXVlcnkgJiYgdHlwZW9mIHBlcnNpc3RlbmNlLnF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucXVlcnkobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgUGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUN1c3RvbVJvdXRlSGFuZGxlcihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3VzdG9tUm91dGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/LihjdXN0b21Sb3V0ZSk7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICkuZm9yKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubm9ybWFsaXplUXVlcnlBcmdzKGFyZ3MpO1xuXG4gICAgICAvLyBUcnkgdGhlIHBlcnNpc3RlbmNlIGRpcmVjdGx5ICh3b3JrcyB3aGVuIGl0J3MgYSBjdXN0b20gUmVwb3NpdG9yeSlcbiAgICAgIGlmIChwZXJzaXN0ZW5jZT8ucmVwbyAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgYmFjayB0byBzdGF0ZW1lbnQgZ2F0ZXdheVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KG1ldGhvZE5hbWUsIC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9IG9yIGl0cyByZXBvYFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKFxuICAgICAgbGFzdCAmJlxuICAgICAgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGxhc3QpXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeU9iaiA9IGFyZ3MucG9wKCk7XG4gICAgICBjb25zdCBoYXNEaXJlY3Rpb24gPSBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0xpbWl0ID0gcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc09mZnNldCA9IHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFoYXNEaXJlY3Rpb24gJiYgIWhhc0xpbWl0ICYmICFoYXNPZmZzZXQpIHJldHVybiBhcmdzO1xuICAgICAgY29uc3QgZXh0cmFzOiBhbnlbXSA9IFtdO1xuICAgICAgaWYgKGhhc0RpcmVjdGlvbikgZXh0cmFzLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICAgIGVsc2UgaWYgKGhhc0xpbWl0IHx8IGhhc09mZnNldCkgZXh0cmFzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYXNMaW1pdCkgZXh0cmFzLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgICAgaWYgKGhhc09mZnNldCkgZXh0cmFzLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICAgIHJldHVybiBbLi4uYXJncywgLi4uZXh0cmFzXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVRdWVyeUFyZ3MoYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZXh0cmFjdFF1ZXJ5QXJncyhhcmdzKTtcbiAgICBpZiAobm9ybWFsaXplZC5sZW5ndGggPT09IDApIHJldHVybiBub3JtYWxpemVkO1xuXG4gICAgY29uc3QgbGFzdCA9IG5vcm1hbGl6ZWRbbm9ybWFsaXplZC5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWxhc3QgfHwgdHlwZW9mIGxhc3QgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShsYXN0KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlPYmogPSBsYXN0IGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgaGFzUXVlcnlGaWVsZHMgPVxuICAgICAgcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5ib29rbWFyayAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFoYXNRdWVyeUZpZWxkcykge1xuICAgICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZWQucG9wKCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICBpZiAocXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICBpZiAocXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgIGlmIChxdWVyeU9iai5ib29rbWFyayAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmouYm9va21hcmspO1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0NyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrUmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgd2l0aCBuZXcgcGF5bG9hZHMuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIHJlY29yZHMgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgJHJlZjogZ2V0U2NoZW1hUGF0aChEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrRGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYEV4ZWN1dGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50IG9uICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICB9KSxcbiAgICAgIEFwaVBhcmFtKHsgbmFtZTogXCJtZXRob2RcIiwgZGVzY3JpcHRpb246IFwidGhlIHByZXBhcmVkIHN0YXRlbWVudCB0byBleGVjdXRlXCIgfSksXG4gICAgICBBcGlQYXJhbSh7XG4gICAgICAgIG5hbWU6IFwiYXJnc1wiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBsaXN0ZWQgZm91bmQuYCB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc3RhdGVtZW50S2V5OiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgYmFzZTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGF0aCksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3Jkcy5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcIm9mZnNldFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJib29rbWFya1wiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImJvb2ttYXJrIGZvciBjdXJzb3IgcGFnaW5hdGlvblwiIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kT25lQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcImZpbmRCeS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0ZcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGBSZXN1bHQgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsIHR5cGU6IE51bWJlciB9KSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRikge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYERpc3RpbmN0IHZhbHVlcyBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogW1N0cmluZ10gfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgIF07XG5cbiAgICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29yYXRvcnM7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgUHJvdmlkZXIgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE1vZGVsU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRnJvbU1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuL0Zyb21Nb2RlbENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZUZvcihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgQE1vZHVsZSh7fSlcbiAgY2xhc3MgRGVjYWZNb2RlbE1vZHVsZSB7XG4gICAgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUubmFtZSkuZm9yKGZsYXZvdXIpO1xuXG4gICAgc3RhdGljIGNyZWF0ZU1vZGVsU2VydmljZXM8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICAgIG1vZGVsczogTW9kZWxDb25zdHJ1Y3RvcjxUPltdXG4gICAgKTogUHJvdmlkZXJbXSB7XG4gICAgICByZXR1cm4gbW9kZWxzLm1hcCgobW9kZWwpID0+ICh7XG4gICAgICAgIHByb3ZpZGU6IGAke21vZGVsLm5hbWV9U2VydmljZWAsXG4gICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc0V4cG9zZWQoXG4gICAgICBtb2RlbDogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgICAgZXhwb3N1cmU/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nW10+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4cG9zdXJlPy5bbW9kZWwubmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gb3ZlcnJpZGVcbiAgICAgICAgICA6IE1ldGFkYXRhLmdldChtb2RlbCwgTWV0YWRhdGEua2V5KERFQ0FGX0VYUE9TRSkpO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmbGF2b3VyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yUm9vdChcbiAgICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM6IFBhcnRpYWw8RGVjYWZNb2R1bGVPcHRpb25zPiA9IHt9XG4gICAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIGNvbnRyb2xsZXJzIGZvciBmbGF2b3VyLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKS5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICB0aGlzLmlzRXhwb3NlZChtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUpXG4gICAgICApO1xuXG4gICAgICAvLyBDb250cm9sbGVycyBhbHdheXMgcmVseSBvbiBhIGJhY2tpbmcgTW9kZWxTZXJ2aWNlLCBldmVuIHdoZW4gTmVzdCBwcm92aWRlcnNcbiAgICAgIC8vIGFyZSBub3QgYXV0by1yZWdpc3RlcmVkLiBXYXJtIHRoZSBzaW5nbGV0b24gcmVnaXN0cnkgaGVyZSBzbyBzaHV0ZG93biBjYW5cbiAgICAgIC8vIHNlZSB0aGUgbGl2ZSBzZXJ2aWNlcyBjcmVhdGVkIGZvciB0aGUgZ2VuZXJhdGVkIGNvbnRyb2xsZXJzLlxuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0cmFja2VkTW9kZWxzKSBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KTtcblxuICAgICAgbGV0IG1vZGVsU2VydmljZXM6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TZXJ2aWNlcykge1xuICAgICAgICBsb2cuaW5mbyhcIkF1dG8tc2VydmljZXMgZW5hYmxlZC4gSW5pdGlhbGl6aW5nIHNlcnZpY2UgZ2VuZXJhdGlvbi5cIik7XG4gICAgICAgIG1vZGVsU2VydmljZXMgPSB0aGlzLmNyZWF0ZU1vZGVsU2VydmljZXModHJhY2tlZE1vZGVscyk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBBdXRvLXNlcnZpY2VzIGNvbXBsZXRlZC4gJHttb2RlbFNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgaW5pdGlhbGl6ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnbG9iYWxEZWZhdWx0czogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPiA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMuYWdncmVnYXRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBnbG9iYWxEZWZhdWx0cy5hbGxvd0dyb3VwaW5nUXVlcmllcyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckNvbmZpZywgZ2xvYmFsRGVmYXVsdHMpXG4gICAgICApO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRlZCAke2NvbnRyb2xsZXJzLmxlbmd0aH0gY29udHJvbGxlcnNgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgICBjb250cm9sbGVycyxcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgLi4ubW9kZWxTZXJ2aWNlcyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oRGVjYWZNb2RlbE1vZHVsZSwgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYERlY2FmTW9kdWxlJHtmbGF2b3VyfWAsXG4gIH0pO1xuICByZXR1cm4gRGVjYWZNb2RlbE1vZHVsZTtcbn1cbiIsImltcG9ydCB7XG4gIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyxcbiAgSW5qZWN0YWJsZUNvbmZpZyxcbiAgSW5qZWN0YWJsZXNLZXlzLFxuICBJbmplY3RPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIERlY29yYXRpb24sIERlY29yYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3RhYmxlKFxuICAgICAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgY2ZnPzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgY2ZnID1cbiAgICAgICAgY2ZnIHx8XG4gICAgICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sXG4gICAgICAgICAgICAgIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlKHtcbiAgICAgICAgc2NvcGU6IGNmZy5zaW5nbGV0b24gPyBTY29wZS5ERUZBVUxUIDogU2NvcGUuUkVRVUVTVCxcbiAgICAgICAgZHVyYWJsZTogY2ZnLnNpbmdsZXRvbiA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0KFxuICAgICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgY2ZnOiBJbmplY3RPcHRpb25zXG4gICAgKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaW5uZXJOZXN0SW5qZWN0KFxuICAgICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICAgIGRlc2NyaXB0b3I/OiBhbnlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gSW5qZWN0KGNhdGVnb3J5IHx8ICh0YXJnZXQgYXMgQ29uc3RydWN0b3IpKShcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpXG4gIC5leHRlbmQoXG4gICAgQXBpUHJvcGVydHkoe1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgKVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4aW11bTogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1heExlbmd0aERlYyhtYXg6IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWF4TGVuZ3RoOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5MZW5ndGhEZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbkxlbmd0aDogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlRZUEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdHlwZURlYyhcbiAgICAgIHR5cGU6XG4gICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXVxuICAgICAgICB8IENvbnN0cnVjdG9yXG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuICAgICkge1xuICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4gICAgICAgIHR5cGUgPSBBcnJheS5pc0FycmF5KHR5cGUpID8gdHlwZVswXSA6IHR5cGU7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICF0eXBlLm5hbWUpXG4gICAgICAgICAgdHlwZSA9ICh0eXBlIGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICAgIHR5cGU6IHR5cGUgYXMgYW55LFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSkodGFyZ2V0LCBwcm9wKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTElTVClcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBsaXN0RGVjKFxuLy8gICAgICAgY2xheno6XG4vLyAgICAgICAgIHwgQ29uc3RydWN0b3Jcbi8vICAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4vLyAgICAgICAgIHwgKENvbnN0cnVjdG9yIHwgKCgpID0+IENvbnN0cnVjdG9yKSlbXSxcbi8vICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbi8vICAgICAgIGNvbGxlY3Rpb246IFwiQXJyYXlcIiB8IFwiU2V0XCIgPSBcIkFycmF5XCJcbi8vICAgICApIHtcbi8vICAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuLy8gICAgICAgICBjbGF6eiA9IEFycmF5LmlzQXJyYXkoY2xhenopID8gY2xhenpbMF0gOiBjbGF6ejtcbi8vICAgICAgICAgaWYgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lKVxuLy8gICAgICAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yKSgpO1xuLy8gICAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY2xhenogYXMgYW55XSB9KSh0YXJnZXQsIHByb3ApO1xuLy8gICAgICAgfTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vIC8vXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuICAuZXh0ZW5kKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkYXRlRGVjKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIGZvcm1hdDogXCJkYXRlLXRpbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAvLyBleGFtcGxlOiBwYXJzZURhdGUoZm9ybWF0LCBuZXcgRGF0ZSgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5FTlVNKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9wdGlvbkRlYyhvcHRpb25zOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IE9iamVjdC52YWx1ZXMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBlbnVtOiBvcHRzLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuUEFUVEVSTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwYXR0ZXJuRGVjKHBhdDogUmVnRXhwIHwgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBwYXR0ZXJuOiB0eXBlb2YgcGF0ID09PSBcInN0cmluZ1wiID8gcGF0IDogcGF0LnNvdXJjZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gY29sdW1uRGVjKG5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5BVVRIKS5leHRlbmQoeyBkZWNvcmF0b3I6IEF1dGggfSkuYXBwbHkoKTtcbiIsImltcG9ydCB7IEZvcmJpZGRlbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3JzRXJyb3IgZXh0ZW5kcyBGb3JiaWRkZW5FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvcnNFcnJvci5uYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBUb01hbnlSZXF1ZXN0c0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvciApIHtcbiAgICBzdXBlcihUb01hbnlSZXF1ZXN0c0Vycm9yLm5hbWUsIG1zZyAsIDQyOSk7XG4gIH1cbn0iLCJpbXBvcnQge1xuICBBcmd1bWVudHNIb3N0LFxuICBDYXRjaCxcbiAgRXhjZXB0aW9uRmlsdGVyLFxuICBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBCYXNlRXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlZEVudmlyb25tZW50IH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUb01hbnlSZXF1ZXN0c0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy90aHJvdHRsaW5nXCI7XG5cbkBDYXRjaCgpXG5leHBvcnQgY2xhc3MgRGVjYWZFeGNlcHRpb25GaWx0ZXIgaW1wbGVtZW50cyBFeGNlcHRpb25GaWx0ZXIge1xuICBjYXRjaChleGNlcHRpb246IEVycm9yLCBob3N0OiBBcmd1bWVudHNIb3N0KSB7XG4gICAgY29uc3QgY3R4ID0gaG9zdC5zd2l0Y2hUb0h0dHAoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGN0eC5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjdHguZ2V0UmVxdWVzdCgpO1xuXG4gICAgY29uc3QgaXNQcm9kdWN0aW9uID0gTG9nZ2VkRW52aXJvbm1lbnQuZW52ID09PSBcInByb2R1Y3Rpb25cIjtcbiAgICBsZXQgc3RhdHVzQ29kZTtcblxuICAgIGlmIChcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yXG4gICAgKSB7XG4gICAgICBleGNlcHRpb24gPSBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICBzdGF0dXNDb2RlID0gKGV4Y2VwdGlvbiBhcyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTtcbiAgICB9IGVsc2UgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgQmFzZUVycm9yKSkge1xuICAgICAgaWYoKGV4Y2VwdGlvbiBhcyBhbnkpLnN0YXR1cyA9PT0gNDI5KXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IFRvTWFueVJlcXVlc3RzRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBJbnRlcm5hbEVycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXNwb25zZS5zdGF0dXMoKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSkuanNvbih7XG4gICAgICBzdGF0dXM6IChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUsXG4gICAgICBlcnJvcjogaXNQcm9kdWN0aW9uID8gZXhjZXB0aW9uLm5hbWUgOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcGF0aDogcmVxdWVzdC51cmwsXG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBVc2VGaWx0ZXJzLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vRGVjYWZFcnJvckZpbHRlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvaW5kZXhcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmRmlsdGVyKCkge1xuICByZXR1cm4gVXNlRmlsdGVycyhuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkhlYWRlcnMoKSB7XG4gIHJldHVybiBVc2VJbnRlcmNlcHRvcnMoRGVjYWZSZXNwb25zZUludGVyY2VwdG9yKTtcbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBTZWN1cml0eVNjaGVtZU9iamVjdCB9IGZyb20gXCIuLi8uLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlck9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25GaWxlUGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBwYXRoOiBzdHJpbmc7XG4gIGF1dGg/OiBTZWN1cml0eVNjaGVtZU9iamVjdDtcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgZXh0cmFNb2RlbHM/OiBDb25zdHJ1Y3RvcltdO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgZm9ybWF0LlxuICAgKiBSZXF1aXJlcyAneWFtbCcgcGFja2FnZSBhcyBwZWVyIGRlcGVuZGVuY3kuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS55YW1sXG4gICAqL1xuICBvcGVuQXBpWWFtbFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTV0FHR0VSX1VJX0NPTlNUQU5UUzogU3dhZ2dlck9wdGlvbnMgPSB7XG4gIHRpdGxlOiBcIlN3YWdnZXIgfCBPcGVuQVBJIFNwZWNpZmljYXRpb24gKE9BUylcIixcbiAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmRpemVkIGZvcm1hdCBmb3IgZGVzY3JpYmluZyBSRVNUZnVsIEFQSXNcIixcbiAgdmVyc2lvbjogXCIwLjAuMVwiLFxuICBwYXRoOiBcImRvY3NcIixcbiAgZmF2aWNvbkZpbGVQYXRoOiBcIlwiLFxuICB0b3BiYXJJY29uRmlsZVBhdGg6IFwiXCIsXG4gIGF1dGg6IHtcbiAgICB0eXBlOiBcImh0dHBcIixcbiAgICBzY2hlbWU6IFwiYmVhcmVyXCIsXG4gICAgYmVhcmVyRm9ybWF0OiBcIkpXVFwiLFxuICAgIG5hbWU6IFwiQXV0aG9yaXphdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkVudGVyIEpXVCB0b2tlblwiLFxuICAgIGluOiBcImhlYWRlclwiLFxuICB9LFxuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAgdG9wYmFyQmdDb2xvcjogXCIjMDAwMDAwXCIsXG59O1xuIiwiaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJVSU9wdGlvbnMge1xuICB0aXRsZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IGJvb2xlYW47XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJDdXN0b21VSSB7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnM7XG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRzUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAvLyAgIF9fZGlybmFtZSxcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwid29ya2RvY3NcIixcbiAgLy8gICBcImFzc2V0c1wiXG4gIC8vICk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3VzdG9tQ1NTKCkge1xuICAgIGxldCBjc3MgPSBcIlwiO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpIHtcbiAgICAgIGNvbnN0IGltZyA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCk7XG4gICAgICBjc3MgKz0gYC50b3BiYXItd3JhcHBlciB7IGNvbnRlbnQ6IHVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7aW1nfScpOyB3aWR0aDogMjAwcHg7IGhlaWdodDogYXV0bzsgfVxcbmA7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBjc3MgK1xuICAgICAgYFxuICAgICAgICAudG9wYmFyLXdyYXBwZXIgc3ZnIHsgdmlzaWJpbGl0eTogaGlkZGVuOyB9XG4gICAgICAgIC5zd2FnZ2VyLXVpIC50b3BiYXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAke3RoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnRvcGJhckJnQ29sb3J9OyB9XG4gICAgICBgXG4gICAgKTtcbiAgfVxuXG4gIGdldEN1c3RvbU9wdGlvbnMoKSB7XG4gICAgY29uc3QgZmF2aWNvbjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgpIHtcbiAgICAgIGZhdmljb25bXCJjdXN0b21mYXZJY29uXCJdID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLmZhdmljb25QYXRoLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VzdG9tU2l0ZVRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICAuLi5mYXZpY29uLFxuICAgICAgY3VzdG9tQ3NzOiB0aGlzLmN1c3RvbUNTUygpLFxuICAgICAgc3dhZ2dlck9wdGlvbnM6IHtcbiAgICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGI2NChmaWxlOiBzdHJpbmcsIGltZzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5vcHRpb25zLmFzc2V0c1BhdGggfHwgXCJcIiwgZmlsZSk7XG4gICAgY29uc3QgYjY0ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCB7IGVuY29kaW5nOiBcImJhc2U2NFwiIH0pO1xuICAgIHJldHVybiBpbWcgPyBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxcIiArIGI2NCA6IGI2NDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSU5lc3RBcHBsaWNhdGlvbiB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRG9jdW1lbnRCdWlsZGVyLCBTd2FnZ2VyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgU3dhZ2dlckN1c3RvbVVJIH0gZnJvbSBcIi4vU3dhZ2dlckN1c3RvbVVJXCI7XG5pbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUywgU3dhZ2dlck9wdGlvbnMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCBZQU1MIGZyb20gXCJ5YW1sXCI7XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBJTmVzdEFwcGxpY2F0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlck9wdGlvbnNcbiAgKSB7fVxuXG4gIHByaXZhdGUgY3JlYXRlRG9jdW1lbnQoKSB7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLm9wdGlvbnMucGF0aFxuICAgICAgPyB0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb24gK1xuICAgICAgICBcIlwiICtcbiAgICAgICAgYDxicj48YnI+PGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aH1cIj5PcGVuQVBJIEpTT04gU3BlYzwvYT4gfCBgICtcbiAgICAgICAgYDxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9XCI+T3BlbkFQSSBZQU1MIFNwZWM8L2E+YFxuICAgICAgOiB0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb247XG5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgRG9jdW1lbnRCdWlsZGVyKClcbiAgICAgIC5zZXRUaXRsZSh0aGlzLm9wdGlvbnMudGl0bGUpXG4gICAgICAuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pXG4gICAgICAuc2V0VmVyc2lvbih0aGlzLm9wdGlvbnMudmVyc2lvbiB8fCBcIjAuMC4xXCIpXG4gICAgICAuYWRkQmVhcmVyQXV0aCh0aGlzLm9wdGlvbnMuYXV0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5hdXRoKVxuICAgICAgLmJ1aWxkKCk7XG5cbiAgICByZXR1cm4gU3dhZ2dlck1vZHVsZS5jcmVhdGVEb2N1bWVudCh0aGlzLmFwcCwgY29uZmlnLCB7XG4gICAgICBleHRyYU1vZGVsczogdGhpcy5vcHRpb25zLmV4dHJhTW9kZWxzIHx8IFtdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIHwgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICBib2R5RmFjdG9yeTogKCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGh0dHBBZGFwdGVyID0gdGhpcy5hcHAuZ2V0SHR0cEFkYXB0ZXIoKSBhcyBhbnk7XG4gICAgcGF0aCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YDtcbiAgICBodHRwQWRhcHRlci5nZXQocGF0aCwgKF9yZXE6IGFueSwgcmVzOiBhbnkpID0+IHtcbiAgICAgIGh0dHBBZGFwdGVyLnJlcGx5KHJlcywgYm9keUZhY3RvcnkoKSwgMjAwLCB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0dXBTd2FnZ2VyKCkge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVEb2N1bWVudCgpO1xuICAgIGNvbnN0IHN3YWdnZXJVSSA9IG5ldyBTd2FnZ2VyQ3VzdG9tVUkoe1xuICAgICAgdGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiB0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCxcbiAgICAgIGZhdmljb25QYXRoOiB0aGlzLm9wdGlvbnMuZmF2aWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFySWNvblBhdGg6IHRoaXMub3B0aW9ucy50b3BiYXJJY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiB0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvcixcbiAgICB9KTtcbiAgICBTd2FnZ2VyTW9kdWxlLnNldHVwKFxuICAgICAgdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHRoaXMuYXBwLFxuICAgICAgZG9jdW1lbnQsXG4gICAgICB7XG4gICAgICAgIC4uLnN3YWdnZXJVSS5nZXRDdXN0b21PcHRpb25zKCksXG4gICAgICAgIGpzb25Eb2N1bWVudFVybDogdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aFxuICAgICAgICAgID8gYCR7dGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aH1gXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHlhbWxEb2N1bWVudFVybDogdGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aFxuICAgICAgICAgID8gYCR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1gXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAoKSA9PiBkb2N1bWVudFxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgICAoKSA9PiBZQU1MLnN0cmluZ2lmeShkb2N1bWVudClcbiAgICApO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBnZXRWZXJzaW9uKCkge1xuICAvLyAgIC8vIGNvbnN0IHBhY2thZ2VKc29uID0gcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwicGFja2FnZS5qc29uXCIpO1xuICAvLyAgIC8vIGNvbnN0IHt2ZXJzaW9ufSA9IHJlcXVpcmUocGFja2FnZUpzb24pO1xuICAvLyAgIHJldHVybiBcInZlcnNpb25cIjtcbiAgLy8gfVxufVxuIiwiaW1wb3J0IHtcbiAgSU5lc3RBcHBsaWNhdGlvbixcbiAgTG9nZ2VyLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFBpcGVUcmFuc2Zvcm0sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQnVpbGRlciB9IGZyb20gXCIuL29wZW5hcGlcIjtcbmltcG9ydCB7IENvcnNPcHRpb25zIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2ludGVyZmFjZXMvZXh0ZXJuYWwvY29ycy1vcHRpb25zLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQ29yc0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZWZpbmVzIGFsbCBjdXN0b21pemFibGUgcGFyYW1ldGVycyBmb3IgU3dhZ2dlciBzZXR1cC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGRldmVsb3BlcnMgdG8gY3VzdG9taXplIGhvdyBTd2FnZ2VyIFVJIGlzIGNvbmZpZ3VyZWRcbiAqIHdpdGhpbiB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLiBJdCBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciB0aXRsZXMsIHBhdGhzLFxuICogY29sb3Igc2NoZW1lcywgYW5kIGFzc2V0IHBhdGhzIHRvIHRhaWxvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZXhwZXJpZW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSBUaXRsZSBkaXNwbGF5ZWQgaW4gU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiAtIERlc2NyaXB0aW9uIHNob3duIGJlbG93IHRoZSB0aXRsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gQVBJIHZlcnNpb24gZGlzcGxheWVkIGluIHRoZSBkb2N1bWVudGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHBhdGggd2hlcmUgU3dhZ2dlciB3aWxsIGJlIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BlcnNpc3RBdXRob3JpemF0aW9uXSAtIFdoZXRoZXIgYXV0aG9yaXphdGlvbiB0b2tlbnMgcGVyc2lzdCBhY3Jvc3MgcmVsb2Fkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXNzZXRzUGF0aF0gLSBQYXRoIHRvIGN1c3RvbSBhc3NldHMgZm9yIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckJnQ29sb3JdIC0gQ3VzdG9tIGJhY2tncm91bmQgY29sb3IgZm9yIHRoZSBTd2FnZ2VyIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RvcGJhckljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gaWNvbiBkaXNwbGF5ZWQgaW4gdGhlIHRvcCBiYXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zhdmljb25QYXRoXSAtIFBhdGggdG8gYSBjdXN0b20gZmF2aWNvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyU2V0dXBPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgZm9ybWF0LlxuICAgKiBSZXF1aXJlcyAneWFtbCcgcGFja2FnZSBhcyBwZWVyIGRlcGVuZGVuY3kuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS55YW1sXG4gICAqL1xuICBvcGVuQXBpWWFtbFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZsdWVudCwgc3RhdGljIGJvb3RzdHJhcCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBjb25maWd1cmluZyBhIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBOZXN0Qm9vdHN0cmFwZXJgIGNsYXNzIHByb3ZpZGVzIGEgY2hhaW5hYmxlIEFQSSBmb3IgY29uZmlndXJpbmdcbiAqIGEgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlLiBJdCBpbmNsdWRlcyBidWlsdC1pbiBtZXRob2RzIGZvciBlbmFibGluZ1xuICogQ09SUywgSGVsbWV0IHNlY3VyaXR5LCBTd2FnZ2VyIGRvY3VtZW50YXRpb24sIGdsb2JhbCBwaXBlcywgZmlsdGVycyxcbiAqIGludGVyY2VwdG9ycywgYW5kIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhpcyBjbGFzcyBwcm9tb3RlcyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNlcyByZXBldGl0aXZlIHNldHVwIGNvZGVcbiAqIGFjcm9zcyBtdWx0aXBsZSBOZXN0SlMgcHJvamVjdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOZXN0RmFjdG9yeSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gXCIuL2FwcC5tb2R1bGVcIjtcbiAqIGltcG9ydCB7IE15TG9nZ2VyIH0gZnJvbSBcIi4vTXlMb2dnZXJcIjtcbiAqIGltcG9ydCB7IE5lc3RCb290c3RyYXBlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLW5lc3RcIjtcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIGNvbnN0IGFwcCA9IGF3YWl0IE5lc3RGYWN0b3J5LmNyZWF0ZShBcHBNb2R1bGUpO1xuICpcbiAqICAgYXdhaXQgTmVzdEJvb3RzdHJhcGVyXG4gKiAgICAgLmluaXRpYWxpemUoYXBwKVxuICogICAgIC5lbmFibGVMb2dnZXIobmV3IE15TG9nZ2VyKCkpXG4gKiAgICAgLmVuYWJsZUNvcnMoW1wiaHR0cDovL2xvY2FsaG9zdDo0MjAwXCJdKVxuICogICAgIC51c2VIZWxtZXQoKVxuICogICAgIC5zZXR1cFN3YWdnZXIoe1xuICogICAgICAgdGl0bGU6IFwiT3BlbkFQSSBieSBUcmFkZU1hcmvihKJcIixcbiAqICAgICAgIGRlc2NyaXB0aW9uOiBcIlRyYWRlTWFya+KEoiBBUEkgZG9jdW1lbnRhdGlvblwiLFxuICogICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICogICAgICAgcGF0aDogXCJhcGlcIixcbiAqICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICogICAgICAgdG9wYmFyQmdDb2xvcjogXCIjMkMzRTUwXCIsXG4gKiAgICAgICB0b3BiYXJJY29uUGF0aDogXCIvYXNzZXRzL2xvZ28uc3ZnXCIsXG4gKiAgICAgICBmYXZpY29uUGF0aDogXCIvYXNzZXRzL2Zhdmljb24uaWNvXCJcbiAqICAgICB9KVxuICogICAgIC51c2VHbG9iYWxGaWx0ZXJzKClcbiAqICAgICAudXNlR2xvYmFsUGlwZXMoLi4uKVxuICogICAgIC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uKVxuICogICAgIC5zdGFydCgzMDAwKTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoKTtcbiAqIGBgYFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXN0Qm9vdHN0cmFwZXIge1xuICBwcml2YXRlIHN0YXRpYyBhcHA6IElOZXN0QXBwbGljYXRpb247XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9nZ2VyIGluc3RhbmNlLCBjcmVhdGluZyBhIGRlZmF1bHQgb25lIGlmIG5vdCBzZXQuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuc3VyZXMgdGhhdCBhIHZhbGlkIGBMb2dnZXJgIGluc3RhbmNlIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICogZm9yIGxvZ2dpbmcgYm9vdHN0cmFwLXJlbGF0ZWQgbWVzc2FnZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gVGhlIGFjdGl2ZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXQgbG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICB0aGlzLl9sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5pdGlhbGl6ZXMgdGhlIGJvb3RzdHJhcHBlciB3aXRoIGEgZ2l2ZW4gTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBCaW5kcyB0aGUgcHJvdmlkZWQgTmVzdEpTIGFwcCBpbnN0YW5jZSB0byB0aGUgYm9vdHN0cmFwcGVyLCBlbmFibGluZ1xuICAgKiBjaGFpbmVkIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICpcbiAgICogQHBhcmFtIHtJTmVzdEFwcGxpY2F0aW9ufSBhcHAgLSBUaGUgTmVzdEpTIGFwcGxpY2F0aW9uIGluc3RhbmNlIHRvIGluaXRpYWxpemUuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIHN0YXRpYyBpbml0aWFsaXplKGFwcDogSU5lc3RBcHBsaWNhdGlvbikge1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIG9yIHJlcGxhY2VzIHRoZSBnbG9iYWwgbG9nZ2VyIGZvciB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBhIGN1c3RvbSBsb2dnZXIgaXMgcHJvdmlkZWQsIGl0IHJlcGxhY2VzIHRoZSBkZWZhdWx0IGxvZ2dlci4gT3RoZXJ3aXNlLFxuICAgKiBhIG5ldyBsb2dnZXIgbmFtZWQgYFwiTmVzdEJvb3RzdHJhcFwiYCBpcyB1c2VkLiBUaGlzIGxvZ2dlciBpcyBhbHNvIHJlZ2lzdGVyZWRcbiAgICogd2l0aCB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0xvZ2dlcn0gW2N1c3RvbUxvZ2dlcl0gLSBPcHRpb25hbCBjdXN0b20gbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyBlbmFibGVMb2dnZXIoY3VzdG9tTG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgdGhpcy5fbG9nZ2VyID0gY3VzdG9tTG9nZ2VyIHx8IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIHRoaXMuYXBwLnVzZUxvZ2dlcih0aGlzLl9sb2dnZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFbmFibGVzIENyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIChDT1JTKSBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBBbGxvd3MgZGVmaW5pbmcgZWl0aGVyIGEgd2lsZGNhcmQgb3JpZ2luIChgXCIqXCJgKSBvciBhIGxpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zLlxuICAgKiBBdXRvbWF0aWNhbGx5IGFjY2VwdHMgbG9jYWwgZGV2ZWxvcG1lbnQgcmVxdWVzdHMgYW5kIHRob3NlIHdpdGhvdXQgb3JpZ2luIGhlYWRlcnMuXG4gICAqIFRocm93cyBhIGBDb3JzRXJyb3JgIGZvciB1bmF1dGhvcml6ZWQgb3JpZ2lucy5cbiAgICpcbiAgICogQHBhcmFtIHsnKicgfCBzdHJpbmdbXX0gW29yaWdpbnM9W11dIC0gTGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMgb3IgYFwiKlwiYCB0byBhbGxvdyBhbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGxvd01ldGhvZHM9WydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJ11dIC0gQWxsb3dlZCBIVFRQIG1ldGhvZHMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlQ29ycyhcbiAgICBvcmlnaW5zOiBcIipcIiB8IHN0cmluZ1tdID0gW10sXG4gICAgYWxsb3dNZXRob2RzOiBzdHJpbmdbXSA9IFtcIkdFVFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIl1cbiAgKSB7XG4gICAgY29uc3QgYWxsb3dlZE9yaWdpbnMgPVxuICAgICAgb3JpZ2lucyA9PT0gXCIqXCIgPyBcIipcIiA6IG9yaWdpbnMubWFwKChvKSA9PiBvLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblxuICAgIGNvbnN0IGNvcnNPcHRpb25zOiBDb3JzT3B0aW9ucyA9IHtcbiAgICAgIG9yaWdpbjogKG9yaWdpbiwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgLy8gQWxsb3cgcmVxdWVzdCB3aXRob3V0IG9yaWdpbi4uLlxuICAgICAgICBpZiAoIW9yaWdpbikgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3JpZ2lucyA9PT0gXCIqXCIgfHxcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheShhbGxvd2VkT3JpZ2lucykgJiZcbiAgICAgICAgICAgIGFsbG93ZWRPcmlnaW5zLmluY2x1ZGVzKG9yaWdpbi50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobmV3IENvcnNFcnJvcihgT3JpZ2luICR7b3JpZ2lufSBub3QgYWxsb3dlZGApKTtcbiAgICAgIH0sXG4gICAgICBjcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIG1ldGhvZHM6IGFsbG93TWV0aG9kcy5qb2luKFwiLFwiKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHAuZW5hYmxlQ29ycyhjb3JzT3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFwcGxpZXMgdGhlIEhlbG1ldCBtaWRkbGV3YXJlIGZvciBlbmhhbmNlZCBzZWN1cml0eS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRHluYW1pY2FsbHkgbG9hZHMgdGhlIGBoZWxtZXRgIHBhY2thZ2UgaWYgYXZhaWxhYmxlIGFuZCByZWdpc3RlcnMgaXRcbiAgICogYXMgbWlkZGxld2FyZSB0byBpbXByb3ZlIEhUVFAgaGVhZGVyIHNlY3VyaXR5LiBJZiBub3QgaW5zdGFsbGVkLCBsb2dzIGEgd2FybmluZ1xuICAgKiBhbmQgY29udGludWVzIGV4ZWN1dGlvbiB3aXRob3V0IHRocm93aW5nIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBIZWxtZXQuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlSGVsbWV0KG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICBjb25zdCBoZWxtZXQgPSByZXF1aXJlKFwiaGVsbWV0XCIpOyAvLyBEeW5hbWljIGltcG9ydCB0byBhdm9pZCBoYXJkIGRlcGVuZGVuY3lcbiAgICAgIHRoaXMuYXBwLnVzZShoZWxtZXQob3B0aW9ucykpO1xuICAgICAgdGhpcy5sb2dnZXIubG9nKFwiSGVsbWV0IG1pZGRsZXdhcmUgZW5hYmxlZCBzdWNjZXNzZnVsbHkuXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkhlbG1ldCBub3QgaW5zdGFsbGVkLiBTa2lwcGluZyBtaWRkbGV3YXJlLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ29uZmlndXJlcyBhbmQgaW5pdGlhbGl6ZXMgU3dhZ2dlciBVSSBmb3IgQVBJIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFVzZXMgdGhlIGBTd2FnZ2VyQnVpbGRlcmAgdXRpbGl0eSB0byBjb25maWd1cmUgQVBJIGRvY3VtZW50YXRpb25cbiAgICogd2l0aCBkZXRhaWxlZCBjdXN0b21pemF0aW9uIGZvciB0aXRsZSwgdmVyc2lvbiwgcGF0aHMsIGFuZCBjb2xvcnMuXG4gICAqIFN3YWdnZXIgaXMgYXV0b21hdGljYWxseSBleHBvc2VkIGF0IHRoZSBjb25maWd1cmVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB7U3dhZ2dlclNldHVwT3B0aW9uc30gb3B0aW9ucyAtIFN3YWdnZXIgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHNldHVwU3dhZ2dlcihvcHRpb25zOiBTd2FnZ2VyU2V0dXBPcHRpb25zKSB7XG4gICAgY29uc3Qgc3dhZ2dlciA9IG5ldyBTd2FnZ2VyQnVpbGRlcih0aGlzLmFwcCwge1xuICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCB8fCBcImFwaVwiLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IG9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IG9wdGlvbnMuYXNzZXRzUGF0aCxcbiAgICAgIGZhdmljb25GaWxlUGF0aDogb3B0aW9ucy5mYXZpY29uUGF0aCxcbiAgICAgIHRvcGJhckljb25GaWxlUGF0aDogb3B0aW9ucy50b3BiYXJJY29uUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IG9wdGlvbnMudG9wYmFyQmdDb2xvcixcbiAgICAgIG9wZW5BcGlKc29uUGF0aDogb3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBvcGVuQXBpWWFtbFBhdGg6IG9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgIH0pO1xuICAgIHN3YWdnZXIuc2V0dXBTd2FnZ2VyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgdmFsaWRhdGlvbiBwaXBlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5hYmxlcyByZXF1ZXN0IHBheWxvYWQgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gZ2xvYmFsbHkgYWNyb3NzXG4gICAqIHRoZSBlbnRpcmUgTmVzdEpTIGFwcGxpY2F0aW9uLiBNdWx0aXBsZSBwaXBlcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlclxuICAgKiBmb3IgbW9kdWxhciBpbnB1dCB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBpcGVUcmFuc2Zvcm1bXX0gcGlwZXMgLSBQaXBlIGluc3RhbmNlcyB0byByZWdpc3RlciBnbG9iYWxseS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsUGlwZXMoLi4ucGlwZXM6IFBpcGVUcmFuc2Zvcm1bXSkge1xuICAgIGlmIChwaXBlcy5sZW5ndGggPiAwKSB0aGlzLmFwcC51c2VHbG9iYWxQaXBlcyguLi5waXBlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBvbmUgb3IgbW9yZSBnbG9iYWwgZXhjZXB0aW9uIGZpbHRlcnMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIG5vIGZpbHRlcnMgYXJlIHByb3ZpZGVkLCBpdCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBhIGRlZmF1bHRcbiAgICogc2V0IG9mIHN0YW5kYXJkIGV4Y2VwdGlvbiBmaWx0ZXJzIGZvciBjb21tb24gZXJyb3IgdHlwZXMgbGlrZVxuICAgKiBgSHR0cEV4Y2VwdGlvbmAsIGBWYWxpZGF0aW9uRXhjZXB0aW9uYCwgYENvbmZsaWN0RXhjZXB0aW9uYCwgYW5kIG90aGVycy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5FeGNlcHRpb25GaWx0ZXJbXX0gZmlsdGVycyAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgZ2xvYmFsbHkuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiBhbnlbXSkge1xuICAgIHRoaXMuYXBwLnVzZUdsb2JhbEZpbHRlcnMoXG4gICAgICAuLi4oZmlsdGVycy5sZW5ndGggPiAwID8gZmlsdGVycyA6IFtuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIoKV0pXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGdsb2JhbCBpbnRlcmNlcHRvcnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJbnRlcmNlcHRvcnMgYWxsb3cgYWR2YW5jZWQgcmVxdWVzdC9yZXNwb25zZSBtYW5pcHVsYXRpb24gc3VjaCBhc1xuICAgKiBzZXJpYWxpemF0aW9uLCBsb2dnaW5nLCBvciB0cmFuc2Zvcm1hdGlvbi4gTXVsdGlwbGUgaW50ZXJjZXB0b3JzXG4gICAqIGNhbiBiZSBhZGRlZCBmb3IgbW9kdWxhciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLk5lc3RJbnRlcmNlcHRvcltdfSBpbnRlcmNlcHRvcnMgLSBJbnRlcmNlcHRvciBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENhbGxIYW5kbGVyLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IERlZmF1bHRBZGFwdGVyRmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyRmxhZ3MgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgXCIuLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludGVyY2VwdG9yIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpbmcgYWxsIHJlZ2lzdGVyZWQgRGVjYWYgcmVxdWVzdCBoYW5kbGVyc1xuICogYmVmb3JlIHRoZSBjb250cm9sbGVyIG1ldGhvZCBpcyBpbnZva2VkLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcn0gaW50ZWdyYXRlcyB0aGUgRGVjYWYgcmVxdWVzdC1oYW5kbGluZyBwaXBlbGluZVxuICogaW50byBOZXN0SlMnIGludGVyY2VwdG9yIG1lY2hhbmlzbS4gQmVmb3JlIHBhc3NpbmcgZXhlY3V0aW9uIHRvIHRoZSBuZXh0IGhhbmRsZXIgaW4gdGhlXG4gKiBOZXN0SlMgY2hhaW4sIGl0IGRlbGVnYXRlcyByZXF1ZXN0IHByb2Nlc3NpbmcgdG8gdGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0sIHdoaWNoXG4gKiBzZXF1ZW50aWFsbHkgcnVucyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlcn0gaW5zdGFuY2VzLiBUaGlzIGFsbG93c1xuICogYmVoYXZpb3JzIHN1Y2ggYXMgYXV0aGVudGljYXRpb24sIGxvZ2dpbmcsIHRlbmFudCByZXNvbHV0aW9uLCBvciBtZXRhZGF0YSBlbnJpY2htZW50XG4gKiB0byBvY2N1ciBwcmlvciB0byBjb250cm9sbGVyIGV4ZWN1dGlvbi5cbiAqXG4gKiBAY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBcHBseSBnbG9iYWxseTpcbiAqIGFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMobmV3IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcihleGVjdXRvcikpO1xuICpcbiAqIC8vIE9yIGluIGEgbW9kdWxlOlxuICogQE1vZHVsZSh7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICogICAgIHtcbiAqICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAqICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gKiAgICAgfSxcbiAqICAgXSxcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgICAgcGFydGljaXBhbnQgSW50ZXJjZXB0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBFeGVjdXRvclxuICogICAgIHBhcnRpY2lwYW50IENvbnRyb2xsZXJcbiAqXG4gKiAgICAgQ2xpZW50LT4+SW50ZXJjZXB0b3I6IEhUVFAgUmVxdWVzdFxuICogICAgIEludGVyY2VwdG9yLT4+RXhlY3V0b3I6IGV4ZWMocmVxdWVzdClcbiAqICAgICBFeGVjdXRvci0tPj5JbnRlcmNlcHRvcjogaGFuZGxlcnMgY29tcGxldGVkXG4gKiAgICAgSW50ZXJjZXB0b3ItPj5Db250cm9sbGVyOiBuZXh0LmhhbmRsZSgpXG4gKiAgICAgQ29udHJvbGxlci0tPj5DbGllbnQ6IFJlc3BvbnNlXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4ZWN1dG9yOiBEZWNhZkhhbmRsZXJFeGVjdXRvclxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbnRleHR1YWxpemUocmVxOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gICAgY29uc3QgZmxhZ3M6IERlY2FmU2VydmVyRmxhZ3MgPSB7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IGlwID0gZXh0cmFjdElwKHJlcSk7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IoeyBpcCB9KTtcblxuICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBEZWZhdWx0QWRhcHRlckZsYWdzLFxuICAgICAgICB7XG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICBvcGVyYXRpb246IGAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gLFxuICAgICAgICB9LFxuICAgICAgICBmbGFnc1xuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpIHtcbiAgICBjb25zdCByZXEgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCByZXMgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY29udGV4dHVhbGl6ZShyZXEpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBjb250ZXh0dWFsaXplZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5leGVjdXRvci5leGVjKHJlcSwgcmVzKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gZXhlY3V0b3JzIGZpbmlzaGVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdElwKHJlcTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICBmdW5jdGlvbiBwYXJzZUlwSGVhZGVyKHZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgIC5zcGxpdChcIixcIilcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVswXTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wieC1mb3J3YXJkZWQtZm9yXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wieC1yZWFsLWlwXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wiWC1Gb3J3YXJkZWQtRm9yXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wiWC1SZWFsLUlQXCJdKSA/P1xuICAgIHJlcS5pcFxuICApO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5qZWN0YWJsZVNlcnZpY2VLZXksXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSBhcyBDb3JlUmVwb3NpdG9yeSxcbiAgU2VydmljZSBhcyBDb3JlU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZGYWN0b3J5UHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IHN0cmluZztcbiAgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bjtcbn07XG5cbmNvbnN0IHBlbmRpbmdQcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgRGVjYWZGYWN0b3J5UHJvdmlkZXI+KCk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERyYWlucyB0aGUgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIFNlcnZpY2V9L3tAbGluayBSZXBvc2l0b3J5fSB1c2FnZXMuXG4gKiBAc3VtbWFyeSBDb25zdW1lZCBieSB7QGxpbmsgRGVjYWZDb3JlTW9kdWxlLmZvclJvb3R9IHRvIHdpcmUgdGhlIHRva2VucyB0aGF0IHRob3NlIHBhcmFtZXRlclxuICogZGVjb3JhdG9ycyByZWZlcmVuY2UgYmFjayBpbnRvIE5lc3QncyBESSBjb250YWluZXIsIHNpbmNlIGEgcGFyYW1ldGVyIGRlY29yYXRvciBhbG9uZSBjYW5ub3RcbiAqIHN1cHBseSBhIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk6IERlY2FmRmFjdG9yeVByb3ZpZGVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShwZW5kaW5nUHJvdmlkZXJzLnZhbHVlcygpKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcih0b2tlbjogc3RyaW5nLCB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwZW5kaW5nUHJvdmlkZXJzLmhhcyh0b2tlbikpIHJldHVybjtcbiAgcGVuZGluZ1Byb3ZpZGVycy5zZXQodG9rZW4sIHsgcHJvdmlkZTogdG9rZW4sIHVzZUZhY3RvcnkgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTW9kZWxDb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnN0cnVjdG9yPGFueT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgdmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kZWw7XG59XG5cbmZ1bmN0aW9uIG1vZGVsU2VydmljZVRva2VuKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZGVsLm5hbWV9U2VydmljZWA7XG59XG5cbmZ1bmN0aW9uIG1vZGVsUmVwb3NpdG9yeVRva2VuKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZsYXZvdXIgPyBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlAJHtmbGF2b3VyfWAgOiBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlgO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHNlcnZpY2UuXG4gKiBAc3VtbWFyeSBUcmFuc2xhdGVzIGRlY2FmJ3Mgc2VydmljZSByZXNvbHV0aW9uIEFQSXMgaW50byBhIE5lc3QgYEBJbmplY3QoKWAgY2FsbDpcbiAqIC0gYEBTZXJ2aWNlKFNvbWVNb2RlbClgIGluamVjdHMgdGhlIGBNb2RlbFNlcnZpY2U8U29tZU1vZGVsPmAgc2luZ2xldG9uIGZvciB0aGF0IG1vZGVsXG4gKiAgICh2aWEge0BsaW5rIE1vZGVsU2VydmljZS5mb3JNb2RlbH0pLlxuICogLSBgQFNlcnZpY2UoU29tZVNlcnZpY2VDbGFzcylgIG9yIGBAU2VydmljZShcImFsaWFzXCIpYCBpbmplY3RzIHRoZSBtYXRjaGluZyBgQHNlcnZpY2UoKWAtZGVjb3JhdGVkXG4gKiAgIGRlY2FmIHtAbGluayBDb3JlU2VydmljZX0gKHZpYSB7QGxpbmsgQ29yZVNlcnZpY2UuZ2V0fSkuXG4gKiAtIGBAU2VydmljZSgpYCBpbmZlcnMgdGhlIHBhcmFtZXRlcidzIHR5cGUgZnJvbSBlbWl0dGVkIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGFuZCByZXNvbHZlcyBpdCB0aGVcbiAqICAgc2FtZSB3YXksIHByb3ZpZGVkIHRoZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYSBjb25jcmV0ZSBjbGFzcyAoZ2VuZXJpY3MgbGlrZSBgTW9kZWxTZXJ2aWNlPFg+YFxuICogICBhcmUgZXJhc2VkIGF0IHJ1bnRpbWUsIHNvIHRoZSBtb2RlbC1zZXJ2aWNlIGZvcm0gYWx3YXlzIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGFyZ3VtZW50KS5cbiAqIEBwYXJhbSBrZXkgdGhlIG1vZGVsIGNsYXNzLCBzZXJ2aWNlIGNsYXNzLCBvciBhbGlhcyB0byByZXNvbHZlLiBPbWl0IHRvIGluZmVyIGZyb20gdGhlIHBhcmFtZXRlciB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2VydmljZShrZXk/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHJlc29sdmVkOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0ga2V5O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZXM6IGFueVtdID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIHRhcmdldCkgfHwgW107XG4gICAgICByZXNvbHZlZCA9IHBhcmFtVHlwZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEBTZXJ2aWNlKCkgY291bGQgbm90IGRldGVybWluZSBhbiBpbmplY3Rpb24gdHlwZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9IG9mICR7KHRhcmdldCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfS4gUHJvdmlkZSBhbiBleHBsaWNpdCBhcmd1bWVudCwgZS5nLiBAU2VydmljZShTb21lU2VydmljZSkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc01vZGVsID0gdHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiICYmIGlzTW9kZWxDb25zdHJ1Y3RvcihyZXNvbHZlZCk7XG4gICAgY29uc3QgdG9rZW4gPSBhc01vZGVsXG4gICAgICA/IG1vZGVsU2VydmljZVRva2VuKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pXG4gICAgICA6IGluamVjdGFibGVTZXJ2aWNlS2V5KHJlc29sdmVkIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pO1xuXG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4ge1xuICAgICAgaWYgKGFzTW9kZWwpIHJldHVybiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkKVxuICAgICAgICA6IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiB7QGxpbmsgQ29yZVJlcG9zaXRvcnl9IGZvciBgbW9kZWxgLlxuICogQHN1bW1hcnkgVW5saWtlIHtAbGluayBTZXJ2aWNlfSwgYG1vZGVsYCBpcyBhbHdheXMgdHJlYXRlZCBhcyBhIE1vZGVsIGNsYXNzOiB0aGUgc2FtZSBjbGFzcyBwYXNzZWRcbiAqIHRvIGBAU2VydmljZShtb2RlbClgIGFuZCBgQFJlcG9zaXRvcnkobW9kZWwpYCByZXNvbHZlcyB0byB0d28gZGlmZmVyZW50IGluamVjdGVkIG9iamVjdHMgKGFcbiAqIGBNb2RlbFNlcnZpY2U8TT5gIHZzIGEgYFJlcG9zaXRvcnk8TT5gIHJlc3BlY3RpdmVseSksIHZpYSB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBjbGFzcyB0byByZXNvbHZlIGEgcmVwb3NpdG9yeSBmb3IuXG4gKiBAcGFyYW0gZmxhdm91ciBvcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIvYWxpYXMsIGZvcndhcmRlZCB0byB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVwb3NpdG9yeShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gbW9kZWxSZXBvc2l0b3J5VG9rZW4obW9kZWwsIGZsYXZvdXIpO1xuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IENvcmVSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsLCBmbGF2b3VyKSk7XG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgRHluYW1pY01vZHVsZSxcbiAgR2xvYmFsLFxuICBJbmplY3QsXG4gIE1vZHVsZSxcbiAgT25BcHBsaWNhdGlvblNodXRkb3duLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiwgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVDQUZfQURBUFRFUl9JRCxcbiAgREVDQUZfSEFORExFUlMsXG4gIERFQ0FGX01PRFVMRV9PUFRJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3RcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZVNlcnZpY2UsIFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxuICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbkBHbG9iYWwoKVxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNvcmVNb2R1bGU8Q09ORiwgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueT4+XG4gIGltcGxlbWVudHMgT25BcHBsaWNhdGlvblNodXRkb3duXG57XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICBwcml2YXRlIHN0YXRpYyBfcGVyc2lzdGVuY2U/OiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PjtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBwZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiUGVyc2lzdGVuY2Ugc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgY29uc3QgZGVjYWZQcm92aWRlcnMgPSBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkNvcmVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9NT0RVTEVfT1BUSU9OUywgdXNlVmFsdWU6IG9wdGlvbnMgfSxcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9BREFQVEVSX0lELCB1c2VWYWx1ZTogdGhpcy5wZXJzaXN0ZW5jZT8uY2xpZW50IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PlxuICAgICAgICAgICAgb3B0aW9ucy5oYW5kbGVycz8ubWFwKChIKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKGBSZWdpc3RlcmVkIHJlcXVlc3QgaGFuZGxlcjogJHtILm5hbWV9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSCgpO1xuICAgICAgICAgICAgfSkgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgREVDQUZfTU9EVUxFX09QVElPTlMsXG4gICAgICAgIERFQ0FGX0FEQVBURVJfSUQsXG4gICAgICAgIERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMubWFwKChwcm92aWRlcikgPT4gcHJvdmlkZXIucHJvdmlkZSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgYm9vdFBlcnNpc3RlbmNlKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYm9vdFBlcnNpc3RlbmNlKTtcblxuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBvcHRpb25zLmNvbmYubWFwKChbY29udHIsIGNmZywgLi4uYXJnc10pID0+IHtcbiAgICAgICAgY29uc3QgcG9zc2libGUgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXBvc3NpYmxlKSByZXR1cm4gW2NvbnRyLCBjZmddO1xuICAgICAgICByZXR1cm4gW2NvbnRyLCBjZmcsIC4uLmFyZ3NdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IG5ldyBQZXJzaXN0ZW5jZVNlcnZpY2UoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3BlcnNpc3RlbmNlLmJvb3QodHJpbW1lZCk7XG4gICAgICBjb25zdCBjbGllbnRzID0gdGhpcy5fcGVyc2lzdGVuY2UuY2xpZW50O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbmZbaV07XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlVHJhbnNmID0gYy5zbGljZSgyLCBjLmxlbmd0aCk7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1lciA9IHBvc3NpYmxlVHJhbnNmLnBvcCgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRyYW5zZm9ybWVyIHx8XG4gICAgICAgICAgISh0cmFuc2Zvcm1lciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjb250ciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoY2xpZW50c1tpXS5mbGF2b3VyKTtcbiAgICAgICAgICBpZiAoIWNvbnRyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyB0cmFuc2Zvcm1lciBmb3VuZCBmb3IgZmxhdm91ciAke2NsaWVudHNbaV0uZmxhdm91cn0uIHlvdSBzaG91bGQgZWl0aGVyIEByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgb3IgcHJvdmlkZSBhIHRyYW5zZm9ybWVyIGluIHRoZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lciA9IChjb250ciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICAgICAgICA/IGNvbnRyXG4gICAgICAgICAgICAgIDogbmV3IChjb250ciBhcyBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55Pj4pKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gYm9vdCB0cmFuc2Zvcm1lciBmb3IgJHtjbGllbnRzW2ldLmZsYXZvdXJ9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyKGNsaWVudHNbaV0uZmxhdm91cikodHJhbnNmb3JtZXIpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oXCJwZXJzaXN0ZW5jZSBsYXllciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG5cbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0aWFsaXphdGlvbigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGFwcGxpY2F0aW9uOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBvbkFwcGxpY2F0aW9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gRGVjYWZDb3JlTW9kdWxlLmxvZy5mb3IodGhpcy5vbkFwcGxpY2F0aW9uU2h1dGRvd24pO1xuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICB0aGlzLm1vZHVsZVJlZi5nZXQ8YW55PihERUNBRl9BREFQVEVSX0lEKTtcbiAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlcnMpXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICR7YWRhcHRlci50b1N0cmluZygpfWApO1xuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBhcHBsaWNhdGlvbmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBTZXJ2aWNlLnNodXRkb3duKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gc2VydmljZXNgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgPSBTeW1ib2woXG4gIFwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTXCJcbik7XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJnczogYW55W10pOiB1bmtub3duW10ge1xuICBjb25zdCBbbW9kZWxDb25zdHIsIG9wZXJhdGlvbiwgaWQsIHBheWxvYWRdID0gYXJncztcblxuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENvbnN0cj8ubmFtZSA/PyBtb2RlbENvbnN0cjtcblxuICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZClcbiAgICA/IHBheWxvYWQubWFwKChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZS5zZXJpYWxpemUoKTtcblxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBQYXlsb2FkIGl0ZW0gZm9yICR7bW9kZWxOYW1lfSBkb2VzIG5vdCBoYXZlIHNlcmlhbGl6ZSBtZXRob2QgYW5kIGlzIGFuICR7dHlwZW9mIGV9LCBhdHRlbXB0aW5nIHRvIHN0cmluZ2lmeSBkaXJlY3RseS4gSXRlbTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gXCJzdHJpbmdcIiA/IGUgOiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2VyaWFsaXplIHBheWxvYWQgZm9yICR7bW9kZWxOYW1lfTogJHtlcnJ9YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICA6IHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGF5bG9hZC5zZXJpYWxpemUoKVxuICAgICAgOiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHBheWxvYWRcbiAgICAgICAgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICBjb25zb2xlLmRlYnVnKFxuICAgIGBOb3JtYWxpemVkIGV2ZW50IHJlc3BvbnNlIGZvciBtb2RlbCAke21vZGVsTmFtZX0sIG9wZXJhdGlvbiAke29wZXJhdGlvbn0sIGlkICR7aWR9OmAsXG4gICAgc2VyaWFsaXplZFBheWxvYWRcbiAgKTtcblxuICByZXR1cm4gW21vZGVsTmFtZSwgb3BlcmF0aW9uLCBpZCwgc2VyaWFsaXplZFBheWxvYWRdO1xufVxuIiwiaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE9ic2VydmVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBJbmplY3QsIE1lc3NhZ2VFdmVudCwgUXVlcnksIFNzZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuQENvbnRyb2xsZXIoKVxuZXhwb3J0IGNsYXNzIEV2ZW50c0NvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8RGVjYWZTZXJ2ZXJDdHg+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBASW5qZWN0KExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUykgZmxhdm91cnM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG4gICAgdGhpcy5hZGFwdGVycyA9IGZsYXZvdXJzLm1hcCgoZmxhdm91cikgPT4gKEFkYXB0ZXIgYXMgYW55KS5nZXQoZmxhdm91cikpOyAvLyBjaGFuZ2UgdG8gQWRhcHRlci5jYWNoZShcIlwiKVxuICB9XG5cbiAgQFNzZSgpXG4gIGxpc3RlbigpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICBjb25zdCBldmVudHMkID0gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmVySWQgPVxuICAgICAgICBgQi0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWAudG9VcHBlckNhc2UoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBDcmVhdGluZyBTU0Ugb2JzZXJ2ZXI6ICR7b2JzZXJ2ZXJJZH0gZm9yIGNsaWVudCAke3RoaXMuY2xpZW50Q29udGV4dC51dWlkfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIG9ic2VydmVySWQgPSBvYnNlcnZlcklkO1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gcmVjZWl2ZWQgcmVmcmVzaCBldmVudGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3MpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHR5cGU6IFwibWVzc2FnZVwiLCBkYXRhIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSBldmVudCBwdXNoZWQgdG8gY2xpZW50YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGFjcm9zcyAke3RoaXMuYWRhcHRlcnMubGVuZ3RofSBhZGFwdGVyKHMpYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlZ2lzdGVyIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5pbmcgdXAgU1NFIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH1gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBVbnJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gZnJvbSBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCBkdXJpbmcgY2xlYW51cCBvZiBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMTUwMDA7XG4gICAgY29uc3QgaGVhcnRiZWF0JCA9IGludGVydmFsKEhFQVJUQkVBVF9JTlRFUlZBTF9NUykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNlbmRpbmcgaGVhcnRiZWF0XCIpO1xuICAgICAgfSksXG4gICAgICBtYXAoXG4gICAgICAgICgpOiBNZXNzYWdlRXZlbnQgPT4gKHtcbiAgICAgICAgICB0eXBlOiBcImhlYXJ0YmVhdFwiLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlKGV2ZW50cyQsIGhlYXJ0YmVhdCQpO1xuICB9XG5cbiAgQFNzZShcIi86bW9kZWxcIilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBsaXN0ZW5Gb3JNb2RlbChAUXVlcnkoXCJtb2RlbFwiKSBtb2RlbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYXJncyB9IGFzIGFueSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGBGYWlsZWQgdG8gb2JzZXJ2ZSBldmVudDogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEV2ZW50c0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9FdmVudHNDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZTdHJlYW1Nb2R1bGUge1xuICBzdGF0aWMgZm9yRmxhdm91cnMoXG4gICAgZmxhdm91cnM6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZyA9IFwiZXZlbnRzXCJcbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICBjb250cm9sbGVyczogW0V2ZW50c0NvbnRyb2xsZXJdLFxuICAgICAgaW1wb3J0czogW1xuICAgICAgICBSb3V0ZXJNb2R1bGUucmVnaXN0ZXIoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuICAgICAgICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyxcbiAgICAgICAgICB1c2VWYWx1ZTogZmxhdm91cnMgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRNb2R1bGVGb3IgfSBmcm9tIFwiLi9kZWNhZi1tb2RlbC9pbmRleFwiO1xuaW1wb3J0IHsgRGVjYWZTdHJlYW1Nb2R1bGUgfSBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMsIGF1dG9TZXJ2aWNlcyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuYm9vdFBlcnNpc3RlbmNlKG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYXZvdXJzID0gYWRhcHRlcnMubWFwKChhZGFwdGVyKSA9PiBhZGFwdGVyLmZsYXZvdXIpO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICAgIGZsYXZvdXJzLmZvckVhY2goKGZsYXZvdXIpID0+IHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgICAgICBnZXRNb2R1bGVGb3IoZmxhdm91cikuZm9yUm9vdChmbGF2b3VyLCB7XG4gICAgICAgICAgICAgIGF1dG9TZXJ2aWNlcyxcbiAgICAgICAgICAgICAgY29udHJvbGxlckV4cG9zdXJlOiBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSxcbiAgICAgICAgICAgICAgY29udHJvbGxlckNvbmZpZzogb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLFxuICAgICAgICAgICAgICBhZ2dyZWdhdGlvbnM6IG9wdGlvbnMuYWdncmVnYXRpb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9ic2VydmVyT3B0aW9ucz8uZW5hYmxlT2JzZXJ2ZXJFdmVudHMpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgRGVjYWZTdHJlYW1Nb2R1bGUuZm9yRmxhdm91cnMoXG4gICAgICAgICAgb3B0aW9ucy5vYnNlcnZlck9wdGlvbnMub2JzZXJ2ZXJGbGF2b3VycyB8fCBmbGF2b3Vyc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmTW9kdWxlLFxuICAgICAgaW1wb3J0czogaW1wb3J0cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5NaWdyYXRpb25zKCk6IFByb21pc2U8dm9pZD4ge31cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiOyAvLyBvbiB0b3Agb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3ZlcnJpZGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRyb2xsZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3dlYmhvb2tzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cy13b3Jrc3BhY2UgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbih0cnVlKTtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbihmYWxzZSk7XG4iXSwibmFtZXMiOlsiREVDT1JBVE9SU19QUkVGSVgiLCJERUNPUkFUT1JTIiwiQVBJX09QRVJBVElPTiIsIkFQSV9SRVNQT05TRSIsIkFQSV9QUk9EVUNFUyIsIkFQSV9DT05TVU1FUyIsIkFQSV9UQUdTIiwiQVBJX0NBTExCQUNLUyIsIkFQSV9QQVJBTUVURVJTIiwiQVBJX0hFQURFUlMiLCJBUElfTU9ERUxfUFJPUEVSVElFUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZIiwiQVBJX1NFQ1VSSVRZIiwiQVBJX0VYQ0xVREVfRU5EUE9JTlQiLCJBUElfRVhDTFVERV9DT05UUk9MTEVSIiwiQVBJX0VYVFJBX01PREVMUyIsIkFQSV9FWFRFTlNJT04iLCJBUElfU0NIRU1BIiwiQVBJX0RFRkFVTFRfR0VUVEVSIiwiQVBJX0xJTksiLCJpc0NvbnN0cnVjdG9yIiwidmFsIiwiTUVUQURBVEFfRkFDVE9SWV9OQU1FIiwiTUVUSE9EX01FVEFEQVRBIiwiY3JlYXRlTWV0aG9kRGVjb3JhdG9yIiwibWV0YWtleSIsIm1ldGFkYXRhIiwib3ZlcnJpZGVFeGlzdGluZyIsInRhcmdldCIsImtleSIsImRlc2NyaXB0b3IiLCJwcmV2VmFsdWUiLCJSZWZsZWN0IiwiZ2V0TWV0YWRhdGEiLCJ2YWx1ZSIsImRlZmluZU1ldGFkYXRhIiwiY3JlYXRlQ2xhc3NEZWNvcmF0b3IiLCJjcmVhdGVQcm9wZXJ0eURlY29yYXRvciIsInByb3BlcnR5S2V5IiwicHJvcGVydGllcyIsImluY2x1ZGVzIiwiZXhpc3RpbmdNZXRhZGF0YSIsIm5ld01ldGFkYXRhIiwicGlja0J5IiwibmVnYXRlIiwiaXNVbmRlZmluZWQiLCJtZXRhZGF0YVRvU2F2ZSIsInR5cGUiLCJjb25zdHJ1Y3RvciIsImNyZWF0ZU1peGVkRGVjb3JhdG9yIiwibWV0YWRhdGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJldmlvdXNNZXRhZGF0YSIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwiaW5pdGlhbCIsInBhcmFtT3B0aW9ucyIsInBhcmFtZXRlcnMiLCJwcm9wZXJ0eUtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvdG90eXBlIiwibWV0aG9kRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImlzQXBpTWV0aG9kIiwiaGFzTWV0YWRhdGEiLCJnZXRUeXBlSXNBcnJheVR1cGxlIiwiaW5wdXQiLCJpc0FycmF5RmxhZyIsImlzSW5wdXRBcnJheSIsIm9iaiIsImdldEVudW1WYWx1ZXMiLCJlbnVtVHlwZSIsIm51bWVyaWNWYWx1ZXMiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJtYXAiLCJ0b1N0cmluZyIsImtleXMiLCJnZXRFbnVtVHlwZSIsImhhc1N0cmluZyIsImlzU3RyaW5nIiwibGVuZ3RoIiwicmVxdWlyZWQiLCJpc0VudW1BcnJheSIsIm9wdHMiLCJlbnVtIiwidW5kZWZpbmVkIiwiQXBpUHJvcGVydHkiLCJvcHRpb25zIiwiY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IiLCJlbnVtVmFsdWVzIiwiaXRlbXMiLCJBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJNb2RlbENvbnN0cnVjdG9yIiwidmVyYiIsInBhdGgiLCJodHRwVG9DcnVkIiwiR0VUIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJHZXQiLCJQT1NUIiwiQ1JFQVRFIiwiUG9zdCIsIlBVVCIsIlVQREFURSIsIlB1dCIsIlBBVENIIiwiUGF0Y2giLCJERUxFVEUiLCJEZWxldGUiLCJjcnVkT3AiLCJIdHRwTWV0aG9kRGVjb3JhdG9yIiwicmVzb2x2ZUJsb2NrVGFyZ2V0IiwiY29yZUlzT3BlcmF0aW9uQmxvY2tlZCIsImtpbmQiLCJhcHBseSIsIkFwaUV4Y2x1ZGVFbmRwb2ludCIsIkJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJSRUFEX0FMTCIsIkNSRUFURV9BTEwiLCJVUERBVEVfQUxMIiwiREVMRVRFX0FMTCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwic3RhdGVtZW50VGFyZ2V0cyIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIkxJU1RfQlkiLCJQQUdFX0JZIiwiRklORCIsIlBBR0UiLCJGSU5EX09ORV9CWSIsIkZJTkRfQlkiLCJDT1VOVF9PRiIsIk1BWF9PRiIsIk1JTl9PRiIsIkFWR19PRiIsIlNVTV9PRiIsIkRJU1RJTkNUX09GIiwiR1JPVVBfT0YiLCJzdGFydHNXaXRoIiwic3RhdGVtZW50VmFsdWUiLCJBcGlQYXJhbXNGcm9tTW9kZWwiLCJwcm9wcyIsImRlY29yYXRvcnMiLCJwIiwiQXBpUGFyYW1EZWMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJTdHJpbmciLCJhcHBseURlY29yYXRvcnMiLCJEZWNhZkJvZHkiLCJkYXRhIiwiY3R4IiwicmVxdWVzdCIsInN3aXRjaFRvSHR0cCIsImdldFJlcXVlc3QiLCJib2R5IiwiY29udHJvbGxlciIsImdldENsYXNzIiwiTW9kZWxDb25zdHIiLCJjbGFzcyIsIkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24iLCJpdGVtIiwiT3JkZXJlZFBhcmFtcyIsIm9yZGVyIiwicmVxIiwib3JpZ2luYWwiLCJwYXJhbXMiLCJvcmRlckxpc3QiLCJvcmRlcmVkIiwiayIsInJhdyIsInZhbHVlc0luT3JkZXIiLCJrZXlzSW5PcmRlciIsIkRlY2FmUGFyYW1zIiwiRGVjYWZRdWVyeSIsIl8iLCJxdWVyeSIsInBhcnNlZCIsImxpbWl0IiwibiIsIk51bWJlciIsImlzTmFOIiwib2Zmc2V0IiwiYm9va21hcmsiLCJERUNBRl9NT0RVTEVfT1BUSU9OUyIsIkRFQ0FGX0FEQVBURVJfSUQiLCJERUNBRl9UQVNLX1NFUlZJQ0VfSUQiLCJERUNBRl9ST1VURSIsIkRFQ0FGX0hBTkRMRVJTIiwiU3ltYm9sIiwiREVDQUZfRVhQT1NFIiwiREVDQUZfQ09OVFJPTExFUl9DT05GSUciLCJERUNBRl9DT05URVhUX0tFWSIsImV4cG9zZSIsImZsYXZvdXJzIiwiTWV0YWRhdGEiLCJzZXQiLCJjb250cm9sbGVyQ29uZmlnIiwiY29uZmlnIiwiY29udHJvbGxlckNvbmZpZ0RlY29yYXRvciIsIkFVVEhfSEFORExFUiIsIkFVVEhfTUVUQV9LRVkiLCJJU19QVUJMSUNfS0VZIiwiUkVRVUlSRURfUk9MRVNfS0VZIiwiU0tJUF9NT0RFTF9ST0xFU19LRVkiLCJEZWNhZlJlcXVlc3RDb250ZXh0IiwiUmVxdWVzdENvbnRleHQiLCJzdXBlciIsImhlYWRlcnNPZiIsImhlYWRlcnMiLCJ0aGlzIiwidXVpZCIsIlVVSUQiLCJpbnN0YW5jZSIsImdlbmVyYXRlIiwiZ2V0T3JVbmRlZmluZWQiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwic2tpcE1vZGVsUm9sZXMiLCJlZmZlY3RpdmVNb2RlbCIsInZlcmJvc2UiLCJkZWJ1ZyIsImF1dGhvcml6ZSIsImFwcGx5VHJhbnNmb3JtZXJzIiwidXNlciIsIm9yZ2FuaXphdGlvbiIsImN1cnJlbnRMb2ciLCJjaGlsZExvZyIsImxvZ2dlciIsImhhbmRsZSIsIkFkYXB0ZXIiLCJmbGF2b3Vyc1RvVHJhbnNmb3JtIiwiZmxhdm91ciIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJGb3IiLCJmcm9tIiwiT3B0aW9uYWwiLCJSZWZsZWN0b3IiLCJBdXRoIiwibW9kZWwiLCJyZXNvdXJjZSIsImRlY3MiLCJBcGlCZWFyZXJBdXRoIiwiVXNlSW50ZXJjZXB0b3JzIiwicHVzaCIsIlNldE1ldGFkYXRhIiwiUHVibGljIiwiUmVxdWlyZVJvbGVzIiwicm9sZXMiLCJBcGlTZWN1cml0eSIsIkh0dHBWZXJiVG9EZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJVbnN1cHBvcnRlZEVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzcGxpdCIsInNsaWNlIiwiYXBpUGFyYW1TcGVjIiwidG9EZWNhZkVycm9yIiwiZXJyb3IiLCJmYWxsYmFja01lc3NhZ2UiLCJCYXNlRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiZ2V0QXBpRGVjb3JhdG9ycyIsIm1ldGhvZE5hbWUiLCJodHRwVmVyYiIsImluY2x1ZGVRdWVyeVBhcmFtcyIsIk5lc3RIdHRwUm91dGVEZWMiLCJhcGlQYXRoUGFyYW1zIiwic3dhZ2dlclF1ZXJ5UGFyYW1zIiwiQXBpUXVlcnkiLCJPcmRlckRpcmVjdGlvbiIsIm1ldGhvZCIsIkFwaVBhcmFtIiwiQXBpT3BlcmF0aW9uIiwic3VtbWFyeSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb0NvbnRlbnRSZXNwb25zZSIsIlF1ZXJ5IiwiYXBwbHlBcGlEZWNvcmF0b3JzIiwicHJvdG8iLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kIiwicGVyc2lzdGVuY2UiLCJhcmdzIiwiTW9kZWxTZXJ2aWNlIiwic3RhdGVtZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyIiwiYXN5bmMiLCJwYXRoUGFyYW1zIiwicXVlcnlQYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlyZWN0aW9uIiwiZGVmaW5lUm91dGVNZXRob2QiLCJDb250cm9sbGVyQ2xhc3MiLCJoYW5kbGVyIiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsIkRlY2FmQXV0aEhhbmRsZXIiLCJBdXRoSGFuZGxlciIsInBhcnNlUmVxdWVzdCIsInVzZXJSb2xlIiwiYXV0aG9yaXphdGlvbiIsImV4dHJhY3RGcm9tQXV0aCIsIkF1dGhvcml6YXRpb25FcnJvciIsIkRlY2FmUm9sZUF1dGhIYW5kbGVyIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsInVzZUNsYXNzIiwiZ2xvYmFsIiwiQVBQX0lOVEVSQ0VQVE9SIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJjb250ZXh0IiwiZXhlYyIsInJlcyIsInVybCIsIkRlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciIsInJlc3BvbnNlIiwiZ2V0UmVzcG9uc2UiLCJwaXBlIiwidGFwIiwidG9SZXNwb25zZSIsIkRlY2FmQ29udHJvbGxlciIsIkh0dHBEZWNhZkNvbnRyb2xsZXIiLCJjbGllbnRDb250ZXh0IiwiX25hbWUiLCJEZWNhZk1vZGVsQ29udHJvbGxlciIsIl9wZXJzaXN0ZW5jZSIsIlNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiUmVwb3NpdG9yeSIsImZvck1vZGVsIiwidG9PdmVycmlkZXMiLCJvdmVycmlkZSIsImR0b0NhY2hlIiwiTWFwIiwiRHRvRm9yIiwib3AiLCJzdGFjayIsIlNldCIsIlRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyIsImNhY2hlIiwiZ2V0RHRvQ2FjaGUiLCJjYWNoZWQiLCJpc1VwZGF0ZU9wIiwiRHluYW1pY0RUTyIsInRvUGFzY2FsQ2FzZSIsInBrUHJvcCIsIk1vZGVsIiwicGsiLCJwa1Byb3BzTWV0YWRhdGEiLCJwa1Byb3BzIiwicGtEZXNpZ25UeXBlIiwicGtUeXBlSXNOdW1lcmljIiwiQmlnSW50IiwicGtJc0dlbmVyYXRlZCIsImdlbmVyYXRlZCIsImdlbmVyYXRlZEJ5U2VxdWVuY2UiLCJpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UiLCJhbGxQcm9wcyIsInJlbGF0aW9ucyIsInNjYWxhclByb3BzIiwicHJvcCIsImhhcyIsInZhbGlkYXRpb24iLCJnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UiLCJpc1JlcXVpcmVkIiwiVmFsaWRhdGlvbktleXMiLCJSRVFVSVJFRCIsInR5cGVIaW50IiwiZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlIiwiYXBpT3B0aW9ucyIsImRlc2lnblR5cGUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwicmVsYXRpb24iLCJyZWxhdGlvbk1ldGEiLCJyZWxhdGlvblR5cGUiLCJtZXRhIiwidmFsaWRhdGlvbkZvciIsIkxJU1QiLCJpc0NpcmN1bGFyIiwicGtUeXBlTmFtZSIsImdldFBrT3BlbkFwaVR5cGUiLCJhZGRSZWxhdGlvblBrUmVmIiwicmVsYXRpb25EdG8iLCJhZGQiLCJhZGRSZWxhdGlvblVwZGF0ZSIsImFkZFJlbGF0aW9uIiwiRHRvQ2xhc3MiLCJleHRyYU1vZGVscyIsImR0b1JlZiIsIm9uZU9mSXRlbXMiLCIkcmVmIiwib25lT2YiLCJwa1R5cGUiLCJjdXJyZW50IiwiRnVuY3Rpb24iLCJnZXRQcm90b3R5cGVPZiIsIldlYWtNYXAiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwiQ29udGV4dCIsInBlbmRpbmciLCJoZWFkZXIiLCJNb2RlbEJ1aWxkZXIiLCJkZWNvcmF0ZUNsYXNzIiwiX2NsYXNzRGVjb3JhdG9ycyIsIl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0Iiwib3JpZ2luYWxCdWlsZCIsImJ1aWxkIiwicmVzdWx0IiwiY2FsbCIsImRlY29yYXRlZCIsIkZyb21Nb2RlbENvbnRyb2xsZXIiLCJnZXRQZXJzaXN0ZW5jZSIsIk1vZGVsQ2xhenoiLCJlMiIsImNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnkiLCJwcmVmaXgiLCJQZXJzaXN0ZW5jZUtleXMiLCJRVUVSWSIsInJlcG8iLCJxdWVyeU1ldGhvZHMiLCJyb3V0ZU1ldGhvZHMiLCJRdWVyeUNvbnRyb2xsZXIiLCJlbnRyaWVzIiwic2VnbWVudCIsInRyaW0iLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsImdsb2JhbERlZmF1bHRzIiwidGFibGVOYW1lIiwidG9LZWJhYkNhc2UiLCJtb2RlbENsYXp6TmFtZSIsImZhY3RvcnlQZXJzaXN0ZW5jZSIsImRlY29yYXRvckNvbmZpZyIsIm1vZHVsZU92ZXJyaWRlIiwibWVyZ2VkQ29uZmlnIiwiRmFjdG9yeUNvbnRyb2xsZXIiLCJNb2RlbENvbnRyb2xsZXJGYWN0b3J5IiwiZmFjdG9yeVJvdXRlcyIsIl9fcm91dGVzX18iLCJnZXRQSyIsImFwaVByb3BlcnRpZXMiLCJwa1BhdGgiLCJnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwiLCJhdXRoQ29uZmlnIiwiYXV0aCIsImFwcGx5Q2xhc3NBdXRoIiwicHVibGljIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiQm9vbGVhbiIsImJTZWdtZW50cyIsImFQYXJhbUNvdW50IiwicyIsImJQYXJhbUNvdW50IiwiYUxpdGVyYWxDb3VudCIsImJMaXRlcmFsQ291bnQiLCJyb3V0ZSIsImltcGxlbWVudGF0aW9uIiwidG9Mb3dlckNhc2UiLCJyZWdpc3RyYXRpb24iLCJtYXRjaFJvdXRlIiwicmVnaXN0ZXJlZE1ldGhvZE5hbWUiLCJwYXJhbURlY29yYXRvcnMiLCJjb21wb3NlZCIsIkRCS2V5cyIsIkNPTVBPU0VEIiwiY29tcG9zZWRLZXlzIiwidW5pcXVlS2V5cyIsInNlcGFyYXRvciIsInJvdXRlUGFyYW1EZWNvcmF0b3JzIiwicGFyYW1JbmRleCIsImZsYXRNYXAiLCJQYXJhbSIsIm1ldGhvZERlY29yYXRvcnMiLCJub3JtYWxpemVkUGF0aCIsImNyZWF0ZVJlZ2lzdHJhdGlvbiIsImNyZWF0ZUNyZWF0ZURlY29yYXRvcnMiLCJSZXNwb25zZSIsInBhc3N0aHJvdWdoIiwiYnVsa0NyZWF0ZURlY29yYXRvcnMiLCJidWxrUmVhZERlY29yYXRvcnMiLCJidWxrVXBkYXRlRGVjb3JhdG9ycyIsImJ1bGtEZWxldGVEZWNvcmF0b3JzIiwicmVhZERlY29yYXRvcnMiLCJyb3V0ZVBhcmFtcyIsInVwZGF0ZURlY29yYXRvcnMiLCJkZWxldGVEZWNvcmF0b3JzIiwiZmFsbGJhY2tTZWdtZW50cyIsImlzQWxsUGFyYW1zIiwiZXZlcnkiLCJmYWxsYmFja0FwaVByb3BzIiwic3VmZml4Iiwic3RhdGVtZW50RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0UGFyYW1zIiwic3RhdGVtZW50Um91dGVzIiwic3RhdGVtZW50S2V5Iiwic3RhdGVtZW50TWV0aG9kTmFtZSIsInF1ZXJ5TWV0aG9kIiwiY29tcGxleFF1ZXJ5UGFyYW1zIiwicGF0aFNlZ21lbnRzIiwia25vd25QcmVmaXhlcyIsImZpcnN0U2VnbWVudCIsInNlZ21lbnRzIiwic2VnIiwiaSIsImNyZWF0ZUNyZWF0ZUhhbmRsZXIiLCJyZXNwIiwibG9nQ3R4IiwiY3JlYXRlZCIsImNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyIiwiY3JlYXRlQWxsIiwiY3JlYXRlQnVsa1JlYWRIYW5kbGVyIiwicmVhZEFsbCIsImlkcyIsIm5vcm1hbGl6ZWRJZHMiLCJyZWFkIiwiY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIiLCJ1cGRhdGVBbGwiLCJ1cGRhdGVkIiwiY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIiLCJkZWxldGVBbGwiLCJjcmVhdGVSZWFkSGFuZGxlciIsImlkIiwiVmFsaWRhdGlvbkVycm9yIiwicmVhZFJlc3VsdCIsImNyZWF0ZVVwZGF0ZUhhbmRsZXIiLCJ1cGRhdGUiLCJwYXlsb2FkIiwicGFyc2UiLCJjcmVhdGVEZWxldGVIYW5kbGVyIiwicmVtb3ZlIiwiZGVsIiwiZGVsZXRlIiwiY3JlYXRlU3RhdGVtZW50SGFuZGxlciIsImRldGFpbHMiLCJTVEFURU1FTlQiLCJwYXJzZUludCIsInBhdGhEaXJlY3Rpb24iLCJyZXNvbHZlZERpcmVjdGlvbiIsImNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlciIsInN0YXRlbWVudFNob3J0Y3V0IiwibGlzdEJ5IiwicGFnZSIsInBhZ2luYXRlQnkiLCJBU0MiLCJmaW5kIiwicmVmIiwiZmluZE9uZUJ5IiwiZmluZEJ5IiwiZmllbGQiLCJjb21wbGV4UXVlcnkiLCJzcHJlYWRBcmdzIiwibm9ybWFsaXplUXVlcnlBcmdzIiwiY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyIiwiY3VzdG9tUm91dGUiLCJleHRyYWN0UXVlcnlBcmdzIiwibGFzdCIsInF1ZXJ5T2JqIiwicG9wIiwiaGFzRGlyZWN0aW9uIiwiaGFzTGltaXQiLCJoYXNPZmZzZXQiLCJleHRyYXMiLCJoYXNRdWVyeUZpZWxkcyIsIkFwaUJvZHkiLCJBcGlDcmVhdGVkUmVzcG9uc2UiLCJzY2hlbWEiLCJnZXRTY2hlbWFQYXRoIiwiQXBpQmFkUmVxdWVzdFJlc3BvbnNlIiwiQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlIiwiQXBpTm90Rm91bmRSZXNwb25zZSIsImJhc2UiLCJnZXRNb2R1bGVGb3IiLCJEZWNhZk1vZGVsTW9kdWxlIiwiRGVjYWZNb2RlbE1vZHVsZV8xIiwiY3JlYXRlTW9kZWxTZXJ2aWNlcyIsIm1vZGVscyIsInVzZUZhY3RvcnkiLCJpc0V4cG9zZWQiLCJleHBvc3VyZSIsInRyYWNrZWRNb2RlbHMiLCJjb250cm9sbGVyRXhwb3N1cmUiLCJtb2RlbFNlcnZpY2VzIiwiYXV0b1NlcnZpY2VzIiwiYWdncmVnYXRpb25zIiwiYWxsb3dHcm91cGluZ1F1ZXJpZXMiLCJjb250cm9sbGVycyIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJTkpFQ1RBQkxFIiwiZXh0ZW5kIiwibmVzdEluamVjdGFibGUiLCJjYXRlZ29yeSIsImNmZyIsIkRlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyIsInNpbmdsZXRvbiIsIkRFRkFVTFQiLCJkdXJhYmxlIiwiSU5KRUNUIiwibmVzdEluamVjdCIsImlubmVyTmVzdEluamVjdCIsIk1BWCIsIm1heERlYyIsIm1heCIsIm1heGltdW0iLCJNSU4iLCJtaW5EZWMiLCJtaW4iLCJtaW5pbXVtIiwiTUFYX0xFTkdUSCIsIm1heExlbmd0aERlYyIsIm1heExlbmd0aCIsIk1JTl9MRU5HVEgiLCJtaW5MZW5ndGhEZWMiLCJtaW5MZW5ndGgiLCJUWVBFIiwidHlwZURlYyIsIkRBVEUiLCJkYXRlRGVjIiwiZm9ybWF0IiwiRU5VTSIsIm9wdGlvbkRlYyIsIlBBVFRFUk4iLCJwYXR0ZXJuRGVjIiwicGF0IiwicGF0dGVybiIsInNvdXJjZSIsIkNPTFVNTiIsImNvbHVtbkRlYyIsIkRlY29yYXRpb25LZXlzIiwiREVTQ1JJUFRJT04iLCJkZXNjcmlwdGlvbkRlYyIsIkFVVEgiLCJDb3JzRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIm1zZyIsIlRvTWFueVJlcXVlc3RzRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJnZXRTdGF0dXMiLCJzdGF0dXMiLCJjb2RlIiwianNvbiIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJzY2hlbWUiLCJiZWFyZXJGb3JtYXQiLCJpbiIsInBlcnNpc3RBdXRob3JpemF0aW9uIiwidG9wYmFyQmdDb2xvciIsIlN3YWdnZXJDdXN0b21VSSIsImN1c3RvbUNTUyIsImNzcyIsInRvcGJhckljb25QYXRoIiwiaW1nIiwiYjY0IiwiZ2V0Q3VzdG9tT3B0aW9ucyIsImZhdmljb24iLCJmYXZpY29uUGF0aCIsImN1c3RvbVNpdGVUaXRsZSIsImN1c3RvbUNzcyIsInN3YWdnZXJPcHRpb25zIiwiZmlsZSIsImZpbGVQYXRoIiwiYXNzZXRzUGF0aCIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiU3dhZ2dlckJ1aWxkZXIiLCJhcHAiLCJjcmVhdGVEb2N1bWVudCIsIm9wZW5BcGlKc29uUGF0aCIsIm9wZW5BcGlZYW1sUGF0aCIsIkRvY3VtZW50QnVpbGRlciIsInNldFRpdGxlIiwic2V0RGVzY3JpcHRpb24iLCJzZXRWZXJzaW9uIiwiYWRkQmVhcmVyQXV0aCIsIlN3YWdnZXJNb2R1bGUiLCJyZWdpc3Rlck9wZW5BcGlSb3V0ZSIsImNvbnRlbnRUeXBlIiwiYm9keUZhY3RvcnkiLCJodHRwQWRhcHRlciIsImdldEh0dHBBZGFwdGVyIiwiX3JlcSIsInJlcGx5Iiwic2V0dXBTd2FnZ2VyIiwiZG9jdW1lbnQiLCJzd2FnZ2VyVUkiLCJzZXR1cCIsImpzb25Eb2N1bWVudFVybCIsInlhbWxEb2N1bWVudFVybCIsIllBTUwiLCJOZXN0Qm9vdHN0cmFwZXIiLCJfbG9nZ2VyIiwiTG9nZ2VyIiwiaW5pdGlhbGl6ZSIsImVuYWJsZUxvZ2dlciIsImN1c3RvbUxvZ2dlciIsInVzZUxvZ2dlciIsImVuYWJsZUNvcnMiLCJvcmlnaW5zIiwiYWxsb3dNZXRob2RzIiwiYWxsb3dlZE9yaWdpbnMiLCJvIiwiY29yc09wdGlvbnMiLCJvcmlnaW4iLCJjYWxsYmFjayIsImNyZWRlbnRpYWxzIiwibWV0aG9kcyIsInVzZUhlbG1ldCIsImhlbG1ldCIsInJlcXVpcmUiLCJ1c2UiLCJ3YXJuIiwic3dhZ2dlciIsInVzZUdsb2JhbFBpcGVzIiwicGlwZXMiLCJ1c2VHbG9iYWxGaWx0ZXJzIiwiZmlsdGVycyIsInVzZUdsb2JhbEludGVyY2VwdG9ycyIsImludGVyY2VwdG9ycyIsInN0YXJ0IiwicG9ydCIsInByb2Nlc3MiLCJQT1JUIiwibGlzdGVuIiwidGhlbiIsImdldFVybCIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcl8xIiwiZXhlY3V0b3IiLCJjb250ZXh0dWFsaXplIiwiZmxhZ3MiLCJpcCIsImV4dHJhY3RJcCIsIkRlZmF1bHRBZGFwdGVyRmxhZ3MiLCJvcGVyYXRpb24iLCJwYXJzZUlwSGVhZGVyIiwiY2FuZGlkYXRlIiwicGVuZGluZ1Byb3ZpZGVycyIsImdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyIsInJlZ2lzdGVyUHJvdmlkZXIiLCJ0b2tlbiIsImlzTW9kZWxDb25zdHJ1Y3RvciIsIm1vZGVsU2VydmljZVRva2VuIiwibW9kZWxSZXBvc2l0b3J5VG9rZW4iLCJwYXJhbWV0ZXJJbmRleCIsInJlc29sdmVkIiwicGFyYW1UeXBlcyIsImFzTW9kZWwiLCJpbmplY3RhYmxlU2VydmljZUtleSIsIkNvcmVTZXJ2aWNlIiwiQ29yZVJlcG9zaXRvcnkiLCJEZWNhZkNvcmVNb2R1bGUiLCJEZWNhZkNvcmVNb2R1bGVfMSIsIm1vZHVsZVJlZiIsImRlY2FmUHJvdmlkZXJzIiwidXNlVmFsdWUiLCJjbGllbnQiLCJIIiwicHJvdmlkZXIiLCJib290UGVyc2lzdGVuY2UiLCJ0cmltbWVkIiwiY29uZiIsImNvbnRyIiwicG9zc2libGUiLCJQZXJzaXN0ZW5jZVNlcnZpY2UiLCJib290IiwiY2xpZW50cyIsImMiLCJwb3NzaWJsZVRyYW5zZiIsInJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciIsImluaXRpYWxpemF0aW9uIiwib25BcHBsaWNhdGlvblNodXRkb3duIiwiYWRhcHRlcnMiLCJzaHV0ZG93biIsIkdsb2JhbCIsIk1vZHVsZVJlZiIsIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyIsIm5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UiLCJtb2RlbENvbnN0ciIsInNlcmlhbGl6ZWRQYXlsb2FkIiwic2VyaWFsaXplIiwiY29uc29sZSIsImVyciIsIkV2ZW50c0NvbnRyb2xsZXIiLCJFdmVudHNDb250cm9sbGVyXzEiLCJldmVudHMkIiwiT2JzZXJ2YWJsZSIsIm9ic2VydmVyIiwib2JzZXJ2ZXJJZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1VwcGVyQ2FzZSIsImNiIiwicmVmcmVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWRhcHRlck5hbWUiLCJvYnNlcnZlIiwidW5PYnNlcnZlIiwiSEVBUlRCRUFUX0lOVEVSVkFMX01TIiwiaGVhcnRiZWF0JCIsImludGVydmFsIiwidHMiLCJtZXJnZSIsImxpc3RlbkZvck1vZGVsIiwiU3NlIiwiRGVjYWZTdHJlYW1Nb2R1bGUiLCJEZWNhZlN0cmVhbU1vZHVsZV8xIiwiZm9yRmxhdm91cnMiLCJpbXBvcnRzIiwiUm91dGVyTW9kdWxlIiwicmVnaXN0ZXIiLCJEZWNhZk1vZHVsZSIsIkRlY2FmTW9kdWxlXzEiLCJmb3JSb290QXN5bmMiLCJhdXRvQ29udHJvbGxlcnMiLCJvYnNlcnZlck9wdGlvbnMiLCJlbmFibGVPYnNlcnZlckV2ZW50cyIsIm9ic2VydmVyRmxhdm91cnMiLCJydW5NaWdyYXRpb25zIiwicmVwb0Zvck1vZGVsIiwibSIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJhbGxvd1JlcmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBTyxNQUFNQSxvQkFBb0I7SUFDMUIsTUFBTUMsYUFBYTtRQUN4QkMsZUFBZSxHQUFHRjtRQUNsQkcsY0FBYyxHQUFHSDtRQUNqQkksY0FBYyxHQUFHSjtRQUNqQkssY0FBYyxHQUFHTDtRQUNqQk0sVUFBVSxHQUFHTjtRQUNiTyxlQUFlLEdBQUdQO1FBQ2xCUSxnQkFBZ0IsR0FBR1I7UUFDbkJTLGFBQWEsR0FBR1Q7UUFDaEJVLHNCQUFzQixHQUFHVjtRQUN6QlcsNEJBQTRCLEdBQUdYO1FBQy9CWSxjQUFjLEdBQUdaO1FBQ2pCYSxzQkFBc0IsR0FBR2I7UUFDekJjLHdCQUF3QixHQUFHZDtRQUMzQmUsa0JBQWtCLEdBQUdmO1FBQ3JCZ0IsZUFBZSxHQUFHaEI7UUFDbEJpQixZQUFZLEdBQUdqQjtRQUNma0Isb0JBQW9CLEdBQUdsQjtRQUN2Qm1CLFVBQVUsR0FBR25COztJQ2hCUixNQUFNb0IsZ0JBQWlCQyxPQUFzQkEsUUFBUTtJQUNyRCxNQUFNQyx3QkFBd0I7SUFFOUIsTUFBTUMsa0JBQWtCO0lBRXpCLFNBQVVDLHNCQUNkQyxTQUNBQyxXQUNBQyxrQkFBRUEsb0JBQXFCO1FBQUVBLGtCQUFrQjs7UUFFM0MsT0FBTyxDQUNMQyxRQUNBQyxLQUNBQztZQUVBLFdBQVdKLGFBQWEsVUFBVTtnQkFDaEMs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
|
|
2420
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvb3ZlcnJpZGVzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdmVycmlkZXMvaGVscGVycy50cyIsIi4uL3NyYy9vdmVycmlkZXMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaU9wZXJhdGlvbkZyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0FwaVBhcmFtc0Zyb21Nb2RlbC50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmQm9keS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL0RlY2FmUGFyYW1zLnRzIiwiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2V4cG9zZS50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2NvbnRyb2xsZXItY29uZmlnLnRzIiwiLi4vc3JjL2F1dGgvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dC50cyIsIi4uL3NyYy9hdXRoL0F1dGhJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aEhhbmRsZXIudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0Zyb21Nb2RlbENvbnRyb2xsZXIudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRGVjYWZNb2RlbE1vZHVsZS50cyIsIi4uL3NyYy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL2NvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvdGhyb3R0bGluZy50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvRGVjYWZFcnJvckZpbHRlci50cyIsIi4uL3NyYy9mYWN0b3J5L2V4Y2VwdGlvbnMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQ3VzdG9tVUkudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJCdWlsZGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvTmVzdEJvb3RzdHJhcGVyLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9jb3JlLW1vZHVsZS50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL2NvbnN0YW50LnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvdXRpbHMudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9FdmVudHNDb250cm9sbGVyLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvRGVjYWZTdHJlYW1Nb2R1bGUudHMiLCIuLi9zcmMvbW9kdWxlLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUNPUkFUT1JTX1BSRUZJWCA9IFwic3dhZ2dlclwiO1xuZXhwb3J0IGNvbnN0IERFQ09SQVRPUlMgPSB7XG4gIEFQSV9PUEVSQVRJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlPcGVyYXRpb25gLFxuICBBUElfUkVTUE9OU0U6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlSZXNwb25zZWAsXG4gIEFQSV9QUk9EVUNFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVByb2R1Y2VzYCxcbiAgQVBJX0NPTlNVTUVTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ29uc3VtZXNgLFxuICBBUElfVEFHUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVVzZVRhZ3NgLFxuICBBUElfQ0FMTEJBQ0tTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpQ2FsbGJhY2tzYCxcbiAgQVBJX1BBUkFNRVRFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlQYXJhbWV0ZXJzYCxcbiAgQVBJX0hFQURFUlM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlIZWFkZXJzYCxcbiAgQVBJX01PREVMX1BST1BFUlRJRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlNb2RlbFByb3BlcnRpZXNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc0FycmF5YCxcbiAgQVBJX1NFQ1VSSVRZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2VjdXJpdHlgLFxuICBBUElfRVhDTFVERV9FTkRQT0lOVDogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVFbmRwb2ludGAsXG4gIEFQSV9FWENMVURFX0NPTlRST0xMRVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeGNsdWRlQ29udHJvbGxlcmAsXG4gIEFQSV9FWFRSQV9NT0RFTFM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRyYU1vZGVsc2AsXG4gIEFQSV9FWFRFTlNJT046IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlFeHRlbnNpb25gLFxuICBBUElfU0NIRU1BOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpU2NoZW1hYCxcbiAgQVBJX0RFRkFVTFRfR0VUVEVSOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRGVmYXVsdEdldHRlcmAsXG4gIEFQSV9MSU5LOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTGlua2AsXG59O1xuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNVbmRlZmluZWQsIG5lZ2F0ZSwgcGlja0J5IH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25zdHJ1Y3RvciA9ICh2YWw6IGFueSk6IGJvb2xlYW4gPT4gdmFsID09PSBcImNvbnN0cnVjdG9yXCI7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfRkFDVE9SWV9OQU1FID0gXCJfT1BFTkFQSV9NRVRBREFUQV9GQUNUT1JZXCI7XG5cbmV4cG9ydCBjb25zdCBNRVRIT0RfTUVUQURBVEEgPSBcIm1ldGhvZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICB7IG92ZXJyaWRlRXhpc3RpbmcgfSA9IHsgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZSB9XG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgaWYgKHByZXZWYWx1ZSAmJiAhb3ZlcnJpZGVFeGlzdGluZykge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHsgLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YSB9LFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGEsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xhc3NEZWNvcmF0b3I8VCBleHRlbmRzIEFycmF5PGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUID0gW10gYXMgYW55XG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IFtdO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgWy4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGFdLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAodGFyZ2V0Py5jb25zdHJ1Y3RvciBhcyBhbnkpPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FIGFzIGFueV0/LigpW1xuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgIF0/LnR5cGUgPz8gUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNaXhlZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVFxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBsZXQgbWV0YWRhdGFzOiBhbnk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgICAgbWV0YWRhdGFzID0gWy4uLnByZXZpb3VzTWV0YWRhdGEsIC4uLm1ldGFkYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPVxuICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSkgfHwge307XG4gICAgICAgIG1ldGFkYXRhcyA9IHsgLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfTtcbiAgICAgIH1cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQpIHx8IHt9O1xuICAgICAgbWV0YWRhdGFzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2aW91c01ldGFkYXRhKSwgbWV0YWRhdGEpO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhcywgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFyYW1EZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRhZGF0YTogVCxcbiAgaW5pdGlhbDogUGFydGlhbDxUPlxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICB0YXJnZXQ6IG9iamVjdCB8IEZ1bmN0aW9uLFxuICAgIGtleT86IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBhbnkgPT4ge1xuICAgIGNvbnN0IHBhcmFtT3B0aW9ucyA9IHtcbiAgICAgIC4uLmluaXRpYWwsXG4gICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgIH07XG5cbiAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUywgZGVzY3JpcHRvci52YWx1ZSkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldC5wcm90b3R5cGUpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBwcm9wZXJ0eUtleXMpIHtcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKHByb3BlcnR5S2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuXG4gICAgICBpZiAoIW1ldGhvZERlc2NyaXB0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQXBpTWV0aG9kID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcbiAgICAgICAgTUVUSE9EX01FVEFEQVRBLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzQXBpTWV0aG9kKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVJc0FycmF5VHVwbGUoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgaW5wdXQ6IEZ1bmN0aW9uIHwgW0Z1bmN0aW9uXSB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGlzQXJyYXlGbGFnOiBib29sZWFuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgcmV0dXJuIFtpbnB1dCBhcyBGdW5jdGlvbiwgaXNBcnJheUZsYWddO1xuICB9XG4gIGNvbnN0IGlzSW5wdXRBcnJheSA9IGlzQXJyYXkoaW5wdXQpO1xuICBjb25zdCB0eXBlID0gaXNJbnB1dEFycmF5ID8gaW5wdXRbMF0gOiBpbnB1dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpc1N0cmluZywgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRUeXBlSXNBcnJheVR1cGxlLCBNRVRBREFUQV9GQUNUT1JZX05BTUUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEVudW1BbGxvd2VkVHlwZXMsXG4gIEVudW1TY2hlbWFBdHRyaWJ1dGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbiAgU3dhZ2dlckVudW1UeXBlLFxufSBmcm9tIFwiLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNVbmRlZmluZWQgPSAob2JqOiBhbnkpOiBvYmogaXMgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVmFsdWVzKFxuICBlbnVtVHlwZTogU3dhZ2dlckVudW1UeXBlIHwgKCgpID0+IFN3YWdnZXJFbnVtVHlwZSlcbik6IHN0cmluZ1tdIHwgbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIGVudW1UeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZ2V0RW51bVZhbHVlcyhlbnVtVHlwZSgpKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGVudW1UeXBlKSkge1xuICAgIHJldHVybiBlbnVtVHlwZSBhcyBzdHJpbmdbXTtcbiAgfVxuICBpZiAodHlwZW9mIGVudW1UeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIEVudW1zIHdpdGggbnVtZXJpYyB2YWx1ZXNcbiAgLy8gICBlbnVtIFNpemUge1xuICAvLyAgICAgU01BTEwgPSAxLFxuICAvLyAgICAgQklHID0gMlxuICAvLyAgIH1cbiAgLy8gYXJlIHRyYW5zcGlsZWQgdG8gaW5jbHVkZSBhIHJldmVyc2UgbWFwcGluZ1xuICAvLyAgIGNvbnN0IFNpemUgPSB7XG4gIC8vICAgICBcIjFcIjogXCJTTUFMTFwiLFxuICAvLyAgICAgXCIyXCI6IFwiQklHXCIsXG4gIC8vICAgICBcIlNNQUxMXCI6IDEsXG4gIC8vICAgICBcIkJJR1wiOiAyLFxuICAvLyAgIH1cbiAgY29uc3QgbnVtZXJpY1ZhbHVlcyA9IE9iamVjdC52YWx1ZXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIilcbiAgICAubWFwKCh2YWx1ZTogYW55KSA9PiB2YWx1ZS50b1N0cmluZygpKTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW51bVR5cGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhbnVtZXJpY1ZhbHVlcy5pbmNsdWRlcyhrZXkpKVxuICAgIC5tYXAoKGtleSkgPT4gZW51bVR5cGVba2V5IGFzIGFueV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW51bVR5cGUodmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIge1xuICBjb25zdCBoYXNTdHJpbmcgPSB2YWx1ZXMuZmlsdGVyKGlzU3RyaW5nKS5sZW5ndGggPiAwO1xuICByZXR1cm4gaGFzU3RyaW5nID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksIHRhcmdldCkgfHwgW107XG5cbiAgICBjb25zdCBrZXkgPSBgOiR7cHJvcGVydHlLZXl9YDtcbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSxcbiAgICAgICAgWy4uLnByb3BlcnRpZXMsIGA6JHtwcm9wZXJ0eUtleX1gXSxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoZXhpc3RpbmdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBwaWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpO1xuICAgICAgY29uc3QgbWV0YWRhdGFUb1NhdmUgPSBvdmVycmlkZUV4aXN0aW5nXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgfTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YVRvU2F2ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lc3QganMgY29kZVxuICAgICAgICB0YXJnZXQ/LmNvbnN0cnVjdG9yPy5bTUVUQURBVEFfRkFDVE9SWV9OQU1FXT8uKClbcHJvcGVydHlLZXldPy50eXBlID8/XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcblxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBEZWZhdWx0IHRvIG9wdGlvbmFsIHVubGVzcyBAcmVxdWlyZWQoKSBpcyB1c2VkXG4gICAgICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICB9XG4gIH0pIGFzIFByb3BlcnR5RGVjb3JhdG9yO1xufVxuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgPSBTY2hlbWFPYmplY3RNZXRhZGF0YSAmIHtcbiAgXCJ4LWVudW1OYW1lc1wiPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMYXp5IGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdHlwZSBmb3Igd2hpY2ggdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICAgKiBjYW4gYmUgdXNlZCBhcyBhbiBpZFxuICAgKlxuICAgKiBVc2UgdG9nZXRoZXIgd2l0aCBAQXBpRGVmYXVsdEdldHRlciBvbiB0aGUgZ2V0dGVyIHJvdXRlIG9mIHRoZSB0eXBlXG4gICAqIHRvIGdlbmVyYXRlIE9wZW5BUEkgbGluayBvYmplY3RzXG4gICAqXG4gICAqIEBzZWUgW1N3YWdnZXIgbGluayBvYmplY3RzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2xpbmtzLylcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgbGluaz86ICgpID0+IFR5cGU8dW5rbm93bj4gfCBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5T3B0aW9ucyA9XG4gIHwgQXBpUHJvcGVydHlDb21tb25PcHRpb25zXG4gIHwgKEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyAmIHtcbiAgICAgIGVudW1OYW1lOiBzdHJpbmc7XG4gICAgICBlbnVtU2NoZW1hPzogRW51bVNjaGVtYUF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbmNvbnN0IGlzRW51bUFycmF5ID0gKFxuICBvcHRzOiBBcGlQcm9wZXJ0eU9wdGlvbnNcbik6IG9wdHMgaXMge1xuICBpc0FycmF5OiB0cnVlO1xuICBlbnVtOiBFbnVtQWxsb3dlZFR5cGVzO1xuICB0eXBlOiBhbnk7XG4gIGl0ZW1zOiBhbnk7XG59ID0+IChvcHRzLmlzQXJyYXkgJiYgXCJlbnVtXCIgaW4gb3B0cyAmJiBvcHRzLmVudW0gIT09IHVuZGVmaW5lZCkgYXMgYm9vbGVhbjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQcm9wZXJ0eShcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9LFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICBjb25zdCBbdHlwZSwgaXNBcnJheV0gPSBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICAgIG9wdGlvbnMudHlwZSxcbiAgICBvcHRpb25zLmlzQXJyYXkgYXMgYW55XG4gICk7XG4gIG9wdGlvbnMgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICB0eXBlLFxuICAgIGlzQXJyYXksXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zO1xuXG4gIGlmIChpc0VudW1BcnJheShvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudHlwZSA9IFwiYXJyYXlcIjtcblxuICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBnZXRFbnVtVmFsdWVzKG9wdGlvbnMuZW51bSk7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IGdldEVudW1UeXBlKGVudW1WYWx1ZXMpLFxuICAgICAgZW51bTogZW51bVZhbHVlcyxcbiAgICB9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgZGVsZXRlIG9wdGlvbnMuZW51bTtcbiAgfSBlbHNlIGlmIChcImVudW1cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuZW51bSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcblxuICAgIG9wdGlvbnMuZW51bSA9IGVudW1WYWx1ZXM7XG4gICAgb3B0aW9ucy50eXBlID0gZ2V0RW51bVR5cGUoZW51bVZhbHVlcyk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnR5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuICAgIG9wdGlvbnMuaXRlbXMgPSB7XG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpdGVtczoge1xuICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGVbMF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IoXG4gICAgREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFUyxcbiAgICBvcHRpb25zLFxuICAgIG92ZXJyaWRlRXhpc3RpbmdcbiAgKTtcbn1cbiIsImltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25kaXRpb25hbGx5IGFwcGxpZXMgYW4gSFRUUCBtZXRob2QgZGVjb3JhdG9yIGZvciBhIGdpdmVuIG1vZGVsIGFuZCB2ZXJiLCBoaWRpbmcgdGhlIGVuZHBvaW50IGluIFN3YWdnZXIgKGFuZCBub3QgcmVnaXN0ZXJpbmcgdGhlIHJvdXRlKSB3aGVuIHRoZSBtb2RlbCBibG9ja3MgdGhhdCBDUlVEIG9wZXJhdGlvbi5cbiAqIEBzdW1tYXJ5IE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIGBDcnVkT3BlcmF0aW9uc2Aga2V5IGFuZCBOZXN0IEhUVFAgZGVjb3JhdG9yIChgQEdldGAsIGBAUG9zdGAsIGV0Yy4pLiBJdCBjaGVja3MgYGlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApYCBhbmQsIGlmIGJsb2NrZWQsIGFwcGxpZXMgb25seSBgQEFwaUV4Y2x1ZGVFbmRwb2ludCgpYCAoU3dhZ2dlci1oaWRkZW4sIG5vIE5lc3Qgcm91dGUpLiBJZiBwZXJtaXR0ZWQsIGl0IGFwcGxpZXMgdGhlIGFwcHJvcHJpYXRlIEhUVFAgZGVjb3JhdG9yIHdpdGggdGhlIG9wdGlvbmFsIGBwYXRoYC5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHVzZWQgdG8gcmVzb2x2ZSBvcGVyYXRpb24tYmxvY2tpbmcgcnVsZXMuXG4gKiBAcGFyYW0ge0h0dHBWZXJic30gdmVyYiAtIFRoZSBIVFRQIHZlcmIgdG8gbWFwIChlLmcuLCBgXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIiB8IFwiREVMRVRFXCJgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCByb3V0ZSBwYXRoIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5lc3QgSFRUUCBtZXRob2QgZGVjb3JhdG9yLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCBlaXRoZXIgZXhjbHVkZXMgdGhlIGVuZHBvaW50IGZyb20gU3dhZ2dlciAoYW5kIHJvdXRlIHJlZ2lzdHJhdGlvbikgb3IgYXBwbGllcyB0aGUgY29ycmVjdCBIVFRQIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlJFQURfQUxMLCBHZXRdLFxuICAgIFBPU1Q6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCwgUG9zdF0sXG4gICAgUFVUOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIFB1dF0sXG4gICAgUEFUQ0g6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUGF0Y2hdLFxuICAgIERFTEVURTogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcGF0aCA/IHJlc29sdmVCbG9ja1RhcmdldCh2ZXJiLCBwYXRoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRhcmdldFxuICAgID8gY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCB0YXJnZXQua2luZCBhcyBhbnksIHRhcmdldC52YWx1ZSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpXG4gICAgOiBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIFwiYnVsa1wiIGFzIGFueSwgY3J1ZE9wIGFzIGFueSlcbiAgICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgICA6IGFwcGx5KEh0dHBNZXRob2REZWNvcmF0b3IocGF0aCkpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrVGFyZ2V0KFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6XG4gIHwgeyBraW5kOiBcImNydWRcIiB8IFwic3RhdGVtZW50XCIgfCBcInF1ZXJ5XCIgfCBcImJ1bGtcIjsgdmFsdWU6IHN0cmluZyB9XG4gIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICBjb25zdCBzdGF0ZW1lbnRUYXJnZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCI6IFwic3RhdGVtZW50XCIsXG4gICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgfTtcblxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJxdWVyeVwiLCB2YWx1ZTogbm9ybWFsaXplZC5yZXBsYWNlKC9ecXVlcnlcXC8vLCBcIlwiKSB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdGVtZW50VmFsdWUgPSBzdGF0ZW1lbnRUYXJnZXRzW25vcm1hbGl6ZWRdO1xuICBpZiAoc3RhdGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRlbWVudFwiLCB2YWx1ZTogc3RhdGVtZW50VmFsdWUgfTtcbiAgfVxuXG4gIGlmICh2ZXJiID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImNydWRcIiwgdmFsdWU6IE9wZXJhdGlvbktleXMuUkVBRCB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpUGFyYW0gYXMgQXBpUGFyYW1EZWMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGEgc2V0IG9mIFN3YWdnZXIgYEBBcGlQYXJhbWAgZGVjb3JhdG9ycyBnZW5lcmF0ZWQgZnJvbSBhIHR5cGVkIHNwZWNpZmljYXRpb24gYXJyYXkuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGVhY2ggZW50cnkgb2YgdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBpbnRvIGEgY29ycmVzcG9uZGluZyBgQEFwaVBhcmFtKClgIGRlY29yYXRvciAoZGVmYXVsdGluZyBgZGVzY3JpcHRpb25gLCBgcmVxdWlyZWRgLCBhbmQgYHR5cGVgIHdoZW4gb21pdHRlZCkgYW5kIGNvbXBvc2VzIHRoZW0gaW50byBhIHNpbmdsZSBkZWNvcmF0b3IgdmlhIE5lc3QncyBgYXBwbHlEZWNvcmF0b3JzYC4gVXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHJ1bnRpbWUgcm91dGUgcGFyYW1zIHdpdGggT3BlbkFQSSBkb2N1bWVudGF0aW9uIGluIGEgY29uY2lzZSwgZGVjbGFyYXRpdmUgd2F5LlxuICogQHBhcmFtIHtBcGlQYXJhbVtdfSBbcHJvcHM9W11dIEFycmF5IGRlc2NyaWJpbmcgcGF0aCBwYXJhbWV0ZXJzIHRvIGJlIGRvY3VtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHNbXS5uYW1lIFRoZSBwYXJhbWV0ZXIncyBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHJvdXRlIHRlbXBsYXRlIChlLmcuLCBgOmlkYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BzW10uZGVzY3JpcHRpb25dIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXI7IGRlZmF1bHRzIHRvIGBcIlBhdGggcGFyYW1ldGVyOiA8bmFtZT5cImAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wc1tdLnJlcXVpcmVkPXRydWVdIFdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyByZXF1aXJlZDsgZGVmYXVsdHMgdG8gYHRydWVgLlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBbcHJvcHNbXS50eXBlPVN0cmluZ10gQ29uc3RydWN0b3IvdHlwZSB1c2VkIGJ5IFN3YWdnZXIgdG8gaW5mZXIgc2NoZW1hIChlLmcuLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBVVUlEYCwgY3VzdG9tIGNsYXNzKS5cbiAqIEByZXR1cm4ge2FueX0gQSBjb21wb3NlZCBkZWNvcmF0b3IgYXBwbHlpbmcgYWxsIGdlbmVyYXRlZCBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQgbWV0aG9kIG9yIGNvbnRyb2xsZXIuXG4gKiBAZnVuY3Rpb24gQXBpUGFyYW1zRnJvbU1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWwoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogTWV0aG9kRGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBkZWNvcmF0b3JzID0gcHJvcHMubWFwKChwKSA9PlxuICAgIEFwaVBhcmFtRGVjKHtcbiAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwLmRlc2NyaXB0aW9uID8/IGBQYXRoIHBhcmFtZXRlcjogJHtwLm5hbWV9YCxcbiAgICAgIHJlcXVpcmVkOiBwLnJlcXVpcmVkID8/IHRydWUsXG4gICAgICAvLyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHR5cGU6IHAudHlwZSA/PyBTdHJpbmcsXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNvcmF0b3JzKTtcbn1cbiIsImltcG9ydCB7XG4gIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VzdG9tIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGluc3RhbnRpYXRlcyBpdCB1c2luZyB0aGUgTW9kZWwgY29uc3RydWN0b3JcbiAqIGZvdW5kIG9uIHRoZSBjb250cm9sbGVyLiBIYW5kbGVzIGJvdGggc2luZ2xlIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlY2FmQm9keSA9IGNyZWF0ZVBhcmFtRGVjb3JhdG9yKFxuICAoZGF0YTogdW5rbm93biwgY3R4OiBFeGVjdXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keTtcblxuICAgIC8vIFRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyIHdpbGwgaGF2ZSAnTW9kZWxDb25zdHInIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjdHguZ2V0Q2xhc3MoKTtcbiAgICAvLyBXZSBhY2Nlc3MgdGhlIHN0YXRpYyBwcm9wZXJ0eSB3ZSB3aWxsIGFkZCB0byB0aGUgRHluYW1pY01vZGVsQ29udHJvbGxlclxuICAgIGNvbnN0IE1vZGVsQ29uc3RyID0gKGNvbnRyb2xsZXIgYXMgYW55KS5jbGFzcztcblxuICAgIGlmICghTW9kZWxDb25zdHIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxuICAgICAgICBgTW9kZWxDb25zdHJ1Y3RvciBub3QgZm91bmQgb24gY29udHJvbGxlciAke2NvbnRyb2xsZXIubmFtZX0uIEVuc3VyZSB0aGUgY29udHJvbGxlciB3YXMgY3JlYXRlZCB2aWEgRnJvbU1vZGVsQ29udHJvbGxlci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghYm9keSkgcmV0dXJuIGJvZHk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkubWFwKChpdGVtKSA9PiBuZXcgTW9kZWxDb25zdHIoaXRlbSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWxDb25zdHIoYm9keSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXJhbURlY29yYXRvciwgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZQYXJhbVByb3BzLCBEZWNhZkFwaVByb3BlcnR5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjdXN0b20gTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBleHRyYWN0cyBhbmQgcmV0dXJucyByb3V0ZSBwYXJhbWV0ZXJzIG9yZGVyZWQgYnkgYSBzcGVjaWZpYyBrZXkgc2VxdWVuY2UuXG4gKiBAc3VtbWFyeSBUaGUgYE9yZGVyZWRQYXJhbXNgIGRlY29yYXRvciByZWFkcyB0aGUgaW5jb21pbmcgSFRUUCByZXF1ZXN0J3MgYHBhcmFtc2Agb2JqZWN0LCBvcHRpb25hbGx5IG9yZGVycyBpdCBhY2NvcmRpbmcgdG8gYSBwcm92aWRlZCBsaXN0IG9mIHBhcmFtZXRlciBuYW1lcywgYW5kIHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcmFtcywgdGhlIG9yZGVyZWQgdmFsdWVzLCBhbmQgdGhlIGFwcGxpZWQgb3JkZXIgbGlzdC4gVGhpcyBlbnN1cmVzIGRldGVybWluaXN0aWMgcGFyYW1ldGVyIGFjY2VzcyBmb3Igcm91dGVzIHdpdGggbXVsdGlwbGUgcGF0aCBwYXJhbWV0ZXJzLlxuICogQHRlbXBsYXRlIHtzdHJpbmdbXX0gVE9yZGVyIC0gUmVwcmVzZW50cyB0aGUgZXhwZWN0ZWQgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzLlxuICogQHBhcmFtIHtUT3JkZXIgfCB1bmRlZmluZWR9IG9yZGVyIEFuIG9wdGlvbmFsIGFycmF5IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlciBuYW1lcycgZGVzaXJlZCBvcmRlci4gSWYgbm90IHByb3ZpZGVkLCB0aGUgZGVjb3JhdG9yIHdpbGwgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBrZXlzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBvcmlnaW5hbCBgcmVxLnBhcmFtc2Agb2JqZWN0LlxuICogQHBhcmFtIHtFeGVjdXRpb25Db250ZXh0fSBjdHggVGhlIE5lc3RKUyBleGVjdXRpb24gY29udGV4dCwgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICogQHJldHVybiB7RGVjYWZQYXJhbVByb3BzfSBBbiBvYmplY3QgY29udGFpbmluZzpcbiAqIC0gYG9yaWdpbmFsYDogdGhlIHJhdyBwYXJhbWV0ZXIgbWFwIGZyb20gYHJlcS5wYXJhbXNgO1xuICogLSBgb3JkZXJlZGA6IGFuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlIHJlcXVlc3RlZCBvcmRlcjtcbiAqIC0gYG9yZGVyYDogdGhlIGVmZmVjdGl2ZSBvcmRlciBsaXN0IHVzZWQuXG4gKiBAZnVuY3Rpb24gT3JkZXJlZFBhcmFtc1xuICovXG5jb25zdCBPcmRlcmVkUGFyYW1zID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChvcmRlcjogc3RyaW5nW10gfCB1bmRlZmluZWQsIGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IERlY2FmUGFyYW1Qcm9wcyA9PiB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChyZXE/LnBhcmFtcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBvcmRlckxpc3QgPSBvcmRlciA/PyBPYmplY3Qua2V5cyhvcmlnaW5hbCk7XG4gICAgY29uc3Qgb3JkZXJlZCA9IG9yZGVyTGlzdC5tYXAoKGspID0+IG9yaWdpbmFsW2tdKTtcbiAgICByZXR1cm4geyByYXc6IG9yaWdpbmFsLCB2YWx1ZXNJbk9yZGVyOiBvcmRlcmVkLCBrZXlzSW5PcmRlcjogb3JkZXJMaXN0IH07XG4gIH1cbik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgaGlnaGVyLWxldmVsIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgbGV2ZXJhZ2VzIGBPcmRlcmVkUGFyYW1zYCB0byBleHRyYWN0IHJvdXRlIHBhcmFtZXRlcnMgaW4gYSBzcGVjaWZpYyBvcmRlciBkZXJpdmVkIGZyb20gYSBsaXN0IG9mIGBBcGlQYXJhbWAgZGVmaW5pdGlvbnMuXG4gKiBAc3VtbWFyeSBgRGVjYWZQYXJhbXNgIGNvbXB1dGVzIHRoZSBvcmRlciBvZiByb3V0ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgQXBpUGFyYW1bXWAgc3BlY2lmaWNhdGlvbiAodXNpbmcgZWFjaCBlbGVtZW504oCZcyBgbmFtZWApLCB0aGVuIGFwcGxpZXMgYE9yZGVyZWRQYXJhbXMob3JkZXIpYCBhcyBhIHBhcmFtZXRlciBkZWNvcmF0b3IuIFRoaXMgZW5hYmxlcyBwYXJhbWV0ZXItbGV2ZWwgYmluZGluZyB0aGF0IHJlbWFpbnMgY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIEFQSSBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucyB3aG9zZSBgbmFtZWAgZmllbGRzIGRldGVybWluZSB0aGUgcGFyYW1ldGVyIGV4dHJhY3Rpb24gb3JkZXIuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IEEgTmVzdEpTIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBjb250cm9sbGVyIG1ldGhvZCBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERlY2FmUGFyYW1zKFxuICBwcm9wczogRGVjYWZBcGlQcm9wZXJ0eVtdID0gW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIGNvbnN0IG9yZGVyID0gcHJvcHMubWFwKChwKSA9PiBwLm5hbWUpO1xuICByZXR1cm4gT3JkZXJlZFBhcmFtcyhvcmRlcik7XG59XG5cbmV4cG9ydCBjb25zdCBEZWNhZlF1ZXJ5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChfOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxLnF1ZXJ5ID8/IHt9O1xuXG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAvLyBQYXJzZSBsaW1pdCAmIG9mZnNldFxuICAgIGlmIChwYXJzZWQubGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQubGltaXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5saW1pdCA9IG47XG4gICAgfVxuXG4gICAgaWYgKHBhcnNlZC5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQub2Zmc2V0KTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBwYXJzZWQub2Zmc2V0ID0gbjtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBib29rbWFyayBvbmx5IGlmIG51bWVyaWNcbiAgICBpZiAocGFyc2VkLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG4gPSBOdW1iZXIocGFyc2VkLmJvb2ttYXJrKTtcbiAgICAgIHBhcnNlZC5ib29rbWFyayA9IE51bWJlci5pc05hTihuKSA/IHBhcnNlZC5ib29rbWFyayA6IG47XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9NT0RVTEVfT1BUSU9OUyA9IFwiRGVjYWZNb2R1bGVPcHRpb25zXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQURBUFRFUl9JRCA9IFwiRGVjYWZBZGFwdGVyXCI7XG5leHBvcnQgY29uc3QgREVDQUZfVEFTS19TRVJWSUNFX0lEID0gXCJEZWNhZlRhc2tTZXJ2aWNlXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9ST1VURSA9IFwiRGVjYWZSb3V0ZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0hBTkRMRVJTID0gU3ltYm9sKFwiRGVjYWZIYW5kbGVyc1wiKTtcbmV4cG9ydCBjb25zdCBERUNBRl9FWFBPU0UgPSBcIkRlY2FmRXhwb3NlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgPSBcIkRlY2FmQ29udHJvbGxlckNvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgREVDQUZfQ09OVEVYVF9LRVkgPSBTeW1ib2woXCJkZWNhZjpjb250ZXh0XCIpO1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckZsYWdzPExPRyBleHRlbmRzIExvZ2dlciA9IExvZ2dlcj4gPVxuICBBZGFwdGVyRmxhZ3M8TE9HPiAmIHtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJDdHggPSBDb250ZXh0PERlY2FmU2VydmVyRmxhZ3M+O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgREVDQUZfRVhQT1NFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3NlKC4uLmZsYXZvdXJzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gZnVuY3Rpb24gZXhwb3NlKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgREVDQUZfRVhQT1NFLFxuICAgICAgKGZsYXZvdXJzLmxlbmd0aCA/IGZsYXZvdXJzIDogdHJ1ZSkgYXMgYW55XG4gICAgKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciB0aGF0IGF0dGFjaGVzIGEge0BsaW5rIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWd9IHRvIGEgTW9kZWwsXG4gKiBzbyBgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUoKWAgY2FuIHBhc3MgaXQgdG8gYE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKClgLlxuICpcbiAqIFRoZSBwZXItbW9kZWwgY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBtb2R1bGUtbGV2ZWwgYGNvbnRyb2xsZXJDb25maWdgXG4gKiBvcHRpb24gaW4gYERlY2FmTW9kdWxlT3B0aW9uc2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBAY29udHJvbGxlckNvbmZpZyh7IGFsbG93R3JvdXBpbmdRdWVyaWVzOiB0cnVlLCBhbGxvd0J1bGtTdGF0ZW1lbnQ6IHsgY3JlYXRlOiB0cnVlLCByZWFkOiB0cnVlLCB1cGRhdGU6IGZhbHNlLCBkZWxldGU6IHRydWUgfSB9KVxuICogQG1vZGVsKClcbiAqIGNsYXNzIE9yZGVyIGV4dGVuZHMgTW9kZWw8T3JkZXI+IHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBGYWN0b3J5IGNvbmZpZ3VyYXRpb24ga25vYnMgKGFsbG93U3RhdGVtZW50bGVzc1F1ZXJ5LCBhbGxvd0dyb3VwaW5nUXVlcmllcywgYWxsb3dCdWxrU3RhdGVtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWcoY29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yKHRhcmdldDogYW55KSB7XG4gICAgTWV0YWRhdGEuc2V0KHRhcmdldCwgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIGNvbmZpZyBhcyBhbnkpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgQVVUSF9IQU5ETEVSID0gU3ltYm9sKFwiQVVUSF9IQU5ETEVSXCIpO1xuZXhwb3J0IGNvbnN0IEFVVEhfTUVUQV9LRVkgPSBcImF1dGg6bWV0YVwiO1xuZXhwb3J0IGNvbnN0IElTX1BVQkxJQ19LRVkgPSBcImlzUHVibGljXCI7XG5leHBvcnQgY29uc3QgUkVRVUlSRURfUk9MRVNfS0VZID0gXCJyZXF1aXJlZFJvbGVzXCI7XG5leHBvcnQgY29uc3QgU0tJUF9NT0RFTF9ST0xFU19LRVkgPSBcInNraXBNb2RlbFJvbGVzXCI7XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RDb250ZXh0PFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIFJlcXVlc3RDb250ZXh0PFJlcXVlc3Q+IHtcbiAgdXVpZCA9IFVVSUQuaW5zdGFuY2UuZ2VuZXJhdGUoKTtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgcmVxdWVzdDogUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFJFUVVFU1QpIHByaXZhdGUgcmVhZG9ubHkgcmVxOiBSZXF1ZXN0KSB7XG4gICAgc3VwZXIoXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnNPZjogKHJlcXVlc3Q6IFJlcXVlc3QpID0+IChyZXF1ZXN0IGFzIGFueSk/LmhlYWRlcnMgfHwgdW5kZWZpbmVkLFxuICAgICAgfSBhcyBhbnksXG4gICAgICByZXFcbiAgICApO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgfVxuXG4gIGdldCBoZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJoZWFkZXJzXCIgYXMgYW55KTtcbiAgfVxuXG4gIHB1dChyZWNvcmQ6IFJlY29yZDxhbnksIGFueT4pIHtcbiAgICBsZXQgb3ZlcnJpZGVzOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG92ZXJyaWRlcyA9IHRoaXMuZ2V0KFwib3ZlcnJpZGVzXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIG92ZXJyaWRlcyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuYWNjdW11bGF0ZSh7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24ob3ZlcnJpZGVzLCByZWNvcmQpLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0b3IgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcblxuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmltcG9ydCB7XG4gIEFVVEhfSEFORExFUixcbiAgQVVUSF9NRVRBX0tFWSxcbiAgSVNfUFVCTElDX0tFWSxcbiAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX0hBTkRMRVIpIHByaXZhdGUgcmVhZG9ubHkgYXV0aEhhbmRsZXI/OiBBdXRoSGFuZGxlclxuICApIHt9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KFxuICAgIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICBuZXh0OiBDYWxsSGFuZGxlclxuICApOiBQcm9taXNlPE9ic2VydmFibGU8YW55Pj4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuXG4gICAgY29uc3QgaXNQdWJsaWMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxib29sZWFuPihJU19QVUJMSUNfS0VZLCBbXG4gICAgICBjdHguZ2V0SGFuZGxlcigpLFxuICAgICAgY3R4LmdldENsYXNzKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtb2RlbE5hbWUgPVxuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihcbiAgICAgICAgQVVUSF9NRVRBX0tFWSxcbiAgICAgICAgY3R4LmdldEhhbmRsZXIoKVxuICAgICAgKSA/P1xuICAgICAgdGhpcy5yZWZsZWN0b3IuZ2V0PHN0cmluZyB8IENvbnN0cnVjdG9yPihBVVRIX01FVEFfS0VZLCBjdHguZ2V0Q2xhc3MoKSk7XG5cbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUkVRVUlSRURfUk9MRVNfS0VZLFxuICAgICAgW2N0eC5nZXRIYW5kbGVyKCksIGN0eC5nZXRDbGFzcygpXVxuICAgICk7XG5cbiAgICBjb25zdCBza2lwTW9kZWxSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KFxuICAgICAgU0tJUF9NT0RFTF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsID0gc2tpcE1vZGVsUm9sZXMgPyB1bmRlZmluZWQgOiBtb2RlbE5hbWU7XG5cbiAgICBsb2cudmVyYm9zZShgSW50ZXJjZXB0ZWQgcmVxdWVzdCR7bW9kZWxOYW1lID8gYCBmb3IgJHttb2RlbE5hbWV9YCA6IFwiXCJ9YCk7XG5cbiAgICBpZiAoaXNQdWJsaWMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgUHVibGljIHJvdXRlIOKAlCBza2lwcGluZyBhdXRoYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmF1dGhIYW5kbGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhIYW5kbGVyLmF1dGhvcml6ZShcbiAgICAgICAgY3R4LFxuICAgICAgICBlZmZlY3RpdmVNb2RlbCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgICAgcmVxdWlyZWRSb2xlcyxcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdXRoIGhhbmRsZXIgcmVnaXN0ZXJlZGApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybWVycyBydW4gQUZURVIgYXV0aCBzbyB0aGV5IGNhbiByZWFkIGF1dGgtcG9wdWxhdGVkIGZpZWxkc1xuICAgIC8vIChlLmcuIGB1c2VyYCkgZnJvbSB0aGUgY29udGV4dCBhbmQgbWFwIHRoZW0gdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzXG4gICAgLy8gKGUuZy4gYFVVSURgIGZvciBSYW1BZGFwdGVyJ3MgQGNyZWF0ZWRCeS9AdXBkYXRlZEJ5IGhhbmRsZXJzKS5cbiAgICBhd2FpdCB0aGlzLmFwcGx5VHJhbnNmb3JtZXJzKCk7XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcInVzZXJcIiBhcyBhbnkpO1xuICAgIGNvbnN0IG9yZ2FuaXphdGlvbiA9IHRoaXMucmVxdWVzdENvbnRleHQuZ2V0T3JVbmRlZmluZWQoXG4gICAgICBcIm9yZ2FuaXphdGlvblwiIGFzIGFueVxuICAgICk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gKHRyYW5zZm9ybWVyIGFzIGFueSkuZnJvbVxuICAgICAgICA/IHRyYW5zZm9ybWVyXG4gICAgICAgIDogbmV3ICh0cmFuc2Zvcm1lciBhcyBhbnkpKCk7XG4gICAgICBjb25zdCBmcm9tID0gYXdhaXQgaW5zdGFuY2UuZnJvbSh0aGlzLnJlcXVlc3RDb250ZXh0KTtcbiAgICAgIGlmIChmcm9tKSB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoZnJvbSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBhcHBseURlY29yYXRvcnMsIFNldE1ldGFkYXRhLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFwaUJlYXJlckF1dGgsIEFwaVNlY3VyaXR5IH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuaW1wb3J0IHsgQVVUSF9NRVRBX0tFWSwgSVNfUFVCTElDX0tFWSwgUkVRVUlSRURfUk9MRVNfS0VZIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGgobW9kZWw/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICBjb25zdCByZXNvdXJjZSA9IG1vZGVsXG4gICAgPyB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbW9kZWxcbiAgICAgIDogbW9kZWwubmFtZVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZWNzID0gW0FwaUJlYXJlckF1dGgoKSwgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcildO1xuICBpZiAocmVzb3VyY2UpIGRlY3MucHVzaChTZXRNZXRhZGF0YShBVVRIX01FVEFfS0VZLCByZXNvdXJjZSkpO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVibGljKCkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFNldE1ldGFkYXRhKElTX1BVQkxJQ19LRVksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVpcmVSb2xlcyguLi5yb2xlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhcbiAgICBBcGlTZWN1cml0eShcImJlYXJlclwiKSxcbiAgICBTZXRNZXRhZGF0YShSRVFVSVJFRF9ST0xFU19LRVksIHJvbGVzKSxcbiAgICBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKVxuICApO1xufVxuIiwiaW1wb3J0IHsgRGVsZXRlLCBHZXQsIFBhdGNoLCBQb3N0LCBQdXQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHZlcmIgLSBIVFRQIHZlcmIgdG8gYmUgY29udmVydGVkIChlLmcuIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFKS5cbiAqIEByZXR1cm5zIEEgTmVzdEpTIG1ldGhvZCBkZWNvcmF0b3IgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYi5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIEhUVFAgdmVyYiBpcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXBwZWRcbiAqIHRvIGEgTmVzdEpTIGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEh0dHBWZXJiVG9EZWNvcmF0b3IoXG4gIHZlcmI6IEh0dHBWZXJic1xuKTogKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxIdHRwVmVyYnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3I+ID0ge1xuICAgIEdFVDogR2V0LFxuICAgIFBPU1Q6IFBvc3QsXG4gICAgUFVUOiBQdXQsXG4gICAgUEFUQ0g6IFBhdGNoLFxuICAgIERFTEVURTogRGVsZXRlLFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvciA9IGh0dHBUb0NydWRbdmVyYl07XG5cbiAgaWYgKCFkZWNvcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBIVFRQIHZlcmIgXCIke3ZlcmJ9XCIuIE5vIE5lc3RKUyBkZWNvcmF0b3IgbWFwcGluZyB3YXMgZm91bmQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIiwiaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBEZWNvcmF0b3JCdW5kbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBEZWNhZkFwaVByb3BlcnR5LFxuICB0eXBlIERlY2FmUGFyYW1Qcm9wcyxcbiAgRGVjYWZQYXJhbXMsXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG8sXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5mdW5jdGlvbiB0b0RlY2FmRXJyb3IoZXJyb3I6IHVua25vd24sIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyb3I7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWAgOiBmYWxsYmFja01lc3NhZ2VcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURlY29yYXRvcnMoXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGh0dHBWZXJiOiBIdHRwVmVyYnMsXG4gIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4pOiBEZWNvcmF0b3JCdW5kbGUge1xuICBjb25zdCBOZXN0SHR0cFJvdXRlRGVjID0gSHR0cFZlcmJUb0RlY29yYXRvcihodHRwVmVyYik7XG4gIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcChhcGlQYXJhbVNwZWMpO1xuXG4gIGNvbnN0IHN3YWdnZXJRdWVyeVBhcmFtcyA9IFtdO1xuICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgc3dhZ2dlclF1ZXJ5UGFyYW1zLnB1c2goXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogW1xuICAgICAgTmVzdEh0dHBSb3V0ZURlYyhyb3V0ZVBhdGgpLFxuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoQXBpUGFyYW0pLFxuICAgICAgLi4uc3dhZ2dlclF1ZXJ5UGFyYW1zLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgYWNjb3JkaW5nIHRvIFwiJHttZXRob2ROYW1lfVwiLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuYCxcbiAgICAgIH0pLFxuICAgIF0sXG4gICAgcGFyYW1zOiBbRGVjYWZQYXJhbXMoYXBpUGF0aFBhcmFtcyksIFF1ZXJ5KCldLCAvLyAsIERlY2FmQm9keSgpXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXBpRGVjb3JhdG9ycyhcbiAgdGFyZ2V0OiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JCdW5kbGVcbikge1xuICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgZGVjb3JhdG9ycy5tZXRob2QuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICBkZWNvcmF0b3JzLnBhcmFtcz8uZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2Q8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbik6IGFueSB7XG4gIGlmIChwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSkge1xuICAgIHJldHVybiB0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgOiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpO1xuXG4gIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSgpLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAuLi5wYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgdGhyb3cgdG9EZWNhZkVycm9yKGUsIGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUm91dGVNZXRob2QoXG4gIENvbnRyb2xsZXJDbGFzczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4pOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZSxcbiAgICB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZVxuICApO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciwgQXV0aERhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuLyoqXG4gKiBTaW1wbGUgYXV0aCBoYW5kbGVyIHRoYXQgcmVhZHMgYSByb2xlIHN0cmluZyBmcm9tIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxyb2xlPmAgaGVhZGVyLlxuICpcbiAqIE9ubHkgb3ZlcnJpZGVzIHtAbGluayBBdXRoSGFuZGxlci5leHRyYWN0RnJvbUF1dGh9IHRvIHJldHVybiB0aGUgYmVhcmVyIHRva2VuIGFzXG4gKiBib3RoIHRoZSB1c2VyIGlkZW50aWZpZXIgYW5kIHRoZSBzaW5nbGUgcm9sZS4gVGhlIGJhc2UgY2xhc3MgYGJpbmRUb0NvbnRleHRgXG4gKiAoYGN0eC5hY2N1bXVsYXRlKGRhdGEpYCkgaXMgc3VmZmljaWVudCDigJQgdGhlIHRyYW5zZm9ybWVyL2FkYXB0ZXIgaXMgcmVzcG9uc2libGVcbiAqIGZvciBtYXBwaW5nIGNvbnRleHQgZmllbGRzIHRvIGFkYXB0ZXItc3BlY2lmaWMga2V5cyBsaWtlIGBVVUlEYC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmQXV0aEhhbmRsZXIgZXh0ZW5kcyBBdXRoSGFuZGxlcjxcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgQXV0aERhdGFcbj4ge1xuICBwcm90ZWN0ZWQgcGFyc2VSZXF1ZXN0KHJlcTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KFwiIFwiKVsxXSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHVzZXJSb2xlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4dHJhY3RGcm9tQXV0aChjdHg6IEV4ZWN1dGlvbkNvbnRleHQpOiBBdXRoRGF0YSB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHRoaXMucGFyc2VSZXF1ZXN0KHJlcSk7XG4gICAgaWYgKCF1c2VyUm9sZSkgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcIlVuYXV0aGVudGljYXRlZFwiKTtcbiAgICByZXR1cm4geyB1c2VyOiB1c2VyUm9sZSwgcm9sZXM6IFt1c2VyUm9sZV0gfTtcbiAgfVxufVxuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgRGVjYWZBdXRoSGFuZGxlcn0ga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqIFRoZSBcInJvbGVcIiB2YXJpYW50IHByZXZpb3VzbHkgcmV0dXJuZWQgcm9sZXMgZnJvbSBgYXV0aG9yaXplYDsgd2l0aCB0aGUgYmFzZVxuICogY2xhc3Mgbm93IG9yY2hlc3RyYXRpbmcgcm9sZSBjaGVja3MgaW50ZXJuYWxseSwgdGhlIHR3byBjbGFzc2VzIGFyZSBlcXVpdmFsZW50LlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZSb2xlQXV0aEhhbmRsZXIgZXh0ZW5kcyBEZWNhZkF1dGhIYW5kbGVyIHt9XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcblxuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7XG4gIGdsb2JhbD86IGJvb2xlYW47XG4gIGhhbmRsZXI/OiBUeXBlPEF1dGhIYW5kbGVyPjtcbn07XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoXG4gICAgb3B0aW9uczogRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHt9XG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IHByb3ZpZGVyczogRHluYW1pY01vZHVsZVtcInByb3ZpZGVyc1wiXSA9IFtcbiAgICAgIEF1dGhJbnRlcmNlcHRvcixcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgcHJvdmlkZXJzLnB1c2gob3B0aW9ucy5oYW5kbGVyKTtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVVUSF9IQU5ETEVSLFxuICAgICAgICB1c2VDbGFzczogb3B0aW9ucy5oYW5kbGVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsKSB7XG4gICAgICAocHJvdmlkZXJzIGFzIGFueVtdKS5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICB1c2VFeGlzdGluZzogQXV0aEludGVyY2VwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZBdXRoTW9kdWxlLFxuICAgICAgZ2xvYmFsOiBvcHRpb25zLmdsb2JhbCA/PyBmYWxzZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICAgIGV4cG9ydHM6IFtBdXRoSW50ZXJjZXB0b3IsIEFVVEhfSEFORExFUl0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcbmltcG9ydCB7IHR5cGUgRGVjYWZSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfSEFORExFUlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlcn0gaW5zdGFuY2VzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LFxuICogcHJvdmlkaW5nIHRoZW0gd2l0aCBhIHNoYXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0Q29udGV4dH0uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBvcmNoZXN0cmF0aW5nIGFuZCBleGVjdXRpbmdcbiAqIGEgc2VxdWVuY2Ugb2YgcmVxdWVzdCBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIHJlY2VpdmVzIHRoZSBzYW1lIHJlcXVlc3Qtc2NvcGVkIGNvbnRleHQsXG4gKiBhbGxvd2luZyBjb29yZGluYXRlZCBwcm9jZXNzaW5nIHN1Y2ggYXMgYXV0aGVudGljYXRpb24sIG1ldGFkYXRhIGV4dHJhY3Rpb24sIGF1ZGl0aW5nLFxuICogYW5kIGN1c3RvbSBwaXBlbGluZSBiZWhhdmlvci4gSGFuZGxlcnMgYXJlIGluamVjdGVkIHZpYSB0aGUge0BsaW5rIERFQ0FGX0hBTkRMRVJTfSB0b2tlbixcbiAqIGVuc3VyaW5nIGV4dGVuc2liaWxpdHkgYW5kIGxvb3NlIGNvdXBsaW5nLlxuICpcbiAqIEBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gRXhhbXBsZSBoYW5kbGVyOlxuICogY2xhc3MgQXV0aEhhbmRsZXIgaW1wbGVtZW50cyBEZWNhZlJlcXVlc3RIYW5kbGVyIHtcbiAqICAgYXN5bmMgaGFuZGxlKGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIHJlcTogUmVxdWVzdCkge1xuICogICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcnNbXCJhdXRob3JpemF0aW9uXCJdO1xuICogICAgIGNvbnN0IHJlc3VsdCA9IE15U2VydmljZS5kb1NvbWV0aGluZyh0b2tlbik7XG4gKiAgICAgY29udGV4dC5zZXQoXCJteS1rZXlcIiwgcmVzdWx0KTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4ZWN1dG9yIHVzYWdlIGluIGEgcmVxdWVzdDpcbiAqIGF3YWl0IGV4ZWN1dG9yLmV4ZWMocmVxdWVzdCk7XG4gKiAvLyBBbGwgaGFuZGxlcnMgd2lsbCBydW4gaW4gc2VxdWVuY2VcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBFeGVjdXRvclxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJBXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckJcbiAqXG4gKiAgICAgQ2xpZW50LT4+RXhlY3V0b3I6IGV4ZWMocmVxKVxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckE6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckEtLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckI6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckItLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLS0+PkNsaWVudDogcHJvY2Vzc2luZyBmaW5pc2hlZFxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX0hBTkRMRVJTKSBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBEZWNhZlJlcXVlc3RIYW5kbGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0XG4gICkge31cblxuICBhc3luYyBleGVjKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmSGFuZGxlckV4ZWN1dG9yLm5hbWUpLmZvcih0aGlzLmV4ZWMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5jb250ZXh0LnV1aWR9IHJ1bm5pbmcgJHt0aGlzLmhhbmRsZXJzLmxlbmd0aH0gaGFuZGxlcnMgZm9yIHJlcXVlc3QgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRoaXMuY29udGV4dCwgcmVxLCByZXMpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBDYWxsSGFuZGxlcixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjdHg6IERlY2FmUmVxdWVzdENvbnRleHQpIHt9XG5cbiAgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlc3BvbnNlKCk7XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKS5waXBlKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgIHJlc3BvbnNlID0gdGhpcy5jdHgudG9SZXNwb25zZShyZXNwb25zZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgUmVxdWVzdCB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgYXMgSHR0cERlY2FmQ29udHJvbGxlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29udHJvbGxlcjxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBDT05URVhUIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBIdHRwRGVjYWZDb250cm9sbGVyPFJlcXVlc3QsIGFueSwgRGVjYWZSZXF1ZXN0Q29udGV4dD4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZNb2RlbENvbnRyb2xsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPEM+IHtcbiAgcHJpdmF0ZSBfcGVyc2lzdGVuY2U/OiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIF9uYW1lKTtcbiAgfVxuXG4gIGFic3RyYWN0IGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPE0+O1xuXG4gIHBlcnNpc3RlbmNlKGN0eD86IENvbnRleHQ8YW55Pik6IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxNPj4odGhpcy5jbGFzcyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICAgICkgYXMgTW9kZWxTZXJ2aWNlPE0+O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5jbGFzcykgYXMgUmVwbzxNPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5jbGllbnRDb250ZXh0LnRvT3ZlcnJpZGVzKCk7XG5cbiAgICByZXR1cm4gY3R4XG4gICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlIGluc3RhbmNlb2YgUmVwb3NpdG9yeVxuICAgICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlLm92ZXJyaWRlKG92ZXJyaWRlcylcbiAgICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZS5mb3Iob3ZlcnJpZGVzKVxuICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9jb25zdGFudHNcIjtcblxuY29uc3QgZHRvQ2FjaGUgPSBuZXcgTWFwPFxuICBPcGVyYXRpb25LZXlzLFxuICBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+XG4+KCk7XG5cbi8qKlxuICogQnVpbGRzIGEgTmVzdC9Td2FnZ2VyIERUTyBjbGFzcyBmb3IgdGhlIGdpdmVuIG1vZGVsIGFuZCBDUlVEIG9wZXJhdGlvbi5cbiAqXG4gKiBSdWxlczpcbiAqICAtIE9ubHkgQ1JFQVRFIGFuZCBVUERBVEUgKGFuZCB0aGVpciBidWxrIHZhcmlhbnRzKSBwcm9kdWNlIGEgRFRPO1xuICogICAgYWxsIG90aGVyIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBvcmlnaW5hbCBtb2RlbCBjbGFzcyB1bmNoYW5nZWQuXG4gKiAgLSBAZ2VuZXJhdGVkKCkgcHJvcGVydGllcyAoY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGNyZWF0ZWRCeSwgdXBkYXRlZEJ5LFxuICogICAgdXVpZCwgdmVyc2lvbiwgQGNvbXBvc2VkIHBrcywg4oCmKSBhcmUgKipuZXZlcioqIGV4cG9zZWQgaW4gYW55IERUTy5cbiAqICAtIFRoZSBAcGsoKSBwcm9wZXJ0eTpcbiAqICAgICAg4oCiIFVQREFURSDigJMgYWx3YXlzIGluY2x1ZGVkLlxuICogICAgICDigKIgQ1JFQVRFICDigJMgaW5jbHVkZWQgb25seSB3aGVuIHRoZSBwayBpcyBOT1QgYXV0by1nZW5lcmF0ZWRcbiAqICAgICAgICAgICAgICAgICAgKGNoZWNrZWQgdmlhIE1vZGVsLnBrUHJvcHMoKS5nZW5lcmF0ZWQgQU5EIE1vZGVsLmdlbmVyYXRlZCgpKS5cbiAqICAtIFJlbGF0aW9uIHByb3BlcnRpZXMgKEBvbmVUb09uZSwgQG9uZVRvTWFueSwg4oCmKTpcbiAqICAgICAg4oCiIENSRUFURSAg4oCTIG5lc3RlZCBhcyBEdG9Gb3IoQ1JFQVRFLCBSZWxhdGVkTW9kZWwpLiBXaGVuIHRoZSByZWxhdGlvblxuICogICAgICAgICAgICAgICAgICBjcmVhdGVzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIChtb2RlbCBBIOKGkiBtb2RlbCBCIOKGkiBtb2RlbCBBKSxcbiAqICAgICAgICAgICAgICAgICAgdGhlIGJhY2stcmVmZXJlbmNlIHVzZXMgdGhlIHJlbGF0ZWQgbW9kZWwncyBQSyB0eXBlXG4gKiAgICAgICAgICAgICAgICAgIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWsgdGhlIGN5Y2xlLlxuICogICAgICDigKIgVVBEQVRFICDigJMgdW5pb24gb2YgRHRvRm9yKFVQREFURSwgUmVsYXRlZE1vZGVsKSAqKm9yKiogdGhlXG4gKiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgbW9kZWwncyBwcmltYXJ5LWtleSB0eXBlIChzdHJpbmcgLyBpbnRlZ2VyKSxcbiAqICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgU3dhZ2dlciBvbmVPZi4gQ2lyY3VsYXIgYmFjay1yZWZlcmVuY2VzXG4gKiAgICAgICAgICAgICAgICAgIG9taXQgdGhlIERUTyAkcmVmIGFuZCBvbmx5IGluY2x1ZGUgdGhlIFBLIHR5cGUuXG4gKlxuICogTWV0YWRhdGEucHJvcGVydGllcygpIG5vdyByZXR1cm5zIEFMTCBwcm9wZXJ0aWVzIGFjcm9zcyB0aGUgcHJvdG90eXBlIGNoYWluLFxuICogc28gRFRPIGluaGVyaXRhbmNlIGlzIG5vIGxvbmdlciBuZWVkZWQ7IGV2ZXJ5IERUTyBpcyBhIGZsYXQgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEdG9Gb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgc3RhY2s6IFNldDxDb25zdHJ1Y3Rvcjxhbnk+PiA9IG5ldyBTZXQoKVxuKTogQ29uc3RydWN0b3I8YW55PiB7XG4gIGlmICghVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLmluY2x1ZGVzKG9wKSkge1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RHRvQ2FjaGUob3ApO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobW9kZWwpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IGlzVXBkYXRlT3AgPSBbXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gIF0uaW5jbHVkZXMob3AgYXMgYW55KTtcblxuICBjbGFzcyBEeW5hbWljRFRPIHt9XG4gIGNhY2hlLnNldChtb2RlbCwgRHluYW1pY0RUTyk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8sIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGAke3RvUGFzY2FsQ2FzZShtb2RlbC5uYW1lKX0ke3RvUGFzY2FsQ2FzZShvcCl9RFRPYCxcbiAgfSk7XG5cbiAgY29uc3QgcGtQcm9wID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE1vZGVsLnBrKG1vZGVsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KSgpO1xuXG4gIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IHBrUHJvcCA/IE1vZGVsLnBrUHJvcHMobW9kZWwgYXMgYW55KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtEZXNpZ25UeXBlID0gcGtQcm9wXG4gICAgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwa1Byb3AgYXMgc3RyaW5nKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa1R5cGVJc051bWVyaWMgPVxuICAgIHBrRGVzaWduVHlwZSA9PT0gTnVtYmVyIHx8IHBrRGVzaWduVHlwZSA9PT0gQmlnSW50O1xuICBjb25zdCBwa0lzR2VuZXJhdGVkID1cbiAgICAhIXBrUHJvcHNNZXRhZGF0YT8uZ2VuZXJhdGVkIHx8XG4gICAgKHBrUHJvcFxuICAgICAgPyBNb2RlbC5nZW5lcmF0ZWRCeVNlcXVlbmNlKG1vZGVsIGFzIGFueSwgcGtQcm9wIGFzIGFueSkgfHxcbiAgICAgICAgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwa1Byb3AgYXMgc3RyaW5nKSB8fFxuICAgICAgICBwa1R5cGVJc051bWVyaWNcbiAgICAgIDogZmFsc2UpO1xuXG4gIGNvbnN0IGFsbFByb3BzID0gQXJyYXkuZnJvbShuZXcgU2V0KE1ldGFkYXRhLnByb3BlcnRpZXMobW9kZWwpIHx8IFtdKSk7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigoTW9kZWwucmVsYXRpb25zKG1vZGVsKSBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICBjb25zdCBzY2FsYXJQcm9wczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgYWxsUHJvcHMpIHtcbiAgICBpZiAoIXByb3ApIGNvbnRpbnVlO1xuICAgIGlmIChyZWxhdGlvbnMuaGFzKHByb3ApKSBjb250aW51ZTtcblxuICAgIGlmIChwcm9wID09PSBwa1Byb3AgJiYgIWlzVXBkYXRlT3AgJiYgcGtJc0dlbmVyYXRlZCkgY29udGludWU7XG4gICAgaWYgKHByb3AgIT09IHBrUHJvcCAmJiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApKVxuICAgICAgY29udGludWU7XG5cbiAgICBzY2FsYXJQcm9wcy5wdXNoKHByb3ApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHNjYWxhclByb3BzKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhdmFsaWRhdGlvbj8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcbiAgICBjb25zdCB0eXBlSGludCA9XG4gICAgICBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApID8/XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIH07XG4gICAgaWYgKHR5cGVIaW50KSBhcGlPcHRpb25zLnR5cGUgPSB0eXBlSGludDtcblxuICAgIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGRlc2lnblR5cGUgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCkgPz8gdHlwZUhpbnQ7XG4gICAgaWYgKHR5cGVvZiBkZXNpZ25UeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIGRlc2lnblR5cGUsXG4gICAgICAgIER5bmFtaWNEVE8ucHJvdG90eXBlLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmVsYXRpb24gb2YgcmVsYXRpb25zKSB7XG4gICAgY29uc3QgcmVsYXRpb25NZXRhID0gTWV0YWRhdGEucmVsYXRpb25zKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGlmICghcmVsYXRpb25NZXRhKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTWV0YWRhdGEgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGxldCByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPVxuICAgICAgcmVsYXRpb25NZXRhLmNsYXNzIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgaWYgKHR5cGVvZiByZWxhdGlvblR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhcmVsYXRpb25UeXBlLm5hbWUpIHtcbiAgICAgIHJlbGF0aW9uVHlwZSA9IChyZWxhdGlvblR5cGUgYXMgYW55KSgpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0aW9uVHlwZSB8fCB0eXBlb2YgcmVsYXRpb25UeXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUeXBlIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKCFNb2RlbC5nZXQocmVsYXRpb25UeXBlLm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBjb25zdCBpc0FycmF5ID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuTElTVF07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcblxuICAgIC8vIERldGVjdCBjaXJjdWxhciByZWZlcmVuY2U6IGlmIHRoZSByZWxhdGVkIG1vZGVsIGlzIGFscmVhZHkgaW4gdGhlXG4gICAgLy8gcmVjdXJzaW9uIHN0YWNrLCB1c2UgdGhlIFBLIHR5cGUgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWtcbiAgICAvLyB0aGUgY3ljbGUuIFRoaXMgcHJldmVudHMgQG5lc3Rqcy9zd2FnZ2VyJ3MgU2NoZW1hT2JqZWN0RmFjdG9yeSBmcm9tXG4gICAgLy8gaW5maW5pdGVseSByZWN1cnNpbmcgd2hlbiBleHBsb3JpbmcgdGhlIHNjaGVtYXMuXG4gICAgY29uc3QgaXNDaXJjdWxhciA9IHN0YWNrLmhhcyhyZWxhdGlvblR5cGUpO1xuXG4gICAgaWYgKGlzQ2lyY3VsYXIpIHtcbiAgICAgIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gICAgICBhZGRSZWxhdGlvblBrUmVmKER5bmFtaWNEVE8sIHJlbGF0aW9uLCBwa1R5cGVOYW1lLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uRHRvID0gRHRvRm9yKG9wLCByZWxhdGlvblR5cGUsIG5ldyBTZXQoc3RhY2spLmFkZChtb2RlbCkpO1xuXG4gICAgaWYgKGlzVXBkYXRlT3ApIHtcbiAgICAgIGFkZFJlbGF0aW9uVXBkYXRlKFxuICAgICAgICBEeW5hbWljRFRPLFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICAgcmVsYXRpb25UeXBlLFxuICAgICAgICByZWxhdGlvbkR0byxcbiAgICAgICAgaXNBcnJheSxcbiAgICAgICAgaXNSZXF1aXJlZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUmVsYXRpb24oRHluYW1pY0RUTywgcmVsYXRpb24sIHJlbGF0aW9uRHRvLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHluYW1pY0RUTztcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb24oXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgdHlwZTogcmVsYXRpb25EdG8sXG4gICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgaXNBcnJheSxcbiAgfTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IHJlbGF0aW9uRHRvLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgYSByZWxhdGlvbiBwcm9wZXJ0eSB0aGF0IHVzZXMgdGhlIFBLIHR5cGUgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mXG4gKiBhIGZ1bGwgRFRPIGNsYXNzLiBVc2VkIHRvIGJyZWFrIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gQ3VzdG9tZXIg4oaSIE9yZGVyIOKGkiBDdXN0b21lcikuXG4gKi9cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uUGtSZWYoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHBrVHlwZU5hbWU6IHN0cmluZyxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogcGtUeXBlTmFtZSB9LCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nLCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSk7XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiAocGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcpLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvblVwZGF0ZShcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFNb2RlbHMgPVxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLCBEdG9DbGFzcykgfHwgW107XG4gIGlmICghZXh0cmFNb2RlbHMuaW5jbHVkZXMocmVsYXRpb25EdG8pKSB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUyxcbiAgICAgIFsuLi5leHRyYU1vZGVscywgcmVsYXRpb25EdG9dLFxuICAgICAgRHRvQ2xhc3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZHRvUmVmID0gYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7cmVsYXRpb25EdG8ubmFtZX1gO1xuICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICBjb25zdCBvbmVPZkl0ZW1zID0gW3sgJHJlZjogZHRvUmVmIH0sIHsgdHlwZTogcGtUeXBlTmFtZSB9XTtcblxuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KTtcblxuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogT2JqZWN0LFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gTW9kZWwucGtQcm9wcyhyZWxhdGlvblR5cGUgYXMgYW55KTtcbiAgICBjb25zdCBwa1R5cGUgPSBwa1Byb3BzTWV0YWRhdGE/LnR5cGU7XG4gICAgaWYgKHBrVHlwZSA9PT0gTnVtYmVyIHx8IHBrVHlwZSA9PT0gQmlnSW50KSByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgaWYgKE1vZGVsLmdlbmVyYXRlZChjdXJyZW50LCBwcm9wIGFzIGFueSkpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKGN1cnJlbnQsIHByb3AgYXMgYW55KTtcbiAgICBpZiAodmFsaWRhdGlvbikgcmV0dXJuIHZhbGlkYXRpb24gYXMgYW55O1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpOiBhbnkge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKGN1cnJlbnQsIHByb3ApO1xuICAgIGlmICh0eXBlKSByZXR1cm4gdHlwZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldER0b0NhY2hlKFxuICBvcDogT3BlcmF0aW9uS2V5c1xuKTogV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PiB7XG4gIGlmICghZHRvQ2FjaGUuaGFzKG9wKSkge1xuICAgIGR0b0NhY2hlLnNldChvcCwgbmV3IFdlYWtNYXAoKSk7XG4gIH1cbiAgcmV0dXJuIGR0b0NhY2hlLmdldChvcCkhO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciwgQ29udGV4dE9mLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbihBZGFwdGVyIGFzIGFueSkudHJhbnNmb3JtZXJGb3IgPSBmdW5jdGlvbiB0b0NvbnRleHRGbGFnczxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pixcbj4oYWRhcHRlcjogQSB8IHN0cmluZyk6IENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxDb250ZXh0T2Y8QT4+PiB7XG4gIGNvbnN0IGFsaWFzID1cbiAgICB0eXBlb2YgYWRhcHRlciA9PT0gXCJzdHJpbmdcIiA/IGFkYXB0ZXIgOiAoYWRhcHRlci5hbGlhcyBhcyBzdHJpbmcpO1xuICByZXR1cm4gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpLCBhbGlhcyk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihBZGFwdGVyIGFzIGFueSkuZmxhdm91cnNUb1RyYW5zZm9ybSA9IGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2Zvcm1lcnMoKTpcbiAgfCBzdHJpbmdbXVxuICB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIikpO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKENvbnRleHQgYXMgYW55KS5wcm90b3R5cGUudG9SZXNwb25zZSA9IGZ1bmN0aW9uIHRvUmVzcG9uc2U8XG4gIFJFUyBleHRlbmRzIHsgaGVhZGVyOiBhbnkgfSxcbj4odGhpczogQ29udGV4dCwgcmVzOiBSRVMpOiBSRVMge1xuICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nKCk7XG4gIGlmIChwZW5kaW5nKSByZXMuaGVhZGVyKFwieC1wZW5kaW5nLXRhc2tcIiwgSlNPTi5zdHJpbmdpZnkocGVuZGluZykpO1xuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsQnVpbGRlciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi4vZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy9kZWNvcmF0b3JzXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgQXV0aChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgZGVjb3JhdGVDbGFzcyhkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIEF1dGg6IChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUuQXV0aCA9IGZ1bmN0aW9uIChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhBdXRoKG1vZGVsKSk7XG59O1xuXG5pZiAoIShwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCkge1xuICBjb25zdCBvcmlnaW5hbEJ1aWxkID0gcHJvdG90eXBlLmJ1aWxkO1xuICBwcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG9yaWdpbmFsQnVpbGQuY2FsbCh0aGlzKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzO1xuICAgIGlmIChkZWNvcmF0b3JzPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHJlc3VsdCBhcyBhbnkpIGFzIHR5cGVvZiByZXN1bHQgfCB2b2lkO1xuICAgICAgICBpZiAoZGVjb3JhdGVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZGVjb3JhdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIChwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCA9IHRydWU7XG59XG4iLCJpbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBQYXJhbSxcbiAgUXVlcnksXG4gIFJlc3BvbnNlLFxuICBTZXRNZXRhZGF0YSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UsXG4gIEFwaUJvZHksXG4gIEFwaUNyZWF0ZWRSZXNwb25zZSxcbiAgQXBpRXh0cmFNb2RlbHMsXG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbiAgQXBpVGFncyxcbiAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlLFxuICBnZXRTY2hlbWFQYXRoLFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgdHlwZSBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIERCS2V5cyxcbiAgQmFzZUVycm9yLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsLFxuICBBcGlQYXJhbXNGcm9tTW9kZWwsXG4gIHR5cGUgRGVjYWZBcGlQcm9wZXJ0eSxcbiAgRGVjYWZCb2R5LFxuICBEZWNhZlF1ZXJ5LFxufSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHLCBERUNBRl9ST1VURSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNLSVBfTU9ERUxfUk9MRVNfS0VZIH0gZnJvbSBcIi4uL2F1dGgvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoLCBQdWJsaWMsIFJlcXVpcmVSb2xlcyB9IGZyb20gXCIuLi9hdXRoL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJDb25zdHJ1Y3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRHRvRm9yIH0gZnJvbSBcIi4uL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyXCI7XG5pbXBvcnQgXCIuLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ29udHJvbGxlckZhY3RvcnksXG4gIHR5cGUgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyxcbiAgdHlwZSBBdXRoQ29uZmlnLFxuICB0eXBlIFNlcnZlclJvdXRlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgRnJvbU1vZGVsQ29udHJvbGxlciB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZyA9IExvZ2dpbmcuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIubmFtZSk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9EZWNhZkVycm9yKFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nXG4gICk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICA/IGAke2ZhbGxiYWNrTWVzc2FnZX06ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgIDogZmFsbGJhY2tNZXNzYWdlXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRQZXJzaXN0ZW5jZTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBTZXJ2aWNlLmdldDxNb2RlbFNlcnZpY2U8VD4+KE1vZGVsQ2xhenopO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBNb2RlbFNlcnZpY2UuZ2V0U2VydmljZShNb2RlbENsYXp6KSBhcyBNb2RlbFNlcnZpY2U8VD47XG4gICAgICB9IGNhdGNoIChlMjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gUmVwb3NpdG9yeS5mb3JNb2RlbChNb2RlbENsYXp6KSBhcyBSZXBvPFQ+O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVJvdXRlc0Zyb21SZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gICAgcHJlZml4OiBzdHJpbmcgPSBQZXJzaXN0ZW5jZUtleXMuUVVFUllcbiAgKTogQ29udHJvbGxlckNvbnN0cnVjdG9yPFQ+IHtcbiAgICBjb25zdCByZXBvOiBSZXBvPFQ+ID1cbiAgICAgIHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlID8gcGVyc2lzdGVuY2UucmVwbyA6IHBlcnNpc3RlbmNlO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgcGFyYW1zXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcGFyYW1zLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIildXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQ6IHN0cmluZykgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgaGFuZGxlcik7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHBhcmFtcy5odHRwTWV0aG9kIGFzIEh0dHBWZXJicykoXG4gICAgICAgIHJvdXRlUGF0aCB8fCB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgcGFyYW1zLmh0dHBNZXRob2RcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIFtcbiAgICAgICAgaHR0cERlY29yYXRvcixcbiAgICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIG9ialZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlNZXRob2RzKSkge1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqVmFsdWVzLmZpZWxkcyA/PyBbXTtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwcmVmaXgsIG1ldGhvZE5hbWUsIC4uLmZpZWxkcy5tYXAoKGYpID0+IGA6JHtmfWApXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBoYW5kbGVyKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoXCJHRVRcIiBhcyBIdHRwVmVyYnMpKFxuICAgICAgICByb3V0ZVBhdGggfHwgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIFtcbiAgICAgICAgaHR0cERlY29yYXRvcixcbiAgICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiBRdWVyeUNvbnRyb2xsZXI7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPFQgZXh0ZW5kcyBNb2RlbDxhbnk+PihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3RvcjxUPixcbiAgICBtb2R1bGVDb25maWdPdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPixcbiAgICBnbG9iYWxEZWZhdWx0cz86IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz5cbiAgKTogQ29udHJvbGxlckNvbnN0cnVjdG9yPFQ+IHtcbiAgICBjb25zdCBsb2cgPSBGcm9tTW9kZWxDb250cm9sbGVyLmxvZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShNb2RlbENvbnN0cik7XG4gICAgY29uc3Qgcm91dGVQYXRoID0gdG9LZWJhYkNhc2UodGFibGVOYW1lKTtcbiAgICBjb25zdCBtb2RlbENsYXp6TmFtZSA9IE1vZGVsQ29uc3RyLm5hbWU7XG4gICAgY29uc3QgcGVyc2lzdGVuY2UgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFBlcnNpc3RlbmNlKE1vZGVsQ29uc3RyKTtcblxuICAgIC8vIFdoZW4gcGVyc2lzdGVuY2UgaXMgYSBNb2RlbFNlcnZpY2UsIHRoZSBAcXVlcnkvQHJvdXRlIG1ldGFkYXRhIGxpdmVzIG9uXG4gICAgLy8gdGhlIHVuZGVybHlpbmcgcmVwb3NpdG9yeSBjbGFzcyAoY3VzdG9tIHJlcG8pLCBub3Qgb24gTW9kZWxTZXJ2aWNlIGl0c2VsZi5cbiAgICAvLyBQYXNzIHRoZSByZXBvIHRvIHRoZSBmYWN0b3J5IHNvIGFkZENvbXBsZXhRdWVyaWVzKCkgY2FuIGRpc2NvdmVyIHRoZW0uXG4gICAgY29uc3QgZmFjdG9yeVBlcnNpc3RlbmNlID1cbiAgICAgIHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlID8gcGVyc2lzdGVuY2UucmVwbyA6IHBlcnNpc3RlbmNlO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yQ29uZmlnID0gTWV0YWRhdGEuZ2V0KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBNZXRhZGF0YS5rZXkoREVDQUZfQ09OVFJPTExFUl9DT05GSUcpXG4gICAgKSBhcyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1vZHVsZU92ZXJyaWRlID0gbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPy5bTW9kZWxDb25zdHIubmFtZV07XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnOiBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnID0ge1xuICAgICAgLi4uKGdsb2JhbERlZmF1bHRzIHx8IHt9KSxcbiAgICAgIC4uLihkZWNvcmF0b3JDb25maWcgfHwge30pLFxuICAgICAgLi4uKG1vZHVsZU92ZXJyaWRlIHx8IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgRmFjdG9yeUNvbnRyb2xsZXIgPSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LmNyZWF0ZTxUPihcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlLFxuICAgICAgbWVyZ2VkQ29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBmYWN0b3J5Um91dGVzID0gKEZhY3RvcnlDb250cm9sbGVyIGFzIGFueSkuX19yb3V0ZXNfXyBhc1xuICAgICAgfCBTZXJ2ZXJSb3V0ZVtdXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdldFBLLFxuICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgIHBhdGg6IHBrUGF0aCxcbiAgICB9ID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwoTW9kZWxDb25zdHIpO1xuXG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7ZmFjdG9yeVJvdXRlcz8ubGVuZ3RoID8/IDB9IGZhY3Rvcnkgcm91dGVzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdXRoQ29uZmlnOiBBdXRoQ29uZmlnIHwgdW5kZWZpbmVkID0gbWVyZ2VkQ29uZmlnLmF1dGg7XG5cbiAgICBmdW5jdGlvbiBhcHBseUNsYXNzQXV0aCh0YXJnZXQ6IGFueSkge1xuICAgICAgaWYgKGF1dGhDb25maWc/LnB1YmxpYykge1xuICAgICAgICBQdWJsaWMoKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChhdXRoQ29uZmlnPy5yb2xlcz8ubGVuZ3RoKSB7XG4gICAgICAgIFJlcXVpcmVSb2xlcyguLi5hdXRoQ29uZmlnLnJvbGVzKSh0YXJnZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQXV0aChNb2RlbENvbnN0cikodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoQ29uZmlnPy5za2lwTW9kZWxSb2xlcykge1xuICAgICAgICBTZXRNZXRhZGF0YShTS0lQX01PREVMX1JPTEVTX0tFWSwgdHJ1ZSkodGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAQ29udHJvbGxlcihyb3V0ZVBhdGgpXG4gICAgQEFwaVRhZ3MobW9kZWxDbGF6ek5hbWUpXG4gICAgQEFwaUV4dHJhTW9kZWxzKE1vZGVsQ29uc3RyKVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmcgPSBNb2RlbC5wayhNb2RlbENvbnN0cikgYXMgc3RyaW5nO1xuXG4gICAgICBwcm90ZWN0ZWQgc3RhdGljIGdldCBjbGFzcygpIHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBEeW5hbWljTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgUmVnaXN0ZXJpbmcgZHluYW1pYyBjb250cm9sbGVyIGZvciBtb2RlbDogJHt0aGlzLmNsYXNzLm5hbWV9IHJvdXRlOiAvJHtyb3V0ZVBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFwcGx5Q2xhc3NBdXRoKER5bmFtaWNNb2RlbENvbnRyb2xsZXIpO1xuXG4gICAgaWYgKGZhY3RvcnlSb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZFJvdXRlcyA9IFsuLi5mYWN0b3J5Um91dGVzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFTZWdtZW50cyA9IGEucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBiU2VnbWVudHMgPSBiLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgY29uc3QgYVBhcmFtQ291bnQgPSBhU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJQYXJhbUNvdW50ID0gYlNlZ21lbnRzLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBhTGl0ZXJhbENvdW50ID0gYVNlZ21lbnRzLmxlbmd0aCAtIGFQYXJhbUNvdW50O1xuICAgICAgICBjb25zdCBiTGl0ZXJhbENvdW50ID0gYlNlZ21lbnRzLmxlbmd0aCAtIGJQYXJhbUNvdW50O1xuICAgICAgICBpZiAoYUxpdGVyYWxDb3VudCAhPT0gYkxpdGVyYWxDb3VudClcbiAgICAgICAgICByZXR1cm4gYkxpdGVyYWxDb3VudCAtIGFMaXRlcmFsQ291bnQ7XG4gICAgICAgIGlmIChhUGFyYW1Db3VudCAhPT0gYlBhcmFtQ291bnQpIHJldHVybiBhUGFyYW1Db3VudCAtIGJQYXJhbUNvdW50O1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNvcnRlZFJvdXRlcykge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID1cbiAgICAgICAgICByb3V0ZS5pbXBsZW1lbnRhdGlvbj8ubmFtZSB8fCByb3V0ZS5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gRnJvbU1vZGVsQ29udHJvbGxlci5tYXRjaFJvdXRlKFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgcm91dGUsXG4gICAgICAgICAgcGtQYXRoLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgZ2V0UEssXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtZXRob2ROYW1lOiByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICAgcGFyYW1EZWNvcmF0b3JzLFxuICAgICAgICB9ID0gcmVnaXN0cmF0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHJvdXRlLm1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICAgICAgcm91dGUucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdLFxuICAgICAgICAgICAgcGFyYW1EZWNvcmF0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXTtcbiAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKE1vZGVsQ2xhenopIGFzIGtleW9mIE1vZGVsPGFueT47XG4gICAgY29uc3QgY29tcG9zZWQgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENsYXp6LFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5DT01QT1NFRCwgcGspXG4gICAgKTtcbiAgICBjb25zdCBjb21wb3NlZEtleXMgPSBjb21wb3NlZD8uYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPVxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb3NlZEtleXMpICYmIGNvbXBvc2VkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jb21wb3NlZEtleXNdKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoW3BrXSkpO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6KSA/PyBcIlwiO1xuICAgIGNvbnN0IHBhdGggPSBgOiR7dW5pcXVlS2V5cy5qb2luKFwiLzpcIil9YDtcbiAgICBjb25zdCBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10gPSB1bmlxdWVLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6LCBrZXkpLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+XG4gICAgICAgIGNvbXBvc2VkPy5zZXBhcmF0b3IgPyBwYXJhbXMuam9pbihjb21wb3NlZC5zZXBhcmF0b3IpIDogcGFyYW1zLmpvaW4oXCJcIiksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJvdXRlUGFyYW1EZWNvcmF0b3JzKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBsZXQgcGFyYW1JbmRleCA9IDA7XG4gICAgcmV0dXJuIHBhdGhcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5mbGF0TWFwKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShzZWdtZW50LnNsaWNlKDEpKSBhcyBhbnksIGluZGV4OiBwYXJhbUluZGV4KysgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShzZWdtZW50LnNsaWNlKDEpKSBhcyBhbnksIGluZGV4OiBwYXJhbUluZGV4KysgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmaW5lTWV0aG9kKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCwgbWV0aG9kTmFtZSwge1xuICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgdGFyZ2V0LnByb3RvdHlwZSB8fCB0YXJnZXQsXG4gICAgICBtZXRob2ROYW1lXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFwcGx5RGVjb3JhdG9ycyhcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgbWV0aG9kRGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHtcbiAgICAgIGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yO1xuICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICB9PiA9IFtdXG4gICkge1xuICAgIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2ROYW1lKTtcbiAgICBtZXRob2REZWNvcmF0b3JzLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgICBwYXJhbURlY29yYXRvcnMuZm9yRWFjaCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+XG4gICAgICBkZWNvcmF0b3IocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaFJvdXRlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZTogU2VydmVyUm91dGUsXG4gICAgcGtQYXRoOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOlxuICAgIHwge1xuICAgICAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgICAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+O1xuICAgICAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHtcbiAgICAgICAgICBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjtcbiAgICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICB9PjtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBtZXRob2QsIHBhdGggfSA9IHJvdXRlO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKTtcbiAgICBjb25zdCBoYW5kbGVyID0gcm91dGUuaW1wbGVtZW50YXRpb24gYXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrUmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1VwZGF0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllc1xuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrRGVsZXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBwa1BhdGhcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnVwZGF0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBwa1BhdGhcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgLi4ucm91dGVQYXJhbXMubWFwKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT4gKHtcbiAgICAgICAgICAgIGRlY29yYXRvcixcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCArIDEsXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICAgICAgcGtQYXRoXG4gICAgICAgICksXG4gICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2VkIFBLIGZhbGxiYWNrIHJvdXRlcyAoZmlsdGVyRW1wdHkpIOKAlCBwYXRoIGRpZmZlcnMgZnJvbSBwa1BhdGhcbiAgICBjb25zdCBmYWxsYmFja1NlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpc0FsbFBhcmFtcyA9XG4gICAgICBmYWxsYmFja1NlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGZhbGxiYWNrU2VnbWVudHMuZXZlcnkoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGlmIChpc0FsbFBhcmFtcyAmJiBub3JtYWxpemVkUGF0aCAhPT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCBmYWxsYmFja0FwaVByb3BzID0gZmFsbGJhY2tTZWdtZW50c1xuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlcmAsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICB9KSk7XG4gICAgICBjb25zdCBzdWZmaXggPSBmYWxsYmFja1NlZ21lbnRzLm1hcCgocykgPT4gcy5zbGljZSgxKSkuam9pbihcIkFuZFwiKTtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgcmVhZEJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoXG4gICAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgICAgZmFsbGJhY2tBcGlQcm9wcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoXG4gICAgICAgICAgKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHVwZGF0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgICBmYWxsYmFja0FwaVByb3BzLFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhcbiAgICAgICAgICApLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCArIDEsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYGRlbGV0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgICBmYWxsYmFja0FwaVByb3BzLFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJzdGF0ZW1lbnQvOm1ldGhvZC8qYXJnc1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwic3RhdGVtZW50XCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50RGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwibWV0aG9kXCIpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJhcmdzXCIpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZmluZE9uZUJ5XCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWVxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRSb3V0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcImxpc3RCeS86a2V5XCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZLFxuICAgICAgXCJwYWdpbmF0ZUJ5LzprZXkvOnBhZ2VcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlksXG4gICAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgICAgXCJwYWdlLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSxcbiAgICAgIFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWSxcbiAgICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgICAgXCJjb3VudE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0YsXG4gICAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgICAgXCJtaW5PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRixcbiAgICAgIFwiYXZnT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YsXG4gICAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgICAgXCJkaXN0aW5jdE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YsXG4gICAgICBcImdyb3VwT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRixcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhdGVtZW50S2V5ID0gc3RhdGVtZW50Um91dGVzW25vcm1hbGl6ZWRQYXRoXTtcbiAgICBpZiAoc3RhdGVtZW50S2V5ICYmIG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudE1ldGhvZE5hbWUobm9ybWFsaXplZFBhdGgpLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBzdGF0ZW1lbnRLZXlcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBjb25zdCBxdWVyeU1ldGhvZCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICAgIHF1ZXJ5TWV0aG9kLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNvbXBsZXhRdWVyeVBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFNlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBrbm93blByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIFwibGlzdEJ5XCIsXG4gICAgICBcImZpbmRCeVwiLFxuICAgICAgXCJmaW5kQnlQYWdpbmF0ZVwiLFxuICAgICAgXCJmaW5kT25lQnlcIixcbiAgICAgIFwicGFnaW5hdGVCeVwiLFxuICAgICAgXCJmaW5kXCIsXG4gICAgICBcInBhZ2VcIixcbiAgICAgIFwiY291bnRPZlwiLFxuICAgICAgXCJtYXhPZlwiLFxuICAgICAgXCJtaW5PZlwiLFxuICAgICAgXCJhdmdPZlwiLFxuICAgICAgXCJzdW1PZlwiLFxuICAgICAgXCJkaXN0aW5jdE9mXCIsXG4gICAgICBcImdyb3VwT2ZcIixcbiAgICAgIFwic3RhdGVtZW50XCIsXG4gICAgICBcImJ1bGtcIixcbiAgICAgIFwicXVlcnlcIixcbiAgICBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwic3RhdGVtZW50L1wiKSAmJlxuICAgICAgIWtub3duUHJlZml4ZXMuaGFzKHBhdGhTZWdtZW50c1swXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBwYXRoU2VnbWVudHNcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgW1xuICAgICAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgICBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PlxuICApIHtcbiAgICByZXR1cm4geyBtZXRob2ROYW1lLCBoYW5kbGVyLCBkZWNvcmF0b3JzLCBwYXJhbURlY29yYXRvcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudE1ldGhvZE5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmaXJzdFNlZ21lbnQgPSBwYXRoLnNwbGl0KFwiL1wiKVswXTtcbiAgICByZXR1cm4gZmlyc3RTZWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJsaXN0QnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwiZmluZC9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpXG4gICAgKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbXBsZXhRdWVyeVBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29tcGxleFF1ZXJ5KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgbG9nOiBhbnkgPSB0aGlzLmxvZz8uZm9yPy4oY29tcGxleFF1ZXJ5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5kZWJ1ZyhgSW52b2tpbmcgY3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiYCk7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSAoYXdhaXQgdGhpcy5sb2dDdHgoW10sIG1ldGhvZE5hbWUsIHRydWUpKS5mb3IoXG4gICAgICAgICAgY29tcGxleFF1ZXJ5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5ub3JtYWxpemVRdWVyeUFyZ3MoYXJncyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwZXJzaXN0ZW5jZT8ucmVwbyAmJlxuICAgICAgICAgIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZT8ucXVlcnkgJiYgdHlwZW9mIHBlcnNpc3RlbmNlLnF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucXVlcnkobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgUGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RRdWVyeUFyZ3MoYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gYXJncztcbiAgICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIHR5cGVvZiBsYXN0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICBjb25zdCBxdWVyeU9iaiA9IGFyZ3MucG9wKCk7XG4gICAgICBjb25zdCBoYXNEaXJlY3Rpb24gPSBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0xpbWl0ID0gcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc09mZnNldCA9IHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFoYXNEaXJlY3Rpb24gJiYgIWhhc0xpbWl0ICYmICFoYXNPZmZzZXQpIHJldHVybiBhcmdzO1xuICAgICAgY29uc3QgZXh0cmFzOiBhbnlbXSA9IFtdO1xuICAgICAgaWYgKGhhc0RpcmVjdGlvbikgZXh0cmFzLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICAgIGVsc2UgaWYgKGhhc0xpbWl0IHx8IGhhc09mZnNldCkgZXh0cmFzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYXNMaW1pdCkgZXh0cmFzLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgICAgaWYgKGhhc09mZnNldCkgZXh0cmFzLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICAgIHJldHVybiBbLi4uYXJncywgLi4uZXh0cmFzXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3JtYWxpemVRdWVyeUFyZ3MoYXJnczogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZXh0cmFjdFF1ZXJ5QXJncyhhcmdzKTtcbiAgICBpZiAobm9ybWFsaXplZC5sZW5ndGggPT09IDApIHJldHVybiBub3JtYWxpemVkO1xuXG4gICAgY29uc3QgbGFzdCA9IG5vcm1hbGl6ZWRbbm9ybWFsaXplZC5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWxhc3QgfHwgdHlwZW9mIGxhc3QgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShsYXN0KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlPYmogPSBsYXN0IGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgaGFzUXVlcnlGaWVsZHMgPVxuICAgICAgcXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmxpbWl0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBxdWVyeU9iai5ib29rbWFyayAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFoYXNRdWVyeUZpZWxkcykge1xuICAgICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZWQucG9wKCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICBpZiAocXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLmxpbWl0KTtcbiAgICBpZiAocXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgIGlmIChxdWVyeU9iai5ib29rbWFyayAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmouYm9va21hcmspO1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYENyZWF0ZSBhIG5ldyAke21vZGVsQ2xhenpOYW1lfS5gIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICB0eXBlOiBEdG9Gb3IoT3BlcmF0aW9uS2V5cy5DUkVBVEUsIE1vZGVsQ29uc3RyKSxcbiAgICAgIH0pLFxuICAgICAgQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICAgIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVsa0NyZWF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUE9TVFwiLCBcImJ1bGtcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrUmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgaXRlbXM6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiUFVUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgd2l0aCBuZXcgcGF5bG9hZHMuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIHJlY29yZHMgb2YgJHttb2RlbENsYXp6TmFtZX1gLFxuICAgICAgICBzY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgJHJlZjogZ2V0U2NoZW1hUGF0aChEdG9Gb3IoT3BlcmF0aW9uS2V5cy5VUERBVEUsIE1vZGVsQ29uc3RyKSksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrRGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyBieSBpZHMuYCB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJpZHNcIiwgcmVxdWlyZWQ6IHRydWUsIHR5cGU6IFwiYXJyYXlcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVsZXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIHBrUGF0aDogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiREVMRVRFXCIsIHBrUGF0aCksXG4gICAgICBBcGlQYXJhbXNGcm9tTW9kZWwoYXBpUHJvcGVydGllcyksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgRGVsZXRlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICBzY2hlbWE6IHsgJHJlZjogZ2V0U2NoZW1hUGF0aChNb2RlbENvbnN0cikgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnREZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYEV4ZWN1dGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50IG9uICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJtZXRob2RcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHByZXBhcmVkIHN0YXRlbWVudCB0byBleGVjdXRlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJhcmdzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYXJndW1lbnRzIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FuIGFjY2VwdFwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGxpc3RlZCBmb3VuZC5gIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBiYXNlOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwYXRoKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICB9KSxcbiAgICBdO1xuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZykgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIGJhc2UucHVzaChBcGlQYXJhbSh7IG5hbWUsIGRlc2NyaXB0aW9uOiBgVGhlICR7bmFtZX0gcGFyYW1ldGVyYCB9KSk7XG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJsaXN0QnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwiZmluZC9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpXG4gICAgKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJwYWdlIG51bWJlclwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiYm9va21hcmtcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiYm9va21hcmsgZm9yIGN1cnNvciBwYWdpbmF0aW9uXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kT25lQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcImZpbmRCeS9cIikpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0ZcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBSZXN1bHQgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgRGlzdGluY3QgdmFsdWVzIGZvciAke21vZGVsQ2xhenpOYW1lfS5gLFxuICAgICAgICAgIHR5cGU6IFtTdHJpbmddLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgcm91dGVQYXRoOiBzdHJpbmcsXG4gICAgaHR0cFZlcmI6IHN0cmluZyxcbiAgICBpbmNsdWRlUXVlcnlQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChwOiBzdHJpbmcpOiBzdHJpbmdbXSA9PlxuICAgICAgcFxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpO1xuXG4gICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHttZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgICAgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFya1wiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGcm9tTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4vRnJvbU1vZGVsQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlRm9yKGZsYXZvdXI6IHN0cmluZykge1xuICBATW9kdWxlKHt9KVxuICBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZNb2RlbE1vZHVsZS5uYW1lKS5mb3IoZmxhdm91cik7XG5cbiAgICBzdGF0aWMgY3JlYXRlTW9kZWxTZXJ2aWNlczxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgICAgbW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPFQ+W11cbiAgICApOiBQcm92aWRlcltdIHtcbiAgICAgIHJldHVybiBtb2RlbHMubWFwKChtb2RlbCkgPT4gKHtcbiAgICAgICAgcHJvdmlkZTogYCR7bW9kZWwubmFtZX1TZXJ2aWNlYCxcbiAgICAgICAgdXNlRmFjdG9yeTogKCkgPT4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRXhwb3NlZChcbiAgICAgIG1vZGVsOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBleHBvc3VyZT86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmdbXT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXhwb3N1cmU/Llttb2RlbC5uYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgdHlwZW9mIG92ZXJyaWRlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyBvdmVycmlkZVxuICAgICAgICAgIDogTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoREVDQUZfRVhQT1NFKSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZsYXZvdXIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JSb290KFxuICAgICAgZmxhdm91cjogc3RyaW5nLFxuICAgICAgb3B0aW9uczogUGFydGlhbDxEZWNhZk1vZHVsZU9wdGlvbnM+ID0ge31cbiAgICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpLmZpbHRlcigobW9kZWwpID0+XG4gICAgICAgIHRoaXMuaXNFeHBvc2VkKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnRyb2xsZXJzIGFsd2F5cyByZWx5IG9uIGEgYmFja2luZyBNb2RlbFNlcnZpY2UsIGV2ZW4gd2hlbiBOZXN0IHByb3ZpZGVyc1xuICAgICAgLy8gYXJlIG5vdCBhdXRvLXJlZ2lzdGVyZWQuIFdhcm0gdGhlIHNpbmdsZXRvbiByZWdpc3RyeSBoZXJlIHNvIHNodXRkb3duIGNhblxuICAgICAgLy8gc2VlIHRoZSBsaXZlIHNlcnZpY2VzIGNyZWF0ZWQgZm9yIHRoZSBnZW5lcmF0ZWQgY29udHJvbGxlcnMuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRyYWNrZWRNb2RlbHMpIE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpO1xuXG4gICAgICBsZXQgbW9kZWxTZXJ2aWNlczogUHJvdmlkZXJbXSA9IFtdO1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1NlcnZpY2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiQXV0by1zZXJ2aWNlcyBlbmFibGVkLiBJbml0aWFsaXppbmcgc2VydmljZSBnZW5lcmF0aW9uLlwiKTtcbiAgICAgICAgbW9kZWxTZXJ2aWNlcyA9IHRoaXMuY3JlYXRlTW9kZWxTZXJ2aWNlcyh0cmFja2VkTW9kZWxzKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYEF1dG8tc2VydmljZXMgY29tcGxldGVkLiAke21vZGVsU2VydmljZXMubGVuZ3RofSBzZXJ2aWNlcyBpbml0aWFsaXplZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdsb2JhbERlZmF1bHRzOiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+ID0ge307XG4gICAgICBpZiAob3B0aW9ucy5hZ2dyZWdhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGdsb2JhbERlZmF1bHRzLmFsbG93R3JvdXBpbmdRdWVyaWVzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAoKG1vZGVsKSA9PlxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZShtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLCBnbG9iYWxEZWZhdWx0cylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/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+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3M6IGFueVtdKTogdW5rbm93bltdIHtcbiAgY29uc3QgW21vZGVsQ29uc3RyLCBvcGVyYXRpb24sIGlkLCBwYXlsb2FkXSA9IGFyZ3M7XG5cbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDb25zdHI/Lm5hbWUgPz8gbW9kZWxDb25zdHI7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFBheWxvYWQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpXG4gICAgPyBwYXlsb2FkLm1hcCgoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZS5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGUuc2VyaWFsaXplKCk7XG5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgUGF5bG9hZCBpdGVtIGZvciAke21vZGVsTmFtZX0gZG9lcyBub3QgaGF2ZSBzZXJpYWxpemUgbWV0aG9kIGFuZCBpcyBhbiAke3R5cGVvZiBlfSwgYXR0ZW1wdGluZyB0byBzdHJpbmdpZnkgZGlyZWN0bHkuIEl0ZW06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09IFwic3RyaW5nXCIgPyBlIDogSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBwYXlsb2FkIGZvciAke21vZGVsTmFtZX06ICR7ZXJyfWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHBheWxvYWQuc2VyaWFsaXplKClcbiAgICAgIDogdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXlsb2FkXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgY29uc29sZS5kZWJ1ZyhcbiAgICBgTm9ybWFsaXplZCBldmVudCByZXNwb25zZSBmb3IgbW9kZWwgJHttb2RlbE5hbWV9LCBvcGVyYXRpb24gJHtvcGVyYXRpb259LCBpZCAke2lkfTpgLFxuICAgIHNlcmlhbGl6ZWRQYXlsb2FkXG4gICk7XG5cbiAgcmV0dXJuIFttb2RlbE5hbWUsIG9wZXJhdGlvbiwgaWQsIHNlcmlhbGl6ZWRQYXlsb2FkXTtcbn1cbiIsImltcG9ydCB7IERlY2FmQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBPYnNlcnZlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgSW5qZWN0LCBNZXNzYWdlRXZlbnQsIFF1ZXJ5LCBTc2UgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGludGVydmFsLCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVFdmVudFJlc3BvbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb250cm9sbGVyKClcbmV4cG9ydCBjbGFzcyBFdmVudHNDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPERlY2FmU2VydmVyQ3R4PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQEluamVjdChMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMpIGZsYXZvdXJzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuICAgIHRoaXMuYWRhcHRlcnMgPSBmbGF2b3Vycy5tYXAoKGZsYXZvdXIpID0+IChBZGFwdGVyIGFzIGFueSkuZ2V0KGZsYXZvdXIpKTsgLy8gY2hhbmdlIHRvIEFkYXB0ZXIuY2FjaGUoXCJcIilcbiAgfVxuXG4gIEBTc2UoKVxuICBsaXN0ZW4oKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgY29uc3QgZXZlbnRzJCA9IG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZlcklkID1cbiAgICAgICAgYEItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ3JlYXRpbmcgU1NFIG9ic2VydmVyOiAke29ic2VydmVySWR9IGZvciBjbGllbnQgJHt0aGlzLmNsaWVudENvbnRleHQudXVpZH1gXG4gICAgICApO1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICBvYnNlcnZlcklkID0gb2JzZXJ2ZXJJZDtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IHJlY2VpdmVkIHJlZnJlc2ggZXZlbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBcIm1lc3NhZ2VcIiwgZGF0YSB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gZXZlbnQgcHVzaGVkIHRvIGNsaWVudGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBhY3Jvc3MgJHt0aGlzLmFkYXB0ZXJzLmxlbmd0aH0gYWRhcHRlcihzKWBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWdpc3RlciBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENsZWFuaW5nIHVwIFNTRSBvYnNlcnZlciAke29ic2VydmVySWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgVW5yZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGZyb20gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgZHVyaW5nIGNsZWFudXAgb2Ygb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDE1MDAwO1xuICAgIGNvbnN0IGhlYXJ0YmVhdCQgPSBpbnRlcnZhbChIRUFSVEJFQVRfSU5URVJWQUxfTVMpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTZW5kaW5nIGhlYXJ0YmVhdFwiKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKFxuICAgICAgICAoKTogTWVzc2FnZUV2ZW50ID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJoZWFydGJlYXRcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBtZXJnZShldmVudHMkLCBoZWFydGJlYXQkKTtcbiAgfVxuXG4gIEBTc2UoXCIvOm1vZGVsXCIpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbGlzdGVuRm9yTW9kZWwoQFF1ZXJ5KFwibW9kZWxcIikgbW9kZWw6IHN0cmluZyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGRhdGE6IGFyZ3MgfSBhcyBhbnkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihgRmFpbGVkIHRvIG9ic2VydmUgZXZlbnQ6ICR7ZS5tZXNzYWdlIHx8IGV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBFdmVudHNDb250cm9sbGVyIH0gZnJvbSBcIi4vRXZlbnRzQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmU3RyZWFtTW9kdWxlIHtcbiAgc3RhdGljIGZvckZsYXZvdXJzKFxuICAgIGZsYXZvdXJzOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmcgPSBcImV2ZW50c1wiXG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnM6IFtFdmVudHNDb250cm9sbGVyXSxcbiAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgUm91dGVyTW9kdWxlLnJlZ2lzdGVyKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSxcbiAgICAgICAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMsXG4gICAgICAgICAgdXNlVmFsdWU6IGZsYXZvdXJzID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBGb3J3YXJkUmVmZXJlbmNlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZkNvcmVNb2R1bGUgfSBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlRm9yIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWwvaW5kZXhcIjtcbmltcG9ydCB7IERlY2FmU3RyZWFtTW9kdWxlIH0gZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZHVsZSB7XG4gIHN0YXRpYyBhc3luYyBmb3JSb290QXN5bmMoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xuICAgIGNvbnN0IHsgYXV0b0NvbnRyb2xsZXJzLCBhdXRvU2VydmljZXMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmJvb3RQZXJzaXN0ZW5jZShvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VycyA9IGFkYXB0ZXJzLm1hcCgoYWRhcHRlcikgPT4gYWRhcHRlci5mbGF2b3VyKTtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgICBmbGF2b3Vycy5mb3JFYWNoKChmbGF2b3VyKSA9PiB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICAgICAgZ2V0TW9kdWxlRm9yKGZsYXZvdXIpLmZvclJvb3QoZmxhdm91ciwge1xuICAgICAgICAgICAgICBhdXRvU2VydmljZXMsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJFeHBvc3VyZTogb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJDb25maWc6IG9wdGlvbnMuY29udHJvbGxlckNvbmZpZyxcbiAgICAgICAgICAgICAgYWdncmVnYXRpb25zOiBvcHRpb25zLmFnZ3JlZ2F0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlck9wdGlvbnM/LmVuYWJsZU9ic2VydmVyRXZlbnRzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgIERlY2FmU3RyZWFtTW9kdWxlLmZvckZsYXZvdXJzKFxuICAgICAgICAgIG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zLm9ic2VydmVyRmxhdm91cnMgfHwgZmxhdm91cnNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHt9XG4iLCJpbXBvcnQge01vZGVsfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge0ludGVybmFsRXJyb3J9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtSZXBvc2l0b3J5fSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9Gb3JNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IG0gPSBNb2RlbC5nZXQobW9kZWwpO1xuXHRpZiAoIW0pXG5cdFx0dGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YClcblx0Y29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cdHJldHVybiByZXBvO1xufSIsIi8qKlxuICogQG1vZHVsZSBmb3ItbmVzdFxuICogQGRlc2NyaXB0aW9uIFRoaXMgbW9kdWxlIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHRzLXdvcmtzcGFjZSBsaWJyYXJ5LiBJdCBhZ2dyZWdhdGVzIGFuZCBleHBvcnRzXG4gKiBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCB1dGlsaXRpZXMgd2l0aGluIHRoZSBwcm9qZWN0LlxuICpcbiAqIFRoZSBtb2R1bGUgaW5jbHVkZXM6XG4gKiAxLiBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgXCIuL3V0aWxzXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGVzZSBsaWtlbHkgY29udGFpbiBoZWxwZXIgZnVuY3Rpb25zLCBjb21tb24gdHlwZXMsIGFuZCBzaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3QuXG4gKiAgICAtIE1heSBpbmNsdWRlIG9wZXJhdGlvbnMgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLCB0eXBlIGNoZWNraW5nLCBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2UgdXRpbGl0aWVzLlxuICpcbiAqIDIuIEEgbmFtZXNwYWNlIGFuZCByZWxhdGVkIHR5cGVzIGZyb20gdGhlIFwiLi9uYW1lc3BhY2VcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoaXMgY291bGQgY29udGFpbiBkb21haW4tc3BlY2lmaWMgY29kZSBvciBhIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuICogICAgLSBNaWdodCBpbmNsdWRlIGludGVyZmFjZXMsIHR5cGVzLCBvciBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGNvcmUgY29uY2VwdHMgaW4gdGhlIGxpYnJhcnkuXG4gKlxuICogMy4gQSBWRVJTSU9OIGNvbnN0YW50OlxuICogICAgLSBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqICAgIC0gVXNlZnVsIGZvciB2ZXJzaW9uIGNoZWNraW5nIGFuZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICpcbiAqIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIGEgY2xlYW4gYW5kIG9yZ2FuaXplZCBleHBvcnQgb2YgdGhlIG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHksIGFsbG93aW5nIGNvbnN1bWVyc1xuICogdG8gZWFzaWx5IGltcG9ydCBhbmQgdXNlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IGFzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IFwiLi9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRpb25cIjsgLy8gb24gdG9wIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL292ZXJyaWRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWVzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250cm9sbGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi93ZWJob29rc1wiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHMtd29ya3NwYWNlIG1vZHVsZS5cbiAqIFRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgaXMgcmVwbGFjZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24odHJ1ZSk7XG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24oZmFsc2UpO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlNfUFJFRklYIiwiREVDT1JBVE9SUyIsIkFQSV9PUEVSQVRJT04iLCJBUElfUkVTUE9OU0UiLCJBUElfUFJPRFVDRVMiLCJBUElfQ09OU1VNRVMiLCJBUElfVEFHUyIsIkFQSV9DQUxMQkFDS1MiLCJBUElfUEFSQU1FVEVSUyIsIkFQSV9IRUFERVJTIiwiQVBJX01PREVMX1BST1BFUlRJRVMiLCJBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSIsIkFQSV9TRUNVUklUWSIsIkFQSV9FWENMVURFX0VORFBPSU5UIiwiQVBJX0VYQ0xVREVfQ09OVFJPTExFUiIsIkFQSV9FWFRSQV9NT0RFTFMiLCJBUElfRVhURU5TSU9OIiwiQVBJX1NDSEVNQSIsIkFQSV9ERUZBVUxUX0dFVFRFUiIsIkFQSV9MSU5LIiwiaXNDb25zdHJ1Y3RvciIsInZhbCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsIk1FVEhPRF9NRVRBREFUQSIsImNyZWF0ZU1ldGhvZERlY29yYXRvciIsIm1ldGFrZXkiLCJtZXRhZGF0YSIsIm92ZXJyaWRlRXhpc3RpbmciLCJ0YXJnZXQiLCJrZXkiLCJkZXNjcmlwdG9yIiwicHJldlZhbHVlIiwiUmVmbGVjdCIsImdldE1ldGFkYXRhIiwidmFsdWUiLCJkZWZpbmVNZXRhZGF0YSIsImNyZWF0ZUNsYXNzRGVjb3JhdG9yIiwiY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IiLCJwcm9wZXJ0eUtleSIsInByb3BlcnRpZXMiLCJpbmNsdWRlcyIsImV4aXN0aW5nTWV0YWRhdGEiLCJuZXdNZXRhZGF0YSIsInBpY2tCeSIsIm5lZ2F0ZSIsImlzVW5kZWZpbmVkIiwibWV0YWRhdGFUb1NhdmUiLCJ0eXBlIiwiY29uc3RydWN0b3IiLCJjcmVhdGVNaXhlZERlY29yYXRvciIsIm1ldGFkYXRhcyIsIkFycmF5IiwiaXNBcnJheSIsInByZXZpb3VzTWV0YWRhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJjcmVhdGVQYXJhbURlY29yYXRvciIsImluaXRpYWwiLCJwYXJhbU9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwicHJvcGVydHlLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsIm1ldGhvZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJpc0FwaU1ldGhvZCIsImhhc01ldGFkYXRhIiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImlucHV0IiwiaXNBcnJheUZsYWciLCJpc0lucHV0QXJyYXkiLCJvYmoiLCJnZXRFbnVtVmFsdWVzIiwiZW51bVR5cGUiLCJudW1lcmljVmFsdWVzIiwidmFsdWVzIiwiZmlsdGVyIiwibWFwIiwidG9TdHJpbmciLCJrZXlzIiwiZ2V0RW51bVR5cGUiLCJoYXNTdHJpbmciLCJpc1N0cmluZyIsImxlbmd0aCIsInJlcXVpcmVkIiwiaXNFbnVtQXJyYXkiLCJvcHRzIiwiZW51bSIsInVuZGVmaW5lZCIsIkFwaVByb3BlcnR5Iiwib3B0aW9ucyIsImNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yIiwiZW51bVZhbHVlcyIsIml0ZW1zIiwiQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiTW9kZWxDb25zdHJ1Y3RvciIsInZlcmIiLCJwYXRoIiwiaHR0cFRvQ3J1ZCIsIkdFVCIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiR2V0IiwiUE9TVCIsIkNSRUFURSIsIlBvc3QiLCJQVVQiLCJVUERBVEUiLCJQdXQiLCJQQVRDSCIsIlBhdGNoIiwiREVMRVRFIiwiRGVsZXRlIiwiY3J1ZE9wIiwiSHR0cE1ldGhvZERlY29yYXRvciIsInJlc29sdmVCbG9ja1RhcmdldCIsImNvcmVJc09wZXJhdGlvbkJsb2NrZWQiLCJraW5kIiwiYXBwbHkiLCJBcGlFeGNsdWRlRW5kcG9pbnQiLCJCdWxrQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiUkVBRF9BTEwiLCJDUkVBVEVfQUxMIiwiVVBEQVRFX0FMTCIsIkRFTEVURV9BTEwiLCJub3JtYWxpemVkIiwicmVwbGFjZSIsInN0YXRlbWVudFRhcmdldHMiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJMSVNUX0JZIiwiUEFHRV9CWSIsIkZJTkQiLCJQQUdFIiwiRklORF9PTkVfQlkiLCJGSU5EX0JZIiwiQ09VTlRfT0YiLCJNQVhfT0YiLCJNSU5fT0YiLCJBVkdfT0YiLCJTVU1fT0YiLCJESVNUSU5DVF9PRiIsIkdST1VQX09GIiwic3RhcnRzV2l0aCIsInN0YXRlbWVudFZhbHVlIiwiQXBpUGFyYW1zRnJvbU1vZGVsIiwicHJvcHMiLCJkZWNvcmF0b3JzIiwicCIsIkFwaVBhcmFtRGVjIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiU3RyaW5nIiwiYXBwbHlEZWNvcmF0b3JzIiwiRGVjYWZCb2R5IiwiZGF0YSIsImN0eCIsInJlcXVlc3QiLCJzd2l0Y2hUb0h0dHAiLCJnZXRSZXF1ZXN0IiwiYm9keSIsImNvbnRyb2xsZXIiLCJnZXRDbGFzcyIsIk1vZGVsQ29uc3RyIiwiY2xhc3MiLCJJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIiwiaXRlbSIsIk9yZGVyZWRQYXJhbXMiLCJvcmRlciIsInJlcSIsIm9yaWdpbmFsIiwicGFyYW1zIiwib3JkZXJMaXN0Iiwib3JkZXJlZCIsImsiLCJyYXciLCJ2YWx1ZXNJbk9yZGVyIiwia2V5c0luT3JkZXIiLCJEZWNhZlBhcmFtcyIsIkRlY2FmUXVlcnkiLCJfIiwicXVlcnkiLCJwYXJzZWQiLCJsaW1pdCIsIm4iLCJOdW1iZXIiLCJpc05hTiIsIm9mZnNldCIsImJvb2ttYXJrIiwiREVDQUZfTU9EVUxFX09QVElPTlMiLCJERUNBRl9BREFQVEVSX0lEIiwiREVDQUZfVEFTS19TRVJWSUNFX0lEIiwiREVDQUZfUk9VVEUiLCJERUNBRl9IQU5ETEVSUyIsIlN5bWJvbCIsIkRFQ0FGX0VYUE9TRSIsIkRFQ0FGX0NPTlRST0xMRVJfQ09ORklHIiwiREVDQUZfQ09OVEVYVF9LRVkiLCJleHBvc2UiLCJmbGF2b3VycyIsIk1ldGFkYXRhIiwic2V0IiwiY29udHJvbGxlckNvbmZpZyIsImNvbmZpZyIsImNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IiLCJBVVRIX0hBTkRMRVIiLCJBVVRIX01FVEFfS0VZIiwiSVNfUFVCTElDX0tFWSIsIlJFUVVJUkVEX1JPTEVTX0tFWSIsIlNLSVBfTU9ERUxfUk9MRVNfS0VZIiwiRGVjYWZSZXF1ZXN0Q29udGV4dCIsIlJlcXVlc3RDb250ZXh0Iiwic3VwZXIiLCJoZWFkZXJzT2YiLCJoZWFkZXJzIiwidGhpcyIsInV1aWQiLCJVVUlEIiwiaW5zdGFuY2UiLCJnZW5lcmF0ZSIsImdldE9yVW5kZWZpbmVkIiwicHV0IiwicmVjb3JkIiwib3ZlcnJpZGVzIiwiZ2V0IiwiZSIsImFjY3VtdWxhdGUiLCJfX2RlY29yYXRlIiwiSW5qZWN0YWJsZSIsInNjb3BlIiwiU2NvcGUiLCJSRVFVRVNUIiwiX19wYXJhbSIsIkluamVjdCIsIkF1dGhJbnRlcmNlcHRvciIsInJlZmxlY3RvciIsInJlcXVlc3RDb250ZXh0IiwiYXV0aEhhbmRsZXIiLCJpbnRlcmNlcHQiLCJuZXh0IiwibG9nIiwiTG9nZ2luZyIsImZvciIsImlzUHVibGljIiwiZ2V0QWxsQW5kT3ZlcnJpZGUiLCJnZXRIYW5kbGVyIiwibW9kZWxOYW1lIiwicmVxdWlyZWRSb2xlcyIsInNraXBNb2RlbFJvbGVzIiwiZWZmZWN0aXZlTW9kZWwiLCJ2ZXJib3NlIiwiZGVidWciLCJhdXRob3JpemUiLCJhcHBseVRyYW5zZm9ybWVycyIsInVzZXIiLCJvcmdhbml6YXRpb24iLCJjdXJyZW50TG9nIiwiY2hpbGRMb2ciLCJsb2dnZXIiLCJoYW5kbGUiLCJBZGFwdGVyIiwiZmxhdm91cnNUb1RyYW5zZm9ybSIsImZsYXZvdXIiLCJ0cmFuc2Zvcm1lciIsInRyYW5zZm9ybWVyRm9yIiwiZnJvbSIsIk9wdGlvbmFsIiwiUmVmbGVjdG9yIiwiQXV0aCIsIm1vZGVsIiwicmVzb3VyY2UiLCJkZWNzIiwiQXBpQmVhcmVyQXV0aCIsIlVzZUludGVyY2VwdG9ycyIsInB1c2giLCJTZXRNZXRhZGF0YSIsIlB1YmxpYyIsIlJlcXVpcmVSb2xlcyIsInJvbGVzIiwiQXBpU2VjdXJpdHkiLCJIdHRwVmVyYlRvRGVjb3JhdG9yIiwiZGVjb3JhdG9yIiwiVW5zdXBwb3J0ZWRFcnJvciIsImV4dHJhY3RQYXRoUGFyYW1zIiwicm91dGVQYXRoIiwic3BsaXQiLCJzbGljZSIsImFwaVBhcmFtU3BlYyIsInRvRGVjYWZFcnJvciIsImVycm9yIiwiZmFsbGJhY2tNZXNzYWdlIiwiQmFzZUVycm9yIiwiSW50ZXJuYWxFcnJvciIsIkVycm9yIiwibWVzc2FnZSIsImdldEFwaURlY29yYXRvcnMiLCJtZXRob2ROYW1lIiwiaHR0cFZlcmIiLCJpbmNsdWRlUXVlcnlQYXJhbXMiLCJOZXN0SHR0cFJvdXRlRGVjIiwiYXBpUGF0aFBhcmFtcyIsInN3YWdnZXJRdWVyeVBhcmFtcyIsIkFwaVF1ZXJ5IiwiT3JkZXJEaXJlY3Rpb24iLCJtZXRob2QiLCJBcGlQYXJhbSIsIkFwaU9wZXJhdGlvbiIsInN1bW1hcnkiLCJBcGlPa1Jlc3BvbnNlIiwiQXBpTm9Db250ZW50UmVzcG9uc2UiLCJRdWVyeSIsImFwcGx5QXBpRGVjb3JhdG9ycyIsInByb3RvIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZCIsInBlcnNpc3RlbmNlIiwiYXJncyIsIk1vZGVsU2VydmljZSIsInN0YXRlbWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlciIsImFzeW5jIiwicGF0aFBhcmFtcyIsInF1ZXJ5UGFyYW1zIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpcmVjdGlvbiIsImRlZmluZVJvdXRlTWV0aG9kIiwiQ29udHJvbGxlckNsYXNzIiwiaGFuZGxlciIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJEZWNhZkF1dGhIYW5kbGVyIiwiQXV0aEhhbmRsZXIiLCJwYXJzZVJlcXVlc3QiLCJ1c2VyUm9sZSIsImF1dGhvcml6YXRpb24iLCJleHRyYWN0RnJvbUF1dGgiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJEZWNhZlJvbGVBdXRoSGFuZGxlciIsIkRlY2FmQXV0aE1vZHVsZSIsIkRlY2FmQXV0aE1vZHVsZV8xIiwiZm9yUm9vdCIsInByb3ZpZGVycyIsInByb3ZpZGUiLCJ1c2VDbGFzcyIsImdsb2JhbCIsIkFQUF9JTlRFUkNFUFRPUiIsInVzZUV4aXN0aW5nIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZHVsZSIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3JfMSIsImhhbmRsZXJzIiwiY29udGV4dCIsImV4ZWMiLCJyZXMiLCJ1cmwiLCJEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IiLCJyZXNwb25zZSIsImdldFJlc3BvbnNlIiwicGlwZSIsInRhcCIsInRvUmVzcG9uc2UiLCJEZWNhZkNvbnRyb2xsZXIiLCJIdHRwRGVjYWZDb250cm9sbGVyIiwiY2xpZW50Q29udGV4dCIsIl9uYW1lIiwiRGVjYWZNb2RlbENvbnRyb2xsZXIiLCJfcGVyc2lzdGVuY2UiLCJTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIlJlcG9zaXRvcnkiLCJmb3JNb2RlbCIsInRvT3ZlcnJpZGVzIiwib3ZlcnJpZGUiLCJkdG9DYWNoZSIsIk1hcCIsIkR0b0ZvciIsIm9wIiwic3RhY2siLCJTZXQiLCJUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMiLCJjYWNoZSIsImdldER0b0NhY2hlIiwiY2FjaGVkIiwiaXNVcGRhdGVPcCIsIkR5bmFtaWNEVE8iLCJ0b1Bhc2NhbENhc2UiLCJwa1Byb3AiLCJNb2RlbCIsInBrIiwicGtQcm9wc01ldGFkYXRhIiwicGtQcm9wcyIsInBrRGVzaWduVHlwZSIsInBrVHlwZUlzTnVtZXJpYyIsIkJpZ0ludCIsInBrSXNHZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRCeVNlcXVlbmNlIiwiaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlIiwiYWxsUHJvcHMiLCJyZWxhdGlvbnMiLCJzY2FsYXJQcm9wcyIsInByb3AiLCJoYXMiLCJ2YWxpZGF0aW9uIiwiZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlIiwiaXNSZXF1aXJlZCIsIlZhbGlkYXRpb25LZXlzIiwiUkVRVUlSRUQiLCJ0eXBlSGludCIsImdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZSIsImFwaU9wdGlvbnMiLCJkZXNpZ25UeXBlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInJlbGF0aW9uIiwicmVsYXRpb25NZXRhIiwicmVsYXRpb25UeXBlIiwibWV0YSIsInZhbGlkYXRpb25Gb3IiLCJMSVNUIiwiaXNDaXJjdWxhciIsInBrVHlwZU5hbWUiLCJnZXRQa09wZW5BcGlUeXBlIiwiYWRkUmVsYXRpb25Qa1JlZiIsInJlbGF0aW9uRHRvIiwiYWRkIiwiYWRkUmVsYXRpb25VcGRhdGUiLCJhZGRSZWxhdGlvbiIsIkR0b0NsYXNzIiwiZXh0cmFNb2RlbHMiLCJkdG9SZWYiLCJvbmVPZkl0ZW1zIiwiJHJlZiIsIm9uZU9mIiwicGtUeXBlIiwiY3VycmVudCIsIkZ1bmN0aW9uIiwiZ2V0UHJvdG90eXBlT2YiLCJXZWFrTWFwIiwidG9Db250ZXh0RmxhZ3MiLCJhZGFwdGVyIiwiYWxpYXMiLCJiaW5kIiwicmVxdWVzdFRyYW5zZm9ybWVycyIsIkNvbnRleHQiLCJwZW5kaW5nIiwiaGVhZGVyIiwiTW9kZWxCdWlsZGVyIiwiZGVjb3JhdGVDbGFzcyIsIl9jbGFzc0RlY29yYXRvcnMiLCJfX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCIsIm9yaWdpbmFsQnVpbGQiLCJidWlsZCIsInJlc3VsdCIsImNhbGwiLCJkZWNvcmF0ZWQiLCJGcm9tTW9kZWxDb250cm9sbGVyIiwiZ2V0UGVyc2lzdGVuY2UiLCJNb2RlbENsYXp6IiwiZTIiLCJjcmVhdGVRdWVyeVJvdXRlc0Zyb21SZXBvc2l0b3J5IiwicHJlZml4IiwiUGVyc2lzdGVuY2VLZXlzIiwiUVVFUlkiLCJyZXBvIiwicXVlcnlNZXRob2RzIiwicm91dGVNZXRob2RzIiwiUXVlcnlDb250cm9sbGVyIiwiZW50cmllcyIsInNlZ21lbnQiLCJ0cmltIiwiam9pbiIsImNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIiLCJkZWZpbmVNZXRob2QiLCJodHRwRGVjb3JhdG9yIiwiaHR0cE1ldGhvZCIsImdldFF1ZXJ5RGVjb3JhdG9ycyIsIm9ialZhbHVlcyIsImZpZWxkcyIsImYiLCJjcmVhdGUiLCJtb2R1bGVDb25maWdPdmVycmlkZXMiLCJnbG9iYWxEZWZhdWx0cyIsInRhYmxlTmFtZSIsInRvS2ViYWJDYXNlIiwibW9kZWxDbGF6ek5hbWUiLCJmYWN0b3J5UGVyc2lzdGVuY2UiLCJkZWNvcmF0b3JDb25maWciLCJtb2R1bGVPdmVycmlkZSIsIm1lcmdlZENvbmZpZyIsIkZhY3RvcnlDb250cm9sbGVyIiwiTW9kZWxDb250cm9sbGVyRmFjdG9yeSIsImZhY3RvcnlSb3V0ZXMiLCJfX3JvdXRlc19fIiwiZ2V0UEsiLCJhcGlQcm9wZXJ0aWVzIiwicGtQYXRoIiwiZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsIiwiYXV0aENvbmZpZyIsImF1dGgiLCJhcHBseUNsYXNzQXV0aCIsInB1YmxpYyIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXIiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyXzEiLCJpbmZvIiwiQ29udHJvbGxlciIsIkFwaVRhZ3MiLCJBcGlFeHRyYU1vZGVscyIsInNvcnRlZFJvdXRlcyIsInNvcnQiLCJhIiwiYiIsImFTZWdtZW50cyIsIkJvb2xlYW4iLCJiU2VnbWVudHMiLCJhUGFyYW1Db3VudCIsInMiLCJiUGFyYW1Db3VudCIsImFMaXRlcmFsQ291bnQiLCJiTGl0ZXJhbENvdW50Iiwicm91dGUiLCJpbXBsZW1lbnRhdGlvbiIsInRvTG93ZXJDYXNlIiwicmVnaXN0cmF0aW9uIiwibWF0Y2hSb3V0ZSIsInJlZ2lzdGVyZWRNZXRob2ROYW1lIiwicGFyYW1EZWNvcmF0b3JzIiwiY29tcG9zZWQiLCJEQktleXMiLCJDT01QT1NFRCIsImNvbXBvc2VkS2V5cyIsInVuaXF1ZUtleXMiLCJzZXBhcmF0b3IiLCJyb3V0ZVBhcmFtRGVjb3JhdG9ycyIsInBhcmFtSW5kZXgiLCJmbGF0TWFwIiwiUGFyYW0iLCJtZXRob2REZWNvcmF0b3JzIiwibm9ybWFsaXplZFBhdGgiLCJjcmVhdGVSZWdpc3RyYXRpb24iLCJjcmVhdGVDcmVhdGVEZWNvcmF0b3JzIiwiUmVzcG9uc2UiLCJwYXNzdGhyb3VnaCIsImJ1bGtDcmVhdGVEZWNvcmF0b3JzIiwiYnVsa1JlYWREZWNvcmF0b3JzIiwiYnVsa1VwZGF0ZURlY29yYXRvcnMiLCJidWxrRGVsZXRlRGVjb3JhdG9ycyIsInJlYWREZWNvcmF0b3JzIiwicm91dGVQYXJhbXMiLCJ1cGRhdGVEZWNvcmF0b3JzIiwiZGVsZXRlRGVjb3JhdG9ycyIsImZhbGxiYWNrU2VnbWVudHMiLCJpc0FsbFBhcmFtcyIsImV2ZXJ5IiwiZmFsbGJhY2tBcGlQcm9wcyIsInN1ZmZpeCIsInN0YXRlbWVudERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyIsInN0YXRlbWVudFJvdXRlcyIsInN0YXRlbWVudEtleSIsInN0YXRlbWVudE1ldGhvZE5hbWUiLCJxdWVyeU1ldGhvZCIsImNvbXBsZXhRdWVyeVBhcmFtcyIsInBhdGhTZWdtZW50cyIsImtub3duUHJlZml4ZXMiLCJmaXJzdFNlZ21lbnQiLCJzZWdtZW50cyIsInNlZyIsImkiLCJjb21wbGV4UXVlcnkiLCJsb2dDdHgiLCJzcHJlYWRBcmdzIiwibm9ybWFsaXplUXVlcnlBcmdzIiwiZXh0cmFjdFF1ZXJ5QXJncyIsImxhc3QiLCJxdWVyeU9iaiIsInBvcCIsImhhc0RpcmVjdGlvbiIsImhhc0xpbWl0IiwiaGFzT2Zmc2V0IiwiZXh0cmFzIiwiaGFzUXVlcnlGaWVsZHMiLCJBcGlCb2R5IiwiQXBpQ3JlYXRlZFJlc3BvbnNlIiwic2NoZW1hIiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkFwaU5vdEZvdW5kUmVzcG9uc2UiLCJiYXNlIiwiZ2V0TW9kdWxlRm9yIiwiRGVjYWZNb2RlbE1vZHVsZSIsIkRlY2FmTW9kZWxNb2R1bGVfMSIsImNyZWF0ZU1vZGVsU2VydmljZXMiLCJtb2RlbHMiLCJ1c2VGYWN0b3J5IiwiaXNFeHBvc2VkIiwiZXhwb3N1cmUiLCJ0cmFja2VkTW9kZWxzIiwiY29udHJvbGxlckV4cG9zdXJlIiwibW9kZWxTZXJ2aWNlcyIsImF1dG9TZXJ2aWNlcyIsImFnZ3JlZ2F0aW9ucyIsImFsbG93R3JvdXBpbmdRdWVyaWVzIiwiY29udHJvbGxlcnMiLCJEZWNvcmF0aW9uIiwiSW5qZWN0YWJsZXNLZXlzIiwiSU5KRUNUQUJMRSIsImV4dGVuZCIsIm5lc3RJbmplY3RhYmxlIiwiY2F0ZWdvcnkiLCJjZmciLCJEZWZhdWx0SW5qZWN0YWJsZXNDb25maWciLCJzaW5nbGV0b24iLCJERUZBVUxUIiwiZHVyYWJsZSIsIklOSkVDVCIsIm5lc3RJbmplY3QiLCJpbm5lck5lc3RJbmplY3QiLCJNQVgiLCJtYXhEZWMiLCJtYXgiLCJtYXhpbXVtIiwiTUlOIiwibWluRGVjIiwibWluIiwibWluaW11bSIsIk1BWF9MRU5HVEgiLCJtYXhMZW5ndGhEZWMiLCJtYXhMZW5ndGgiLCJNSU5fTEVOR1RIIiwibWluTGVuZ3RoRGVjIiwibWluTGVuZ3RoIiwiVFlQRSIsInR5cGVEZWMiLCJEQVRFIiwiZGF0ZURlYyIsImZvcm1hdCIsIkVOVU0iLCJvcHRpb25EZWMiLCJQQVRURVJOIiwicGF0dGVybkRlYyIsInBhdCIsInBhdHRlcm4iLCJzb3VyY2UiLCJDT0xVTU4iLCJjb2x1bW5EZWMiLCJEZWNvcmF0aW9uS2V5cyIsIkRFU0NSSVBUSU9OIiwiZGVzY3JpcHRpb25EZWMiLCJBVVRIIiwiQ29yc0Vycm9yIiwiRm9yYmlkZGVuRXJyb3IiLCJtc2ciLCJUb01hbnlSZXF1ZXN0c0Vycm9yIiwiRGVjYWZFeGNlcHRpb25GaWx0ZXIiLCJleGNlcHRpb24iLCJob3N0IiwiaXNQcm9kdWN0aW9uIiwiTG9nZ2VkRW52aXJvbm1lbnQiLCJlbnYiLCJzdGF0dXNDb2RlIiwiTm90Rm91bmRFeGNlcHRpb24iLCJOb3RBY2NlcHRhYmxlRXhjZXB0aW9uIiwiZ2V0U3RhdHVzIiwic3RhdHVzIiwiY29kZSIsImpzb24iLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJDYXRjaCIsIlVzZURlY2FmRmlsdGVyIiwiVXNlRmlsdGVycyIsIlVzZURlY2FmSGVhZGVycyIsIlNXQUdHRVJfVUlfQ09OU1RBTlRTIiwidGl0bGUiLCJ2ZXJzaW9uIiwiZmF2aWNvbkZpbGVQYXRoIiwidG9wYmFySWNvbkZpbGVQYXRoIiwic2NoZW1lIiwiYmVhcmVyRm9ybWF0IiwiaW4iLCJwZXJzaXN0QXV0aG9yaXphdGlvbiIsInRvcGJhckJnQ29sb3IiLCJTd2FnZ2VyQ3VzdG9tVUkiLCJjdXN0b21DU1MiLCJjc3MiLCJ0b3BiYXJJY29uUGF0aCIsImltZyIsImI2NCIsImdldEN1c3RvbU9wdGlvbnMiLCJmYXZpY29uIiwiZmF2aWNvblBhdGgiLCJjdXN0b21TaXRlVGl0bGUiLCJjdXN0b21Dc3MiLCJzd2FnZ2VyT3B0aW9ucyIsImZpbGUiLCJmaWxlUGF0aCIsImFzc2V0c1BhdGgiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsIlN3YWdnZXJCdWlsZGVyIiwiYXBwIiwiY3JlYXRlRG9jdW1lbnQiLCJvcGVuQXBpSnNvblBhdGgiLCJvcGVuQXBpWWFtbFBhdGgiLCJEb2N1bWVudEJ1aWxkZXIiLCJzZXRUaXRsZSIsInNldERlc2NyaXB0aW9uIiwic2V0VmVyc2lvbiIsImFkZEJlYXJlckF1dGgiLCJTd2FnZ2VyTW9kdWxlIiwicmVnaXN0ZXJPcGVuQXBpUm91dGUiLCJjb250ZW50VHlwZSIsImJvZHlGYWN0b3J5IiwiaHR0cEFkYXB0ZXIiLCJnZXRIdHRwQWRhcHRlciIsIl9yZXEiLCJyZXBseSIsInNldHVwU3dhZ2dlciIsImRvY3VtZW50Iiwic3dhZ2dlclVJIiwic2V0dXAiLCJqc29uRG9jdW1lbnRVcmwiLCJ5YW1sRG9jdW1lbnRVcmwiLCJZQU1MIiwiTmVzdEJvb3RzdHJhcGVyIiwiX2xvZ2dlciIsIkxvZ2dlciIsImluaXRpYWxpemUiLCJlbmFibGVMb2dnZXIiLCJjdXN0b21Mb2dnZXIiLCJ1c2VMb2dnZXIiLCJlbmFibGVDb3JzIiwib3JpZ2lucyIsImFsbG93TWV0aG9kcyIsImFsbG93ZWRPcmlnaW5zIiwibyIsImNvcnNPcHRpb25zIiwib3JpZ2luIiwiY2FsbGJhY2siLCJjcmVkZW50aWFscyIsIm1ldGhvZHMiLCJ1c2VIZWxtZXQiLCJoZWxtZXQiLCJyZXF1aXJlIiwidXNlIiwid2FybiIsInN3YWdnZXIiLCJ1c2VHbG9iYWxQaXBlcyIsInBpcGVzIiwidXNlR2xvYmFsRmlsdGVycyIsImZpbHRlcnMiLCJ1c2VHbG9iYWxJbnRlcmNlcHRvcnMiLCJpbnRlcmNlcHRvcnMiLCJzdGFydCIsInBvcnQiLCJwcm9jZXNzIiwiUE9SVCIsImxpc3RlbiIsInRoZW4iLCJnZXRVcmwiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JfMSIsImV4ZWN1dG9yIiwiY29udGV4dHVhbGl6ZSIsImZsYWdzIiwiaXAiLCJleHRyYWN0SXAiLCJEZWZhdWx0QWRhcHRlckZsYWdzIiwib3BlcmF0aW9uIiwicGFyc2VJcEhlYWRlciIsImNhbmRpZGF0ZSIsInBlbmRpbmdQcm92aWRlcnMiLCJnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMiLCJyZWdpc3RlclByb3ZpZGVyIiwidG9rZW4iLCJpc01vZGVsQ29uc3RydWN0b3IiLCJtb2RlbFNlcnZpY2VUb2tlbiIsIm1vZGVsUmVwb3NpdG9yeVRva2VuIiwicGFyYW1ldGVySW5kZXgiLCJyZXNvbHZlZCIsInBhcmFtVHlwZXMiLCJhc01vZGVsIiwiaW5qZWN0YWJsZVNlcnZpY2VLZXkiLCJDb3JlU2VydmljZSIsIkNvcmVSZXBvc2l0b3J5IiwiRGVjYWZDb3JlTW9kdWxlIiwiRGVjYWZDb3JlTW9kdWxlXzEiLCJtb2R1bGVSZWYiLCJkZWNhZlByb3ZpZGVycyIsInVzZVZhbHVlIiwiY2xpZW50IiwiSCIsInByb3ZpZGVyIiwiYm9vdFBlcnNpc3RlbmNlIiwidHJpbW1lZCIsImNvbmYiLCJjb250ciIsInBvc3NpYmxlIiwiUGVyc2lzdGVuY2VTZXJ2aWNlIiwiYm9vdCIsImNsaWVudHMiLCJjIiwicG9zc2libGVUcmFuc2YiLCJyZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIiLCJpbml0aWFsaXphdGlvbiIsIm9uQXBwbGljYXRpb25TaHV0ZG93biIsImFkYXB0ZXJzIiwic2h1dGRvd24iLCJHbG9iYWwiLCJNb2R1bGVSZWYiLCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMiLCJub3JtYWxpemVFdmVudFJlc3BvbnNlIiwibW9kZWxDb25zdHIiLCJpZCIsInBheWxvYWQiLCJzZXJpYWxpemVkUGF5bG9hZCIsInNlcmlhbGl6ZSIsImNvbnNvbGUiLCJlcnIiLCJFdmVudHNDb250cm9sbGVyIiwiRXZlbnRzQ29udHJvbGxlcl8xIiwiZXZlbnRzJCIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsIm9ic2VydmVySWQiLCJNYXRoIiwicmFuZG9tIiwidG9VcHBlckNhc2UiLCJjYiIsInJlZnJlc2giLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQU8sTUFBTUEsb0JBQW9CO0lBQzFCLE1BQU1DLGFBQWE7UUFDeEJDLGVBQWUsR0FBR0Y7UUFDbEJHLGNBQWMsR0FBR0g7UUFDakJJLGNBQWMsR0FBR0o7UUFDakJLLGNBQWMsR0FBR0w7UUFDakJNLFVBQVUsR0FBR047UUFDYk8sZUFBZSxHQUFHUDtRQUNsQlEsZ0JBQWdCLEdBQUdSO1FBQ25CUyxhQUFhLEdBQUdUO1FBQ2hCVSxzQkFBc0IsR0FBR1Y7UUFDekJXLDRCQUE0QixHQUFHWDtRQUMvQlksY0FBYyxHQUFHWjtRQUNqQmEsc0JBQXNCLEdBQUdiO1FBQ3pCYyx3QkFBd0IsR0FBR2Q7UUFDM0JlLGtCQUFrQixHQUFHZjtRQUNyQmdCLGVBQWUsR0FBR2hCO1FBQ2xCaUIsWUFBWSxHQUFHakI7UUFDZmtCLG9CQUFvQixHQUFHbEI7UUFDdkJtQixVQUFVLEdBQUduQjs7SUNoQlIsTUFBTW9CLGdCQUFpQkMsT0FBc0JBLFFBQVE7SUFDckQsTUFBTUMsd0JBQXdCO0lBRTlCLE1BQU1DLGtCQUFrQjtJQUV6QixTQUFVQyxzQkFDZEMsU0FDQUMsV0FD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
|