@decaf-ts/db-decorators 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db-decorators.cjs +254 -110
- package/dist/db-decorators.esm.cjs +253 -112
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/overrides.js +15 -4
- package/lib/esm/model/validation.d.ts +27 -2
- package/lib/esm/model/validation.js +220 -99
- package/lib/esm/repository/Context.js +3 -2
- package/lib/esm/repository/Repository.js +7 -9
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/overrides.cjs +15 -4
- package/lib/model/validation.cjs +222 -98
- package/lib/model/validation.d.ts +27 -2
- package/lib/repository/Context.cjs +3 -2
- package/lib/repository/Repository.cjs +7 -9
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ModelKeys, validator, Validator, DEFAULT_ERROR_MESSAGES as DEFAULT_ERROR_MESSAGES$1, Validation, Hashing, propMetadata, sf, Decoration, date, required, type, ValidationKeys,
|
|
1
|
+
import { ModelKeys, validator, Validator, DEFAULT_ERROR_MESSAGES as DEFAULT_ERROR_MESSAGES$1, Validation, Hashing, propMetadata, sf, Decoration, date, required, type, ValidationKeys, Model, ModelErrorDefinition, getValidationDecorators, toConditionalPromise, validate } from '@decaf-ts/decorator-validation';
|
|
2
2
|
import { __decorate, __metadata } from 'tslib';
|
|
3
3
|
import { isEqual, apply, Reflection, metadata } from '@decaf-ts/reflection';
|
|
4
4
|
import { ObjectAccumulator } from 'typed-object-accumulator';
|
|
@@ -1281,8 +1281,9 @@ class Context {
|
|
|
1281
1281
|
args.push(last);
|
|
1282
1282
|
}
|
|
1283
1283
|
else {
|
|
1284
|
+
args.push(last);
|
|
1284
1285
|
c = (await getContext());
|
|
1285
|
-
args.push(
|
|
1286
|
+
args.push(c);
|
|
1286
1287
|
}
|
|
1287
1288
|
}
|
|
1288
1289
|
else {
|
|
@@ -1947,7 +1948,7 @@ class Repository extends BaseRepository {
|
|
|
1947
1948
|
const contextArgs = await Context.args(OperationKeys.CREATE, this.class, args);
|
|
1948
1949
|
model = new this.class(model);
|
|
1949
1950
|
await enforceDBDecorators(this, contextArgs.context, model, OperationKeys.CREATE, OperationKeys.ON);
|
|
1950
|
-
const errors = model.hasErrors();
|
|
1951
|
+
const errors = await Promise.resolve(model.hasErrors());
|
|
1951
1952
|
if (errors)
|
|
1952
1953
|
throw new ValidationError(errors.toString());
|
|
1953
1954
|
return [model, ...contextArgs.args];
|
|
@@ -1969,9 +1970,8 @@ class Repository extends BaseRepository {
|
|
|
1969
1970
|
await enforceDBDecorators(this, contextArgs.context, m, OperationKeys.CREATE, OperationKeys.ON);
|
|
1970
1971
|
return m;
|
|
1971
1972
|
}));
|
|
1972
|
-
const
|
|
1973
|
-
|
|
1974
|
-
.reduce((accum, e, i) => {
|
|
1973
|
+
const modelsValidation = await Promise.all(models.map((m) => Promise.resolve(m.hasErrors())));
|
|
1974
|
+
const errors = modelsValidation.reduce((accum, e, i) => {
|
|
1975
1975
|
if (e)
|
|
1976
1976
|
accum =
|
|
1977
1977
|
typeof accum === "string"
|
|
@@ -2003,7 +2003,7 @@ class Repository extends BaseRepository {
|
|
|
2003
2003
|
const oldModel = await this.read(pk);
|
|
2004
2004
|
model = this.merge(oldModel, model);
|
|
2005
2005
|
await enforceDBDecorators(this, contextArgs.context, model, OperationKeys.UPDATE, OperationKeys.ON, oldModel);
|
|
2006
|
-
const errors = model.hasErrors(oldModel);
|
|
2006
|
+
const errors = await Promise.resolve(model.hasErrors(oldModel));
|
|
2007
2007
|
if (errors)
|
|
2008
2008
|
throw new ValidationError(errors.toString());
|
|
2009
2009
|
return [model, ...contextArgs.args];
|
|
@@ -2031,9 +2031,8 @@ class Repository extends BaseRepository {
|
|
|
2031
2031
|
const oldModels = await this.readAll(ids, ...contextArgs.args);
|
|
2032
2032
|
models = models.map((m, i) => this.merge(oldModels[i], m));
|
|
2033
2033
|
await Promise.all(models.map((m, i) => enforceDBDecorators(this, contextArgs.context, m, OperationKeys.UPDATE, OperationKeys.ON, oldModels[i])));
|
|
2034
|
-
const
|
|
2035
|
-
|
|
2036
|
-
.reduce((accum, e, i) => {
|
|
2034
|
+
const modelsValidation = await Promise.all(models.map((m, i) => Promise.resolve(m.hasErrors(oldModels[i]))));
|
|
2035
|
+
const errors = modelsValidation.reduce((accum, e, i) => {
|
|
2037
2036
|
if (e)
|
|
2038
2037
|
accum =
|
|
2039
2038
|
typeof accum === "string"
|
|
@@ -2251,12 +2250,132 @@ function id() {
|
|
|
2251
2250
|
return apply(required(), readonly(), propMetadata(Repository.key(DBKeys.ID), {}));
|
|
2252
2251
|
}
|
|
2253
2252
|
|
|
2253
|
+
/**
|
|
2254
|
+
* @description
|
|
2255
|
+
* Retrieves validation decorator definitions from a model for update operations, including
|
|
2256
|
+
* support for special handling of list decorators.
|
|
2257
|
+
*
|
|
2258
|
+
* @summary
|
|
2259
|
+
* Iterates over the model's own enumerable properties and filters out those specified in the
|
|
2260
|
+
* `propsToIgnore` array. For each remaining property, retrieves validation decorators specific
|
|
2261
|
+
* to update operations using the `UpdateValidationKeys.REFLECT` key. Additionally, it explicitly
|
|
2262
|
+
* checks for and appends any `LIST` type decorators to ensure proper validation of collection types.
|
|
2263
|
+
*
|
|
2264
|
+
* @template M - A generic parameter extending the `Model` class, representing the model type being inspected.
|
|
2265
|
+
*
|
|
2266
|
+
* @param {M} model - The model instance whose properties are being inspected for update-related validations.
|
|
2267
|
+
* @param {string[]} propsToIgnore - A list of property names to exclude from the validation decorator retrieval process.
|
|
2268
|
+
*
|
|
2269
|
+
* @return {ValidationPropertyDecoratorDefinition[]} An array of validation decorator definitions, including both
|
|
2270
|
+
* update-specific and list-type decorators, excluding those for ignored properties.
|
|
2271
|
+
*
|
|
2272
|
+
* @function getValidatableUpdateProps
|
|
2273
|
+
*/
|
|
2274
|
+
function getValidatableUpdateProps(model, propsToIgnore) {
|
|
2275
|
+
const decoratedProperties = [];
|
|
2276
|
+
for (const prop in model) {
|
|
2277
|
+
if (Object.prototype.hasOwnProperty.call(model, prop) &&
|
|
2278
|
+
!propsToIgnore.includes(prop)) {
|
|
2279
|
+
const validationPropertyDefinition = getValidationDecorators(model, prop, UpdateValidationKeys.REFLECT);
|
|
2280
|
+
const listDecorator = getValidationDecorators(model, prop).decorators.find(({ key }) => key === ValidationKeys.LIST);
|
|
2281
|
+
if (listDecorator)
|
|
2282
|
+
validationPropertyDefinition.decorators.push(listDecorator);
|
|
2283
|
+
decoratedProperties.push(validationPropertyDefinition);
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
return decoratedProperties;
|
|
2287
|
+
}
|
|
2288
|
+
function validateDecorator(newModel, oldModel, prop, decorator, async) {
|
|
2289
|
+
const validator = Validation.get(decorator.key);
|
|
2290
|
+
if (!validator) {
|
|
2291
|
+
throw new Error(`Missing validator for ${decorator.key}`);
|
|
2292
|
+
}
|
|
2293
|
+
// Skip validators that aren't UpdateValidators
|
|
2294
|
+
if (!validator.updateHasErrors)
|
|
2295
|
+
return toConditionalPromise(undefined, async);
|
|
2296
|
+
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
2297
|
+
if (!async && decorator.props.async)
|
|
2298
|
+
return toConditionalPromise(undefined, async);
|
|
2299
|
+
const decoratorProps = Object.values(decorator.props) || {};
|
|
2300
|
+
// const context = PathProxyEngine.create(obj, {
|
|
2301
|
+
// ignoreUndefined: true,
|
|
2302
|
+
// ignoreNull: true,
|
|
2303
|
+
// });
|
|
2304
|
+
const maybeError = validator.updateHasErrors(newModel[prop], oldModel[prop], ...decoratorProps);
|
|
2305
|
+
return toConditionalPromise(maybeError, async);
|
|
2306
|
+
}
|
|
2307
|
+
function validateDecorators(newModel, oldModel, prop, decorators, async) {
|
|
2308
|
+
const result = {};
|
|
2309
|
+
for (const decorator of decorators) {
|
|
2310
|
+
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
2311
|
+
if (!async && decorator.props.async)
|
|
2312
|
+
continue;
|
|
2313
|
+
let validationErrors = validateDecorator(newModel, oldModel, prop, decorator, async);
|
|
2314
|
+
/*
|
|
2315
|
+
If the decorator is a list, each element must be checked.
|
|
2316
|
+
When 'async' is true, the 'err' will always be a pending promise initially,
|
|
2317
|
+
so the '!err' check will evaluate to false (even if the promise later resolves with no errors)
|
|
2318
|
+
*/
|
|
2319
|
+
if (decorator.key === ValidationKeys.LIST && (!validationErrors || async)) {
|
|
2320
|
+
const newPropValue = newModel[prop];
|
|
2321
|
+
const oldPropValue = oldModel[prop];
|
|
2322
|
+
const newValues = newPropValue instanceof Set ? [...newPropValue] : newPropValue;
|
|
2323
|
+
const oldValues = oldPropValue instanceof Set ? [...oldPropValue] : oldPropValue;
|
|
2324
|
+
if (newValues && newValues.length > 0) {
|
|
2325
|
+
const types = decorator.props.class ||
|
|
2326
|
+
decorator.props.clazz ||
|
|
2327
|
+
decorator.props.customTypes;
|
|
2328
|
+
const allowedTypes = [types].flat().map((t) => String(t).toLowerCase());
|
|
2329
|
+
const errs = newValues.map((childValue) => {
|
|
2330
|
+
// find by id so the list elements order doesn't matter
|
|
2331
|
+
const id = findModelId(childValue, true);
|
|
2332
|
+
if (!id)
|
|
2333
|
+
return "Failed to find model id";
|
|
2334
|
+
const oldModel = oldValues.find((el) => id === findModelId(el, true));
|
|
2335
|
+
if (Model.isModel(childValue)) {
|
|
2336
|
+
return childValue.hasErrors(oldModel);
|
|
2337
|
+
}
|
|
2338
|
+
return allowedTypes.includes(typeof childValue)
|
|
2339
|
+
? undefined
|
|
2340
|
+
: "Value has no validatable type";
|
|
2341
|
+
});
|
|
2342
|
+
if (async) {
|
|
2343
|
+
validationErrors = Promise.all(errs).then((result) => {
|
|
2344
|
+
const allEmpty = result.every((r) => !r);
|
|
2345
|
+
return allEmpty ? undefined : result;
|
|
2346
|
+
});
|
|
2347
|
+
}
|
|
2348
|
+
else {
|
|
2349
|
+
const allEmpty = errs.every((r) => !r);
|
|
2350
|
+
validationErrors = errs.length > 0 && !allEmpty ? errs : undefined;
|
|
2351
|
+
}
|
|
2352
|
+
}
|
|
2353
|
+
}
|
|
2354
|
+
if (validationErrors)
|
|
2355
|
+
result[decorator.key] = validationErrors;
|
|
2356
|
+
}
|
|
2357
|
+
if (!async)
|
|
2358
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
2359
|
+
const keys = Object.keys(result);
|
|
2360
|
+
const promises = Object.values(result);
|
|
2361
|
+
return Promise.all(promises).then((resolvedValues) => {
|
|
2362
|
+
const res = {};
|
|
2363
|
+
for (let i = 0; i < resolvedValues.length; i++) {
|
|
2364
|
+
const val = resolvedValues[i];
|
|
2365
|
+
if (val !== undefined) {
|
|
2366
|
+
res[keys[i]] = val;
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
return Object.keys(res).length > 0 ? res : undefined;
|
|
2370
|
+
});
|
|
2371
|
+
}
|
|
2254
2372
|
/**
|
|
2255
2373
|
* @description Validates changes between two model versions
|
|
2256
2374
|
* @summary Compares an old and new model version to validate update operations
|
|
2257
2375
|
* @template M - Type extending Model
|
|
2258
2376
|
* @param {M} oldModel - The original model version
|
|
2259
2377
|
* @param {M} newModel - The updated model version
|
|
2378
|
+
* @param {boolean} async - A flag indicating whether validation should be asynchronous.
|
|
2260
2379
|
* @param {...string[]} exceptions - Properties to exclude from validation
|
|
2261
2380
|
* @return {ModelErrorDefinition|undefined} Error definition if validation fails, undefined otherwise
|
|
2262
2381
|
* @function validateCompare
|
|
@@ -2281,113 +2400,114 @@ function id() {
|
|
|
2281
2400
|
* end
|
|
2282
2401
|
* validateCompare-->>Caller: validation errors or undefined
|
|
2283
2402
|
*/
|
|
2284
|
-
function validateCompare(oldModel, newModel, ...exceptions) {
|
|
2285
|
-
const decoratedProperties =
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
const { prop, decorators } = decoratedProperty;
|
|
2293
|
-
decorators.shift(); // remove the design:type decorator, since the type will already be checked
|
|
2294
|
-
if (!decorators || !decorators.length)
|
|
2403
|
+
function validateCompare(oldModel, newModel, async, ...exceptions) {
|
|
2404
|
+
const decoratedProperties = getValidatableUpdateProps(newModel, exceptions);
|
|
2405
|
+
const result = {};
|
|
2406
|
+
const nestedErrors = {};
|
|
2407
|
+
for (const { prop, decorators } of decoratedProperties) {
|
|
2408
|
+
const propKey = String(prop);
|
|
2409
|
+
let propValue = newModel[prop];
|
|
2410
|
+
if (!decorators?.length)
|
|
2295
2411
|
continue;
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2412
|
+
// Get the default type validator
|
|
2413
|
+
const designTypeDec = decorators.find((d) => [ModelKeys.TYPE, ValidationKeys.TYPE].includes(d.key));
|
|
2414
|
+
if (!designTypeDec)
|
|
2415
|
+
continue;
|
|
2416
|
+
const designType = designTypeDec.props.name;
|
|
2417
|
+
// Handle array or Set types and enforce the presence of @list decorator
|
|
2418
|
+
if ([Array.name, Set.name].includes(designType)) {
|
|
2419
|
+
const { decorators } = Reflection.getPropertyDecorators(ValidationKeys.REFLECT, newModel, propKey);
|
|
2420
|
+
if (!decorators.some((d) => d.key === ValidationKeys.LIST)) {
|
|
2421
|
+
result[propKey] = {
|
|
2422
|
+
[ValidationKeys.TYPE]: `Array or Set property '${propKey}' requires a @list decorator`,
|
|
2423
|
+
};
|
|
2301
2424
|
continue;
|
|
2302
2425
|
}
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2426
|
+
if (propValue &&
|
|
2427
|
+
!(Array.isArray(propValue) || propValue instanceof Set)) {
|
|
2428
|
+
result[propKey] = {
|
|
2429
|
+
[ValidationKeys.TYPE]: `Property '${String(prop)}' must be either an array or a Set`,
|
|
2430
|
+
};
|
|
2431
|
+
continue;
|
|
2432
|
+
}
|
|
2433
|
+
// Remove design:type decorator, since @list decorator already ensures type
|
|
2434
|
+
for (let i = decorators.length - 1; i >= 0; i--) {
|
|
2435
|
+
if (decorators[i].key === ModelKeys.TYPE) {
|
|
2436
|
+
decorators.splice(i, 1);
|
|
2437
|
+
}
|
|
2307
2438
|
}
|
|
2439
|
+
propValue = propValue instanceof Set ? [...propValue] : propValue;
|
|
2308
2440
|
}
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2441
|
+
const propErrors = validateDecorators(newModel, oldModel, propKey, decorators, async) || {};
|
|
2442
|
+
// Check for nested properties.
|
|
2443
|
+
// To prevent unnecessary processing, "propValue" must be defined and validatable
|
|
2444
|
+
const isConstr = Model.isPropertyModel(newModel, propKey);
|
|
2445
|
+
// if propValue !== undefined, null
|
|
2446
|
+
if (propValue && isConstr) {
|
|
2447
|
+
const instance = propValue;
|
|
2448
|
+
const isInvalidModel = typeof instance !== "object" ||
|
|
2449
|
+
!instance.hasErrors ||
|
|
2450
|
+
typeof instance.hasErrors !== "function";
|
|
2451
|
+
if (isInvalidModel) {
|
|
2452
|
+
// propErrors[ValidationKeys.TYPE] =
|
|
2453
|
+
// "Model should be validatable but it's not.";
|
|
2454
|
+
console.warn("Model should be validatable but it's not.");
|
|
2455
|
+
}
|
|
2456
|
+
else {
|
|
2457
|
+
nestedErrors[propKey] = instance.hasErrors(oldModel[prop]);
|
|
2458
|
+
}
|
|
2312
2459
|
}
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
const allDecorators = Reflection.getPropertyDecorators(ValidationKeys.REFLECT, newModel, prop).decorators;
|
|
2323
|
-
const decorators = Reflection.getPropertyDecorators(ValidationKeys.REFLECT, newModel, prop).decorators.filter((d) => [ModelKeys.TYPE, ValidationKeys.TYPE].indexOf(d.key) !== -1);
|
|
2324
|
-
if (!decorators || !decorators.length)
|
|
2325
|
-
continue;
|
|
2326
|
-
const dec = decorators.pop();
|
|
2327
|
-
const clazz = dec.props.name
|
|
2328
|
-
? [dec.props.name]
|
|
2329
|
-
: Array.isArray(dec.props.customTypes)
|
|
2330
|
-
? dec.props.customTypes
|
|
2331
|
-
: [dec.props.customTypes];
|
|
2332
|
-
const reserved = Object.values(ReservedModels).map((v) => v.toLowerCase());
|
|
2333
|
-
for (const c of clazz) {
|
|
2334
|
-
if (reserved.indexOf(c.toLowerCase()) === -1) {
|
|
2335
|
-
switch (c) {
|
|
2336
|
-
case Array.name:
|
|
2337
|
-
case Set.name:
|
|
2338
|
-
if (allDecorators.length) {
|
|
2339
|
-
const listDec = allDecorators.find((d) => d.key === ValidationKeys.LIST);
|
|
2340
|
-
if (listDec) {
|
|
2341
|
-
let currentList, oldList;
|
|
2342
|
-
switch (c) {
|
|
2343
|
-
case Array.name:
|
|
2344
|
-
currentList = newModel[prop];
|
|
2345
|
-
oldList = oldModel[prop];
|
|
2346
|
-
break;
|
|
2347
|
-
case Set.name:
|
|
2348
|
-
currentList = newModel[prop].values();
|
|
2349
|
-
oldList = oldModel[prop].values();
|
|
2350
|
-
break;
|
|
2351
|
-
default:
|
|
2352
|
-
throw new Error(`Invalid attribute type ${c}`);
|
|
2353
|
-
}
|
|
2354
|
-
err = currentList
|
|
2355
|
-
.map((v) => {
|
|
2356
|
-
const id = findModelId(v, true);
|
|
2357
|
-
if (!id)
|
|
2358
|
-
return "Failed to find model id";
|
|
2359
|
-
const oldModel = oldList.find((el) => id === findModelId(el, true));
|
|
2360
|
-
if (!oldModel)
|
|
2361
|
-
return; // nothing to compare with
|
|
2362
|
-
return v.hasErrors(oldModel);
|
|
2363
|
-
})
|
|
2364
|
-
.filter((e) => !!e);
|
|
2365
|
-
if (!err?.length) {
|
|
2366
|
-
// if the result is an empty list...
|
|
2367
|
-
err = undefined;
|
|
2368
|
-
}
|
|
2369
|
-
}
|
|
2370
|
-
}
|
|
2371
|
-
break;
|
|
2372
|
-
default:
|
|
2373
|
-
try {
|
|
2374
|
-
if (newModel[prop] &&
|
|
2375
|
-
oldModel[prop])
|
|
2376
|
-
err = newModel[prop].hasErrors(oldModel[prop]);
|
|
2377
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2378
|
-
}
|
|
2379
|
-
catch (e) {
|
|
2380
|
-
console.warn(sf("Model should be validatable but its not"));
|
|
2381
|
-
}
|
|
2460
|
+
// Add to the result if we have any errors
|
|
2461
|
+
// Async mode returns a Promise that resolves to undefined when no errors exist
|
|
2462
|
+
if (Object.keys(propErrors).length > 0 || async)
|
|
2463
|
+
result[propKey] = propErrors;
|
|
2464
|
+
// Then merge any nested errors
|
|
2465
|
+
if (!async) {
|
|
2466
|
+
Object.entries(nestedErrors[propKey] || {}).forEach(([key, error]) => {
|
|
2467
|
+
if (error !== undefined) {
|
|
2468
|
+
result[`${propKey}.${key}`] = error;
|
|
2382
2469
|
}
|
|
2470
|
+
});
|
|
2471
|
+
}
|
|
2472
|
+
}
|
|
2473
|
+
// Synchronous return
|
|
2474
|
+
if (!async) {
|
|
2475
|
+
return (Object.keys(result).length > 0
|
|
2476
|
+
? new ModelErrorDefinition(result)
|
|
2477
|
+
: undefined);
|
|
2478
|
+
}
|
|
2479
|
+
const merged = result; // TODO: apply filtering
|
|
2480
|
+
const keys = Object.keys(merged);
|
|
2481
|
+
const promises = Object.values(merged);
|
|
2482
|
+
return Promise.allSettled(promises).then(async (results) => {
|
|
2483
|
+
const result = {};
|
|
2484
|
+
for (const [parentProp, nestedErrPromise] of Object.entries(nestedErrors)) {
|
|
2485
|
+
const nestedPropDecErrors = (await nestedErrPromise);
|
|
2486
|
+
if (nestedPropDecErrors)
|
|
2487
|
+
Object.entries(nestedPropDecErrors).forEach(([nestedProp, nestedPropDecError]) => {
|
|
2488
|
+
if (nestedPropDecError !== undefined) {
|
|
2489
|
+
const nestedKey = [parentProp, nestedProp].join(".");
|
|
2490
|
+
result[nestedKey] = nestedPropDecError;
|
|
2491
|
+
}
|
|
2492
|
+
});
|
|
2493
|
+
}
|
|
2494
|
+
for (let i = 0; i < results.length; i++) {
|
|
2495
|
+
const key = keys[i];
|
|
2496
|
+
const res = results[i];
|
|
2497
|
+
if (res.status === "fulfilled" && res.value !== undefined) {
|
|
2498
|
+
result[key] = res.value;
|
|
2383
2499
|
}
|
|
2384
|
-
if (
|
|
2385
|
-
result =
|
|
2386
|
-
|
|
2500
|
+
else if (res.status === "rejected") {
|
|
2501
|
+
result[key] =
|
|
2502
|
+
res.reason instanceof Error
|
|
2503
|
+
? res.reason.message
|
|
2504
|
+
: String(res.reason || "Validation failed");
|
|
2387
2505
|
}
|
|
2388
2506
|
}
|
|
2389
|
-
|
|
2390
|
-
|
|
2507
|
+
return Object.keys(result).length > 0
|
|
2508
|
+
? new ModelErrorDefinition(result)
|
|
2509
|
+
: undefined;
|
|
2510
|
+
});
|
|
2391
2511
|
}
|
|
2392
2512
|
|
|
2393
2513
|
/**
|
|
@@ -2596,15 +2716,36 @@ function transient() {
|
|
|
2596
2716
|
};
|
|
2597
2717
|
}
|
|
2598
2718
|
|
|
2719
|
+
/**
|
|
2720
|
+
* @description Validates the model and checks for errors
|
|
2721
|
+
* @summary Validates the current model state and optionally compares with a previous version
|
|
2722
|
+
* @template M - Type extending Model
|
|
2723
|
+
* @param {M|any} [previousVersion] - Optional previous version of the model for comparison
|
|
2724
|
+
* @param {...any[]} exclusions - Properties to exclude from validation
|
|
2725
|
+
* @return {ModelErrorDefinition|undefined} Error definition if validation fails, undefined otherwise
|
|
2726
|
+
* @function hasErrors
|
|
2727
|
+
* @memberOf module:db-decorators
|
|
2728
|
+
*/
|
|
2729
|
+
// @ts-expect-error Overriding Model prototype method with dynamic conditional return type.
|
|
2599
2730
|
Model.prototype.hasErrors = function (previousVersion, ...exclusions) {
|
|
2600
2731
|
if (previousVersion && !(previousVersion instanceof Model)) {
|
|
2601
2732
|
exclusions.unshift(previousVersion);
|
|
2602
2733
|
previousVersion = undefined;
|
|
2603
2734
|
}
|
|
2604
|
-
const
|
|
2735
|
+
const async = this.isAsync();
|
|
2736
|
+
const errs = validate(this, async, ...exclusions);
|
|
2737
|
+
if (async) {
|
|
2738
|
+
return Promise.resolve(errs).then((resolvedErrs) => {
|
|
2739
|
+
if (resolvedErrs || !previousVersion) {
|
|
2740
|
+
return resolvedErrs;
|
|
2741
|
+
}
|
|
2742
|
+
return validateCompare(previousVersion, this, async, ...exclusions);
|
|
2743
|
+
});
|
|
2744
|
+
}
|
|
2605
2745
|
if (errs || !previousVersion)
|
|
2606
2746
|
return errs;
|
|
2607
|
-
|
|
2747
|
+
// @ts-expect-error Overriding Model prototype method with dynamic conditional return type.
|
|
2748
|
+
return validateCompare(previousVersion, this, async, ...exclusions);
|
|
2608
2749
|
};
|
|
2609
2750
|
|
|
2610
2751
|
/**
|
|
@@ -2686,7 +2827,7 @@ function modelToTransient(model) {
|
|
|
2686
2827
|
* @const VERSION
|
|
2687
2828
|
* @memberOf module:db-decorators
|
|
2688
2829
|
*/
|
|
2689
|
-
const VERSION = "0.6.
|
|
2830
|
+
const VERSION = "0.6.4";
|
|
2690
2831
|
|
|
2691
|
-
export { BaseError, BaseRepository, BulkCrudOperationKeys, ConflictError, Context, DBKeys, DBOperations, DEFAULT_ERROR_MESSAGES, DEFAULT_TIMESTAMP_FORMAT, DefaultContextFactory, DefaultRepositoryFlags, DefaultSeparator, InternalError, NotFoundError, OperationKeys, Operations, OperationsRegistry, ReadOnlyValidator, Repository, SerializationError, TimestampValidator, UpdateValidationKeys, UpdateValidator, VERSION, ValidationError, after, afterAny, afterCreate, afterCreateUpdate, afterDelete, afterRead, afterUpdate, composed, composedFromCreateUpdate, composedFromKeys, enforceDBDecorators, findModelId, findPrimaryKey, getAllPropertyDecoratorsRecursive, getDbDecorators, getHandlerArgs, hash, hashOnCreateUpdate, id, isTransient, modelToTransient, on, onAny, onCreate, onCreateUpdate, onDelete, onRead, onUpdate, operation, prefixMethod, readonly, serialize, serializeAfterAll, serializeOnCreateUpdate, suffixMethod, timestamp, timestampHandler, transient, validateCompare, version, versionCreateUpdate, wrapMethodWithContext };
|
|
2692
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGVjb3JhdG9ycy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvbW9kZWwvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9SZWFkT25seVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRvcnMvVGltZXN0YW1wVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9VcGRhdGVWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvT3BlcmF0aW9uc1JlZ2lzdHJ5LnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvT3BlcmF0aW9ucy50cyIsIi4uL3NyYy9vcGVyYXRpb25zL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9lcnJvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS91dGlscy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L0NvbnRleHQudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS93cmFwcGVycy50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L0Jhc2VSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL21vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGF0YWJhc2UgcmVmbGVjdGlvbiBrZXlzXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIGtleXMgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSBpbiBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAY29uc3QgREJLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERCS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9cGVyc2lzdGVuY2UuYCxcbiAgUkVQT1NJVE9SWTogXCJyZXBvc2l0b3J5XCIsXG4gIENMQVNTOiBcIl9jbGFzc1wiLFxuICBJRDogXCJpZFwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxuICBVTklRVUU6IFwidW5pcXVlXCIsXG4gIFNFUklBTElaRTogXCJzZXJpYWxpemVcIixcbiAgUkVBRE9OTFk6IFwicmVhZG9ubHlcIixcbiAgVElNRVNUQU1QOiBcInRpbWVzdGFtcFwiLFxuICBUUkFOU0lFTlQ6IFwidHJhbnNpZW50XCIsXG4gIEhBU0g6IFwiaGFzaFwiLFxuICBDT01QT1NFRDogXCJjb21wb3NlZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgT1JJR0lOQUw6IFwiX19vcmlnaW5hbE9ialwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBzZXBhcmF0b3IgY2hhcmFjdGVyIGZvciBjb21wb3NpdGUgaW5kZXhlc1xuICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGNoYXJhY3RlciB1c2VkIHdoZW4gY29uY2F0ZW5hdGluZyBtdWx0aXBsZSBmaWVsZHMgaW50byBhIHNpbmdsZSBpbmRleFxuICogQGNvbnN0IERlZmF1bHRTZXBhcmF0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcGFyYXRvciA9IFwiX1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZvcm1hdCBmb3IgdGltZXN0YW1wIGZpZWxkc1xuICogQHN1bW1hcnkgU3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHRpbWVzdGFtcCBmaWVsZHMgaW4gZGF0YWJhc2UgbW9kZWxzXG4gKiBAY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCA9IFwiZGQvTU0veXl5eSBISDptbTpzczpTXCI7XG4iLCJpbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyB1c2VkIGJ5IHZhbGlkYXRvcnMuXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgdmFyaW91cyB2YWxpZGF0aW9uIHNjZW5hcmlvcyBpbmNsdWRpbmcgSUQgdmFsaWRhdGlvbiwgcmVhZG9ubHkgcHJvcGVydGllcywgYW5kIHRpbWVzdGFtcHMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFcnJvck1lc3NhZ2VzXG4gKiBAcHJvcGVydHkge09iamVjdH0gSUQgLSBFcnJvciBtZXNzYWdlcyBmb3IgSUQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IElELklOVkFMSUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYW4gSUQgaXMgaW52YWxpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IElELlJFUVVJUkVEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGFuIElEIGlzIG1pc3NpbmdcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBSRUFET05MWSAtIEVycm9yIG1lc3NhZ2VzIGZvciByZWFkb25seSBwcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRE9OTFkuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHVwZGF0ZSBhIHJlYWRvbmx5IHByb3BlcnR5XG4gKiBAcHJvcGVydHkge09iamVjdH0gVElNRVNUQU1QIC0gRXJyb3IgbWVzc2FnZXMgZm9yIHRpbWVzdGFtcCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QLlJFUVVJUkVEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGEgdGltZXN0YW1wIGlzIG1pc3NpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuREFURSAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhIHRpbWVzdGFtcCBpcyBub3QgYSB2YWxpZCBkYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QLklOVkFMSUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYSB0aW1lc3RhbXAgaXMgbm90IGluY3JlYXNpbmdcbiAqIEBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgPSB7XG4gIElEOiB7XG4gICAgSU5WQUxJRDogXCJUaGlzIElkIGlzIGludmFsaWRcIixcbiAgICBSRVFVSVJFRDogXCJUaGUgSWQgaXMgbWFuZGF0b3J5XCIsXG4gIH0sXG4gIFJFQURPTkxZOiB7XG4gICAgSU5WQUxJRDogXCJUaGlzIGNhbm5vdCBiZSB1cGRhdGVkXCIsXG4gIH0sXG4gIFRJTUVTVEFNUDoge1xuICAgIFJFUVVJUkVEOiBcIlRpbWVzdGFtcCBpcyBNYW5kYXRvcnlcIixcbiAgICBEQVRFOiBcIlRoZSBUaW1lc3RhbXAgbXVzdCB0aGUgYSB2YWxpZCBkYXRlXCIsXG4gICAgSU5WQUxJRDogXCJUaGlzIHZhbHVlIG11c3QgYWx3YXlzIGluY3JlYXNlXCIsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgdXNlZCBmb3IgcmVmbGVjdGlvbi1iYXNlZCB2YWxpZGF0aW9uIGR1cmluZyB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEtleXMgdXNlZCBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWxpZGF0aW9uIG1ldGFkYXRhIG9uIG1vZGVsIHByb3BlcnRpZXMgZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbktleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIC0gQmFzZSByZWZsZWN0aW9uIGtleSBwcmVmaXggZm9yIHVwZGF0ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QIC0gS2V5IGZvciB0aW1lc3RhbXAgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFQURPTkxZIC0gS2V5IGZvciByZWFkb25seSBwcm9wZXJ0eSB2YWxpZGF0aW9uXG4gKiBAY29uc3QgVXBkYXRlVmFsaWRhdGlvbktleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVXBkYXRlVmFsaWRhdGlvbktleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiZGIudXBkYXRlLnZhbGlkYXRpb24uXCIsXG4gIFRJTUVTVEFNUDogREJLZXlzLlRJTUVTVEFNUCxcbiAgUkVBRE9OTFk6IERCS2V5cy5SRUFET05MWSxcbn07XG4iLCJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVhZG9ubHkgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZyB1cGRhdGVzLlxuICogQHN1bW1hcnkgVmFsaWRhdG9yIGZvciB0aGUge0BsaW5rIHJlYWRvbmx5fSBkZWNvcmF0b3IgdGhhdCBjaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGR1cmluZyBhbiB1cGRhdGUgb3BlcmF0aW9uLiBJdCBjb21wYXJlcyB0aGUgbmV3IHZhbHVlIHdpdGggdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgUmVhZE9ubHlWYWxpZGF0b3Igd2l0aCBhIHJlYWRvbmx5IHByb3BlcnR5XG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQHJlYWRvbmx5KClcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICogICAgIHRoaXMuaWQgPSBpZDtcbiAqICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoJzEyMycsICdKb2huJyk7XG4gKiB1c2VyLmlkID0gJzQ1Nic7IC8vIFdpbGwgYmUgcHJldmVudGVkIGJ5IFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFQURPTkxZKVxuZXhwb3J0IGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZCBkdXJpbmcgYW4gdXBkYXRlIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSB1c2luZyBkZWVwIGVxdWFsaXR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgbmV3IHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgb2xkVmFsdWUpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgdGltZXN0YW1wIHZhbHVlcyBhcmUgb25seSB1cGRhdGVkIHdpdGggbmV3ZXIgdGltZXN0YW1wcy5cbiAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgdXBkYXRlIG9mIGEgdGltZXN0YW1wIGJ5IGNvbXBhcmluZyB0aGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSBvbGQgb25lLCBlbnN1cmluZyB0aGUgbmV3IHRpbWVzdGFtcCBpcyBtb3JlIHJlY2VudC5cbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBUaW1lc3RhbXBWYWxpZGF0b3Igd2l0aCBhIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogY2xhc3MgRG9jdW1lbnQge1xuICogICBAdGltZXN0YW1wKClcbiAqICAgdXBkYXRlZEF0OiBEYXRlO1xuICogICBcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcpIHtcbiAqICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gKiAgICAgdGhpcy51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHdpdGggYW4gb2xkZXIgdGltZXN0YW1wXG4gKiBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQoJ015IERvY3VtZW50Jyk7XG4gKiBjb25zdCBvbGREYXRlID0gbmV3IERhdGUoMjAyMCwgMCwgMSk7XG4gKiBkb2MudXBkYXRlZEF0ID0gb2xkRGF0ZTsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgVGltZXN0YW1wVmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlRJTUVTVEFNUClcbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFsd2F5cyByZXR1cm5zIHVuZGVmaW5lZCBhcyB0aGlzIHZhbGlkYXRvciBvbmx5IHdvcmtzIGR1cmluZyB1cGRhdGVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGhhc0Vycm9ycyh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoYXQgYSB0aW1lc3RhbXAgaXMgbmV3ZXIgdGhhbiBpdHMgcHJldmlvdXMgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggYSBtb3JlIHJlY2VudCB2YWx1ZSBieSBjb252ZXJ0aW5nIGJvdGggdmFsdWVzIHRvIERhdGUgb2JqZWN0cyBhbmQgY29tcGFyaW5nIHRoZW0uXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscyAobmV3IHRpbWVzdGFtcCBpcyBub3QgbmV3ZXIpLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9sZFZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIG9sZFZhbHVlID0gbmV3IERhdGUob2xkVmFsdWUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA8PSBvbGRWYWx1ZSA/IG1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMgYXMgRGVjb3JhdG9yTWVzc2FnZXMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2YWxpZGF0b3JzIHRoYXQgY29tcGFyZSBuZXcgdmFsdWVzIHdpdGggb2xkIHZhbHVlcyBkdXJpbmcgdXBkYXRlcy5cbiAqIEBzdW1tYXJ5IEJhc2UgY2xhc3MgZm9yIGFuIFVwZGF0ZSB2YWxpZGF0b3IgdGhhdCBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW1wbGVtZW50aW5nIHZhbGlkYXRpb24gbG9naWMgdGhhdCBjb21wYXJlcyBhIG5ldyB2YWx1ZSB3aXRoIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBFcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgRGVjb3JhdG9yTWVzc2FnZXMjREVGQVVMVH1cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthY2NlcHRlZFR5cGVzXSAtIFRoZSBhY2NlcHRlZCB2YWx1ZSB0eXBlcyBieSB0aGUgZGVjb3JhdG9yXG4gKiBAY2xhc3MgVXBkYXRlVmFsaWRhdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXh0ZW5kaW5nIFVwZGF0ZVZhbGlkYXRvciB0byBjcmVhdGUgYSBjdXN0b20gdmFsaWRhdG9yXG4gKiBjbGFzcyBNeUN1c3RvbVZhbGlkYXRvciBleHRlbmRzIFVwZGF0ZVZhbGlkYXRvciB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwiQ3VzdG9tIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICogICB9XG4gKiAgIFxuICogICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKHZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIC8vIEN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljXG4gKiAgICAgaWYgKHZhbHVlID09PSBvbGRWYWx1ZSkge1xuICogICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogICBcbiAqICAgaGFzRXJyb3JzKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE5vdCB1c2VkIGZvciB1cGRhdGUgdmFsaWRhdG9yc1xuICogICB9XG4gKiB9XG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVXBkYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERlY29yYXRvck1lc3NhZ2VzLkRFRkFVTFQsXG4gICAgLi4uYWNjZXB0ZWRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgLi4uYWNjZXB0ZWRUeXBlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBwZXJmb3JtIHVwZGF0ZSB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB2YWx1ZSBieSBjb21wYXJpbmcgaXQgdG8gaXRzIG9sZCB2ZXJzaW9uIHRvIGRldGVybWluZSBpZiB0aGUgdXBkYXRlIGlzIHZhbGlkLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgbmV3IHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIG5lZWRlZCBmb3IgdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQge1xuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRvckRlZmluaXRpb24sXG4gIElWYWxpZGF0b3JSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciB1cGRhdGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIG1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zIGZvciB1cGRhdGUgdmFsaWRhdGlvbiBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSB1cGRhdGUgdmFsaWRhdGlvbiBwcmVmaXguXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wbGV0ZSBtZXRhZGF0YSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uXG4gKiBAZnVuY3Rpb24gdXBkYXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuVmFsaWRhdGlvbi51cGRhdGVLZXkgPSBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG59O1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGRlY2xhcmUgY2xhc3MgVmFsaWRhdGlvbiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk/O1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKTtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhY3RpbmcgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SVZhbGlkYXRvclJlZ2lzdHJ5fSB2YWxpZGF0b3JSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgUmVnaXN0cnlcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFZhbGlkYXRvcik6IFZhbGlkYXRvcn0gW21pZ3JhdGlvbkhhbmRsZXJdIHRoZSBtZXRob2QgdG8gbWFwIHRoZSB2YWxpZGF0b3IgaWYgcmVxdWlyZWQ7XG4gICAgICovXG4gICAgc3RhdGljIHNldFJlZ2lzdHJ5KFxuICAgICAgdmFsaWRhdG9yUmVnaXN0cnk6IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+LFxuICAgICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICAgKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIElWYWxpZGF0b3JSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRvclJlZ2lzdHJ5fVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAgICovXG4gICAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RbXSB8IFZhbGlkYXRvckRlZmluaXRpb25bXX0gdmFsaWRhdG9yXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIE1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zXG4gICAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICovXG4gICAgc3RhdGljIGtleShrZXk6IHN0cmluZyk6IHN0cmluZztcblxuICAgIHN0YXRpYyB1cGRhdGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERhdGFiYXNlIG9wZXJhdGlvbiBrZXkgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIENSVUQgb3BlcmF0aW9ucyBhbmQgdGhlaXIgbGlmZWN5Y2xlIHBoYXNlc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdGlvbktleXMge1xuICBSRUZMRUNUID0gXCJkZWNhZi5tb2RlbC5kYi5vcGVyYXRpb25zLlwiLFxuICBDUkVBVEUgPSBcImNyZWF0ZVwiLFxuICBSRUFEID0gXCJyZWFkXCIsXG4gIFVQREFURSA9IFwidXBkYXRlXCIsXG4gIERFTEVURSA9IFwiZGVsZXRlXCIsXG4gIE9OID0gXCJvbi5cIixcbiAgQUZURVIgPSBcImFmdGVyLlwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGZvciBiYXNpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFVuaW9uIHR5cGUgb2YgdGhlIGZvdXIgYmFzaWMgZGF0YWJhc2Ugb3BlcmF0aW9uczogY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZVxuICogQHR5cGVkZWYge3N0cmluZ30gQ3J1ZE9wZXJhdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDcnVkT3BlcmF0aW9ucyA9XG4gIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICB8IE9wZXJhdGlvbktleXMuREVMRVRFO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCdWxrIGRhdGFiYXNlIG9wZXJhdGlvbiBrZXkgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIGJ1bGsgQ1JVRCBvcGVyYXRpb25zIGZvciBoYW5kbGluZyBtdWx0aXBsZSByZWNvcmRzIGF0IG9uY2VcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZW51bSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMge1xuICBDUkVBVEVfQUxMID0gXCJjcmVhdGVBbGxcIixcbiAgUkVBRF9BTEwgPSBcInJlYWRBbGxcIixcbiAgVVBEQVRFX0FMTCA9IFwidXBkYXRlQWxsXCIsXG4gIERFTEVURV9BTEwgPSBcImRlbGV0ZUFsbFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGZvciBidWxrIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVW5pb24gdHlwZSBvZiB0aGUgZm91ciBidWxrIGRhdGFiYXNlIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIG11bHRpcGxlIHJlY29yZHMgYXQgb25jZVxuICogQHR5cGVkZWYge3N0cmluZ30gQnVsa0NydWRPcGVyYXRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQnVsa0NydWRPcGVyYXRpb25zID1cbiAgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTFxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTFxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdyb3VwZWQgQ1JVRCBvcGVyYXRpb25zIGZvciBkZWNvcmF0b3IgbWFwcGluZ1xuICogQHN1bW1hcnkgTWFwcyBvdXQgZ3JvdXBzIG9mIENSVUQgb3BlcmF0aW9ucyBmb3IgZWFzaWVyIG1hcHBpbmcgb2YgZGVjb3JhdG9yc1xuICogQGNvbnN0IERCT3BlcmF0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEQk9wZXJhdGlvbnM6IFJlY29yZDxzdHJpbmcsIENydWRPcGVyYXRpb25zW10+ID0ge1xuICBDUkVBVEU6IFtPcGVyYXRpb25LZXlzLkNSRUFURV0sXG4gIFJFQUQ6IFtPcGVyYXRpb25LZXlzLlJFQURdLFxuICBVUERBVEU6IFtPcGVyYXRpb25LZXlzLlVQREFURV0sXG4gIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFXSxcbiAgQ1JFQVRFX1VQREFURTogW09wZXJhdGlvbktleXMuQ1JFQVRFLCBPcGVyYXRpb25LZXlzLlVQREFURV0sXG4gIFJFQURfQ1JFQVRFOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLkNSRUFURV0sXG4gIEFMTDogW1xuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgXSxcbn07XG4iLCJpbXBvcnQgeyBPcGVyYXRpb25IYW5kbGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE9wZXJhdGlvbnMgfSBmcm9tIFwiLi9PcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgTWFuYWdlcyBhbmQgc3RvcmVzIG9wZXJhdGlvbiBoYW5kbGVycyBmb3IgZGlmZmVyZW50IG1vZGVsIHByb3BlcnRpZXMgYW5kIG9wZXJhdGlvbnNcbiAqIEBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnlcbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZVxuICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGVcbiAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHJlZ2lzdHJ5IGFuZCByZWdpc3RlciBhIGhhbmRsZXJcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE9wZXJhdGlvbnNSZWdpc3RyeSgpO1xuICogcmVnaXN0cnkucmVnaXN0ZXIobXlIYW5kbGVyLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdGFyZ2V0TW9kZWwsICdwcm9wZXJ0eU5hbWUnKTtcbiAqXG4gKiAvLyBHZXQgaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uXG4gKiBjb25zdCBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldCh0YXJnZXRNb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCAncHJvcGVydHlOYW1lJywgJ29uQ3JlYXRlJyk7XG4gKlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnkge1xuICogICAgIC1jYWNoZTogUmVjb3JkfnN0cmluZywgUmVjb3JkfnN0cmluZ3xzeW1ib2wsIFJlY29yZH5zdHJpbmcsIFJlY29yZH5zdHJpbmcsIE9wZXJhdGlvbkhhbmRsZXJ+fn5+XG4gKiAgICAgK2dldCh0YXJnZXQsIHByb3BLZXksIG9wZXJhdGlvbiwgYWNjdW0pXG4gKiAgICAgK3JlZ2lzdGVyKGhhbmRsZXIsIG9wZXJhdGlvbiwgdGFyZ2V0LCBwcm9wS2V5KVxuICogICB9XG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyB8IHN5bWJvbCxcbiAgICAgIFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+Pj5cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvcGVyYXRpb24gaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgRmluZHMgYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGZyb20gcGFyZW50IGNsYXNzZXNcbiAgICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAgICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFncyBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gICAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBjbGFzcyBuYW1lIG9yIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXJbXX0gW2FjY3VtXSAtIEFjY3VtdWxhdG9yIGZvciByZWN1cnNpdmUgY2FsbHNcbiAgICogQHJldHVybiB7T3BlcmF0aW9uSGFuZGxlcltdIHwgdW5kZWZpbmVkfSBBcnJheSBvZiBoYW5kbGVycyBvciB1bmRlZmluZWQgaWYgbm9uZSBmb3VuZFxuICAgKi9cbiAgZ2V0PFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgVixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIHRhcmdldDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwcm9wS2V5OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgYWNjdW0/OiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W11cbiAgKTogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPltdIHwgdW5kZWZpbmVkIHtcbiAgICBhY2N1bSA9IGFjY3VtIHx8IFtdO1xuICAgIGxldCBuYW1lO1xuICAgIHRyeSB7XG4gICAgICBuYW1lID0gdHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIiA/IHRhcmdldCA6IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgYWNjdW0udW5zaGlmdChcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0gfHwgW10pXG4gICAgICApO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0YXJnZXQgPT09IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH1cblxuICAgIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKSBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXQ8TSwgUiwgViwgRiwgQz4ocHJvdG8sIHByb3BLZXksIG9wZXJhdGlvbiwgYWNjdW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgU3RvcmVzIGEgaGFuZGxlciBpbiB0aGUgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyfSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHBhcmFtIHtNfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlZ2lzdGVyPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgVixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz4sXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wS2V5OiBzdHJpbmcgfCBzeW1ib2xcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGNvbnN0IGhhbmRsZXJOYW1lID0gT3BlcmF0aW9ucy5nZXRIYW5kbGVyTmFtZShoYW5kbGVyKTtcblxuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXSkgdGhpcy5jYWNoZVtuYW1lXSA9IHt9O1xuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XSkgdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XSA9IHt9O1xuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dID0ge307XG4gICAgaWYgKHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXVtoYW5kbGVyTmFtZV0pIHJldHVybjtcbiAgICB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl1baGFuZGxlck5hbWVdID0gaGFuZGxlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSGFzaGluZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25IYW5kbGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbnNSZWdpc3RyeSB9IGZyb20gXCIuL09wZXJhdGlvbnNSZWdpc3RyeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uIG1hbmFnZW1lbnRcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHJlZ2lzdGVyaW5nLCByZXRyaWV2aW5nLCBhbmQgbWFuYWdpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAY2xhc3MgT3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlXG4gKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZVxuICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlXG4gKiBAZXhhbXBsZVxuICogLy8gUmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBhIGNyZWF0ZSBvcGVyYXRpb25cbiAqIE9wZXJhdGlvbnMucmVnaXN0ZXIobXlIYW5kbGVyLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdGFyZ2V0TW9kZWwsICdwcm9wZXJ0eU5hbWUnKTtcbiAqIFxuICogLy8gR2V0IGhhbmRsZXJzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvblxuICogY29uc3QgaGFuZGxlcnMgPSBPcGVyYXRpb25zLmdldCh0YXJnZXRNb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCAncHJvcGVydHlOYW1lJywgJ29uQ3JlYXRlJyk7XG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgT3BlcmF0aW9ucyB7XG4gKiAgICAgLXJlZ2lzdHJ5OiBPcGVyYXRpb25zUmVnaXN0cnlcbiAqICAgICArZ2V0SGFuZGxlck5hbWUoaGFuZGxlcilcbiAqICAgICAra2V5KHN0cilcbiAqICAgICArZ2V0KHRhcmdldE5hbWUsIHByb3BLZXksIG9wZXJhdGlvbilcbiAqICAgICAtZ2V0T3BSZWdpc3RyeSgpXG4gKiAgICAgK3JlZ2lzdGVyKGhhbmRsZXIsIG9wZXJhdGlvbiwgdGFyZ2V0LCBwcm9wS2V5KVxuICogICB9XG4gKiAgIE9wZXJhdGlvbnMgLS0+IE9wZXJhdGlvbnNSZWdpc3RyeSA6IHVzZXNcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbnMge1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RyeTogT3BlcmF0aW9uc1JlZ2lzdHJ5O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHVuaXF1ZSBuYW1lIGZvciBhbiBvcGVyYXRpb24gaGFuZGxlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIG9yIGdlbmVyYXRlcyBhIGhhc2ggaWYgbmFtZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBnZXQgdGhlIG5hbWUgZm9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgb3IgYSBnZW5lcmF0ZWQgaGFzaFxuICAgKi9cbiAgc3RhdGljIGdldEhhbmRsZXJOYW1lKGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKGhhbmRsZXIubmFtZSkgcmV0dXJuIGhhbmRsZXIubmFtZTtcblxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiSGFuZGxlciBuYW1lIG5vdCBkZWZpbmVkLiBBIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQsIGJ1dCB0aGlzIGlzIG5vdCBkZXNpcmFibGUuIHBsZWFzZSBhdm9pZCB1c2luZyBhbm9ueW1vdXMgZnVuY3Rpb25zXCJcbiAgICApO1xuICAgIHJldHVybiBIYXNoaW5nLmhhc2goaGFuZGxlci50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXkgYnkgcHJlZml4aW5nIHdpdGggdGhlIHJlZmxlY3Rpb24gbmFtZXNwYWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgb3BlcmF0aW9uIGtleSBzdHJpbmcgdG8gcHJlZml4XG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5SRUZMRUNUICsgc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3BlcmF0aW9uIGhhbmRsZXJzIGZvciBhIHNwZWNpZmljIHRhcmdldCBhbmQgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdldHMgcmVnaXN0ZXJlZCBoYW5kbGVycyBmcm9tIHRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5IGZvciBhIGdpdmVuIHRhcmdldCwgcHJvcGVydHksIGFuZCBvcGVyYXRpb25cbiAgICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAgICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlLCBkZWZhdWx0cyB0byBvYmplY3RcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXROYW1lIC0gVGhlIHRhcmdldCBjbGFzcyBuYW1lIG9yIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCwgcHJvcGVydHksIGFuZCBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWID0gb2JqZWN0LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+KFxuICAgIHRhcmdldE5hbWU6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcHJvcEtleTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBPcGVyYXRpb25zLnJlZ2lzdHJ5LmdldDxNLCBSLCBWLCBGLCBDPihcbiAgICAgIHRhcmdldE5hbWUsXG4gICAgICBwcm9wS2V5LFxuICAgICAgb3BlcmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBpbml0aWFsaXplcyB0aGUgb3BlcmF0aW9ucyByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyByZWdpc3RyeSBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqIEByZXR1cm4ge09wZXJhdGlvbnNSZWdpc3RyeX0gVGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE9wUmVnaXN0cnkoKSB7XG4gICAgaWYgKCFPcGVyYXRpb25zLnJlZ2lzdHJ5KSBPcGVyYXRpb25zLnJlZ2lzdHJ5ID0gbmV3IE9wZXJhdGlvbnNSZWdpc3RyeSgpO1xuICAgIHJldHVybiBPcGVyYXRpb25zLnJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBhIGhhbmRsZXIgdG8gdGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgViAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcGFyYW0ge1Z9IHRhcmdldCAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFYgZXh0ZW5kcyBNb2RlbD4oXG4gICAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxWLCBhbnksIGFueT4sXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIHRhcmdldDogVixcbiAgICBwcm9wS2V5OiBzdHJpbmcgfCBzeW1ib2xcbiAgKSB7XG4gICAgT3BlcmF0aW9ucy5nZXRPcFJlZ2lzdHJ5KCkucmVnaXN0ZXIoXG4gICAgICBoYW5kbGVyIGFzIGFueSxcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BLZXlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJZE9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcixcbiAgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVybmFsIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiBrZXkgb24gYSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3AgLSBUaGUgb3BlcmF0aW9uIGtleSB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyXG4gKiBAZnVuY3Rpb24gaGFuZGxlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5mdW5jdGlvbiBoYW5kbGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBPcGVyYXRpb25zLnJlZ2lzdGVyKGhhbmRsZXIsIG9wLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGVVcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6XG4gICAgfCBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PlxuICAgIHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuVVBEQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvbkNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQ3JlYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkNSRUFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcmVhZCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgcmVhZCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7SWRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uUmVhZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uUmVhZDxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogSWRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLlJFQUQsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uRGVsZXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25EZWxldGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuREVMRVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBhbGwgb3BlcmF0aW9uIHR5cGVzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25BbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5BTEwsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGRlY29yYXRvciBmb3IgaGFuZGxpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIHNwZWNpZmllZCBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdIHwgREJPcGVyYXRpb25zfSBbb3A9REJPcGVyYXRpb25zLkFMTF0gLSBPbmUgb3IgbW9yZSBvcGVyYXRpb24gdHlwZXMgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2FnZTpcbiAqIGNsYXNzIE15TW9kZWwge1xuICogICBAb24oREJPcGVyYXRpb25zLkNSRUFURSwgbXlIYW5kbGVyKVxuICogICBteVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbjxWID0gb2JqZWN0PihcbiAgb3A6IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb3BlcmF0aW9uKE9wZXJhdGlvbktleXMuT04sIG9wLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgYW5kIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+IHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJDcmVhdGVVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjpcbiAgICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7VXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQ3JlYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LXJlYWQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgcmVhZCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclJlYWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlYWQ8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuUkVBRCwgaGFuZGxlciwgZGF0YSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckRlbGV0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyRGVsZXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkRFTEVURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1vcGVyYXRpb24gZm9yIGFsbCBvcGVyYXRpb24gdHlwZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGFueSBkYXRhYmFzZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyQW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJBbnk8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBkZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3Qtb3BlcmF0aW9uIGJlaGF2aW9yc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2FnZTpcbiAqIGNsYXNzIE15TW9kZWwge1xuICogICBAYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURSwgbXlIYW5kbGVyKVxuICogICBteVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcjxWID0gb2JqZWN0PihcbiAgb3A6IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb3BlcmF0aW9uKE9wZXJhdGlvbktleXMuQUZURVIsIG9wLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBkZWNvcmF0b3IgZmFjdG9yeSBmb3Igb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGRlY29yYXRvcnMgdGhhdCByZWdpc3RlciBoYW5kbGVycyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMuT04gfCBPcGVyYXRpb25LZXlzLkFGVEVSfSBiYXNlT3AgLSBXaGV0aGVyIHRoZSBoYW5kbGVyIHJ1bnMgZHVyaW5nIG9yIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdfSBbb3BlcmF0aW9uPURCT3BlcmF0aW9ucy5BTExdIC0gVGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwYXJhbSB7Vn0gW2RhdGFUb0FkZF0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb3BlcmF0aW9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yIGFzIEBvcGVyYXRpb25cbiAqICAgcGFydGljaXBhbnQgT3BlcmF0aW9ucyBhcyBPcGVyYXRpb25zIFJlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IEhhbmRsZXJcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+T3BlcmF0aW9uczogUmVnaXN0ZXIgaGFuZGxlclxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIG1ldGFkYXRhXG4gKlxuICogICBOb3RlIG92ZXIgQ2xpZW50LEhhbmRsZXI6IExhdGVyLCBkdXJpbmcgb3BlcmF0aW9uIGV4ZWN1dGlvblxuICogICBDbGllbnQtPj5PcGVyYXRpb25zOiBFeGVjdXRlIG9wZXJhdGlvblxuICogICBPcGVyYXRpb25zLT4+SGFuZGxlcjogQ2FsbCByZWdpc3RlcmVkIGhhbmRsZXJcbiAqICAgSGFuZGxlci0tPj5PcGVyYXRpb25zOiBSZXR1cm4gcmVzdWx0XG4gKiAgIE9wZXJhdGlvbnMtLT4+Q2xpZW50OiBSZXR1cm4gZmluYWwgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248ViA9IG9iamVjdD4oXG4gIGJhc2VPcDogT3BlcmF0aW9uS2V5cy5PTiB8IE9wZXJhdGlvbktleXMuQUZURVIsXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhVG9BZGQ/OiBWXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IG9wZXJhdGlvbi5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgb3ApID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvdW5kS2V5ID0gYmFzZU9wICsgb3A7XG4gICAgICBsZXQgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wLFxuICAgICAgICAgIGhhbmRsZXJzOiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlcktleSA9IE9wZXJhdGlvbnMuZ2V0SGFuZGxlck5hbWUoaGFuZGxlcik7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV0gfHxcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8XG4gICAgICAgICEoaGFuZGxlcktleSBpbiBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdID0gZGF0YS5oYW5kbGVyc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gPVxuICAgICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8IHt9O1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XVtoYW5kbGVyS2V5XSA9IHtcbiAgICAgICAgICBkYXRhOiBkYXRhVG9BZGQsXG4gICAgICAgIH07XG5cbiAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICBoYW5kbGUoY29tcG91bmRLZXkgYXMgT3BlcmF0aW9uS2V5cywgaGFuZGxlciksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhlIHJlcG9zaXRvcnkgbW9kdWxlXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBiYXNlIGVycm9yIGNsYXNzIHRoYXQgYWxsIG90aGVyIGVycm9yIHR5cGVzIGV4dGVuZCBmcm9tLiBQcm92aWRlcyBjb21tb24gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVycm9yXG4gKiBAY2xhc3MgQmFzZUVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHlcbiAqIC8vIEluc3RlYWQsIHVzZSBvbmUgb2YgdGhlIGNvbmNyZXRlIGVycm9yIGNsYXNzZXM6XG4gKiB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgcHJvdmlkZWQnKTtcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgbXNnOiBzdHJpbmcgfCBFcnJvciwgY29kZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1zZyBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIG1zZztcbiAgICBjb25zdCBtZXNzYWdlID0gYFske25hbWV9XSAke21zZyBpbnN0YW5jZW9mIEVycm9yID8gbXNnLm1lc3NhZ2UgOiBtc2d9YDtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIGlmIChtc2cgaW5zdGFuY2VvZiBFcnJvcikgdGhpcy5zdGFjayA9IG1zZy5zdGFjaztcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiB0aGUgTW9kZWwgZGV0YWlscywgdHlwaWNhbGx5IHRocm93biB3aGVuIGRhdGEgdmFsaWRhdGlvbiBmYWlsc1xuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7VmFsaWRhdGlvbkVycm9yfSBBIG5ldyBWYWxpZGF0aW9uRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBWYWxpZGF0aW9uRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIHZhbGlkYXRpb24gZXJyb3Igd2hlbiBkYXRhIGlzIGludmFsaWRcbiAqIGlmICghaXNWYWxpZChkYXRhKSkge1xuICogICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgZm9ybWF0Jyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoVmFsaWRhdGlvbkVycm9yLm5hbWUsIG1zZywgNDIyKTtcbiAgfVxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGZvciBpbnRlcm5hbCBzeXN0ZW0gZmFpbHVyZXNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gaW50ZXJuYWwgZmFpbHVyZSAoc2hvdWxkIG1lYW4gYW4gZXJyb3IgaW4gY29kZSkgd2l0aCBIVFRQIDUwMCBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7SW50ZXJuYWxFcnJvcn0gQSBuZXcgSW50ZXJuYWxFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIEludGVybmFsRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhbiBpbnRlcm5hbCBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIG9jY3Vyc1xuICogdHJ5IHtcbiAqICAgLy8gU29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdVbmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkJyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEludGVybmFsRXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBzZXJpYWxpemF0aW9uIG9yIGRlc2VyaWFsaXphdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gdGhlIE1vZGVsIGRlL3NlcmlhbGl6YXRpb24sIHR5cGljYWxseSB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiBkYXRhIGZvcm1hdHNcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge1NlcmlhbGl6YXRpb25FcnJvcn0gQSBuZXcgU2VyaWFsaXphdGlvbkVycm9yIGluc3RhbmNlXG4gKiBAY2xhc3MgU2VyaWFsaXphdGlvbkVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yIHdoZW4gSlNPTiBwYXJzaW5nIGZhaWxzXG4gKiB0cnkge1xuICogICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnZhbGlkSnNvbik7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTiBkYXRhJyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUsIG1zZywgNDIyKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgZm91bmRcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGZpbmRpbmcgYSBtb2RlbCwgcmVzdWx0aW5nIGluIGEgNDA0IEhUVFAgc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge05vdEZvdW5kRXJyb3J9IEEgbmV3IE5vdEZvdW5kRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBOb3RGb3VuZEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBub3QgZm91bmQgZXJyb3Igd2hlbiBhIHJlY29yZCBkb2Vzbid0IGV4aXN0XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kQnlJZChpZCk7XG4gKiBpZiAoIXVzZXIpIHtcbiAqICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFVzZXIgd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90Rm91bmRFcnJvci5uYW1lLCBtc2csIDQwNCk7XG4gIH1cbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgY29uZmxpY3Qgb2NjdXJzIGluIHRoZSBzdG9yYWdlXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgY29uZmxpY3QgaW4gdGhlIHN0b3JhZ2UsIHR5cGljYWxseSB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge0NvbmZsaWN0RXJyb3J9IEEgbmV3IENvbmZsaWN0RXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBDb25mbGljdEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBjb25mbGljdCBlcnJvciB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVjb3JkXG4gKiBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRCeUVtYWlsKGVtYWlsKTtcbiAqIGlmIChleGlzdGluZ1VzZXIpIHtcbiAqICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYFVzZXIgd2l0aCBlbWFpbCAke2VtYWlsfSBhbHJlYWR5IGV4aXN0c2ApO1xuICogfVxuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihDb25mbGljdEVycm9yLm5hbWUsIG1zZywgNDA5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIsIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy90eXBlc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy5cbiAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgY29udGV4dCBhbmQgYXJndW1lbnRzIGJldHdlZW4gcmVwb3NpdG9yeSBtZXRob2RzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyAtIFRoZSBvcGVyYXRpb24gYXJndW1lbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEFyZ3M8XG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSB7XG4gIGNvbnRleHQ6IEM7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSB7YW55fSBkZWMgdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgdGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7e319IG0gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge3t9fSBbYWNjdW1dIGFjY3VtdWxhdG9yIHVzZWQgZm9yIGludGVybmFsIHJlY3Vyc2l2ZW5lc3NcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0SGFuZGxlckFyZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYW5kbGVyQXJncyA9IGZ1bmN0aW9uIChcbiAgZGVjOiBhbnksXG4gIHByb3A6IHN0cmluZyxcbiAgbTogQ29uc3RydWN0b3I8YW55PixcbiAgYWNjdW0/OiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+XG4pOiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+IHwgdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmICghbmFtZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIG1vZGVsIGNsYXNzXCIpO1xuICBhY2N1bSA9IGFjY3VtIHx8IHt9O1xuXG4gIGlmIChkZWMucHJvcHMuaGFuZGxlcnNbbmFtZV0gJiYgZGVjLnByb3BzLmhhbmRsZXJzW25hbWVdW3Byb3BdKVxuICAgIGFjY3VtID0geyAuLi5kZWMucHJvcHMuaGFuZGxlcnNbbmFtZV1bcHJvcF0sIC4uLmFjY3VtIH07XG5cbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG0pO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bTtcbiAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICByZXR1cm4gZ2V0SGFuZGxlckFyZ3MoZGVjLCBwcm9wLCBwcm90bywgYWNjdW0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJUmVwb3NpdG9yeTxUPn0gcmVwb1xuICogQHBhcmFtIGNvbnRleHRcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSBvcGVyYXRpb25cbiAqIEBwYXJhbSBwcmVmaXhcbiAqXG4gKiBAcGFyYW0gb2xkTW9kZWxcbiAqIEBmdW5jdGlvbiBlbmZvcmNlREJQcm9wZXJ0eURlY29yYXRvcnNBc3luY1xuICpcbiAqIEBtZW1iZXJPZiBkYi1kZWNvcmF0b3JzLnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlREJEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPihcbiAgcmVwbzogUixcbiAgY29udGV4dDogQyxcbiAgbW9kZWw6IE0sXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgb2xkTW9kZWw/OiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQgPVxuICAgIGdldERiRGVjb3JhdG9ycyhtb2RlbCwgb3BlcmF0aW9uLCBwcmVmaXgpO1xuXG4gIGlmICghZGVjb3JhdG9ycykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBkZWNvcmF0b3JzKSB7XG4gICAgY29uc3QgZGVjczogRGVjb3JhdG9yTWV0YWRhdGFbXSA9IGRlY29yYXRvcnNbcHJvcF07XG4gICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgY29uc3QgeyBrZXkgfSA9IGRlYztcbiAgICAgIGNvbnN0IGhhbmRsZXJzOiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W10gfCB1bmRlZmluZWQgPVxuICAgICAgICBPcGVyYXRpb25zLmdldDxNLCBSLCBWLCBGLCBDPihtb2RlbCwgcHJvcCwgcHJlZml4ICsga2V5KTtcbiAgICAgIGlmICghaGFuZGxlcnMgfHwgIWhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgdGhlIG9wZXJhdGlvbiAke3ByZWZpeCArIGtleX0gdW5kZXIgcHJvcGVydHkgJHtwcm9wfWBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgaGFuZGxlckFyZ3MgPSBnZXRIYW5kbGVyQXJncyhkZWMsIHByb3AsIG1vZGVsIGFzIGFueSk7XG5cbiAgICAgIGlmICghaGFuZGxlckFyZ3MgfHwgT2JqZWN0LnZhbHVlcyhoYW5kbGVyQXJncykubGVuZ3RoICE9PSBoYW5kbGVycy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQXJncyBhbmQgaGFuZGxlcnMgbGVuZ3RoIGRvIG5vdCBtYXRjaFwiKTtcblxuICAgICAgbGV0IGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz47XG4gICAgICBsZXQgZGF0YTogYW55O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVyID0gaGFuZGxlcnNbaV07XG4gICAgICAgIGRhdGEgPSBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKVtpXTtcblxuICAgICAgICBjb25zdCBhcmdzOiBhbnlbXSA9IFtjb250ZXh0LCBkYXRhLmRhdGEsIHByb3AsIG1vZGVsXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURSAmJiBwcmVmaXggPT09IE9wZXJhdGlvbktleXMuT04pIHtcbiAgICAgICAgICBpZiAoIW9sZE1vZGVsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIG9sZCBtb2RlbCBmb3IgdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgICAgICBhcmdzLnB1c2gob2xkTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgKGhhbmRsZXIgYXMgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPikuYXBwbHkoXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYXJncyBhcyBbQywgViwga2V5b2YgTSwgTSwgTV1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYEZhaWxlZCB0byBleGVjdXRlIGhhbmRsZXIgJHtoYW5kbGVyLm5hbWV9IGZvciAke3Byb3B9IG9uICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gZHVlIHRvIGVycm9yOiAke2V9YDtcbiAgICAgICAgICBpZiAoY29udGV4dC5nZXQoXCJicmVha09uSGFuZGxlckVycm9yXCIpKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtc2cpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTcGVjaWZpYyBmb3IgREIgRGVjb3JhdG9yc1xuICogQHBhcmFtIHtUfSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiBDUlVEIHtAbGluayBPcGVyYXRpb25LZXlzfVxuICogQHBhcmFtIHtzdHJpbmd9IFtleHRyYVByZWZpeF1cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0RGJQcm9wZXJ0eURlY29yYXRvcnNcbiAqXG4gKiBAbWVtYmVyT2YgZGItZGVjb3JhdG9ycy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGJEZWNvcmF0b3JzPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBULFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgZXh0cmFQcmVmaXg/OiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwsXG4gICAgICAvLyB1bmRlZmluZWQsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyAoZXh0cmFQcmVmaXggPyBleHRyYVByZWZpeCA6IFwiXCIpXG4gICAgKTtcbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG4gIHJldHVybiBPYmplY3Qua2V5cyhkZWNvcmF0b3JzKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCwgZGVjb3JhdG9yKSA9PiB7XG4gICAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzW2RlY29yYXRvcl0uZmlsdGVyKChkKSA9PiBkLmtleSA9PT0gb3BlcmF0aW9uKTtcbiAgICAgIGlmIChkZWMgJiYgZGVjLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHt9O1xuICAgICAgICBhY2N1bVtkZWNvcmF0b3JdID0gZGVjO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZWNvcmF0b3JzIGZvciBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHByZWZpeGVkIGJ5IHtAcGFyYW0gcHJlZml4ZXN9IHJlY3Vyc2l2ZWx5XG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBhY2N1bVxuICogQHBhcmFtIHByZWZpeGVzXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogVCxcbiAgYWNjdW06IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQsXG4gIC4uLnByZWZpeGVzOiBzdHJpbmdbXVxuKTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjY3VtdWxhdG9yID0gYWNjdW0gfHwge307XG4gIGNvbnN0IG1lcmdlRGVjb3JhdG9ycyA9IGZ1bmN0aW9uIChkZWNzOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9KSB7XG4gICAgY29uc3QgcHVzaE9yU3F1YXNoID0gKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGxldCBtYXRjaDogYW55O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShtYXRjaCA9IGFjY3VtdWxhdG9yW2tleV0uZmluZCgoZSkgPT4gZS5rZXkgPT09IHZhbC5rZXkpKSB8fFxuICAgICAgICAgIG1hdGNoLnByb3BzLm9wZXJhdGlvbiAhPT0gdmFsLnByb3BzLm9wZXJhdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICBhY2N1bXVsYXRvcltrZXldLnB1c2godmFsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IGhhbmRsZXJzLCBvcGVyYXRpb24gfSA9IHZhbC5wcm9wcztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIW9wZXJhdGlvbiB8fFxuICAgICAgICAgICFvcGVyYXRpb24ubWF0Y2goXG4gICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICBgXig6PyR7T3BlcmF0aW9uS2V5cy5PTn18JHtPcGVyYXRpb25LZXlzLkFGVEVSfSkoOj8ke09wZXJhdGlvbktleXMuQ1JFQVRFfXwke09wZXJhdGlvbktleXMuUkVBRH18JHtPcGVyYXRpb25LZXlzLlVQREFURX18JHtPcGVyYXRpb25LZXlzLkRFTEVURX0pJGBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0ucHVzaCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY3VtSGFuZGxlcnMgPSBtYXRjaC5wcm9wcy5oYW5kbGVycztcblxuICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2NsYXp6LCBoYW5kbGVyRGVmXSkgPT4ge1xuICAgICAgICAgIGlmICghKGNsYXp6IGluIGFjY3VtSGFuZGxlcnMpKSB7XG4gICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XSA9IGhhbmRsZXJEZWY7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlckRlZiBhcyBvYmplY3QpLmZvckVhY2goXG4gICAgICAgICAgICAoW2hhbmRsZXJQcm9wLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIShoYW5kbGVyUHJvcCBpbiBhY2N1bUhhbmRsZXJzW2NsYXp6XSkpIHtcbiAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF0gPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXIgYXMgb2JqZWN0KS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChbaGFuZGxlcktleSwgYXJnc09ial0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghKGhhbmRsZXJLZXkgaW4gYWNjdW1IYW5kbGVyc1tjbGF6el1baGFuZGxlclByb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF1baGFuZGxlcktleV0gPSBhcmdzT2JqO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIGBTa2lwcGluZyBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmb3IgJHtjbGF6en0gdW5kZXIgcHJvcCAke2hhbmRsZXJQcm9wfSBiZWNhdXNlIGhhbmRsZXIgaXMgdGhlIHNhbWVgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBPYmplY3QuZW50cmllcyhkZWNzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSBhY2N1bXVsYXRvcltrZXldIHx8IFtdO1xuICAgICAgcHVzaE9yU3F1YXNoKGtleSwgLi4udmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlY3M6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCAuLi5wcmVmaXhlcyk7XG4gIGlmIChkZWNzKSBtZXJnZURlY29yYXRvcnMoZGVjcyk7XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bXVsYXRvcjtcblxuICAvLyBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpO1xuICBpZiAoIXByb3RvKSByZXR1cm4gYWNjdW11bGF0b3I7XG4gIC8vIGlmIChwcm90by5jb25zdHJ1Y3RvciAmJiBwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKVxuICAvLyAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pXG4gIHJldHVybiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUocHJvdG8sIGFjY3VtdWxhdG9yLCAuLi5wcmVmaXhlcyk7XG59O1xuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZsYWdzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgcmVwb3NpdG9yeSBvcGVyYXRpb24gZmxhZ3MsIGV4Y2x1ZGluZyB0aGUgdGltZXN0YW1wIHByb3BlcnR5LlxuICogVGhlc2UgZmxhZ3MgY29udHJvbCBiZWhhdmlvciBzdWNoIGFzIGNvbnRleHQgaGFuZGxpbmcsIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgbW9yZS5cbiAqIEBjb25zdCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3M6IE9taXQ8UmVwb3NpdG9yeUZsYWdzLCBcInRpbWVzdGFtcFwiPiA9IHtcbiAgcGFyZW50Q29udGV4dDogdW5kZWZpbmVkLFxuICBjaGlsZENvbnRleHRzOiBbXSxcbiAgaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzOiBbXSxcbiAgY2FsbEFyZ3M6IFtdLFxuICB3cml0ZU9wZXJhdGlvbjogZmFsc2UsXG4gIGFmZmVjdGVkVGFibGVzOiBbXSxcbiAgb3BlcmF0aW9uOiB1bmRlZmluZWQsXG4gIGJyZWFrT25IYW5kbGVyRXJyb3I6IHRydWUsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxufTtcbiIsImltcG9ydCB7IENvbnRleHRBcmdzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHR1YWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9Db250ZXh0dWFsXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgY29udGV4dCBpbnN0YW5jZXMgd2l0aCBzcGVjaWZpYyByZXBvc2l0b3J5IGZsYWdzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gQ29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb250ZXh0RmFjdG9yeTxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiA9IDxDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiBDO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbnRleHQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgQ29udGV4dCBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBmbGFncy5cbiAqIEl0IGF1dG9tYXRpY2FsbHkgYWRkcyBhIHRpbWVzdGFtcCB0byB0aGUgY29udGV4dCBhbmQgcmV0dXJucyBhIHByb3Blcmx5IHR5cGVkIGNvbnRleHQgaW5zdGFuY2UuXG4gKiBAY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250ZXh0RmFjdG9yeTogQ29udGV4dEZhY3Rvcnk8YW55PiA9IDxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICBhcmc6IE9taXQ8RiwgXCJ0aW1lc3RhbXBcIj5cbikgPT4ge1xuICByZXR1cm4gbmV3IENvbnRleHQ8Rj4oKS5hY2N1bXVsYXRlKFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGFyZywgeyB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfSkgYXMgRlxuICApIGFzIEM7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbnRleHQgbWFuYWdlbWVudCBjbGFzcyBmb3IgaGFuZGxpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIENvbnRleHQgY2xhc3MgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyB3aXRoIGZsYWdzLFxuICogcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMsIGFuZCBzdGF0ZSBhY2N1bXVsYXRpb24uIEl0IGFsbG93cyBmb3IgaGllcmFyY2hpY2FsIGNvbnRleHQgY2hhaW5zXG4gKiBhbmQgbWFpbnRhaW5zIG9wZXJhdGlvbi1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyB3aGlsZSBzdXBwb3J0aW5nIHR5cGUgc2FmZXR5IHRocm91Z2ggZ2VuZXJpY3MuXG4gKlxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3MgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdEFjY3VtdWxhdG9yPEY+fSBjYWNoZSAtIFRoZSBpbnRlcm5hbCBjYWNoZSBzdG9yaW5nIGFjY3VtdWxhdGVkIHZhbHVlc1xuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHdpdGggcmVwb3NpdG9yeSBmbGFnc1xuICogY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0PFJlcG9zaXRvcnlGbGFncz4oKTtcbiAqXG4gKiAvLyBBY2N1bXVsYXRpbmcgdmFsdWVzXG4gKiBjb25zdCBlbnJpY2hlZENvbnRleHQgPSBjb250ZXh0LmFjY3VtdWxhdGUoe1xuICogICB3cml0ZU9wZXJhdGlvbjogdHJ1ZSxcbiAqICAgYWZmZWN0ZWRUYWJsZXM6IFsndXNlcnMnXSxcbiAqICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLkNSRUFURVxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzaW5nIHZhbHVlc1xuICogY29uc3QgaXNXcml0ZSA9IGVucmljaGVkQ29udGV4dC5nZXQoJ3dyaXRlT3BlcmF0aW9uJyk7IC8vIHRydWVcbiAqIGNvbnN0IHRhYmxlcyA9IGVucmljaGVkQ29udGV4dC5nZXQoJ2FmZmVjdGVkVGFibGVzJyk7IC8vIFsndXNlcnMnXVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDdHggYXMgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBDYWNoZSBhcyBPYmplY3RBY2N1bXVsYXRvclxuICpcbiAqICAgQy0+PkN0eDogbmV3IENvbnRleHQoKVxuICogICBDdHgtPj5DYWNoZTogY3JlYXRlIGNhY2hlXG4gKlxuICogICBDLT4+Q3R4OiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDdHgtPj5DYWNoZTogYWNjdW11bGF0ZSh2YWx1ZSlcbiAqICAgQ2FjaGUtLT4+Q3R4OiB1cGRhdGVkIGNhY2hlXG4gKiAgIEN0eC0tPj5DOiB1cGRhdGVkIGNvbnRleHRcbiAqXG4gKiAgIEMtPj5DdHg6IGdldChrZXkpXG4gKiAgIEN0eC0+PkNhY2hlOiBnZXQoa2V5KVxuICogICBhbHQgS2V5IGV4aXN0cyBpbiBjYWNoZVxuICogICAgIENhY2hlLS0+PkN0eDogdmFsdWVcbiAqICAgZWxzZSBLZXkgbm90IGZvdW5kXG4gKiAgICAgQ3R4LT4+Q3R4OiBjaGVjayBwYXJlbnQgY29udGV4dFxuICogICAgIGFsdCBQYXJlbnQgZXhpc3RzXG4gKiAgICAgICBDdHgtPj5QYXJlbnQ6IGdldChrZXkpXG4gKiAgICAgICBQYXJlbnQtLT4+Q3R4OiB2YWx1ZVxuICogICAgIGVsc2UgTm8gcGFyZW50XG4gKiAgICAgICBDdHgtLT4+QzogdGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEN0eC0tPj5DOiByZXF1ZXN0ZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHQ8RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogbmV3IE9iamVjdEFjY3VtdWxhdG9yPEY+KCksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gRGVmYXVsdENvbnRleHRGYWN0b3J5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGU6IEYgJiBPYmplY3RBY2N1bXVsYXRvcjxGPiA9XG4gICAgbmV3IE9iamVjdEFjY3VtdWxhdG9yKCkgYXMgRiAmIE9iamVjdEFjY3VtdWxhdG9yPEY+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgbmV3IHZhbHVlcyBpbnRvIHRoZSBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIHZhbHVlIG9iamVjdCB3aXRoIHRoZSBleGlzdGluZyBjb250ZXh0IHN0YXRlLFxuICAgKiBjcmVhdGluZyBhIG5ldyBpbW11dGFibGUgY2FjaGUgc3RhdGUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBGIC0gY3VycmVudCBhY2N1bXVsYXRvciB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgb2JqZWN0IGZvciB0aGUgdmFsdWVzIHRvIGFjY3VtdWxhdGVcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgY29udGFpbmluZyB2YWx1ZXMgdG8gYWNjdW11bGF0ZVxuICAgKiBAcmV0dXJucyBBIG5ldyBjb250ZXh0IGluc3RhbmNlIHdpdGggYWNjdW11bGF0ZWQgdmFsdWVzXG4gICAqL1xuICBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuY2FjaGUuYWNjdW11bGF0ZSh2YWx1ZSksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIENvbnRleHQ8RiAmIFY+O1xuICB9XG5cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS50aW1lc3RhbXA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQgYnkga2V5LlxuICAgKiBAc3VtbWFyeSBBdHRlbXB0cyB0byBnZXQgYSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQncyBjYWNoZS5cbiAgICogSWYgbm90IGZvdW5kLCB0cmF2ZXJzZXMgdXAgdGhlIHBhcmVudCBjb250ZXh0IGNoYWluLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgSyAtIFR5cGUgZXh0ZW5kaW5nIGtleW9mIEYgZm9yIHRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHRlbXBsYXRlIEYgLSBBY2N1bXVsYXRvciB0eXBlXG4gICAqIEBwYXJhbSB7S30ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZSBmcm9tIHRoZSBjb250ZXh0XG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbnRleHQgY2hhaW5cbiAgICovXG4gIGdldDxLIGV4dGVuZHMga2V5b2YgRj4oa2V5OiBLKTogRltLXSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmICh0aGlzLmNhY2hlLnBhcmVudENvbnRleHQpIHJldHVybiB0aGlzLmNhY2hlLnBhcmVudENvbnRleHQuZ2V0KGtleSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHRcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgbmV3IGNvbnRleHQgaW5zdGFuY2Ugd2l0aCBjdXJyZW50IGNvbnRleHQgYXMgcGFyZW50XG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW21vZGVsXSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm5zIHtDfSBOZXcgY2hpbGQgY29udGV4dCBpbnN0YW5jZVxuICAgKi9cbiAgY2hpbGQ8TSBleHRlbmRzIE1vZGVsLCBDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsPzogQ29uc3RydWN0b3I8TT5cbiAgKTogQyB7XG4gICAgcmV0dXJuIENvbnRleHQuY2hpbGRGcm9tPEYsIEM+KFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICB7XG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBhZmZlY3RlZFRhYmxlczogbW9kZWwgPyBbbW9kZWxdIDogW10sXG4gICAgICB9IGFzIHVua25vd24gYXMgUGFydGlhbDxGPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjaGlsZCBjb250ZXh0IGZyb20gYW5vdGhlciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIG5ldyBjb250ZXh0IGluc3RhbmNlIHdpdGggcGFyZW50IHJlZmVyZW5jZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnkgRmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBwYXJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IFtvdmVycmlkZXNdIC0gT3B0aW9uYWwgZmxhZyBvdmVycmlkZXNcbiAgICogQHJldHVybnMge0N9IE5ldyBjaGlsZCBjb250ZXh0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY2hpbGRGcm9tPEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsIEMgZXh0ZW5kcyBDb250ZXh0PEY+PihcbiAgICBjb250ZXh0OiBDLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8Rj5cbiAgKTogQyB7XG4gICAgcmV0dXJuIENvbnRleHQuZmFjdG9yeShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHQuY2FjaGUsIG92ZXJyaWRlcyB8fCB7fSlcbiAgICApIGFzIHVua25vd24gYXMgQztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGZyb20gb3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgY29udGV4dCBpbnN0YW5jZSBmb3Igc3BlY2lmaWMgb3BlcmF0aW9uXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeSBGbGFnc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdHlwZVxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzIC0gT3BlcmF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBmcm9tPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Qz4ge1xuICAgIHJldHVybiBDb250ZXh0LmZhY3RvcnkoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLCBvdmVycmlkZXMsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgIH0pXG4gICAgKSBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhcmd1bWVudHMgZm9yIGNvbnRleHQgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29udGV4dCBhcmdzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyB7QGxpbmsgUmVwb3NpdG9yeUZsYWdzfVxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIHtAbGluayBNb2RlbH1cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBPcGVyYXRpb24gYXJndW1lbnRzXG4gICAqIEBwYXJhbSB7Q29udGV4dHVhbDxGPn0gW2NvbnRleHR1YWxdIC0gT3B0aW9uYWwgY29udGV4dHVhbCBvYmplY3RcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBbb3ZlcnJpZGVzXSAtIE9wdGlvbmFsIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRleHRBcmdzPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gY29udGV4dCBhcmd1bWVudHNcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQXJnc1xuICAgKlxuICAgKiAgIEMtPj5DOiBSZWNlaXZlIG9wZXJhdGlvbiByZXF1ZXN0XG4gICAqICAgQy0+Pk06IFZhbGlkYXRlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqICAgQy0+PkM6IENyZWF0ZSBjaGlsZCBjb250ZXh0XG4gICAqICAgQy0+PkE6IFByb2Nlc3Mgb3BlcmF0aW9uIGFyZ3NcbiAgICogICBBLT4+QzogUmV0dXJuIGNvbnRleHQgYXJnc1xuICAgKiAgIEMtPj5DOiBBcHBseSBvdmVycmlkZXNcbiAgICogICBDLT4+QzogUmV0dXJuIGZpbmFsIGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhcmdzPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBjb250ZXh0dWFsPzogQ29udGV4dHVhbDxGPixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEY+XG4gICk6IFByb21pc2U8Q29udGV4dEFyZ3M8RiwgQz4+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgICBpZiAoY29udGV4dHVhbClcbiAgICAgICAgcmV0dXJuIGNvbnRleHR1YWwuY29udGV4dChvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIENvbnRleHQuZnJvbShvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGxldCBjOiBDO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgICAgYyA9IGxhc3QgYXMgQztcbiAgICAgICAgYXJncy5wdXNoKGxhc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0LCBjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYyA9IChhd2FpdCBnZXRDb250ZXh0KCkpIGFzIEM7XG4gICAgICBhcmdzLnB1c2goYyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29udGV4dDogYywgYXJnczogYXJncyB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgbWV0aG9kIHRvIGNoYW5nZSBhIG1ldGhvZCBvZiBhbiBvYmplY3QgcHJlZml4aW5nIGl0IHdpdGggYW5vdGhlclxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyIFRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWZpeCBUaGUgUHJlZml4IG1ldGhvZC4gVGhlIG91dHB1dCB3aWxsIGJlIHVzZWQgYXMgYXJndW1lbnRzIGluIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWZ0ZXJOYW1lXSBXaGVuIHRoZSBhZnRlciBmdW5jdGlvbiBhbm1lIGNhbm5vdCBiZSBleHRyYWN0ZWQsIHBhc3MgaXQgaGVyZVxuICpcbiAqIEBmdW5jdGlvbiBwcmVmaXhNZXRob2RcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeE1ldGhvZChcbiAgb2JqOiBhbnksXG4gIGFmdGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgcHJlZml4OiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgYWZ0ZXJOYW1lPzogc3RyaW5nXG4pIHtcbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlcih0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShwcmVmaXguY2FsbCh0aGlzLCAuLi5hcmdzKSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhZnRlci5hcHBseSh0aGlzLCByZXN1bHRzKSk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlZCA9IHdyYXBwZXIuYmluZChvYmopO1xuICBjb25zdCBuYW1lID0gYWZ0ZXJOYW1lID8gYWZ0ZXJOYW1lIDogYWZ0ZXIubmFtZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWQsIFwibmFtZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuYW1lLFxuICB9KTtcbiAgb2JqW25hbWVdID0gd3JhcHBlZDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIG1ldGhvZCB0byBjaGFuZ2UgYSBtZXRob2Qgb2YgYW4gb2JqZWN0IHN1ZmZpeGluZyBpdCB3aXRoIGFub3RoZXJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIEJhc2UgT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBiZWZvcmUgVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3VmZml4IFRoZSBQcmVmaXggbWV0aG9kLiBUaGUgb3V0cHV0IHdpbGwgYmUgdXNlZCBhcyBhcmd1bWVudHMgaW4gdGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVOYW1lXSBXaGVuIHRoZSBhZnRlciBmdW5jdGlvbiBhbm1lIGNhbm5vdCBiZSBleHRyYWN0ZWQsIHBhc3MgaXQgaGVyZVxuICpcbiAqIEBmdW5jdGlvbiBzdWZmaXhNZXRob2RcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnMuUmVwb3NpdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VmZml4TWV0aG9kKFxuICBvYmo6IGFueSxcbiAgYmVmb3JlOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgc3VmZml4OiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgYmVmb3JlTmFtZT86IHN0cmluZ1xuKSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHdyYXBwZXIodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoYmVmb3JlLmNhbGwodGhpcywgLi4uYXJncykpO1xuICAgIHJldHVybiBzdWZmaXguY2FsbCh0aGlzLCAuLi5yZXN1bHRzKTtcbiAgfVxuICBjb25zdCB3cmFwcGVkID0gd3JhcHBlci5iaW5kKG9iaik7XG4gIGNvbnN0IG5hbWUgPSBiZWZvcmVOYW1lID8gYmVmb3JlTmFtZSA6IGJlZm9yZS5uYW1lO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgXCJuYW1lXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG5hbWUsXG4gIH0pO1xuICBvYmpbbmFtZV0gPSB3cmFwcGVkO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgbWV0aG9kIHRvIHdyYXAgYSBtZXRob2Qgb2YgYW4gb2JqZWN0IHdpdGggYWRkaXRpb25hbCBsb2dpY1xuICpcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIEJhc2UgT2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBiZWZvcmUgdGhlIG1ldGhvZCB0byBiZSBwcmVmaXhlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIHRoZSBtZXRob2QgdG8gYmUgd3JhcHBlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgVGhlIG1ldGhvZCB0byBiZSBzdWZmaXhlZFxuICogQHBhcmFtIHtzdHJpbmd9IFttZXRob2ROYW1lXSBXaGVuIHRoZSBhZnRlciBmdW5jdGlvbiBhbm1lIGNhbm5vdCBiZSBleHRyYWN0ZWQsIHBhc3MgaXQgaGVyZVxuICpcbiAqIEBmdW5jdGlvbiB3cmFwTWV0aG9kV2l0aENvbnRleHRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgb2JqOiBhbnksXG4gIGJlZm9yZTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIGFmdGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kTmFtZT86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IG5hbWUgPSBtZXRob2ROYW1lID8gbWV0aG9kTmFtZSA6IG1ldGhvZC5uYW1lO1xuICBvYmpbbmFtZV0gPSBuZXcgUHJveHkob2JqW25hbWVdLCB7XG4gICAgYXBwbHk6IGFzeW5jICh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KSA9PiB7XG4gICAgICBsZXQgdHJhbnNmb3JtZWRBcmdzID0gYmVmb3JlLmNhbGwodGhpc0FyZywgLi4uYXJnQXJyYXkpO1xuICAgICAgaWYgKHRyYW5zZm9ybWVkQXJncyBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgIHRyYW5zZm9ybWVkQXJncyA9IGF3YWl0IHRyYW5zZm9ybWVkQXJncztcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0cmFuc2Zvcm1lZEFyZ3NbdHJhbnNmb3JtZWRBcmdzLmxlbmd0aCAtIDFdIGFzIGFueTtcbiAgICAgIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0KSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIGEgY29udGV4dFwiKTtcbiAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgdGFyZ2V0LmNhbGwodGhpc0FyZywgLi4udHJhbnNmb3JtZWRBcmdzKTtcbiAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkgcmVzdWx0cyA9IGF3YWl0IHJlc3VsdHM7XG4gICAgICByZXN1bHRzID0gYWZ0ZXIuY2FsbCh0aGlzQXJnLCByZXN1bHRzLCBjb250ZXh0KTtcbiAgICAgIGlmIChyZXN1bHRzIGluc3RhbmNlb2YgUHJvbWlzZSkgcmVzdWx0cyA9IGF3YWl0IHJlc3VsdHM7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9LFxuICB9KTtcbn1cbiIsImltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuLi9tb2RlbC9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3V0aWxzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxLZXlzLCBzZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmluZHMgdGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgU2VhcmNoZXMgaW4gYWxsIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QgZm9yIGFuIHtAbGluayBpZH0gZGVjb3JhdGVkIHByb3BlcnR5IGFuZCByZXR1cm5zIHRoZSBwcm9wZXJ0eSBrZXkgYW5kIG1ldGFkYXRhXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCBvYmplY3QgdG8gc2VhcmNoIGZvciBwcmltYXJ5IGtleVxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgaWQgcHJvcGVydHkgbmFtZSBhbmQgaXRzIG1ldGFkYXRhXG4gKiBAZnVuY3Rpb24gZmluZFByaW1hcnlLZXlcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICpcbiAqICAgQ2FsbGVyLT4+ZmluZFByaW1hcnlLZXk6IG1vZGVsXG4gKiAgIGZpbmRQcmltYXJ5S2V5LT4+Z2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlOiBnZXQgZGVjb3JhdG9yc1xuICogICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUtLT4+ZmluZFByaW1hcnlLZXk6IGRlY29yYXRvcnNcbiAqICAgZmluZFByaW1hcnlLZXktPj5maW5kUHJpbWFyeUtleTogZmlsdGVyIElEIGRlY29yYXRvcnNcbiAqICAgZmluZFByaW1hcnlLZXktPj5maW5kUHJpbWFyeUtleTogdmFsaWRhdGUgc2luZ2xlIElEIHByb3BlcnR5XG4gKiAgIGZpbmRQcmltYXJ5S2V5LS0+PkNhbGxlcjoge2lkLCBwcm9wc31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFByaW1hcnlLZXk8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgIG1vZGVsLFxuICAgIHVuZGVmaW5lZCxcbiAgICBEQktleXMuUkVGTEVDVCArIERCS2V5cy5JRFxuICApO1xuICBjb25zdCBpZERlY29yYXRvcnMgPSBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JzIGFzIG9iamVjdCkucmVkdWNlKFxuICAgIChhY2N1bTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSwgW3Byb3AsIGRlY3NdKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IChkZWNzIGFzIHsga2V5OiBzdHJpbmcgfVtdKS5maWx0ZXIoXG4gICAgICAgIChkKSA9PiBkLmtleSAhPT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICk7XG4gICAgICBpZiAoZmlsdGVyZWQgJiYgZmlsdGVyZWQubGVuZ3RoKSB7XG4gICAgICAgIGFjY3VtW3Byb3BdID0gYWNjdW1bcHJvcF0gfHwgW107XG4gICAgICAgIGFjY3VtW3Byb3BdLnB1c2goLi4uZmlsdGVyZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAge31cbiAgKTtcblxuICBpZiAoIWlkRGVjb3JhdG9ycyB8fCAhT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCBJRCBkZWNvcmF0ZWQgUHJvcGVydHlcIik7XG4gIGlmIChPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3Ioc2YoT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKS5qb2luKFwiLCBcIikpKTtcbiAgY29uc3QgaWRQcm9wID0gT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKVswXTtcbiAgaWYgKCFpZFByb3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQ291bGQgbm90IGZpbmQgSUQgZGVjb3JhdGVkIFByb3BlcnR5XCIpO1xuICByZXR1cm4ge1xuICAgIGlkOiBpZFByb3AgYXMga2V5b2YgTSxcbiAgICBwcm9wczogaWREZWNvcmF0b3JzW2lkUHJvcF1bMF0ucHJvcHMsXG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcHJpbWFyeSBrZXkgdmFsdWUgZnJvbSBhIG1vZGVsXG4gKiBAc3VtbWFyeSBTZWFyY2hlcyBmb3IgdGhlIElELWRlY29yYXRlZCBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgYW5kIHJldHVybnMgaXRzIHZhbHVlXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCAtIFRoZSBtb2RlbCBvYmplY3QgdG8gZXh0cmFjdCB0aGUgSUQgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuRW1wdHk9ZmFsc2VdIC0gV2hldGhlciB0byByZXR1cm4gdW5kZWZpbmVkIGlmIG5vIElEIHZhbHVlIGlzIGZvdW5kXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICogQGZ1bmN0aW9uIGZpbmRNb2RlbElkXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBmaW5kTW9kZWxJZFxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICpcbiAqICAgQ2FsbGVyLT4+ZmluZE1vZGVsSWQ6IG1vZGVsLCByZXR1cm5FbXB0eVxuICogICBmaW5kTW9kZWxJZC0+PmZpbmRQcmltYXJ5S2V5OiBtb2RlbFxuICogICBmaW5kUHJpbWFyeUtleS0tPj5maW5kTW9kZWxJZDoge2lkLCBwcm9wc31cbiAqICAgZmluZE1vZGVsSWQtPj5maW5kTW9kZWxJZDogZXh0cmFjdCBtb2RlbFtpZF1cbiAqICAgZmluZE1vZGVsSWQtPj5maW5kTW9kZWxJZDogdmFsaWRhdGUgSUQgZXhpc3RzIGlmIHJlcXVpcmVkXG4gKiAgIGZpbmRNb2RlbElkLS0+PkNhbGxlcjogSUQgdmFsdWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE1vZGVsSWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHJldHVybkVtcHR5ID0gZmFsc2Vcbik6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gIGNvbnN0IGlkUHJvcCA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgY29uc3QgbW9kZWxJZCA9IG1vZGVsW2lkUHJvcF07XG4gIGlmICh0eXBlb2YgbW9kZWxJZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiAhcmV0dXJuRW1wdHkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke2lkUHJvcCBhcyBzdHJpbmd9YFxuICAgICk7XG4gIHJldHVybiBtb2RlbElkIGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbn1cbiIsImltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGVuZm9yY2VEQkRlY29yYXRvcnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgd3JhcE1ldGhvZFdpdGhDb250ZXh0IH0gZnJvbSBcIi4vd3JhcHBlcnNcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5IH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIHByb3ZpZGluZyBDUlVEIG9wZXJhdGlvbnMgZm9yIG1vZGVscy5cbiAqIEBzdW1tYXJ5IFRoZSBCYXNlUmVwb3NpdG9yeSBjbGFzcyBzZXJ2ZXMgYXMgYSBmb3VuZGF0aW9uIGZvciByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9ucywgcHJvdmlkaW5nXG4gKiBhYnN0cmFjdCBhbmQgY29uY3JldGUgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHJlYWRpbmcsIHVwZGF0aW5nLCBhbmQgZGVsZXRpbmcgbW9kZWwgaW5zdGFuY2VzLlxuICogSXQgaGFuZGxlcyBvcGVyYXRpb24gbGlmZWN5Y2xlcyBpbmNsdWRpbmcgcHJlZml4IGFuZCBzdWZmaXggb3BlcmF0aW9ucywgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICogQGNsYXNzIEJhc2VSZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICogICBAaWQoKVxuICogICBpZDogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICogfVxuICpcbiAqIGNsYXNzIFVzZXJSZXBvc2l0b3J5IGV4dGVuZHMgQmFzZVJlcG9zaXRvcnk8VXNlck1vZGVsPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFVzZXJNb2RlbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGNyZWF0ZShtb2RlbDogVXNlck1vZGVsKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvblxuICogICAgIHJldHVybiBtb2RlbDtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmVhZChrZXk6IHN0cmluZyk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICByZXR1cm4gbmV3IFVzZXJNb2RlbCh7IGlkOiBrZXksIG5hbWU6ICdVc2VyJyB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgdXBkYXRlKG1vZGVsOiBVc2VyTW9kZWwpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uXG4gKiAgICAgcmV0dXJuIG1vZGVsO1xuICogICB9XG4gKlxuICogICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uXG4gKiAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQoa2V5KTtcbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBQIGFzIFByZWZpeCBNZXRob2RzXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YWJhc2VcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTdWZmaXggTWV0aG9kc1xuICogICBwYXJ0aWNpcGFudCBWIGFzIFZhbGlkYXRvcnMvRGVjb3JhdG9yc1xuICpcbiAqICAgTm90ZSBvdmVyIEMsVjogQ3JlYXRlIE9wZXJhdGlvblxuICogICBDLT4+UjogY3JlYXRlKG1vZGVsKVxuICogICBSLT4+UDogY3JlYXRlUHJlZml4KG1vZGVsKVxuICogICBQLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhPTilcbiAqICAgUC0+PkQ6IERhdGFiYXNlIG9wZXJhdGlvblxuICogICBELT4+UzogY3JlYXRlU3VmZml4KG1vZGVsKVxuICogICBTLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhBRlRFUilcbiAqICAgUy0+PkM6IFJldHVybiBtb2RlbFxuICpcbiAqICAgTm90ZSBvdmVyIEMsVjogUmVhZCBPcGVyYXRpb25cbiAqICAgQy0+PlI6IHJlYWQoa2V5KVxuICogICBSLT4+UDogcmVhZFByZWZpeChrZXkpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiByZWFkU3VmZml4KG1vZGVsKVxuICogICBTLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhBRlRFUilcbiAqICAgUy0+PkM6IFJldHVybiBtb2RlbFxuICpcbiAqICAgTm90ZSBvdmVyIEMsVjogVXBkYXRlIE9wZXJhdGlvblxuICogICBDLT4+UjogdXBkYXRlKG1vZGVsKVxuICogICBSLT4+UDogdXBkYXRlUHJlZml4KG1vZGVsKVxuICogICBQLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhPTilcbiAqICAgUC0+PkQ6IERhdGFiYXNlIG9wZXJhdGlvblxuICogICBELT4+UzogdXBkYXRlU3VmZml4KG1vZGVsKVxuICogICBTLT4+VjogZW5mb3JjZURCRGVjb3JhdG9ycyhBRlRFUilcbiAqICAgUy0+PkM6IFJldHVybiBtb2RlbFxuICpcbiAqICAgTm90ZSBvdmVyIEMsVjogRGVsZXRlIE9wZXJhdGlvblxuICogICBDLT4+UjogZGVsZXRlKGtleSlcbiAqICAgUi0+PlA6IGRlbGV0ZVByZWZpeChrZXkpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiBkZWxldGVTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGltcGxlbWVudHMgSVJlcG9zaXRvcnk8TSwgRiwgQz5cbntcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhc3MhOiBDb25zdHJ1Y3RvcjxNPjtcbiAgcHJpdmF0ZSBfcGshOiBrZXlvZiBNO1xuICBwcml2YXRlIF9wa1Byb3BzITogYW55O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbW9kZWwgY2xhc3MgY29uc3RydWN0b3IuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gY2xhc3MgZGVmaW5pdGlvbiBpcyBmb3VuZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT59IFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gICAqL1xuICBnZXQgY2xhc3MoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGFzcylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBjbGFzcyBkZWZpbml0aW9uIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnlgKTtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWUgb2YgdGhlIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc2VydmVzIGFzIHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIG1vZGVsLlxuICAgKiBJZiBub3QgYWxyZWFkeSBkZXRlcm1pbmVkLCBpdCBmaW5kcyB0aGUgcHJpbWFyeSBrZXkgdXNpbmcgdGhlIG1vZGVsJ3MgZGVjb3JhdG9ycy5cbiAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydHlcbiAgICovXG4gIGdldCBwaygpOiBrZXlvZiBNIHtcbiAgICBpZiAoIXRoaXMuX3BrKSB7XG4gICAgICBjb25zdCB7IGlkLCBwcm9wcyB9ID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhc3MoKSk7XG4gICAgICB0aGlzLl9wayA9IGlkO1xuICAgICAgdGhpcy5fcGtQcm9wcyA9IHByb3BzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGs7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbC5cbiAgICogSWYgbm90IGFscmVhZHkgZGV0ZXJtaW5lZCwgaXQgdHJpZ2dlcnMgdGhlIHBrIGdldHRlciB0byBmaW5kIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0aWVzLlxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcmltYXJ5IGtleVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwa1Byb3BzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9wa1Byb3BzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjb25zdCBwayA9IHRoaXMucGs7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wa1Byb3BzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBpZiAoY2xhenopIHRoaXMuX2NsYXNzID0gY2xheno7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgW3RoaXMuY3JlYXRlLCB0aGlzLnJlYWQsIHRoaXMudXBkYXRlLCB0aGlzLmRlbGV0ZV0uZm9yRWFjaCgobSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IG0ubmFtZTtcbiAgICAgIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgICAgICAgc2VsZixcbiAgICAgICAgKHNlbGYgYXMgYW55KVtuYW1lICsgXCJQcmVmaXhcIl0sXG4gICAgICAgIG0sXG4gICAgICAgIChzZWxmIGFzIGFueSlbbmFtZSArIFwiU3VmZml4XCJdXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG1vZGVsIGluc3RhbmNlIGluIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIG5ldyBtb2RlbCBpbnN0YW5jZSB0byB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlLlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgYnkgY2FsbGluZ1xuICAgKiB0aGUgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBtb2RlbCBpbiB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtb2RlbHMubWFwKChtKSA9PiB0aGlzLmNyZWF0ZShtLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbiBhbmQgZXhlY3V0ZXMgcHJlLWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGJlZm9yZSBpdCBpcyBjcmVhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBhIG5ldyBtb2RlbCBpbnN0YW5jZSwgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSBjcmVhdGlvbi5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlIGZvciBjcmVhdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlUHJlZml4KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciBjcmVhdGlvbiBhbmQgZXhlY3V0ZXMgcG9zdC1jcmVhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgYSBtb2RlbCBhZnRlciBpdCBoYXMgYmVlbiBjcmVhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGNyZWF0aW9uLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgd2FzIGNyZWF0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24gYW5kIGV4ZWN1dGVzIHByZS1jcmVhdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGJlZm9yZSB0aGV5IGFyZSBjcmVhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBuZXcgbW9kZWwgaW5zdGFuY2VzLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGNyZWF0aW9uIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBwcmVwYXJlIGZvciBjcmVhdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoYXN5bmMgKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gY3JlYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciBjcmVhdGlvbiBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUFsbFN1ZmZpeChtb2RlbHM6IE1bXSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSByZXBvc2l0b3J5IGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IHJlYWQoa2V5OiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBieSB0aGVpciBwcmltYXJ5IGtleXMuXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSB1c2luZyB0aGVpciBwcmltYXJ5IGtleXNcbiAgICogYnkgY2FsbGluZyB0aGUgcmVhZCBtZXRob2QgZm9yIGVhY2gga2V5IGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGtleXMubWFwKChpZCkgPT4gdGhpcy5yZWFkKGlkLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciByZXRyaWV2YWwgYW5kIGV4ZWN1dGVzIHBvc3QtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgYSBtb2RlbCBhZnRlciBpdCBoYXMgYmVlbiByZXRyaWV2ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciByZWFkaW5nLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgd2FzIHJldHJpZXZlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZFN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBhIG1vZGVsIGFuZCBleGVjdXRlcyBwcmUtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBrZXkgYmVmb3JlIGEgbW9kZWwgaXMgcmVhZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBhIG5ldyBtb2RlbCBpbnN0YW5jZSB3aXRoIHRoZSBrZXksIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgcmVhZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSByZWFkIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleSBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBhbnk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIG11bHRpcGxlIG1vZGVscyBhbmQgZXhlY3V0ZXMgcHJlLXJlYWQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIG11bHRpcGxlIGtleXMgYmVmb3JlIG1vZGVscyBhcmUgcmVhZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBuZXcgbW9kZWwgaW5zdGFuY2VzIHdpdGggdGhlIGtleXMsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgcmVhZGluZyBmb3IgZWFjaCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBhcnJheSBvZiBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZWFkQWxsUHJlZml4KGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgYW55O1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBba2V5cywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgcmV0cmlldmFsIGFuZCBleGVjdXRlcyBwb3N0LXJlYWQgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiByZXRyaWV2ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciByZWFkaW5nIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgcmV0cmlldmVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFycmF5IG9mIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZWFkQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZS5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSByZXBvc2l0b3J5IGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGluIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgYnkgY2FsbGluZ1xuICAgKiB0aGUgdXBkYXRlIG1ldGhvZCBmb3IgZWFjaCBtb2RlbCBpbiB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55KTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobW9kZWxzLm1hcCgobSkgPT4gdGhpcy51cGRhdGUobSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgbW9kZWwgYWZ0ZXIgdXBkYXRlIGFuZCBleGVjdXRlcyBwb3N0LXVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgYSBtb2RlbCBhZnRlciBpdCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHVwZGF0aW5nLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgd2FzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcHJlLXVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBtb2RlbCBiZWZvcmUgaXQgaXMgdXBkYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIHZhbGlkYXRpbmcgdGhlIHByaW1hcnkga2V5LCByZXRyaWV2aW5nIHRoZSBleGlzdGluZyBtb2RlbCxcbiAgICogYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB1cGRhdGluZy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVByZWZpeChtb2RlbDogTSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGlkID0gbW9kZWxbdGhpcy5wa107XG4gICAgaWYgKCFpZClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG4gICAgY29uc3Qgb2xkTW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQoaWQgYXMgc3RyaW5nKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVsLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUgYW5kIGV4ZWN1dGVzIHByZS11cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBiZWZvcmUgdGhleSBhcmUgdXBkYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIGluc3RhbnRpYXRpbmcgbmV3IG1vZGVsIGluc3RhbmNlcywgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB1cGRhdGluZyBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcmVwYXJlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBhZnRlciB1cGRhdGUgYW5kIGV4ZWN1dGVzIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gdXBkYXRlZCBpbiB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciB1cGRhdGluZyBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdGhhdCB3ZXJlIHVwZGF0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUFsbFN1ZmZpeChtb2RlbHM6IE1bXSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSByZXBvc2l0b3J5IGJ5IGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcmVwb3NpdG9yeSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgZGVsZXRlKGtleTogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSByZXBvc2l0b3J5IGJ5IHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5c1xuICAgKiBieSBjYWxsaW5nIHRoZSBkZWxldGUgbWV0aG9kIGZvciBlYWNoIGtleSBpbiB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBhcnJheSBvZiBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChrZXlzLm1hcCgoaykgPT4gdGhpcy5kZWxldGUoaywgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgbW9kZWwgYWZ0ZXIgZGVsZXRpb24gYW5kIGV4ZWN1dGVzIHBvc3QtZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciBkZWxldGlvbi5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0aGF0IHdhcyBkZWxldGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVTdWZmaXgobW9kZWw6IE0sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgYSBtb2RlbCBhbmQgZXhlY3V0ZXMgcHJlLWRlbGV0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBrZXkgYmVmb3JlIGEgbW9kZWwgaXMgZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgcmV0cmlldmluZyB0aGUgbW9kZWwgdG8gYmUgZGVsZXRlZCwgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSBkZWxldGlvbi5cbiAgICogQHBhcmFtIHthbnl9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXkgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlUHJlZml4KGtleTogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQoa2V5LCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGFuZCBleGVjdXRlcyBwcmUtZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBtdWx0aXBsZSBrZXlzIGJlZm9yZSBtb2RlbHMgYXJlIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBjcmVhdGluZyBhIGNvbnRleHQsIHJldHJpZXZpbmcgdGhlIG1vZGVscyB0byBiZSBkZWxldGVkLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGRlbGV0aW9uIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUgYXJyYXkgb2YgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUFsbFByZWZpeChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5yZWFkQWxsKGtleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICByZXR1cm4gZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBhZnRlciBkZWxldGlvbiBhbmQgZXhlY3V0ZXMgcG9zdC1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiBkZWxldGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgZGVsZXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRoYXQgd2VyZSBkZWxldGVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFycmF5IG9mIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVBbGxTdWZmaXgobW9kZWxzOiBNW10sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5BRlRFUlxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgdHdvIG1vZGVsIGluc3RhbmNlcyBpbnRvIGEgbmV3IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IG1vZGVsIGluc3RhbmNlIGJ5IGNvbWJpbmluZyBwcm9wZXJ0aWVzIGZyb20gYW4gb2xkIG1vZGVsIGFuZCBhIG5ldyBtb2RlbC5cbiAgICogUHJvcGVydGllcyBmcm9tIHRoZSBuZXcgbW9kZWwgb3ZlcnJpZGUgcHJvcGVydGllcyBmcm9tIHRoZSBvbGQgbW9kZWwgaWYgdGhleSBhcmUgZGVmaW5lZC5cbiAgICogQHBhcmFtIHtNfSBvbGRNb2RlbCAtIFRoZSBvcmlnaW5hbCBtb2RlbCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG5ldyBtb2RlbCBpbnN0YW5jZSB3aXRoIHVwZGF0ZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJuIHtNfSBBIG5ldyBtb2RlbCBpbnN0YW5jZSB3aXRoIG1lcmdlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgbWVyZ2Uob2xkTW9kZWw6IE0sIG1vZGVsOiBNKTogTSB7XG4gICAgY29uc3QgZXh0cmFjdCA9IChtb2RlbDogTSkgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVsKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4gbmV3IHRoaXMuY2xhc3MoT2JqZWN0LmFzc2lnbih7fSwgZXh0cmFjdChvbGRNb2RlbCksIGV4dHJhY3QobW9kZWwpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoaXMgcmVwb3NpdG9yeSBieSB0aGUgbmFtZSBvZiBpdHMgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcG9zaXRvcnlcbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmNsYXNzLm5hbWV9IFJlcG9zaXRvcnlgO1xuICB9XG59XG4iLCJpbXBvcnQgeyBlbmZvcmNlREJEZWNvcmF0b3JzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9jb25zdGFudHNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQmFzZVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9CYXNlUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmNyZXRlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gd2l0aCB2YWxpZGF0aW9uIHN1cHBvcnQuXG4gKiBAc3VtbWFyeSBUaGUgUmVwb3NpdG9yeSBjbGFzcyBleHRlbmRzIEJhc2VSZXBvc2l0b3J5IHRvIHByb3ZpZGUgYWRkaXRpb25hbCB2YWxpZGF0aW9uXG4gKiBmdW5jdGlvbmFsaXR5LiBJdCBvdmVycmlkZXMgcHJlZml4IG1ldGhvZHMgdG8gcGVyZm9ybSBtb2RlbCB2YWxpZGF0aW9uIGJlZm9yZSBkYXRhYmFzZVxuICogb3BlcmF0aW9ucyBhbmQgdGhyb3dzIFZhbGlkYXRpb25FcnJvciB3aGVuIHZhbGlkYXRpb24gZmFpbHMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQGNsYXNzIFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBVc2VyTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICBAbWluTGVuZ3RoKDMpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBjbGFzcyBVc2VyUmVwb3NpdG9yeSBleHRlbmRzIFJlcG9zaXRvcnk8VXNlck1vZGVsPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFVzZXJNb2RlbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGNyZWF0ZShtb2RlbDogVXNlck1vZGVsKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uXG4gKiAgICAgcmV0dXJuIG1vZGVsO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnN0IHJlcG8gPSBuZXcgVXNlclJlcG9zaXRvcnkoKTtcbiAqIHRyeSB7XG4gKiAgIGNvbnN0IHVzZXIgPSBhd2FpdCByZXBvLmNyZWF0ZSh7IG5hbWU6ICdKbycgfSk7IC8vIFdpbGwgdGhyb3cgVmFsaWRhdGlvbkVycm9yXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBjb25zb2xlLmVycm9yKGVycm9yKTsgLy8gVmFsaWRhdGlvbkVycm9yOiBuYW1lIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzXG4gKiB9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gZXh0ZW5kcyBCYXNlUmVwb3NpdG9yeTxNLCBGLCBDPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBjcmVhdGlvbiB3aXRoIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSBjcmVhdGVQcmVmaXggbWV0aG9kIHRvIGFkZCB2YWxpZGF0aW9uIGNoZWNrcy5cbiAgICogQ3JlYXRlcyBhIGNvbnRleHQsIGluc3RhbnRpYXRlcyBhIG5ldyBtb2RlbCwgZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlc1xuICAgKiB0aGUgbW9kZWwgYmVmb3JlIGFsbG93aW5nIGNyZWF0aW9uIHRvIHByb2NlZWQuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZSBmb3IgY3JlYXRpb25cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIG1vZGVsID0gbmV3IHRoaXMuY2xhc3MobW9kZWwpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsLmhhc0Vycm9ycygpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24gd2l0aCB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgY3JlYXRlQWxsUHJlZml4IG1ldGhvZCB0byBhZGQgdmFsaWRhdGlvbiBjaGVja3MgZm9yIG11bHRpcGxlIG1vZGVscy5cbiAgICogQ3JlYXRlcyBhIGNvbnRleHQsIGluc3RhbnRpYXRlcyBuZXcgbW9kZWxzLCBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzXG4gICAqIGVhY2ggbW9kZWwgYmVmb3JlIGFsbG93aW5nIGNyZWF0aW9uIHRvIHByb2NlZWQuIENvbGxlY3RzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYWxsIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgY3JlYXRpb25cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbiwgd2l0aCBkZXRhaWxzIGFib3V0IHdoaWNoIG1vZGVscyBmYWlsZWRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgoXG4gICAgbW9kZWxzOiBNW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSkgPT4gbS5oYXNFcnJvcnMoKSlcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHVwZGF0ZSB3aXRoIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSB1cGRhdGVQcmVmaXggbWV0aG9kIHRvIGFkZCB2YWxpZGF0aW9uIGNoZWNrcy5cbiAgICogQ3JlYXRlcyBhIGNvbnRleHQsIHZhbGlkYXRlcyB0aGUgcHJpbWFyeSBrZXksIHJldHJpZXZlcyB0aGUgZXhpc3RpbmcgbW9kZWwsXG4gICAqIG1lcmdlcyB0aGUgb2xkIGFuZCBuZXcgbW9kZWxzLCBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzIHRoZSBtb2RlbFxuICAgKiBiZWZvcmUgYWxsb3dpbmcgdGhlIHVwZGF0ZSB0byBwcm9jZWVkLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgZG9lc24ndCBoYXZlIGEgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IHBrID0gKG1vZGVsIGFzIGFueSlbdGhpcy5wa107XG4gICAgaWYgKCFwaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBvbGRNb2RlbDogTSA9IGF3YWl0IHRoaXMucmVhZChwayk7XG5cbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcblxuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWwuaGFzRXJyb3JzKG9sZE1vZGVsIGFzIGFueSk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgdXBkYXRlIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIHVwZGF0ZUFsbFByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzIGZvciBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCB2YWxpZGF0ZXMgcHJpbWFyeSBrZXlzLCByZXRyaWV2ZXMgZXhpc3RpbmcgbW9kZWxzLCBtZXJnZXMgb2xkIGFuZCBuZXcgbW9kZWxzLFxuICAgKiBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzIGVhY2ggbW9kZWwgYmVmb3JlIGFsbG93aW5nIHVwZGF0ZXMgdG8gcHJvY2VlZC5cbiAgICogQ29sbGVjdHMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhbGwgbW9kZWxzLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBkb2Vzbid0IGhhdmUgYSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIGFueSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLCB3aXRoIGRldGFpbHMgYWJvdXQgd2hpY2ggbW9kZWxzIGZhaWxlZFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGlkIGFzIHN0cmluZztcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHM6IE1bXSA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMsIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHRoaXMubWVyZ2Uob2xkTW9kZWxzW2ldLCBtKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzXG4gICAgICAubWFwKChtLCBpKSA9PiBtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0gYXMgYW55KSlcbiAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB1bmRlZmluZWQpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWZsZWN0aW9uIGtleSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEga2V5IGZvciBzdG9yaW5nIG1ldGFkYXRhIGluIHRoZSByZWZsZWN0aW9uIHN5c3RlbSBieSBwcmVmaXhpbmdcbiAgICogdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBkYXRhYmFzZSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSB0byBwcmVmaXhcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcHJlZml4ZWQgcmVmbGVjdGlvbiBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gREJLZXlzLlJFRkxFQ1QgKyBrZXk7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgZGF0ZSxcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHR5cGUsXG4gIFZhbGlkYXRpb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cywgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREJPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhZnRlciwgb24sIG9uQ3JlYXRlVXBkYXRlIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIGEgcHJvcGVydHkgZnJvbSBiZWluZyBtb2RpZmllZCBhZnRlciBpbml0aWFsIGNyZWF0aW9uLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlYWRvbmx5LCBjYXVzaW5nIHZhbGlkYXRpb24gZXJyb3JzIGlmIGF0dGVtcHRzIGFyZSBtYWRlIHRvIG1vZGlmeSBpdCBkdXJpbmcgdXBkYXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiByZWFkb25seVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSURcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuUkVBRE9OTFkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHNldHMgYSB0aW1lc3RhbXAgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICogQHN1bW1hcnkgVXBkYXRlcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gdGhlIHJlcG9zaXRvcnkgY29udGV4dC5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHVwZGF0ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlclxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lc3RhbXBIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjb250ZXh0LnRpbWVzdGFtcDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXV0b21hdGljYWxseSBtYW5hZ2VzIHRpbWVzdGFtcCBwcm9wZXJ0aWVzIGZvciB0cmFja2luZyBjcmVhdGlvbiBhbmQgdXBkYXRlIHRpbWVzLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIGEgdGltZXN0YW1wLCBtYWtpbmcgaXQgcmVxdWlyZWQgYW5kIGVuc3VyaW5nIGl0J3MgYSB2YWxpZCBkYXRlLiBUaGUgcHJvcGVydHkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZHVyaW5nIHNwZWNpZmllZCBvcGVyYXRpb25zLlxuICpcbiAqIERhdGUgRm9ybWF0OlxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbnMgdG8gYWN0IG9uLiBEZWZhdWx0cyB0byB7QGxpbmsgREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gLSBUaGUgdGltZXN0YW1wIGZvcm1hdC4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiB0aW1lc3RhbXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgVCBhcyBUaW1lc3RhbXBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5NOiBDcmVhdGUvVXBkYXRlIG1vZGVsXG4gKiAgIE0tPj5UOiBQcm9jZXNzIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogICBULT4+TTogQXBwbHkgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogICBULT4+TTogQXBwbHkgZGF0ZSBmb3JtYXQgdmFsaWRhdGlvblxuICpcbiAqICAgYWx0IFVwZGF0ZSBvcGVyYXRpb25cbiAqICAgICBULT4+VjogUmVnaXN0ZXIgdGltZXN0YW1wIHZhbGlkYXRvclxuICogICAgIFYtPj5NOiBWYWxpZGF0ZSB0aW1lc3RhbXAgaXMgbmV3ZXJcbiAqICAgZW5kXG4gKlxuICogICBULT4+TTogU2V0IGN1cnJlbnQgdGltZXN0YW1wXG4gKiAgIE0tPj5DOiBSZXR1cm4gdXBkYXRlZCBtb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wKFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFIGFzIHVua25vd24gYXMgT3BlcmF0aW9uS2V5c1tdLFxuICBmb3JtYXQ6IHN0cmluZyA9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgIGRhdGUoZm9ybWF0LCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICByZXF1aXJlZChERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgb24ob3BlcmF0aW9uLCB0aW1lc3RhbXBIYW5kbGVyKSxcbiAgXTtcblxuICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgIH0pXG4gICAgKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKC4uLmRlY29yYXRvcnMpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXIgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gSlNPTiBzdHJpbmcgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIGNvbXBsZXggb2JqZWN0IHByb3BlcnR5IHRvIGEgSlNPTiBzdHJpbmcgYmVmb3JlIHN0b3JpbmcgaXQgaW4gdGhlIGRhdGFiYXNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2VyaWFsaXplZFxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbW9kZWxba2V5XSkgcmV0dXJuO1xuICB0cnkge1xuICAgIG1vZGVsW2tleV0gPSBKU09OLnN0cmluZ2lmeShtb2RlbFtrZXldKSBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSAke2tleS50b1N0cmluZygpfSBwcm9wZXJ0eSBvZiBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9OiBlYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHByb3BlcnR5IGZyb20gSlNPTiBzdHJpbmcgYWZ0ZXIgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgSlNPTiBzdHJpbmcgcHJvcGVydHkgYmFjayB0byBpdHMgb3JpZ2luYWwgY29tcGxleCBvYmplY3QgZm9ybSBhZnRlciByZXRyaWV2aW5nIGl0IGZyb20gdGhlIGRhdGFiYXNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZGVzZXJpYWxpemVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBkZXNlcmlhbGl6ZWRcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5wYXJzZShtb2RlbFtrZXldKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGRlc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIGF1dG9tYXRpYyBKU09OIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBmb3IgY29tcGxleCBvYmplY3QgcHJvcGVydGllcy5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgY29udmVydHMgY29tcGxleCBvYmplY3RzIHRvIEpTT04gc3RyaW5ncyBiZWZvcmUgc3RvcmluZyBpbiB0aGUgZGF0YWJhc2UgYW5kIGJhY2sgdG8gb2JqZWN0cyB3aGVuIHJldHJpZXZpbmcgdGhlbS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTZXJpYWxpemVEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBDcmVhdGUvVXBkYXRlIEZsb3dcbiAqICAgQy0+Pk06IFNldCBjb21wbGV4IG9iamVjdCBwcm9wZXJ0eVxuICogICBNLT4+UzogUHJvY2VzcyBwcm9wZXJ0eSAoY3JlYXRlL3VwZGF0ZSlcbiAqICAgUy0+Pk06IENvbnZlcnQgdG8gSlNPTiBzdHJpbmdcbiAqICAgTS0+PkRCOiBTdG9yZSBzZXJpYWxpemVkIGRhdGFcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBSZXRyaWV2YWwgRmxvd1xuICogICBDLT4+TTogUmVxdWVzdCBtb2RlbFxuICogICBNLT4+REI6IEZldGNoIGRhdGFcbiAqICAgREItPj5NOiBSZXR1cm4gd2l0aCBzZXJpYWxpemVkIHByb3BlcnR5XG4gKiAgIE0tPj5TOiBQcm9jZXNzIHByb3BlcnR5IChhZnRlciBhbGwgb3BzKVxuICogICBTLT4+TTogUGFyc2UgSlNPTiBiYWNrIHRvIG9iamVjdFxuICogICBNLT4+QzogUmV0dXJuIG1vZGVsIHdpdGggZGVzZXJpYWxpemVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgYWZ0ZXIoREJPcGVyYXRpb25zLkFMTCwgc2VyaWFsaXplQWZ0ZXJBbGwpLFxuICAgIHR5cGUoW1N0cmluZy5uYW1lLCBPYmplY3QubmFtZV0pLFxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5TRVJJQUxJWkUpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IHByb3BNZXRhZGF0YSwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyByZWFkb25seSB9IGZyb20gXCIuLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgYW4gSUQgZmllbGRcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyByZXF1aXJlZCwgcmVhZG9ubHksIGFuZCBhcyB0aGUgSUQgZmllbGQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBpZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgcmVxdWlyZWQoKSxcbiAgICByZWFkb25seSgpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7XG4gIE1vZGVsLFxuICBNb2RlbEVycm9yRGVmaW5pdGlvbixcbiAgTW9kZWxFcnJvcnMsXG4gIE1vZGVsS2V5cyxcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIHNmLFxuICBWYWxpZGF0YWJsZSxcbiAgVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhLCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cywgVXBkYXRlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkIH0gZnJvbSBcIi4uL2lkZW50aXR5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBjaGFuZ2VzIGJldHdlZW4gdHdvIG1vZGVsIHZlcnNpb25zXG4gKiBAc3VtbWFyeSBDb21wYXJlcyBhbiBvbGQgYW5kIG5ldyBtb2RlbCB2ZXJzaW9uIHRvIHZhbGlkYXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG9sZE1vZGVsIC0gVGhlIG9yaWdpbmFsIG1vZGVsIHZlcnNpb25cbiAqIEBwYXJhbSB7TX0gbmV3TW9kZWwgLSBUaGUgdXBkYXRlZCBtb2RlbCB2ZXJzaW9uXG4gKiBAcGFyYW0gey4uLnN0cmluZ1tdfSBleGNlcHRpb25zIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb258dW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBhcmVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgdmFsaWRhdGVDb21wYXJlXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3Rpb25cbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICpcbiAqICAgQ2FsbGVyLT4+dmFsaWRhdGVDb21wYXJlOiBvbGRNb2RlbCwgbmV3TW9kZWwsIGV4Y2VwdGlvbnNcbiAqICAgdmFsaWRhdGVDb21wYXJlLT4+UmVmbGVjdGlvbjogZ2V0IGRlY29yYXRlZCBwcm9wZXJ0aWVzXG4gKiAgIFJlZmxlY3Rpb24tLT4+dmFsaWRhdGVDb21wYXJlOiBwcm9wZXJ0eSBkZWNvcmF0b3JzXG4gKiAgIGxvb3AgRm9yIGVhY2ggZGVjb3JhdGVkIHByb3BlcnR5XG4gKiAgICAgdmFsaWRhdGVDb21wYXJlLT4+VmFsaWRhdGlvbjogZ2V0IHZhbGlkYXRvclxuICogICAgIFZhbGlkYXRpb24tLT4+dmFsaWRhdGVDb21wYXJlOiB2YWxpZGF0b3JcbiAqICAgICB2YWxpZGF0ZUNvbXBhcmUtPj52YWxpZGF0ZUNvbXBhcmU6IHZhbGlkYXRlIHByb3BlcnR5IHVwZGF0ZVxuICogICBlbmRcbiAqICAgbG9vcCBGb3IgbmVzdGVkIG1vZGVsc1xuICogICAgIHZhbGlkYXRlQ29tcGFyZS0+PnZhbGlkYXRlQ29tcGFyZTogdmFsaWRhdGUgbmVzdGVkIG1vZGVsc1xuICogICBlbmRcbiAqICAgdmFsaWRhdGVDb21wYXJlLS0+PkNhbGxlcjogdmFsaWRhdGlvbiBlcnJvcnMgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgb2xkTW9kZWw6IE0sXG4gIG5ld01vZGVsOiBNLFxuICAuLi5leGNlcHRpb25zOiBzdHJpbmdbXVxuKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG5ld01vZGVsKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuZXdNb2RlbCwgcHJvcCkgJiZcbiAgICAgIGV4Y2VwdGlvbnMuaW5kZXhPZihwcm9wKSA9PT0gLTFcbiAgICApXG4gICAgICBkZWNvcmF0ZWRQcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgbmV3TW9kZWwsXG4gICAgICAgICAgcHJvcFxuICAgICAgICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvblxuICAgICAgKTtcblxuICBsZXQgcmVzdWx0OiBNb2RlbEVycm9ycyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRlZFByb3BlcnR5IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB7IHByb3AsIGRlY29yYXRvcnMgfSA9IGRlY29yYXRlZFByb3BlcnR5O1xuXG4gICAgZGVjb3JhdG9ycy5zaGlmdCgpOyAvLyByZW1vdmUgdGhlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgdGhlIHR5cGUgd2lsbCBhbHJlYWR5IGJlIGNoZWNrZWRcblxuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGxldCBlcnJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdG9yOiBVcGRhdGVWYWxpZGF0b3IgPSBWYWxpZGF0aW9uLmdldChcbiAgICAgICAgZGVjb3JhdG9yLmtleVxuICAgICAgKSBhcyBVcGRhdGVWYWxpZGF0b3I7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBNYXRjaGluZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX0gZm9yIHByb3BlcnR5ICR7U3RyaW5nKGRlY29yYXRlZFByb3BlcnR5LnByb3ApfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdmFsaWRhdG9yLnVwZGF0ZUhhc0Vycm9ycyhcbiAgICAgICAgKG5ld01vZGVsIGFzIGFueSlbcHJvcC50b1N0cmluZygpXSxcbiAgICAgICAgKG9sZE1vZGVsIGFzIGFueSlbcHJvcC50b1N0cmluZygpXSxcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhkZWNvcmF0b3IucHJvcHMpXG4gICAgICApO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycnMgPSBlcnJzIHx8IHt9O1xuICAgICAgICBlcnJzW2RlY29yYXRvci5rZXldID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHRbZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgfVxuICB9XG4gIC8vIHRlc3RzIG5lc3RlZCBjbGFzc2VzXG4gIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhuZXdNb2RlbCkuZmlsdGVyKChrKSA9PiB7XG4gICAgaWYgKGV4Y2VwdGlvbnMuaW5jbHVkZXMoaykpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXJlc3VsdCB8fCAhcmVzdWx0W2tdO1xuICB9KSkge1xuICAgIGxldCBlcnI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBpZiBhIG5lc3RlZCBNb2RlbFxuICAgIGNvbnN0IGFsbERlY29yYXRvcnMgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICBuZXdNb2RlbCxcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG5ld01vZGVsLFxuICAgICAgcHJvcFxuICAgICkuZGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAoZCkgPT4gW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFXS5pbmRleE9mKGQua2V5IGFzIGFueSkgIT09IC0xXG4gICAgKTtcbiAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzLnBvcCgpIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgID8gW2RlYy5wcm9wcy5uYW1lXVxuICAgICAgOiBBcnJheS5pc0FycmF5KGRlYy5wcm9wcy5jdXN0b21UeXBlcylcbiAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgOiBbZGVjLnByb3BzLmN1c3RvbVR5cGVzXTtcbiAgICBjb25zdCByZXNlcnZlZCA9IE9iamVjdC52YWx1ZXMoUmVzZXJ2ZWRNb2RlbHMpLm1hcCgodikgPT5cbiAgICAgIHYudG9Mb3dlckNhc2UoKVxuICAgICkgYXMgc3RyaW5nW107XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2xhenopIHtcbiAgICAgIGlmIChyZXNlcnZlZC5pbmRleE9mKGMudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgQXJyYXkubmFtZTpcbiAgICAgICAgICBjYXNlIFNldC5uYW1lOlxuICAgICAgICAgICAgaWYgKGFsbERlY29yYXRvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgKGQpID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRMaXN0LCBvbGRMaXN0O1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEFycmF5Lm5hbWU6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaXN0ID0gKG5ld01vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBvbGRMaXN0ID0gKG9sZE1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgU2V0Lm5hbWU6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaXN0ID0gKG5ld01vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW1xuICAgICAgICAgICAgICAgICAgICAgIHByb3BcbiAgICAgICAgICAgICAgICAgICAgXS52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgb2xkTGlzdCA9IChvbGRNb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXR0cmlidXRlIHR5cGUgJHtjfWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVyciA9IGN1cnJlbnRMaXN0XG4gICAgICAgICAgICAgICAgICAubWFwKCh2OiBWYWxpZGF0YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGZpbmRNb2RlbElkKHYgYXMgYW55LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpZCkgcmV0dXJuIFwiRmFpbGVkIHRvIGZpbmQgbW9kZWwgaWRcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSBvbGRMaXN0LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IGlkID09PSBmaW5kTW9kZWxJZChlbCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW9sZE1vZGVsKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gY29tcGFyZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2Lmhhc0Vycm9ycyhvbGRNb2RlbCk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZTogYW55KSA9PiAhIWUpIGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGlmICghZXJyPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgbGlzdC4uLlxuICAgICAgICAgICAgICAgICAgZXJyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobmV3TW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0gJiZcbiAgICAgICAgICAgICAgICAob2xkTW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGVyciA9IChuZXdNb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS5oYXNFcnJvcnMoXG4gICAgICAgICAgICAgICAgICAob2xkTW9kZWwgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKHNmKFwiTW9kZWwgc2hvdWxkIGJlIHZhbGlkYXRhYmxlIGJ1dCBpdHMgbm90XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdFtwcm9wXSA9IGVyciBhcyBhbnk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KSA6IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IERCS2V5cywgRGVmYXVsdFNlcGFyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7XG4gIEhhc2hpbmcsXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG4gIHR5cGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IG9uQ3JlYXRlLCBvbkNyZWF0ZVVwZGF0ZSwgb25VcGRhdGUgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL0lSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IENydWRPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhc2hlcyBhIHByb3BlcnR5IHZhbHVlIGR1cmluZyBjcmVhdGUgb3IgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGhhc2ggZGVjb3JhdG9yIHRvIGFwcGx5IGhhc2hpbmcgdG8gYSBwcm9wZXJ0eSB2YWx1ZVxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBleHRlbmRpbmcgQ29udGV4dFxuICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBNZXRhZGF0YSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gaGFzaFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB7TX0gW29sZE1vZGVsXSAtIFRoZSBwcmV2aW91cyBtb2RlbCBzdGF0ZSAoZm9yIHVwZGF0ZXMpXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIGhhc2hPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0sIG9sZE1vZGVsPzogTSk6IHZvaWQge1xuICBpZiAodHlwZW9mIG1vZGVsW2tleV0gPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgY29uc3QgaGFzaCA9IEhhc2hpbmcuaGFzaCgobW9kZWwgYXMgYW55KVtrZXldKTtcbiAgaWYgKG9sZE1vZGVsICYmIChtb2RlbCBhcyBhbnkpW2tleV0gPT09IGhhc2gpIHJldHVybjtcbiAgbW9kZWxba2V5XSA9IGhhc2g7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBoYXNoZXMgYSBwcm9wZXJ0eSB2YWx1ZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgYXV0b21hdGljYWxseSBoYXNoZXMgYSBwcm9wZXJ0eSB2YWx1ZSBkdXJpbmcgY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGhhc2hcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgb25DcmVhdGVVcGRhdGUoaGFzaE9uQ3JlYXRlVXBkYXRlKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLkhBU0gpLCB7fSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0YWRhdGEgZm9yIGNvbXBvc2VkIHByb3BlcnR5IGRlY29yYXRvcnNcbiAqIEBzdW1tYXJ5IENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgcHJvcGVydHkgY29tcG9zaXRpb24gZnJvbSBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21wb3NlZEZyb21NZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gYXJncyAtIFByb3BlcnR5IG5hbWVzIHRvIGNvbXBvc2UgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlcGFyYXRvciAtIENoYXJhY3RlciB1c2VkIHRvIGpvaW4gdGhlIGNvbXBvc2VkIHZhbHVlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBoYXNoUmVzdWx0IC0gV2hldGhlciB0byBoYXNoIHRoZSBjb21wb3NlZCByZXN1bHRcbiAqIEBwcm9wZXJ0eSB7XCJrZXlzXCJ8XCJ2YWx1ZXNcIn0gdHlwZSAtIFdoZXRoZXIgdG8gdXNlIHByb3BlcnR5IGtleXMgb3IgdmFsdWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByZWZpeF0gLSBPcHRpb25hbCBwcmVmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzdWZmaXhdIC0gT3B0aW9uYWwgc3VmZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb21wb3NlZEZyb21NZXRhZGF0YSA9IHtcbiAgYXJnczogc3RyaW5nW107XG4gIHNlcGFyYXRvcjogc3RyaW5nO1xuICBoYXNoUmVzdWx0OiBib29sZWFuO1xuICB0eXBlOiBcImtleXNcIiB8IFwidmFsdWVzXCI7XG4gIHByZWZpeD86IHN0cmluZztcbiAgc3VmZml4Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9zZXMgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIG90aGVyIHByb3BlcnRpZXMgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSBjb21wb3NlZCBkZWNvcmF0b3JzIHRvIGdlbmVyYXRlIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZXh0ZW5kaW5nIENvbXBvc2VkRnJvbU1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0XG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIE1ldGFkYXRhIGZvciB0aGUgY29tcG9zaXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB0aGUgY29tcG9zZWQgdmFsdWUgb25cbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIGNvbXBvc2VkRnJvbUNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlZEZyb21DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgQ29tcG9zZWRGcm9tTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSkge1xuICB0cnkge1xuICAgIGNvbnN0IHsgYXJncywgdHlwZSwgcHJlZml4LCBzdWZmaXgsIHNlcGFyYXRvciB9ID0gZGF0YTtcbiAgICBjb25zdCBjb21wb3NlZCA9IGFyZ3MubWFwKChhcmc6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEoYXJnIGluIG1vZGVsKSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFByb3BlcnR5ICR7YXJnfSBub3QgZm91bmQgdG8gY29tcG9zZSBmcm9tYCk7XG4gICAgICBpZiAodHlwZSA9PT0gXCJrZXlzXCIpIHJldHVybiBhcmc7XG4gICAgICBpZiAodHlwZW9mIChtb2RlbCBhcyBhbnkpW2FyZ10gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke2FyZ3N9IGRvZXMgbm90IGNvbnRhaW4gYSB2YWx1ZSB0byBjb21wb3NlIGZyb21gXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gKChtb2RlbCBhcyBhbnkpW2FyZ10gYXMgYW55KS50b1N0cmluZygpO1xuICAgIH0pO1xuXG4gICAgaWYgKHByZWZpeCkgY29tcG9zZWQudW5zaGlmdChwcmVmaXgpO1xuICAgIGlmIChzdWZmaXgpIGNvbXBvc2VkLnB1c2goc3VmZml4KTtcblxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjb21wb3NlZC5qb2luKHNlcGFyYXRvcik7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gY29tcG9zZSB2YWx1ZTogJHtlfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBjb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gb3RoZXIgcHJvcGVydGllc1xuICogQHN1bW1hcnkgQmFzZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgcHJvcGVydHkgY29tcG9zaXRpb24gZGVjb3JhdG9yc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIFByb3BlcnR5IG5hbWVzIHRvIGNvbXBvc2UgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBbaGFzaFJlc3VsdD1mYWxzZV0gLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBjb21wb3NlZCB2YWx1ZXNcbiAqIEBwYXJhbSB7XCJrZXlzXCJ8XCJ2YWx1ZXNcIn0gW3R5cGU9XCJ2YWx1ZXNcIl0gLSBXaGV0aGVyIHRvIHVzZSBwcm9wZXJ0eSBrZXlzIG9yIHZhbHVlc1xuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9XCJcIl0gLSBPcHRpb25hbCBwcmVmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXg9XCJcIl0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGNvbXBvc2VkRnJvbVxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5mdW5jdGlvbiBjb21wb3NlZEZyb20oXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBoYXNoUmVzdWx0OiBib29sZWFuID0gZmFsc2UsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gRGVmYXVsdFNlcGFyYXRvcixcbiAgdHlwZTogXCJrZXlzXCIgfCBcInZhbHVlc1wiID0gXCJ2YWx1ZXNcIixcbiAgcHJlZml4ID0gXCJcIixcbiAgc3VmZml4ID0gXCJcIlxuKSB7XG4gIGNvbnN0IGRhdGE6IENvbXBvc2VkRnJvbU1ldGFkYXRhID0ge1xuICAgIGFyZ3M6IGFyZ3MsXG4gICAgaGFzaFJlc3VsdDogaGFzaFJlc3VsdCxcbiAgICBzZXBhcmF0b3I6IHNlcGFyYXRvcixcbiAgICB0eXBlOiB0eXBlLFxuICAgIHByZWZpeDogcHJlZml4LFxuICAgIHN1ZmZpeDogc3VmZml4LFxuICB9O1xuXG4gIGNvbnN0IGRlY29yYXRvcnMgPSBbXG4gICAgb25DcmVhdGVVcGRhdGUoY29tcG9zZWRGcm9tQ3JlYXRlVXBkYXRlLCBkYXRhKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLkNPTVBPU0VEKSwgZGF0YSksXG4gIF07XG4gIGlmIChoYXNoUmVzdWx0KSBkZWNvcmF0b3JzLnB1c2goaGFzaCgpKTtcbiAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgY29tcG9zZXMgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHByb3BlcnR5IGtleXNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGdlbmVyYXRlcyBhIHByb3BlcnR5IHZhbHVlIGJ5IGpvaW5pbmcgdGhlIG5hbWVzIG9mIG90aGVyIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBQcm9wZXJ0eSBuYW1lcyB0byBjb21wb3NlIGZyb21cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gQ2hhcmFjdGVyIHVzZWQgdG8gam9pbiB0aGUgcHJvcGVydHkgbmFtZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc2g9ZmFsc2VdIC0gV2hldGhlciB0byBoYXNoIHRoZSBjb21wb3NlZCByZXN1bHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PVwiXCJdIC0gT3B0aW9uYWwgcHJlZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4PVwiXCJdIC0gT3B0aW9uYWwgc3VmZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBjb21wb3NlZEZyb21LZXlzXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHlEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlZEZyb21LZXlzKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSBEZWZhdWx0U2VwYXJhdG9yLFxuICBoYXNoOiBib29sZWFuID0gZmFsc2UsXG4gIHByZWZpeCA9IFwiXCIsXG4gIHN1ZmZpeCA9IFwiXCJcbikge1xuICByZXR1cm4gY29tcG9zZWRGcm9tKGFyZ3MsIGhhc2gsIHNlcGFyYXRvciwgXCJrZXlzXCIsIHByZWZpeCwgc3VmZml4KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGNvbXBvc2VzIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGdlbmVyYXRlcyBhIHByb3BlcnR5IHZhbHVlIGJ5IGpvaW5pbmcgdGhlIHZhbHVlcyBvZiBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgY29tcG9zZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gQ2hhcmFjdGVyIHVzZWQgdG8gam9pbiB0aGUgcHJvcGVydHkgdmFsdWVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNoPWZhbHNlXSAtIFdoZXRoZXIgdG8gaGFzaCB0aGUgY29tcG9zZWQgcmVzdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD1cIlwiXSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeD1cIlwiXSAtIE9wdGlvbmFsIHN1ZmZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gY29tcG9zZWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VkKFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSBEZWZhdWx0U2VwYXJhdG9yLFxuICBoYXNoOiBib29sZWFuID0gZmFsc2UsXG4gIHByZWZpeCA9IFwiXCIsXG4gIHN1ZmZpeCA9IFwiXCJcbikge1xuICByZXR1cm4gY29tcG9zZWRGcm9tKGFyZ3MsIGhhc2gsIHNlcGFyYXRvciwgXCJ2YWx1ZXNcIiwgcHJlZml4LCBzdWZmaXgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIGEgdmVyc2lvbiBwcm9wZXJ0eSBkdXJpbmcgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIGNhbGxiYWNrIGZvciBpbmNyZW1lbnRpbmcgdmVyc2lvbiBudW1iZXJzXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gKENSRUFURSBvciBVUERBVEUpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgdGhlIHZlcnNpb24gcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgZXh0ZW5kaW5nIENvbnRleHRcbiAqIEBmdW5jdGlvbiB2ZXJzaW9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHZlcnNpb25DcmVhdGVVcGRhdGVcbiAqXG4gKiAgIENhbGxlci0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IG9wZXJhdGlvblxuICogICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLS0+PkNhbGxlcjogY2FsbGJhY2sgZnVuY3Rpb25cbiAqICAgTm90ZSBvdmVyIENhbGxlcix2ZXJzaW9uQ3JlYXRlVXBkYXRlOiBXaGVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkOlxuICogICBDYWxsZXItPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIGFsdCBvcGVyYXRpb24gaXMgQ1JFQVRFXG4gKiAgICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IHNldCB2ZXJzaW9uIHRvIDFcbiAqICAgZWxzZSBvcGVyYXRpb24gaXMgVVBEQVRFXG4gKiAgICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IGluY3JlbWVudCB2ZXJzaW9uXG4gKiAgIGVsc2UgaW52YWxpZCBvcGVyYXRpb25cbiAqICAgICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogdGhyb3cgZXJyb3JcbiAqICAgZW5kXG4gKiAgIHZlcnNpb25DcmVhdGVVcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uQ3JlYXRlVXBkYXRlKG9wZXJhdGlvbjogQ3J1ZE9wZXJhdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcnNpb25DcmVhdGVVcGRhdGU8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWIGV4dGVuZHMgb2JqZWN0LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+KHRoaXM6IFIsIGNvbnRleHQ6IEMsIGRhdGE6IFYsIGtleToga2V5b2YgTSwgbW9kZWw6IE0pIHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkNSRUFURTpcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVtrZXldID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgICAobW9kZWwgYXMgYW55KVtrZXldKys7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEludmFsaWQgb3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSB2ZXJzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIGZvciB2ZXJzaW9uaW5nIGEgcHJvcGVydHkgaW4gYSBtb2RlbFxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtdWx0aXBsZSBzdWItZGVjb3JhdG9ycyB0byBoYW5kbGUgdmVyc2lvbiBtYW5hZ2VtZW50IGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgdHlwZSB0byBOdW1iZXIsIG1hbmFnZXMgdmVyc2lvbiB1cGRhdGVzLCBhbmQgYWRkcyB2ZXJzaW9uaW5nIG1ldGFkYXRhXG4gKiBAZnVuY3Rpb24gdmVyc2lvblxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbigpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgIHR5cGUoTnVtYmVyLm5hbWUpLFxuICAgIG9uQ3JlYXRlKHZlcnNpb25DcmVhdGVVcGRhdGUoT3BlcmF0aW9uS2V5cy5DUkVBVEUpKSxcbiAgICBvblVwZGF0ZSh2ZXJzaW9uQ3JlYXRlVXBkYXRlKE9wZXJhdGlvbktleXMuVVBEQVRFKSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5WRVJTSU9OKSwgdHJ1ZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgdHJhbnNpZW50XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBpbmRpY2F0ZXMgYSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiB0cmFuc2llbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zaWVudCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyYW5zaWVudChtb2RlbDogYW55LCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKSwgdHJ1ZSkobW9kZWwsIGF0dHJpYnV0ZSk7XG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5UUkFOU0lFTlQpLCB0cnVlKShtb2RlbC5jb25zdHJ1Y3Rvcik7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBNb2RlbCxcbiAgTW9kZWxFcnJvckRlZmluaXRpb24sXG4gIHZhbGlkYXRlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIGNoZWNrcyBmb3IgZXJyb3JzXG4gKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgbW9kZWwgc3RhdGUgYW5kIG9wdGlvbmFsbHkgY29tcGFyZXMgd2l0aCBhIHByZXZpb3VzIHZlcnNpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7TXxhbnl9IFtwcmV2aW91c1ZlcnNpb25dIC0gT3B0aW9uYWwgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgbW9kZWwgZm9yIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7Li4uYW55W119IGV4Y2x1c2lvbnMgLSBQcm9wZXJ0aWVzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbnx1bmRlZmluZWR9IEVycm9yIGRlZmluaXRpb24gaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIGhhc0Vycm9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmltcG9ydCB7IHZhbGlkYXRlQ29tcGFyZSB9IGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcblxuTW9kZWwucHJvdG90eXBlLmhhc0Vycm9ycyA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0aGlzOiBNLFxuICBwcmV2aW91c1ZlcnNpb24/OiBNIHwgYW55LFxuICAuLi5leGNsdXNpb25zOiBhbnlbXVxuKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAocHJldmlvdXNWZXJzaW9uICYmICEocHJldmlvdXNWZXJzaW9uIGluc3RhbmNlb2YgTW9kZWwpKSB7XG4gICAgZXhjbHVzaW9ucy51bnNoaWZ0KHByZXZpb3VzVmVyc2lvbik7XG4gICAgcHJldmlvdXNWZXJzaW9uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZXJycyA9IHZhbGlkYXRlKHRoaXMsIC4uLmV4Y2x1c2lvbnMpO1xuICBpZiAoZXJycyB8fCAhcHJldmlvdXNWZXJzaW9uKSByZXR1cm4gZXJycztcblxuICByZXR1cm4gdmFsaWRhdGVDb21wYXJlKHByZXZpb3VzVmVyc2lvbiwgdGhpcywgLi4uZXhjbHVzaW9ucyk7XG59O1xuIiwiaW1wb3J0IHtcbiAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlLFxuICBSZXBvc2l0b3J5LFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG59IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBtb2RlbCBpcyBtYXJrZWQgYXMgdHJhbnNpZW50XG4gKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgYSBtb2RlbCBjbGFzcyBoYXMgYmVlbiBkZWNvcmF0ZWQgd2l0aCB0aGUgdHJhbnNpZW50IGRlY29yYXRvclxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbW9kZWwgaXMgdHJhbnNpZW50LCBmYWxzZSBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiBpc1RyYW5zaWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zaWVudDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIHJldHVybiAhIShcbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5UUkFOU0lFTlQpLCBtb2RlbC5jb25zdHJ1Y3RvcikgfHxcbiAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksXG4gICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXBhcmF0ZXMgdHJhbnNpZW50IHByb3BlcnRpZXMgZnJvbSBhIG1vZGVsXG4gKiBAc3VtbWFyeSBFeHRyYWN0cyBwcm9wZXJ0aWVzIG1hcmtlZCBhcyB0cmFuc2llbnQgaW50byBhIHNlcGFyYXRlIG9iamVjdFxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcm9jZXNzXG4gKiBAcmV0dXJuIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBtb2RlbCB3aXRob3V0IHRyYW5zaWVudCBwcm9wZXJ0aWVzIGFuZCBhIHNlcGFyYXRlIHRyYW5zaWVudCBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgd2l0aCB0cmFuc2llbnQgcHJvcGVydGllcyByZW1vdmVkXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFt0cmFuc2llbnRdIC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gbW9kZWxUb1RyYW5zaWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBtb2RlbFRvVHJhbnNpZW50XG4gKiAgIHBhcnRpY2lwYW50IGlzVHJhbnNpZW50XG4gKiAgIHBhcnRpY2lwYW50IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICpcbiAqICAgQ2FsbGVyLT4+bW9kZWxUb1RyYW5zaWVudDogbW9kZWxcbiAqICAgbW9kZWxUb1RyYW5zaWVudC0+PmlzVHJhbnNpZW50OiBjaGVjayBpZiBtb2RlbCBpcyB0cmFuc2llbnRcbiAqICAgaXNUcmFuc2llbnQtLT4+bW9kZWxUb1RyYW5zaWVudDogdHJhbnNpZW50IHN0YXR1c1xuICogICBhbHQgbW9kZWwgaXMgbm90IHRyYW5zaWVudFxuICogICAgIG1vZGVsVG9UcmFuc2llbnQtLT4+Q2FsbGVyOiB7bW9kZWx9XG4gKiAgIGVsc2UgbW9kZWwgaXMgdHJhbnNpZW50XG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0+PmdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZTogZ2V0IHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gKiAgICAgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlLS0+Pm1vZGVsVG9UcmFuc2llbnQ6IHByb3BlcnR5IGRlY29yYXRvcnNcbiAqICAgICBtb2RlbFRvVHJhbnNpZW50LT4+bW9kZWxUb1RyYW5zaWVudDogc2VwYXJhdGUgcHJvcGVydGllc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtPj5Nb2RlbC5idWlsZDogcmVidWlsZCBtb2RlbCB3aXRob3V0IHRyYW5zaWVudCBwcm9wc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtLT4+Q2FsbGVyOiB7bW9kZWwsIHRyYW5zaWVudH1cbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFRvVHJhbnNpZW50PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNXG4pOiB7IG1vZGVsOiBNOyB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0ge1xuICBpZiAoIWlzVHJhbnNpZW50KG1vZGVsKSkgcmV0dXJuIHsgbW9kZWw6IG1vZGVsIH07XG4gIGNvbnN0IGRlY3M6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZShcbiAgICBtb2RlbCxcbiAgICB1bmRlZmluZWQsXG4gICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVClcbiAgKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG5cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoZGVjcykucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VtOiB7IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0sXG4gICAgICBbaywgdmFsXVxuICAgICkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNpZW50ID0gdmFsLmZpbmQoKGVsKSA9PiBlbC5rZXkgPT09IFwiXCIpO1xuICAgICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgICBhY2N1bS50cmFuc2llbnQgPSBhY2N1bS50cmFuc2llbnQgfHwge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWNjdW0udHJhbnNpZW50W2tdID0gbW9kZWxbayBhcyBrZXlvZiBNXTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSB0cmFuc2llbnQgcHJvcGVydHkgJHtrfTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2N1bS5tb2RlbCA9IGFjY3VtLm1vZGVsIHx8IHt9O1xuICAgICAgICBhY2N1bS5tb2RlbFtrXSA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHt9IGFzIHsgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfVxuICApO1xuICByZXN1bHQubW9kZWwgPSBNb2RlbC5idWlsZChyZXN1bHQubW9kZWwsIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpO1xuICByZXR1cm4gcmVzdWx0IGFzIHsgbW9kZWw6IE07IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEYXRhYmFzZSBkZWNvcmF0b3JzIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb21wcmVoZW5zaXZlIGxpYnJhcnkgcHJvdmlkaW5nIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucywgbW9kZWwgZGVmaW5pdGlvbnMsIHZhbGlkYXRpb24sIGFuZCByZXBvc2l0b3J5IHBhdHRlcm5zIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAbW9kdWxlIGRiLWRlY29yYXRvcnNcbiAqL1xuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkRlY29yYXRvck1lc3NhZ2VzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUVBOzs7OztBQUtHO0FBQ1UsTUFBQSxNQUFNLEdBQUc7QUFDcEIsSUFBQSxPQUFPLEVBQUUsQ0FBQSxFQUFHLFNBQVMsQ0FBQyxPQUFPLENBQWMsWUFBQSxDQUFBO0FBQzNDLElBQUEsVUFBVSxFQUFFLFlBQVk7QUFDeEIsSUFBQSxLQUFLLEVBQUUsUUFBUTtBQUNmLElBQUEsRUFBRSxFQUFFLElBQUk7QUFDUixJQUFBLEtBQUssRUFBRSxPQUFPO0FBQ2QsSUFBQSxNQUFNLEVBQUUsUUFBUTtBQUNoQixJQUFBLFNBQVMsRUFBRSxXQUFXO0FBQ3RCLElBQUEsUUFB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
|
|
2832
|
+
export { BaseError, BaseRepository, BulkCrudOperationKeys, ConflictError, Context, DBKeys, DBOperations, DEFAULT_ERROR_MESSAGES, DEFAULT_TIMESTAMP_FORMAT, DefaultContextFactory, DefaultRepositoryFlags, DefaultSeparator, InternalError, NotFoundError, OperationKeys, Operations, OperationsRegistry, ReadOnlyValidator, Repository, SerializationError, TimestampValidator, UpdateValidationKeys, UpdateValidator, VERSION, ValidationError, after, afterAny, afterCreate, afterCreateUpdate, afterDelete, afterRead, afterUpdate, composed, composedFromCreateUpdate, composedFromKeys, enforceDBDecorators, findModelId, findPrimaryKey, getAllPropertyDecoratorsRecursive, getDbDecorators, getHandlerArgs, getValidatableUpdateProps, hash, hashOnCreateUpdate, id, isTransient, modelToTransient, on, onAny, onCreate, onCreateUpdate, onDelete, onRead, onUpdate, operation, prefixMethod, readonly, serialize, serializeAfterAll, serializeOnCreateUpdate, suffixMethod, timestamp, timestampHandler, transient, validateCompare, validateDecorator, validateDecorators, version, versionCreateUpdate, wrapMethodWithContext };
|
|
2833
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGVjb3JhdG9ycy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvbW9kZWwvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vY29uc3RhbnRzLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9SZWFkT25seVZhbGlkYXRvci50cyIsIi4uL3NyYy92YWxpZGF0aW9uL3ZhbGlkYXRvcnMvVGltZXN0YW1wVmFsaWRhdG9yLnRzIiwiLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy9VcGRhdGVWYWxpZGF0b3IudHMiLCIuLi9zcmMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvT3BlcmF0aW9uc1JlZ2lzdHJ5LnRzIiwiLi4vc3JjL29wZXJhdGlvbnMvT3BlcmF0aW9ucy50cyIsIi4uL3NyYy9vcGVyYXRpb25zL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9lcnJvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS91dGlscy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L0NvbnRleHQudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS93cmFwcGVycy50cyIsIi4uL3NyYy9pZGVudGl0eS91dGlscy50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L0Jhc2VSZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvUmVwb3NpdG9yeS50cyIsIi4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvbW9kZWwvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL21vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGF0YWJhc2UgcmVmbGVjdGlvbiBrZXlzXG4gKiBAc3VtbWFyeSBDb2xsZWN0aW9uIG9mIGtleXMgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSBpbiBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAY29uc3QgREJLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERCS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9cGVyc2lzdGVuY2UuYCxcbiAgUkVQT1NJVE9SWTogXCJyZXBvc2l0b3J5XCIsXG4gIENMQVNTOiBcIl9jbGFzc1wiLFxuICBJRDogXCJpZFwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxuICBVTklRVUU6IFwidW5pcXVlXCIsXG4gIFNFUklBTElaRTogXCJzZXJpYWxpemVcIixcbiAgUkVBRE9OTFk6IFwicmVhZG9ubHlcIixcbiAgVElNRVNUQU1QOiBcInRpbWVzdGFtcFwiLFxuICBUUkFOU0lFTlQ6IFwidHJhbnNpZW50XCIsXG4gIEhBU0g6IFwiaGFzaFwiLFxuICBDT01QT1NFRDogXCJjb21wb3NlZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgT1JJR0lOQUw6IFwiX19vcmlnaW5hbE9ialwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBzZXBhcmF0b3IgY2hhcmFjdGVyIGZvciBjb21wb3NpdGUgaW5kZXhlc1xuICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGNoYXJhY3RlciB1c2VkIHdoZW4gY29uY2F0ZW5hdGluZyBtdWx0aXBsZSBmaWVsZHMgaW50byBhIHNpbmdsZSBpbmRleFxuICogQGNvbnN0IERlZmF1bHRTZXBhcmF0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFNlcGFyYXRvciA9IFwiX1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZvcm1hdCBmb3IgdGltZXN0YW1wIGZpZWxkc1xuICogQHN1bW1hcnkgU3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIHRpbWVzdGFtcCBmaWVsZHMgaW4gZGF0YWJhc2UgbW9kZWxzXG4gKiBAY29uc3QgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCA9IFwiZGQvTU0veXl5eSBISDptbTpzczpTXCI7XG4iLCJpbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyB1c2VkIGJ5IHZhbGlkYXRvcnMuXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgdmFyaW91cyB2YWxpZGF0aW9uIHNjZW5hcmlvcyBpbmNsdWRpbmcgSUQgdmFsaWRhdGlvbiwgcmVhZG9ubHkgcHJvcGVydGllcywgYW5kIHRpbWVzdGFtcHMuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFcnJvck1lc3NhZ2VzXG4gKiBAcHJvcGVydHkge09iamVjdH0gSUQgLSBFcnJvciBtZXNzYWdlcyBmb3IgSUQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IElELklOVkFMSUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYW4gSUQgaXMgaW52YWxpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IElELlJFUVVJUkVEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGFuIElEIGlzIG1pc3NpbmdcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBSRUFET05MWSAtIEVycm9yIG1lc3NhZ2VzIGZvciByZWFkb25seSBwcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRE9OTFkuSU5WQUxJRCAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHVwZGF0ZSBhIHJlYWRvbmx5IHByb3BlcnR5XG4gKiBAcHJvcGVydHkge09iamVjdH0gVElNRVNUQU1QIC0gRXJyb3IgbWVzc2FnZXMgZm9yIHRpbWVzdGFtcCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QLlJFUVVJUkVEIC0gRXJyb3IgbWVzc2FnZSB3aGVuIGEgdGltZXN0YW1wIGlzIG1pc3NpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUSU1FU1RBTVAuREFURSAtIEVycm9yIG1lc3NhZ2Ugd2hlbiBhIHRpbWVzdGFtcCBpcyBub3QgYSB2YWxpZCBkYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QLklOVkFMSUQgLSBFcnJvciBtZXNzYWdlIHdoZW4gYSB0aW1lc3RhbXAgaXMgbm90IGluY3JlYXNpbmdcbiAqIEBjb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgPSB7XG4gIElEOiB7XG4gICAgSU5WQUxJRDogXCJUaGlzIElkIGlzIGludmFsaWRcIixcbiAgICBSRVFVSVJFRDogXCJUaGUgSWQgaXMgbWFuZGF0b3J5XCIsXG4gIH0sXG4gIFJFQURPTkxZOiB7XG4gICAgSU5WQUxJRDogXCJUaGlzIGNhbm5vdCBiZSB1cGRhdGVkXCIsXG4gIH0sXG4gIFRJTUVTVEFNUDoge1xuICAgIFJFUVVJUkVEOiBcIlRpbWVzdGFtcCBpcyBNYW5kYXRvcnlcIixcbiAgICBEQVRFOiBcIlRoZSBUaW1lc3RhbXAgbXVzdCB0aGUgYSB2YWxpZCBkYXRlXCIsXG4gICAgSU5WQUxJRDogXCJUaGlzIHZhbHVlIG11c3QgYWx3YXlzIGluY3JlYXNlXCIsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgdXNlZCBmb3IgcmVmbGVjdGlvbi1iYXNlZCB2YWxpZGF0aW9uIGR1cmluZyB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEtleXMgdXNlZCBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWxpZGF0aW9uIG1ldGFkYXRhIG9uIG1vZGVsIHByb3BlcnRpZXMgZHVyaW5nIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbktleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIC0gQmFzZSByZWZsZWN0aW9uIGtleSBwcmVmaXggZm9yIHVwZGF0ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRVNUQU1QIC0gS2V5IGZvciB0aW1lc3RhbXAgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFQURPTkxZIC0gS2V5IGZvciByZWFkb25seSBwcm9wZXJ0eSB2YWxpZGF0aW9uXG4gKiBAY29uc3QgVXBkYXRlVmFsaWRhdGlvbktleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVXBkYXRlVmFsaWRhdGlvbktleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiZGIudXBkYXRlLnZhbGlkYXRpb24uXCIsXG4gIFRJTUVTVEFNUDogREJLZXlzLlRJTUVTVEFNUCxcbiAgUkVBRE9OTFk6IERCS2V5cy5SRUFET05MWSxcbn07XG4iLCJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVhZG9ubHkgY2Fubm90IGJlIG1vZGlmaWVkIGR1cmluZyB1cGRhdGVzLlxuICogQHN1bW1hcnkgVmFsaWRhdG9yIGZvciB0aGUge0BsaW5rIHJlYWRvbmx5fSBkZWNvcmF0b3IgdGhhdCBjaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGR1cmluZyBhbiB1cGRhdGUgb3BlcmF0aW9uLiBJdCBjb21wYXJlcyB0aGUgbmV3IHZhbHVlIHdpdGggdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWRcbiAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgUmVhZE9ubHlWYWxpZGF0b3Igd2l0aCBhIHJlYWRvbmx5IHByb3BlcnR5XG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQHJlYWRvbmx5KClcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICogICAgIHRoaXMuaWQgPSBpZDtcbiAqICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoJzEyMycsICdKb2huJyk7XG4gKiB1c2VyLmlkID0gJzQ1Nic7IC8vIFdpbGwgYmUgcHJldmVudGVkIGJ5IFJlYWRPbmx5VmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFQURPTkxZKVxuZXhwb3J0IGNsYXNzIFJlYWRPbmx5VmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5SRUFET05MWS5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQWx3YXlzIHJldHVybnMgdW5kZWZpbmVkIGFzIHRoaXMgdmFsaWRhdG9yIG9ubHkgd29ya3MgZHVyaW5nIHVwZGF0ZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgaGFzRXJyb3JzKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZCBkdXJpbmcgYW4gdXBkYXRlIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIGEgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSB1c2luZyBkZWVwIGVxdWFsaXR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgbmV3IHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQW4gZXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgb2xkVmFsdWUpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0aGlzLmdldE1lc3NhZ2UobWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB2YWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFVwZGF0ZVZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZhbGlkYXRvciB0aGF0IGVuc3VyZXMgdGltZXN0YW1wIHZhbHVlcyBhcmUgb25seSB1cGRhdGVkIHdpdGggbmV3ZXIgdGltZXN0YW1wcy5cbiAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgdXBkYXRlIG9mIGEgdGltZXN0YW1wIGJ5IGNvbXBhcmluZyB0aGUgbmV3IHRpbWVzdGFtcCB3aXRoIHRoZSBvbGQgb25lLCBlbnN1cmluZyB0aGUgbmV3IHRpbWVzdGFtcCBpcyBtb3JlIHJlY2VudC5cbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aW1lc3RhbXAgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBUaW1lc3RhbXBWYWxpZGF0b3Igd2l0aCBhIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogY2xhc3MgRG9jdW1lbnQge1xuICogICBAdGltZXN0YW1wKClcbiAqICAgdXBkYXRlZEF0OiBEYXRlO1xuICogICBcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcpIHtcbiAqICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gKiAgICAgdGhpcy51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHZhbGlkYXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gdXBkYXRlIHdpdGggYW4gb2xkZXIgdGltZXN0YW1wXG4gKiBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQoJ015IERvY3VtZW50Jyk7XG4gKiBjb25zdCBvbGREYXRlID0gbmV3IERhdGUoMjAyMCwgMCwgMSk7XG4gKiBkb2MudXBkYXRlZEF0ID0gb2xkRGF0ZTsgLy8gV2lsbCBiZSBwcmV2ZW50ZWQgYnkgVGltZXN0YW1wVmFsaWRhdG9yXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFVwZGF0ZVZhbGlkYXRpb25LZXlzLlRJTUVTVEFNUClcbmV4cG9ydCBjbGFzcyBUaW1lc3RhbXBWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5JTlZBTElEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIGJhc2UgdmFsaWRhdG9yJ3MgaGFzRXJyb3JzIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgYnkgdGhlIFZhbGlkYXRvciBpbnRlcmZhY2UgYnV0IG5vdCB1c2VkIGluIHRoaXMgdmFsaWRhdG9yIGFzIHZhbGlkYXRpb24gb25seSBoYXBwZW5zIGR1cmluZyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFsd2F5cyByZXR1cm5zIHVuZGVmaW5lZCBhcyB0aGlzIHZhbGlkYXRvciBvbmx5IHdvcmtzIGR1cmluZyB1cGRhdGVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGhhc0Vycm9ycyh2YWx1ZTogYW55LCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIHRoYXQgYSB0aW1lc3RhbXAgaXMgbmV3ZXIgdGhhbiBpdHMgcHJldmlvdXMgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiBhIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggYSBtb3JlIHJlY2VudCB2YWx1ZSBieSBjb252ZXJ0aW5nIGJvdGggdmFsdWVzIHRvIERhdGUgb2JqZWN0cyBhbmQgY29tcGFyaW5nIHRoZW0uXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIFRoZSBuZXcgdGltZXN0YW1wIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd8bnVtYmVyfSBvbGRWYWx1ZSAtIFRoZSBvcmlnaW5hbCB0aW1lc3RhbXAgdG8gY29tcGFyZSBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscyAobmV3IHRpbWVzdGFtcCBpcyBub3QgbmV3ZXIpLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG9sZFZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgdGhpcy5nZXRNZXNzYWdlKG1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIG9sZFZhbHVlID0gbmV3IERhdGUob2xkVmFsdWUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA8PSBvbGRWYWx1ZSA/IG1lc3NhZ2UgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMgYXMgRGVjb3JhdG9yTWVzc2FnZXMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2YWxpZGF0b3JzIHRoYXQgY29tcGFyZSBuZXcgdmFsdWVzIHdpdGggb2xkIHZhbHVlcyBkdXJpbmcgdXBkYXRlcy5cbiAqIEBzdW1tYXJ5IEJhc2UgY2xhc3MgZm9yIGFuIFVwZGF0ZSB2YWxpZGF0b3IgdGhhdCBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW1wbGVtZW50aW5nIHZhbGlkYXRpb24gbG9naWMgdGhhdCBjb21wYXJlcyBhIG5ldyB2YWx1ZSB3aXRoIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBFcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgRGVjb3JhdG9yTWVzc2FnZXMjREVGQVVMVH1cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthY2NlcHRlZFR5cGVzXSAtIFRoZSBhY2NlcHRlZCB2YWx1ZSB0eXBlcyBieSB0aGUgZGVjb3JhdG9yXG4gKiBAY2xhc3MgVXBkYXRlVmFsaWRhdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXh0ZW5kaW5nIFVwZGF0ZVZhbGlkYXRvciB0byBjcmVhdGUgYSBjdXN0b20gdmFsaWRhdG9yXG4gKiBjbGFzcyBNeUN1c3RvbVZhbGlkYXRvciBleHRlbmRzIFVwZGF0ZVZhbGlkYXRvciB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwiQ3VzdG9tIHZhbGlkYXRpb24gZmFpbGVkXCIpO1xuICogICB9XG4gKiAgIFxuICogICBwdWJsaWMgdXBkYXRlSGFzRXJyb3JzKHZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIC8vIEN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljXG4gKiAgICAgaWYgKHZhbHVlID09PSBvbGRWYWx1ZSkge1xuICogICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogICBcbiAqICAgaGFzRXJyb3JzKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICogICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE5vdCB1c2VkIGZvciB1cGRhdGUgdmFsaWRhdG9yc1xuICogICB9XG4gKiB9XG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVXBkYXRlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERlY29yYXRvck1lc3NhZ2VzLkRFRkFVTFQsXG4gICAgLi4uYWNjZXB0ZWRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgLi4uYWNjZXB0ZWRUeXBlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBwZXJmb3JtIHVwZGF0ZSB2YWxpZGF0aW9uLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgYSB2YWx1ZSBieSBjb21wYXJpbmcgaXQgdG8gaXRzIG9sZCB2ZXJzaW9uIHRvIGRldGVybWluZSBpZiB0aGUgdXBkYXRlIGlzIHZhbGlkLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgbmV3IHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7YW55fSBvbGRWYWx1ZSAtIFRoZSBwcmV2aW91cyB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIG5lZWRlZCBmb3IgdmFsaWRhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEFuIGVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdXBkYXRlSGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQge1xuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRvckRlZmluaXRpb24sXG4gIElWYWxpZGF0b3JSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVXBkYXRlVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciB1cGRhdGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIG1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zIGZvciB1cGRhdGUgdmFsaWRhdGlvbiBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSB1cGRhdGUgdmFsaWRhdGlvbiBwcmVmaXguXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wbGV0ZSBtZXRhZGF0YSBrZXkgZm9yIHVwZGF0ZSB2YWxpZGF0aW9uXG4gKiBAZnVuY3Rpb24gdXBkYXRlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuVmFsaWRhdGlvbi51cGRhdGVLZXkgPSBmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1QgKyBrZXk7XG59O1xuXG5kZWNsYXJlIG1vZHVsZSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGRlY2xhcmUgY2xhc3MgVmFsaWRhdGlvbiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nVmFsaWRhdG9yUmVnaXN0cnk/O1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKTtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhY3RpbmcgVmFsaWRhdG9yUmVnaXN0cnlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SVZhbGlkYXRvclJlZ2lzdHJ5fSB2YWxpZGF0b3JSZWdpc3RyeSB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWxpZGF0b3IgUmVnaXN0cnlcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFZhbGlkYXRvcik6IFZhbGlkYXRvcn0gW21pZ3JhdGlvbkhhbmRsZXJdIHRoZSBtZXRob2QgdG8gbWFwIHRoZSB2YWxpZGF0b3IgaWYgcmVxdWlyZWQ7XG4gICAgICovXG4gICAgc3RhdGljIHNldFJlZ2lzdHJ5KFxuICAgICAgdmFsaWRhdG9yUmVnaXN0cnk6IElWYWxpZGF0b3JSZWdpc3RyeTxWYWxpZGF0b3I+LFxuICAgICAgbWlncmF0aW9uSGFuZGxlcj86ICh2YWxpZGF0b3I6IFZhbGlkYXRvcikgPT4gVmFsaWRhdG9yXG4gICAgKTogdm9pZDtcbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIElWYWxpZGF0b3JSZWdpc3RyeSwgZGVmYXVsdHMgdG8ge0BsaW5rIFZhbGlkYXRvclJlZ2lzdHJ5fVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5O1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHZhbGlkYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbGlkYXRvcktleSBvbmUgb2YgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5c31cbiAgICAgKiBAcmV0dXJuIHtWYWxpZGF0b3IgfCB1bmRlZmluZWR9IHRoZSByZWdpc3RlcmVkIFZhbGlkYXRvciBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm9ubyBtYXRjaGluZyB0aGUgcHJvdmlkZWQga2V5XG4gICAgICovXG4gICAgc3RhdGljIGdldDxUIGV4dGVuZHMgVmFsaWRhdG9yPih2YWxpZGF0b3JLZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2YWxpZGF0b3JzIG9udG8gdGhlIHJlZ2lzdHJ5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RbXSB8IFZhbGlkYXRvckRlZmluaXRpb25bXX0gdmFsaWRhdG9yXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgICAgLi4udmFsaWRhdG9yOiAoVmFsaWRhdG9yRGVmaW5pdGlvbiB8IFQpW11cbiAgICApOiB2b2lkO1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUga2V5IHRvIHN0b3JlIGFzIE1ldGFkYXRhIHVuZGVyIFJlZmxlY3Rpb25zXG4gICAgICogQGRlc2NyaXB0aW9uIGNvbmNhdGVuYXRlcyB7QGxpbmsgVmFsaWRhdGlvbktleXMjUkVGTEVDVH0gd2l0aCB0aGUgcHJvdmlkZWQga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICovXG4gICAgc3RhdGljIGtleShrZXk6IHN0cmluZyk6IHN0cmluZztcblxuICAgIHN0YXRpYyB1cGRhdGVLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERhdGFiYXNlIG9wZXJhdGlvbiBrZXkgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIENSVUQgb3BlcmF0aW9ucyBhbmQgdGhlaXIgbGlmZWN5Y2xlIHBoYXNlc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBlbnVtIE9wZXJhdGlvbktleXMge1xuICBSRUZMRUNUID0gXCJkZWNhZi5tb2RlbC5kYi5vcGVyYXRpb25zLlwiLFxuICBDUkVBVEUgPSBcImNyZWF0ZVwiLFxuICBSRUFEID0gXCJyZWFkXCIsXG4gIFVQREFURSA9IFwidXBkYXRlXCIsXG4gIERFTEVURSA9IFwiZGVsZXRlXCIsXG4gIE9OID0gXCJvbi5cIixcbiAgQUZURVIgPSBcImFmdGVyLlwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGZvciBiYXNpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFVuaW9uIHR5cGUgb2YgdGhlIGZvdXIgYmFzaWMgZGF0YWJhc2Ugb3BlcmF0aW9uczogY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZVxuICogQHR5cGVkZWYge3N0cmluZ30gQ3J1ZE9wZXJhdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDcnVkT3BlcmF0aW9ucyA9XG4gIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICB8IE9wZXJhdGlvbktleXMuREVMRVRFO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCdWxrIGRhdGFiYXNlIG9wZXJhdGlvbiBrZXkgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIGJ1bGsgQ1JVRCBvcGVyYXRpb25zIGZvciBoYW5kbGluZyBtdWx0aXBsZSByZWNvcmRzIGF0IG9uY2VcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZW51bSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMge1xuICBDUkVBVEVfQUxMID0gXCJjcmVhdGVBbGxcIixcbiAgUkVBRF9BTEwgPSBcInJlYWRBbGxcIixcbiAgVVBEQVRFX0FMTCA9IFwidXBkYXRlQWxsXCIsXG4gIERFTEVURV9BTEwgPSBcImRlbGV0ZUFsbFwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGZvciBidWxrIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgVW5pb24gdHlwZSBvZiB0aGUgZm91ciBidWxrIGRhdGFiYXNlIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIG11bHRpcGxlIHJlY29yZHMgYXQgb25jZVxuICogQHR5cGVkZWYge3N0cmluZ30gQnVsa0NydWRPcGVyYXRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQnVsa0NydWRPcGVyYXRpb25zID1cbiAgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTFxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTFxuICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMXG4gIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdyb3VwZWQgQ1JVRCBvcGVyYXRpb25zIGZvciBkZWNvcmF0b3IgbWFwcGluZ1xuICogQHN1bW1hcnkgTWFwcyBvdXQgZ3JvdXBzIG9mIENSVUQgb3BlcmF0aW9ucyBmb3IgZWFzaWVyIG1hcHBpbmcgb2YgZGVjb3JhdG9yc1xuICogQGNvbnN0IERCT3BlcmF0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEQk9wZXJhdGlvbnM6IFJlY29yZDxzdHJpbmcsIENydWRPcGVyYXRpb25zW10+ID0ge1xuICBDUkVBVEU6IFtPcGVyYXRpb25LZXlzLkNSRUFURV0sXG4gIFJFQUQ6IFtPcGVyYXRpb25LZXlzLlJFQURdLFxuICBVUERBVEU6IFtPcGVyYXRpb25LZXlzLlVQREFURV0sXG4gIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFXSxcbiAgQ1JFQVRFX1VQREFURTogW09wZXJhdGlvbktleXMuQ1JFQVRFLCBPcGVyYXRpb25LZXlzLlVQREFURV0sXG4gIFJFQURfQ1JFQVRFOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLkNSRUFURV0sXG4gIEFMTDogW1xuICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgXSxcbn07XG4iLCJpbXBvcnQgeyBPcGVyYXRpb25IYW5kbGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE9wZXJhdGlvbnMgfSBmcm9tIFwiLi9PcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgTWFuYWdlcyBhbmQgc3RvcmVzIG9wZXJhdGlvbiBoYW5kbGVycyBmb3IgZGlmZmVyZW50IG1vZGVsIHByb3BlcnRpZXMgYW5kIG9wZXJhdGlvbnNcbiAqIEBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnlcbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZVxuICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGVcbiAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHJlZ2lzdHJ5IGFuZCByZWdpc3RlciBhIGhhbmRsZXJcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE9wZXJhdGlvbnNSZWdpc3RyeSgpO1xuICogcmVnaXN0cnkucmVnaXN0ZXIobXlIYW5kbGVyLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdGFyZ2V0TW9kZWwsICdwcm9wZXJ0eU5hbWUnKTtcbiAqXG4gKiAvLyBHZXQgaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uXG4gKiBjb25zdCBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldCh0YXJnZXRNb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCAncHJvcGVydHlOYW1lJywgJ29uQ3JlYXRlJyk7XG4gKlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnkge1xuICogICAgIC1jYWNoZTogUmVjb3JkfnN0cmluZywgUmVjb3JkfnN0cmluZ3xzeW1ib2wsIFJlY29yZH5zdHJpbmcsIFJlY29yZH5zdHJpbmcsIE9wZXJhdGlvbkhhbmRsZXJ+fn5+XG4gKiAgICAgK2dldCh0YXJnZXQsIHByb3BLZXksIG9wZXJhdGlvbiwgYWNjdW0pXG4gKiAgICAgK3JlZ2lzdGVyKGhhbmRsZXIsIG9wZXJhdGlvbiwgdGFyZ2V0LCBwcm9wS2V5KVxuICogICB9XG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25zUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyB8IHN5bWJvbCxcbiAgICAgIFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+Pj5cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvcGVyYXRpb24gaGFuZGxlcnMgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgRmluZHMgYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGZyb20gcGFyZW50IGNsYXNzZXNcbiAgICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAgICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFncyBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gICAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBjbGFzcyBuYW1lIG9yIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXJbXX0gW2FjY3VtXSAtIEFjY3VtdWxhdG9yIGZvciByZWN1cnNpdmUgY2FsbHNcbiAgICogQHJldHVybiB7T3BlcmF0aW9uSGFuZGxlcltdIHwgdW5kZWZpbmVkfSBBcnJheSBvZiBoYW5kbGVycyBvciB1bmRlZmluZWQgaWYgbm9uZSBmb3VuZFxuICAgKi9cbiAgZ2V0PFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgVixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIHRhcmdldDogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwcm9wS2V5OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgYWNjdW0/OiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W11cbiAgKTogT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPltdIHwgdW5kZWZpbmVkIHtcbiAgICBhY2N1bSA9IGFjY3VtIHx8IFtdO1xuICAgIGxldCBuYW1lO1xuICAgIHRyeSB7XG4gICAgICBuYW1lID0gdHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIiA/IHRhcmdldCA6IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgYWNjdW0udW5zaGlmdChcbiAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyh0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl0gfHwgW10pXG4gICAgICApO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICB0YXJnZXQgPT09IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH1cblxuICAgIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICAgIGlmIChwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKSBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXQ8TSwgUiwgViwgRiwgQz4ocHJvdG8sIHByb3BLZXksIG9wZXJhdGlvbiwgYWNjdW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgU3RvcmVzIGEgaGFuZGxlciBpbiB0aGUgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIC0gUmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICAgKiBAdGVtcGxhdGUgViAtIE1ldGFkYXRhIHR5cGVcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyfSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHBhcmFtIHtNfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlZ2lzdGVyPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgVixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz4sXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wS2V5OiBzdHJpbmcgfCBzeW1ib2xcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGNvbnN0IGhhbmRsZXJOYW1lID0gT3BlcmF0aW9ucy5nZXRIYW5kbGVyTmFtZShoYW5kbGVyKTtcblxuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXSkgdGhpcy5jYWNoZVtuYW1lXSA9IHt9O1xuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XSkgdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XSA9IHt9O1xuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXVtwcm9wS2V5XVtvcGVyYXRpb25dID0ge307XG4gICAgaWYgKHRoaXMuY2FjaGVbbmFtZV1bcHJvcEtleV1bb3BlcmF0aW9uXVtoYW5kbGVyTmFtZV0pIHJldHVybjtcbiAgICB0aGlzLmNhY2hlW25hbWVdW3Byb3BLZXldW29wZXJhdGlvbl1baGFuZGxlck5hbWVdID0gaGFuZGxlcjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSGFzaGluZywgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25IYW5kbGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbnNSZWdpc3RyeSB9IGZyb20gXCIuL09wZXJhdGlvbnNSZWdpc3RyeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uIG1hbmFnZW1lbnRcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHJlZ2lzdGVyaW5nLCByZXRyaWV2aW5nLCBhbmQgbWFuYWdpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAY2xhc3MgT3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlXG4gKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZVxuICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFJlcG9zaXRvcnkgZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlXG4gKiBAZXhhbXBsZVxuICogLy8gUmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBhIGNyZWF0ZSBvcGVyYXRpb25cbiAqIE9wZXJhdGlvbnMucmVnaXN0ZXIobXlIYW5kbGVyLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdGFyZ2V0TW9kZWwsICdwcm9wZXJ0eU5hbWUnKTtcbiAqIFxuICogLy8gR2V0IGhhbmRsZXJzIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvblxuICogY29uc3QgaGFuZGxlcnMgPSBPcGVyYXRpb25zLmdldCh0YXJnZXRNb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCAncHJvcGVydHlOYW1lJywgJ29uQ3JlYXRlJyk7XG4gKiBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgT3BlcmF0aW9ucyB7XG4gKiAgICAgLXJlZ2lzdHJ5OiBPcGVyYXRpb25zUmVnaXN0cnlcbiAqICAgICArZ2V0SGFuZGxlck5hbWUoaGFuZGxlcilcbiAqICAgICAra2V5KHN0cilcbiAqICAgICArZ2V0KHRhcmdldE5hbWUsIHByb3BLZXksIG9wZXJhdGlvbilcbiAqICAgICAtZ2V0T3BSZWdpc3RyeSgpXG4gKiAgICAgK3JlZ2lzdGVyKGhhbmRsZXIsIG9wZXJhdGlvbiwgdGFyZ2V0LCBwcm9wS2V5KVxuICogICB9XG4gKiAgIE9wZXJhdGlvbnMgLS0+IE9wZXJhdGlvbnNSZWdpc3RyeSA6IHVzZXNcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbnMge1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RyeTogT3BlcmF0aW9uc1JlZ2lzdHJ5O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHVuaXF1ZSBuYW1lIGZvciBhbiBvcGVyYXRpb24gaGFuZGxlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIG9yIGdlbmVyYXRlcyBhIGhhc2ggaWYgbmFtZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byBnZXQgdGhlIG5hbWUgZm9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgb3IgYSBnZW5lcmF0ZWQgaGFzaFxuICAgKi9cbiAgc3RhdGljIGdldEhhbmRsZXJOYW1lKGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+KSB7XG4gICAgaWYgKGhhbmRsZXIubmFtZSkgcmV0dXJuIGhhbmRsZXIubmFtZTtcblxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiSGFuZGxlciBuYW1lIG5vdCBkZWZpbmVkLiBBIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQsIGJ1dCB0aGlzIGlzIG5vdCBkZXNpcmFibGUuIHBsZWFzZSBhdm9pZCB1c2luZyBhbm9ueW1vdXMgZnVuY3Rpb25zXCJcbiAgICApO1xuICAgIHJldHVybiBIYXNoaW5nLmhhc2goaGFuZGxlci50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXkgYnkgcHJlZml4aW5nIHdpdGggdGhlIHJlZmxlY3Rpb24gbmFtZXNwYWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgb3BlcmF0aW9uIGtleSBzdHJpbmcgdG8gcHJlZml4XG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5SRUZMRUNUICsgc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3BlcmF0aW9uIGhhbmRsZXJzIGZvciBhIHNwZWNpZmljIHRhcmdldCBhbmQgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdldHMgcmVnaXN0ZXJlZCBoYW5kbGVycyBmcm9tIHRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5IGZvciBhIGdpdmVuIHRhcmdldCwgcHJvcGVydHksIGFuZCBvcGVyYXRpb25cbiAgICogQHRlbXBsYXRlIE0gLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiAtIFJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAgICogQHRlbXBsYXRlIFYgLSBNZXRhZGF0YSB0eXBlLCBkZWZhdWx0cyB0byBvYmplY3RcbiAgICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBDb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSB0YXJnZXROYW1lIC0gVGhlIHRhcmdldCBjbGFzcyBuYW1lIG9yIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcEtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBrZXkgdG8gZ2V0IGhhbmRsZXJzIGZvclxuICAgKiBAcmV0dXJuIHthbnl9IFRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldCwgcHJvcGVydHksIGFuZCBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgTSBleHRlbmRzIE1vZGVsLFxuICAgIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgICBWID0gb2JqZWN0LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+KFxuICAgIHRhcmdldE5hbWU6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcHJvcEtleTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBPcGVyYXRpb25zLnJlZ2lzdHJ5LmdldDxNLCBSLCBWLCBGLCBDPihcbiAgICAgIHRhcmdldE5hbWUsXG4gICAgICBwcm9wS2V5LFxuICAgICAgb3BlcmF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBpbml0aWFsaXplcyB0aGUgb3BlcmF0aW9ucyByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyByZWdpc3RyeSBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAqIEByZXR1cm4ge09wZXJhdGlvbnNSZWdpc3RyeX0gVGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE9wUmVnaXN0cnkoKSB7XG4gICAgaWYgKCFPcGVyYXRpb25zLnJlZ2lzdHJ5KSBPcGVyYXRpb25zLnJlZ2lzdHJ5ID0gbmV3IE9wZXJhdGlvbnNSZWdpc3RyeSgpO1xuICAgIHJldHVybiBPcGVyYXRpb25zLnJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IGFuZCBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgQWRkcyBhIGhhbmRsZXIgdG8gdGhlIG9wZXJhdGlvbnMgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4gdGFyZ2V0LCBwcm9wZXJ0eSwgYW5kIG9wZXJhdGlvblxuICAgKiBAdGVtcGxhdGUgViAtIE1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcGFyYW0ge1Z9IHRhcmdldCAtIFRoZSB0YXJnZXQgbW9kZWwgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHJlZ2lzdGVyIHRoZSBoYW5kbGVyIGZvclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFYgZXh0ZW5kcyBNb2RlbD4oXG4gICAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxWLCBhbnksIGFueT4sXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIHRhcmdldDogVixcbiAgICBwcm9wS2V5OiBzdHJpbmcgfCBzeW1ib2xcbiAgKSB7XG4gICAgT3BlcmF0aW9ucy5nZXRPcFJlZ2lzdHJ5KCkucmVnaXN0ZXIoXG4gICAgICBoYW5kbGVyIGFzIGFueSxcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BLZXlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJZE9wZXJhdGlvbkhhbmRsZXIsXG4gIE9wZXJhdGlvbkhhbmRsZXIsXG4gIFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcixcbiAgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERCT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVybmFsIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbiBrZXkgb24gYSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3AgLSBUaGUgb3BlcmF0aW9uIGtleSB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0byByZWdpc3RlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyXG4gKiBAZnVuY3Rpb24gaGFuZGxlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5mdW5jdGlvbiBoYW5kbGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzLFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBPcGVyYXRpb25zLnJlZ2lzdGVyKGhhbmRsZXIsIG9wLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYm90aCBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4gfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uQ3JlYXRlVXBkYXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25DcmVhdGVVcGRhdGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6XG4gICAgfCBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PlxuICAgIHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuQ1JFQVRFX1VQREFURSwgaGFuZGxlciwgZGF0YSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvblVwZGF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uVXBkYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuVVBEQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGR1cmluZyBjcmVhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgdXBvbiB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBvbkNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQ3JlYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLkNSRUFURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcmVhZCBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgcmVhZCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7SWRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uUmVhZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uUmVhZDxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogSWRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gb24oREJPcGVyYXRpb25zLlJFQUQsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCB1cG9uIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIG9uRGVsZXRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25EZWxldGU8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBvbihEQk9wZXJhdGlvbnMuREVMRVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBhbGwgb3BlcmF0aW9uIHR5cGVzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgYmVoYXZpb3IgdG8gZXhlY3V0ZSBkdXJpbmcgYW55IGRhdGFiYXNlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25BbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFueTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIG9uKERCT3BlcmF0aW9ucy5BTEwsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGRlY29yYXRvciBmb3IgaGFuZGxpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgZHVyaW5nIHNwZWNpZmllZCBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdIHwgREJPcGVyYXRpb25zfSBbb3A9REJPcGVyYXRpb25zLkFMTF0gLSBPbmUgb3IgbW9yZSBvcGVyYXRpb24gdHlwZXMgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIHVwb24gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2FnZTpcbiAqIGNsYXNzIE15TW9kZWwge1xuICogICBAb24oREJPcGVyYXRpb25zLkNSRUFURSwgbXlIYW5kbGVyKVxuICogICBteVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbjxWID0gb2JqZWN0PihcbiAgb3A6IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb3BlcmF0aW9uKE9wZXJhdGlvbktleXMuT04sIG9wLCBoYW5kbGVyLCBkYXRhKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1jcmVhdGUgYW5kIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGJvdGggY3JlYXRlIGFuZCB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge1N0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+IHwgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJDcmVhdGVVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlckNyZWF0ZVVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjpcbiAgICB8IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+XG4gICAgfCBVcGRhdGVPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT4sXG4gIGRhdGE6IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7VXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJVcGRhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclVwZGF0ZTxWID0gb2JqZWN0PihcbiAgaGFuZGxlcjogVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhOiBWXG4pIHtcbiAgcmV0dXJuIGFmdGVyKERCT3BlcmF0aW9ucy5VUERBVEUsIGhhbmRsZXIsIGRhdGEpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtY3JlYXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGNyZWF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckNyZWF0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyQ3JlYXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YTogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQ1JFQVRFLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZvciBoYW5kbGluZyBwb3N0LXJlYWQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgcmVhZCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlclJlYWRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlclJlYWQ8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuUkVBRCwgaGFuZGxlciwgZGF0YSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3QtZGVsZXRlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGRlbGV0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhLCBkZWZhdWx0cyB0byBvYmplY3RcbiAqIEBwYXJhbSB7U3RhbmRhcmRPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBWLCBhbnksIGFueT59IGhhbmRsZXIgLSBUaGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IFtkYXRhXSAtIE9wdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBhZnRlckRlbGV0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyRGVsZXRlPFYgPSBvYmplY3Q+KFxuICBoYW5kbGVyOiBTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gYWZ0ZXIoREJPcGVyYXRpb25zLkRFTEVURSwgaGFuZGxlciwgZGF0YSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciBmb3IgaGFuZGxpbmcgcG9zdC1vcGVyYXRpb24gZm9yIGFsbCBvcGVyYXRpb24gdHlwZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBiZWhhdmlvciB0byBleGVjdXRlIGFmdGVyIGFueSBkYXRhYmFzZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtTdGFuZGFyZE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gW2RhdGFdIC0gT3B0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGFmdGVyQW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXJBbnk8ViA9IG9iamVjdD4oXG4gIGhhbmRsZXI6IFN0YW5kYXJkT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhPzogVlxuKSB7XG4gIHJldHVybiBhZnRlcihEQk9wZXJhdGlvbnMuQUxMLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBkZWNvcmF0b3IgZm9yIGhhbmRsaW5nIHBvc3Qtb3BlcmF0aW9uIGJlaGF2aW9yc1xuICogQHN1bW1hcnkgRGVmaW5lcyBhIGJlaGF2aW9yIHRvIGV4ZWN1dGUgYWZ0ZXIgc3BlY2lmaWVkIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBmb3IgbWV0YWRhdGEsIGRlZmF1bHRzIHRvIG9iamVjdFxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzW10gfCBEQk9wZXJhdGlvbnN9IFtvcD1EQk9wZXJhdGlvbnMuQUxMXSAtIE9uZSBvciBtb3JlIG9wZXJhdGlvbiB0eXBlcyB0byBoYW5kbGVcbiAqIEBwYXJhbSB7T3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBbZGF0YV0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gYWZ0ZXJcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSB1c2FnZTpcbiAqIGNsYXNzIE15TW9kZWwge1xuICogICBAYWZ0ZXIoREJPcGVyYXRpb25zLkNSRUFURSwgbXlIYW5kbGVyKVxuICogICBteVByb3BlcnR5OiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcjxWID0gb2JqZWN0PihcbiAgb3A6IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5BTEwsXG4gIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55PixcbiAgZGF0YT86IFZcbikge1xuICByZXR1cm4gb3BlcmF0aW9uKE9wZXJhdGlvbktleXMuQUZURVIsIG9wLCBoYW5kbGVyLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBkZWNvcmF0b3IgZmFjdG9yeSBmb3Igb3BlcmF0aW9uIGhhbmRsZXJzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGRlY29yYXRvcnMgdGhhdCByZWdpc3RlciBoYW5kbGVycyBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXMuT04gfCBPcGVyYXRpb25LZXlzLkFGVEVSfSBiYXNlT3AgLSBXaGV0aGVyIHRoZSBoYW5kbGVyIHJ1bnMgZHVyaW5nIG9yIGFmdGVyIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c1tdfSBbb3BlcmF0aW9uPURCT3BlcmF0aW9ucy5BTExdIC0gVGhlIHNwZWNpZmljIG9wZXJhdGlvbnMgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIFYsIGFueSwgYW55Pn0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwYXJhbSB7Vn0gW2RhdGFUb0FkZF0gLSBPcHRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIHRoZSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gb3BlcmF0aW9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yIGFzIEBvcGVyYXRpb25cbiAqICAgcGFydGljaXBhbnQgT3BlcmF0aW9ucyBhcyBPcGVyYXRpb25zIFJlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IEhhbmRsZXJcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+T3BlcmF0aW9uczogUmVnaXN0ZXIgaGFuZGxlclxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIG1ldGFkYXRhXG4gKlxuICogICBOb3RlIG92ZXIgQ2xpZW50LEhhbmRsZXI6IExhdGVyLCBkdXJpbmcgb3BlcmF0aW9uIGV4ZWN1dGlvblxuICogICBDbGllbnQtPj5PcGVyYXRpb25zOiBFeGVjdXRlIG9wZXJhdGlvblxuICogICBPcGVyYXRpb25zLT4+SGFuZGxlcjogQ2FsbCByZWdpc3RlcmVkIGhhbmRsZXJcbiAqICAgSGFuZGxlci0tPj5PcGVyYXRpb25zOiBSZXR1cm4gcmVzdWx0XG4gKiAgIE9wZXJhdGlvbnMtLT4+Q2xpZW50OiBSZXR1cm4gZmluYWwgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVyYXRpb248ViA9IG9iamVjdD4oXG4gIGJhc2VPcDogT3BlcmF0aW9uS2V5cy5PTiB8IE9wZXJhdGlvbktleXMuQUZURVIsXG4gIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5c1tdID0gREJPcGVyYXRpb25zLkFMTCxcbiAgaGFuZGxlcjogT3BlcmF0aW9uSGFuZGxlcjxhbnksIGFueSwgViwgYW55LCBhbnk+LFxuICBkYXRhVG9BZGQ/OiBWXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IG9wZXJhdGlvbi5yZWR1Y2UoKGFjY3VtOiBhbnlbXSwgb3ApID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvdW5kS2V5ID0gYmFzZU9wICsgb3A7XG4gICAgICBsZXQgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICBvcGVyYXRpb246IG9wLFxuICAgICAgICAgIGhhbmRsZXJzOiB7fSxcbiAgICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlcktleSA9IE9wZXJhdGlvbnMuZ2V0SGFuZGxlck5hbWUoaGFuZGxlcik7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV0gfHxcbiAgICAgICAgIWRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8XG4gICAgICAgICEoaGFuZGxlcktleSBpbiBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XSlcbiAgICAgICkge1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdID0gZGF0YS5oYW5kbGVyc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgZGF0YS5oYW5kbGVyc1tuYW1lXVtwcm9wZXJ0eUtleV0gPVxuICAgICAgICAgIGRhdGEuaGFuZGxlcnNbbmFtZV1bcHJvcGVydHlLZXldIHx8IHt9O1xuICAgICAgICBkYXRhLmhhbmRsZXJzW25hbWVdW3Byb3BlcnR5S2V5XVtoYW5kbGVyS2V5XSA9IHtcbiAgICAgICAgICBkYXRhOiBkYXRhVG9BZGQsXG4gICAgICAgIH07XG5cbiAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICBoYW5kbGUoY29tcG91bmRLZXkgYXMgT3BlcmF0aW9uS2V5cywgaGFuZGxlciksXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKE9wZXJhdGlvbnMua2V5KGNvbXBvdW5kS2V5KSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBlcnJvciBjbGFzcyBmb3IgdGhlIHJlcG9zaXRvcnkgbW9kdWxlXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBiYXNlIGVycm9yIGNsYXNzIHRoYXQgYWxsIG90aGVyIGVycm9yIHR5cGVzIGV4dGVuZCBmcm9tLiBQcm92aWRlcyBjb21tb24gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcGFyYW0ge251bWJlcn0gY29kZSAtIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVycm9yXG4gKiBAY2xhc3MgQmFzZUVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHlcbiAqIC8vIEluc3RlYWQsIHVzZSBvbmUgb2YgdGhlIGNvbmNyZXRlIGVycm9yIGNsYXNzZXM6XG4gKiB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgcHJvdmlkZWQnKTtcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgbXNnOiBzdHJpbmcgfCBFcnJvciwgY29kZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1zZyBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIG1zZztcbiAgICBjb25zdCBtZXNzYWdlID0gYFske25hbWV9XSAke21zZyBpbnN0YW5jZW9mIEVycm9yID8gbXNnLm1lc3NhZ2UgOiBtc2d9YDtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIGlmIChtc2cgaW5zdGFuY2VvZiBFcnJvcikgdGhpcy5zdGFjayA9IG1zZy5zdGFjaztcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiB0aGUgTW9kZWwgZGV0YWlscywgdHlwaWNhbGx5IHRocm93biB3aGVuIGRhdGEgdmFsaWRhdGlvbiBmYWlsc1xuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7VmFsaWRhdGlvbkVycm9yfSBBIG5ldyBWYWxpZGF0aW9uRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBWYWxpZGF0aW9uRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhIHZhbGlkYXRpb24gZXJyb3Igd2hlbiBkYXRhIGlzIGludmFsaWRcbiAqIGlmICghaXNWYWxpZChkYXRhKSkge1xuICogICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJbnZhbGlkIGRhdGEgZm9ybWF0Jyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoVmFsaWRhdGlvbkVycm9yLm5hbWUsIG1zZywgNDIyKTtcbiAgfVxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGZvciBpbnRlcm5hbCBzeXN0ZW0gZmFpbHVyZXNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gaW50ZXJuYWwgZmFpbHVyZSAoc2hvdWxkIG1lYW4gYW4gZXJyb3IgaW4gY29kZSkgd2l0aCBIVFRQIDUwMCBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQHJldHVybiB7SW50ZXJuYWxFcnJvcn0gQSBuZXcgSW50ZXJuYWxFcnJvciBpbnN0YW5jZVxuICogQGNsYXNzIEludGVybmFsRXJyb3JcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvdyBhbiBpbnRlcm5hbCBlcnJvciB3aGVuIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIG9jY3Vyc1xuICogdHJ5IHtcbiAqICAgLy8gU29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCdVbmV4cGVjdGVkIGludGVybmFsIGVycm9yIG9jY3VycmVkJyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEludGVybmFsRXJyb3IubmFtZSwgbXNnLCA1MDApO1xuICB9XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBzZXJpYWxpemF0aW9uIG9yIGRlc2VyaWFsaXphdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gdGhlIE1vZGVsIGRlL3NlcmlhbGl6YXRpb24sIHR5cGljYWxseSB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiBkYXRhIGZvcm1hdHNcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge1NlcmlhbGl6YXRpb25FcnJvcn0gQSBuZXcgU2VyaWFsaXphdGlvbkVycm9yIGluc3RhbmNlXG4gKiBAY2xhc3MgU2VyaWFsaXphdGlvbkVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yIHdoZW4gSlNPTiBwYXJzaW5nIGZhaWxzXG4gKiB0cnkge1xuICogICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShpbnZhbGlkSnNvbik7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTiBkYXRhJyk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoU2VyaWFsaXphdGlvbkVycm9yLm5hbWUsIG1zZywgNDIyKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBhIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgZm91bmRcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIGZpbmRpbmcgYSBtb2RlbCwgcmVzdWx0aW5nIGluIGEgNDA0IEhUVFAgc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge05vdEZvdW5kRXJyb3J9IEEgbmV3IE5vdEZvdW5kRXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBOb3RGb3VuZEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBub3QgZm91bmQgZXJyb3Igd2hlbiBhIHJlY29yZCBkb2Vzbid0IGV4aXN0XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kQnlJZChpZCk7XG4gKiBpZiAoIXVzZXIpIHtcbiAqICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFVzZXIgd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoTm90Rm91bmRFcnJvci5uYW1lLCBtc2csIDQwNCk7XG4gIH1cbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgY29uZmxpY3Qgb2NjdXJzIGluIHRoZSBzdG9yYWdlXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgY29uZmxpY3QgaW4gdGhlIHN0b3JhZ2UsIHR5cGljYWxseSB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge0NvbmZsaWN0RXJyb3J9IEEgbmV3IENvbmZsaWN0RXJyb3IgaW5zdGFuY2VcbiAqIEBjbGFzcyBDb25mbGljdEVycm9yXG4gKiBAZXhhbXBsZVxuICogLy8gVGhyb3cgYSBjb25mbGljdCBlcnJvciB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSBkdXBsaWNhdGUgcmVjb3JkXG4gKiBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRCeUVtYWlsKGVtYWlsKTtcbiAqIGlmIChleGlzdGluZ1VzZXIpIHtcbiAqICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYFVzZXIgd2l0aCBlbWFpbCAke2VtYWlsfSBhbHJlYWR5IGV4aXN0c2ApO1xuICogfVxuICovXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihDb25mbGljdEVycm9yLm5hbWUsIG1zZywgNDA5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgT3BlcmF0aW9ucyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL09wZXJhdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbkhhbmRsZXIsIFVwZGF0ZU9wZXJhdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi4vb3BlcmF0aW9ucy90eXBlc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgYXJndW1lbnRzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIHRoZSBjb250ZXh0IGFuZCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgb3BlcmF0aW9ucy5cbiAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHBhc3MgY29udGV4dCBhbmQgYXJndW1lbnRzIGJldHdlZW4gcmVwb3NpdG9yeSBtZXRob2RzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLCBkZWZhdWx0cyB0byBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSwgZGVmYXVsdHMgdG8gQ29udGV4dDxGPlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyAtIFRoZSBvcGVyYXRpb24gYXJndW1lbnRzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dEFyZ3M8XG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gPSB7XG4gIGNvbnRleHQ6IEM7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSByZXRyaWV2ZXMgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGhhbmRsZXJcbiAqIEBwYXJhbSB7YW55fSBkZWMgdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHtzdHJpbmd9IHByb3AgdGhlIHByb3BlcnR5IG5hbWVcbiAqIEBwYXJhbSB7e319IG0gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge3t9fSBbYWNjdW1dIGFjY3VtdWxhdG9yIHVzZWQgZm9yIGludGVybmFsIHJlY3Vyc2l2ZW5lc3NcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0SGFuZGxlckFyZ3NcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYW5kbGVyQXJncyA9IGZ1bmN0aW9uIChcbiAgZGVjOiBhbnksXG4gIHByb3A6IHN0cmluZyxcbiAgbTogQ29uc3RydWN0b3I8YW55PixcbiAgYWNjdW0/OiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+XG4pOiBSZWNvcmQ8c3RyaW5nLCB7IGFyZ3M6IHN0cmluZ1tdIH0+IHwgdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmICghbmFtZSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIG1vZGVsIGNsYXNzXCIpO1xuICBhY2N1bSA9IGFjY3VtIHx8IHt9O1xuXG4gIGlmIChkZWMucHJvcHMuaGFuZGxlcnNbbmFtZV0gJiYgZGVjLnByb3BzLmhhbmRsZXJzW25hbWVdW3Byb3BdKVxuICAgIGFjY3VtID0geyAuLi5kZWMucHJvcHMuaGFuZGxlcnNbbmFtZV1bcHJvcF0sIC4uLmFjY3VtIH07XG5cbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG0pO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bTtcbiAgaWYgKHByb3RvLmNvbnN0cnVjdG9yLm5hbWUgPT09IG5hbWUpIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblxuICByZXR1cm4gZ2V0SGFuZGxlckFyZ3MoZGVjLCBwcm9wLCBwcm90bywgYWNjdW0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJUmVwb3NpdG9yeTxUPn0gcmVwb1xuICogQHBhcmFtIGNvbnRleHRcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSBvcGVyYXRpb25cbiAqIEBwYXJhbSBwcmVmaXhcbiAqXG4gKiBAcGFyYW0gb2xkTW9kZWxcbiAqIEBmdW5jdGlvbiBlbmZvcmNlREJQcm9wZXJ0eURlY29yYXRvcnNBc3luY1xuICpcbiAqIEBtZW1iZXJPZiBkYi1kZWNvcmF0b3JzLnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmZvcmNlREJEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCA9IG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPihcbiAgcmVwbzogUixcbiAgY29udGV4dDogQyxcbiAgbW9kZWw6IE0sXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgb2xkTW9kZWw/OiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQgPVxuICAgIGdldERiRGVjb3JhdG9ycyhtb2RlbCwgb3BlcmF0aW9uLCBwcmVmaXgpO1xuXG4gIGlmICghZGVjb3JhdG9ycykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBkZWNvcmF0b3JzKSB7XG4gICAgY29uc3QgZGVjczogRGVjb3JhdG9yTWV0YWRhdGFbXSA9IGRlY29yYXRvcnNbcHJvcF07XG4gICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgY29uc3QgeyBrZXkgfSA9IGRlYztcbiAgICAgIGNvbnN0IGhhbmRsZXJzOiBPcGVyYXRpb25IYW5kbGVyPE0sIFIsIFYsIEYsIEM+W10gfCB1bmRlZmluZWQgPVxuICAgICAgICBPcGVyYXRpb25zLmdldDxNLCBSLCBWLCBGLCBDPihtb2RlbCwgcHJvcCwgcHJlZml4ICsga2V5KTtcbiAgICAgIGlmICghaGFuZGxlcnMgfHwgIWhhbmRsZXJzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgdGhlIG9wZXJhdGlvbiAke3ByZWZpeCArIGtleX0gdW5kZXIgcHJvcGVydHkgJHtwcm9wfWBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgaGFuZGxlckFyZ3MgPSBnZXRIYW5kbGVyQXJncyhkZWMsIHByb3AsIG1vZGVsIGFzIGFueSk7XG5cbiAgICAgIGlmICghaGFuZGxlckFyZ3MgfHwgT2JqZWN0LnZhbHVlcyhoYW5kbGVyQXJncykubGVuZ3RoICE9PSBoYW5kbGVycy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQXJncyBhbmQgaGFuZGxlcnMgbGVuZ3RoIGRvIG5vdCBtYXRjaFwiKTtcblxuICAgICAgbGV0IGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8TSwgUiwgViwgRiwgQz47XG4gICAgICBsZXQgZGF0YTogYW55O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoYW5kbGVyID0gaGFuZGxlcnNbaV07XG4gICAgICAgIGRhdGEgPSBPYmplY3QudmFsdWVzKGhhbmRsZXJBcmdzKVtpXTtcblxuICAgICAgICBjb25zdCBhcmdzOiBhbnlbXSA9IFtjb250ZXh0LCBkYXRhLmRhdGEsIHByb3AsIG1vZGVsXTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURSAmJiBwcmVmaXggPT09IE9wZXJhdGlvbktleXMuT04pIHtcbiAgICAgICAgICBpZiAoIW9sZE1vZGVsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNzaW5nIG9sZCBtb2RlbCBmb3IgdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgICAgICBhcmdzLnB1c2gob2xkTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgKGhhbmRsZXIgYXMgVXBkYXRlT3BlcmF0aW9uSGFuZGxlcjxNLCBSLCBWLCBGLCBDPikuYXBwbHkoXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYXJncyBhcyBbQywgViwga2V5b2YgTSwgTSwgTV1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gYEZhaWxlZCB0byBleGVjdXRlIGhhbmRsZXIgJHtoYW5kbGVyLm5hbWV9IGZvciAke3Byb3B9IG9uICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0gZHVlIHRvIGVycm9yOiAke2V9YDtcbiAgICAgICAgICBpZiAoY29udGV4dC5nZXQoXCJicmVha09uSGFuZGxlckVycm9yXCIpKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihtc2cpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTcGVjaWZpYyBmb3IgREIgRGVjb3JhdG9yc1xuICogQHBhcmFtIHtUfSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiBDUlVEIHtAbGluayBPcGVyYXRpb25LZXlzfVxuICogQHBhcmFtIHtzdHJpbmd9IFtleHRyYVByZWZpeF1cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0RGJQcm9wZXJ0eURlY29yYXRvcnNcbiAqXG4gKiBAbWVtYmVyT2YgZGItZGVjb3JhdG9ycy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGJEZWNvcmF0b3JzPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBULFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgZXh0cmFQcmVmaXg/OiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwsXG4gICAgICAvLyB1bmRlZmluZWQsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFRkxFQ1QgKyAoZXh0cmFQcmVmaXggPyBleHRyYVByZWZpeCA6IFwiXCIpXG4gICAgKTtcbiAgaWYgKCFkZWNvcmF0b3JzKSByZXR1cm47XG4gIHJldHVybiBPYmplY3Qua2V5cyhkZWNvcmF0b3JzKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiB8IHVuZGVmaW5lZCwgZGVjb3JhdG9yKSA9PiB7XG4gICAgICBjb25zdCBkZWMgPSBkZWNvcmF0b3JzW2RlY29yYXRvcl0uZmlsdGVyKChkKSA9PiBkLmtleSA9PT0gb3BlcmF0aW9uKTtcbiAgICAgIGlmIChkZWMgJiYgZGVjLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHt9O1xuICAgICAgICBhY2N1bVtkZWNvcmF0b3JdID0gZGVjO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZWNvcmF0b3JzIGZvciBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHByZWZpeGVkIGJ5IHtAcGFyYW0gcHJlZml4ZXN9IHJlY3Vyc2l2ZWx5XG4gKiBAcGFyYW0gbW9kZWxcbiAqIEBwYXJhbSBhY2N1bVxuICogQHBhcmFtIHByZWZpeGVzXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogVCxcbiAgYWNjdW06IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQsXG4gIC4uLnByZWZpeGVzOiBzdHJpbmdbXVxuKTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjY3VtdWxhdG9yID0gYWNjdW0gfHwge307XG4gIGNvbnN0IG1lcmdlRGVjb3JhdG9ycyA9IGZ1bmN0aW9uIChkZWNzOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9KSB7XG4gICAgY29uc3QgcHVzaE9yU3F1YXNoID0gKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgIGxldCBtYXRjaDogYW55O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShtYXRjaCA9IGFjY3VtdWxhdG9yW2tleV0uZmluZCgoZSkgPT4gZS5rZXkgPT09IHZhbC5rZXkpKSB8fFxuICAgICAgICAgIG1hdGNoLnByb3BzLm9wZXJhdGlvbiAhPT0gdmFsLnByb3BzLm9wZXJhdGlvblxuICAgICAgICApIHtcbiAgICAgICAgICBhY2N1bXVsYXRvcltrZXldLnB1c2godmFsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IGhhbmRsZXJzLCBvcGVyYXRpb24gfSA9IHZhbC5wcm9wcztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIW9wZXJhdGlvbiB8fFxuICAgICAgICAgICFvcGVyYXRpb24ubWF0Y2goXG4gICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICBgXig6PyR7T3BlcmF0aW9uS2V5cy5PTn18JHtPcGVyYXRpb25LZXlzLkFGVEVSfSkoOj8ke09wZXJhdGlvbktleXMuQ1JFQVRFfXwke09wZXJhdGlvbktleXMuUkVBRH18JHtPcGVyYXRpb25LZXlzLlVQREFURX18JHtPcGVyYXRpb25LZXlzLkRFTEVURX0pJGBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0ucHVzaCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY3VtSGFuZGxlcnMgPSBtYXRjaC5wcm9wcy5oYW5kbGVycztcblxuICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVycykuZm9yRWFjaCgoW2NsYXp6LCBoYW5kbGVyRGVmXSkgPT4ge1xuICAgICAgICAgIGlmICghKGNsYXp6IGluIGFjY3VtSGFuZGxlcnMpKSB7XG4gICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XSA9IGhhbmRsZXJEZWY7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoaGFuZGxlckRlZiBhcyBvYmplY3QpLmZvckVhY2goXG4gICAgICAgICAgICAoW2hhbmRsZXJQcm9wLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIShoYW5kbGVyUHJvcCBpbiBhY2N1bUhhbmRsZXJzW2NsYXp6XSkpIHtcbiAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF0gPSBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhhbmRsZXIgYXMgb2JqZWN0KS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChbaGFuZGxlcktleSwgYXJnc09ial0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghKGhhbmRsZXJLZXkgaW4gYWNjdW1IYW5kbGVyc1tjbGF6el1baGFuZGxlclByb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bUhhbmRsZXJzW2NsYXp6XVtoYW5kbGVyUHJvcF1baGFuZGxlcktleV0gPSBhcmdzT2JqO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIGBTa2lwcGluZyBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmb3IgJHtjbGF6en0gdW5kZXIgcHJvcCAke2hhbmRsZXJQcm9wfSBiZWNhdXNlIGhhbmRsZXIgaXMgdGhlIHNhbWVgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBPYmplY3QuZW50cmllcyhkZWNzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSBhY2N1bXVsYXRvcltrZXldIHx8IFtdO1xuICAgICAgcHVzaE9yU3F1YXNoKGtleSwgLi4udmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlY3M6IHsgW2luZGV4ZXI6IHN0cmluZ106IGFueVtdIH0gfCB1bmRlZmluZWQgPVxuICAgIFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCAuLi5wcmVmaXhlcyk7XG4gIGlmIChkZWNzKSBtZXJnZURlY29yYXRvcnMoZGVjcyk7XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiBhY2N1bXVsYXRvcjtcblxuICAvLyBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kZWwpO1xuICBpZiAoIXByb3RvKSByZXR1cm4gYWNjdW11bGF0b3I7XG4gIC8vIGlmIChwcm90by5jb25zdHJ1Y3RvciAmJiBwcm90by5jb25zdHJ1Y3Rvci5uYW1lID09PSBuYW1lKVxuICAvLyAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pXG4gIHJldHVybiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUocHJvdG8sIGFjY3VtdWxhdG9yLCAuLi5wcmVmaXhlcyk7XG59O1xuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZsYWdzIGZvciByZXBvc2l0b3J5IG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgcmVwb3NpdG9yeSBvcGVyYXRpb24gZmxhZ3MsIGV4Y2x1ZGluZyB0aGUgdGltZXN0YW1wIHByb3BlcnR5LlxuICogVGhlc2UgZmxhZ3MgY29udHJvbCBiZWhhdmlvciBzdWNoIGFzIGNvbnRleHQgaGFuZGxpbmcsIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgbW9yZS5cbiAqIEBjb25zdCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRSZXBvc2l0b3J5RmxhZ3M6IE9taXQ8UmVwb3NpdG9yeUZsYWdzLCBcInRpbWVzdGFtcFwiPiA9IHtcbiAgcGFyZW50Q29udGV4dDogdW5kZWZpbmVkLFxuICBjaGlsZENvbnRleHRzOiBbXSxcbiAgaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzOiBbXSxcbiAgY2FsbEFyZ3M6IFtdLFxuICB3cml0ZU9wZXJhdGlvbjogZmFsc2UsXG4gIGFmZmVjdGVkVGFibGVzOiBbXSxcbiAgb3BlcmF0aW9uOiB1bmRlZmluZWQsXG4gIGJyZWFrT25IYW5kbGVyRXJyb3I6IHRydWUsXG4gIHJlYnVpbGRXaXRoVHJhbnNpZW50OiB0cnVlLFxufTtcbiIsImltcG9ydCB7IENvbnRleHRBcmdzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHR1YWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9Db250ZXh0dWFsXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgY29udGV4dCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgY29udGV4dCBpbnN0YW5jZXMgd2l0aCBzcGVjaWZpYyByZXBvc2l0b3J5IGZsYWdzLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gQ29udGV4dEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb250ZXh0RmFjdG9yeTxGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzPiA9IDxDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gIGFyZzogT21pdDxGLCBcInRpbWVzdGFtcFwiPlxuKSA9PiBDO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGNvbnRleHQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgQ29udGV4dCBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBmbGFncy5cbiAqIEl0IGF1dG9tYXRpY2FsbHkgYWRkcyBhIHRpbWVzdGFtcCB0byB0aGUgY29udGV4dCBhbmQgcmV0dXJucyBhIHByb3Blcmx5IHR5cGVkIGNvbnRleHQgaW5zdGFuY2UuXG4gKiBAY29uc3QgRGVmYXVsdENvbnRleHRGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb250ZXh0RmFjdG9yeTogQ29udGV4dEZhY3Rvcnk8YW55PiA9IDxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICBhcmc6IE9taXQ8RiwgXCJ0aW1lc3RhbXBcIj5cbikgPT4ge1xuICByZXR1cm4gbmV3IENvbnRleHQ8Rj4oKS5hY2N1bXVsYXRlKFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGFyZywgeyB0aW1lc3RhbXA6IG5ldyBEYXRlKCkgfSkgYXMgRlxuICApIGFzIEM7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbnRleHQgbWFuYWdlbWVudCBjbGFzcyBmb3IgaGFuZGxpbmcgcmVwb3NpdG9yeSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIENvbnRleHQgY2xhc3MgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHJlcG9zaXRvcnkgb3BlcmF0aW9ucyB3aXRoIGZsYWdzLFxuICogcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMsIGFuZCBzdGF0ZSBhY2N1bXVsYXRpb24uIEl0IGFsbG93cyBmb3IgaGllcmFyY2hpY2FsIGNvbnRleHQgY2hhaW5zXG4gKiBhbmQgbWFpbnRhaW5zIG9wZXJhdGlvbi1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyB3aGlsZSBzdXBwb3J0aW5nIHR5cGUgc2FmZXR5IHRocm91Z2ggZ2VuZXJpY3MuXG4gKlxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3MgdGhhdCBkZWZpbmVzIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdEFjY3VtdWxhdG9yPEY+fSBjYWNoZSAtIFRoZSBpbnRlcm5hbCBjYWNoZSBzdG9yaW5nIGFjY3VtdWxhdGVkIHZhbHVlc1xuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHdpdGggcmVwb3NpdG9yeSBmbGFnc1xuICogY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0PFJlcG9zaXRvcnlGbGFncz4oKTtcbiAqXG4gKiAvLyBBY2N1bXVsYXRpbmcgdmFsdWVzXG4gKiBjb25zdCBlbnJpY2hlZENvbnRleHQgPSBjb250ZXh0LmFjY3VtdWxhdGUoe1xuICogICB3cml0ZU9wZXJhdGlvbjogdHJ1ZSxcbiAqICAgYWZmZWN0ZWRUYWJsZXM6IFsndXNlcnMnXSxcbiAqICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLkNSRUFURVxuICogfSk7XG4gKlxuICogLy8gQWNjZXNzaW5nIHZhbHVlc1xuICogY29uc3QgaXNXcml0ZSA9IGVucmljaGVkQ29udGV4dC5nZXQoJ3dyaXRlT3BlcmF0aW9uJyk7IC8vIHRydWVcbiAqIGNvbnN0IHRhYmxlcyA9IGVucmljaGVkQ29udGV4dC5nZXQoJ2FmZmVjdGVkVGFibGVzJyk7IC8vIFsndXNlcnMnXVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDdHggYXMgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBDYWNoZSBhcyBPYmplY3RBY2N1bXVsYXRvclxuICpcbiAqICAgQy0+PkN0eDogbmV3IENvbnRleHQoKVxuICogICBDdHgtPj5DYWNoZTogY3JlYXRlIGNhY2hlXG4gKlxuICogICBDLT4+Q3R4OiBhY2N1bXVsYXRlKHZhbHVlKVxuICogICBDdHgtPj5DYWNoZTogYWNjdW11bGF0ZSh2YWx1ZSlcbiAqICAgQ2FjaGUtLT4+Q3R4OiB1cGRhdGVkIGNhY2hlXG4gKiAgIEN0eC0tPj5DOiB1cGRhdGVkIGNvbnRleHRcbiAqXG4gKiAgIEMtPj5DdHg6IGdldChrZXkpXG4gKiAgIEN0eC0+PkNhY2hlOiBnZXQoa2V5KVxuICogICBhbHQgS2V5IGV4aXN0cyBpbiBjYWNoZVxuICogICAgIENhY2hlLS0+PkN0eDogdmFsdWVcbiAqICAgZWxzZSBLZXkgbm90IGZvdW5kXG4gKiAgICAgQ3R4LT4+Q3R4OiBjaGVjayBwYXJlbnQgY29udGV4dFxuICogICAgIGFsdCBQYXJlbnQgZXhpc3RzXG4gKiAgICAgICBDdHgtPj5QYXJlbnQ6IGdldChrZXkpXG4gKiAgICAgICBQYXJlbnQtLT4+Q3R4OiB2YWx1ZVxuICogICAgIGVsc2UgTm8gcGFyZW50XG4gKiAgICAgICBDdHgtLT4+QzogdGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEN0eC0tPj5DOiByZXF1ZXN0ZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHQ8RiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYWNoZVwiLCB7XG4gICAgICB2YWx1ZTogbmV3IE9iamVjdEFjY3VtdWxhdG9yPEY+KCksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmYWN0b3J5OiBDb250ZXh0RmFjdG9yeTxhbnk+ID0gRGVmYXVsdENvbnRleHRGYWN0b3J5O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGU6IEYgJiBPYmplY3RBY2N1bXVsYXRvcjxGPiA9XG4gICAgbmV3IE9iamVjdEFjY3VtdWxhdG9yKCkgYXMgRiAmIE9iamVjdEFjY3VtdWxhdG9yPEY+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgbmV3IHZhbHVlcyBpbnRvIHRoZSBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIHZhbHVlIG9iamVjdCB3aXRoIHRoZSBleGlzdGluZyBjb250ZXh0IHN0YXRlLFxuICAgKiBjcmVhdGluZyBhIG5ldyBpbW11dGFibGUgY2FjaGUgc3RhdGUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBGIC0gY3VycmVudCBhY2N1bXVsYXRvciB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgb2JqZWN0IGZvciB0aGUgdmFsdWVzIHRvIGFjY3VtdWxhdGVcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgY29udGFpbmluZyB2YWx1ZXMgdG8gYWNjdW11bGF0ZVxuICAgKiBAcmV0dXJucyBBIG5ldyBjb250ZXh0IGluc3RhbmNlIHdpdGggYWNjdW11bGF0ZWQgdmFsdWVzXG4gICAqL1xuICBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY2FjaGVcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuY2FjaGUuYWNjdW11bGF0ZSh2YWx1ZSksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIENvbnRleHQ8RiAmIFY+O1xuICB9XG5cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS50aW1lc3RhbXA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbnRleHQgYnkga2V5LlxuICAgKiBAc3VtbWFyeSBBdHRlbXB0cyB0byBnZXQgYSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQncyBjYWNoZS5cbiAgICogSWYgbm90IGZvdW5kLCB0cmF2ZXJzZXMgdXAgdGhlIHBhcmVudCBjb250ZXh0IGNoYWluLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgSyAtIFR5cGUgZXh0ZW5kaW5nIGtleW9mIEYgZm9yIHRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHRlbXBsYXRlIEYgLSBBY2N1bXVsYXRvciB0eXBlXG4gICAqIEBwYXJhbSB7S30ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZSBmcm9tIHRoZSBjb250ZXh0XG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbnRleHQgY2hhaW5cbiAgICovXG4gIGdldDxLIGV4dGVuZHMga2V5b2YgRj4oa2V5OiBLKTogRltLXSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmICh0aGlzLmNhY2hlLnBhcmVudENvbnRleHQpIHJldHVybiB0aGlzLmNhY2hlLnBhcmVudENvbnRleHQuZ2V0KGtleSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNoaWxkIGNvbnRleHRcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgbmV3IGNvbnRleHQgaW5zdGFuY2Ugd2l0aCBjdXJyZW50IGNvbnRleHQgYXMgcGFyZW50XG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW21vZGVsXSAtIE9wdGlvbmFsIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm5zIHtDfSBOZXcgY2hpbGQgY29udGV4dCBpbnN0YW5jZVxuICAgKi9cbiAgY2hpbGQ8TSBleHRlbmRzIE1vZGVsLCBDIGV4dGVuZHMgQ29udGV4dDxGPj4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsPzogQ29uc3RydWN0b3I8TT5cbiAgKTogQyB7XG4gICAgcmV0dXJuIENvbnRleHQuY2hpbGRGcm9tPEYsIEM+KFxuICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICB7XG4gICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICBhZmZlY3RlZFRhYmxlczogbW9kZWwgPyBbbW9kZWxdIDogW10sXG4gICAgICB9IGFzIHVua25vd24gYXMgUGFydGlhbDxGPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjaGlsZCBjb250ZXh0IGZyb20gYW5vdGhlciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIG5ldyBjb250ZXh0IGluc3RhbmNlIHdpdGggcGFyZW50IHJlZmVyZW5jZVxuICAgKlxuICAgKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnkgRmxhZ3NcbiAgICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBwYXJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IFtvdmVycmlkZXNdIC0gT3B0aW9uYWwgZmxhZyBvdmVycmlkZXNcbiAgICogQHJldHVybnMge0N9IE5ldyBjaGlsZCBjb250ZXh0IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY2hpbGRGcm9tPEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsIEMgZXh0ZW5kcyBDb250ZXh0PEY+PihcbiAgICBjb250ZXh0OiBDLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8Rj5cbiAgKTogQyB7XG4gICAgcmV0dXJuIENvbnRleHQuZmFjdG9yeShcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHQuY2FjaGUsIG92ZXJyaWRlcyB8fCB7fSlcbiAgICApIGFzIHVua25vd24gYXMgQztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGZyb20gb3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgY29udGV4dCBpbnN0YW5jZSBmb3Igc3BlY2lmaWMgb3BlcmF0aW9uXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeSBGbGFnc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdHlwZVxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzIC0gT3BlcmF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBmcm9tPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Qz4ge1xuICAgIHJldHVybiBDb250ZXh0LmZhY3RvcnkoXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLCBvdmVycmlkZXMsIHtcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgIH0pXG4gICAgKSBhcyBDO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhcmd1bWVudHMgZm9yIGNvbnRleHQgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29udGV4dCBhcmdzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyB7QGxpbmsgUmVwb3NpdG9yeUZsYWdzfVxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIHtAbGluayBNb2RlbH1cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBPcGVyYXRpb24gYXJndW1lbnRzXG4gICAqIEBwYXJhbSB7Q29udGV4dHVhbDxGPn0gW2NvbnRleHR1YWxdIC0gT3B0aW9uYWwgY29udGV4dHVhbCBvYmplY3RcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBbb3ZlcnJpZGVzXSAtIE9wdGlvbmFsIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRleHRBcmdzPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gY29udGV4dCBhcmd1bWVudHNcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQXJnc1xuICAgKlxuICAgKiAgIEMtPj5DOiBSZWNlaXZlIG9wZXJhdGlvbiByZXF1ZXN0XG4gICAqICAgQy0+Pk06IFZhbGlkYXRlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqICAgQy0+PkM6IENyZWF0ZSBjaGlsZCBjb250ZXh0XG4gICAqICAgQy0+PkE6IFByb2Nlc3Mgb3BlcmF0aW9uIGFyZ3NcbiAgICogICBBLT4+QzogUmV0dXJuIGNvbnRleHQgYXJnc1xuICAgKiAgIEMtPj5DOiBBcHBseSBvdmVycmlkZXNcbiAgICogICBDLT4+QzogUmV0dXJuIGZpbmFsIGNvbnRleHRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhcmdzPFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICA+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBhcmdzOiBhbnlbXSxcbiAgICBjb250ZXh0dWFsPzogQ29udGV4dHVhbDxGPixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEY+XG4gICk6IFByb21pc2U8Q29udGV4dEFyZ3M8RiwgQz4+IHtcbiAgICBjb25zdCBsYXN0ID0gYXJncy5wb3AoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoKSB7XG4gICAgICBpZiAoY29udGV4dHVhbClcbiAgICAgICAgcmV0dXJuIGNvbnRleHR1YWwuY29udGV4dChvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuIENvbnRleHQuZnJvbShvcGVyYXRpb24sIG92ZXJyaWRlcyB8fCB7fSwgbW9kZWwsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGxldCBjOiBDO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIENvbnRleHQpIHtcbiAgICAgICAgYyA9IGxhc3QgYXMgQztcbiAgICAgICAgYXJncy5wdXNoKGxhc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJncy5wdXNoKGxhc3QpO1xuICAgICAgICBjID0gKGF3YWl0IGdldENvbnRleHQoKSkgYXMgQztcbiAgICAgICAgYXJncy5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjID0gKGF3YWl0IGdldENvbnRleHQoKSkgYXMgQztcbiAgICAgIGFyZ3MucHVzaChjKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb250ZXh0OiBjLCBhcmdzOiBhcmdzIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gY2hhbmdlIGEgbWV0aG9kIG9mIGFuIG9iamVjdCBwcmVmaXhpbmcgaXQgd2l0aCBhbm90aGVyXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBCYXNlIE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZml4IFRoZSBQcmVmaXggbWV0aG9kLiBUaGUgb3V0cHV0IHdpbGwgYmUgdXNlZCBhcyBhcmd1bWVudHMgaW4gdGhlIG9yaWdpbmFsIG1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IFthZnRlck5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHByZWZpeE1ldGhvZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4TWV0aG9kKFxuICBvYmo6IGFueSxcbiAgYWZ0ZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBwcmVmaXg6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBhZnRlck5hbWU/OiBzdHJpbmdcbikge1xuICBhc3luYyBmdW5jdGlvbiB3cmFwcGVyKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHByZWZpeC5jYWxsKHRoaXMsIC4uLmFyZ3MpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFmdGVyLmFwcGx5KHRoaXMsIHJlc3VsdHMpKTtcbiAgfVxuICBjb25zdCB3cmFwcGVkID0gd3JhcHBlci5iaW5kKG9iaik7XG4gIGNvbnN0IG5hbWUgPSBhZnRlck5hbWUgPyBhZnRlck5hbWUgOiBhZnRlci5uYW1lO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlZCwgXCJuYW1lXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG5hbWUsXG4gIH0pO1xuICBvYmpbbmFtZV0gPSB3cmFwcGVkO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgbWV0aG9kIHRvIGNoYW5nZSBhIG1ldGhvZCBvZiBhbiBvYmplY3Qgc3VmZml4aW5nIGl0IHdpdGggYW5vdGhlclxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJlZm9yZSBUaGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWZmaXggVGhlIFByZWZpeCBtZXRob2QuIFRoZSBvdXRwdXQgd2lsbCBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZU5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHN1ZmZpeE1ldGhvZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWZmaXhNZXRob2QoXG4gIG9iajogYW55LFxuICBiZWZvcmU6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBzdWZmaXg6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBiZWZvcmVOYW1lPzogc3RyaW5nXG4pIHtcbiAgYXN5bmMgZnVuY3Rpb24gd3JhcHBlcih0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShiZWZvcmUuY2FsbCh0aGlzLCAuLi5hcmdzKSk7XG4gICAgcmV0dXJuIHN1ZmZpeC5jYWxsKHRoaXMsIC4uLnJlc3VsdHMpO1xuICB9XG4gIGNvbnN0IHdyYXBwZWQgPSB3cmFwcGVyLmJpbmQob2JqKTtcbiAgY29uc3QgbmFtZSA9IGJlZm9yZU5hbWUgPyBiZWZvcmVOYW1lIDogYmVmb3JlLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVkLCBcIm5hbWVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZSxcbiAgfSk7XG4gIG9ialtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBtZXRob2QgdG8gd3JhcCBhIG1ldGhvZCBvZiBhbiBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIGxvZ2ljXG4gKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgQmFzZSBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGJlZm9yZSB0aGUgbWV0aG9kIHRvIGJlIHByZWZpeGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBUaGUgbWV0aG9kIHRvIGJlIHN1ZmZpeGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gW21ldGhvZE5hbWVdIFdoZW4gdGhlIGFmdGVyIGZ1bmN0aW9uIGFubWUgY2Fubm90IGJlIGV4dHJhY3RlZCwgcGFzcyBpdCBoZXJlXG4gKlxuICogQGZ1bmN0aW9uIHdyYXBNZXRob2RXaXRoQ29udGV4dFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICBvYmo6IGFueSxcbiAgYmVmb3JlOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgbWV0aG9kOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgYWZ0ZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2ROYW1lPzogc3RyaW5nXG4pIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZE5hbWUgPyBtZXRob2ROYW1lIDogbWV0aG9kLm5hbWU7XG4gIG9ialtuYW1lXSA9IG5ldyBQcm94eShvYmpbbmFtZV0sIHtcbiAgICBhcHBseTogYXN5bmMgKHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpID0+IHtcbiAgICAgIGxldCB0cmFuc2Zvcm1lZEFyZ3MgPSBiZWZvcmUuY2FsbCh0aGlzQXJnLCAuLi5hcmdBcnJheSk7XG4gICAgICBpZiAodHJhbnNmb3JtZWRBcmdzIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdHJhbnNmb3JtZWRBcmdzID0gYXdhaXQgdHJhbnNmb3JtZWRBcmdzO1xuICAgICAgY29uc3QgY29udGV4dCA9IHRyYW5zZm9ybWVkQXJnc1t0cmFuc2Zvcm1lZEFyZ3MubGVuZ3RoIC0gMV0gYXMgYW55O1xuICAgICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc3NpbmcgYSBjb250ZXh0XCIpO1xuICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzQXJnLCAuLi50cmFuc2Zvcm1lZEFyZ3MpO1xuICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHRzID0gYXdhaXQgcmVzdWx0cztcbiAgICAgIHJlc3VsdHMgPSBhZnRlci5jYWxsKHRoaXNBcmcsIHJlc3VsdHMsIGNvbnRleHQpO1xuICAgICAgaWYgKHJlc3VsdHMgaW5zdGFuY2VvZiBQcm9taXNlKSByZXN1bHRzID0gYXdhaXQgcmVzdWx0cztcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH0sXG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdXRpbHNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbEtleXMsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGaW5kcyB0aGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBTZWFyY2hlcyBpbiBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCBmb3IgYW4ge0BsaW5rIGlkfSBkZWNvcmF0ZWQgcHJvcGVydHkgYW5kIHJldHVybnMgdGhlIHByb3BlcnR5IGtleSBhbmQgbWV0YWRhdGFcbiAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIG9iamVjdCB0byBzZWFyY2ggZm9yIHByaW1hcnkga2V5XG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpZCBwcm9wZXJ0eSBuYW1lIGFuZCBpdHMgbWV0YWRhdGFcbiAqIEBmdW5jdGlvbiBmaW5kUHJpbWFyeUtleVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKlxuICogICBDYWxsZXItPj5maW5kUHJpbWFyeUtleTogbW9kZWxcbiAqICAgZmluZFByaW1hcnlLZXktPj5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmU6IGdldCBkZWNvcmF0b3JzXG4gKiAgIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZS0tPj5maW5kUHJpbWFyeUtleTogZGVjb3JhdG9yc1xuICogICBmaW5kUHJpbWFyeUtleS0+PmZpbmRQcmltYXJ5S2V5OiBmaWx0ZXIgSUQgZGVjb3JhdG9yc1xuICogICBmaW5kUHJpbWFyeUtleS0+PmZpbmRQcmltYXJ5S2V5OiB2YWxpZGF0ZSBzaW5nbGUgSUQgcHJvcGVydHlcbiAqICAgZmluZFByaW1hcnlLZXktLT4+Q2FsbGVyOiB7aWQsIHByb3BzfVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUHJpbWFyeUtleTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUoXG4gICAgbW9kZWwsXG4gICAgdW5kZWZpbmVkLFxuICAgIERCS2V5cy5SRUZMRUNUICsgREJLZXlzLklEXG4gICk7XG4gIGNvbnN0IGlkRGVjb3JhdG9ycyA9IE9iamVjdC5lbnRyaWVzKGRlY29yYXRvcnMgYXMgb2JqZWN0KS5yZWR1Y2UoXG4gICAgKGFjY3VtOiB7IFtpbmRleGVyOiBzdHJpbmddOiBhbnlbXSB9LCBbcHJvcCwgZGVjc10pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gKGRlY3MgYXMgeyBrZXk6IHN0cmluZyB9W10pLmZpbHRlcihcbiAgICAgICAgKGQpID0+IGQua2V5ICE9PSBNb2RlbEtleXMuVFlQRVxuICAgICAgKTtcbiAgICAgIGlmIChmaWx0ZXJlZCAmJiBmaWx0ZXJlZC5sZW5ndGgpIHtcbiAgICAgICAgYWNjdW1bcHJvcF0gPSBhY2N1bVtwcm9wXSB8fCBbXTtcbiAgICAgICAgYWNjdW1bcHJvcF0ucHVzaCguLi5maWx0ZXJlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xuXG4gIGlmICghaWREZWNvcmF0b3JzIHx8ICFPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIElEIGRlY29yYXRlZCBQcm9wZXJ0eVwiKTtcbiAgaWYgKE9iamVjdC5rZXlzKGlkRGVjb3JhdG9ycykubGVuZ3RoID4gMSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihzZihPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmpvaW4oXCIsIFwiKSkpO1xuICBjb25zdCBpZFByb3AgPSBPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpWzBdO1xuICBpZiAoIWlkUHJvcCkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCBJRCBkZWNvcmF0ZWQgUHJvcGVydHlcIik7XG4gIHJldHVybiB7XG4gICAgaWQ6IGlkUHJvcCBhcyBrZXlvZiBNLFxuICAgIHByb3BzOiBpZERlY29yYXRvcnNbaWRQcm9wXVswXS5wcm9wcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZSBmcm9tIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IFNlYXJjaGVzIGZvciB0aGUgSUQtZGVjb3JhdGVkIHByb3BlcnR5IGluIHRoZSBtb2RlbCBhbmQgcmV0dXJucyBpdHMgdmFsdWVcbiAqIEBwYXJhbSB7TW9kZWx9IG1vZGVsIC0gVGhlIG1vZGVsIG9iamVjdCB0byBleHRyYWN0IHRoZSBJRCBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXR1cm5FbXB0eT1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiB1bmRlZmluZWQgaWYgbm8gSUQgdmFsdWUgaXMgZm91bmRcbiAqIEByZXR1cm4ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gVGhlIHByaW1hcnkga2V5IHZhbHVlXG4gKiBAZnVuY3Rpb24gZmluZE1vZGVsSWRcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRNb2RlbElkXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKlxuICogICBDYWxsZXItPj5maW5kTW9kZWxJZDogbW9kZWwsIHJldHVybkVtcHR5XG4gKiAgIGZpbmRNb2RlbElkLT4+ZmluZFByaW1hcnlLZXk6IG1vZGVsXG4gKiAgIGZpbmRQcmltYXJ5S2V5LS0+PmZpbmRNb2RlbElkOiB7aWQsIHByb3BzfVxuICogICBmaW5kTW9kZWxJZC0+PmZpbmRNb2RlbElkOiBleHRyYWN0IG1vZGVsW2lkXVxuICogICBmaW5kTW9kZWxJZC0+PmZpbmRNb2RlbElkOiB2YWxpZGF0ZSBJRCBleGlzdHMgaWYgcmVxdWlyZWRcbiAqICAgZmluZE1vZGVsSWQtLT4+Q2FsbGVyOiBJRCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTW9kZWxJZDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgcmV0dXJuRW1wdHkgPSBmYWxzZVxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgY29uc3QgaWRQcm9wID0gZmluZFByaW1hcnlLZXkobW9kZWwpLmlkO1xuICBjb25zdCBtb2RlbElkID0gbW9kZWxbaWRQcm9wXTtcbiAgaWYgKHR5cGVvZiBtb2RlbElkID09PSBcInVuZGVmaW5lZFwiICYmICFyZXR1cm5FbXB0eSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7aWRQcm9wIGFzIHN0cmluZ31gXG4gICAgKTtcbiAgcmV0dXJuIG1vZGVsSWQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xufVxuIiwiaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZW5mb3JjZURCRGVjb3JhdG9ycyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB3cmFwTWV0aG9kV2l0aENvbnRleHQgfSBmcm9tIFwiLi93cmFwcGVyc1wiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiLi4vaWRlbnRpdHkvdXRpbHNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi9Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gcHJvdmlkaW5nIENSVUQgb3BlcmF0aW9ucyBmb3IgbW9kZWxzLlxuICogQHN1bW1hcnkgVGhlIEJhc2VSZXBvc2l0b3J5IGNsYXNzIHNlcnZlcyBhcyBhIGZvdW5kYXRpb24gZm9yIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb25zLCBwcm92aWRpbmdcbiAqIGFic3RyYWN0IGFuZCBjb25jcmV0ZSBtZXRob2RzIGZvciBjcmVhdGluZywgcmVhZGluZywgdXBkYXRpbmcsIGFuZCBkZWxldGluZyBtb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCBoYW5kbGVzIG9wZXJhdGlvbiBsaWZlY3ljbGVzIGluY2x1ZGluZyBwcmVmaXggYW5kIHN1ZmZpeCBvcGVyYXRpb25zLCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUsIGRlZmF1bHRzIHRvIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBkZWZhdWx0cyB0byBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzXG4gKiBAY2xhc3MgQmFzZVJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBVc2VyTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoKVxuICogICBuYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogY2xhc3MgVXNlclJlcG9zaXRvcnkgZXh0ZW5kcyBCYXNlUmVwb3NpdG9yeTxVc2VyTW9kZWw+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoVXNlck1vZGVsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKG1vZGVsOiBVc2VyTW9kZWwpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uXG4gKiAgICAgcmV0dXJuIG1vZGVsO1xuICogICB9XG4gKlxuICogICBhc3luYyByZWFkKGtleTogc3RyaW5nKTogUHJvbWlzZTxVc2VyTW9kZWw+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvblxuICogICAgIHJldHVybiBuZXcgVXNlck1vZGVsKHsgaWQ6IGtleSwgbmFtZTogJ1VzZXInIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyB1cGRhdGUobW9kZWw6IFVzZXJNb2RlbCk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8VXNlck1vZGVsPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb25cbiAqICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXkpO1xuICogICAgIHJldHVybiBtb2RlbDtcbiAqICAgfVxuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgUHJlZml4IE1ldGhvZHNcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhYmFzZVxuICogICBwYXJ0aWNpcGFudCBTIGFzIFN1ZmZpeCBNZXRob2RzXG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVmFsaWRhdG9ycy9EZWNvcmF0b3JzXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBDcmVhdGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiBjcmVhdGUobW9kZWwpXG4gKiAgIFItPj5QOiBjcmVhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiBjcmVhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBSZWFkIE9wZXJhdGlvblxuICogICBDLT4+UjogcmVhZChrZXkpXG4gKiAgIFItPj5QOiByZWFkUHJlZml4KGtleSlcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IHJlYWRTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBVcGRhdGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiB1cGRhdGUobW9kZWwpXG4gKiAgIFItPj5QOiB1cGRhdGVQcmVmaXgobW9kZWwpXG4gKiAgIFAtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKE9OKVxuICogICBQLT4+RDogRGF0YWJhc2Ugb3BlcmF0aW9uXG4gKiAgIEQtPj5TOiB1cGRhdGVTdWZmaXgobW9kZWwpXG4gKiAgIFMtPj5WOiBlbmZvcmNlREJEZWNvcmF0b3JzKEFGVEVSKVxuICogICBTLT4+QzogUmV0dXJuIG1vZGVsXG4gKlxuICogICBOb3RlIG92ZXIgQyxWOiBEZWxldGUgT3BlcmF0aW9uXG4gKiAgIEMtPj5SOiBkZWxldGUoa2V5KVxuICogICBSLT4+UDogZGVsZXRlUHJlZml4KGtleSlcbiAqICAgUC0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoT04pXG4gKiAgIFAtPj5EOiBEYXRhYmFzZSBvcGVyYXRpb25cbiAqICAgRC0+PlM6IGRlbGV0ZVN1ZmZpeChtb2RlbClcbiAqICAgUy0+PlY6IGVuZm9yY2VEQkRlY29yYXRvcnMoQUZURVIpXG4gKiAgIFMtPj5DOiBSZXR1cm4gbW9kZWxcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gaW1wbGVtZW50cyBJUmVwb3NpdG9yeTxNLCBGLCBDPlxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFzcyE6IENvbnN0cnVjdG9yPE0+O1xuICBwcml2YXRlIF9wayE6IGtleW9mIE07XG4gIHByaXZhdGUgX3BrUHJvcHMhOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBtb2RlbCBjbGFzcyBjb25zdHJ1Y3Rvci5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBjbGFzcyBkZWZpbml0aW9uIGlzIGZvdW5kLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxNPn0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3NcbiAgICovXG4gIGdldCBjbGFzcygpIHtcbiAgICBpZiAoIXRoaXMuX2NsYXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGNsYXNzIGRlZmluaXRpb24gZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeWApO1xuICAgIHJldHVybiB0aGlzLl9jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzZXJ2ZXMgYXMgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgbW9kZWwuXG4gICAqIElmIG5vdCBhbHJlYWR5IGRldGVybWluZWQsIGl0IGZpbmRzIHRoZSBwcmltYXJ5IGtleSB1c2luZyB0aGUgbW9kZWwncyBkZWNvcmF0b3JzLlxuICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eVxuICAgKi9cbiAgZ2V0IHBrKCk6IGtleW9mIE0ge1xuICAgIGlmICghdGhpcy5fcGspIHtcbiAgICAgIGNvbnN0IHsgaWQsIHByb3BzIH0gPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGFzcygpKTtcbiAgICAgIHRoaXMuX3BrID0gaWQ7XG4gICAgICB0aGlzLl9wa1Byb3BzID0gcHJvcHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9waztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsLlxuICAgKiBJZiBub3QgYWxyZWFkeSBkZXRlcm1pbmVkLCBpdCB0cmlnZ2VycyB0aGUgcGsgZ2V0dGVyIHRvIGZpbmQgdGhlIHByaW1hcnkga2V5IHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb3BlcnRpZXMgb2YgdGhlIHByaW1hcnkga2V5XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBrUHJvcHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX3BrUHJvcHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNvbnN0IHBrID0gdGhpcy5waztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BrUHJvcHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGlmIChjbGF6eikgdGhpcy5fY2xhc3MgPSBjbGF6ejtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBbdGhpcy5jcmVhdGUsIHRoaXMucmVhZCwgdGhpcy51cGRhdGUsIHRoaXMuZGVsZXRlXS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gbS5uYW1lO1xuICAgICAgd3JhcE1ldGhvZFdpdGhDb250ZXh0KFxuICAgICAgICBzZWxmLFxuICAgICAgICAoc2VsZiBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgbSxcbiAgICAgICAgKHNlbGYgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgbW9kZWwgaW5zdGFuY2UgaW4gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbmV3IG1vZGVsIGluc3RhbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgcmVwb3NpdG9yeSBjbGFzc2VzLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGluIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgdG8gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSBieSBjYWxsaW5nXG4gICAqIHRoZSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG1vZGVsIGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKG1vZGVscy5tYXAoKG0pID0+IHRoaXMuY3JlYXRlKG0sIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwcmUtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgYmVmb3JlIGl0IGlzIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIGEgbmV3IG1vZGVsIGluc3RhbmNlLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGNyZWF0aW9uLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwcmVwYXJlZCBtb2RlbCBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQcmVmaXgobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIGNyZWF0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgY3JlYXRpb24uXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgY3JlYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciBjcmVhdGlvbiBhbmQgZXhlY3V0ZXMgcHJlLWNyZWF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYmVmb3JlIHRoZXkgYXJlIGNyZWF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIG5ldyBtb2RlbCBpbnN0YW5jZXMsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgY3JlYXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiAgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBtdWx0aXBsZSBtb2RlbHMgYWZ0ZXIgY3JlYXRpb24gYW5kIGV4ZWN1dGVzIHBvc3QtY3JlYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGNyZWF0aW9uIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgcmVwb3NpdG9yeSBieSBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGtleSAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZChrZXk6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSByZXBvc2l0b3J5IGJ5IHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5c1xuICAgKiBieSBjYWxsaW5nIHRoZSByZWFkIG1ldGhvZCBmb3IgZWFjaCBrZXkgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUgYXJyYXkgb2YgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyByZWFkQWxsKGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGlkKSA9PiB0aGlzLnJlYWQoaWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIG1vZGVsIGFmdGVyIHJldHJpZXZhbCBhbmQgZXhlY3V0ZXMgcG9zdC1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIHJldHJpZXZlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHJlYWRpbmcuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgcmV0cmlldmVkXG4gICAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZWFkU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYW5kIGV4ZWN1dGVzIHByZS1yZWFkIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIGtleSBiZWZvcmUgYSBtb2RlbCBpcyByZWFkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIGEgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggdGhlIGtleSwgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSByZWFkaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRQcmVmaXgoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgbW9kZWw6IE0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgIG1vZGVsW3RoaXMucGtdID0ga2V5IGFzIGFueTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuICAgIHJldHVybiBba2V5LCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIHJlYWRpbmcgbXVsdGlwbGUgbW9kZWxzIGFuZCBleGVjdXRlcyBwcmUtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUga2V5cyBiZWZvcmUgbW9kZWxzIGFyZSByZWFkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCBpbnN0YW50aWF0aW5nIG5ldyBtb2RlbCBpbnN0YW5jZXMgd2l0aCB0aGUga2V5cywgYW5kIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9yc1xuICAgKiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSByZWFkaW5nIGZvciBlYWNoIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgcmVhZCBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBbGxQcmVmaXgoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJnczxNLCBDLCBGPihcbiAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5jbGFzcygpO1xuICAgICAgICBtW3RoaXMucGtdID0gayBhcyBhbnk7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFtrZXlzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIG11bHRpcGxlIG1vZGVscyBhZnRlciByZXRyaWV2YWwgYW5kIGV4ZWN1dGVzIHBvc3QtcmVhZCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHJldHJpZXZlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHJlYWRpbmcgZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRoYXQgd2VyZSByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlYWRBbGxTdWZmaXgobW9kZWxzOiBNW10sIGNvbnRleHQ6IEMpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBtb2RlbCBpbnN0YW5jZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlLlxuICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlIHJlcG9zaXRvcnkgY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgVXBkYXRlcyBtdWx0aXBsZSBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZSBieSBjYWxsaW5nXG4gICAqIHRoZSB1cGRhdGUgbWV0aG9kIGZvciBlYWNoIG1vZGVsIGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnkpOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtb2RlbHMubWFwKChtKSA9PiB0aGlzLnVwZGF0ZShtLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciB1cGRhdGUgYW5kIGV4ZWN1dGVzIHBvc3QtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEZpbmFsaXplcyBhIG1vZGVsIGFmdGVyIGl0IGhhcyBiZWVuIHVwZGF0ZWQgaW4gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYWZ0ZXIgdXBkYXRpbmcuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdGhhdCB3YXMgdXBkYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlIGFuZCBleGVjdXRlcyBwcmUtdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGJlZm9yZSBpdCBpcyB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgdmFsaWRhdGluZyB0aGUgcHJpbWFyeSBrZXksIHJldHJpZXZpbmcgdGhlIGV4aXN0aW5nIG1vZGVsLFxuICAgKiBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHVwZGF0aW5nLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmUgZm9yIHVwZGF0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlUHJlZml4KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzPE0sIEMsIEY+KFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgaWQgPSBtb2RlbFt0aGlzLnBrXTtcbiAgICBpZiAoIWlkKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgKTtcbiAgICBjb25zdCBvbGRNb2RlbCA9IGF3YWl0IHRoaXMucmVhZChpZCBhcyBzdHJpbmcpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgb2xkTW9kZWxcbiAgICApO1xuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcHJlLXVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGJlZm9yZSB0aGV5IGFyZSB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgaW5zdGFudGlhdGluZyBuZXcgbW9kZWwgaW5zdGFuY2VzLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIHVwZGF0aW5nIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0byBwcmVwYXJlIGZvciB1cGRhdGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgICAgbSA9IG5ldyB0aGlzLmNsYXNzKG0pO1xuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHVwZGF0ZSBhbmQgZXhlY3V0ZXMgcG9zdC11cGRhdGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIG11bHRpcGxlIG1vZGVscyBhZnRlciB0aGV5IGhhdmUgYmVlbiB1cGRhdGVkIGluIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIHVwZGF0aW5nIGZvciBlYWNoIG1vZGVsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIGFycmF5IG9mIG1vZGVsIGluc3RhbmNlcyB0aGF0IHdlcmUgdXBkYXRlZFxuICAgKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhcnJheSBvZiBwcm9jZXNzZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlQWxsU3VmZml4KG1vZGVsczogTVtdLCBjb250ZXh0OiBDKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuQUZURVJcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSByZXBvc2l0b3J5IGNsYXNzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGUoa2V5OiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIHJlcG9zaXRvcnkgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIG1vZGVsIGluc3RhbmNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmUgdXNpbmcgdGhlaXIgcHJpbWFyeSBrZXlzXG4gICAqIGJ5IGNhbGxpbmcgdGhlIGRlbGV0ZSBtZXRob2QgZm9yIGVhY2gga2V5IGluIHRoZSBhcnJheS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBrZXlzIC0gVGhlIGFycmF5IG9mIHByaW1hcnkga2V5cyBvZiB0aGUgbW9kZWxzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBkZWxldGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGtleXMubWFwKChrKSA9PiB0aGlzLmRlbGV0ZShrLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgYSBtb2RlbCBhZnRlciBkZWxldGlvbiBhbmQgZXhlY3V0ZXMgcG9zdC1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRmluYWxpemVzIGEgbW9kZWwgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGVuZm9yY2luZyBhbnkgZGVjb3JhdG9ycyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGFmdGVyIGRlbGV0aW9uLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgd2FzIGRlbGV0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHByb2Nlc3NlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVN1ZmZpeChtb2RlbDogTSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBhIG1vZGVsIGFuZCBleGVjdXRlcyBwcmUtZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIGtleSBiZWZvcmUgYSBtb2RlbCBpcyBkZWxldGVkIGZyb20gdGhlIGRhdGEgc3RvcmUuIFRoaXMgaW5jbHVkZXNcbiAgICogY3JlYXRpbmcgYSBjb250ZXh0LCByZXRyaWV2aW5nIHRoZSBtb2RlbCB0byBiZSBkZWxldGVkLCBhbmQgZW5mb3JjaW5nIGFueSBkZWNvcmF0b3JzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgYmVmb3JlIGRlbGV0aW9uLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleSBhbmQgY29udGV4dCBhcmd1bWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnM8TSwgdHlwZW9mIHRoaXMsIGFueSwgRiwgQz4oXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciBkZWxldGluZyBtdWx0aXBsZSBtb2RlbHMgYW5kIGV4ZWN1dGVzIHByZS1kZWxldGUgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIG11bHRpcGxlIGtleXMgYmVmb3JlIG1vZGVscyBhcmUgZGVsZXRlZCBmcm9tIHRoZSBkYXRhIHN0b3JlLiBUaGlzIGluY2x1ZGVzXG4gICAqIGNyZWF0aW5nIGEgY29udGV4dCwgcmV0cmlldmluZyB0aGUgbW9kZWxzIHRvIGJlIGRlbGV0ZWQsIGFuZCBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnNcbiAgICogdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgZGVsZXRpb24gZm9yIGVhY2ggbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBhcnJheSBvZiBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGtleXMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZGVsZXRlQWxsUHJlZml4KGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzPE0sIHR5cGVvZiB0aGlzLCBhbnksIEYsIEM+KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIGRlbGV0aW9uIGFuZCBleGVjdXRlcyBwb3N0LWRlbGV0ZSBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBGaW5hbGl6ZXMgbXVsdGlwbGUgbW9kZWxzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZS4gVGhpcyBpbmNsdWRlc1xuICAgKiBlbmZvcmNpbmcgYW55IGRlY29yYXRvcnMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhZnRlciBkZWxldGlvbiBmb3IgZWFjaCBtb2RlbC5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdGhhdCB3ZXJlIGRlbGV0ZWRcbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgcHJvY2Vzc2VkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZUFsbFN1ZmZpeChtb2RlbHM6IE1bXSwgY29udGV4dDogQykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9yczxNLCB0eXBlb2YgdGhpcywgYW55LCBGLCBDPihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkFGVEVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lcmdlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGludG8gYSBuZXcgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgbW9kZWwgaW5zdGFuY2UgYnkgY29tYmluaW5nIHByb3BlcnRpZXMgZnJvbSBhbiBvbGQgbW9kZWwgYW5kIGEgbmV3IG1vZGVsLlxuICAgKiBQcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBtb2RlbCBvdmVycmlkZSBwcm9wZXJ0aWVzIGZyb20gdGhlIG9sZCBtb2RlbCBpZiB0aGV5IGFyZSBkZWZpbmVkLlxuICAgKiBAcGFyYW0ge019IG9sZE1vZGVsIC0gVGhlIG9yaWdpbmFsIG1vZGVsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm4ge019IEEgbmV3IG1vZGVsIGluc3RhbmNlIHdpdGggbWVyZ2VkIHByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZShvbGRNb2RlbDogTSwgbW9kZWw6IE0pOiBNIHtcbiAgICBjb25zdCBleHRyYWN0ID0gKG1vZGVsOiBNKSA9PlxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWwpLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCIpIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBuZXcgdGhpcy5jbGFzcyhPYmplY3QuYXNzaWduKHt9LCBleHRyYWN0KG9sZE1vZGVsKSwgZXh0cmFjdChtb2RlbCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhpcyByZXBvc2l0b3J5IGJ5IHRoZSBuYW1lIG9mIGl0cyBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuY2xhc3MubmFtZX0gUmVwb3NpdG9yeWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGVuZm9yY2VEQkRlY29yYXRvcnMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBCYXNlUmVwb3NpdG9yeSB9IGZyb20gXCIuL0Jhc2VSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uY3JldGUgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiB3aXRoIHZhbGlkYXRpb24gc3VwcG9ydC5cbiAqIEBzdW1tYXJ5IFRoZSBSZXBvc2l0b3J5IGNsYXNzIGV4dGVuZHMgQmFzZVJlcG9zaXRvcnkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHZhbGlkYXRpb25cbiAqIGZ1bmN0aW9uYWxpdHkuIEl0IG92ZXJyaWRlcyBwcmVmaXggbWV0aG9kcyB0byBwZXJmb3JtIG1vZGVsIHZhbGlkYXRpb24gYmVmb3JlIGRhdGFiYXNlXG4gKiBvcGVyYXRpb25zIGFuZCB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIHdoZW4gdmFsaWRhdGlvbiBmYWlscy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUsIGRlZmF1bHRzIHRvIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBkZWZhdWx0cyB0byBDb250ZXh0PEY+XG4gKiBAY2xhc3MgUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFVzZXJNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGlkKClcbiAqICAgaWQ6IHN0cmluZztcbiAqXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIEBtaW5MZW5ndGgoMylcbiAqICAgbmFtZTogc3RyaW5nO1xuICogfVxuICpcbiAqIGNsYXNzIFVzZXJSZXBvc2l0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeTxVc2VyTW9kZWw+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoVXNlck1vZGVsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKG1vZGVsOiBVc2VyTW9kZWwpOiBQcm9taXNlPFVzZXJNb2RlbD4ge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb25cbiAqICAgICByZXR1cm4gbW9kZWw7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2luZyB0aGUgcmVwb3NpdG9yeVxuICogY29uc3QgcmVwbyA9IG5ldyBVc2VyUmVwb3NpdG9yeSgpO1xuICogdHJ5IHtcbiAqICAgY29uc3QgdXNlciA9IGF3YWl0IHJlcG8uY3JlYXRlKHsgbmFtZTogJ0pvJyB9KTsgLy8gV2lsbCB0aHJvdyBWYWxpZGF0aW9uRXJyb3JcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyBWYWxpZGF0aW9uRXJyb3I6IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnNcbiAqIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlcG9zaXRvcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiBleHRlbmRzIEJhc2VSZXBvc2l0b3J5PE0sIEYsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIGNyZWF0aW9uIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIGNyZWF0ZVByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgaW5zdGFudGlhdGVzIGEgbmV3IG1vZGVsLCBlbmZvcmNlcyBkZWNvcmF0b3JzLCBhbmQgdmFsaWRhdGVzXG4gICAqIHRoZSBtb2RlbCBiZWZvcmUgYWxsb3dpbmcgY3JlYXRpb24gdG8gcHJvY2VlZC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlIGZvciBjcmVhdGlvblxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsaWRhdGVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgbW9kZWwgPSBuZXcgdGhpcy5jbGFzcyhtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKG1vZGVsLmhhc0Vycm9ycygpKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcblxuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIGNyZWF0aW9uIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIGNyZWF0ZUFsbFByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzIGZvciBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIENyZWF0ZXMgYSBjb250ZXh0LCBpbnN0YW50aWF0ZXMgbmV3IG1vZGVscywgZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlc1xuICAgKiBlYWNoIG1vZGVsIGJlZm9yZSBhbGxvd2luZyBjcmVhdGlvbiB0byBwcm9jZWVkLiBDb2xsZWN0cyB2YWxpZGF0aW9uIGVycm9ycyBmcm9tIGFsbCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgYXJyYXkgb2YgbW9kZWwgaW5zdGFuY2VzIHRvIHByZXBhcmUgZm9yIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnlbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRlZCBtb2RlbHMgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24sIHdpdGggZGV0YWlscyBhYm91dCB3aGljaCBtb2RlbHMgZmFpbGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3NcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGVsc1ZhbGlkYXRpb24gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0pID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycygpKSlcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzVmFsaWRhdGlvbi5yZWR1Y2UoXG4gICAgICAoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlIHdpdGggdmFsaWRhdGlvbi5cbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzIHRoZSBiYXNlIHVwZGF0ZVByZWZpeCBtZXRob2QgdG8gYWRkIHZhbGlkYXRpb24gY2hlY2tzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgdmFsaWRhdGVzIHRoZSBwcmltYXJ5IGtleSwgcmV0cmlldmVzIHRoZSBleGlzdGluZyBtb2RlbCxcbiAgICogbWVyZ2VzIHRoZSBvbGQgYW5kIG5ldyBtb2RlbHMsIGVuZm9yY2VzIGRlY29yYXRvcnMsIGFuZCB2YWxpZGF0ZXMgdGhlIG1vZGVsXG4gICAqIGJlZm9yZSBhbGxvd2luZyB0aGUgdXBkYXRlIHRvIHByb2NlZWQuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWxpZGF0ZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBtb2RlbCBkb2Vzbid0IGhhdmUgYSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlUHJlZml4KFxuICAgIG1vZGVsOiBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8W00sIC4uLmFyZ3M6IGFueVtdXT4ge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJnc1xuICAgICk7XG4gICAgY29uc3QgcGsgPSAobW9kZWwgYXMgYW55KVt0aGlzLnBrXTtcbiAgICBpZiAoIXBrKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5ICR7dGhpcy5wayBhcyBzdHJpbmd9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9sZE1vZGVsOiBNID0gYXdhaXQgdGhpcy5yZWFkKHBrKTtcblxuICAgIG1vZGVsID0gdGhpcy5tZXJnZShvbGRNb2RlbCwgbW9kZWwpO1xuXG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgbW9kZWwsXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICBvbGRNb2RlbFxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUobW9kZWwuaGFzRXJyb3JzKG9sZE1vZGVsIGFzIGFueSkpO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBbbW9kZWwsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBtdWx0aXBsZSBtb2RlbHMgZm9yIHVwZGF0ZSB3aXRoIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSB1cGRhdGVBbGxQcmVmaXggbWV0aG9kIHRvIGFkZCB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgbXVsdGlwbGUgbW9kZWxzLlxuICAgKiBDcmVhdGVzIGEgY29udGV4dCwgdmFsaWRhdGVzIHByaW1hcnkga2V5cywgcmV0cmlldmVzIGV4aXN0aW5nIG1vZGVscywgbWVyZ2VzIG9sZCBhbmQgbmV3IG1vZGVscyxcbiAgICogZW5mb3JjZXMgZGVjb3JhdG9ycywgYW5kIHZhbGlkYXRlcyBlYWNoIG1vZGVsIGJlZm9yZSBhbGxvd2luZyB1cGRhdGVzIHRvIHByb2NlZWQuXG4gICAqIENvbGxlY3RzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYWxsIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBhcnJheSBvZiBtb2RlbCBpbnN0YW5jZXMgdG8gcHJlcGFyZSBmb3IgdXBkYXRlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWxpZGF0ZWQgbW9kZWxzIGFuZCBjb250ZXh0IGFyZ3VtZW50c1xuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBhbnkgbW9kZWwgZG9lc24ndCBoYXZlIGEgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiBhbnkgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbiwgd2l0aCBkZXRhaWxzIGFib3V0IHdoaWNoIG1vZGVscyBmYWlsZWRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IG1bdGhpcy5wa107XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgTm8gdmFsdWUgZm9yIHRoZSBJZCBpcyBkZWZpbmVkIHVuZGVyIHRoZSBwcm9wZXJ0eSAke3RoaXMucGsgYXMgc3RyaW5nfWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBpZCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gICAgY29uc3Qgb2xkTW9kZWxzOiBNW10gPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OLFxuICAgICAgICAgIG9sZE1vZGVsc1tpXVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGVsc1ZhbGlkYXRpb24gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+IFByb21pc2UucmVzb2x2ZShtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0gYXMgYW55KSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1ZhbGlkYXRpb24ucmVkdWNlKFxuICAgICAgKGFjY3VtOiBzdHJpbmcgfCB1bmRlZmluZWQsIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUpXG4gICAgICAgICAgYWNjdW0gPVxuICAgICAgICAgICAgdHlwZW9mIGFjY3VtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWZsZWN0aW9uIGtleSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEga2V5IGZvciBzdG9yaW5nIG1ldGFkYXRhIGluIHRoZSByZWZsZWN0aW9uIHN5c3RlbSBieSBwcmVmaXhpbmdcbiAgICogdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBkYXRhYmFzZSByZWZsZWN0aW9uIHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSB0byBwcmVmaXhcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcHJlZml4ZWQgcmVmbGVjdGlvbiBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gREJLZXlzLlJFRkxFQ1QgKyBrZXk7XG4gIH1cbn1cbiIsImltcG9ydCBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgZGF0ZSxcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgcmVxdWlyZWQsXG4gIHR5cGUsXG4gIFZhbGlkYXRpb24sXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERCS2V5cywgREVGQVVMVF9USU1FU1RBTVBfRk9STUFUIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgREJPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhZnRlciwgb24sIG9uQ3JlYXRlVXBkYXRlIH0gZnJvbSBcIi4uL29wZXJhdGlvbnMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSVJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9JUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvZXJyb3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L0NvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZXZlbnRzIGEgcHJvcGVydHkgZnJvbSBiZWluZyBtb2RpZmllZCBhZnRlciBpbml0aWFsIGNyZWF0aW9uLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIHJlYWRvbmx5LCBjYXVzaW5nIHZhbGlkYXRpb24gZXJyb3JzIGlmIGF0dGVtcHRzIGFyZSBtYWRlIHRvIG1vZGlmeSBpdCBkdXJpbmcgdXBkYXRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVBRE9OTFkuSU5WQUxJRH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiByZWFkb25seVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRvbmx5KFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFQURPTkxZLklOVkFMSURcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLnVwZGF0ZUtleShEQktleXMuUkVBRE9OTFkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICB9KVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHNldHMgYSB0aW1lc3RhbXAgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICogQHN1bW1hcnkgVXBkYXRlcyBhIG1vZGVsIHByb3BlcnR5IHdpdGggdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gdGhlIHJlcG9zaXRvcnkgY29udGV4dC5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlXG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgcmVwb3NpdG9yeSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgZGF0YSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHVwZGF0ZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gdGltZXN0YW1wSGFuZGxlclxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lc3RhbXBIYW5kbGVyPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjb250ZXh0LnRpbWVzdGFtcDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXV0b21hdGljYWxseSBtYW5hZ2VzIHRpbWVzdGFtcCBwcm9wZXJ0aWVzIGZvciB0cmFja2luZyBjcmVhdGlvbiBhbmQgdXBkYXRlIHRpbWVzLlxuICogQHN1bW1hcnkgTWFya3MgdGhlIHByb3BlcnR5IGFzIGEgdGltZXN0YW1wLCBtYWtpbmcgaXQgcmVxdWlyZWQgYW5kIGVuc3VyaW5nIGl0J3MgYSB2YWxpZCBkYXRlLiBUaGUgcHJvcGVydHkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAgZHVyaW5nIHNwZWNpZmllZCBvcGVyYXRpb25zLlxuICpcbiAqIERhdGUgRm9ybWF0OlxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge09wZXJhdGlvbktleXNbXX0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbnMgdG8gYWN0IG9uLiBEZWZhdWx0cyB0byB7QGxpbmsgREJPcGVyYXRpb25zLkNSRUFURV9VUERBVEV9XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gLSBUaGUgdGltZXN0YW1wIGZvcm1hdC4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVH1cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiB0aW1lc3RhbXBcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgVCBhcyBUaW1lc3RhbXBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5NOiBDcmVhdGUvVXBkYXRlIG1vZGVsXG4gKiAgIE0tPj5UOiBQcm9jZXNzIHRpbWVzdGFtcCBwcm9wZXJ0eVxuICogICBULT4+TTogQXBwbHkgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogICBULT4+TTogQXBwbHkgZGF0ZSBmb3JtYXQgdmFsaWRhdGlvblxuICpcbiAqICAgYWx0IFVwZGF0ZSBvcGVyYXRpb25cbiAqICAgICBULT4+VjogUmVnaXN0ZXIgdGltZXN0YW1wIHZhbGlkYXRvclxuICogICAgIFYtPj5NOiBWYWxpZGF0ZSB0aW1lc3RhbXAgaXMgbmV3ZXJcbiAqICAgZW5kXG4gKlxuICogICBULT4+TTogU2V0IGN1cnJlbnQgdGltZXN0YW1wXG4gKiAgIE0tPj5DOiBSZXR1cm4gdXBkYXRlZCBtb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wKFxuICBvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSA9IERCT3BlcmF0aW9ucy5DUkVBVEVfVVBEQVRFIGFzIHVua25vd24gYXMgT3BlcmF0aW9uS2V5c1tdLFxuICBmb3JtYXQ6IHN0cmluZyA9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24udXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgIGRhdGUoZm9ybWF0LCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5EQVRFKSxcbiAgICByZXF1aXJlZChERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgb24ob3BlcmF0aW9uLCB0aW1lc3RhbXBIYW5kbGVyKSxcbiAgXTtcblxuICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICBwcm9wTWV0YWRhdGEoVmFsaWRhdGlvbi51cGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCksIHtcbiAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgIH0pXG4gICAgKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKC4uLmRlY29yYXRvcnMpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXIgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gSlNPTiBzdHJpbmcgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBhIGNvbXBsZXggb2JqZWN0IHByb3BlcnR5IHRvIGEgSlNPTiBzdHJpbmcgYmVmb3JlIHN0b3JpbmcgaXQgaW4gdGhlIGRhdGFiYXNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2VyaWFsaXplZFxuICogQGZ1bmN0aW9uIHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlcmlhbGl6ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBJUmVwb3NpdG9yeTxNLCBGLCBDPixcbiAgVixcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghbW9kZWxba2V5XSkgcmV0dXJuO1xuICB0cnkge1xuICAgIG1vZGVsW2tleV0gPSBKU09OLnN0cmluZ2lmeShtb2RlbFtrZXldKSBhcyBNW2tleW9mIE1dO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHNlcmlhbGl6ZSAke2tleS50b1N0cmluZygpfSBwcm9wZXJ0eSBvZiBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9OiBlYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlciBmdW5jdGlvbiB0aGF0IGRlc2VyaWFsaXplcyBhIHByb3BlcnR5IGZyb20gSlNPTiBzdHJpbmcgYWZ0ZXIgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgSlNPTiBzdHJpbmcgcHJvcGVydHkgYmFjayB0byBpdHMgb3JpZ2luYWwgY29tcGxleCBvYmplY3QgZm9ybSBhZnRlciByZXRyaWV2aW5nIGl0IGZyb20gdGhlIGRhdGFiYXNlLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGRhdGEgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZGVzZXJpYWxpemVcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBkZXNlcmlhbGl6ZWRcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbFxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVBZnRlckFsbDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW1vZGVsW2tleV0pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBtb2RlbFtrZXldICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBtb2RlbFtrZXldID0gSlNPTi5wYXJzZShtb2RlbFtrZXldKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGRlc2VyaWFsaXplICR7a2V5LnRvU3RyaW5nKCl9IHByb3BlcnR5IG9mIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX06ICR7ZX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmFibGVzIGF1dG9tYXRpYyBKU09OIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBmb3IgY29tcGxleCBvYmplY3QgcHJvcGVydGllcy5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgY29udmVydHMgY29tcGxleCBvYmplY3RzIHRvIEpTT04gc3RyaW5ncyBiZWZvcmUgc3RvcmluZyBpbiB0aGUgZGF0YWJhc2UgYW5kIGJhY2sgdG8gb2JqZWN0cyB3aGVuIHJldHJpZXZpbmcgdGhlbS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBzZXJpYWxpemVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTZXJpYWxpemVEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBDcmVhdGUvVXBkYXRlIEZsb3dcbiAqICAgQy0+Pk06IFNldCBjb21wbGV4IG9iamVjdCBwcm9wZXJ0eVxuICogICBNLT4+UzogUHJvY2VzcyBwcm9wZXJ0eSAoY3JlYXRlL3VwZGF0ZSlcbiAqICAgUy0+Pk06IENvbnZlcnQgdG8gSlNPTiBzdHJpbmdcbiAqICAgTS0+PkRCOiBTdG9yZSBzZXJpYWxpemVkIGRhdGFcbiAqXG4gKiAgIE5vdGUgb3ZlciBDLERCOiBSZXRyaWV2YWwgRmxvd1xuICogICBDLT4+TTogUmVxdWVzdCBtb2RlbFxuICogICBNLT4+REI6IEZldGNoIGRhdGFcbiAqICAgREItPj5NOiBSZXR1cm4gd2l0aCBzZXJpYWxpemVkIHByb3BlcnR5XG4gKiAgIE0tPj5TOiBQcm9jZXNzIHByb3BlcnR5IChhZnRlciBhbGwgb3BzKVxuICogICBTLT4+TTogUGFyc2UgSlNPTiBiYWNrIHRvIG9iamVjdFxuICogICBNLT4+QzogUmV0dXJuIG1vZGVsIHdpdGggZGVzZXJpYWxpemVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShzZXJpYWxpemVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgYWZ0ZXIoREJPcGVyYXRpb25zLkFMTCwgc2VyaWFsaXplQWZ0ZXJBbGwpLFxuICAgIHR5cGUoW1N0cmluZy5uYW1lLCBPYmplY3QubmFtZV0pLFxuICAgIG1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5TRVJJQUxJWkUpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IHByb3BNZXRhZGF0YSwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyByZWFkb25seSB9IGZyb20gXCIuLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEQktleXMgfSBmcm9tIFwiLi4vbW9kZWwvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgYXMgYW4gSUQgZmllbGRcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb21wb3NpdGUgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyByZXF1aXJlZCwgcmVhZG9ubHksIGFuZCBhcyB0aGUgSUQgZmllbGQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBpZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgcmVxdWlyZWQoKSxcbiAgICByZWFkb25seSgpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLCB7fSlcbiAgKTtcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbmFsQXN5bmMsXG4gIERlY29yYXRvck1ldGFkYXRhQXN5bmMsXG4gIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzLFxuICBNb2RlbCxcbiAgTW9kZWxDb25kaXRpb25hbEFzeW5jLFxuICBNb2RlbEVycm9yRGVmaW5pdGlvbixcbiAgTW9kZWxFcnJvcnMsXG4gIE1vZGVsS2V5cyxcbiAgdG9Db25kaXRpb25hbFByb21pc2UsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBVcGRhdGVWYWxpZGF0aW9uS2V5cywgVXBkYXRlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkIH0gZnJvbSBcIi4uL2lkZW50aXR5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXRyaWV2ZXMgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnMgZnJvbSBhIG1vZGVsIGZvciB1cGRhdGUgb3BlcmF0aW9ucywgaW5jbHVkaW5nXG4gKiBzdXBwb3J0IGZvciBzcGVjaWFsIGhhbmRsaW5nIG9mIGxpc3QgZGVjb3JhdG9ycy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciB0aGUgbW9kZWwncyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFuZCBmaWx0ZXJzIG91dCB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlXG4gKiBgcHJvcHNUb0lnbm9yZWAgYXJyYXkuIEZvciBlYWNoIHJlbWFpbmluZyBwcm9wZXJ0eSwgcmV0cmlldmVzIHZhbGlkYXRpb24gZGVjb3JhdG9ycyBzcGVjaWZpY1xuICogdG8gdXBkYXRlIG9wZXJhdGlvbnMgdXNpbmcgdGhlIGBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUYCBrZXkuIEFkZGl0aW9uYWxseSwgaXQgZXhwbGljaXRseVxuICogY2hlY2tzIGZvciBhbmQgYXBwZW5kcyBhbnkgYExJU1RgIHR5cGUgZGVjb3JhdG9ycyB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb24gb2YgY29sbGVjdGlvbiB0eXBlcy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgZ2VuZXJpYyBwYXJhbWV0ZXIgZXh0ZW5kaW5nIHRoZSBgTW9kZWxgIGNsYXNzLCByZXByZXNlbnRpbmcgdGhlIG1vZGVsIHR5cGUgYmVpbmcgaW5zcGVjdGVkLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgaW5zcGVjdGVkIGZvciB1cGRhdGUtcmVsYXRlZCB2YWxpZGF0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzVG9JZ25vcmUgLSBBIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSB2YWxpZGF0aW9uIGRlY29yYXRvciByZXRyaWV2YWwgcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJuIHtWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW119IEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZGVjb3JhdG9yIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgYm90aFxuICogdXBkYXRlLXNwZWNpZmljIGFuZCBsaXN0LXR5cGUgZGVjb3JhdG9ycywgZXhjbHVkaW5nIHRob3NlIGZvciBpZ25vcmVkIHByb3BlcnRpZXMuXG4gKlxuICogQGZ1bmN0aW9uIGdldFZhbGlkYXRhYmxlVXBkYXRlUHJvcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRhYmxlVXBkYXRlUHJvcHM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG1vZGVsKSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBwcm9wKSAmJlxuICAgICAgIXByb3BzVG9JZ25vcmUuaW5jbHVkZXMocHJvcClcbiAgICApIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9wZXJ0eURlZmluaXRpb24gPSBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3AsXG4gICAgICAgIFVwZGF0ZVZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3REZWNvcmF0b3IgPSBnZXRWYWxpZGF0aW9uRGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHByb3BcbiAgICAgICkuZGVjb3JhdG9ycy5maW5kKCh7IGtleSB9KSA9PiBrZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QpO1xuXG4gICAgICBpZiAobGlzdERlY29yYXRvcilcbiAgICAgICAgdmFsaWRhdGlvblByb3BlcnR5RGVmaW5pdGlvbi5kZWNvcmF0b3JzLnB1c2gobGlzdERlY29yYXRvcik7XG5cbiAgICAgIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaCh2YWxpZGF0aW9uUHJvcGVydHlEZWZpbml0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbmV3TW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvcjogVXBkYXRlVmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoXG4gICAgZGVjb3JhdG9yLmtleVxuICApIGFzIFVwZGF0ZVZhbGlkYXRvcjtcblxuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIFNraXAgdmFsaWRhdG9ycyB0aGF0IGFyZW4ndCBVcGRhdGVWYWxpZGF0b3JzXG4gIGlmICghdmFsaWRhdG9yLnVwZGF0ZUhhc0Vycm9ycykgcmV0dXJuIHRvQ29uZGl0aW9uYWxQcm9taXNlKHVuZGVmaW5lZCwgYXN5bmMpO1xuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKVxuICAgIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZSh1bmRlZmluZWQsIGFzeW5jKTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9IE9iamVjdC52YWx1ZXMoZGVjb3JhdG9yLnByb3BzKSB8fCB7fTtcblxuICAvLyBjb25zdCBjb250ZXh0ID0gUGF0aFByb3h5RW5naW5lLmNyZWF0ZShvYmosIHtcbiAgLy8gICBpZ25vcmVVbmRlZmluZWQ6IHRydWUsXG4gIC8vICAgaWdub3JlTnVsbDogdHJ1ZSxcbiAgLy8gfSk7XG5cbiAgY29uc3QgbWF5YmVFcnJvciA9IHZhbGlkYXRvci51cGRhdGVIYXNFcnJvcnMoXG4gICAgKG5ld01vZGVsIGFzIGFueSlbcHJvcF0sXG4gICAgKG9sZE1vZGVsIGFzIGFueSlbcHJvcF0sXG4gICAgLi4uZGVjb3JhdG9yUHJvcHNcbiAgKTtcblxuICByZXR1cm4gdG9Db25kaXRpb25hbFByb21pc2UobWF5YmVFcnJvciwgYXN5bmMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEZWNvcmF0b3JzPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbmV3TW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNLFxuICBwcm9wOiBzdHJpbmcsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhQXN5bmNbXSxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFByb21pc2U8c3RyaW5nPj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgLy8gc2tpcCBhc3luYyBkZWNvcmF0b3JzIGlmIHZhbGlkYXRlRGVjb3JhdG9ycyBpcyBjYWxsZWQgc3luY2hyb25vdXNseSAoYXN5bmMgPSBmYWxzZSlcbiAgICBpZiAoIWFzeW5jICYmIGRlY29yYXRvci5wcm9wcy5hc3luYykgY29udGludWU7XG5cbiAgICBsZXQgdmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRlRGVjb3JhdG9yKFxuICAgICAgbmV3TW9kZWwsXG4gICAgICBvbGRNb2RlbCxcbiAgICAgIHByb3AsXG4gICAgICBkZWNvcmF0b3IsXG4gICAgICBhc3luY1xuICAgICk7XG5cbiAgICAvKlxuICAgIElmIHRoZSBkZWNvcmF0b3IgaXMgYSBsaXN0LCBlYWNoIGVsZW1lbnQgbXVzdCBiZSBjaGVja2VkLlxuICAgIFdoZW4gJ2FzeW5jJyBpcyB0cnVlLCB0aGUgJ2Vycicgd2lsbCBhbHdheXMgYmUgYSBwZW5kaW5nIHByb21pc2UgaW5pdGlhbGx5LFxuICAgIHNvIHRoZSAnIWVycicgY2hlY2sgd2lsbCBldmFsdWF0ZSB0byBmYWxzZSAoZXZlbiBpZiB0aGUgcHJvbWlzZSBsYXRlciByZXNvbHZlcyB3aXRoIG5vIGVycm9ycylcbiAgICAqL1xuICAgIGlmIChkZWNvcmF0b3Iua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUICYmICghdmFsaWRhdGlvbkVycm9ycyB8fCBhc3luYykpIHtcbiAgICAgIGNvbnN0IG5ld1Byb3BWYWx1ZSA9IChuZXdNb2RlbCBhcyBhbnkpW3Byb3BdO1xuICAgICAgY29uc3Qgb2xkUHJvcFZhbHVlID0gKG9sZE1vZGVsIGFzIGFueSlbcHJvcF07XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9XG4gICAgICAgIG5ld1Byb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5uZXdQcm9wVmFsdWVdIDogbmV3UHJvcFZhbHVlO1xuICAgICAgY29uc3Qgb2xkVmFsdWVzID1cbiAgICAgICAgb2xkUHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLm9sZFByb3BWYWx1ZV0gOiBvbGRQcm9wVmFsdWU7XG5cbiAgICAgIGlmIChuZXdWYWx1ZXMgJiYgbmV3VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPVxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGFzcyB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGF6eiB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jdXN0b21UeXBlcztcblxuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3QgZXJycyA9IG5ld1ZhbHVlcy5tYXAoKGNoaWxkVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGZpbmQgYnkgaWQgc28gdGhlIGxpc3QgZWxlbWVudHMgb3JkZXIgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICBjb25zdCBpZCA9IGZpbmRNb2RlbElkKGNoaWxkVmFsdWUgYXMgYW55LCB0cnVlKTtcbiAgICAgICAgICBpZiAoIWlkKSByZXR1cm4gXCJGYWlsZWQgdG8gZmluZCBtb2RlbCBpZFwiO1xuXG4gICAgICAgICAgY29uc3Qgb2xkTW9kZWwgPSBvbGRWYWx1ZXMuZmluZChcbiAgICAgICAgICAgIChlbDogYW55KSA9PiBpZCA9PT0gZmluZE1vZGVsSWQoZWwsIHRydWUpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChNb2RlbC5pc01vZGVsKGNoaWxkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZS5oYXNFcnJvcnMob2xkTW9kZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXModHlwZW9mIGNoaWxkVmFsdWUpXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBcIlZhbHVlIGhhcyBubyB2YWxpZGF0YWJsZSB0eXBlXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMgPSBQcm9taXNlLmFsbChlcnJzKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gcmVzdWx0LmV2ZXJ5KChyKSA9PiAhcik7XG4gICAgICAgICAgICByZXR1cm4gYWxsRW1wdHkgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICAgICAgfSkgYXMgYW55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsbEVtcHR5ID0gZXJycy5ldmVyeSgocjogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiAhcik7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IGVycnMubGVuZ3RoID4gMCAmJiAhYWxsRW1wdHkgPyBlcnJzIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRpb25FcnJvcnMpIChyZXN1bHQgYXMgYW55KVtkZWNvcmF0b3Iua2V5XSA9IHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICBpZiAoIWFzeW5jKVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDAgPyAocmVzdWx0IGFzIGFueSkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG4gIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpIGFzIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHJlc29sdmVkVmFsdWVzKSA9PiB7XG4gICAgY29uc3QgcmVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsID0gcmVzb2x2ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzW2tleXNbaV1dID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPiAwID8gcmVzIDogdW5kZWZpbmVkO1xuICB9KSBhcyBhbnk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBjaGFuZ2VzIGJldHdlZW4gdHdvIG1vZGVsIHZlcnNpb25zXG4gKiBAc3VtbWFyeSBDb21wYXJlcyBhbiBvbGQgYW5kIG5ldyBtb2RlbCB2ZXJzaW9uIHRvIHZhbGlkYXRlIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG9sZE1vZGVsIC0gVGhlIG9yaWdpbmFsIG1vZGVsIHZlcnNpb25cbiAqIEBwYXJhbSB7TX0gbmV3TW9kZWwgLSBUaGUgdXBkYXRlZCBtb2RlbCB2ZXJzaW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFzeW5jIC0gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBhc3luY2hyb25vdXMuXG4gKiBAcGFyYW0gey4uLnN0cmluZ1tdfSBleGNlcHRpb25zIC0gUHJvcGVydGllcyB0byBleGNsdWRlIGZyb20gdmFsaWRhdGlvblxuICogQHJldHVybiB7TW9kZWxFcnJvckRlZmluaXRpb258dW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBhcmVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgdmFsaWRhdGVDb21wYXJlXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3Rpb25cbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICpcbiAqICAgQ2FsbGVyLT4+dmFsaWRhdGVDb21wYXJlOiBvbGRNb2RlbCwgbmV3TW9kZWwsIGV4Y2VwdGlvbnNcbiAqICAgdmFsaWRhdGVDb21wYXJlLT4+UmVmbGVjdGlvbjogZ2V0IGRlY29yYXRlZCBwcm9wZXJ0aWVzXG4gKiAgIFJlZmxlY3Rpb24tLT4+dmFsaWRhdGVDb21wYXJlOiBwcm9wZXJ0eSBkZWNvcmF0b3JzXG4gKiAgIGxvb3AgRm9yIGVhY2ggZGVjb3JhdGVkIHByb3BlcnR5XG4gKiAgICAgdmFsaWRhdGVDb21wYXJlLT4+VmFsaWRhdGlvbjogZ2V0IHZhbGlkYXRvclxuICogICAgIFZhbGlkYXRpb24tLT4+dmFsaWRhdGVDb21wYXJlOiB2YWxpZGF0b3JcbiAqICAgICB2YWxpZGF0ZUNvbXBhcmUtPj52YWxpZGF0ZUNvbXBhcmU6IHZhbGlkYXRlIHByb3BlcnR5IHVwZGF0ZVxuICogICBlbmRcbiAqICAgbG9vcCBGb3IgbmVzdGVkIG1vZGVsc1xuICogICAgIHZhbGlkYXRlQ29tcGFyZS0+PnZhbGlkYXRlQ29tcGFyZTogdmFsaWRhdGUgbmVzdGVkIG1vZGVsc1xuICogICBlbmRcbiAqICAgdmFsaWRhdGVDb21wYXJlLS0+PkNhbGxlcjogdmFsaWRhdGlvbiBlcnJvcnMgb3IgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBhcmU8TSBleHRlbmRzIE1vZGVsPGFueT4+KFxuICBvbGRNb2RlbDogTSxcbiAgbmV3TW9kZWw6IE0sXG4gIGFzeW5jOiBib29sZWFuLFxuICAuLi5leGNlcHRpb25zOiBzdHJpbmdbXVxuKTogTW9kZWxDb25kaXRpb25hbEFzeW5jPE0+IHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID1cbiAgICBnZXRWYWxpZGF0YWJsZVVwZGF0ZVByb3BzKG5ld01vZGVsLCBleGNlcHRpb25zKTtcblxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCB7IHByb3AsIGRlY29yYXRvcnMgfSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgcHJvcEtleSA9IFN0cmluZyhwcm9wKTtcbiAgICBsZXQgcHJvcFZhbHVlID0gKG5ld01vZGVsIGFzIGFueSlbcHJvcF07XG5cbiAgICBpZiAoIWRlY29yYXRvcnM/Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAvLyBHZXQgdGhlIGRlZmF1bHQgdHlwZSB2YWxpZGF0b3JcbiAgICBjb25zdCBkZXNpZ25UeXBlRGVjID0gZGVjb3JhdG9ycy5maW5kKChkKSA9PlxuICAgICAgW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFXS5pbmNsdWRlcyhkLmtleSBhcyBhbnkpXG4gICAgKTtcbiAgICBpZiAoIWRlc2lnblR5cGVEZWMpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9IGRlc2lnblR5cGVEZWMucHJvcHMubmFtZTtcblxuICAgIC8vIEhhbmRsZSBhcnJheSBvciBTZXQgdHlwZXMgYW5kIGVuZm9yY2UgdGhlIHByZXNlbmNlIG9mIEBsaXN0IGRlY29yYXRvclxuICAgIGlmIChbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKGRlc2lnblR5cGUpKSB7XG4gICAgICBjb25zdCB7IGRlY29yYXRvcnMgfSA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgICBuZXdNb2RlbCxcbiAgICAgICAgcHJvcEtleVxuICAgICAgKSBhcyB1bmtub3duIGFzIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb247XG5cbiAgICAgIGlmICghZGVjb3JhdG9ycy5zb21lKChkKSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BLZXldID0ge1xuICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5UWVBFXTogYEFycmF5IG9yIFNldCBwcm9wZXJ0eSAnJHtwcm9wS2V5fScgcmVxdWlyZXMgYSBAbGlzdCBkZWNvcmF0b3JgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wVmFsdWUgJiZcbiAgICAgICAgIShBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkgfHwgcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0KVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBQcm9wZXJ0eSAnJHtTdHJpbmcocHJvcCl9JyBtdXN0IGJlIGVpdGhlciBhbiBhcnJheSBvciBhIFNldGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSBAbGlzdCBkZWNvcmF0b3IgYWxyZWFkeSBlbnN1cmVzIHR5cGVcbiAgICAgIGZvciAobGV0IGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzW2ldLmtleSA9PT0gTW9kZWxLZXlzLlRZUEUpIHtcbiAgICAgICAgICBkZWNvcmF0b3JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcFZhbHVlID0gcHJvcFZhbHVlIGluc3RhbmNlb2YgU2V0ID8gWy4uLnByb3BWYWx1ZV0gOiBwcm9wVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcEVycm9yczogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICB2YWxpZGF0ZURlY29yYXRvcnMobmV3TW9kZWwsIG9sZE1vZGVsLCBwcm9wS2V5LCBkZWNvcmF0b3JzLCBhc3luYykgfHwge307XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gICAgLy8gVG8gcHJldmVudCB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLCBcInByb3BWYWx1ZVwiIG11c3QgYmUgZGVmaW5lZCBhbmQgdmFsaWRhdGFibGVcbiAgICBjb25zdCBpc0NvbnN0ciA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChuZXdNb2RlbCwgcHJvcEtleSk7XG4gICAgLy8gaWYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQsIG51bGxcbiAgICBpZiAocHJvcFZhbHVlICYmIGlzQ29uc3RyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZTogTW9kZWwgPSBwcm9wVmFsdWU7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAhaW5zdGFuY2UuaGFzRXJyb3JzIHx8XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZS5oYXNFcnJvcnMgIT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgaWYgKGlzSW52YWxpZE1vZGVsKSB7XG4gICAgICAgIC8vIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPVxuICAgICAgICAvLyAgIFwiTW9kZWwgc2hvdWxkIGJlIHZhbGlkYXRhYmxlIGJ1dCBpdCdzIG5vdC5cIjtcbiAgICAgICAgY29uc29sZS53YXJuKFwiTW9kZWwgc2hvdWxkIGJlIHZhbGlkYXRhYmxlIGJ1dCBpdCdzIG5vdC5cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXN0ZWRFcnJvcnNbcHJvcEtleV0gPSBpbnN0YW5jZS5oYXNFcnJvcnMoKG9sZE1vZGVsIGFzIGFueSlbcHJvcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0byB0aGUgcmVzdWx0IGlmIHdlIGhhdmUgYW55IGVycm9yc1xuICAgIC8vIEFzeW5jIG1vZGUgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB1bmRlZmluZWQgd2hlbiBubyBlcnJvcnMgZXhpc3RcbiAgICBpZiAoT2JqZWN0LmtleXMocHJvcEVycm9ycykubGVuZ3RoID4gMCB8fCBhc3luYylcbiAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHByb3BFcnJvcnM7XG5cbiAgICAvLyBUaGVuIG1lcmdlIGFueSBuZXN0ZWQgZXJyb3JzXG4gICAgaWYgKCFhc3luYykge1xuICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzW3Byb3BLZXldIHx8IHt9KS5mb3JFYWNoKChba2V5LCBlcnJvcl0pID0+IHtcbiAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHRbYCR7cHJvcEtleX0uJHtrZXl9YF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgcmV0dXJuXG4gIGlmICghYXN5bmMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogYW55ID0gcmVzdWx0OyAvLyBUT0RPOiBhcHBseSBmaWx0ZXJpbmdcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobWVyZ2VkKTtcbiAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3QudmFsdWVzKG1lcmdlZCk7XG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IE1vZGVsRXJyb3JzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtwYXJlbnRQcm9wLCBuZXN0ZWRFcnJQcm9taXNlXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnMpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRQcm9wRGVjRXJyb3JzID0gKGF3YWl0IG5lc3RlZEVyclByb21pc2UpIGFzIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBhbnlcbiAgICAgID47XG5cbiAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3JzKVxuICAgICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRQcm9wRGVjRXJyb3JzKS5mb3JFYWNoKFxuICAgICAgICAgIChbbmVzdGVkUHJvcCwgbmVzdGVkUHJvcERlY0Vycm9yXSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEtleSA9IFtwYXJlbnRQcm9wLCBuZXN0ZWRQcm9wXS5qb2luKFwiLlwiKTtcbiAgICAgICAgICAgICAgcmVzdWx0W25lc3RlZEtleV0gPSBuZXN0ZWRQcm9wRGVjRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlcyA9IHJlc3VsdHNbaV07XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHJlcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID0gcmVzLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPVxuICAgICAgICAgIHJlcy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyByZXMucmVhc29uLm1lc3NhZ2VcbiAgICAgICAgICAgIDogU3RyaW5nKHJlcy5yZWFzb24gfHwgXCJWYWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgREJLZXlzLCBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHtcbiAgSGFzaGluZyxcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgb25DcmVhdGUsIG9uQ3JlYXRlVXBkYXRlLCBvblVwZGF0ZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvSVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9lcnJvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFzaGVzIGEgcHJvcGVydHkgdmFsdWUgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSB0aGUgaGFzaCBkZWNvcmF0b3IgdG8gYXBwbHkgaGFzaGluZyB0byBhIHByb3BlcnR5IHZhbHVlXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZm9yIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgZXh0ZW5kaW5nIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIGV4dGVuZGluZyBDb250ZXh0XG4gKiBAcGFyYW0ge0N9IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIE1ldGFkYXRhIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBoYXNoXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHtNfSBbb2xkTW9kZWxdIC0gVGhlIHByZXZpb3VzIG1vZGVsIHN0YXRlIChmb3IgdXBkYXRlcylcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gaGFzaE9uQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSwgb2xkTW9kZWw/OiBNKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgbW9kZWxba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICBjb25zdCBoYXNoID0gSGFzaGluZy5oYXNoKChtb2RlbCBhcyBhbnkpW2tleV0pO1xuICBpZiAob2xkTW9kZWwgJiYgKG1vZGVsIGFzIGFueSlba2V5XSA9PT0gaGFzaCkgcmV0dXJuO1xuICBtb2RlbFtrZXldID0gaGFzaDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGhhc2hlcyBhIHByb3BlcnR5IHZhbHVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBhdXRvbWF0aWNhbGx5IGhhc2hlcyBhIHByb3BlcnR5IHZhbHVlIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gaGFzaFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZShoYXNoT25DcmVhdGVVcGRhdGUpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuSEFTSCksIHt9KVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSBmb3IgY29tcG9zZWQgcHJvcGVydHkgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBwcm9wZXJ0eSBjb21wb3NpdGlvbiBmcm9tIG90aGVyIHByb3BlcnRpZXNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXBvc2VkRnJvbU1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgdG8gY29tcG9zZSBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VwYXJhdG9yIC0gQ2hhcmFjdGVyIHVzZWQgdG8gam9pbiB0aGUgY29tcG9zZWQgdmFsdWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc2hSZXN1bHQgLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHByb3BlcnR5IHtcImtleXNcInxcInZhbHVlc1wifSB0eXBlIC0gV2hldGhlciB0byB1c2UgcHJvcGVydHkga2V5cyBvciB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJlZml4XSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N1ZmZpeF0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvc2VkRnJvbU1ldGFkYXRhID0ge1xuICBhcmdzOiBzdHJpbmdbXTtcbiAgc2VwYXJhdG9yOiBzdHJpbmc7XG4gIGhhc2hSZXN1bHQ6IGJvb2xlYW47XG4gIHR5cGU6IFwia2V5c1wiIHwgXCJ2YWx1ZXNcIjtcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBzdWZmaXg/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gb3RoZXIgcHJvcGVydGllcyBkdXJpbmcgY3JlYXRlIG9yIHVwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IGNvbXBvc2VkIGRlY29yYXRvcnMgdG8gZ2VuZXJhdGUgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIG90aGVyIHByb3BlcnRpZXNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgSVJlcG9zaXRvcnlcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgQ29tcG9zZWRGcm9tTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVHlwZSBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFR5cGUgZXh0ZW5kaW5nIENvbnRleHRcbiAqIEBwYXJhbSB7Q30gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHBhcmFtIHtWfSBkYXRhIC0gTWV0YWRhdGEgZm9yIHRoZSBjb21wb3NpdGlvblxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHRoZSBjb21wb3NlZCB2YWx1ZSBvblxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gY29tcG9zZWRGcm9tQ3JlYXRlVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VkRnJvbUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBDb21wb3NlZEZyb21NZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPih0aGlzOiBSLCBjb250ZXh0OiBDLCBkYXRhOiBWLCBrZXk6IGtleW9mIE0sIG1vZGVsOiBNKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBhcmdzLCB0eXBlLCBwcmVmaXgsIHN1ZmZpeCwgc2VwYXJhdG9yIH0gPSBkYXRhO1xuICAgIGNvbnN0IGNvbXBvc2VkID0gYXJncy5tYXAoKGFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIShhcmcgaW4gbW9kZWwpKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgJHthcmd9IG5vdCBmb3VuZCB0byBjb21wb3NlIGZyb21gKTtcbiAgICAgIGlmICh0eXBlID09PSBcImtleXNcIikgcmV0dXJuIGFyZztcbiAgICAgIGlmICh0eXBlb2YgKG1vZGVsIGFzIGFueSlbYXJnXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFByb3BlcnR5ICR7YXJnc30gZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIHRvIGNvbXBvc2UgZnJvbWBcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiAoKG1vZGVsIGFzIGFueSlbYXJnXSBhcyBhbnkpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG5cbiAgICBpZiAocHJlZml4KSBjb21wb3NlZC51bnNoaWZ0KHByZWZpeCk7XG4gICAgaWYgKHN1ZmZpeCkgY29tcG9zZWQucHVzaChzdWZmaXgpO1xuXG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNvbXBvc2VkLmpvaW4oc2VwYXJhdG9yKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBjb21wb3NlIHZhbHVlOiAke2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGRlY29yYXRvciB0aGF0IGNvbXBvc2VzIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAc3VtbWFyeSBCYXNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBwcm9wZXJ0eSBjb21wb3NpdGlvbiBkZWNvcmF0b3JzXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gUHJvcGVydHkgbmFtZXMgdG8gY29tcG9zZSBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtoYXNoUmVzdWx0PWZhbHNlXSAtIFdoZXRoZXIgdG8gaGFzaCB0aGUgY29tcG9zZWQgcmVzdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj1EZWZhdWx0U2VwYXJhdG9yXSAtIENoYXJhY3RlciB1c2VkIHRvIGpvaW4gdGhlIGNvbXBvc2VkIHZhbHVlc1xuICogQHBhcmFtIHtcImtleXNcInxcInZhbHVlc1wifSBbdHlwZT1cInZhbHVlc1wiXSAtIFdoZXRoZXIgdG8gdXNlIHByb3BlcnR5IGtleXMgb3IgdmFsdWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD1cIlwiXSAtIE9wdGlvbmFsIHByZWZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeD1cIlwiXSAtIE9wdGlvbmFsIHN1ZmZpeCB0byBhZGQgdG8gdGhlIGNvbXBvc2VkIHZhbHVlXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gY29tcG9zZWRGcm9tXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHlEZWNvcmF0b3JzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VkRnJvbShcbiAgYXJnczogc3RyaW5nW10sXG4gIGhhc2hSZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSBEZWZhdWx0U2VwYXJhdG9yLFxuICB0eXBlOiBcImtleXNcIiB8IFwidmFsdWVzXCIgPSBcInZhbHVlc1wiLFxuICBwcmVmaXggPSBcIlwiLFxuICBzdWZmaXggPSBcIlwiXG4pIHtcbiAgY29uc3QgZGF0YTogQ29tcG9zZWRGcm9tTWV0YWRhdGEgPSB7XG4gICAgYXJnczogYXJncyxcbiAgICBoYXNoUmVzdWx0OiBoYXNoUmVzdWx0LFxuICAgIHNlcGFyYXRvcjogc2VwYXJhdG9yLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgcHJlZml4OiBwcmVmaXgsXG4gICAgc3VmZml4OiBzdWZmaXgsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IFtcbiAgICBvbkNyZWF0ZVVwZGF0ZShjb21wb3NlZEZyb21DcmVhdGVVcGRhdGUsIGRhdGEpLFxuICAgIHByb3BNZXRhZGF0YShSZXBvc2l0b3J5LmtleShEQktleXMuQ09NUE9TRUQpLCBkYXRhKSxcbiAgXTtcbiAgaWYgKGhhc2hSZXN1bHQpIGRlY29yYXRvcnMucHVzaChoYXNoKCkpO1xuICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBjb21wb3NlcyBhIHByb3BlcnR5IHZhbHVlIGZyb20gcHJvcGVydHkga2V5c1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZ2VuZXJhdGVzIGEgcHJvcGVydHkgdmFsdWUgYnkgam9pbmluZyB0aGUgbmFtZXMgb2Ygb3RoZXIgcHJvcGVydGllc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIFByb3BlcnR5IG5hbWVzIHRvIGNvbXBvc2UgZnJvbVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogQHBhcmFtIHtib29sZWFufSBbaGFzaD1mYWxzZV0gLSBXaGV0aGVyIHRvIGhhc2ggdGhlIGNvbXBvc2VkIHJlc3VsdFxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9XCJcIl0gLSBPcHRpb25hbCBwcmVmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWZmaXg9XCJcIl0gLSBPcHRpb25hbCBzdWZmaXggdG8gYWRkIHRvIHRoZSBjb21wb3NlZCB2YWx1ZVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIGNvbXBvc2VkRnJvbUtleXNcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VkRnJvbUtleXMoXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzZXBhcmF0b3I6IHN0cmluZyA9IERlZmF1bHRTZXBhcmF0b3IsXG4gIGhhc2g6IGJvb2xlYW4gPSBmYWxzZSxcbiAgcHJlZml4ID0gXCJcIixcbiAgc3VmZml4ID0gXCJcIlxuKSB7XG4gIHJldHVybiBjb21wb3NlZEZyb20oYXJncywgaGFzaCwgc2VwYXJhdG9yLCBcImtleXNcIiwgcHJlZml4LCBzdWZmaXgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgY29tcG9zZXMgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHByb3BlcnR5IHZhbHVlc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZ2VuZXJhdGVzIGEgcHJvcGVydHkgdmFsdWUgYnkgam9pbmluZyB0aGUgdmFsdWVzIG9mIG90aGVyIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBQcm9wZXJ0eSBuYW1lcyB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBjb21wb3NlZFxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBDaGFyYWN0ZXIgdXNlZCB0byBqb2luIHRoZSBwcm9wZXJ0eSB2YWx1ZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hhc2g9ZmFsc2VdIC0gV2hldGhlciB0byBoYXNoIHRoZSBjb21wb3NlZCByZXN1bHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PVwiXCJdIC0gT3B0aW9uYWwgcHJlZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3VmZml4PVwiXCJdIC0gT3B0aW9uYWwgc3VmZml4IHRvIGFkZCB0byB0aGUgY29tcG9zZWQgdmFsdWVcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGNsYXNzIHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBjb21wb3NlZFxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZWQoXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzZXBhcmF0b3I6IHN0cmluZyA9IERlZmF1bHRTZXBhcmF0b3IsXG4gIGhhc2g6IGJvb2xlYW4gPSBmYWxzZSxcbiAgcHJlZml4ID0gXCJcIixcbiAgc3VmZml4ID0gXCJcIlxuKSB7XG4gIHJldHVybiBjb21wb3NlZEZyb20oYXJncywgaGFzaCwgc2VwYXJhdG9yLCBcInZhbHVlc1wiLCBwcmVmaXgsIHN1ZmZpeCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgYSB2ZXJzaW9uIHByb3BlcnR5IGR1cmluZyBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgY2FsbGJhY2sgZm9yIGluY3JlbWVudGluZyB2ZXJzaW9uIG51bWJlcnNcbiAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiAoQ1JFQVRFIG9yIFVQREFURSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdXBkYXRlcyB0aGUgdmVyc2lvbiBwcm9wZXJ0eVxuICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUeXBlIGV4dGVuZGluZyBJUmVwb3NpdG9yeVxuICogQHRlbXBsYXRlIFYgLSBUeXBlIGZvciBtZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBSZXBvc2l0b3J5RmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBleHRlbmRpbmcgQ29udGV4dFxuICogQGZ1bmN0aW9uIHZlcnNpb25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgdmVyc2lvbkNyZWF0ZVVwZGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogb3BlcmF0aW9uXG4gKiAgIHZlcnNpb25DcmVhdGVVcGRhdGUtLT4+Q2FsbGVyOiBjYWxsYmFjayBmdW5jdGlvblxuICogICBOb3RlIG92ZXIgQ2FsbGVyLHZlcnNpb25DcmVhdGVVcGRhdGU6IFdoZW4gY2FsbGJhY2sgaXMgZXhlY3V0ZWQ6XG4gKiAgIENhbGxlci0+PnZlcnNpb25DcmVhdGVVcGRhdGU6IGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgYWx0IG9wZXJhdGlvbiBpcyBDUkVBVEVcbiAqICAgICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogc2V0IHZlcnNpb24gdG8gMVxuICogICBlbHNlIG9wZXJhdGlvbiBpcyBVUERBVEVcbiAqICAgICB2ZXJzaW9uQ3JlYXRlVXBkYXRlLT4+dmVyc2lvbkNyZWF0ZVVwZGF0ZTogaW5jcmVtZW50IHZlcnNpb25cbiAqICAgZWxzZSBpbnZhbGlkIG9wZXJhdGlvblxuICogICAgIHZlcnNpb25DcmVhdGVVcGRhdGUtPj52ZXJzaW9uQ3JlYXRlVXBkYXRlOiB0aHJvdyBlcnJvclxuICogICBlbmRcbiAqICAgdmVyc2lvbkNyZWF0ZVVwZGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25DcmVhdGVVcGRhdGUob3BlcmF0aW9uOiBDcnVkT3BlcmF0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyc2lvbkNyZWF0ZVVwZGF0ZTxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgUiBleHRlbmRzIElSZXBvc2l0b3J5PE0sIEYsIEM+LFxuICAgIFYgZXh0ZW5kcyBvYmplY3QsXG4gICAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyA9IFJlcG9zaXRvcnlGbGFncyxcbiAgICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4gID4odGhpczogUiwgY29udGV4dDogQywgZGF0YTogViwga2V5OiBrZXlvZiBNLCBtb2RlbDogTSkge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuQ1JFQVRFOlxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuVVBEQVRFOlxuICAgICAgICAgIChtb2RlbCBhcyBhbnkpW2tleV0rKztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgSW52YWxpZCBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHZlcnNpb246ICR7ZX1gKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgZm9yIHZlcnNpb25pbmcgYSBwcm9wZXJ0eSBpbiBhIG1vZGVsXG4gKiBAc3VtbWFyeSBUaGlzIGRlY29yYXRvciBhcHBsaWVzIG11bHRpcGxlIHN1Yi1kZWNvcmF0b3JzIHRvIGhhbmRsZSB2ZXJzaW9uIG1hbmFnZW1lbnQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBBIGNvbXBvc2l0ZSBkZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSB0eXBlIHRvIE51bWJlciwgbWFuYWdlcyB2ZXJzaW9uIHVwZGF0ZXMsIGFuZCBhZGRzIHZlcnNpb25pbmcgbWV0YWRhdGFcbiAqIEBmdW5jdGlvbiB2ZXJzaW9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHlEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uKCkge1xuICByZXR1cm4gYXBwbHkoXG4gICAgdHlwZShOdW1iZXIubmFtZSksXG4gICAgb25DcmVhdGUodmVyc2lvbkNyZWF0ZVVwZGF0ZShPcGVyYXRpb25LZXlzLkNSRUFURSkpLFxuICAgIG9uVXBkYXRlKHZlcnNpb25DcmVhdGVVcGRhdGUoT3BlcmF0aW9uS2V5cy5VUERBVEUpKSxcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlZFUlNJT04pLCB0cnVlKVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSBhcyB0cmFuc2llbnRcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGluZGljYXRlcyBhIHByb3BlcnR5IHNob3VsZCBub3QgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICogQGZ1bmN0aW9uIHRyYW5zaWVudFxuICogQGNhdGVnb3J5IFByb3BlcnR5RGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNpZW50KCkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhbnNpZW50KG1vZGVsOiBhbnksIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5UUkFOU0lFTlQpLCB0cnVlKShtb2RlbCwgYXR0cmlidXRlKTtcbiAgICBwcm9wTWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksIHRydWUpKG1vZGVsLmNvbnN0cnVjdG9yKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIE1vZGVsLFxuICBNb2RlbENvbmRpdGlvbmFsQXN5bmMsXG4gIHZhbGlkYXRlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZUNvbXBhcmUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIGNoZWNrcyBmb3IgZXJyb3JzXG4gKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgbW9kZWwgc3RhdGUgYW5kIG9wdGlvbmFsbHkgY29tcGFyZXMgd2l0aCBhIHByZXZpb3VzIHZlcnNpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7TXxhbnl9IFtwcmV2aW91c1ZlcnNpb25dIC0gT3B0aW9uYWwgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgbW9kZWwgZm9yIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7Li4uYW55W119IGV4Y2x1c2lvbnMgLSBQcm9wZXJ0aWVzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbEVycm9yRGVmaW5pdGlvbnx1bmRlZmluZWR9IEVycm9yIGRlZmluaXRpb24gaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIGhhc0Vycm9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3IgT3ZlcnJpZGluZyBNb2RlbCBwcm90b3R5cGUgbWV0aG9kIHdpdGggZHluYW1pYyBjb25kaXRpb25hbCByZXR1cm4gdHlwZS5cbk1vZGVsLnByb3RvdHlwZS5oYXNFcnJvcnMgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgdGhpczogTSxcbiAgcHJldmlvdXNWZXJzaW9uPzogTSB8IGFueSxcbiAgLi4uZXhjbHVzaW9uczogYW55W11cbik6IE1vZGVsQ29uZGl0aW9uYWxBc3luYzxNPiB7XG4gIGlmIChwcmV2aW91c1ZlcnNpb24gJiYgIShwcmV2aW91c1ZlcnNpb24gaW5zdGFuY2VvZiBNb2RlbCkpIHtcbiAgICBleGNsdXNpb25zLnVuc2hpZnQocHJldmlvdXNWZXJzaW9uKTtcbiAgICBwcmV2aW91c1ZlcnNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBhc3luYyA9IHRoaXMuaXNBc3luYygpO1xuICBjb25zdCBlcnJzID0gdmFsaWRhdGUodGhpcywgYXN5bmMsIC4uLmV4Y2x1c2lvbnMpO1xuXG4gIGlmIChhc3luYykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZXJycykudGhlbigocmVzb2x2ZWRFcnJzKSA9PiB7XG4gICAgICBpZiAocmVzb2x2ZWRFcnJzIHx8ICFwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkRXJycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0ZUNvbXBhcmUocHJldmlvdXNWZXJzaW9uLCB0aGlzLCBhc3luYywgLi4uZXhjbHVzaW9ucyk7XG4gICAgfSkgYXMgYW55O1xuICB9XG5cbiAgaWYgKGVycnMgfHwgIXByZXZpb3VzVmVyc2lvbikgcmV0dXJuIGVycnMgYXMgYW55O1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgT3ZlcnJpZGluZyBNb2RlbCBwcm90b3R5cGUgbWV0aG9kIHdpdGggZHluYW1pYyBjb25kaXRpb25hbCByZXR1cm4gdHlwZS5cbiAgcmV0dXJuIHZhbGlkYXRlQ29tcGFyZShwcmV2aW91c1ZlcnNpb24sIHRoaXMsIGFzeW5jLCAuLi5leGNsdXNpb25zKTtcbn07XG4iLCJpbXBvcnQge1xuICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUsXG4gIFJlcG9zaXRvcnksXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbn0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIG1vZGVsIGlzIG1hcmtlZCBhcyB0cmFuc2llbnRcbiAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBhIG1vZGVsIGNsYXNzIGhhcyBiZWVuIGRlY29yYXRlZCB3aXRoIHRoZSB0cmFuc2llbnQgZGVjb3JhdG9yXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBtb2RlbCBpcyB0cmFuc2llbnQsIGZhbHNlIG90aGVyd2lzZVxuICogQGZ1bmN0aW9uIGlzVHJhbnNpZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNpZW50PE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgcmV0dXJuICEhKFxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlRSQU5TSUVOVCksIG1vZGVsLmNvbnN0cnVjdG9yKSB8fFxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKSxcbiAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcGFyYXRlcyB0cmFuc2llbnQgcHJvcGVydGllcyBmcm9tIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IEV4dHJhY3RzIHByb3BlcnRpZXMgbWFya2VkIGFzIHRyYW5zaWVudCBpbnRvIGEgc2VwYXJhdGUgb2JqZWN0XG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByb2Nlc3NcbiAqIEByZXR1cm4ge09iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1vZGVsIHdpdGhvdXQgdHJhbnNpZW50IHByb3BlcnRpZXMgYW5kIGEgc2VwYXJhdGUgdHJhbnNpZW50IG9iamVjdFxuICogQHByb3BlcnR5IHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB3aXRoIHRyYW5zaWVudCBwcm9wZXJ0aWVzIHJlbW92ZWRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3RyYW5zaWVudF0gLSBPYmplY3QgY29udGFpbmluZyB0aGUgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAqIEBmdW5jdGlvbiBtb2RlbFRvVHJhbnNpZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG1vZGVsVG9UcmFuc2llbnRcbiAqICAgcGFydGljaXBhbnQgaXNUcmFuc2llbnRcbiAqICAgcGFydGljaXBhbnQgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlXG4gKlxuICogICBDYWxsZXItPj5tb2RlbFRvVHJhbnNpZW50OiBtb2RlbFxuICogICBtb2RlbFRvVHJhbnNpZW50LT4+aXNUcmFuc2llbnQ6IGNoZWNrIGlmIG1vZGVsIGlzIHRyYW5zaWVudFxuICogICBpc1RyYW5zaWVudC0tPj5tb2RlbFRvVHJhbnNpZW50OiB0cmFuc2llbnQgc3RhdHVzXG4gKiAgIGFsdCBtb2RlbCBpcyBub3QgdHJhbnNpZW50XG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0tPj5DYWxsZXI6IHttb2RlbH1cbiAqICAgZWxzZSBtb2RlbCBpcyB0cmFuc2llbnRcbiAqICAgICBtb2RlbFRvVHJhbnNpZW50LT4+Z2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlOiBnZXQgdHJhbnNpZW50IHByb3BlcnRpZXNcbiAqICAgICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUtLT4+bW9kZWxUb1RyYW5zaWVudDogcHJvcGVydHkgZGVjb3JhdG9yc1xuICogICAgIG1vZGVsVG9UcmFuc2llbnQtPj5tb2RlbFRvVHJhbnNpZW50OiBzZXBhcmF0ZSBwcm9wZXJ0aWVzXG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0+Pk1vZGVsLmJ1aWxkOiByZWJ1aWxkIG1vZGVsIHdpdGhvdXQgdHJhbnNpZW50IHByb3BzXG4gKiAgICAgbW9kZWxUb1RyYW5zaWVudC0tPj5DYWxsZXI6IHttb2RlbCwgdHJhbnNpZW50fVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsVG9UcmFuc2llbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE1cbik6IHsgbW9kZWw6IE07IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfSB7XG4gIGlmICghaXNUcmFuc2llbnQobW9kZWwpKSByZXR1cm4geyBtb2RlbDogbW9kZWwgfTtcbiAgY29uc3QgZGVjczogUmVjb3JkPHN0cmluZywgYW55W10+ID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgIG1vZGVsLFxuICAgIHVuZGVmaW5lZCxcbiAgICBSZXBvc2l0b3J5LmtleShEQktleXMuVFJBTlNJRU5UKVxuICApIGFzIFJlY29yZDxzdHJpbmcsIGFueVtdPjtcblxuICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhkZWNzKS5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjdW06IHsgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT47IHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgIFtrLCB2YWxdXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSB2YWwuZmluZCgoZWwpID0+IGVsLmtleSA9PT0gXCJcIik7XG4gICAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICAgIGFjY3VtLnRyYW5zaWVudCA9IGFjY3VtLnRyYW5zaWVudCB8fCB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY2N1bS50cmFuc2llbnRba10gPSBtb2RlbFtrIGFzIGtleW9mIE1dO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc2VyaWFsaXplIHRyYW5zaWVudCBwcm9wZXJ0eSAke2t9OiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY3VtLm1vZGVsID0gYWNjdW0ubW9kZWwgfHwge307XG4gICAgICAgIGFjY3VtLm1vZGVsW2tdID0gKG1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAge30gYXMgeyBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjsgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICk7XG4gIHJlc3VsdC5tb2RlbCA9IE1vZGVsLmJ1aWxkKHJlc3VsdC5tb2RlbCwgbW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gIHJldHVybiByZXN1bHQgYXMgeyBtb2RlbDogTTsgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PiB9O1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcGVyYXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERhdGFiYXNlIGRlY29yYXRvcnMgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAc3VtbWFyeSBBIGNvbXByZWhlbnNpdmUgbGlicmFyeSBwcm92aWRpbmcgZGVjb3JhdG9ycyBhbmQgdXRpbGl0aWVzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLCBtb2RlbCBkZWZpbml0aW9ucywgdmFsaWRhdGlvbiwgYW5kIHJlcG9zaXRvcnkgcGF0dGVybnMgaW4gVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnNcbiAqIEBtb2R1bGUgZGItZGVjb3JhdG9yc1xuICovXG5cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZWZsZWN0aW9uIHBhY2thZ2VcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRiLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiRGVjb3JhdG9yTWVzc2FnZXMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUE7Ozs7O0FBS0c7QUFDVSxNQUFBLE1BQU0sR0FBRztBQUNwQixJQUFBLE9BQU8sRUFBRSxDQUFBLEVBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBYyxZQUFBLENBQUE7QUFDM0MsSUFBQSxVQUFVLEVBQUUsWUFBWTtBQUN4QixJQUFBLEtBQUssRUFBRSxRQUFRO0FBQ2YsSUFBQSxFQUFFLEVBQUUsSUFBSTtBQUNSLElBQUEsS0FBSyxFQUFFLE9BQU87QUFDZCxJQUFBLE1BQU0sRUFBRSxRQUFRO0FBQ2hCLElBQUEsU0FBUyxFQUFFLFdBQVc7QUFDdEIsSUFBQSxRQUFRLEVBQUUsVUFBVTtBQUNwQixJQUFBLFNBQVMsRUFBRSxXQUFXO0FBQ3RCLElBQUEsU0FBUyxFQUFFLFdBQVc7QUFDdEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtBQUNaLElBQUEsUUFBUSxFQUFFLFVBQVU7QUFDcEIsSUFBQSxPQUFPLEVBQUUsU0FBUztBQUNsQixJQUFBLFFBQVEsRUFB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
|