@decaf-ts/decoration 0.0.16 → 0.0.17
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/decoration.cjs +116 -18
- package/dist/decoration.esm.cjs +116 -18
- package/lib/constants.cjs +7 -4
- package/lib/constants.d.ts +6 -3
- package/lib/decoration/types.cjs +1 -1
- package/lib/decoration/types.d.ts +1 -4
- package/lib/decorators.cjs +2 -2
- package/lib/decorators.d.ts +1 -1
- package/lib/esm/constants.d.ts +6 -3
- package/lib/esm/constants.js +7 -4
- package/lib/esm/decoration/types.d.ts +1 -4
- package/lib/esm/decoration/types.js +1 -1
- package/lib/esm/decorators.d.ts +1 -1
- package/lib/esm/decorators.js +2 -2
- package/lib/esm/index.d.ts +6 -9
- package/lib/esm/index.js +7 -10
- package/lib/esm/metadata/Metadata.d.ts +36 -0
- package/lib/esm/metadata/Metadata.js +103 -5
- package/lib/esm/metadata/types.d.ts +22 -10
- package/lib/esm/metadata/types.js +1 -1
- package/lib/index.cjs +7 -10
- package/lib/index.d.ts +6 -9
- package/lib/metadata/Metadata.cjs +103 -5
- package/lib/metadata/Metadata.d.ts +36 -0
- package/lib/metadata/types.cjs +1 -1
- package/lib/metadata/types.d.ts +22 -10
- package/package.json +2 -2
package/dist/decoration.esm.cjs
CHANGED
|
@@ -2,14 +2,16 @@ import 'reflect-metadata';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @description Default flavour identifier for the decorator system.
|
|
5
|
-
* @summary Defines the
|
|
5
|
+
* @summary Defines the fallback flavour used when no specific value is provided, ensuring consistent decorator selection across the library.
|
|
6
|
+
* @type {string}
|
|
6
7
|
* @const DefaultFlavour
|
|
7
8
|
* @memberOf module:decoration
|
|
8
9
|
*/
|
|
9
10
|
const DefaultFlavour = "decaf";
|
|
10
11
|
/**
|
|
11
12
|
* @description Character used to split nested metadata keys.
|
|
12
|
-
* @summary Defines the delimiter the metadata store
|
|
13
|
+
* @summary Defines the delimiter applied by the metadata store when traversing nested object paths for read and write operations.
|
|
14
|
+
* @type {string}
|
|
13
15
|
* @const ObjectKeySplitter
|
|
14
16
|
* @memberOf module:decoration
|
|
15
17
|
*/
|
|
@@ -49,7 +51,8 @@ var DecorationKeys;
|
|
|
49
51
|
})(DecorationKeys || (DecorationKeys = {}));
|
|
50
52
|
/**
|
|
51
53
|
* @description Default metadata instance.
|
|
52
|
-
* @summary Provides the default metadata shape used when
|
|
54
|
+
* @summary Provides the default metadata shape used when initialising new metadata entries for a model.
|
|
55
|
+
* @type {module:decoration.BasicMetadata<any>}
|
|
53
56
|
* @const DefaultMetadata
|
|
54
57
|
* @memberOf module:decoration
|
|
55
58
|
*/
|
|
@@ -286,10 +289,18 @@ class Metadata {
|
|
|
286
289
|
static get(model, key) {
|
|
287
290
|
if (key === DecorationKeys.CONSTRUCTOR)
|
|
288
291
|
return this.constr(model);
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
292
|
+
const resolvedModel = this.constr(model) || model;
|
|
293
|
+
const constructors = this.collectConstructorChain(resolvedModel);
|
|
294
|
+
if (constructors.length === 0) {
|
|
295
|
+
const fallbackSymbol = Symbol.for(resolvedModel.toString());
|
|
296
|
+
return this.innerGet(fallbackSymbol, key);
|
|
297
|
+
}
|
|
298
|
+
const collectedValues = constructors
|
|
299
|
+
.map((ctor) => this.innerGet(Symbol.for(ctor.toString()), key))
|
|
300
|
+
.filter((value) => value !== undefined);
|
|
301
|
+
if (collectedValues.length === 0)
|
|
302
|
+
return undefined;
|
|
303
|
+
return this.mergeMetadataChain(collectedValues);
|
|
293
304
|
}
|
|
294
305
|
/**
|
|
295
306
|
* @description Retrieves metadata stored under a symbol key.
|
|
@@ -307,6 +318,96 @@ class Metadata {
|
|
|
307
318
|
return getValueBySplitter(this._metadata[symbol], key, this.splitter);
|
|
308
319
|
return this._metadata[symbol][key];
|
|
309
320
|
}
|
|
321
|
+
/**
|
|
322
|
+
* @description Builds the inheritance chain for a constructor, ordered from base to most-specific class.
|
|
323
|
+
* @summary Walks the prototype chain starting from the provided constructor until reaching Function/Object and returns the collected constructors.
|
|
324
|
+
* @param {Constructor} model Constructor whose chain should be collected.
|
|
325
|
+
* @return {Constructor[]} Array of constructors ordered from base to leaf.
|
|
326
|
+
*/
|
|
327
|
+
static collectConstructorChain(model) {
|
|
328
|
+
const chain = [];
|
|
329
|
+
let current = model;
|
|
330
|
+
while (typeof current === "function" && current !== Function) {
|
|
331
|
+
chain.push(current);
|
|
332
|
+
const parent = Object.getPrototypeOf(current);
|
|
333
|
+
if (!parent || parent === Function || parent === Object)
|
|
334
|
+
break;
|
|
335
|
+
current = parent;
|
|
336
|
+
}
|
|
337
|
+
return chain.reverse();
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* @description Merges metadata values collected across the inheritance chain.
|
|
341
|
+
* @summary Performs a deep merge for plain objects while letting non-object values override earlier ones to preserve child metadata precedence.
|
|
342
|
+
* @param {any[]} values Metadata values gathered from base to child.
|
|
343
|
+
* @return {any} Aggregated metadata value respecting inheritance precedence.
|
|
344
|
+
*/
|
|
345
|
+
static mergeMetadataChain(values) {
|
|
346
|
+
let acc = undefined;
|
|
347
|
+
for (const value of values) {
|
|
348
|
+
if (acc === undefined) {
|
|
349
|
+
acc = this.cloneMetadataValue(value);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (this.isPlainObject(acc) && this.isPlainObject(value)) {
|
|
353
|
+
acc = this.mergePlainObjects(acc, value);
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
acc = this.cloneMetadataValue(value);
|
|
357
|
+
}
|
|
358
|
+
return acc;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* @description Produces a deep clone of a metadata value when necessary.
|
|
362
|
+
* @summary Arrays are shallow-cloned, plain objects are deep-cloned, and primitive/function values are returned as-is.
|
|
363
|
+
* @param {any} value Metadata value to clone.
|
|
364
|
+
* @return {any} Cloned metadata value preventing mutation of the backing store.
|
|
365
|
+
*/
|
|
366
|
+
static cloneMetadataValue(value) {
|
|
367
|
+
if (Array.isArray(value))
|
|
368
|
+
return [...value];
|
|
369
|
+
if (this.isPlainObject(value))
|
|
370
|
+
return this.mergePlainObjects({}, value);
|
|
371
|
+
return value;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* @description Deeply merges two plain metadata objects.
|
|
375
|
+
* @summary Recursively merges nested plain objects while cloning arrays; values from `source` override those from `target` when conflicts occur.
|
|
376
|
+
* @param {Record<string, any>} target Base object to merge into.
|
|
377
|
+
* @param {Record<string, any>} source Object providing overriding metadata.
|
|
378
|
+
* @return {Record<string, any>} Newly merged metadata object.
|
|
379
|
+
*/
|
|
380
|
+
static mergePlainObjects(target, source) {
|
|
381
|
+
const result = { ...target };
|
|
382
|
+
for (const key of Object.keys(source)) {
|
|
383
|
+
const sourceValue = source[key];
|
|
384
|
+
const targetValue = result[key];
|
|
385
|
+
if (this.isPlainObject(sourceValue)) {
|
|
386
|
+
result[key] = this.isPlainObject(targetValue)
|
|
387
|
+
? this.mergePlainObjects(targetValue, sourceValue)
|
|
388
|
+
: this.mergePlainObjects({}, sourceValue);
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
if (Array.isArray(sourceValue)) {
|
|
392
|
+
result[key] = [...sourceValue];
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
result[key] = sourceValue;
|
|
396
|
+
}
|
|
397
|
+
return result;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* @description Checks if a value is a plain object suitable for deep merging.
|
|
401
|
+
* @summary Ensures arrays and null are excluded while accepting objects created via literal/class syntax.
|
|
402
|
+
* @param {any} value Value to inspect.
|
|
403
|
+
* @return {boolean} True when the value is a plain object.
|
|
404
|
+
*/
|
|
405
|
+
static isPlainObject(value) {
|
|
406
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
407
|
+
return false;
|
|
408
|
+
const proto = Object.getPrototypeOf(value);
|
|
409
|
+
return proto === Object.prototype || proto === null;
|
|
410
|
+
}
|
|
310
411
|
/**
|
|
311
412
|
* @description Writes metadata under a symbol key.
|
|
312
413
|
* @summary Internal helper that ensures the metadata bucket exists for the provided symbol and persists the given value, drilling into nested structures when the key is a string path.
|
|
@@ -793,7 +894,7 @@ function propMetadata(key, value) {
|
|
|
793
894
|
* @summary Convenience factory that combines `metadata(key, value)` and `method()` to both set an arbitrary metadata key and record the method's design return and param types.
|
|
794
895
|
* @param {string} key Metadata key to set for the property.
|
|
795
896
|
* @param {any} value Metadata value to associate with the key.
|
|
796
|
-
* @return {
|
|
897
|
+
* @return {MethodDecorator} Decorator that sets the metadata and captures the method's signature metadata.
|
|
797
898
|
* @function methodMetadata
|
|
798
899
|
* @category Method Decorators
|
|
799
900
|
*/
|
|
@@ -818,22 +919,19 @@ function description(desc) {
|
|
|
818
919
|
}
|
|
819
920
|
|
|
820
921
|
/**
|
|
821
|
-
* @description Root entry point for the decoration
|
|
822
|
-
* @summary
|
|
823
|
-
* - Core builder: {@link Decoration}
|
|
824
|
-
* - Decorator utilities: {@link module:decoration|decorators in ./decorators}
|
|
825
|
-
* - Metadata utilities: {@link Metadata}
|
|
826
|
-
* - Constants and enums: {@link DecorationKeys}, {@link DefaultFlavour}
|
|
922
|
+
* @description Root entry point for the decoration package.
|
|
923
|
+
* @summary Re-exports the builder API, decorator helpers, metadata utilities, and shared constants so consumers can import {@link Decoration}, {@link Metadata}, {@link DecorationKeys}, and {@link DefaultFlavour} from a single surface.
|
|
827
924
|
* @module decoration
|
|
828
925
|
*/
|
|
829
926
|
/**
|
|
830
|
-
* @description Current version of the
|
|
831
|
-
* @summary Stores the semantic version
|
|
927
|
+
* @description Current version of the decoration package.
|
|
928
|
+
* @summary Stores the semantic version string registered through {@link Metadata.registerLibrary}.
|
|
929
|
+
* @type {string}
|
|
832
930
|
* @const VERSION
|
|
833
931
|
* @memberOf module:decoration
|
|
834
932
|
*/
|
|
835
|
-
const VERSION = "0.0.
|
|
933
|
+
const VERSION = "0.0.17";
|
|
836
934
|
Metadata.registerLibrary("@decaf-ts/decoration", VERSION);
|
|
837
935
|
|
|
838
936
|
export { Decoration, DecorationKeys, DefaultFlavour, DefaultMetadata, Metadata, ObjectKeySplitter, VERSION, apply, description, getValueBySplitter, metadata, method, methodMetadata, param, paramMetadata, prop, propMetadata, setValueBySplitter };
|
|
839
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21ldGFkYXRhL01ldGFkYXRhLnRzIiwiLi4vc3JjL2RlY29yYXRpb24vRGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2ljTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGZsYXZvdXIgdXNlZCBieSB0aGUgRGVjb3JhdGlvbiBjbGFzcyB3aGVuIG5vIHNwZWNpZmljIGZsYXZvdXIgaXMgcHJvdmlkZWQuIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IGFzIHRoZSBmYWxsYmFjayBmbGF2b3VyIGZvciBkZWNvcmF0b3JzLlxuICogQGNvbnN0IERlZmF1bHRGbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRGbGF2b3VyID0gXCJkZWNhZlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCBuZXN0ZWQgbWV0YWRhdGEga2V5cy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlbGltaXRlciB0aGUgbWV0YWRhdGEgc3RvcmUgdXNlcyB0byB0cmF2ZXJzZSBuZXN0ZWQgb2JqZWN0IHBhdGhzIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIHZhbHVlcy5cbiAqIEBjb25zdCBPYmplY3RLZXlTcGxpdHRlclxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSB0b2tlbiByZWdpc3RyeSBmb3IgdGhlIGRlY29yYXRpb24gc3lzdGVtLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUga2V5cyB1c2VkIGR1cmluZyByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlIGZvciBjbGFzc2VzLCBwcm9wZXJ0aWVzLCBtZXRob2RzLCBkZXNjcmlwdGlvbnMsIGFuZCByZWdpc3RlcmVkIGxpYnJhcmllcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBjb25zdCBEZWNvcmF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIERlY29yYXRpb25LZXlzIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGJ1Y2tldCBmb3IgZGVjb3JhdGlvbi1hd2FyZSBsaWJyYXJ5IHJlZ2lzdHJhdGlvbnMuICovXG4gIExJQlJBUklFUyA9IFwibGlicmFyaWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBrZXkgbWlycm9yZWQgb24gY29uc3RydWN0b3JzIHRoYXQgaG9sZHMgcnVudGltZSBtZXRhZGF0YS4gKi9cbiAgUkVGTEVDVCA9IGBfXyR7RGVmYXVsdEZsYXZvdXJ9YCxcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIHByb3BlcnR5IG1ldGFkYXRhIGZvciBhIG1vZGVsLiAqL1xuICBQUk9QRVJUSUVTID0gXCJwcm9wZXJ0aWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29udGFpbmVyIG9mIHJlZmxlY3RlZCBtZXRob2QgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIE1FVEhPRFMgPSBcIm1ldGhvZHNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgdW5kZXIgd2hpY2ggdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBpcyBwZXJzaXN0ZWQuICovXG4gIENMQVNTID0gXCJjbGFzc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgY2xhc3NlcyBhbmQgbWVtYmVycy4gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBzbG90IHRyYWNraW5nIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3aGVuIG92ZXJyaWRkZW4uICovXG4gIENPTlNUUlVDVE9SID0gXCJfX29yaWdpbmFsXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29sbGVjdGVkIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgY29uZmlndXJlZCBkZWNvcmF0b3JzLiAqL1xuICBQQVJBTUVURVJTID0gXCJwYXJhbWV0ZXJzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS4gKi9cbiAgREVTSUdOX1RZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIHJlY29yZGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy4gKi9cbiAgREVTSUdOX1BBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBtZXRob2QncyByZXR1cm4gdHlwZS4gKi9cbiAgREVTSUdOX1JFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBtZXRhZGF0YSBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBkZWZhdWx0IG1ldGFkYXRhIHNoYXBlIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgbmV3IG1ldGFkYXRhIGVudHJpZXMgZm9yIGEgbW9kZWwuXG4gKiBAY29uc3QgRGVmYXVsdE1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRNZXRhZGF0YTogQmFzaWNNZXRhZGF0YTxhbnk+ID0ge1xuICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFU106IFtdLFxufSBhcyB1bmtub3duIGFzIEJhc2ljTWV0YWRhdGE8YW55PjtcbiIsImltcG9ydCB7IEJhc2ljTWV0YWRhdGEsIENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzLCBPYmplY3RLZXlTcGxpdHRlciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgbmVzdGVkIHZhbHVlIGZyb20gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFdhbGtzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgdXNpbmcgYSBzcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgYXQgdGhhdCBsb2NhdGlvbiBvciBgdW5kZWZpbmVkYCBpZiBhbnkga2V5IGlzIG1pc3NpbmcuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gdHJhdmVyc2UgZm9yIHRoZSBsb29rdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgcGF0aCB0byB0aGUgZGVzaXJlZCB2YWx1ZSAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3BsaXR0ZXI9T2JqZWN0S2V5U3BsaXR0ZXJdIERlbGltaXRlciB1c2VkIHRvIHNlcGFyYXRlIHRoZSBwYXRoIHNlZ21lbnRzLlxuICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gVmFsdWUgcmVzb2x2ZWQgYXQgdGhlIGdpdmVuIHBhdGggb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgZm91bmQuXG4gKiBAZnVuY3Rpb24gZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgZ2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCBzcGxpdHRlcilcbiAqICAgRi0+PkY6IHNwbGl0IHBhdGggaW50byBrZXlzXG4gKiAgIGxvb3AgZm9yIGVhY2gga2V5XG4gKiAgICAgRi0+Pk86IGFjY2VzcyBjdXJyZW50W2tleV1cbiAqICAgICBhbHQgbWlzc2luZyBvciBudWxsaXNoXG4gKiAgICAgICBGLS0+PkM6IHJldHVybiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+QzogcmV0dXJuIGZpbmFsIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNwbGl0dGVyOiBzdHJpbmcgPSBPYmplY3RLZXlTcGxpdHRlclxuKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpO1xuICBsZXQgY3VycmVudCA9IG9iajtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKFxuICAgICAgY3VycmVudCA9PT0gbnVsbCB8fFxuICAgICAgY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSlcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyBhIG5lc3RlZCB2YWx1ZSBvbiBhbiBvYmplY3QgZ2l2ZW4gYSBwYXRoLlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIG9yIGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMgZm9sbG93aW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIGFzc2lnbnMgdGhlIHByb3ZpZGVkIHZhbHVlIGF0IHRoZSBkZXN0aW5hdGlvbiBrZXkuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiBPYmplY3QgdG8gbXV0YXRlIHdoaWxlIGRyaWxsaW5nIGludG8gbmVzdGVkIGtleXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBTcGxpdHRlci1kZWxpbWl0ZWQgZGVzdGluYXRpb24gcGF0aCAoZS5nLiwgXCJhLmIuY1wiKS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzZXQgYXQgdGhlIGRlc3RpbmF0aW9uIG5vZGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAZnVuY3Rpb24gc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgc2V0VmFsdWVCeVNwbGl0dGVyXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gKiAgIEMtPj5GOiAob2JqLCBwYXRoLCB2YWx1ZSwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIGFsdCBrZXkgbWlzc2luZ1xuICogICAgICAgRi0+Pk86IGNyZWF0ZSBpbnRlcm1lZGlhdGUgb2JqZWN0XG4gKiAgICAgZWxzZSBrZXkgZXhpc3RzXG4gKiAgICAgICBGLT4+TzogZGVzY2VuZCBpbnRvIGV4aXN0aW5nIG9iamVjdFxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRi0tPj5DOiB2b2lkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcikuZmlsdGVyKChrKSA9PiBrLmxlbmd0aCA+IDApO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBsZXQgY3VycmVudDogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoXG4gICAgICBjdXJyZW50W2tleV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICB0eXBlb2YgY3VycmVudFtrZXldICE9PSBcIm9iamVjdFwiXG4gICAgKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gIGN1cnJlbnRbbGFzdEtleV0gPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbGl6ZWQgcnVudGltZSBtZXRhZGF0YSBzdG9yZSBib3VuZCB0byBjb25zdHJ1Y3RvcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB1dGlsaXRpZXMgdG8gcmVhZCBhbmQgd3JpdGUgc3RydWN0dXJlZCBtZXRhZGF0YSBmb3IgY2xhc3NlcyBhbmQgdGhlaXIgbWVtYmVycywgd2l0aCBvcHRpb25hbCBtaXJyb3Jpbmcgb250byB0aGUgY29uc3RydWN0b3IgdmlhIGEgd2VsbC1rbm93biBzeW1ib2wga2V5LiBTdXBwb3J0cyBuZXN0ZWQga2V5IHBhdGhzIHVzaW5nIGEgY29uZmlndXJhYmxlIHNwbGl0dGVyIGFuZCBvZmZlcnMgYm90aCBpbnN0YW5jZSBhbmQgc3RhdGljIEFQSXMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGUgbWV0YWRhdGEgYmVsb25ncyB0by5cbiAqIEB0ZW1wbGF0ZSBNRVRBIEV4dGVuZHMgQmFzaWNNZXRhZGF0YTxNPiByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIHN0cnVjdHVyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBpZGVudGlmaWVyIGFwcGxpZWQgd2hlbiBpbnN0YW50aWF0aW5nIGhlbHBlciBidWlsZGVycy5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbmQgcmVhZCBtZXRhZGF0YSBmb3IgYSBjbGFzc1xuICogY2xhc3MgVXNlciB7IG5hbWUhOiBzdHJpbmcgfVxuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIiwgXCJBIHVzZXIgbW9kZWxcIik7XG4gKiBNZXRhZGF0YS5zZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKTtcbiAqIGNvbnN0IGRlc2MgPSBNZXRhZGF0YS5nZXQoVXNlciwgXCJkZXNjcmlwdGlvbi5jbGFzc1wiKTsgLy8gXCJBIHVzZXIgbW9kZWxcIlxuICogY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoVXNlciwgXCJuYW1lXCIpOyAvLyBTdHJpbmdcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb25zdHJ1Y3RvclxuICogICBwYXJ0aWNpcGFudCBTIGFzIE1ldGFkYXRhIChzdGF0aWMpXG4gKiAgIEMtPj5TOiBzZXQoVXNlciwgXCJwcm9wZXJ0aWVzLm5hbWVcIiwgU3RyaW5nKVxuICogICBDLT4+UzogZ2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIpXG4gKiAgIFMtLT4+QzogU3RyaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IHN0b3JhZ2Ugb2YgbWV0YWRhdGEgYnkgY29uc3RydWN0b3Igc3ltYm9sXG4gICAqIEBzdW1tYXJ5IE1hcHMgYSBTeW1ib2wgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciB0byBpdHMgbWV0YWRhdGEgb2JqZWN0LCBlbmFibGluZyBlZmZpY2llbnQgbG9va3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBhbnk+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXRoIGRlbGltaXRlciBmb3IgbmVzdGVkIG1ldGFkYXRhIGtleXNcbiAgICogQHN1bW1hcnkgVXNlZCBieSBnZXQvc2V0IG9wZXJhdGlvbnMgdG8gbmF2aWdhdGUgbmVzdGVkIHN0cnVjdHVyZXMsIGRlZmF1bHRzIHRvIE9iamVjdEtleVNwbGl0dGVyLlxuICAgKi9cbiAgc3RhdGljIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXI7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ltYm9sIGtleSB1c2VkIHRvIG1pcnJvciBtZXRhZGF0YSBvbiB0aGUgY29uc3RydWN0b3JcbiAgICogQHN1bW1hcnkgV2hlbiBtaXJyb3JpbmcgaXMgZW5hYmxlZCwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGlzIG5vbi1lbnVtZXJhYmxlIGtleS5cbiAgICovXG4gIHN0YXRpYyBiYXNlS2V5ID0gRGVjb3JhdGlvbktleXMuUkVGTEVDVDtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIG1ldGFkYXRhIGlzIG1pcnJvcmVkIG9udG8gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIG1ldGFkYXRhIG9iamVjdCBpcyBkZWZpbmVkIG9uIHRoZSBjb25zdHJ1Y3RvciB1bmRlciB0aGUgbm9uLWVudW1lcmFibGUgYmFzZUtleS5cbiAgICovXG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMga25vd24gcHJvcGVydHkga2V5cyBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSByZWNvcmRlZCB0eXBlIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgcHJvcGVydHkgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHJldHVybiB7c3RyaW5nW118dW5kZWZpbmVkfSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgcHJvcGVydGllcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3RzIGtub3duIG1ldGhvZHMgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSBhbmQgcmV0dXJucyB0aGUgbWV0aG9kIG5hbWVzIHRoYXQgaGF2ZSByZWNvcmRlZCBzaWduYXR1cmUgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIG1ldGhvZCBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXXx1bmRlZmluZWR9IEFycmF5IG9mIG1ldGhvZCBuYW1lcyBvciBgdW5kZWZpbmVkYCBpZiBubyBtZXRhZGF0YSBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgbWV0aG9kcyhtb2RlbDogQ29uc3RydWN0b3IpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgYSBjbGFzcyBvciBhIHByb3BlcnR5LlxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCB0aGUgZGVzY3JpcHRpb24gc3RvcmVkIHVuZGVyIHRoZSBtZXRhZGF0YSBcImRlc2NyaXB0aW9uXCIgbWFwLiBJZiBhIHByb3BlcnR5IGtleSBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgcHJvcGVydHkncyBkZXNjcmlwdGlvbjsgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGNsYXNzIGRlc2NyaXB0aW9uLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgZGVzY3JpcHRpb24gaXMgYmVpbmcgcmV0cmlldmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BdIE9wdGlvbmFsIHByb3BlcnR5IGtleSAodHlwZWQgYXMgYGtleW9mIE1gKSBmb3Igd2hpY2ggdG8gZmV0Y2ggdGhlIGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8dW5kZWZpbmVkfSBEZXNjcmlwdGlvbiB0ZXh0IGlmIHByZXNlbnQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHN0YXRpYyBkZXNjcmlwdGlvbjxNPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvcD86IGtleW9mIE1cbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTiwgcHJvcCA/IHByb3AgOiBEZWNvcmF0aW9uS2V5cy5DTEFTU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcGFyYW1zIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBtZXRob2RzLjxwcm9wPi5kZXNpZ246cGFyYW10eXBlc2AgdG8gcmV0dXJuIHRoZSBwYXJhbWV0ZXIgY29uc3RydWN0b3JzIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igb3duaW5nIHRoZSBtZXRob2QgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGZldGNoZWQuXG4gICAqIEByZXR1cm4ge2FueVtdfHVuZGVmaW5lZH0gQXJyYXkgb2YgY29uc3RydWN0b3IgcmVmZXJlbmNlcyBkZXNjcmliaW5nIGVhY2ggcGFyYW1ldGVyIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyBwYXJhbXM8TT4obW9kZWw6IENvbnN0cnVjdG9yPE0+LCBwcm9wOiBzdHJpbmcpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwgRGVjb3JhdGlvbktleXMuREVTSUdOX1BBUkFNU10uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNpbmdsZSByZWNvcmRlZCBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IExvb2tzIHVwIHRoZSBwYXJhbWV0ZXIgbWV0YWRhdGEgZm9yIHRoZSBwcm92aWRlZCBpbmRleCwgZW5mb3JjaW5nIGJvdW5kcyBhbmQgcmV0dXJuaW5nIHRoZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoYXQgYXJndW1lbnQuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciBvd25pbmcgdGhlIG1ldGhvZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgTWV0aG9kIG5hbWUgd2hvc2UgcGFyYW1ldGVyIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGRlc2lyZWQgcGFyYW1ldGVyIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSBwYXJhbWV0ZXIgb3IgYHVuZGVmaW5lZGAgaWYgbm90IHJlY29yZGVkLlxuICAgKi9cbiAgc3RhdGljIHBhcmFtPE0+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBwcm9wOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zKG1vZGVsLCBwcm9wKTtcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoaW5kZXggPiBwYXJhbXMubGVuZ3RoIC0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBhcmFtZXRlciBpbmRleCAke2luZGV4fSBvdXQgb2YgcmFuZ2UgZm9yICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhcmFtc1tpbmRleF07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgcmV0dXJuIHR5cGUgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgdW5kZXIgYG1ldGhvZHMuPHByb3A+LmRlc2lnbjpyZXR1cm50eXBlYCB0byByZXR1cm4gdGhlIHJldHVybiB0eXBlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgbWV0aG9kIG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHJldHVybiB0eXBlIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSByZXR1cm4gdHlwZSBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgcmV0dXJuPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgcHJvcDogc3RyaW5nKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXG4gICAgICBtb2RlbCxcbiAgICAgIFtEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wLCBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUkVUVVJOXS5qb2luKFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSByZWNvcmRlZCBkZXNpZ24gdHlwZSBmb3IgYSBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBwcm9wZXJ0aWVzLjxwcm9wPmAgdG8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RvciByZWNvcmRlZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBwcm9wZXJ0eSBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lIHdob3NlIHR5cGUgbWV0YWRhdGEgc2hvdWxkIGJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3Rvcnx1bmRlZmluZWR9IENvbnN0cnVjdG9yIHJlZmVyZW5jZSBmb3IgdGhlIHByb3BlcnR5IHR5cGUgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHN0YXRpYyB0eXBlKG1vZGVsOiBDb25zdHJ1Y3RvciwgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuUFJPUEVSVElFUywgcHJvcF0uam9pbih0aGlzLnNwbGl0dGVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBjYW5vbmljYWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBtb2RlbCBoYW5kbGUuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHN0b3JlZCBjb25zdHJ1Y3RvciByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvdmlkZWQgbW9kZWwgaXMgYSBwcm94eSBvciByZWR1Y2VkIHZhbHVlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCB3aGVuIG5vIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGhhcyBiZWVuIHJlY29yZGVkIHlldC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgTW9kZWwgdXNlZCB3aGVuIHJlY29yZGluZyBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8TT58dW5kZWZpbmVkfSBDYW5vbmljYWwgY29uc3RydWN0b3IgaWYgc3RvcmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBzdGF0aWMgY29uc3RyPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHJldHVybiBtb2RlbFtEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiBhcyBrZXlvZiB0eXBlb2YgbW9kZWxdIGFzXG4gICAgICB8IENvbnN0cnVjdG9yPE0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHJldHVybiB7TUVUQXx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0PE0sIE1FVEEgZXh0ZW5kcyBCYXNpY01ldGFkYXRhPE0+ID0gQmFzaWNNZXRhZGF0YTxNPj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IE1FVEEgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOZXN0ZWQga2V5IHBhdGggdG8gZmV0Y2ggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICogQHJldHVybiB7TUVUQXwqfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yLCBrZXk6IHN0cmluZyk6IGFueTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgbW9kZWwgb3IgYSBzcGVjaWZpYyBrZXkgd2l0aGluIGl0LlxuICAgKiBAc3VtbWFyeSBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3RydWN0b3Igb25seSwgcmV0dXJucyB0aGUgZW50aXJlIG1ldGFkYXRhIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLiBXaGVuIGEga2V5IHBhdGggaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCBhdCB0aGF0IG5lc3RlZCBrZXkuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEB0ZW1wbGF0ZSBNRVRBXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT58c3RyaW5nfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdXNlZCB0byBsb2NhdGUgdGhlIG1ldGFkYXRhIHJlY29yZCBvciBhIHByZS1yZXNvbHZlZCBzeW1ib2wgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIE9wdGlvbmFsIG5lc3RlZCBrZXkgcGF0aCB0byBmZXRjaCBhIHNwZWNpZmljIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtNRVRBfCp8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3IsIGtleT86IHN0cmluZykge1xuICAgIGlmIChrZXkgPT09IERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SKSByZXR1cm4gdGhpcy5jb25zdHIobW9kZWwpO1xuICAgIGlmIChrZXkgIT09IERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SKSBtb2RlbCA9IHRoaXMuY29uc3RyKG1vZGVsKSB8fCBtb2RlbDtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiB0aGlzLmlubmVyR2V0KHN5bWJvbCwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIHN0b3JlZCB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IHJlc29sdmVzIGFuZCBvcHRpb25hbGx5IGRyaWxscyBpbnRvIHRoZSBpbi1tZW1vcnkgbWV0YWRhdGEgbWFwIGZvciB0aGUgcHJvdmlkZWQgc3ltYm9sIGFuZCBrZXkgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gW2tleV0gT3B0aW9uYWwgbmVzdGVkIGtleSByZWZlcmVuY2luZyBhIHNwZWNpZmljIG1ldGFkYXRhIGVudHJ5LlxuICAgKiBAcmV0dXJuIHthbnl9IFN0b3JlZCBtZXRhZGF0YSBvYmplY3Qgb3IgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBrZXksIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaW5uZXJHZXQoc3ltYm9sOiBzeW1ib2wsIGtleT86IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gZ2V0VmFsdWVCeVNwbGl0dGVyKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sIGtleSwgdGhpcy5zcGxpdHRlcik7XG4gICAgcmV0dXJuIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV3JpdGVzIG1ldGFkYXRhIHVuZGVyIGEgc3ltYm9sIGtleS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgaGVscGVyIHRoYXQgZW5zdXJlcyB0aGUgbWV0YWRhdGEgYnVja2V0IGV4aXN0cyBmb3IgdGhlIHByb3ZpZGVkIHN5bWJvbCBhbmQgcGVyc2lzdHMgdGhlIGdpdmVuIHZhbHVlLCBkcmlsbGluZyBpbnRvIG5lc3RlZCBzdHJ1Y3R1cmVzIHdoZW4gdGhlIGtleSBpcyBhIHN0cmluZyBwYXRoLlxuICAgKiBAcGFyYW0ge3N5bWJvbH0gc3ltYm9sIFN5bWJvbCByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIGJ1Y2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXkgTmVzdGVkIGtleSBwYXRoIG9yIGRpcmVjdCBzeW1ib2wgdW5kZXIgd2hpY2ggdG8gc3RvcmUgdGhlIG1ldGFkYXRhIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgcGVyc2lzdGVkIGluIHRoZSBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlubmVyU2V0KHN5bWJvbDogc3ltYm9sLCBrZXk6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSkgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXSA9IHt9IGFzIGFueTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBzZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gICAgICAgIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHRoaXMuc3BsaXR0ZXJcbiAgICAgICk7XG4gICAgdGhpcy5fbWV0YWRhdGFbc3ltYm9sXVtrZXldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdyaXRlcyBhIG1ldGFkYXRhIHZhbHVlIGF0IGEgZ2l2ZW4gbmVzdGVkIGtleSBwYXRoLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoZSBtZXRhZGF0YSByZWNvcmQgZXhpc3RzIGZvciB0aGUgY29uc3RydWN0b3IsIG1pcnJvcnMgaXQgb24gdGhlIGNvbnN0cnVjdG9yIHdoZW4gZW5hYmxlZCwgYW5kIHNldHMgdGhlIHByb3ZpZGVkIHZhbHVlIG9uIHRoZSBuZXN0ZWQga2V5IHBhdGggdXNpbmcgdGhlIGNvbmZpZ3VyZWQgc3BsaXR0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT58c3RyaW5nfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3IgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGJlbG9uZ3Mgb3IgYSBkaXJlY3QgaWRlbnRpZmllciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTmVzdGVkIGtleSBwYXRoIGF0IHdoaWNoIHRvIHN0b3JlIHRoZSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHRvIHN0b3JlIGluIHRoZSBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXQobW9kZWw6IENvbnN0cnVjdG9yIHwgc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmIChrZXkgPT09IERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIERlY29yYXRpb25LZXlzLkNPTlNUUlVDVE9SLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiKSBtb2RlbCA9IHRoaXMuY29uc3RyKG1vZGVsKSB8fCBtb2RlbDtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKG1vZGVsLnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBrZXksIHZhbHVlKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kZWwgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgIE1ldGFkYXRhLm1pcnJvciAmJlxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbCwgdGhpcy5iYXNlS2V5KVxuICAgICkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCB0aGlzLmJhc2VLZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX21ldGFkYXRhW3N5bWJvbF0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGRlY29yYXRpb24tYXdhcmUgbGlicmFyeSBhbmQgaXRzIHZlcnNpb24uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgdmVyc2lvbiBzdHJpbmcgZm9yIGFuIGludGVncmF0aW5nIGxpYnJhcnkgdW5kZXIgdGhlIHNoYXJlZCBsaWJyYXJpZXMgbWV0YWRhdGEgc3ltYm9sLCBwcmV2ZW50aW5nIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zIGZvciB0aGUgc2FtZSBsaWJyYXJ5IGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaWJyYXJ5IFBhY2thZ2UgbmFtZSBvciBpZGVudGlmaWVyIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiBTZW1hbnRpYyB2ZXJzaW9uIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpYnJhcnkuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbGlicmFyeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJMaWJyYXJ5KGxpYnJhcnk6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIGNvbnN0IGxpYiA9IHRoaXMuaW5uZXJHZXQoc3ltYm9sLCBsaWJyYXJ5KTtcbiAgICBpZiAobGliKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGlicmFyeSBhbHJlYWR5ICR7bGlicmFyeX0gcmVnaXN0ZXJlZCB3aXRoIHZlcnNpb24gJHt2ZXJzaW9ufWBcbiAgICAgICk7XG4gICAgdGhpcy5pbm5lclNldChzeW1ib2wsIGxpYnJhcnksIHZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyByZWdpc3RlcmVkIGRlY29yYXRpb24tYXdhcmUgbGlicmFyaWVzLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBpbi1tZW1vcnkgbWFwIG9mIGxpYnJhcnkgaWRlbnRpZmllcnMgdG8gc2VtYW50aWMgdmVyc2lvbnMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBEZWNvcmF0aW9uIG1ldGFkYXRhIHN0b3JlLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBNYXAgb2YgcmVnaXN0ZXJlZCBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHRoZWlyIHZlcnNpb24gc3RyaW5ncy5cbiAgICovXG4gIHN0YXRpYyBsaWJyYXJpZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihEZWNvcmF0aW9uS2V5cy5MSUJSQVJJRVMpO1xuICAgIHJldHVybiB0aGlzLmlubmVyR2V0KHN5bWJvbCkgfHwge307XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEpvaW5zIHBhdGggc2VnbWVudHMgdXNpbmcgdGhlIGN1cnJlbnQgc3BsaXR0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBuZXN0ZWQgbWV0YWRhdGEga2V5IGJ5IGNvbmNhdGVuYXRpbmcgc3RyaW5nIHNlZ21lbnRzIHdpdGggdGhlIGNvbmZpZ3VyZWQgc3BsaXR0ZXIgZm9yIHVzZSB3aXRoIHRoZSBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHBhcmFtIHsuLi5zdHJpbmd9IHN0cnMgS2V5IHNlZ21lbnRzIHRvIGpvaW4gaW50byBhIGZ1bGwgbWV0YWRhdGEgcGF0aC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBTcGxpdHRlci1qb2luZWQgbWV0YWRhdGEga2V5LlxuICAgKi9cbiAgc3RhdGljIGtleSguLi5zdHJzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBzdHJzLmpvaW4odGhpcy5zcGxpdHRlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCByZXNvbHZlciB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBmbGF2b3VyLlxuICogQHN1bW1hcnkgUmVzb2x2ZXMgdGhlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0IGJ5IGFsd2F5cyByZXR1cm5pbmcgdGhlIGxpYnJhcnkncyBgRGVmYXVsdEZsYXZvdXJgIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCBUYXJnZXQgb2JqZWN0IGJlaW5nIGRlY29yYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gUmVzb2x2ZWQgZmxhdm91ciBpZGVudGlmaWVyLlxuICogQGZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdHlwZSBjb3ZlcmluZyBzdXBwb3J0ZWQgZGVjb3JhdG9yIGtpbmRzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbnkgb2YgdGhlIHN0YW5kYXJkIFR5cGVTY3JpcHQgZGVjb3JhdG9yIHNpZ25hdHVyZXMgKGNsYXNzLCBwcm9wZXJ0eSwgb3IgbWV0aG9kKSwgZW5hYmxpbmcgZmxleGlibGUgcmVnaXN0cmF0aW9uIGFuZCBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlIERlY29yYXRpb24gc3lzdGVtLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlRGVmIERlY29yYXRvclR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVHlwZXMgPVxuICB8IENsYXNzRGVjb3JhdG9yXG4gIHwgUHJvcGVydHlEZWNvcmF0b3JcbiAgfCBNZXRob2REZWNvcmF0b3I7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJiaXRyYXJ5IGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGNvbmNyZXRlIGRlY29yYXRvciBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIGEgdGFyZ2V0LlxuICogQHRlbXBsYXRlIEFcbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBEZWNvcmF0b3JUeXBlcztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJndW1lbnQgYnVuZGxlIGZvciBhIGRlY29yYXRvciBmYWN0b3J5LlxuICogQHN1bW1hcnkgT2JqZWN0IGZvcm0gdXNlZCB0byBkZWZlciBkZWNvcmF0b3IgY3JlYXRpb24sIGNhcnJ5aW5nIGJvdGggdGhlIGZhY3RvcnkgZnVuY3Rpb24gYW5kIGl0cyBhcmd1bWVudCBsaXN0IHRvIGJlIGludm9rZWQgbGF0ZXIgZHVyaW5nIGFwcGxpY2F0aW9uLlxuICogQHR5cGVEZWYgRGVjb3JhdG9yRmFjdG9yeUFyZ3NcbiAqIEBwcm9wZXJ0eSB7RGVjb3JhdG9yRmFjdG9yeX0gZGVjb3JhdG9yIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIGRlY29yYXRvciB3aGVuIGludm9rZWQuXG4gKiBAcHJvcGVydHkge2FueVtdfSBhcmdzIExpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGRlY29yYXRvciBmYWN0b3J5LlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvckZhY3RvcnlBcmdzID0ge1xuICBkZWNvcmF0b3I6IERlY29yYXRvckZhY3Rvcnk7XG4gIGFyZ3M6IGFueVtdO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pb24gdGhhdCByZXByZXNlbnRzIGVpdGhlciBhIHJlYWR5LXRvLWFwcGx5IGRlY29yYXRvciBvciBhIGZhY3Rvcnkgd2l0aCBhcmd1bWVudHMuXG4gKiBAc3VtbWFyeSBBbGxvd3MgcmVnaXN0ZXJpbmcgZGVjb3JhdG9ycyBpbiB0d28gZm9ybXM6IGFzIGRpcmVjdCBkZWNvcmF0b3IgZnVuY3Rpb25zIG9yIGFzIGRlZmVycmVkIGZhY3RvcmllcyBwYWlyZWQgd2l0aCB0aGVpciBhcmd1bWVudCBsaXN0cyBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JEYXRhID0gRGVjb3JhdG9yVHlwZXMgfCBEZWNvcmF0b3JGYWN0b3J5QXJncztcbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzLlxuICogQHN1bW1hcnkgVGhlIERlY29yYXRpb24gY2xhc3MgcHJvdmlkZXMgYSBidWlsZGVyIHBhdHRlcm4gZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLCBhbGxvd2luZyBmcmFtZXdvcmstc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHdoaWxlIG1haW50YWluaW5nIGEgY29uc2lzdGVudCBBUEkuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBkZWNvcmF0b3IgKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyPURlZmF1bHRGbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0LlxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IGRlY29yYXRpb24gZm9yICdjb21wb25lbnQnIHdpdGggZGVmYXVsdCBmbGF2b3VyXG4gKiBjb25zdCBjb21wb25lbnREZWNvcmF0b3IgPSBuZXcgRGVjb3JhdGlvbigpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUoY3VzdG9tQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBmbGF2b3VyZWQgZGVjb3JhdGlvblxuICogY29uc3QgdnVlQ29tcG9uZW50ID0gbmV3IERlY29yYXRpb24oJ3Z1ZScpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUodnVlQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBBcHBseSB0aGUgZGVjb3JhdGlvblxuICogQGNvbXBvbmVudERlY29yYXRvclxuICogY2xhc3MgTXlDb21wb25lbnQge31cbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRpb25cbiAqICAgcGFydGljaXBhbnQgUiBhcyBGbGF2b3VyUmVzb2x2ZXJcbiAqICAgcGFydGljaXBhbnQgRiBhcyBEZWNvcmF0b3JGYWN0b3J5XG4gKlxuICogICBDLT4+RDogbmV3IERlY29yYXRpb24oZmxhdm91cilcbiAqICAgQy0+PkQ6IGZvcihrZXkpXG4gKiAgIEMtPj5EOiBkZWZpbmUoZGVjb3JhdG9ycylcbiAqICAgRC0+PkQ6IHJlZ2lzdGVyKGtleSwgZmxhdm91ciwgZGVjb3JhdG9ycylcbiAqICAgRC0+PkY6IGRlY29yYXRvckZhY3Rvcnkoa2V5LCBmbGF2b3VyKVxuICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gKiAgIFItLT4+RjogcmVzb2x2ZWQgZmxhdm91clxuICogICBGLT4+RjogYXBwbHkgZGVjb3JhdG9yc1xuICogICBGLS0+PkM6IGRlY29yYXRlZCB0YXJnZXRcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29yYXRpb24gaW1wbGVtZW50cyBJRGVjb3JhdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtYXAgb2YgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbmlzZWQgYnkga2V5IGFuZCBmbGF2b3VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb3JhdG9yczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG4gICAgICAgIGV4dHJhcz86IFNldDxEZWNvcmF0b3JEYXRhPjtcbiAgICAgIH1cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91ciBmcm9tIGEgdGFyZ2V0LlxuICAgKiBAc3VtbWFyeSBSZXNvbHZlciBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRvcnM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgYWRkaXRpb25hbCBkZWNvcmF0b3JzLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlY29yYXRvciBrZXkuXG4gICAqL1xuICBwcml2YXRlIGtleT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZsYXZvdXI6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUga2V5IGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXNlcyBhIG5ldyBkZWNvcmF0aW9uIGNoYWluIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgSWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvci5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBhZGQgZGVjb3JhdG9ycyB3aXRoIGFkZG9uIHN1cHBvcnQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZG9uPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVjb3JhdG9ycyBhcmUgYWRkaXRpdmUgZXh0cmFzLlxuICAgKiBAcGFyYW0gey4uLkRlY29yYXRvckRhdGF9IGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byByZWdpc3RlciBmb3IgdGhlIGNvbmZpZ3VyZWQga2V5LlxuICAgKiBAcmV0dXJuIHt0aGlzfSBDdXJyZW50IGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdGUoXG4gICAgYWRkb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAuLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgcHJpbWFyeSBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKiBAcGFyYW0gey4uLkRlY29yYXRvckRhdGF9IGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmUuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyRW5kfSBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluIChhbHNvIGltcGxlbWVudHMgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCkuXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IERlY29yYXRpb25CdWlsZGVyRW5kICYgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIikgJiZcbiAgICAgIGRlY29yYXRvcnMubGVuZ3RoICE9PSAxXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2hlbiB1c2luZyBhbiBvdmVycmlkYWJsZSBkZWNvcmF0b3IsIG9ubHkgb25lIGlzIGFsbG93ZWRgXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGZhbHNlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBleGlzdGluZyBkZWNvcmF0b3JzLlxuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKiBAcGFyYW0gey4uLkRlY29yYXRvckRhdGF9IGRlY29yYXRvcnMgQWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHJlZ2lzdGVyIGFzIGFkZG9ucy5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJCdWlsZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgdGhlIGRlY29yYXRvci5cbiAgICovXG4gIGV4dGVuZCguLi5kZWNvcmF0b3JzOiBEZWNvcmF0b3JEYXRhW10pOiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICBpZiAoXG4gICAgICBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHR5cGVvZiBkID09PSBcIm9iamVjdFwiKSAmJlxuICAgICAgZGVjb3JhdG9ycy5sZW5ndGggIT09IDFcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXaGVuIGV4dGVuZGluZyB1c2luZyBhbiBvdmVycmlkYWJsZSBkZWNvcmF0b3IsIG9ubHkgb25lIGlzIGFsbG93ZWRgXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKHRydWUsIC4uLmRlY29yYXRvcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IHRoYXQgY3JlYXRlcyBhIGNvbnRleHQtYXdhcmUgZGVjb3JhdG9yIGZvciBhIGtleS9mbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBQcm9kdWNlcyBhIGRlY29yYXRvciBmdW5jdGlvbiBib3VuZCB0byB0aGUgcHJvdmlkZWQga2V5IGFuZCBmbGF2b3VyLiBUaGUgcmVzdWx0aW5nIGRlY29yYXRvciByZXNvbHZlcyB0aGUgYWN0dWFsIGRlY29yYXRvcnMgdG8gYXBwbHkgYXQgaW52b2NhdGlvbiB0aW1lIGJhc2VkIG9uIHRoZSB0YXJnZXQncyByZXNvbHZlZCBmbGF2b3VyIGFuZCB0aGUgcmVnaXN0ZXJlZCBiYXNlIGFuZCBleHRyYSBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRpb24ga2V5IHVzZWQgdG8gbG9vayB1cCByZWdpc3RlcmVkIGRlY29yYXRvcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZj1EZWZhdWx0Rmxhdm91cl0gRXhwbGljaXQgZmxhdm91ciB0byBiaW5kIHRoZSBmYWN0b3J5IHRvLlxuICAgKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIHRoZSByZXNvbHZlZCBkZWNvcmF0b3JzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICAgKiAgIHBhcnRpY2lwYW50IEIgYXMgRGVjb3JhdGlvbiAoYnVpbGRlcilcbiAgICogICBwYXJ0aWNpcGFudCBGIGFzIGRlY29yYXRvckZhY3Rvcnkoa2V5LCBmKVxuICAgKiAgIHBhcnRpY2lwYW50IFIgYXMgZmxhdm91clJlc29sdmVyXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBcHBsaWVkIERlY29yYXRvcnNcbiAgICogICBVLT4+QjogZGVmaW5lKCkvZXh0ZW5kKCkgYW5kIGFwcGx5KClcbiAgICogICBCLT4+RjogY3JlYXRlIGNvbnRleHQgZGVjb3JhdG9yXG4gICAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICAgKiAgIFItLT4+RjogZmxhdm91clxuICAgKiAgIEYtPj5BOiBjb2xsZWN0IGJhc2UgKyBleHRyYXNcbiAgICogICBsb29wIGVhY2ggZGVjb3JhdG9yXG4gICAqICAgICBBLT4+VTogaW52b2tlIGRlY29yYXRvcih0YXJnZXQsIGtleT8sIGRlc2M/KVxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGRlY29yYXRvckZhY3Rvcnkoa2V5OiBzdHJpbmcsIGY6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7XG4gICAgZnVuY3Rpb24gY29udGV4dERlY29yYXRvcihcbiAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICAgICkge1xuICAgICAgY29uc3QgZmxhdm91ciA9IERlY29yYXRpb24uZmxhdm91clJlc29sdmVyKHRhcmdldCk7XG4gICAgICBjb25zdCBjYWNoZSA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldO1xuICAgICAgbGV0IGRlY29yYXRvcnM7XG4gICAgICBjb25zdCBleHRyYXMgPSBjYWNoZVtmbGF2b3VyXVxuICAgICAgICA/IGNhY2hlW2ZsYXZvdXJdLmV4dHJhc1xuICAgICAgICA6IGNhY2hlW0RlZmF1bHRGbGF2b3VyXS5leHRyYXM7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0gJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycyAmJlxuICAgICAgICBjYWNoZVtmbGF2b3VyXS5kZWNvcmF0b3JzLnNpemVcbiAgICAgICkge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZGVjb3JhdG9ycztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9yQXJncyA9IFtcbiAgICAgICAgLi4uKGNhY2hlW0RlZmF1bHRGbGF2b3VyXSBhcyBhbnkpLmRlY29yYXRvcnMudmFsdWVzKCksXG4gICAgICBdLnJlZHVjZSgoYWNjdW06IFJlY29yZDxudW1iZXIsIGFueT4sIGUsIGkpID0+IHtcbiAgICAgICAgaWYgKGUuYXJncykgYWNjdW1baV0gPSBlLmFyZ3M7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgdG9BcHBseSA9IFtcbiAgICAgICAgLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pLFxuICAgICAgICAuLi4oZXh0cmFzID8gZXh0cmFzLnZhbHVlcygpIDogW10pLFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRvQXBwbHkucmVkdWNlKFxuICAgICAgICAoXywgZCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgICAgICBjb25zdCB7IGRlY29yYXRvciB9ID0gZCBhcyBEZWNvcmF0b3JGYWN0b3J5QXJncztcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGRlY29yYXRvciguLi4oT2JqZWN0LnZhbHVlcyhkZWNvcmF0b3JBcmdzKVswXSB8fCBbXSkpIGFzIGFueVxuICAgICAgICAgICAgICApKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICAgIHJldHVybiAoZCBhcyBhbnkpKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRlY29yYXRvciB0eXBlOiAke3R5cGVvZiBkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgeyB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yIH1cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvbi5cbiAgICogQHN1bW1hcnkgQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBkZWNvcmF0b3IgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gR2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvbiByZWFkeSBmb3IgYXBwbGljYXRpb24uXG4gICAqL1xuICBhcHBseSgpOiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKSA9PiBhbnkge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBrZXkgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgRGVjb3JhdGlvbi5yZWdpc3RlcihcbiAgICAgIHRoaXMua2V5LFxuICAgICAgdGhpcy5mbGF2b3VyLFxuICAgICAgdGhpcy5kZWNvcmF0b3JzIHx8IG5ldyBTZXQoKSxcbiAgICAgIHRoaXMuZXh0cmFzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0b3JGYWN0b3J5KHRoaXMua2V5LCB0aGlzLmZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgZGVjb3JhdG9ycyBmb3IgYSBzcGVjaWZpYyBrZXkgYW5kIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdG9yIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRGVjb3JhdG9yIGZsYXZvdXIuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgZm9yIHRoZSBrZXkuXG4gICAqIEBwYXJhbSB7U2V0PERlY29yYXRvckRhdGE+fSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnMgcmVnaXN0ZXJlZCBhcyBmbGF2b3VyLXNwZWNpZmljIGFkZG9ucy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+LFxuICAgIGV4dHJhcz86IFNldDxEZWNvcmF0b3JEYXRhPlxuICApIHtcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIH1cbiAgICBpZiAoIWRlY29yYXRvcnMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBkZWNvcmF0b3JzIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGZsYXZvdXIgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG5cbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSA9IHt9O1xuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0pXG4gICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSA9IHt9O1xuICAgIGlmIChkZWNvcmF0b3JzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICBpZiAoZXh0cmFzKSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGdsb2JhbCBmbGF2b3VyIHJlc29sdmVyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBkZWNvcmF0b3IgZmxhdm91cnMuXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEZsYXZvdXJSZXNvbHZlcihyZXNvbHZlcjogRmxhdm91clJlc29sdmVyKSB7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2Ugc3RhdGljIGVudHJ5IHRvIHN0YXJ0IGEgZGVjb3JhdGlvbiBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IERlY29yYXRpb24gaW5zdGFuY2UgYW5kIGluaXRpYXRlcyB0aGUgYnVpbGRlciBjaGFpbiB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgRGVjb3JhdGlvbiBrZXkgdG8gY29uZmlndXJlLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbigpLmZvcihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgYSBidWlsZGVyIGZvciBhIHNwZWNpZmljIGZsYXZvdXIuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0byBiZWdpbiBhIERlY29yYXRpb24gYnVpbGRlciBjaGFpbiBib3VuZCB0byB0aGUgZ2l2ZW4gZmxhdm91ciBpZGVudGlmaWVyLCBhbGxvd2luZyByZWdpc3RyYXRpb24gb2YgZmxhdm91ci1zcGVjaWZpYyBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBGbGF2b3VyIG5hbWUgdG8gYmluZCB0byB0aGUgYnVpbGRlci5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJTdGFydH0gQnVpbGRlciBzdGFydCBpbnRlcmZhY2UgdG8gY29udGludWUgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvTWV0YWRhdGFcIjtcbmltcG9ydCB7IERlY29yYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFzc2lnbnMgYXJiaXRyYXJ5IG1ldGFkYXRhIHRvIGEgdGFyZ2V0IHVzaW5nIGEgc3RyaW5nIGtleS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGNlbnRyYWwgbWV0YWRhdGEgc3RvcmUgZm9yIHRoZSBwcm92aWRlZCBjbGFzcyBvciBtZW1iZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGFyZ2V0LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIHN0b3JlIHVuZGVyIHRoZSBnaXZlbiBrZXkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCB3cml0ZXMgdGhlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRhZGF0YVxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXRhZGF0YShcbiAgICBtb2RlbDogYW55LFxuXG4gICAgcHJvcD86IGFueSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApIHtcbiAgICBNZXRhZGF0YS5zZXQocHJvcCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWwsIGtleSwgdmFsdWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYXB0dXJlcyBhbmQgc3RvcmVzIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVhZHMgdGhlIHJlZmxlY3RlZCBgZGVzaWduOnR5cGVgIGZvciBhIHByb3BlcnR5IGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1ldGFkYXRhIHN0b3JlIHVuZGVyIHRoZSBwcm9wZXJ0aWVzIG1hcC5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwcm9wZXJ0eSdzIHR5cGUgbWV0YWRhdGEgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wKCkge1xuICByZXR1cm4gZnVuY3Rpb24gcHJvcChtb2RlbDogb2JqZWN0LCBwcm9wOiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9UWVBFLFxuICAgICAgbW9kZWwsXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEoTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3ApLCBkZXNpZ25UeXBlKShcbiAgICAgIG1vZGVsLFxuICAgICAgcHJvcFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhcHR1cmVzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgZGVjb3JhdGVkIG1ldGhvZC5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgZW5zdXJlcyB0aGUgbWV0aG9kIG1ldGFkYXRhIGlzIGluaXRpYWxpc2VkIGFuZCBzdG9yZXMgdGhlIHJlZmxlY3RlZCBwYXJhbWV0ZXIgY29uc3RydWN0b3IgYXQgdGhlIHByb3ZpZGVkIGluZGV4LlxuICogQHJldHVybiB7UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBwYXJhbWV0ZXIgdHlwZSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gcGFyYW1cbiAqIEBjYXRlZ29yeSBQYXJhbWV0ZXIgRGVjb3JhdG9yc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBQIGFzIHBhcmFtKClcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICogICBVLT4+UDogcGFyYW0oKSh0YXJnZXQsIGtleSwgaW5kZXgpXG4gKiAgIFAtPj5VOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgUC0+Pk06IHBhcmFtcyhjb25zdHJ1Y3Rvciwga2V5KVxuICogICBNLS0+PlA6IHBhcmFtZXRlciBjb25zdHJ1Y3RvcnNbXVxuICogICBQLT4+TTogc2V0KG1ldGhvZHMua2V5LmluZGV4LCBjb25zdHJ1Y3RvcilcbiAqICAgUC0tPj5VOiBwYXJhbWV0ZXIgcmVjb3JkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcmFtKCkge1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYW0oXG4gICAgbW9kZWw6IG9iamVjdCxcbiAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICBpZiAoIXByb3ApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBAcGFyYW0gZGVjb3JhdG9yIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbWV0aG9kc2ApO1xuICAgIG1ldGhvZCgpKG1vZGVsLCBwcm9wLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBwcm9wKSk7XG4gICAgY29uc3QgcGFyYW1UcGVzID0gTWV0YWRhdGEucGFyYW1zKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSwgcHJvcCBhcyBzdHJpbmcpO1xuICAgIGlmICghcGFyYW1UcGVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHBhcmFtZXRlciB0eXBlcyBmb3IgJHtTdHJpbmcocHJvcCl9YCk7XG4gICAgaWYgKGluZGV4ID49IHBhcmFtVHBlcy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYXJhbWV0ZXIgaW5kZXggJHtpbmRleH0gb3V0IG9mIHJhbmdlIGZvciAke1N0cmluZyhwcm9wKX1gXG4gICAgICApO1xuICAgIG1ldGFkYXRhKFxuICAgICAgTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AgYXMgc3RyaW5nLCBpbmRleC50b1N0cmluZygpKSxcbiAgICAgIHBhcmFtVHBlc1tpbmRleF1cbiAgICApKG1vZGVsLCBwcm9wKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBhIHBhcmFtZXRlciBkZWNvcmF0b3Igd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgZGVmYXVsdCBgcGFyYW0oKWAgZGVjb3JhdG9yIGFuZCBhdWdtZW50cyB0aGUgc3RvcmVkIG1ldGFkYXRhIHdpdGggYW4gYXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSBwZXJzaXN0ZWQgdW5kZXIgdGhlIGdpdmVuIGtleS5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyBib3RoIHRoZSBwYXJhbWV0ZXIgZGVzaWduIHR5cGUgYW5kIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gKiBAZnVuY3Rpb24gcGFyYW1NZXRhZGF0YVxuICogQGNhdGVnb3J5IFBhcmFtZXRlciBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwYXJhbU1ldGFkYXRhKHRhcmdldDogYW55LCBwcm9wOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwYXJhbSgpLFxuICAgICAgbWV0YWRhdGEoTWV0YWRhdGEua2V5KERlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIGtleSksIHZhbHVlKVxuICAgICkodGFyZ2V0LCBwcm9wLCBpbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlY29yZHMgbWV0aG9kIGRlc2lnbi10aW1lIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYXB0dXJlcyBhIG1ldGhvZCdzIHJlZmxlY3RlZCBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlcywgc3RvcmluZyB0aGVtIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSBtZXRhZGF0YSBrZXlzIHNvIHRoZXkgY2FuIGJlIGluc3BlY3RlZCBhdCBydW50aW1lLlxuICogQHJldHVybiB7TWV0aG9kRGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBwZXJzaXN0cyB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlIGluZm9ybWF0aW9uIGludG8gdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBtZXRob2RcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAqICAgcGFydGljaXBhbnQgRiBhcyBtZXRob2QoKVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKiAgIFUtPj5GOiBtZXRob2QoKSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcilcbiAqICAgRi0+PlU6IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoZGVzaWduOnBhcmFtdHlwZXMpXG4gKiAgIEYtPj5VOiBSZWZsZWN0LmdldE93bk1ldGFkYXRhKGRlc2lnbjpyZXR1cm50eXBlKVxuICogICBGLT4+TTogc2V0KG1ldGhvZHMua2V5LmRlc2lnbjpwYXJhbXR5cGVzLCBwYXJhbXMpXG4gKiAgIEYtPj5NOiBzZXQobWV0aG9kcy5rZXkuZGVzaWduOnJldHVybnR5cGUsIHJldHVyblR5cGUpXG4gKiAgIEYtLT4+VTogZGVjb3JhdGVkIGZ1bmN0aW9uXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1ldGhvZChvYmo6IGFueSwgcHJvcD86IGFueSwgZGVzY3JpcHRvcj86IGFueSkge1xuICAgIGNvbnN0IGRlc2lnblBhcmFtcyA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TLFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgY29uc3QgZGVzaWduUmV0dXJuID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcbiAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk4sXG4gICAgICBvYmosXG4gICAgICBwcm9wXG4gICAgKTtcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLk1FVEhPRFMsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUEFSQU1TXG4gICAgICAgICksXG4gICAgICAgIGRlc2lnblBhcmFtc1xuICAgICAgKSxcbiAgICAgIG1ldGFkYXRhKFxuICAgICAgICBNZXRhZGF0YS5rZXkoXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuTUVUSE9EUyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLkRFU0lHTl9SRVRVUk5cbiAgICAgICAgKSxcbiAgICAgICAgZGVzaWduUmV0dXJuXG4gICAgICApXG4gICAgKShvYmosIHByb3AsIGRlc2NyaXB0b3IpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyB0byBhIHNpbmdsZSB0YXJnZXQuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgY29tcG9zaXRlIGRlY29yYXRvciB0aGF0IGFwcGxpZXMgbXVsdGlwbGUgZGVjb3JhdG9ycyBpbiBzZXF1ZW5jZSwgY29ycmVjdGx5IGhhbmRsaW5nIGNsYXNzLCBtZXRob2QsIHByb3BlcnR5LCBhbmQgcGFyYW1ldGVyIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FycmF5PENsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3I+fSBkZWNvcmF0b3JzIENvbGxlY3Rpb24gb2YgZGVjb3JhdG9ycyB0byBhcHBseS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYWxsIHByb3ZpZGVkIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldC5cbiAqIEBmdW5jdGlvbiBhcHBseVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXIgQ29kZVxuICogICBwYXJ0aWNpcGFudCBBIGFzIGFwcGx5KC4uLmRlY29yYXRvcnMpXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIFUtPj5BOiBnZXQgZGVjb3JhdG9yKC4uLmRlY29yYXRvcnMpXG4gKiAgIEEtPj5VOiByZXR1cm5zICh0YXJnZXQsIGtleT8sIGRlc2M/KSA9PiB2b2lkXG4gKiAgIFUtPj5BOiBpbnZva2Ugb24gdGFyZ2V0XG4gKiAgIGxvb3AgZm9yIGVhY2ggZGVjb3JhdG9yXG4gKiAgICAgQS0+PkQ6IGludm9rZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgdHlwZVxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseShcbiAgLi4uZGVjb3JhdG9yczogQXJyYXk8XG4gICAgQ2xhc3NEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IFBhcmFtZXRlckRlY29yYXRvclxuICA+XG4pIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbCB8IHVua25vd24sXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvciB8IG51bWJlclxuICApID0+IHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgKGRlY29yYXRvciBhcyBDbGFzc0RlY29yYXRvcikodGFyZ2V0KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAoZGVjb3JhdG9yIGFzIE1ldGhvZERlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yKShcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgIGRlc2NyaXB0b3IgYXMgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj5cbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJvcGVydHkgbWV0YWRhdGEgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2UgZmFjdG9yeSB0aGF0IGNvbWJpbmVzIGBtZXRhZGF0YShrZXksIHZhbHVlKWAgYW5kIGBwcm9wKClgIHRvIGJvdGggc2V0IGFuIGFyYml0cmFyeSBtZXRhZGF0YSBrZXkgYW5kIHJlY29yZCB0aGUgcHJvcGVydHkncyBkZXNpZ24gdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWV0YWRhdGEga2V5IHRvIHNldCBmb3IgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBrZXkuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgYW5kIGNhcHR1cmVzIHRoZSBwcm9wZXJ0eSdzIHR5cGUuXG4gKiBAZnVuY3Rpb24gcHJvcE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShrZXksIHZhbHVlKSwgcHJvcCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG1ldGhvZCBtZXRhZGF0YSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBmYWN0b3J5IHRoYXQgY29tYmluZXMgYG1ldGFkYXRhKGtleSwgdmFsdWUpYCBhbmQgYG1ldGhvZCgpYCB0byBib3RoIHNldCBhbiBhcmJpdHJhcnkgbWV0YWRhdGEga2V5IGFuZCByZWNvcmQgdGhlIG1ldGhvZCdzIGRlc2lnbiByZXR1cm4gYW5kIHBhcmFtIHR5cGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gc2V0IGZvciB0aGUgcHJvcGVydHkuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGtleS5cbiAqIEByZXR1cm4ge1Byb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSBhbmQgY2FwdHVyZXMgdGhlIHByb3BlcnR5J3MgdHlwZS5cbiAqIEBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RNZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoa2V5LCB2YWx1ZSksIG1ldGhvZCgpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXR0YWNoZXMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiB0byBhIGNsYXNzIG9yIG1lbWJlci5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgc3RvcmVzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBpbiB0aGUgbWV0YWRhdGEgc3RvcmUgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIGtleSBmb3IgYSBjbGFzcyBvciBpdHMgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzYyBEZXNjcmlwdGl2ZSB0ZXh0IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjbGFzcyBvciBwcm9wZXJ0eS5cbiAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgZGVzY3JpcHRpb24gd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIGRlc2NyaXB0aW9uXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb24oZGVzYzogc3RyaW5nKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkZXNjcmlwdGlvbihvcmlnaW5hbDogYW55LCBwcm9wPzogYW55LCBkZXNjcmlwdG9yPzogYW55KSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhKFxuICAgICAgW1xuICAgICAgICBEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTixcbiAgICAgICAgcHJvcCA/IHByb3AudG9TdHJpbmcoKSA6IERlY29yYXRpb25LZXlzLkNMQVNTLFxuICAgICAgXS5qb2luKE1ldGFkYXRhLnNwbGl0dGVyKSxcbiAgICAgIGRlc2NcbiAgICApKG9yaWdpbmFsLCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFJvb3QgZW50cnkgcG9pbnQgZm9yIHRoZSBkZWNvcmF0aW9uIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IEFnZ3JlZ2F0ZXMgYW5kIHJlLWV4cG9ydHMgdGhlIHB1YmxpYyBBUEkgb2YgdGhlIGRlY29yYXRpb24gbGlicmFyeSwgaW5jbHVkaW5nIHtAbGluayBEZWNvcmF0aW9ufSwgZGVjb3JhdG9yIHV0aWxpdGllcyBmcm9tIHtAbGluayBtb2R1bGU6ZGVjb3JhdGlvbnwuL2RlY29yYXRvcnN9LCB7QGxpbmsgTWV0YWRhdGF9LCBhbmQgc2hhcmVkIGNvbnN0YW50cyBzdWNoIGFzIHtAbGluayBEZWNvcmF0aW9uS2V5c30gYW5kIHtAbGluayBEZWZhdWx0Rmxhdm91cn0uIFRoaXMgaXMgdGhlIHByaW1hcnkgaW1wb3J0IHN1cmZhY2UgZm9yIGNvbnN1bWVycyBhbmQgZXhwb3NlczpcbiAqIC0gQ29yZSBidWlsZGVyOiB7QGxpbmsgRGVjb3JhdGlvbn1cbiAqIC0gRGVjb3JhdG9yIHV0aWxpdGllczoge0BsaW5rIG1vZHVsZTpkZWNvcmF0aW9ufGRlY29yYXRvcnMgaW4gLi9kZWNvcmF0b3JzfVxuICogLSBNZXRhZGF0YSB1dGlsaXRpZXM6IHtAbGluayBNZXRhZGF0YX1cbiAqIC0gQ29uc3RhbnRzIGFuZCBlbnVtczoge0BsaW5rIERlY29yYXRpb25LZXlzfSwge0BsaW5rIERlZmF1bHRGbGF2b3VyfVxuICogQG1vZHVsZSBkZWNvcmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS9pbmRleFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBOzs7OztBQUtHO0FBQ0ksTUFBTSxjQUFjLEdBQUc7QUFFOUI7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
|
|
937
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGlvbi5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL21ldGFkYXRhL01ldGFkYXRhLnRzIiwiLi4vc3JjL2RlY29yYXRpb24vRGVjb3JhdGlvbi50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2ljTWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGZsYXZvdXIgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvciBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBmYWxsYmFjayBmbGF2b3VyIHVzZWQgd2hlbiBubyBzcGVjaWZpYyB2YWx1ZSBpcyBwcm92aWRlZCwgZW5zdXJpbmcgY29uc2lzdGVudCBkZWNvcmF0b3Igc2VsZWN0aW9uIGFjcm9zcyB0aGUgbGlicmFyeS5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAY29uc3QgRGVmYXVsdEZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEZsYXZvdXIgPSBcImRlY2FmXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoYXJhY3RlciB1c2VkIHRvIHNwbGl0IG5lc3RlZCBtZXRhZGF0YSBrZXlzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVsaW1pdGVyIGFwcGxpZWQgYnkgdGhlIG1ldGFkYXRhIHN0b3JlIHdoZW4gdHJhdmVyc2luZyBuZXN0ZWQgb2JqZWN0IHBhdGhzIGZvciByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBPYmplY3RLZXlTcGxpdHRlclxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBPYmplY3RLZXlTcGxpdHRlciA9IFwiLlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRhZGF0YSB0b2tlbiByZWdpc3RyeSBmb3IgdGhlIGRlY29yYXRpb24gc3lzdGVtLlxuICogQHN1bW1hcnkgRW51bWVyYXRlcyB0aGUga2V5cyB1c2VkIGR1cmluZyByZWZsZWN0aW9uIGFuZCBtZXRhZGF0YSBzdG9yYWdlIGZvciBjbGFzc2VzLCBwcm9wZXJ0aWVzLCBtZXRob2RzLCBkZXNjcmlwdGlvbnMsIGFuZCByZWdpc3RlcmVkIGxpYnJhcmllcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBjb25zdCBEZWNvcmF0aW9uS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIERlY29yYXRpb25LZXlzIHtcbiAgLyoqIEBkZXNjcmlwdGlvbiBTdG9yYWdlIGJ1Y2tldCBmb3IgZGVjb3JhdGlvbi1hd2FyZSBsaWJyYXJ5IHJlZ2lzdHJhdGlvbnMuICovXG4gIExJQlJBUklFUyA9IFwibGlicmFyaWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBrZXkgbWlycm9yZWQgb24gY29uc3RydWN0b3JzIHRoYXQgaG9sZHMgcnVudGltZSBtZXRhZGF0YS4gKi9cbiAgUkVGTEVDVCA9IGBfXyR7RGVmYXVsdEZsYXZvdXJ9YCxcbiAgLyoqIEBkZXNjcmlwdGlvbiBDb250YWluZXIgb2YgcmVmbGVjdGVkIHByb3BlcnR5IG1ldGFkYXRhIGZvciBhIG1vZGVsLiAqL1xuICBQUk9QRVJUSUVTID0gXCJwcm9wZXJ0aWVzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29udGFpbmVyIG9mIHJlZmxlY3RlZCBtZXRob2QgbWV0YWRhdGEgZm9yIGEgbW9kZWwuICovXG4gIE1FVEhPRFMgPSBcIm1ldGhvZHNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgdW5kZXIgd2hpY2ggdGhlIG1vZGVsIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBpcyBwZXJzaXN0ZWQuICovXG4gIENMQVNTID0gXCJjbGFzc1wiLFxuICAvKiogQGRlc2NyaXB0aW9uIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9ucyBmb3IgY2xhc3NlcyBhbmQgbWVtYmVycy4gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gU3RvcmFnZSBzbG90IHRyYWNraW5nIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3aGVuIG92ZXJyaWRkZW4uICovXG4gIENPTlNUUlVDVE9SID0gXCJfX29yaWdpbmFsXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gQ29sbGVjdGVkIHBhcmFtZXRlciBtZXRhZGF0YSBmb3IgY29uZmlndXJlZCBkZWNvcmF0b3JzLiAqL1xuICBQQVJBTUVURVJTID0gXCJwYXJhbWV0ZXJzXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIGEgcHJvcGVydHkncyBkZXNpZ24gdHlwZS4gKi9cbiAgREVTSUdOX1RZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVmbGVjdCBtZXRhZGF0YSBrZXkgZm9yIHJlY29yZGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcy4gKi9cbiAgREVTSUdOX1BBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWZsZWN0IG1ldGFkYXRhIGtleSBmb3IgYSBtZXRob2QncyByZXR1cm4gdHlwZS4gKi9cbiAgREVTSUdOX1JFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBtZXRhZGF0YSBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBkZWZhdWx0IG1ldGFkYXRhIHNoYXBlIHVzZWQgd2hlbiBpbml0aWFsaXNpbmcgbmV3IG1ldGFkYXRhIGVudHJpZXMgZm9yIGEgbW9kZWwuXG4gKiBAdHlwZSB7bW9kdWxlOmRlY29yYXRpb24uQmFzaWNNZXRhZGF0YTxhbnk+fVxuICogQGNvbnN0IERlZmF1bHRNZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TWV0YWRhdGE6IEJhc2ljTWV0YWRhdGE8YW55PiA9IHtcbiAgW0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVNdOiBbXSxcbn0gYXMgdW5rbm93biBhcyBCYXNpY01ldGFkYXRhPGFueT47XG4iLCJpbXBvcnQgeyBCYXNpY01ldGFkYXRhLCBDb25zdHJ1Y3RvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cywgT2JqZWN0S2V5U3BsaXR0ZXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCBnaXZlbiBhIHBhdGguXG4gKiBAc3VtbWFyeSBXYWxrcyBhbiBvYmplY3Qgc3RydWN0dXJlIHVzaW5nIGEgc3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggYW5kIHJldHVybnMgdGhlIHZhbHVlIGF0IHRoYXQgbG9jYXRpb24gb3IgYHVuZGVmaW5lZGAgaWYgYW55IGtleSBpcyBtaXNzaW5nLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIHRyYXZlcnNlIGZvciB0aGUgbG9va3VwLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIHBhdGggdG8gdGhlIGRlc2lyZWQgdmFsdWUgKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NwbGl0dGVyPU9iamVjdEtleVNwbGl0dGVyXSBEZWxpbWl0ZXIgdXNlZCB0byBzZXBhcmF0ZSB0aGUgcGF0aCBzZWdtZW50cy5cbiAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IFZhbHVlIHJlc29sdmVkIGF0IHRoZSBnaXZlbiBwYXRoIG9yIGB1bmRlZmluZWRgIHdoZW4gbm90IGZvdW5kLlxuICogQGZ1bmN0aW9uIGdldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIGdldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgc3BsaXR0ZXIpXG4gKiAgIEYtPj5GOiBzcGxpdCBwYXRoIGludG8ga2V5c1xuICogICBsb29wIGZvciBlYWNoIGtleVxuICogICAgIEYtPj5POiBhY2Nlc3MgY3VycmVudFtrZXldXG4gKiAgICAgYWx0IG1pc3Npbmcgb3IgbnVsbGlzaFxuICogICAgICAgRi0tPj5DOiByZXR1cm4gdW5kZWZpbmVkXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBGLS0+PkM6IHJldHVybiBmaW5hbCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgYSBuZXN0ZWQgdmFsdWUgb24gYW4gb2JqZWN0IGdpdmVuIGEgcGF0aC5cbiAqIEBzdW1tYXJ5IFRyYXZlcnNlcyBvciBjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzIGZvbGxvd2luZyBhIHNwbGl0dGVyLWRlbGltaXRlZCBwYXRoIGFuZCBhc3NpZ25zIHRoZSBwcm92aWRlZCB2YWx1ZSBhdCB0aGUgZGVzdGluYXRpb24ga2V5LlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogT2JqZWN0IHRvIG11dGF0ZSB3aGlsZSBkcmlsbGluZyBpbnRvIG5lc3RlZCBrZXlzLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggU3BsaXR0ZXItZGVsaW1pdGVkIGRlc3RpbmF0aW9uIHBhdGggKGUuZy4sIFwiYS5iLmNcIikuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtzcGxpdHRlcj1PYmplY3RLZXlTcGxpdHRlcl0gRGVsaW1pdGVyIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHBhdGggc2VnbWVudHMuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIHNldFZhbHVlQnlTcGxpdHRlclxuICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICogICBDLT4+RjogKG9iaiwgcGF0aCwgdmFsdWUsIHNwbGl0dGVyKVxuICogICBGLT4+Rjogc3BsaXQgcGF0aCBpbnRvIGtleXNcbiAqICAgbG9vcCBmb3IgZWFjaCBrZXlcbiAqICAgICBhbHQga2V5IG1pc3NpbmdcbiAqICAgICAgIEYtPj5POiBjcmVhdGUgaW50ZXJtZWRpYXRlIG9iamVjdFxuICogICAgIGVsc2Uga2V5IGV4aXN0c1xuICogICAgICAgRi0+Pk86IGRlc2NlbmQgaW50byBleGlzdGluZyBvYmplY3RcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIEYtLT4+Qzogdm9pZFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuICBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyXG4pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoc3BsaXR0ZXIpLmZpbHRlcigoaykgPT4gay5sZW5ndGggPiAwKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IGN1cnJlbnQ6IFJlY29yZDxhbnksIGFueT4gPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgaWYgKFxuICAgICAgY3VycmVudFtrZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGN1cnJlbnRba2V5XSA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIlxuICAgICkge1xuICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICBjdXJyZW50W2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWxpemVkIHJ1bnRpbWUgbWV0YWRhdGEgc3RvcmUgYm91bmQgdG8gY29uc3RydWN0b3JzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHJlYWQgYW5kIHdyaXRlIHN0cnVjdHVyZWQgbWV0YWRhdGEgZm9yIGNsYXNzZXMgYW5kIHRoZWlyIG1lbWJlcnMsIHdpdGggb3B0aW9uYWwgbWlycm9yaW5nIG9udG8gdGhlIGNvbnN0cnVjdG9yIHZpYSBhIHdlbGwta25vd24gc3ltYm9sIGtleS4gU3VwcG9ydHMgbmVzdGVkIGtleSBwYXRocyB1c2luZyBhIGNvbmZpZ3VyYWJsZSBzcGxpdHRlciBhbmQgb2ZmZXJzIGJvdGggaW5zdGFuY2UgYW5kIHN0YXRpYyBBUElzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhlIG1ldGFkYXRhIGJlbG9uZ3MgdG8uXG4gKiBAdGVtcGxhdGUgTUVUQSBFeHRlbmRzIEJhc2ljTWV0YWRhdGE8TT4gcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXI9RGVmYXVsdEZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgaWRlbnRpZmllciBhcHBsaWVkIHdoZW4gaW5zdGFudGlhdGluZyBoZWxwZXIgYnVpbGRlcnMuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYW5kIHJlYWQgbWV0YWRhdGEgZm9yIGEgY2xhc3NcbiAqIGNsYXNzIFVzZXIgeyBuYW1lITogc3RyaW5nIH1cbiAqIE1ldGFkYXRhLnNldChVc2VyLCBcImRlc2NyaXB0aW9uLmNsYXNzXCIsIFwiQSB1c2VyIG1vZGVsXCIpO1xuICogTWV0YWRhdGEuc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZyk7XG4gKiBjb25zdCBkZXNjID0gTWV0YWRhdGEuZ2V0KFVzZXIsIFwiZGVzY3JpcHRpb24uY2xhc3NcIik7IC8vIFwiQSB1c2VyIG1vZGVsXCJcbiAqIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKFVzZXIsIFwibmFtZVwiKTsgLy8gU3RyaW5nXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29uc3RydWN0b3JcbiAqICAgcGFydGljaXBhbnQgUyBhcyBNZXRhZGF0YSAoc3RhdGljKVxuICogICBDLT4+Uzogc2V0KFVzZXIsIFwicHJvcGVydGllcy5uYW1lXCIsIFN0cmluZylcbiAqICAgQy0+PlM6IGdldChVc2VyLCBcInByb3BlcnRpZXMubmFtZVwiKVxuICogICBTLS0+PkM6IFN0cmluZ1xuICovXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBzdG9yYWdlIG9mIG1ldGFkYXRhIGJ5IGNvbnN0cnVjdG9yIHN5bWJvbFxuICAgKiBAc3VtbWFyeSBNYXBzIGEgU3ltYm9sIGRlcml2ZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgdG8gaXRzIG1ldGFkYXRhIG9iamVjdCwgZW5hYmxpbmcgZWZmaWNpZW50IGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9tZXRhZGF0YTogUmVjb3JkPHN5bWJvbCwgYW55PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGF0aCBkZWxpbWl0ZXIgZm9yIG5lc3RlZCBtZXRhZGF0YSBrZXlzXG4gICAqIEBzdW1tYXJ5IFVzZWQgYnkgZ2V0L3NldCBvcGVyYXRpb25zIHRvIG5hdmlnYXRlIG5lc3RlZCBzdHJ1Y3R1cmVzLCBkZWZhdWx0cyB0byBPYmplY3RLZXlTcGxpdHRlci5cbiAgICovXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN5bWJvbCBrZXkgdXNlZCB0byBtaXJyb3IgbWV0YWRhdGEgb24gdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBzdW1tYXJ5IFdoZW4gbWlycm9yaW5nIGlzIGVuYWJsZWQsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhpcyBub24tZW51bWVyYWJsZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgYmFzZUtleSA9IERlY29yYXRpb25LZXlzLlJFRkxFQ1Q7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtZXRhZGF0YSBpcyBtaXJyb3JlZCBvbnRvIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBtZXRhZGF0YSBvYmplY3QgaXMgZGVmaW5lZCBvbiB0aGUgY29uc3RydWN0b3IgdW5kZXIgdGhlIG5vbi1lbnVtZXJhYmxlIGJhc2VLZXkuXG4gICAqL1xuICBzdGF0aWMgbWlycm9yOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3RzIGtub3duIHByb3BlcnR5IGtleXMgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSBhbmQgcmV0dXJucyB0aGUgbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGhhdmUgcmVjb3JkZWQgdHlwZSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIHByb3BlcnR5IG1ldGFkYXRhIHNob3VsZCBiZSBpbnNwZWN0ZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfHVuZGVmaW5lZH0gQXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gbWV0YWRhdGEgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIHByb3BlcnRpZXMobW9kZWw6IENvbnN0cnVjdG9yKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhLnByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0cyBrbm93biBtZXRob2RzIGZvciBhIG1vZGVsLlxuICAgKiBAc3VtbWFyeSBSZWFkcyB0aGUgbWV0YWRhdGEgZW50cnkgYW5kIHJldHVybnMgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IGhhdmUgcmVjb3JkZWQgc2lnbmF0dXJlIG1ldGFkYXRhIGZvciB0aGUgcHJvdmlkZWQgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IG1vZGVsIFRhcmdldCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRob2QgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHJldHVybiB7c3RyaW5nW118dW5kZWZpbmVkfSBBcnJheSBvZiBtZXRob2QgbmFtZXMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gbWV0YWRhdGEgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIG1ldGhvZHMobW9kZWw6IENvbnN0cnVjdG9yKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldChtb2RlbCwgRGVjb3JhdGlvbktleXMuTUVUSE9EUyk7XG4gICAgaWYgKCFtZXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIGEgY2xhc3Mgb3IgYSBwcm9wZXJ0eS5cbiAgICogQHN1bW1hcnkgTG9va3MgdXAgdGhlIGRlc2NyaXB0aW9uIHN0b3JlZCB1bmRlciB0aGUgbWV0YWRhdGEgXCJkZXNjcmlwdGlvblwiIG1hcC4gSWYgYSBwcm9wZXJ0eSBrZXkgaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIHByb3BlcnR5J3MgZGVzY3JpcHRpb247IG90aGVyd2lzZSByZXR1cm5zIHRoZSBjbGFzcyBkZXNjcmlwdGlvbi5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIGRlc2NyaXB0aW9uIGlzIGJlaW5nIHJldHJpZXZlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wXSBPcHRpb25hbCBwcm9wZXJ0eSBrZXkgKHR5cGVkIGFzIGBrZXlvZiBNYCkgZm9yIHdoaWNoIHRvIGZldGNoIHRoZSBkZXNjcmlwdGlvbi5cbiAgICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH0gRGVzY3JpcHRpb24gdGV4dCBpZiBwcmVzZW50LCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBzdGF0aWMgZGVzY3JpcHRpb248TT4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHByb3A/OiBrZXlvZiBNXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04sIHByb3AgPyBwcm9wIDogRGVjb3JhdGlvbktleXMuQ0xBU1NdLmpvaW4oXG4gICAgICAgIHRoaXMuc3BsaXR0ZXJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHJlY29yZGVkIHBhcmFtcyBmb3IgYSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSB1bmRlciBgbWV0aG9kcy48cHJvcD4uZGVzaWduOnBhcmFtdHlwZXNgIHRvIHJldHVybiB0aGUgcGFyYW1ldGVyIGNvbnN0cnVjdG9ycyBmb3IgdGhlIGdpdmVuIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIG93bmluZyB0aGUgbWV0aG9kIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBNZXRob2QgbmFtZSB3aG9zZSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgKiBAcmV0dXJuIHthbnlbXXx1bmRlZmluZWR9IEFycmF5IG9mIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMgZGVzY3JpYmluZyBlYWNoIHBhcmFtZXRlciBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgcGFyYW1zPE0+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgcHJvcDogc3RyaW5nKTogYW55W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgW0RlY29yYXRpb25LZXlzLk1FVEhPRFMsIHByb3AsIERlY29yYXRpb25LZXlzLkRFU0lHTl9QQVJBTVNdLmpvaW4oXG4gICAgICAgIHRoaXMuc3BsaXR0ZXJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzaW5nbGUgcmVjb3JkZWQgcGFyYW1ldGVyIHR5cGUgZm9yIGEgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCB0aGUgcGFyYW1ldGVyIG1ldGFkYXRhIGZvciB0aGUgcHJvdmlkZWQgaW5kZXgsIGVuZm9yY2luZyBib3VuZHMgYW5kIHJldHVybmluZyB0aGUgY29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciB0aGF0IGFyZ3VtZW50LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igb3duaW5nIHRoZSBtZXRob2QgbWV0YWRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE1ldGhvZCBuYW1lIHdob3NlIHBhcmFtZXRlciBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBkZXNpcmVkIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gQ29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciB0aGUgcGFyYW1ldGVyIG9yIGB1bmRlZmluZWRgIGlmIG5vdCByZWNvcmRlZC5cbiAgICovXG4gIHN0YXRpYyBwYXJhbTxNPihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvcDogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcyhtb2RlbCwgcHJvcCk7XG4gICAgaWYgKCFwYXJhbXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGluZGV4ID4gcGFyYW1zLmxlbmd0aCAtIDEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQYXJhbWV0ZXIgaW5kZXggJHtpbmRleH0gb3V0IG9mIHJhbmdlIGZvciAke1N0cmluZyhwcm9wKX1gXG4gICAgICApO1xuICAgIHJldHVybiBwYXJhbXNbaW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHJlY29yZGVkIHJldHVybiB0eXBlIGZvciBhIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIG1ldGFkYXRhIGVudHJ5IHVuZGVyIGBtZXRob2RzLjxwcm9wPi5kZXNpZ246cmV0dXJudHlwZWAgdG8gcmV0dXJuIHRoZSByZXR1cm4gdHlwZSBmb3IgdGhlIGdpdmVuIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHdob3NlIG1ldGhvZCBtZXRhZGF0YSBzaG91bGQgYmUgaW5zcGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBNZXRob2QgbmFtZSB3aG9zZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gQ29uc3RydWN0b3IgcmVmZXJlbmNlIGZvciB0aGUgcmV0dXJuIHR5cGUgb3IgYHVuZGVmaW5lZGAgd2hlbiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIHJldHVybjxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4sIHByb3A6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KFxuICAgICAgbW9kZWwsXG4gICAgICBbRGVjb3JhdGlvbktleXMuTUVUSE9EUywgcHJvcCwgRGVjb3JhdGlvbktleXMuREVTSUdOX1JFVFVSTl0uam9pbihcbiAgICAgICAgdGhpcy5zcGxpdHRlclxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgcmVjb3JkZWQgZGVzaWduIHR5cGUgZm9yIGEgcHJvcGVydHkuXG4gICAqIEBzdW1tYXJ5IFJlYWRzIHRoZSBtZXRhZGF0YSBlbnRyeSB1bmRlciBgcHJvcGVydGllcy48cHJvcD5gIHRvIHJldHVybiB0aGUgY29uc3RydWN0b3IgcmVjb3JkZWQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBtb2RlbCBUYXJnZXQgY29uc3RydWN0b3Igd2hvc2UgcHJvcGVydHkgbWV0YWRhdGEgc2hvdWxkIGJlIGluc3BlY3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgbmFtZSB3aG9zZSB0eXBlIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3J8dW5kZWZpbmVkfSBDb25zdHJ1Y3RvciByZWZlcmVuY2UgZm9yIHRoZSBwcm9wZXJ0eSB0eXBlIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBzdGF0aWMgdHlwZShtb2RlbDogQ29uc3RydWN0b3IsIHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldChcbiAgICAgIG1vZGVsLFxuICAgICAgW0RlY29yYXRpb25LZXlzLlBST1BFUlRJRVMsIHByb3BdLmpvaW4odGhpcy5zcGxpdHRlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB0aGUgY2Fub25pY2FsIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgbW9kZWwgaGFuZGxlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBzdG9yZWQgY29uc3RydWN0b3IgcmVmZXJlbmNlIHdoZW4gdGhlIHByb3ZpZGVkIG1vZGVsIGlzIGEgcHJveHkgb3IgcmVkdWNlZCB2YWx1ZS4gRmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgbW9kZWwgd2hlbiBubyBjb25zdHJ1Y3RvciBtZXRhZGF0YSBoYXMgYmVlbiByZWNvcmRlZCB5ZXQuXG4gICAqIEB0ZW1wbGF0ZSBNXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIE1vZGVsIHVzZWQgd2hlbiByZWNvcmRpbmcgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPE0+fHVuZGVmaW5lZH0gQ2Fub25pY2FsIGNvbnN0cnVjdG9yIGlmIHN0b3JlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgc3RhdGljIGNvbnN0cjxNPihtb2RlbDogQ29uc3RydWN0b3I8TT4pIHtcbiAgICByZXR1cm4gbW9kZWxbRGVjb3JhdGlvbktleXMuQ09OU1RSVUNUT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSBhc1xuICAgICAgfCBDb25zdHJ1Y3RvcjxNPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBtb2RlbCBvciBhIHNwZWNpZmljIGtleSB3aXRoaW4gaXQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdHJ1Y3RvciBvbmx5LCByZXR1cm5zIHRoZSBlbnRpcmUgbWV0YWRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwuIFdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoYXQgbmVzdGVkIGtleS5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHRlbXBsYXRlIE1FVEFcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHVzZWQgdG8gbG9jYXRlIHRoZSBtZXRhZGF0YSByZWNvcmQuXG4gICAqIEByZXR1cm4ge01FVEF8dW5kZWZpbmVkfSBNZXRhZGF0YSBvYmplY3QsIHRoZSB2YWx1ZSBhdCB0aGUga2V5IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgZXhpc3RzLlxuICAgKi9cbiAgc3RhdGljIGdldDxNLCBNRVRBIGV4dGVuZHMgQmFzaWNNZXRhZGF0YTxNPiA9IEJhc2ljTWV0YWRhdGE8TT4+KFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPlxuICApOiBNRVRBIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBtb2RlbCBvciBhIHNwZWNpZmljIGtleSB3aXRoaW4gaXQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdHJ1Y3RvciBvbmx5LCByZXR1cm5zIHRoZSBlbnRpcmUgbWV0YWRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwuIFdoZW4gYSBrZXkgcGF0aCBpcyBwcm92aWRlZCwgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIGF0IHRoYXQgbmVzdGVkIGtleS5cbiAgICogQHRlbXBsYXRlIE1cbiAgICogQHRlbXBsYXRlIE1FVEFcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHVzZWQgdG8gbG9jYXRlIHRoZSBtZXRhZGF0YSByZWNvcmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTmVzdGVkIGtleSBwYXRoIHRvIGZldGNoIGEgc3BlY2lmaWMgdmFsdWUuXG4gICAqIEByZXR1cm4ge01FVEF8Knx1bmRlZmluZWR9IE1ldGFkYXRhIG9iamVjdCwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgcGF0aCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyBleGlzdHMuXG4gICAqL1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvciwga2V5OiBzdHJpbmcpOiBhbnk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIG1vZGVsIG9yIGEgc3BlY2lmaWMga2V5IHdpdGhpbiBpdC5cbiAgICogQHN1bW1hcnkgV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0cnVjdG9yIG9ubHksIHJldHVybnMgdGhlIGVudGlyZSBtZXRhZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4gV2hlbiBhIGtleSBwYXRoIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgYXQgdGhhdCBuZXN0ZWQga2V5LlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAdGVtcGxhdGUgTUVUQVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fHN0cmluZ30gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHVzZWQgdG8gbG9jYXRlIHRoZSBtZXRhZGF0YSByZWNvcmQgb3IgYSBwcmUtcmVzb2x2ZWQgc3ltYm9sIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBPcHRpb25hbCBuZXN0ZWQga2V5IHBhdGggdG8gZmV0Y2ggYSBzcGVjaWZpYyB2YWx1ZS5cbiAgICogQHJldHVybiB7TUVUQXwqfHVuZGVmaW5lZH0gTWV0YWRhdGEgb2JqZWN0LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIGV4aXN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yLCBrZXk/OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5ID09PSBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUikgcmV0dXJuIHRoaXMuY29uc3RyKG1vZGVsKTtcbiAgICBjb25zdCByZXNvbHZlZE1vZGVsID0gdGhpcy5jb25zdHIobW9kZWwpIHx8IG1vZGVsO1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ycyA9IHRoaXMuY29sbGVjdENvbnN0cnVjdG9yQ2hhaW4ocmVzb2x2ZWRNb2RlbCk7XG4gICAgaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrU3ltYm9sID0gU3ltYm9sLmZvcihyZXNvbHZlZE1vZGVsLnRvU3RyaW5nKCkpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5uZXJHZXQoZmFsbGJhY2tTeW1ib2wsIGtleSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3RlZFZhbHVlcyA9IGNvbnN0cnVjdG9yc1xuICAgICAgLm1hcCgoY3RvcikgPT4gdGhpcy5pbm5lckdldChTeW1ib2wuZm9yKGN0b3IudG9TdHJpbmcoKSksIGtleSkpXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoY29sbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLm1lcmdlTWV0YWRhdGFDaGFpbihjb2xsZWN0ZWRWYWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbWV0YWRhdGEgc3RvcmVkIHVuZGVyIGEgc3ltYm9sIGtleS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgaGVscGVyIHRoYXQgcmVzb2x2ZXMgYW5kIG9wdGlvbmFsbHkgZHJpbGxzIGludG8gdGhlIGluLW1lbW9yeSBtZXRhZGF0YSBtYXAgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIGtleSBwYXRoLlxuICAgKiBAcGFyYW0ge3N5bWJvbH0gc3ltYm9sIFN5bWJvbCByZXByZXNlbnRpbmcgdGhlIG1ldGFkYXRhIGJ1Y2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBba2V5XSBPcHRpb25hbCBuZXN0ZWQga2V5IHJlZmVyZW5jaW5nIGEgc3BlY2lmaWMgbWV0YWRhdGEgZW50cnkuXG4gICAqIEByZXR1cm4ge2FueX0gU3RvcmVkIG1ldGFkYXRhIG9iamVjdCBvciB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGtleSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lckdldChzeW1ib2w6IHN5bWJvbCwga2V5Pzogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgaWYgKCF0aGlzLl9tZXRhZGF0YVtzeW1ib2xdKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICgha2V5KSByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGFbc3ltYm9sXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgdGhlIGluaGVyaXRhbmNlIGNoYWluIGZvciBhIGNvbnN0cnVjdG9yLCBvcmRlcmVkIGZyb20gYmFzZSB0byBtb3N0LXNwZWNpZmljIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBXYWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yIHVudGlsIHJlYWNoaW5nIEZ1bmN0aW9uL09iamVjdCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGVkIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gbW9kZWwgQ29uc3RydWN0b3Igd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGNvbGxlY3RlZC5cbiAgICogQHJldHVybiB7Q29uc3RydWN0b3JbXX0gQXJyYXkgb2YgY29uc3RydWN0b3JzIG9yZGVyZWQgZnJvbSBiYXNlIHRvIGxlYWYuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjb2xsZWN0Q29uc3RydWN0b3JDaGFpbihtb2RlbDogQ29uc3RydWN0b3IpOiBDb25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCBjaGFpbjogQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcblxuICAgIHdoaWxlICh0eXBlb2YgY3VycmVudCA9PT0gXCJmdW5jdGlvblwiICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgICBjaGFpbi5wdXNoKGN1cnJlbnQgYXMgQ29uc3RydWN0b3IpO1xuICAgICAgY29uc3QgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBGdW5jdGlvbiB8fCBwYXJlbnQgPT09IE9iamVjdCkgYnJlYWs7XG4gICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjaGFpbi5yZXZlcnNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1lcmdlcyBtZXRhZGF0YSB2YWx1ZXMgY29sbGVjdGVkIGFjcm9zcyB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBmb3IgcGxhaW4gb2JqZWN0cyB3aGlsZSBsZXR0aW5nIG5vbi1vYmplY3QgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcyB0byBwcmVzZXJ2ZSBjaGlsZCBtZXRhZGF0YSBwcmVjZWRlbmNlLlxuICAgKiBAcGFyYW0ge2FueVtdfSB2YWx1ZXMgTWV0YWRhdGEgdmFsdWVzIGdhdGhlcmVkIGZyb20gYmFzZSB0byBjaGlsZC5cbiAgICogQHJldHVybiB7YW55fSBBZ2dyZWdhdGVkIG1ldGFkYXRhIHZhbHVlIHJlc3BlY3RpbmcgaW5oZXJpdGFuY2UgcHJlY2VkZW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1lcmdlTWV0YWRhdGFDaGFpbih2YWx1ZXM6IGFueVtdKSB7XG4gICAgbGV0IGFjYzogYW55ID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSB0aGlzLmNsb25lTWV0YWRhdGFWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFjYykgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBhY2MgPSB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgIGFjYyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFjYyA9IHRoaXMuY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9kdWNlcyBhIGRlZXAgY2xvbmUgb2YgYSBtZXRhZGF0YSB2YWx1ZSB3aGVuIG5lY2Vzc2FyeS5cbiAgICogQHN1bW1hcnkgQXJyYXlzIGFyZSBzaGFsbG93LWNsb25lZCwgcGxhaW4gb2JqZWN0cyBhcmUgZGVlcC1jbG9uZWQsIGFuZCBwcmltaXRpdmUvZnVuY3Rpb24gdmFsdWVzIGFyZSByZXR1cm5lZCBhcy1pcy5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGNsb25lLlxuICAgKiBAcmV0dXJuIHthbnl9IENsb25lZCBtZXRhZGF0YSB2YWx1ZSBwcmV2ZW50aW5nIG11dGF0aW9uIG9mIHRoZSBiYWNraW5nIHN0b3JlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2xvbmVNZXRhZGF0YVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbLi4udmFsdWVdO1xuICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgcmV0dXJuIHRoaXMubWVyZ2VQbGFpbk9iamVjdHMoe30sIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVlcGx5IG1lcmdlcyB0d28gcGxhaW4gbWV0YWRhdGEgb2JqZWN0cy5cbiAgICogQHN1bW1hcnkgUmVjdXJzaXZlbHkgbWVyZ2VzIG5lc3RlZCBwbGFpbiBvYmplY3RzIHdoaWxlIGNsb25pbmcgYXJyYXlzOyB2YWx1ZXMgZnJvbSBgc291cmNlYCBvdmVycmlkZSB0aG9zZSBmcm9tIGB0YXJnZXRgIHdoZW4gY29uZmxpY3RzIG9jY3VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRhcmdldCBCYXNlIG9iamVjdCB0byBtZXJnZSBpbnRvLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHNvdXJjZSBPYmplY3QgcHJvdmlkaW5nIG92ZXJyaWRpbmcgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IE5ld2x5IG1lcmdlZCBtZXRhZGF0YSBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtZXJnZVBsYWluT2JqZWN0cyhcbiAgICB0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc291cmNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4udGFyZ2V0IH07XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSByZXN1bHRba2V5XTtcblxuICAgICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmlzUGxhaW5PYmplY3QodGFyZ2V0VmFsdWUpXG4gICAgICAgICAgPyB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKFxuICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiB0aGlzLm1lcmdlUGxhaW5PYmplY3RzKHt9LCBzb3VyY2VWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IFsuLi5zb3VyY2VWYWx1ZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IHN1aXRhYmxlIGZvciBkZWVwIG1lcmdpbmcuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgYXJyYXlzIGFuZCBudWxsIGFyZSBleGNsdWRlZCB3aGlsZSBhY2NlcHRpbmcgb2JqZWN0cyBjcmVhdGVkIHZpYSBsaXRlcmFsL2NsYXNzIHN5bnRheC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdyaXRlcyBtZXRhZGF0YSB1bmRlciBhIHN5bWJvbCBrZXkuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGhlbHBlciB0aGF0IGVuc3VyZXMgdGhlIG1ldGFkYXRhIGJ1Y2tldCBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBzeW1ib2wgYW5kIHBlcnNpc3RzIHRoZSBnaXZlbiB2YWx1ZSwgZHJpbGxpbmcgaW50byBuZXN0ZWQgc3RydWN0dXJlcyB3aGVuIHRoZSBrZXkgaXMgYSBzdHJpbmcgcGF0aC5cbiAgICogQHBhcmFtIHtzeW1ib2x9IHN5bWJvbCBTeW1ib2wgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBidWNrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5IE5lc3RlZCBrZXkgcGF0aCBvciBkaXJlY3Qgc3ltYm9sIHVuZGVyIHdoaWNoIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpbm5lclNldChzeW1ib2w6IHN5bWJvbCwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gc2V0VmFsdWVCeVNwbGl0dGVyKFxuICAgICAgICB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLnNwbGl0dGVyXG4gICAgICApO1xuICAgIHRoaXMuX21ldGFkYXRhW3N5bWJvbF1ba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXcml0ZXMgYSBtZXRhZGF0YSB2YWx1ZSBhdCBhIGdpdmVuIG5lc3RlZCBrZXkgcGF0aC5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGUgbWV0YWRhdGEgcmVjb3JkIGV4aXN0cyBmb3IgdGhlIGNvbnN0cnVjdG9yLCBtaXJyb3JzIGl0IG9uIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGVuYWJsZWQsIGFuZCBzZXRzIHRoZSBwcm92aWRlZCB2YWx1ZSBvbiB0aGUgbmVzdGVkIGtleSBwYXRoIHVzaW5nIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyLlxuICAgKiBAdGVtcGxhdGUgTVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fHN0cmluZ30gbW9kZWwgVGFyZ2V0IGNvbnN0cnVjdG9yIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBiZWxvbmdzIG9yIGEgZGlyZWN0IGlkZW50aWZpZXIgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IE5lc3RlZCBrZXkgcGF0aCBhdCB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBWYWx1ZSB0byBzdG9yZSBpbiB0aGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0KG1vZGVsOiBDb25zdHJ1Y3RvciB8IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBEZWNvcmF0aW9uS2V5cy5DT05TVFJVQ1RPUiwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIikgbW9kZWwgPSB0aGlzLmNvbnN0cihtb2RlbCkgfHwgbW9kZWw7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICB0aGlzLmlubmVyU2V0KHN5bWJvbCwga2V5LCB2YWx1ZSk7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiICYmXG4gICAgICBNZXRhZGF0YS5taXJyb3IgJiZcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHRoaXMuYmFzZUtleSlcbiAgICApIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgdGhpcy5iYXNlS2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcnkgYW5kIGl0cyB2ZXJzaW9uLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHZlcnNpb24gc3RyaW5nIGZvciBhbiBpbnRlZ3JhdGluZyBsaWJyYXJ5IHVuZGVyIHRoZSBzaGFyZWQgbGlicmFyaWVzIG1ldGFkYXRhIHN5bWJvbCwgcHJldmVudGluZyBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucyBmb3IgdGhlIHNhbWUgbGlicmFyeSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlicmFyeSBQYWNrYWdlIG5hbWUgb3IgaWRlbnRpZmllciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gU2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaWJyYXJ5LlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxpYnJhcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyTGlicmFyeShsaWJyYXJ5OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICBjb25zdCBsaWIgPSB0aGlzLmlubmVyR2V0KHN5bWJvbCwgbGlicmFyeSk7XG4gICAgaWYgKGxpYilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExpYnJhcnkgYWxyZWFkeSAke2xpYnJhcnl9IHJlZ2lzdGVyZWQgd2l0aCB2ZXJzaW9uICR7dmVyc2lvbn1gXG4gICAgICApO1xuICAgIHRoaXMuaW5uZXJTZXQoc3ltYm9sLCBsaWJyYXJ5LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlzdHMgcmVnaXN0ZXJlZCBkZWNvcmF0aW9uLWF3YXJlIGxpYnJhcmllcy5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgaW4tbWVtb3J5IG1hcCBvZiBsaWJyYXJ5IGlkZW50aWZpZXJzIHRvIHNlbWFudGljIHZlcnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRGVjb3JhdGlvbiBtZXRhZGF0YSBzdG9yZS5cbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gTWFwIG9mIHJlZ2lzdGVyZWQgbGlicmFyeSBpZGVudGlmaWVycyB0byB0aGVpciB2ZXJzaW9uIHN0cmluZ3MuXG4gICAqL1xuICBzdGF0aWMgbGlicmFyaWVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoRGVjb3JhdGlvbktleXMuTElCUkFSSUVTKTtcbiAgICByZXR1cm4gdGhpcy5pbm5lckdldChzeW1ib2wpIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBKb2lucyBwYXRoIHNlZ21lbnRzIHVzaW5nIHRoZSBjdXJyZW50IHNwbGl0dGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgbmVzdGVkIG1ldGFkYXRhIGtleSBieSBjb25jYXRlbmF0aW5nIHN0cmluZyBzZWdtZW50cyB3aXRoIHRoZSBjb25maWd1cmVkIHNwbGl0dGVyIGZvciB1c2Ugd2l0aCB0aGUgbWV0YWRhdGEgc3RvcmUuXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBzdHJzIEtleSBzZWdtZW50cyB0byBqb2luIGludG8gYSBmdWxsIG1ldGFkYXRhIHBhdGguXG4gICAqIEByZXR1cm4ge3N0cmluZ30gU3BsaXR0ZXItam9pbmVkIG1ldGFkYXRhIGtleS5cbiAgICovXG4gIHN0YXRpYyBrZXkoLi4uc3Ryczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gc3Rycy5qb2luKHRoaXMuc3BsaXR0ZXIpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgcmVzb2x2ZXIgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IGRlZmF1bHQgZmxhdm91ci5cbiAqIEBzdW1tYXJ5IFJlc29sdmVzIHRoZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldCBieSBhbHdheXMgcmV0dXJuaW5nIHRoZSBsaWJyYXJ5J3MgYERlZmF1bHRGbGF2b3VyYCB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCBiZWluZyBkZWNvcmF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFJlc29sdmVkIGZsYXZvdXIgaWRlbnRpZmllci5cbiAqIEBmdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHR5cGUgY292ZXJpbmcgc3VwcG9ydGVkIGRlY29yYXRvciBraW5kcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IG9mIHRoZSBzdGFuZGFyZCBUeXBlU2NyaXB0IGRlY29yYXRvciBzaWduYXR1cmVzIChjbGFzcywgcHJvcGVydHksIG9yIG1ldGhvZCksIGVuYWJsaW5nIGZsZXhpYmxlIHJlZ2lzdHJhdGlvbiBhbmQgYXBwbGljYXRpb24gd2l0aGluIHRoZSBEZWNvcmF0aW9uIHN5c3RlbS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JUeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIERlY29yYXRvclR5cGVzID1cbiAgfCBDbGFzc0RlY29yYXRvclxuICB8IFByb3BlcnR5RGVjb3JhdG9yXG4gIHwgTWV0aG9kRGVjb3JhdG9yO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIGEgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyYml0cmFyeSBhcmd1bWVudHMgYW5kIHJldHVybnMgYSBjb25jcmV0ZSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYmUgYXBwbGllZCB0byBhIHRhcmdldC5cbiAqIEB0ZW1wbGF0ZSBBXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRmFjdG9yeSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gRGVjb3JhdG9yVHlwZXM7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFyZ3VtZW50IGJ1bmRsZSBmb3IgYSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBzdW1tYXJ5IE9iamVjdCBmb3JtIHVzZWQgdG8gZGVmZXIgZGVjb3JhdG9yIGNyZWF0aW9uLCBjYXJyeWluZyBib3RoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBpdHMgYXJndW1lbnQgbGlzdCB0byBiZSBpbnZva2VkIGxhdGVyIGR1cmluZyBhcHBsaWNhdGlvbi5cbiAqIEB0eXBlRGVmIERlY29yYXRvckZhY3RvcnlBcmdzXG4gKiBAcHJvcGVydHkge0RlY29yYXRvckZhY3Rvcnl9IGRlY29yYXRvciBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBkZWNvcmF0b3Igd2hlbiBpbnZva2VkLlxuICogQHByb3BlcnR5IHthbnlbXX0gYXJncyBMaXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBkZWNvcmF0b3IgZmFjdG9yeS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdGlvblxuICovXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JGYWN0b3J5QXJncyA9IHtcbiAgZGVjb3JhdG9yOiBEZWNvcmF0b3JGYWN0b3J5O1xuICBhcmdzOiBhbnlbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaW9uIHRoYXQgcmVwcmVzZW50cyBlaXRoZXIgYSByZWFkeS10by1hcHBseSBkZWNvcmF0b3Igb3IgYSBmYWN0b3J5IHdpdGggYXJndW1lbnRzLlxuICogQHN1bW1hcnkgQWxsb3dzIHJlZ2lzdGVyaW5nIGRlY29yYXRvcnMgaW4gdHdvIGZvcm1zOiBhcyBkaXJlY3QgZGVjb3JhdG9yIGZ1bmN0aW9ucyBvciBhcyBkZWZlcnJlZCBmYWN0b3JpZXMgcGFpcmVkIHdpdGggdGhlaXIgYXJndW1lbnQgbGlzdHMgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24uXG4gKiBAdHlwZURlZiBEZWNvcmF0b3JEYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgRGVjb3JhdG9yRGF0YSA9IERlY29yYXRvclR5cGVzIHwgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9ycy5cbiAqIEBzdW1tYXJ5IFRoZSBEZWNvcmF0aW9uIGNsYXNzIHByb3ZpZGVzIGEgYnVpbGRlciBwYXR0ZXJuIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3Vycy4gSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbiwgYWxsb3dpbmcgZnJhbWV3b3JrLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cj1EZWZhdWx0Rmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dC5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pc2VkIGJ5IGtleSBhbmQgZmxhdm91ci5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldC5cbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9ycy5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PERlY29yYXRvckRhdGE+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5LlxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGlzZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IElkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3IuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZGl0aXZlIGV4dHJhcy5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gcmVnaXN0ZXIgZm9yIHRoZSBjb25maWd1cmVkIGtleS5cbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKFxuICAgICAgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgJiZcbiAgICAgICFhZGRvbiAmJlxuICAgICAgdGhpcy5mbGF2b3VyICE9PSBEZWZhdWx0Rmxhdm91clxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNdXN0IHByb3ZpZGUgb3ZlcnJpZGVzIG9yIGFkZG9ucyB0byBvdmVycmlkZSBvciBleHRlbmQgZGVjYWYncyBkZWNvcmF0b3JzXCJcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuZmxhdm91ciA9PT0gRGVmYXVsdEZsYXZvdXIgJiYgYWRkb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IGZsYXZvdXIgY2Fubm90IGJlIGV4dGVuZGVkXCIpO1xuXG4gICAgdGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gPSBuZXcgU2V0KFtcbiAgICAgIC4uLih0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSB8fCBuZXcgU2V0KCkpLnZhbHVlcygpLFxuICAgICAgLi4uZGVjb3JhdG9ycyxcbiAgICBdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIHRoZSBiYXNlIGRlY29yYXRvcnMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIERlY29yYXRvcnMgdG8gZGVmaW5lLlxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckVuZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgZmluaXNoaW5nIHRoZSBjaGFpbiAoYWxzbyBpbXBsZW1lbnRzIERlY29yYXRpb25CdWlsZGVyQnVpbGQpLlxuICAgKi9cbiAgZGVmaW5lKFxuICAgIC4uLmRlY29yYXRvcnM6IERlY29yYXRvckRhdGFbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4gdHlwZW9mIGQgPT09IFwib2JqZWN0XCIpICYmXG4gICAgICBkZWNvcmF0b3JzLmxlbmd0aCAhPT0gMVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9ycy5cbiAgICogQHN1bW1hcnkgQWRkcyBhZGRpdGlvbmFsIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgICogQHBhcmFtIHsuLi5EZWNvcmF0b3JEYXRhfSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byByZWdpc3RlciBhcyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3IuXG4gICAqL1xuICBleHRlbmQoLi4uZGVjb3JhdG9yczogRGVjb3JhdG9yRGF0YVtdKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIikgJiZcbiAgICAgIGRlY29yYXRvcnMubGVuZ3RoICE9PSAxXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2hlbiBleHRlbmRpbmcgdXNpbmcgYW4gb3ZlcnJpZGFibGUgZGVjb3JhdG9yLCBvbmx5IG9uZSBpcyBhbGxvd2VkYFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBjb250ZXh0LWF3YXJlIGRlY29yYXRvciBmb3IgYSBrZXkvZmxhdm91ci5cbiAgICogQHN1bW1hcnkgUHJvZHVjZXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gYm91bmQgdG8gdGhlIHByb3ZpZGVkIGtleSBhbmQgZmxhdm91ci4gVGhlIHJlc3VsdGluZyBkZWNvcmF0b3IgcmVzb2x2ZXMgdGhlIGFjdHVhbCBkZWNvcmF0b3JzIHRvIGFwcGx5IGF0IGludm9jYXRpb24gdGltZSBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgcmVzb2x2ZWQgZmxhdm91ciBhbmQgdGhlIHJlZ2lzdGVyZWQgYmFzZSBhbmQgZXh0cmEgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0aW9uIGtleSB1c2VkIHRvIGxvb2sgdXAgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Y9RGVmYXVsdEZsYXZvdXJdIEV4cGxpY2l0IGZsYXZvdXIgdG8gYmluZCB0aGUgZmFjdG9yeSB0by5cbiAgICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyB0aGUgcmVzb2x2ZWQgZGVjb3JhdG9ycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAgICogICBwYXJ0aWNpcGFudCBCIGFzIERlY29yYXRpb24gKGJ1aWxkZXIpXG4gICAqICAgcGFydGljaXBhbnQgRiBhcyBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZilcbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIGZsYXZvdXJSZXNvbHZlclxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQXBwbGllZCBEZWNvcmF0b3JzXG4gICAqICAgVS0+PkI6IGRlZmluZSgpL2V4dGVuZCgpIGFuZCBhcHBseSgpXG4gICAqICAgQi0+PkY6IGNyZWF0ZSBjb250ZXh0IGRlY29yYXRvclxuICAgKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAgICogICBSLS0+PkY6IGZsYXZvdXJcbiAgICogICBGLT4+QTogY29sbGVjdCBiYXNlICsgZXh0cmFzXG4gICAqICAgbG9vcCBlYWNoIGRlY29yYXRvclxuICAgKiAgICAgQS0+PlU6IGludm9rZSBkZWNvcmF0b3IodGFyZ2V0LCBrZXk/LCBkZXNjPylcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGZ1bmN0aW9uIGNvbnRleHREZWNvcmF0b3IoXG4gICAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgICApIHtcbiAgICAgIGNvbnN0IGZsYXZvdXIgPSBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlcih0YXJnZXQpO1xuICAgICAgY29uc3QgY2FjaGUgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gY2FjaGVbZmxhdm91cl1cbiAgICAgICAgPyBjYWNoZVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBjYWNoZVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhY2hlICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdICYmXG4gICAgICAgIGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnMgJiZcbiAgICAgICAgY2FjaGVbZmxhdm91cl0uZGVjb3JhdG9ycy5zaXplXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IGNhY2hlW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gY2FjaGVbRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvckFyZ3MgPSBbXG4gICAgICAgIC4uLihjYWNoZVtEZWZhdWx0Rmxhdm91cl0gYXMgYW55KS5kZWNvcmF0b3JzLnZhbHVlcygpLFxuICAgICAgXS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8bnVtYmVyLCBhbnk+LCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlLmFyZ3MpIGFjY3VtW2ldID0gZS5hcmdzO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGNvbnN0IHRvQXBwbHkgPSBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiB0b0FwcGx5LnJlZHVjZShcbiAgICAgICAgKF8sIGQpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkKSB7XG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBkZWNvcmF0b3IgfSA9IGQgYXMgRGVjb3JhdG9yRmFjdG9yeUFyZ3M7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3IoLi4uKE9iamVjdC52YWx1ZXMoZGVjb3JhdG9yQXJncylbMF0gfHwgW10pKSBhcyBhbnlcbiAgICAgICAgICAgICAgKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICByZXR1cm4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkZWNvcmF0b3IgdHlwZTogJHt0eXBlb2YgZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHsgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvciB9XG4gICAgICApO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dERlY29yYXRvciwgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBbZiwga2V5XS5qb2luKFwiX2RlY29yYXRvcl9mb3JfXCIpLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZXh0RGVjb3JhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHRoZSBmaW5hbCBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyBhbmQgcmV0dXJucyB0aGUgZGVjb3JhdG9yIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge0NsYXNzRGVjb3JhdG9yfE1ldGhvZERlY29yYXRvcnxQcm9wZXJ0eURlY29yYXRvcnxQYXJhbWV0ZXJEZWNvcmF0b3J9IEdlbmVyYXRlZCBkZWNvcmF0b3IgZnVuY3Rpb24gcmVhZHkgZm9yIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgYXBwbHkoKTogKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICkgPT4gYW55IHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIERlY29yYXRpb24ucmVnaXN0ZXIoXG4gICAgICB0aGlzLmtleSxcbiAgICAgIHRoaXMuZmxhdm91cixcbiAgICAgIHRoaXMuZGVjb3JhdG9ycyB8fCBuZXcgU2V0KCksXG4gICAgICB0aGlzLmV4dHJhc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gc3RvcmUgZGVjb3JhdG9ycyBpbiB0aGUgc3RhdGljIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRvciBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyLlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2RlY29yYXRvcnNdIFByaW1hcnkgZGVjb3JhdG9ycyByZWdpc3RlcmVkIGZvciB0aGUga2V5LlxuICAgKiBAcGFyYW0ge1NldDxEZWNvcmF0b3JEYXRhPn0gW2V4dHJhc10gQWRkaXRpb25hbCBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgYXMgZmxhdm91ci1zcGVjaWZpYyBhZGRvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgZGVjb3JhdG9ycz86IFNldDxEZWNvcmF0b3JEYXRhPixcbiAgICBleHRyYXM/OiBTZXQ8RGVjb3JhdG9yRGF0YT5cbiAgKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGtleSBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICB9XG4gICAgaWYgKCFkZWNvcmF0b3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGVjb3JhdG9ycyBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBmbGF2b3VyIHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuXG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSkgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gPSB7fTtcbiAgICBpZiAoIURlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdKVxuICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gPSB7fTtcbiAgICBpZiAoZGVjb3JhdG9ycykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9ycyA9IGRlY29yYXRvcnM7XG4gICAgaWYgKGV4dHJhcykgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzID0gZXh0cmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBnbG9iYWwgZmxhdm91ciByZXNvbHZlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzLlxuICAgKiBAcGFyYW0ge0ZsYXZvdXJSZXNvbHZlcn0gcmVzb2x2ZXIgRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3Vycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRGbGF2b3VyUmVzb2x2ZXIocmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlcikge1xuICAgIERlY29yYXRpb24uZmxhdm91clJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIHN0YXRpYyBlbnRyeSB0byBzdGFydCBhIGRlY29yYXRpb24gYnVpbGRlci5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBEZWNvcmF0aW9uIGluc3RhbmNlIGFuZCBpbml0aWF0ZXMgdGhlIGJ1aWxkZXIgY2hhaW4gd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IERlY29yYXRpb24ga2V5IHRvIGNvbmZpZ3VyZS5cbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIGEgYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBmbGF2b3VyLlxuICAgKiBAc3VtbWFyeSBDb252ZW5pZW5jZSBtZXRob2QgdG8gYmVnaW4gYSBEZWNvcmF0aW9uIGJ1aWxkZXIgY2hhaW4gYm91bmQgdG8gdGhlIGdpdmVuIGZsYXZvdXIgaWRlbnRpZmllciwgYWxsb3dpbmcgcmVnaXN0cmF0aW9uIG9mIGZsYXZvdXItc3BlY2lmaWMgZGVjb3JhdG9ycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgRmxhdm91ciBuYW1lIHRvIGJpbmQgdG8gdGhlIGJ1aWxkZXIuXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyU3RhcnR9IEJ1aWxkZXIgc3RhcnQgaW50ZXJmYWNlIHRvIGNvbnRpbnVlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgZmxhdm91cmVkQXMoZmxhdm91cjogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCIuL21ldGFkYXRhL01ldGFkYXRhXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBc3NpZ25zIGFyYml0cmFyeSBtZXRhZGF0YSB0byBhIHRhcmdldCB1c2luZyBhIHN0cmluZyBrZXkuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHN0b3JlcyBhIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjZW50cmFsIG1ldGFkYXRhIHN0b3JlIGZvciB0aGUgcHJvdmlkZWQgY2xhc3Mgb3IgbWVtYmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXRhZGF0YSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBzdG9yZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfFBhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgd3JpdGVzIHRoZSBtZXRhZGF0YSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gbWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWV0YWRhdGEoXG4gICAgbW9kZWw6IGFueSxcblxuICAgIHByb3A/OiBhbnksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgfCBudW1iZXJcbiAgKSB7XG4gICAgTWV0YWRhdGEuc2V0KHByb3AgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2FwdHVyZXMgYW5kIHN0b3JlcyBhIHByb3BlcnR5J3MgZGVzaWduIHR5cGUuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHJlYWRzIHRoZSByZWZsZWN0ZWQgYGRlc2lnbjp0eXBlYCBmb3IgYSBwcm9wZXJ0eSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtZXRhZGF0YSBzdG9yZSB1bmRlciB0aGUgcHJvcGVydGllcyBtYXAuXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHdoZW4gYXBwbGllZC5cbiAqIEBmdW5jdGlvbiBwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByb3AobW9kZWw6IG9iamVjdCwgcHJvcDogYW55KSB7XG4gICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fVFlQRSxcbiAgICAgIG1vZGVsLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgcmV0dXJuIG1ldGFkYXRhKE1ldGFkYXRhLmtleShEZWNvcmF0aW9uS2V5cy5QUk9QRVJUSUVTLCBwcm9wKSwgZGVzaWduVHlwZSkoXG4gICAgICBtb2RlbCxcbiAgICAgIHByb3BcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYXB0dXJlcyBhIHNpbmdsZSBwYXJhbWV0ZXIgdHlwZSBmb3IgdGhlIGRlY29yYXRlZCBtZXRob2QuXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGVuc3VyZXMgdGhlIG1ldGhvZCBtZXRhZGF0YSBpcyBpbml0aWFsaXNlZCBhbmQgc3RvcmVzIHRoZSByZWZsZWN0ZWQgcGFyYW1ldGVyIGNvbnN0cnVjdG9yIGF0IHRoZSBwcm92aWRlZCBpbmRleC5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcmVjb3JkcyB0aGUgcGFyYW1ldGVyIHR5cGUgd2hlbiBhcHBsaWVkLlxuICogQGZ1bmN0aW9uIHBhcmFtXG4gKiBAY2F0ZWdvcnkgUGFyYW1ldGVyIERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAqICAgcGFydGljaXBhbnQgUCBhcyBwYXJhbSgpXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTWV0YWRhdGFcbiAqICAgVS0+PlA6IHBhcmFtKCkodGFyZ2V0LCBrZXksIGluZGV4KVxuICogICBQLT4+VTogbWV0aG9kKCkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpXG4gKiAgIFAtPj5NOiBwYXJhbXMoY29uc3RydWN0b3IsIGtleSlcbiAqICAgTS0tPj5QOiBwYXJhbWV0ZXIgY29uc3RydWN0b3JzW11cbiAqICAgUC0+Pk06IHNldChtZXRob2RzLmtleS5pbmRleCwgY29uc3RydWN0b3IpXG4gKiAgIFAtLT4+VTogcGFyYW1ldGVyIHJlY29yZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJhbSgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHBhcmFtKFxuICAgIG1vZGVsOiBvYmplY3QsXG4gICAgcHJvcDogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgaWYgKCFwcm9wKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQHBhcmFtIGRlY29yYXRvciBjYW4gb25seSBiZSBhcHBsaWVkIHRvIG1ldGhvZHNgKTtcbiAgICBtZXRob2QoKShtb2RlbCwgcHJvcCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtb2RlbCwgcHJvcCkpO1xuICAgIGNvbnN0IHBhcmFtVHBlcyA9IE1ldGFkYXRhLnBhcmFtcyhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnksIHByb3AgYXMgc3RyaW5nKTtcbiAgICBpZiAoIXBhcmFtVHBlcylcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwYXJhbWV0ZXIgdHlwZXMgZm9yICR7U3RyaW5nKHByb3ApfWApO1xuICAgIGlmIChpbmRleCA+PSBwYXJhbVRwZXMubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGFyYW1ldGVyIGluZGV4ICR7aW5kZXh9IG91dCBvZiByYW5nZSBmb3IgJHtTdHJpbmcocHJvcCl9YFxuICAgICAgKTtcbiAgICBtZXRhZGF0YShcbiAgICAgIE1ldGFkYXRhLmtleShEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wIGFzIHN0cmluZywgaW5kZXgudG9TdHJpbmcoKSksXG4gICAgICBwYXJhbVRwZXNbaW5kZXhdXG4gICAgKShtb2RlbCwgcHJvcCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgdGhlIGRlZmF1bHQgYHBhcmFtKClgIGRlY29yYXRvciBhbmQgYXVnbWVudHMgdGhlIHN0b3JlZCBtZXRhZGF0YSB3aXRoIGFuIGFyYml0cmFyeSBrZXkvdmFsdWUgcGFpci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWV0YWRhdGEga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgTWV0YWRhdGEgdmFsdWUgcGVyc2lzdGVkIHVuZGVyIHRoZSBnaXZlbiBrZXkuXG4gKiBAcmV0dXJuIHtQYXJhbWV0ZXJEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHJlY29yZHMgYm90aCB0aGUgcGFyYW1ldGVyIGRlc2lnbiB0eXBlIGFuZCBhZGRpdGlvbmFsIG1ldGFkYXRhLlxuICogQGZ1bmN0aW9uIHBhcmFtTWV0YWRhdGFcbiAqIEBjYXRlZ29yeSBQYXJhbWV0ZXIgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyYW1NZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYW1NZXRhZGF0YSh0YXJnZXQ6IGFueSwgcHJvcDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcGFyYW0oKSxcbiAgICAgIG1ldGFkYXRhKE1ldGFkYXRhLmtleShEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLCBwcm9wLCBrZXkpLCB2YWx1ZSlcbiAgICApKHRhcmdldCwgcHJvcCwgaW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWNvcmRzIG1ldGhvZCBkZXNpZ24tdGltZSBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IERlY29yYXRvciBmYWN0b3J5IHRoYXQgY2FwdHVyZXMgYSBtZXRob2QncyByZWZsZWN0ZWQgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZXMsIHN0b3JpbmcgdGhlbSB1bmRlciB0aGUgYXBwcm9wcmlhdGUgbWV0YWRhdGEga2V5cyBzbyB0aGV5IGNhbiBiZSBpbnNwZWN0ZWQgYXQgcnVudGltZS5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gRGVjb3JhdG9yIHRoYXQgcGVyc2lzdHMgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBtZXRhZGF0YSBzdG9yZSB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gbWV0aG9kXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlciBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgbWV0aG9kKClcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNZXRhZGF0YVxuICogICBVLT4+RjogbWV0aG9kKCkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpXG4gKiAgIEYtPj5VOiBSZWZsZWN0LmdldE93bk1ldGFkYXRhKGRlc2lnbjpwYXJhbXR5cGVzKVxuICogICBGLT4+VTogUmVmbGVjdC5nZXRPd25NZXRhZGF0YShkZXNpZ246cmV0dXJudHlwZSlcbiAqICAgRi0+Pk06IHNldChtZXRob2RzLmtleS5kZXNpZ246cGFyYW10eXBlcywgcGFyYW1zKVxuICogICBGLT4+TTogc2V0KG1ldGhvZHMua2V5LmRlc2lnbjpyZXR1cm50eXBlLCByZXR1cm5UeXBlKVxuICogICBGLS0+PlU6IGRlY29yYXRlZCBmdW5jdGlvblxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2QoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXRob2Qob2JqOiBhbnksIHByb3A/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpIHtcbiAgICBjb25zdCBkZXNpZ25QYXJhbXMgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1BBUkFNUyxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApO1xuICAgIGNvbnN0IGRlc2lnblJldHVybiA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXG4gICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUkVUVVJOLFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICk7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgbWV0YWRhdGEoXG4gICAgICAgIE1ldGFkYXRhLmtleShcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5NRVRIT0RTLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgRGVjb3JhdGlvbktleXMuREVTSUdOX1BBUkFNU1xuICAgICAgICApLFxuICAgICAgICBkZXNpZ25QYXJhbXNcbiAgICAgICksXG4gICAgICBtZXRhZGF0YShcbiAgICAgICAgTWV0YWRhdGEua2V5KFxuICAgICAgICAgIERlY29yYXRpb25LZXlzLk1FVEhPRFMsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgICBEZWNvcmF0aW9uS2V5cy5ERVNJR05fUkVUVVJOXG4gICAgICAgICksXG4gICAgICAgIGRlc2lnblJldHVyblxuICAgICAgKVxuICAgICkob2JqLCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBhcHBsaWVzIG11bHRpcGxlIGRlY29yYXRvcnMgdG8gYSBzaW5nbGUgdGFyZ2V0LlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIGNvbXBvc2l0ZSBkZWNvcmF0b3IgdGhhdCBhcHBsaWVzIG11bHRpcGxlIGRlY29yYXRvcnMgaW4gc2VxdWVuY2UsIGNvcnJlY3RseSBoYW5kbGluZyBjbGFzcywgbWV0aG9kLCBwcm9wZXJ0eSwgYW5kIHBhcmFtZXRlciBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtBcnJheTxDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yPn0gZGVjb3JhdG9ycyBDb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgdG8gYXBwbHkuXG4gKiBAcmV0dXJuIHtDbGFzc0RlY29yYXRvcnxNZXRob2REZWNvcmF0b3J8UHJvcGVydHlEZWNvcmF0b3J8UGFyYW1ldGVyRGVjb3JhdG9yfSBEZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGFsbCBwcm92aWRlZCBkZWNvcmF0b3JzIHRvIHRoZSB0YXJnZXQuXG4gKiBAZnVuY3Rpb24gYXBwbHlcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyIENvZGVcbiAqICAgcGFydGljaXBhbnQgQSBhcyBhcHBseSguLi5kZWNvcmF0b3JzKVxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRvclxuICogICBVLT4+QTogZ2V0IGRlY29yYXRvciguLi5kZWNvcmF0b3JzKVxuICogICBBLT4+VTogcmV0dXJucyAodGFyZ2V0LCBrZXk/LCBkZXNjPykgPT4gdm9pZFxuICogICBVLT4+QTogaW52b2tlIG9uIHRhcmdldFxuICogICBsb29wIGZvciBlYWNoIGRlY29yYXRvclxuICogICAgIEEtPj5EOiBpbnZva2UgYXBwcm9wcmlhdGUgZGVjb3JhdG9yIHR5cGVcbiAqICAgZW5kXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHkoXG4gIC4uLmRlY29yYXRvcnM6IEFycmF5PFxuICAgIENsYXNzRGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBQYXJhbWV0ZXJEZWNvcmF0b3JcbiAgPlxuKSB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmtub3duLFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3IgfCBudW1iZXJcbiAgKSA9PiB7XG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmICFkZXNjcmlwdG9yKSB7XG4gICAgICAgIChkZWNvcmF0b3IgYXMgQ2xhc3NEZWNvcmF0b3IpKHRhcmdldCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgKGRlY29yYXRvciBhcyBNZXRob2REZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvcikoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nIHwgc3ltYm9sLFxuICAgICAgICBkZXNjcmlwdG9yIGFzIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHByb3BlcnR5IG1ldGFkYXRhIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIGZhY3RvcnkgdGhhdCBjb21iaW5lcyBgbWV0YWRhdGEoa2V5LCB2YWx1ZSlgIGFuZCBgcHJvcCgpYCB0byBib3RoIHNldCBhbiBhcmJpdHJhcnkgbWV0YWRhdGEga2V5IGFuZCByZWNvcmQgdGhlIHByb3BlcnR5J3MgZGVzaWduIHR5cGUuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IE1ldGFkYXRhIGtleSB0byBzZXQgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSBNZXRhZGF0YSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUga2V5LlxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHNldHMgdGhlIG1ldGFkYXRhIGFuZCBjYXB0dXJlcyB0aGUgcHJvcGVydHkncyB0eXBlLlxuICogQGZ1bmN0aW9uIHByb3BNZXRhZGF0YVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BNZXRhZGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoa2V5LCB2YWx1ZSksIHByb3AoKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRob2QgbWV0YWRhdGEgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2UgZmFjdG9yeSB0aGF0IGNvbWJpbmVzIGBtZXRhZGF0YShrZXksIHZhbHVlKWAgYW5kIGBtZXRob2QoKWAgdG8gYm90aCBzZXQgYW4gYXJiaXRyYXJ5IG1ldGFkYXRhIGtleSBhbmQgcmVjb3JkIHRoZSBtZXRob2QncyBkZXNpZ24gcmV0dXJuIGFuZCBwYXJhbSB0eXBlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWV0YWRhdGEga2V5IHRvIHNldCBmb3IgdGhlIHByb3BlcnR5LlxuICogQHBhcmFtIHthbnl9IHZhbHVlIE1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBrZXkuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IERlY29yYXRvciB0aGF0IHNldHMgdGhlIG1ldGFkYXRhIGFuZCBjYXB0dXJlcyB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlIG1ldGFkYXRhLlxuICogQGZ1bmN0aW9uIG1ldGhvZE1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZE1ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBhcHBseShtZXRhZGF0YShrZXksIHZhbHVlKSwgbWV0aG9kKCkpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBdHRhY2hlcyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHRvIGEgY2xhc3Mgb3IgbWVtYmVyLlxuICogQHN1bW1hcnkgRGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBzdG9yZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGluIHRoZSBtZXRhZGF0YSBzdG9yZSB1bmRlciB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRpb24ga2V5IGZvciBhIGNsYXNzIG9yIGl0cyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjIERlc2NyaXB0aXZlIHRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGNsYXNzIG9yIHByb3BlcnR5LlxuICogQHJldHVybiB7Q2xhc3NEZWNvcmF0b3J8TWV0aG9kRGVjb3JhdG9yfFByb3BlcnR5RGVjb3JhdG9yfSBEZWNvcmF0b3IgdGhhdCByZWNvcmRzIHRoZSBkZXNjcmlwdGlvbiB3aGVuIGFwcGxpZWQuXG4gKiBAZnVuY3Rpb24gZGVzY3JpcHRpb25cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbihkZXNjOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlc2NyaXB0aW9uKG9yaWdpbmFsOiBhbnksIHByb3A/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEoXG4gICAgICBbXG4gICAgICAgIERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OLFxuICAgICAgICBwcm9wID8gcHJvcC50b1N0cmluZygpIDogRGVjb3JhdGlvbktleXMuQ0xBU1MsXG4gICAgICBdLmpvaW4oTWV0YWRhdGEuc3BsaXR0ZXIpLFxuICAgICAgZGVzY1xuICAgICkob3JpZ2luYWwsIHByb3AsIGRlc2NyaXB0b3IpO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUm9vdCBlbnRyeSBwb2ludCBmb3IgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFJlLWV4cG9ydHMgdGhlIGJ1aWxkZXIgQVBJLCBkZWNvcmF0b3IgaGVscGVycywgbWV0YWRhdGEgdXRpbGl0aWVzLCBhbmQgc2hhcmVkIGNvbnN0YW50cyBzbyBjb25zdW1lcnMgY2FuIGltcG9ydCB7QGxpbmsgRGVjb3JhdGlvbn0sIHtAbGluayBNZXRhZGF0YX0sIHtAbGluayBEZWNvcmF0aW9uS2V5c30sIGFuZCB7QGxpbmsgRGVmYXVsdEZsYXZvdXJ9IGZyb20gYSBzaW5nbGUgc3VyZmFjZS5cbiAqIEBtb2R1bGUgZGVjb3JhdGlvblxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIi4vbWV0YWRhdGEvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWV0YWRhdGFcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGRlY29yYXRpb24gcGFja2FnZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBzdHJpbmcgcmVnaXN0ZXJlZCB0aHJvdWdoIHtAbGluayBNZXRhZGF0YS5yZWdpc3RlckxpYnJhcnl9LlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCIsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUE7Ozs7OztBQU1HO0FBQ0ksTUFBTSxjQUFjLEdBQUc7QUFFOUI7Ozs7OztBQU1HO0FBQ0ks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
|