@decaf-ts/core 0.5.29 → 0.5.31
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/LICENSE.md +17 -13
- package/dist/core.cjs +9 -11
- package/dist/core.esm.cjs +9 -11
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/model/construction.js +4 -4
- package/lib/esm/query/MethodQueryBuilder.d.ts +7 -5
- package/lib/esm/query/MethodQueryBuilder.js +2 -6
- package/lib/esm/query/decorators.d.ts +1 -1
- package/lib/esm/query/decorators.js +1 -1
- package/lib/esm/query/utils.js +4 -2
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/model/construction.cjs +4 -4
- package/lib/query/MethodQueryBuilder.cjs +2 -6
- package/lib/query/MethodQueryBuilder.d.ts +7 -5
- package/lib/query/decorators.cjs +1 -1
- package/lib/query/decorators.d.ts +1 -1
- package/lib/query/utils.cjs +4 -2
- package/package.json +12 -5
package/dist/core.cjs
CHANGED
@@ -3067,9 +3067,9 @@
|
|
3067
3067
|
const innerRepo = repositoryFromTypeMetadata(model, key, this.adapter.alias);
|
3068
3068
|
let deleted;
|
3069
3069
|
if (!(propertyValue instanceof decoratorValidation.Model))
|
3070
|
-
deleted = await innerRepo.delete(model[key]
|
3070
|
+
deleted = await innerRepo.delete(model[key]);
|
3071
3071
|
else
|
3072
|
-
deleted = await innerRepo.delete(model[key][innerRepo.pk]
|
3072
|
+
deleted = await innerRepo.delete(model[key][innerRepo.pk]);
|
3073
3073
|
await cacheModelForPopulate(context, model, key, deleted[innerRepo.pk], deleted);
|
3074
3074
|
}
|
3075
3075
|
/**
|
@@ -3263,7 +3263,7 @@
|
|
3263
3263
|
: values),
|
3264
3264
|
]);
|
3265
3265
|
for (const id of uniqueValues.values()) {
|
3266
|
-
const deleted = await repo.delete(id
|
3266
|
+
const deleted = await repo.delete(id);
|
3267
3267
|
await cacheModelForPopulate(context, model, key, id, deleted);
|
3268
3268
|
}
|
3269
3269
|
model[key] = [...uniqueValues];
|
@@ -4384,7 +4384,9 @@
|
|
4384
4384
|
LessThanEqual: (f, v) => Condition.attribute(f).lte(v),
|
4385
4385
|
GreaterThan: (f, v) => Condition.attribute(f).gt(v),
|
4386
4386
|
GreaterThanEqual: (f, v) => Condition.attribute(f).gte(v),
|
4387
|
-
Between: (f, v1, v2) => Condition.attribute(f)
|
4387
|
+
Between: (f, v1, v2) => Condition.attribute(f)
|
4388
|
+
.gte(v1)
|
4389
|
+
.and(Condition.attribute(f).lte(v2)),
|
4388
4390
|
In: (f, v) => Condition.attribute(f).in(v),
|
4389
4391
|
Matches: (f, v) => Condition.attribute(f).regexp(v),
|
4390
4392
|
};
|
@@ -4637,11 +4639,7 @@
|
|
4637
4639
|
* @param core {string} - The extracted core string from the method name.
|
4638
4640
|
* @param values {any[]} - The values corresponding to method arguments, including conditions and extras.
|
4639
4641
|
*
|
4640
|
-
* @return {
|
4641
|
-
* orderBy?: OrderBySelector<any>[];
|
4642
|
-
* limit?: number;
|
4643
|
-
* offset?: number;
|
4644
|
-
* }} An object containing orderBy, limit, and offset values if present.
|
4642
|
+
* @return {OrderLimitOffsetExtract} An object containing orderBy, limit, and offset values if present.
|
4645
4643
|
*/
|
4646
4644
|
static extractOrderLimitOffset(core, values) {
|
4647
4645
|
const conditionCount = core.split(/And|Or/).length;
|
@@ -5659,7 +5657,7 @@
|
|
5659
5657
|
* @const VERSION
|
5660
5658
|
* @memberOf module:core
|
5661
5659
|
*/
|
5662
|
-
const VERSION = "0.5.
|
5660
|
+
const VERSION = "0.5.30";
|
5663
5661
|
|
5664
5662
|
exports.Adapter = Adapter;
|
5665
5663
|
exports.AuthorizationError = AuthorizationError;
|
@@ -5724,4 +5722,4 @@
|
|
5724
5722
|
exports.uses = uses;
|
5725
5723
|
|
5726
5724
|
}));
|
5727
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9wZXJzaXN0ZW5jZS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9lcnJvcnMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL0FkYXB0ZXIudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL1NlcXVlbmNlLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvdXRpbHMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9pbmplY3RhYmxlcy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9EaXNwYXRjaC50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9lcnJvcnMudHMiLCIuLi9zcmMvaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2Vycm9ycy50cyIsIi4uL3NyYy9xdWVyeS9Db25kaXRpb24udHMiLCIuLi9zcmMvbW9kZWwvY29uc3RydWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyIsIi4uL3NyYy9xdWVyeS90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS91dGlscy50cyIsIi4uL3NyYy9xdWVyeS9NZXRob2RRdWVyeUJ1aWxkZXIudHMiLCIuLi9zcmMvcXVlcnkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yYW0vUmFtUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3JhbS9SYW1TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcmFtL1JhbUNvbnRleHQudHMiLCIuLi9zcmMvcmFtL21vZGVsL1JhbVNlcXVlbmNlTW9kZWwudHMiLCIuLi9zcmMvcmFtL1JhbVNlcXVlbmNlLnRzIiwiLi4vc3JjL3JhbS9oYW5kbGVycy50cyIsIi4uL3NyYy9yYW0vY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JhbS9SYW1BZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFBlcnNpc3RlbmNlLXJlbGF0ZWQgY29uc3RhbnQga2V5c1xuICogQHN1bW1hcnkgRW51bSBjb250YWluaW5nIHN0cmluZyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBwZXJzaXN0ZW5jZSBsYXllciBmb3IgbWV0YWRhdGEsIHJlbGF0aW9ucywgYW5kIG90aGVyIHBlcnNpc3RlbmNlLXJlbGF0ZWQgb3BlcmF0aW9uc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIFBlcnNpc3RlbmNlS2V5cyB7XG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBpbmRleCBtZXRhZGF0YSAqL1xuICBJTkRFWCA9IFwiaW5kZXhcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdW5pcXVlIGNvbnN0cmFpbnQgbWV0YWRhdGEgKi9cbiAgVU5JUVVFID0gXCJ1bmlxdWVcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgYWRhcHRlciBtZXRhZGF0YSAqL1xuICBBREFQVEVSID0gXCJhZGFwdGVyXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBUZW1wbGF0ZSBmb3IgaW5qZWN0YWJsZSBhZGFwdGVyIG5hbWVzICovXG4gIElOSkVDVEFCTEUgPSBcImRlY2FmX3swfV9hZGFwdGVyX2Zvcl97MX1cIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdGFibGUgbmFtZSBtZXRhZGF0YSAqL1xuICBUQUJMRSA9IFwidGFibGVcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY29sdW1uIG5hbWUgbWV0YWRhdGEgKi9cbiAgQ09MVU1OID0gXCJjb2x1bW5cIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgZ2VuZXJhbCBtZXRhZGF0YSBzdG9yYWdlICovXG4gIE1FVEFEQVRBID0gXCJfX21ldGFkYXRhXCIsXG5cbiAgLy8gT3duZXJzaGlwXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBjcmVhdGVkLWJ5IG93bmVyc2hpcCBtZXRhZGF0YSAqL1xuICBPV05FUlNISVAgPSBcIm93bmVyc2hpcFwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBjcmVhdGVkLWJ5IG93bmVyc2hpcCBtZXRhZGF0YSAqL1xuICBDUkVBVEVEX0JZID0gYCR7T1dORVJTSElQfS5jcmVhdGVkLWJ5YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdXBkYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgVVBEQVRFRF9CWSA9IGAke09XTkVSU0hJUH0udXBkYXRlZC1ieWAsXG5cbiAgLy8gUmVsYXRpb25zXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OUyA9IFwiX19yZWxhdGlvbnNcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgcmVsYXRpb25zIG1ldGFkYXRhIHN0b3JhZ2UgKi9cbiAgUkVMQVRJT04gPSBcInJlbGF0aW9uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgT05FX1RPX09ORSA9IGAke1JFTEFUSU9OfS5vbmUtdG8tb25lYCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3Igb25lLXRvLW1hbnkgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgT05FX1RPX01BTlkgPSBgJHtSRUxBVElPTn0ub25lLXRvLW1hbnlgLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBtYW55LXRvLW9uZSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBNQU5ZX1RPX09ORSA9IGAke1JFTEFUSU9OfS5tYW55LXRvLW9uZWAsXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBtYW55LXRvLW9uZSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBNQU5ZX1RPX01BTlkgPSBgJHtSRUxBVElPTn0ubWFueS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgcG9wdWxhdGUgbWV0YWRhdGEgKi9cbiAgUE9QVUxBVEUgPSBcInBvcHVsYXRlXCIsXG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFrZXMgYSBtZXRob2Qgbm9uLWNvbmZpZ3VyYWJsZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgcHJldmVudHMgYSBtZXRob2QgZnJvbSBiZWluZyBvdmVycmlkZGVuIGJ5IG1ha2luZyBpdCBub24tY29uZmlndXJhYmxlLlxuICogSXQgdGhyb3dzIGFuIGVycm9yIGlmIHVzZWQgb24gYW55dGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG1ldGhvZHNcbiAqIEBmdW5jdGlvbiBmaW5hbFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbCgpIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICghZGVzY3JpcHRvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmFsIGRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIG9uIG1ldGhvZHNcIik7XG4gICAgaWYgKGRlc2NyaXB0b3I/LmNvbmZpZ3VyYWJsZSkge1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBCYWRSZXF1ZXN0RXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gYW4gYWN0aW9uXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSByZXNvdXJjZSBvciBwZXJmb3JtIGFuIGFjdGlvbiB3aXRob3V0IHByb3BlciBhdXRoZW50aWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIEF1dGhvcml6YXRpb25FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYW4gQXV0aG9yaXphdGlvbkVycm9yXG4gKiBpZiAoIXVzZXIuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAqICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcignVXNlciBub3QgYXV0aGVudGljYXRlZCcpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3IgZXh0ZW5kcyBCYWRSZXF1ZXN0RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gQXV0aG9yaXphdGlvbkVycm9yLm5hbWUsIGNvZGUgPSA0MDEpIHtcbiAgICBzdXBlcihtc2csIG5hbWUsIGNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBmb3JiaWRkZW4gZnJvbSBhY2Nlc3NpbmcgYSByZXNvdXJjZVxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBhdXRoZW50aWNhdGVkIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gdGhleSBkb24ndCBoYXZlIHBlcm1pc3Npb24gZm9yXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZvcmJpZGRlbkVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiB0aHJvd2luZyBhIEZvcmJpZGRlbkVycm9yXG4gKiBpZiAoIXVzZXIuaGFzUGVybWlzc2lvbignYWRtaW4nKSkge1xuICogICB0aHJvdyBuZXcgRm9yYmlkZGVuRXJyb3IoJ1VzZXIgZG9lcyBub3QgaGF2ZSBhZG1pbiBwZXJtaXNzaW9ucycpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5FcnJvciBleHRlbmRzIEF1dGhvcml6YXRpb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEZvcmJpZGRlbkVycm9yLm5hbWUsIDQwMyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSBjb25uZWN0aW9uIHRvIGEgc2VydmljZSBmYWlsc1xuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgYXBwbGljYXRpb24gZmFpbHMgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBhIHJlcXVpcmVkIHNlcnZpY2Ugb3IgcmVzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQ29ubmVjdGlvbkVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiB0aHJvd2luZyBhIENvbm5lY3Rpb25FcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgZGF0YWJhc2UuY29ubmVjdCgpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2UnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvbm5lY3Rpb25FcnJvci5uYW1lLCA1MDMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBFdmVudElkcywgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZlcnMgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICogQHN1bW1hcnkgVGhlIE9ic2VydmVySGFuZGxlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBjZW50cmFsaXplZFxuICogd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBvYnNlcnZlcnMuIEl0IGFsbG93cyByZWdpc3RlcmluZyBvYnNlcnZlcnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzIHRvIGNvbnRyb2xcbiAqIHdoaWNoIGV2ZW50cyB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IsIGFuZCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIG5vdGlmeWluZyBhbGwgcmVsZXZhbnRcbiAqIG9ic2VydmVycyB3aGVuIGRhdGFiYXNlIGV2ZW50cyBvY2N1ci5cbiAqIEBjbGFzcyBPYnNlcnZlckhhbmRsZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaGFuZGxlclxuICogY29uc3QgaGFuZGxlciA9IG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlclxuICogY29uc3QgbXlPYnNlcnZlciA9IHtcbiAqICAgcmVmcmVzaDogYXN5bmMgKHRhYmxlLCBldmVudCwgaWQpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlIGluICR7dGFibGV9OiAke2V2ZW50fSBmb3IgSUQgJHtpZH1gKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiAvLyBBZGQgb2JzZXJ2ZXIgd2l0aCBhIGZpbHRlciBmb3Igb25seSB1c2VyIHRhYmxlIGV2ZW50c1xuICogaGFuZGxlci5vYnNlcnZlKG15T2JzZXJ2ZXIsICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB0YWJsZSA9PT0gJ3VzZXJzJyk7XG4gKlxuICogLy8gTm90aWZ5IG9ic2VydmVycyBhYm91dCBhbiBldmVudFxuICogYXdhaXQgaGFuZGxlci51cGRhdGVPYnNlcnZlcnMobG9nZ2VyLCAndXNlcnMnLCAnQ1JFQVRFJywgMTIzKTtcbiAqXG4gKiAvLyBSZW1vdmUgYW4gb2JzZXJ2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkXG4gKiBoYW5kbGVyLnVuT2JzZXJ2ZShteU9ic2VydmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgT2JzZXJ2YWJsZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBvYnNlcnZlciBvYmplY3RzIGFsb25nIHdpdGggdGhlaXIgb3B0aW9uYWwgZmlsdGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVyczoge1xuICAgIG9ic2VydmVyOiBPYnNlcnZlcjtcbiAgICBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcjtcbiAgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2Ygb2JzZXJ2ZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKi9cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbmV3IG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBvcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKHsgb2JzZXJ2ZXI6IG9ic2VydmVyLCBmaWx0ZXI6IGZpbHRlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVsZXZhbnQgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgRmlsdGVycyBvYnNlcnZlcnMgYmFzZWQgb24gdGhlaXIgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgY2FsbHMgcmVmcmVzaCBvbiBlYWNoIG1hdGNoaW5nIG9ic2VydmVyXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgZm9yIHJlY29yZGluZyBub3RpZmljYXRpb24gYWN0aXZpdGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJIYW5kbGVyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJcbiAgICpcbiAgICogICBDbGllbnQtPj5PYnNlcnZlckhhbmRsZXI6IHVwZGF0ZU9ic2VydmVycyhsb2csIHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXJIYW5kbGVyOiBGaWx0ZXIgb2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBvYnNlcnZlciB3aXRoIG1hdGNoaW5nIGZpbHRlclxuICAgKiAgICAgYWx0IE9ic2VydmVyIGhhcyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IEFwcGx5IGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKVxuICAgKiAgICAgICBhbHQgRmlsdGVyIHRocm93cyBlcnJvclxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIHRydWVcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIGZhbHNlXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgTm8gZmlsdGVyXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcmVzdWx0XG4gICAqICAgICBhbHQgUmVzdWx0IGlzIHJlamVjdGVkXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItLT4+Q2xpZW50OiBSZXR1cm5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBsb2c6IExvZ2dlcixcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnNcbiAgICAgICAgLmZpbHRlcigobykgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyIH0gPSBvO1xuICAgICAgICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmlsdGVyIG9ic2VydmVyICR7by5vYnNlcnZlci50b1N0cmluZygpfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAubWFwKChvKSA9PiB7XG4gICAgICAgICAgby5vYnNlcnZlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV0udG9TdHJpbmcoKX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsIGJ5IGNoZWNraW5nIG1ldGFkYXRhIG9yIGZhbGxpbmcgYmFjayB0byB0aGUgY29uc3RydWN0b3IgbmFtZVxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdldCB0aGUgdGFibGUgbmFtZSBmb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBtb2RlbFxuICogQGZ1bmN0aW9uIGdldFRhYmxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU5hbWU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb2JqID0gbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWw7XG5cbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSksXG4gICAgb2JqXG4gICk7XG4gIGlmIChtZXRhZGF0YSkge1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIHJldHVybiBtb2RlbC5uYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgYXR0cmlidXRlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICBtb2RlbCxcbiAgICBhdHRyaWJ1dGVcbiAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEgOiBhdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBieSBjb21iaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBuYW1lIGZvclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFyZ3MgLSBBZGRpdGlvbmFsIHN0cmluZyBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBzZXF1ZW5jZSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgbmFtZVxuICogQGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBFcnJvclBhcnNlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWUsIGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyRGlzcGF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5EZWNvcmF0aW9uLnNldEZsYXZvdXJSZXNvbHZlcigob2JqOiBvYmplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgQWRhcHRlci5mbGF2b3VyT2YoTW9kZWwuaXNNb2RlbChvYmopID8gb2JqLmNvbnN0cnVjdG9yIDogKG9iaiBhcyBhbnkpKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fFxuICAgICAgRGVmYXVsdEZsYXZvdXJcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8IERlZmF1bHRGbGF2b3VyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxufSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEZhY2FkZSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UgYWRhcHRlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZGF0YWJhc2UgYWRhcHRlcnMgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUaGlzIGNsYXNzXG4gKiBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBwcm92aWRlIGEgY29uc2lzdGVudCBBUEkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMsIG9ic2VydmVyXG4gKiBwYXR0ZXJuIHN1cHBvcnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSXQgbWFuYWdlcyBhZGFwdGVyIHJlZ2lzdHJhdGlvbiwgQ1JVRCBvcGVyYXRpb25zLCBhbmRcbiAqIG9ic2VydmVyIG5vdGlmaWNhdGlvbnMuXG4gKiBAdGVtcGxhdGUgQ09ORklHIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDT05GSUd9IF9jb25maWcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtfYWxpYXNdIC0gT3B0aW9uYWwgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBhZGFwdGVyXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIGFkYXB0ZXJcbiAqIGNsYXNzIFBvc3RncmVzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8cGcuUG9vbENvbmZpZywgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLlBvb2xDb25maWcpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8RkxBR1M+ID0gQ29udGV4dDxGTEFHUz4sXG4gID5cbiAgZXh0ZW5kcyBMb2dnZWRDbGFzc1xuICBpbXBsZW1lbnRzXG4gICAgUmF3RXhlY3V0b3I8UVVFUlk+LFxuICAgIENvbnRleHR1YWw8RkxBR1MsIENPTlRFWFQ+LFxuICAgIE9ic2VydmFibGUsXG4gICAgT2JzZXJ2ZXIsXG4gICAgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlUmVwb3NpdG9yeTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxhbnksIGFueSwgYW55LCBhbnksIGFueT5cbiAgPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VEaXNwYXRjaDogQ29uc3RydWN0b3I8RGlzcGF0Y2g+O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IEFkYXB0ZXJEaXNwYXRjaDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByb3RlY3RlZCBfY2xpZW50PzogQ09OTjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBjb25maWdcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTkZcbiAgICogQHJldHVybiB7Q09ORn0gVGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gICAqL1xuICBnZXQgY29uZmlnKCk6IENPTkYge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIncyBhbGlhcyBvciBmbGF2b3IgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBhbGlhcyBpZiBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBmbGF2b3IgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyJ3MgaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0IGFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzIHx8IHRoaXMuZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBhZGFwdGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBRVUVSWSwgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+LCBGTEFHUywgQ09OVEVYVD4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8XG4gICAgICBNLFxuICAgICAgUVVFUlksXG4gICAgICBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sXG4gICAgICBGTEFHUyxcbiAgICAgIENPTlRFWFRcbiAgICA+XG4gID4ge1xuICAgIGlmICghQWRhcHRlci5fYmFzZVJlcG9zaXRvcnkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlcGxhY2VkIGxhemlseWBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIHNodXRkb3duUHJveGllcyhrPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHJldHVybjtcbiAgICBpZiAoayAmJiAhKGsgaW4gdGhpcy5wcm94aWVzKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBwcm94eSBmb3VuZCBmb3IgJHtrfWApO1xuICAgIGlmICghaykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm94aWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tleV0uc2h1dGRvd24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a2V5fTogJHtlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tdLnNodXRkb3duKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba107XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a306ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHRhc2tzLCBzdWNoIGFzIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgICogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBlbnN1cmUgdG8gY2FsbCB0aGUgYmFzZSBtZXRob2QgZmlyc3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzaHV0ZG93biBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93blByb3hpZXMoKTtcbiAgICBpZiAodGhpcy5kaXNwYXRjaCkgYXdhaXQgdGhpcy5kaXNwYXRjaC5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgbmF0aXZlIGRyaXZlciBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBhZGFwdGVyIGNhY2hlXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDT05GLFxuICAgIHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh0aGlzLmFsaWFzIGluIEFkYXB0ZXIuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgKTtcbiAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmFsaWFzXSA9IHRoaXM7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDcmVhdGVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBwZXJzaXN0ZW5jZSBhZGFwdGVyYFxuICAgICk7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgRGVmaW5lZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgYXMgY3VycmVudGApO1xuICAgICAgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB0aGlzLmFsaWFzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgc3RhdGVtZW50IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgcXVlcmllcyBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1N0YXRlbWVudH0gQSBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgdGhlIG1vZGVsXG4gICAqL1xuICBhYnN0cmFjdCBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8UVVFUlksIE0sIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGRpc3BhdGNoIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7RGlzcGF0Y2h9IEEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgRGlzcGF0Y2goKTogRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgQWRhcHRlci5fYmFzZURpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvciBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHJlcG9zaXRvcnkgZmxhZ3MgZm9yIGFuIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXNjcmliZSBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgY29tYmluaW5nIGRlZmF1bHQgZmxhZ3Mgd2l0aCBvdmVycmlkZXNcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBGbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Rj59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RkxBR1M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZMQUdTPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogZ2V0VGFibGVOYW1lKG1vZGVsKSxcbiAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgIH0pIGFzIEZMQUdTO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEZMQUdTPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb250ZXh0IGZvciBhIGRhdGFiYXNlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBjb250ZXh0IG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgdXNlZCBmb3IgdHJhY2tpbmcgYW5kIGF1ZGl0aW5nXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5DUkVBVEV8T3BlcmF0aW9uS2V5cy5SRUFEfE9wZXJhdGlvbktleXMuVVBEQVRFfE9wZXJhdGlvbktleXMuREVMRVRFfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBvdmVycmlkZXMgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZXh0IG9iamVjdFxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGTEFHUz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Q09OVEVYVD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsLm5hbWV9IG1vZGVsIHdpdGggZmxhZyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKX1gXG4gICAgKTtcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgb3ZlcnJpZGVzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoZmxhZ3MpIGFzIHVua25vd24gYXMgQ09OVEVYVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gbW9kZWxUb1RyYW5zaWVudChtb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoc3BsaXQubW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gZ2V0Q29sdW1uTmFtZShtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IG1vZGVsW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHBhcmFtIFt0cmFuc2llbnRdIC0gVHJhbnNpZW50IHByb3BlcnRpZXMgdG8gcmVhdHRhY2hcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW2dldENvbHVtbk5hbWUoYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRVUVSWSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBkYXRhYmFzZSBldmVudHNcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byBiZSBub3RpZmllZCBhYm91dCBkYXRhYmFzZSBjaGFuZ2VzLiBUaGUgb2JzZXJ2ZXIgY2FuIG9wdGlvbmFsbHlcbiAgICogcHJvdmlkZSBhIGZpbHRlciBmdW5jdGlvbiB0byByZWNlaXZlIG9ubHkgc3BlY2lmaWMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlciEub2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm9ic2VydmUpXG4gICAgICAudmVyYm9zZShgUmVnaXN0ZXJpbmcgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgICBpZiAoIXRoaXMuZGlzcGF0Y2gpIHtcbiAgICAgIHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpLmluZm8oYENyZWF0aW5nIGRpc3BhdGNoIGZvciAke3RoaXMuYWxpYXN9YCk7XG4gICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5EaXNwYXRjaCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaC5vYnNlcnZlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvYnNlcnZlciBzbyBpdCBubyBsb25nZXIgcmVjZWl2ZXMgZGF0YWJhc2UgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBTZW5kcyBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2UsXG4gICAqIGZpbHRlcmluZyBiYXNlZCBvbiBlYWNoIG9ic2VydmVyJ3MgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgYWRhcHRlciAke3RoaXMuYWxpYXN9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGhpcy5sb2csXG4gICAgICB0YWJsZSxcbiAgICAgIGV2ZW50LFxuICAgICAgaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIGRhdGEgYmFzZWQgb24gYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byB1cGRhdGVPYnNlcnZlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyByZWxhdGVkIHRvIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyByZWZyZXNoKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqL1xuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBBZGFwdGVyYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBmbGF2b3IgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIGZsYXZvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlciBmbGF2b3IgbmFtZVxuICAgKi9cbiAgc3RhdGljIGZsYXZvdXJPZjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEodGhpcy5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIHRoaXMuY3VycmVudD8uZmxhdm91clxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGN1cnJlbnRGbGF2b3VyKCkge1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHBlcnNpc3RlbmNlIGZsYXZvdXIgc2V0LiBQbGVhc2UgaW5pdGlhbGl6ZSB5b3VyIGFkYXB0ZXJgXG4gICAgICApO1xuICAgIHJldHVybiBBZGFwdGVyLl9jdXJyZW50Rmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJuIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IFRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgY3VycmVudCgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLmN1cnJlbnRGbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBhZGFwdGVyIGJ5IGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGFkYXB0ZXIgYnkgaXRzIGZsYXZvciBuYW1lXG4gICAqIEB0ZW1wbGF0ZSBDT05GIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTk4gLSBUaGUgZGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlXG4gICAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBDQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEZMQUdTIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhULCBGTEFHUz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPixcbiAgICBGTEFHUyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihmbGF2b3VyPzogYW55KTogQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENoYW5nZXMgd2hpY2ggYWRhcHRlciBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHNldCBhcyBjdXJyZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxhdm91ciA9IGZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc3RhbmRhcmRpemVkIG1ldGFkYXRhIGtleSBmb3IgcGVyc2lzdGVuY2UtcmVsYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvLmtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBtb2RlbHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEgc3BlY2lmaWMgYWRhcHRlciBmbGF2b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBhZGFwdGVyIGZsYXZvciB0byBmaW5kIG1vZGVscyBmb3JcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHN0YXRpYyBtb2RlbHM8TSBleHRlbmRzIE1vZGVsPihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSAoTW9kZWwgYXMgYW55KS5nZXRSZWdpc3RyeSgpIGFzIE1vZGVsUmVnaXN0cnk8YW55PjtcbiAgICAgIGNvbnN0IGNhY2hlID0gKFxuICAgICAgICByZWdpc3RyeSBhcyB1bmtub3duIGFzIHsgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8YW55Pj4gfVxuICAgICAgKS5jYWNoZTtcbiAgICAgIGNvbnN0IG1hbmFnZWRNb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gT2JqZWN0LnZhbHVlcyhjYWNoZSlcbiAgICAgICAgLm1hcCgobTogTW9kZWxDb25zdHJ1Y3RvcjxNPikgPT4ge1xuICAgICAgICAgIGxldCBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZiAmJiBmID09PSBmbGF2b3VyKSByZXR1cm4gbTtcbiAgICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG8gPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBSZXBvLmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXBvKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gKHRoaXMuX2Jhc2VSZXBvc2l0b3J5IGFzIGFueSkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgcHJveGllcz86IFJlY29yZDxzdHJpbmcsIHR5cGVvZiB0aGlzPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDT04gLSBUaGUgdHlwZSBvZiB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0NPTn0gVGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBmdW5jdGlvbiBnZXRDbGllbnRcbiAgICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xpZW50KCk6IENPTk47XG5cbiAgQGZpbmFsKClcbiAgZ2V0IGNsaWVudCgpOiBDT05OIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxDT05GPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHNvcnQgZGlyZWN0aW9ucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBzb3J0IGRpcmVjdGlvbnMgZm9yIG9yZGVyaW5nIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gT3JkZXJEaXJlY3Rpb24ge1xuICAvKiogQXNjZW5kaW5nIG9yZGVyIChBIHRvIFosIDAgdG8gOSkgKi9cbiAgQVNDID0gXCJhc2NcIixcblxuICAvKiogRGVzY2VuZGluZyBvcmRlciAoWiB0byBBLCA5IHRvIDApICovXG4gIERTQyA9IFwiZGVzY1wiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBjYXNjYWRlIG9wZXJhdGlvbiB0eXBlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBjYXNjYWRlIGJlaGF2aW9ycyBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gQ2FzY2FkZSB7XG4gIC8qKiBQZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgQ0FTQ0FERSA9IFwiY2FzY2FkZVwiLFxuICAvKiogRG8gbm90IHBlcmZvcm0gY2FzY2FkZSBvcGVyYXRpb24gb24gcmVsYXRlZCBlbnRpdGllcyAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBkZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBpbiByZXBvc2l0b3JpZXMuXG4gKiBAc3VtbWFyeSBEb2N1bWVudHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FzY2FkZSBjb25maWd1cmF0aW9uIHdpdGggZXhwbGljaXQgdXBkYXRlIGFuZCBkZWxldGUgYmVoYXZpb3JzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSB1cGRhdGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAcHJvcGVydHkgeydjYXNjYWRlJ3wnbm9uZSd9IGRlbGV0ZSAtIERldGVybWluZXMgd2hldGhlciBkZWxldGVzIGNhc2NhZGUgdG8gcmVsYXRlZCBlbnRpdGllcy5cbiAqIEB0eXBlRGVmIERlZmF1bHRDYXNjYWRlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBVbnN1cHBvcnRlZEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlcyAobGlrZSBwcmltYXJ5IGtleXMpIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhbmRsZSB0aGUgc3BlY2lmaWNzIG9mIGhvdyBzZXF1ZW5jZXMgYXJlIHN0b3JlZCBhbmQgaW5jcmVtZW50ZWQgaW4gZGlmZmVyZW50XG4gKiBkYXRhYmFzZSBzeXN0ZW1zLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2VcbiAqIGNsYXNzIFBvc3RncmVzU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICogICAgIHN1cGVyKG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IG5leHQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIG5leHR2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0ubmV4dHZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgY3VycmVudCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgY3VycnZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5jdXJydmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gKiAgICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLm5leHQoKSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB2YWx1ZXM7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2FnZVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUG9zdGdyZXNTZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICd1c2VyX2lkX3NlcScsXG4gKiAgIGV4ZWN1dG9yOiBkYkV4ZWN1dG9yXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTGF6aWx5IGluaXRpYWxpemVkIGxvZ2dlciBmb3IgdGhlIHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY2Vzc29yIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBzZXF1ZW5jZSwgaW5jcmVtZW50aW5nIGl0IGluIHRoZSBwcm9jZXNzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBzZXF1ZW50aWFsIHZhbHVlcyBhdCBvbmNlLCB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIG5leHQoKSBtdWx0aXBsZSB0aW1lc1xuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFic3RyYWN0IHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge018Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqL1xuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSAoTnVtYmVyIG9yIEJpZ0ludClcbiAgICogQHBhcmFtIHtcIk51bWJlclwifFwiQmlnSW50XCJ8dW5kZWZpbmVkfSB0eXBlIC0gVGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsdWUoXG4gICAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZTogJHt0eXBlfSBmb3IgYWRhcHRlciAke3RoaXN9YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi9BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvciBhIG1vZGVsIHNob3VsZCB1c2VcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gYSBtb2RlbCBjbGFzcyB0byBpbmRpY2F0ZSB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvclxuICogc2hvdWxkIGJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gVGhlIGZsYXZvciBpcyBhIHN0cmluZ1xuICogaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhZGFwdGVyIGZsYXZvciB0byB1c2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgbW9kZWwgY2xhc3NcbiAqIEBmdW5jdGlvbiB1c2VzXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlcyhmbGF2b3VyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZXMob3JpZ2luYWw6IGFueSkge1xuICAgIHJldHVybiBhcHBseShtZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIGZsYXZvdXIpKShcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnkgYXMgUmVwLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZFdpdGhDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZSwgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJIYW5kbGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV2ZW50SWRzLFxuICBJbmZlcnJlZEFkYXB0ZXJDb25maWcsXG4gIHR5cGUgT2JzZXJ2ZXJGaWx0ZXIsXG59IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGFsaWFzIGZvciBSZXBvc2l0b3J5IGNsYXNzIHdpdGggc2ltcGxpZmllZCBnZW5lcmljIHBhcmFtZXRlcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG1vcmUgY29uY2lzZSB3YXkgdG8gcmVmZXJlbmNlIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggaXRzIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAqIEB0eXBlZGVmIFJlcG9cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgdHlwZSBSZXBvPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBhbnksXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gYW55LFxuICBRID0gYW55LFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4gPSBhbnksXG4+ID0gUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zIG9uIG1vZGVscyBvbiBhIHRhYmxlIGJ5IHRhYmxlIHdheS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucywgcXVlcnlpbmcgY2FwYWJpbGl0aWVzLCBhbmQgb2JzZXJ2ZXIgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwgcGVyc2lzdGVuY2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlci5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBmb3Igb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7QX0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgaW5pdGlhbGl6YXRpb24uXG4gKiBAY2xhc3MgUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKFVzZXIpO1xuICpcbiAqIC8vIFVzaW5nIHRoZSByZXBvc2l0b3J5IGZvciBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnSm9obicgfSkpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLnJlYWQodXNlci5pZCk7XG4gKiB1c2VyLm5hbWUgPSAnSmFuZSc7XG4gKiBhd2FpdCB1c2VyUmVwby51cGRhdGUodXNlcik7XG4gKiBhd2FpdCB1c2VyUmVwby5kZWxldGUodXNlci5pZCk7XG4gKlxuICogLy8gUXVlcnlpbmcgd2l0aCBjb25kaXRpb25zXG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHVzZXJSZXBvXG4gKiAgIC5zZWxlY3QoKVxuICogICAud2hlcmUoeyBuYW1lOiAnSmFuZScgfSlcbiAqICAgLm9yZGVyQnkoJ2NyZWF0ZWRBdCcsIE9yZGVyRGlyZWN0aW9uLkRTQylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAqXG4gKiAgIEMtPj4rUjogY3JlYXRlKG1vZGVsKVxuICogICBSLT4+UjogY3JlYXRlUHJlZml4KG1vZGVsKVxuICogICBSLT4+K0E6IHByZXBhcmUobW9kZWwpXG4gKiAgIEEtLT4+LVI6IHByZXBhcmVkIGRhdGFcbiAqICAgUi0+PitBOiBjcmVhdGUodGFibGUsIGlkLCByZWNvcmQpXG4gKiAgIEEtPj4rREI6IEluc2VydCBPcGVyYXRpb25cbiAqICAgREItLT4+LUE6IFJlc3VsdFxuICogICBBLS0+Pi1SOiByZWNvcmRcbiAqICAgUi0+PitBOiByZXZlcnQocmVjb3JkKVxuICogICBBLS0+Pi1SOiBtb2RlbCBpbnN0YW5jZVxuICogICBSLT4+UjogY3JlYXRlU3VmZml4KG1vZGVsKVxuICogICBSLT4+K086IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgQ1JFQVRFLCBpZClcbiAqICAgTy0tPj4tUjogTm90aWZpY2F0aW9uIGNvbXBsZXRlXG4gKiAgIFItLT4+LUM6IGNyZWF0ZWQgbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnk8XG4gICAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIFEsIEYsIEM+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+XG4gIGV4dGVuZHMgUmVwPE0sIEYsIEM+XG4gIGltcGxlbWVudHMgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFF1ZXJpYWJsZTxNPiwgSVJlcG9zaXRvcnk8TSwgRiwgQz5cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFJlcG88TW9kZWw+PiB8IFJlcG88TW9kZWw+XG4gID4gPSB7fTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQTtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX292ZXJyaWRlcz86IFBhcnRpYWw8Rj47XG5cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb2dnZXIgZm9yIHRoaXMgcmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpXG4gICAgICB0aGlzLmxvZ2dlciA9IChcbiAgICAgICAgdGhpcy5hZGFwdGVyW1wibG9nXCIgYXMga2V5b2YgdHlwZW9mIHRoaXMuYWRhcHRlcl0gYXMgTG9nZ2VyXG4gICAgICApLmZvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhZGFwdGVyIGluc3RhbmNlIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAgICogQHJldHVybiB7QX0gVGhlIGFkYXB0ZXIgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGFkYXB0ZXIgaXMgZm91bmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGFibGUgbmFtZSBmb3IgdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgc2VxdWVuY2Ugb3B0aW9ucyBjb250YWluaW5nIHByaW1hcnkga2V5IGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJuIHtTZXF1ZW5jZU9wdGlvbnN9IFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBwa1Byb3BzKCk6IFNlcXVlbmNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHN1cGVyLnBrUHJvcHM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgICBpZiAoYWRhcHRlcikgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB7XG4gICAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKGNsYXp6LCB0aGlzLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgIGNsYXp6XG4gICAgICAgICk7XG4gICAgICAgIGlmIChmbGF2b3VyICYmIGZsYXZvdXIgIT09IGFkYXB0ZXIuZmxhdm91cilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkluY29tcGF0aWJsZSBmbGF2b3Vyc1wiKTtcbiAgICAgICAgdXNlcyhhZGFwdGVyLmZsYXZvdXIpKGNsYXp6KTtcbiAgICAgIH1cbiAgICB9XG4gICAgW3RoaXMuY3JlYXRlQWxsLCB0aGlzLnJlYWRBbGwsIHRoaXMudXBkYXRlQWxsLCB0aGlzLmRlbGV0ZUFsbF0uZm9yRWFjaChcbiAgICAgIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICAgIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJveHkgd2l0aCBvdmVycmlkZGVuIHJlcG9zaXRvcnkgZmxhZ3MuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGZsYWdzIG92ZXJyaWRkZW4uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBUaGUgZmxhZ3MgdG8gb3ZlcnJpZGUuXG4gICAqIEByZXR1cm4ge1JlcG9zaXRvcnl9IEEgcHJveHkgb2YgdGhpcyByZXBvc2l0b3J5IHdpdGggb3ZlcnJpZGRlbiBmbGFncy5cbiAgICovXG4gIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEY+KTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vdmVycmlkZSlcbiAgICAgIC5kZWJ1ZyhgT3ZlcnJpZGluZyByZXBvc2l0b3J5IGZsYWdzIHdpdGggJHtKU09OLnN0cmluZ2lmeShmbGFncyl9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwICE9PSBcIl9vdmVycmlkZXNcIikgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCwgZmxhZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIGEgc3BlY2lmaWMgYWRhcHRlciBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgQSAtIFRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSB0eXBlIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDIC0gVGhlIHR5cGUgb2YgdGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+fSBjb25mIC0gYWRhcHRlciBjb25maWd1cmF0aW9ucyB0byBvdmVycmlkZS5cbiAgICogQHBhcmFtIFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqL1xuICBmb3IoXG4gICAgY29uZjogUGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiBhbnksIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJhZGFwdGVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmZvcihjb25mLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXIuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciBjcmVhdGlvbiBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCB3aXRoIHVwZGF0ZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgbGV0IGM6IEMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIEM7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUG9zdC1jcmVhdGlvbiBob29rLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhZnRlciBhIG1vZGVsIGlzIGNyZWF0ZWQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgY3JlYXRlZCBtb2RlbC5cbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcHJvY2Vzc2VkIG1vZGVsLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVN1ZmZpeChtb2RlbCwgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGJhdGNoIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGNyZWF0ZWQgbW9kZWxzIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBTZXF1ZW5jZS5wayhtb2RlbHNbMF0pO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtW3RoaXMucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFByaW1hcnkga2V5IGlzIG5vdCBkZWZpbmVkIGZvciBtb2RlbCBpbiBwb3NpdGlvbiAke2l9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmIChvcHRzLnR5cGUpIG1bdGhpcy5wa10gPSBpZHNbaV0gYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gdGhlIGFkYXB0ZXIgYWxpYXMvZmxhdm91ci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHVuaXF1ZSBpbmplY3RhYmxlIG5hbWUgZm9yIGEgcmVwb3NpdG9yeS5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgcmVwb3NpdG9yaWVzIHVzaW5nIHRoZSBhZGFwdGVyIGZsYXZvdXIgYW5kIG1vZGVsIHRhYmxlIG5hbWUuXG4gKiBUaGlzIGhlbHBzIHRoZSBESSBzeXN0ZW0gcmVnaXN0ZXIgYW5kIHJlc29sdmUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgY29uc2lzdGVudGx5IGFjcm9zcyBhZGFwdGVycy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD4gfCBUfSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcy4gSWYgb21pdHRlZCwgaXQgaXMgcmVhZCBmcm9tIG1vZGVsIG1ldGFkYXRhLlxuICogQHJldHVybiB7c3RyaW5nfSBBIG5hbWVzcGFjZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgdGhlIHJlcG9zaXRvcnkgKGUuZy4sIFwiZGI6cmVwbzpyYW06dXNlcnNcIikuXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZmxhdm91ciBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGFyZ3VtZW50cyBvciBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBVIGFzIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdCBNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTdHJpbmcgRm9ybWF0dGVyXG4gKiAgIEMtPj5VOiBjYWxsKG1vZGVsLCBmbGF2b3VyPylcbiAqICAgYWx0IGZsYXZvdXIgcHJvdmlkZWRcbiAqICAgICBVLS0+PlU6IHVzZSBwcm92aWRlZCBmbGF2b3VyXG4gKiAgIGVsc2UgZmxhdm91ciBub3QgcHJvdmlkZWRcbiAqICAgICBVLT4+QTogQWRhcHRlci5rZXkoQURBUFRFUilcbiAqICAgICBVLT4+UjogZ2V0TWV0YWRhdGEoa2V5LCBtb2RlbHxtb2RlbC5jdG9yKVxuICogICAgIGFsdCBtZXRhZGF0YSBwcmVzZW50XG4gKiAgICAgICBSLS0+PlU6IGZsYXZvdXJcbiAqICAgICBlbHNlIG1pc3NpbmdcbiAqICAgICAgIFUtLT4+QzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgVS0+PlM6IHNmKElOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKVxuICogICBTLS0+PkM6IHRva2VuIHN0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoIWZsYXZvdXIpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICk7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV0cmlldmUgZmxhdm91ciBmcm9tIG1vZGVsICR7bW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgOiBtb2RlbC5uYW1lfWBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuIHNmKFBlcnNpc3RlbmNlS2V5cy5JTkpFQ1RBQkxFLCBmbGF2b3VyLCBnZXRUYWJsZU5hbWUobW9kZWwpKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgaW5qZWN0YWJsZSByZXBvc2l0b3JpZXMgd2l0aCBhdXRvLXJlc29sdXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhbiBJbmplY3RhYmxlUmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdGhhdCByZXNvbHZlcyByZXBvc2l0b3JpZXMgYnkgbW9kZWwgbmFtZSBvciBjb25zdHJ1Y3Rvci4gSWYgYSByZXBvc2l0b3J5XG4gKiBpcyBub3QgZXhwbGljaXRseSByZWdpc3RlcmVkLCBpdCBhdHRlbXB0cyB0byBpbmZlciB0aGUgY29ycmVjdCByZXBvc2l0b3J5IHVzaW5nIG1vZGVsIG1ldGFkYXRhIGFuZCB0aGUgYWN0aXZlIG9yIHNwZWNpZmllZCBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVycyByZXF1aXJlZDsgdGhlIHN1cGVyY2xhc3MgaGFuZGxlcyBpbnRlcm5hbCBzdGF0ZS5cbiAqIEBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2U6IHJldHJpZXZlIGEgcmVwb3NpdG9yeSBieSBtb2RlbCBuYW1lXG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCk7XG4gKiBjb25zdCB1c2VyUmVwbyA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oJ1VzZXInKTtcbiAqIC8vIElmIFVzZXJSZXBvc2l0b3J5IGlzIHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBhIFVzZXIgbW9kZWwgZXhpc3RzLlxuICpcbiAqIC8vIFJldHJpZXZlIGJ5IGNvbnN0cnVjdG9yIGFuZCBzcGVjaWZ5IGFkYXB0ZXIgZmxhdm91clxuICogY29uc3QgcmVwb0J5Q3RvciA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oVXNlck1vZGVsLCAncmFtJyk7XG4gKlxuICogLy8gUmV0cmlldmUgYnkgc3ltYm9sIChlLmcuLCBpbmplY3RhYmxlIHRva2VuKVxuICogY29uc3QgdG9rZW4gPSBTeW1ib2wuZm9yKCdVc2VyUmVwb3NpdG9yeScpO1xuICogY29uc3QgYnlUb2tlbiA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4odG9rZW4pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnN1bWVyXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gKiAgIEMtPj5SOiBnZXQobmFtZSwgZmxhdm91cj8pXG4gKiAgIGFjdGl2YXRlIFJcbiAqICAgUi0+PkI6IHN1cGVyLmdldChuYW1lKVxuICogICBhbHQgRm91bmQgaW4gYmFzZSByZWdpc3RyeVxuICogICAgIEItLT4+UjogaW5qZWN0YWJsZVxuICogICAgIFItLT4+QzogaW5qZWN0YWJsZVxuICogICBlbHNlIE5vdCBmb3VuZFxuICogICAgIFItPj5NOiBNb2RlbC5nZXQobmFtZSlcbiAqICAgICBhbHQgTW9kZWwgZm91bmRcbiAqICAgICAgIFItPj5BOiByZXNvbHZlIGZsYXZvdXIgKGZyb20gYXJnL21ldGFkYXRhL2N1cnJlbnQpXG4gKiAgICAgICBSLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAqICAgICAgIGFsdCBSZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICAgIFJQLS0+PlI6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbHNlIFJlcG9zaXRvcnkgY3RvclxuICogICAgICAgICBSLT4+QTogQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBvciBBZGFwdGVyLmN1cnJlbnRcbiAqICAgICAgICAgQS0tPj5SOiBhZGFwdGVyIGluc3RhbmNlXG4gKiAgICAgICAgIFItPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbmRcbiAqICAgICBlbHNlIE1vZGVsIG5vdCBmb3VuZFxuICogICAgICAgUi0tPj5DOiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhbiBpbmplY3RhYmxlIHdpdGggcmVwb3NpdG9yeSBhdXRvLXJlc29sdXRpb24uXG4gICAqIEBzdW1tYXJ5IEF0dGVtcHRzIHRvIGdldCBhbiBpbmplY3RhYmxlIGZyb20gdGhlIGJhc2UgcmVnaXN0cnk7IGlmIG5vdCBmb3VuZCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEga25vd24gbW9kZWwsIGl0XG4gICAqIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSByZXBvc2l0b3J5IHVzaW5nIHRoZSBzcGVjaWZpZWQgZmxhdm91ciBvciBtb2RlbCBtZXRhZGF0YSwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50IGFkYXB0ZXIgd2hlbiBuZWVkZWQuXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSBpbmplY3RhYmxlIHR5cGUgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3I8VD59IG5hbWUgVG9rZW4sIG1vZGVsIG5hbWUsIG9yIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5qZWN0YWJsZSBvciBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIgKGUuZy4sIFwicmFtXCIpLiBJZiBvbWl0dGVkLCBkZXJpdmVzIGZyb20gbWV0YWRhdGEgb3IgY3VycmVudCBhZGFwdGVyLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSBUaGUgbG9jYXRlZCBvciBhdXRvLWNyZWF0ZWQgaW5qZWN0YWJsZSBpbnN0YW5jZTsgb3RoZXJ3aXNlIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgZ2V0KG5hbWUsIGZsYXZvdXI/KVxuICAgKiAgIHBhcnRpY2lwYW50IEJSIGFzIEJhc2VSZWdpc3RyeVxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gICAqICAgRy0+PkJSOiBzdXBlci5nZXQobmFtZSlcbiAgICogICBhbHQgRm91bmRcbiAgICogICAgIEJSLS0+Pkc6IGluamVjdGFibGVcbiAgICogICBlbHNlIE5vdCBmb3VuZFxuICAgKiAgICAgRy0+Pk06IGRlcml2ZSBtb2RlbEN0b3IgZnJvbSBuYW1lXG4gICAqICAgICBhbHQgbW9kZWxDdG9yIHJlc29sdmVkXG4gICAqICAgICAgIEctPj5BOiByZXNvbHZlIGZsYXZvdXIgKGFyZyB8IG1ldGFkYXRhIHwgY3VycmVudClcbiAgICogICAgICAgRy0+PlJQOiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsQ3RvciwgYWxpYXMpXG4gICAqICAgICAgIGFsdCByZXR1cm5zIGluc3RhbmNlXG4gICAqICAgICAgICAgUlAtLT4+RzogUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgKiAgICAgICBlbHNlIHJldHVybnMgY3RvclxuICAgKiAgICAgICAgIEctPj5BOiBBZGFwdGVyLmdldChmbGF2b3VyKSB8IEFkYXB0ZXIuY3VycmVudFxuICAgKiAgICAgICAgIEEtLT4+RzogYWRhcHRlciBpbnN0YW5jZVxuICAgKiAgICAgICAgIEctPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG5vIG1vZGVsQ3RvclxuICAgKiAgICAgICBHLS0+Pkc6IHJldHVybiB1bmRlZmluZWRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IENvbnN0cnVjdG9yPFQ+IHwgc3RyaW5nLFxuICAgIGZsYXZvdXI/OiBzdHJpbmdcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0KTtcbiAgICAvLyBGaXJzdCwgdHJ5IGJhc2UgcmVnaXN0cnksIGJ1dCBndWFyZCBhZ2FpbnN0IHRocm93biBlcnJvcnNcbiAgICBsZXQgaW5qZWN0YWJsZTogVCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lIGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYW5kbGUgaXQgbGF0ZXJcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIGxldCBtb2RlbEN0b3I6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIikgbW9kZWxDdG9yID0gbmFtZSBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIgfHwgdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbW9kZWxDdG9yID0gTW9kZWwuZ2V0KG5hbWUudG9TdHJpbmcoKSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGVsQ3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgLy8gUmVzb2x2ZSBmbGF2b3VyIGZyb20gbWV0YWRhdGEgaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBtZXRhS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRGbGF2b3VyID1cbiAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCBtb2RlbEN0b3IpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERldGVybWluZSBhbiBhbGlhcyB0byB1c2U6IHByZWZlciBhIGRpcmVjdGx5IHJlZ2lzdGVyZWQgYWRhcHRlcjsgb3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBhZGFwdGVyXG4gICAgICAgIC8vIGhhcyB0aGUgc2FtZSBmbGF2b3VyLCB1c2UgaXRzIGFsaWFzIHRvIHNhdGlzZnkgUmVwb3NpdG9yeS5mb3JNb2RlbC9BZGFwdGVyLmdldCBsb29rdXBzLlxuICAgICAgICBsZXQgYWxpYXNUb1VzZSA9IHJlc29sdmVkRmxhdm91cjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRGbGF2b3VyKSBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gQWRhcHRlci5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmZsYXZvdXIgPT09IHJlc29sdmVkRmxhdm91cilcbiAgICAgICAgICAgIGFsaWFzVG9Vc2UgPSBjdXJyZW50LmFsaWFzO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICAgICAgbW9kZWxDdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgYWxpYXNUb1VzZVxuICAgICAgICApIGFzIFQ7XG4gICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZ2lzdGVyIHRoZSByZXNvbHZlZCBpbmplY3RhYmxlIG5hbWUgZm9yIGxhdGVyIHJldHJpZXZhbFxuICAgICAgICBjb25zdCBmID1cbiAgICAgICAgICByZXNvbHZlZEZsYXZvdXIgfHxcbiAgICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCAoaW5qZWN0YWJsZSBhcyBhbnkpLmNvbnN0cnVjdG9yKSBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgIG1vZGVsQ3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICBmIGFzIHN0cmluZ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBObyByZWdpc3RlcmVkIHJlcG9zaXRvcnkgb3IgYWRhcHRlciBmb3VuZC4gZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYWRhcHRlci4gRXJyb3I6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVwb0N0b3IgPSAoUmVwb3NpdG9yeSBhcyBhbnkpW1wiZ2V0XCJdKG1vZGVsQ3RvciwgcmVzb2x2ZWRGbGF2b3VyKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBvQ3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IHJlc29sdmVkRmxhdm91clxuICAgICAgICAgICAgPyAoQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBhcyBhbnkpXG4gICAgICAgICAgICA6IChBZGFwdGVyLmN1cnJlbnQgYXMgYW55KTtcbiAgICAgICAgICBpZiAoIWFkYXB0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKTtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJEaXNwYXRjaCwgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlcyBkYXRhYmFzZSBvcGVyYXRpb24gZXZlbnRzIHRvIG9ic2VydmVyc1xuICogQHN1bW1hcnkgVGhlIERpc3BhdGNoIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJjZXB0aW5nXG4gKiBkYXRhYmFzZSBvcGVyYXRpb25zIGZyb20gYW4gQWRhcHRlciBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGNoYW5nZXMgb2NjdXIuIEl0IHVzZXMgcHJveGllcyB0b1xuICogd3JhcCB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyBhbmQgYXV0b21hdGljYWxseSB0cmlnZ2VyIG9ic2VydmVyIHVwZGF0ZXMgYWZ0ZXIgb3BlcmF0aW9ucyBjb21wbGV0ZS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnNcbiAqIEBjbGFzcyBEaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGFuZCB1c2luZyBhIERpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBEaXNwYXRjaDxQb3N0Z3Jlc0RyaXZlcj4oKTtcbiAqXG4gKiAvLyBDb25uZWN0IGl0IHRvIGFuIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKGNvbm5lY3Rpb24pO1xuICogZGlzcGF0Y2gub2JzZXJ2ZShhZGFwdGVyKTtcbiAqXG4gKiAvLyBOb3cgYW55IENSVUQgb3BlcmF0aW9ucyBvbiB0aGUgYWRhcHRlciB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIC8vIHRyaWdnZXIgb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICogYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMTIzLCB1c2VyTW9kZWwpO1xuICogLy8gT2JzZXJ2ZXJzIHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIGNyZWF0aW9uXG4gKlxuICogLy8gV2hlbiBkb25lLCB5b3UgY2FuIGRpc2Nvbm5lY3RcbiAqIGRpc3BhdGNoLnVuT2JzZXJ2ZShhZGFwdGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2ggZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIEFkYXB0ZXJEaXNwYXRjaCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGFkYXB0ZXIgYmVpbmcgb2JzZXJ2ZWRcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHdob3NlIG9wZXJhdGlvbnMgYXJlIGJlaW5nIG1vbml0b3JlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkYXB0ZXI/OiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGFkYXB0ZXJcbiAgICovXG4gIHByb3RlY3RlZCBtb2RlbHMhOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2Ugd2l0aG91dCBhbnkgYWRhcHRlclxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoIGJ5IHByb3h5aW5nIGFkYXB0ZXIgbWV0aG9kc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHByb3hpZXMgb24gdGhlIGFkYXB0ZXIncyBDUlVEIG1ldGhvZHMgdG8gaW50ZXJjZXB0IG9wZXJhdGlvbnMgYW5kIG5vdGlmeSBvYnNlcnZlcnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gYWRhcHRlciBpcyBvYnNlcnZlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQcm94eVxuICAgKlxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IENoZWNrIGlmIGFkYXB0ZXIgZXhpc3RzXG4gICAqICAgYWx0IE5vIGFkYXB0ZXJcbiAgICogICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBDUlVEIG1ldGhvZFxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBpZiBtZXRob2QgZXhpc3RzXG4gICAqICAgICBhbHQgTWV0aG9kIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBHZXQgcHJvcGVydHkgZGVzY3JpcHRvclxuICAgKiAgICAgbG9vcCBXaGlsZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIHByb3RvdHlwZSBjaGFpblxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBhbHQgRGVzY3JpcHRvciBub3QgZm91bmQgb3Igbm90IHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IExvZyBlcnJvciBhbmQgY29udGludWVcbiAgICogICAgIGVsc2UgRGVzY3JpcHRvciBmb3VuZCBhbmQgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5Qcm94eTogQ3JlYXRlIHByb3h5IGZvciBtZXRob2RcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBSZXBsYWNlIG1ldGhvZCB3aXRoIHByb3h5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAvLyBHcmFjZWZ1bGx5IHNraXAgaW5pdGlhbGl6YXRpb24gd2hlbiBubyBhZGFwdGVyIGlzIG9ic2VydmVkIHlldC5cbiAgICAgIC8vIFNvbWUgdGVzdHMgb3Igc2V0dXBzIG1heSBjb25zdHJ1Y3QgYSBEaXNwYXRjaCBiZWZvcmUgY2FsbGluZyBvYnNlcnZlKCkuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nLCB3ZSBuby1vcCBzbyB0aGF0IGxhdGVyIG9ic2VydmUoKSBjYW4gcHJvY2VlZC5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PjtcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgaWYgKCFhZGFwdGVyW21ldGhvZF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHttZXRob2R9IG5vdCBmb3VuZCBpbiAke2FkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFkYXB0ZXIsIG1ldGhvZCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IGFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHttZXRob2R9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICBhZGFwdGVyW21ldGhvZF0gPSBuZXcgUHJveHkoYWRhcHRlclttZXRob2RdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAodGFyZ2V0OiBhbnksIHRoaXNBcmcsIGFyZ0FycmF5OiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFt0YWJsZU5hbWUsIGlkc10gPSBhcmdBcnJheTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlTmFtZSwgYnVsa1RvU2luZ2xlKG1ldGhvZCksIGlkcyBhcyBFdmVudElkcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgICBgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7bWV0aG9kfSBmb3IgJHt0YWJsZU5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHttZXRob2R9IG9uICR7dGFibGVOYW1lfTogJHtlfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZGlzcGF0Y2hcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHdoZW4gdGhlIGRpc3BhdGNoIGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjbG9zaW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB0byBub3RoaW5nIGluIHRoaXMgaW5zdGFuY2UgYnV0IG1heSBiZSByZXF1aXJlZCBmb3IgY2xvc2luZyBjb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiT25seSBBZGFwdGVycyBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIik7XG4gICAgdGhpcy5hZGFwdGVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5tb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBEaXNwYXRjaCBpbml0aWFsaXplZCBmb3IgJHt0aGlzLmFkYXB0ZXIhLmFsaWFzfSBhZGFwdGVyYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0b3BzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IERpc2Nvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggZnJvbSBhbiBhZGFwdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gc3RvcCBvYnNlcnZpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGFwdGVyICE9PSBvYnNlcnZlcilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgdGhlIGFkYXB0ZXIgdGhhdCB3YXMgdXNlZCB0byBvYnNlcnZlIGNhbiBiZSB1bm9ic2VydmVkXCJcbiAgICAgICk7XG4gICAgdGhpcy5hZGFwdGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBEaXNwYXRjaDtcbiIsImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZGVjb3JhdG9yIGZvciBtb2RlbCBjbGFzc2VzLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FuIGJlIHVzZWQgYXMgYm90aCBhIHByb3BlcnR5IGRlY29yYXRvciBhbmQgYSBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD59IG1vZGVsIC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSB0aGUgcmVxdWlyZWQgYWRhcHRlcidzIGZsYXZvdXIvYWxpYXMuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuLlxuICogQHJldHVybiB7YW55fSAtIFRoZSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKlxuICogICBDLT4+RDogQXBwbHkgQHJlcG9zaXRvcnkoTW9kZWwpXG4gKiAgIGFsdCBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAqICAgICBELT4+RDogQ2hlY2sgaWYgcHJvcGVydHlLZXkgZXhpc3RzXG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0KG5hbWUpIGRlY29yYXRvclxuICogICBlbHNlIENsYXNzIERlY29yYXRvclxuICogICAgIEQtPj5NOiBTZXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBvbiBtb2RlbFxuICogICAgIEQtPj5SOiBSZWdpc3RlciBtb2RlbCB3aXRoIFJlcG9zaXRvcnlcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3RhYmxlIGRlY29yYXRvciB3aXRoIGNvbmZpZ1xuICogICAgIEMtPj5DOiBEZWZpbmUgREJLZXlzLkNMQVNTIHByb3BlcnR5XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwpKFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLCBvcmlnaW5hbC5uYW1lKShtb2RlbCk7XG4gICAgZmxhdm91ciA9XG4gICAgICBmbGF2b3VyIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgb3JpZ2luYWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIGZsYXZvdXJcbiAgICApO1xuICAgIHJldHVybiBpbmplY3RhYmxlKG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCwge1xuICAgICAgY2FsbGJhY2s6IChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0pKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgcmVwb3NpdG9yeSBvYnNlcnZlciBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9ic2VydmVyRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPYnNlcnZlckVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3Igc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnM8XG4gIFRZUEUgPSBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgZ2VuZXJhdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZXMgTnVtYmVyIG9yIEJpZ0ludCB2YWx1ZXNcbiAgICovXG4gIHR5cGU6IFRZUEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIHN0YXJ0cyB3aXRoXG4gICAqL1xuICBzdGFydFdpdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIGVhY2ggc3RlcCBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VxdWVuY2UgaW5jcmVhc2VzIHdpdGggZWFjaCBjYWxsXG4gICAqL1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtaW5WYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgc2VxdWVuY2Ugc2hvdWxkIGN5Y2xlIHdoZW4gcmVhY2hpbmcgaXRzIGxpbWl0c1xuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCB0aGUgc2VxdWVuY2Ugd2lsbCByZXN0YXJ0IGZyb20gbWluVmFsdWUgd2hlbiByZWFjaGluZyBtYXhWYWx1ZVxuICAgKi9cbiAgY3ljbGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogdW5kZWZpbmVkLFxuICBnZW5lcmF0ZWQ6IGZhbHNlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSBOb25lU2VxdWVuY2VPcHRpb25zO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIG51bWVyaWMgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTnVtZXJpY1NlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBnZW5lcmF0ZWQ6IHRydWUsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgQmlnSW50IHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3IgQmlnSW50IHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IEJpZ0ludFNlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IEJpZ0ludFNlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgTnVtZXJpY1NlcXVlbmNlLFxuICB7XG4gICAgdHlwZTogXCJCaWdJbnRcIixcbiAgfVxuKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBjb21wYXJpbmcgdmFsdWVzIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBPcGVyYXRvciB7XG4gIC8qKiBFcXVhbCBjb21wYXJpc29uICg9KSAqL1xuICBFUVVBTCA9IFwiRVFVQUxcIixcbiAgLyoqIE5vdCBlcXVhbCBjb21wYXJpc29uICghPSkgKi9cbiAgRElGRkVSRU5UID0gXCJESUZGRVJFTlRcIixcbiAgLyoqIEdyZWF0ZXIgdGhhbiBjb21wYXJpc29uICg+KSAqL1xuICBCSUdHRVIgPSBcIkJJR0dFUlwiLFxuICAvKiogR3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKD49KSAqL1xuICBCSUdHRVJfRVEgPSBcIkJJR0dFUl9FUVwiLFxuICAvKiogTGVzcyB0aGFuIGNvbXBhcmlzb24gKDwpICovXG4gIFNNQUxMRVIgPSBcIlNNQUxMRVJcIixcbiAgLyoqIExlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg8PSkgKi9cbiAgU01BTExFUl9FUSA9IFwiU01BTExFUl9FUVwiLFxuICAvLyBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIC8qKiBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKSAqL1xuICBOT1QgPSBcIk5PVFwiLFxuICAvKiogSW5jbHVzaW9uIG9wZXJhdG9yIChJTikgKi9cbiAgSU4gPSBcIklOXCIsXG4gIC8vIElTID0gXCJJU1wiLFxuICAvKiogUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nICovXG4gIFJFR0VYUCA9IFwiUkVHRVhQXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvZ2ljYWwgb3BlcmF0b3JzIGZvciBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9uc1xuICogQHN1bW1hcnkgRW51bSBkZWZpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgY29uZGl0aW9ucyBpbiBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gR3JvdXBPcGVyYXRvciB7XG4gIC8qKiBMb2dpY2FsIEFORCBvcGVyYXRvciAtIGFsbCBjb25kaXRpb25zIG11c3QgYmUgdHJ1ZSAqL1xuICBBTkQgPSBcIkFORFwiLFxuICAvKiogTG9naWNhbCBPUiBvcGVyYXRvciAtIGF0IGxlYXN0IG9uZSBjb25kaXRpb24gbXVzdCBiZSB0cnVlICovXG4gIE9SID0gXCJPUlwiLFxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gZHVyaW5nIHF1ZXJ5IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHF1ZXJ5IGJ1aWxkaW5nIG9yIGV4ZWN1dGlvblxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAY2xhc3MgUXVlcnlFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUXVlcnlFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBRdWVyeUVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGR1cmluZyBwYWdpbmF0aW9uIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHBhZ2luYXRpb24gc2V0dXAgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBQYWdpbmdFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFnaW5nRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUGFnaW5nRXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXR0cmlidXRlT3B0aW9uLCBDb25kaXRpb25CdWlsZGVyT3B0aW9uIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uYWxBc3luYyxcbiAgTW9kZWwsXG4gIE1vZGVsRXJyb3JEZWZpbml0aW9uLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxudHlwZSBJbmZlckFzeW5jPE0+ID0gTSBleHRlbmRzIE1vZGVsPGluZmVyIEE+ID8gQSA6IGZhbHNlO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25kaXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IEEgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgcXVlcnkgY29uZGl0aW9ucyB3aXRoIHN1cHBvcnQgZm9yIGNvbXBsZXggbG9naWNhbCBvcGVyYXRpb25zLlxuICogVGhpcyBjbGFzcyBhbGxvd3MgZm9yIGJ1aWxkaW5nIGFuZCBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9ucyB1c2luZyBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUiwgTk9UKVxuICogYW5kIGNvbXBhcmlzb24gb3BlcmF0b3JzIChlcXVhbHMsIG5vdCBlcXVhbHMsIGdyZWF0ZXIgdGhhbiwgZXRjLikuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbmRpdGlvbjxNPn0gYXR0cjEgLSBUaGUgYXR0cmlidXRlIG5hbWUgb3IgYSBuZXN0ZWQgY29uZGl0aW9uXG4gKiBAcGFyYW0ge09wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcn0gb3BlcmF0b3IgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gKiBAcGFyYW0ge2FueX0gY29tcGFyaXNvbiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3Qgb3IgYW5vdGhlciBjb25kaXRpb25cbiAqIEBjbGFzcyBDb25kaXRpb25cbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzaW1wbGUgY29uZGl0aW9uXG4gKiBjb25zdCBuYW1lQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcIm5hbWVcIikuZXEoXCJKb2huXCIpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGNvbXBsZXggY29uZGl0aW9uXG4gKiBjb25zdCBjb21wbGV4Q29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcImFnZVwiKS5ndCgxOClcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICogY29uc3QgdXNlclF1ZXJ5ID0gQ29uZGl0aW9uLmJ1aWxkZXIoKVxuICogICAuYXR0cmlidXRlKFwiZW1haWxcIikucmVnZXhwKFwiLipAZXhhbXBsZS5jb21cIilcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwibGFzdExvZ2luXCIpLmd0KG5ldyBEYXRlKFwiMjAyMy0wMS0wMVwiKSkpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZXZcbiAqICAgcGFydGljaXBhbnQgQ29uZGl0aW9uXG4gKiAgIERldi0+PkNvbmRpdGlvbjogYnVpbGRlcigpLmF0dHJpYnV0ZShcImFnZVwiKS5ndCgxOClcbiAqICAgQ29uZGl0aW9uLS0+PkRldjogQ29uZGl0aW9uKGFnZSA+IDE4KVxuICogICBEZXYtPj5Db25kaXRpb246IC5hbmQoYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKVxuICogICBDb25kaXRpb24tLT4+RGV2OiBDb25kaXRpb24oKGFnZSA+IDE4KSBBTkQgKHN0YXR1cyA9IFwiYWN0aXZlXCIpKVxuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbDxhbnk+PiBleHRlbmRzIE1vZGVsPEluZmVyQXN5bmM8TT4+IHtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGF0dHIxPzogc3RyaW5nIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgb3BlcmF0b3I/OiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IgPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBjb21wYXJpc29uPzogYW55ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yLFxuICAgIGNvbXBhcmlzb246IGFueVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXR0cjEgPSBhdHRyMTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy5jb21wYXJpc29uID0gY29tcGFyaXNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgQU5EXG4gICAqIEBzdW1tYXJ5IEpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gQU5EIG9wZXJhdG9yLCByZXF1aXJpbmcgYm90aCB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIGFuZChjb25kaXRpb246IENvbmRpdGlvbjxNPik6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hbmQodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgT1JcbiAgICogQHN1bW1hcnkgSm9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBPUiBvcGVyYXRvciwgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgb3IoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24ub3IodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5lZ2F0aW9uIGNvbmRpdGlvblxuICAgKiBAc3VtbWFyeSBFeGNsdWRlcyBhIHZhbHVlIGZyb20gdGhlIHJlc3VsdCBieSBhcHBseWluZyBhIE5PVCBvcGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIG5lZ2F0ZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE5PVCBvcGVyYXRpb25cbiAgICovXG4gIG5vdCh2YWw6IGFueSk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24odGhpcywgT3BlcmF0b3IuTk9ULCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhlIGNvbmRpdGlvbiBhbmQgY2hlY2tzIGZvciBlcnJvcnNcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGUgY29uZGl0aW9uIGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gey4uLnN0cmluZ1tdfSBleGNlcHRpb25zIC0gRmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICAuLi5leGNlcHRpb25zOiBzdHJpbmdbXVxuICApOiBDb25kaXRpb25hbEFzeW5jPEluZmVyQXN5bmM8TT4sIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY29uZGl0aW9uQ2hlY2sgPSAoKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZE9wTWVzc2FnZSA9IGBJbnZhbGlkIG9wZXJhdG9yICR7dGhpcy5vcGVyYXRvcn19YDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dHIxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhcmlzb24gaW5zdGFuY2VvZiBDb25kaXRpb24pXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICAgIFwiQm90aCBzaWRlcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoT3BlcmF0b3IpLmluZGV4T2YodGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcikgPT09IC0xKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmF0dHIxIGluc3RhbmNlb2YgQ29uZGl0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiZcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wYXJpc29uOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoR3JvdXBPcGVyYXRvcikuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBzdXBlci5oYXNFcnJvcnMoLi4uZXhjZXB0aW9ucyk7XG4gICAgaWYgKCF0aGlzLmlzQXN5bmMoKSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlcnJvcnMgYXMgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQpID8/XG4gICAgICAgIChjb25kaXRpb25DaGVjaygpIGFzIGFueSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBlcnJvcnMgYXMgdW5rbm93biBhcyBQcm9taXNlPE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPlxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNvbHZlZCA/PyBjb25kaXRpb25DaGVjaygpO1xuICAgIH0pKCkgYXMgQ29uZGl0aW9uYWxBc3luYzxJbmZlckFzeW5jPE0+LCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIEFORFxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgam9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBBTkQgb3BlcmF0b3IsIHJlcXVpcmluZyBib3RoIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBhbmQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLkFORCwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIE9SXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBqb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIE9SIG9wZXJhdG9yLCByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24uZ3JvdXAoY29uZGl0aW9uMSwgR3JvdXBPcGVyYXRvci5PUiwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgZ3JvdXBzIHR3byBjb25kaXRpb25zIHdpdGggYSBzcGVjaWZpZWQgb3BlcmF0b3JcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBzdGF0aWMgbWV0aG9kIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZCBncm91cCBvcGVyYXRvclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0dyb3VwT3BlcmF0b3J9IG9wZXJhdG9yIC0gVGhlIGdyb3VwIG9wZXJhdG9yIHRvIHVzZSAoQU5ELCBPUilcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyb3VwZWQgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBncm91cDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvcixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbihjb25kaXRpb24xLCBvcGVyYXRvciwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb25kaXRpb24gYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBtb2RlbCBhdHRyaWJ1dGVcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHJpYnV0ZTxNIGV4dGVuZHMgTW9kZWw+KGF0dHI6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbi5CdWlsZGVyPE0+KCkuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICogQHN1bW1hcnkgU2hvcnRoYW5kIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHI8TSBleHRlbmRzIE1vZGVsPihhdHRyOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhIGZsdWVudCBBUEkgdG8gYnVpbGQgcXVlcnkgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBBIGJ1aWxkZXIgY2xhc3MgdGhhdCBzaW1wbGlmaWVzIHRoZSBjcmVhdGlvbiBvZiBkYXRhYmFzZSBxdWVyeSBjb25kaXRpb25zXG4gICAqIHdpdGggYSBjaGFpbmFibGUgaW50ZXJmYWNlIGZvciBzZXR0aW5nIGF0dHJpYnV0ZXMgYW5kIG9wZXJhdG9yc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgb3BlcmF0ZXMgb25cbiAgICogQGNsYXNzIENvbmRpdGlvbkJ1aWxkZXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgPSBjbGFzcyBDb25kaXRpb25CdWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD5cbiAgICBpbXBsZW1lbnRzIENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4sIEF0dHJpYnV0ZU9wdGlvbjxNPlxuICB7XG4gICAgYXR0cjE/OiBrZXlvZiBNIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICAgIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYXR0cmlidXRlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIG1vZGVsIGF0dHJpYnV0ZSB0aGUgY29uZGl0aW9uIHdpbGwgb3BlcmF0ZSBvblxuICAgICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byB1c2UgaW4gdGhlIGNvbmRpdGlvblxuICAgICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gVGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGUoYXR0cjoga2V5b2YgTSk6IEF0dHJpYnV0ZU9wdGlvbjxNPiB7XG4gICAgICB0aGlzLmF0dHIxID0gYXR0cjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICAgKiBAc3VtbWFyeSBTaG9ydGhhbmQgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggbW9kZWwgYXR0cmlidXRlIHRoZSBjb25kaXRpb24gd2lsbCBvcGVyYXRlIG9uXG4gICAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIHVzZSBpbiB0aGUgY29uZGl0aW9uXG4gICAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBUaGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgICAqL1xuICAgIGF0dHIoYXR0cjoga2V5b2YgTSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGVxKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5FUVVBTCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBkaWYodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkRJRkZFUkVOVCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdyZWF0ZXIgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgZ3QodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxlc3MgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGxlc3MgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgbHQodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVIsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGd0ZSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuQklHR0VSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBsdGUodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5jbHVzaW9uIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpZWQgYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgLSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIGNoZWNrIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGluY2x1c2lvbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgaW4oYXJyOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuSU4sIGFycik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGFyaXNvblxuICAgICAqL1xuICAgIHJlZ2V4cCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuUkVHRVhQLCBuZXcgUmVnRXhwKHZhbCkuc291cmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb3BlcmF0b3IgYW5kIGNvbXBhcmlzb24gdmFsdWUgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBQcml2YXRlIG1ldGhvZCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3AgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRPcChvcDogT3BlcmF0b3IsIHZhbDogYW55KSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gb3A7XG4gICAgICB0aGlzLmNvbXBhcmlzb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RzIGEgQ29uZGl0aW9uIGluc3RhbmNlIGZyb20gdGhlIGJ1aWxkZXIncyBzdGF0ZVxuICAgICAqIEBzdW1tYXJ5IEZpbmFsaXplcyB0aGUgY29uZGl0aW9uIGJ1aWxkaW5nIHByb2Nlc3MgYnkgY3JlYXRpbmcgYSBuZXcgQ29uZGl0aW9uIGluc3RhbmNlXG4gICAgICogQHRocm93cyB7UXVlcnlFcnJvcn0gSWYgdGhlIGNvbmRpdGlvbiBjYW5ub3QgYmUgYnVpbHQgZHVlIHRvIGludmFsaWQgcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGluc3RhbmNlIHdpdGggdGhlIGNvbmZpZ3VyZWQgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGQoKTogQ29uZGl0aW9uPE0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIHRoaXMuYXR0cjEgYXMgc3RyaW5nIHwgQ29uZGl0aW9uPE0+LFxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgT3BlcmF0b3IsXG4gICAgICAgICAgdGhpcy5jb21wYXJpc29uIGFzIGFueVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgd2lsbCBvcGVyYXRlIG9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT59IEEgbmV3IGNvbmRpdGlvbiBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGRlcjxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXI8TT4oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHVwZGF0ZXMgYSBtb2RlbCBpbnN0YW5jZVxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHByaW1hcnkga2V5XG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZSBvciB1cGRhdGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1JlcG88TSwgRiwgQ29udGV4dDxGPj59IFtyZXBvc2l0b3J5XSAtIE9wdGlvbmFsIHJlcG9zaXRvcnkgdG8gdXNlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBvciB1cGRhdGVkIG1vZGVsXG4gKiBAZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICpcbiAqICAgQ2FsbGVyLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsLCBjb250ZXh0LCByZXBvc2l0b3J5P1xuICogICBhbHQgcmVwb3NpdG9yeSBub3QgcHJvdmlkZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+Pk1vZGVsOiBnZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSlcbiAqICAgICBNb2RlbC0tPj5jcmVhdGVPclVwZGF0ZTogY29uc3RydWN0b3JcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKGNvbnN0cnVjdG9yKVxuICogICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHJlcG9zaXRvcnlcbiAqICAgZW5kXG4gKlxuICogICBhbHQgcHJpbWFyeSBrZXkgdW5kZWZpbmVkXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICBlbHNlIHByaW1hcnkga2V5IGRlZmluZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IHVwZGF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICBhbHQgdXBkYXRlIHN1Y2Nlc3NmdWxcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHVwZGF0ZWQgbW9kZWxcbiAqICAgICBlbHNlIE5vdEZvdW5kRXJyb3JcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGNyZWF0ZU9yVXBkYXRlLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4+KFxuICBtb2RlbDogTSxcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgYWxpYXM/OiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk/OiBSZXBvPE0sIEYsIENvbnRleHQ8Rj4+XG4pOiBQcm9taXNlPE0+IHtcbiAgaWYgKCFyZXBvc2l0b3J5KSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWw8TSwgUmVwbzxNPj4oXG4gICAgICBjb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIE1vZGVsQ29uc3RydWN0b3I8TT4sXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2RlbFtyZXBvc2l0b3J5LnBrXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXR1cm4gcmVwb3NpdG9yeS5jcmVhdGUobW9kZWwsIGNvbnRleHQpO1xuICBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudXBkYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgY3JlYXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIGNyZWF0aW5nIGEgbmV3IG9uZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPbkNyZWF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5Nb2RlbDogZ2V0KGRhdGEuY2xhc3MpXG4gKiAgICAgTW9kZWwtLT4+b25lVG9PbmVPbkNyZWF0ZTogY29uc3RydWN0b3JcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG86IGNyZWF0ZShwcm9wZXJ0eVZhbHVlKVxuICogICAgIHJlcG8tLT4+b25lVG9PbmVPbkNyZWF0ZTogY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogY3JlYXRlZFxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHBrXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBjcmVhdGVkW3BrXVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGF0YS5jbGFzcyA9XG4gICAgdHlwZW9mIGRhdGEuY2xhc3MgPT09IFwic3RyaW5nXCIgPyBkYXRhLmNsYXNzIDogKGRhdGEuY2xhc3MgYXMgYW55KSgpLm5hbWU7XG5cbiAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZGF0YS5jbGFzcyBhcyBzdHJpbmcpO1xuICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke2RhdGEuY2xhc3N9YCk7XG4gIGNvbnN0IHJlcG86IFJlcG88YW55PiA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShwcm9wZXJ0eVZhbHVlKTtcbiAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShjcmVhdGVkKS5pZDtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGNyZWF0ZWRbcGtdLCBjcmVhdGVkKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNyZWF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHVwZGF0ZXNcbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIHVwZGF0aW5nIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPblVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25VcGRhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPblVwZGF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uVXBkYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jcmVhdGVPclVwZGF0ZTogbW9kZWxba2V5XSwgY29udGV4dFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvT25lT25VcGRhdGU6IHVwZGF0ZWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+ZmluZFByaW1hcnlLZXk6IHVwZGF0ZWRcbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb09uZU9uVXBkYXRlOiBwa1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHVwZGF0ZWRbcGtdLCB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IHNldCBtb2RlbFtrZXldID0gdXBkYXRlZFtwa11cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKFxuICAgIG1vZGVsW2tleV0gYXMgTSxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KHVwZGF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdXBkYXRlZFtwa10gYXMgc3RyaW5nLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIHRoZSByZWxhdGVkIG1vZGVsIGlmIGNhc2NhZGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25EZWxldGU6IGlubmVyUmVwb1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldW2lubmVyUmVwby5wa10sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBkZWxldGVkW2lubmVyUmVwby5wa10sIGRlbGV0ZWRcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgaW5uZXJSZXBvOiBSZXBvPE0+ID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZywgY29udGV4dCk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW2lubmVyUmVwby5wayBhcyBrZXlvZiBNXSBhcyBzdHJpbmcsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKFxuICAgIGNvbnRleHQsXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIGRlbGV0ZWRbaW5uZXJSZXBvLnBrXSBhcyBzdHJpbmcsXG4gICAgZGVsZXRlZFxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGV4aXN0aW5nIG1vZGVscyBvciBjcmVhdGluZyBuZXcgb25lc1xuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBvbmVUb01hbnlPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uQ3JlYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGFsdCBhcnJheVR5cGUgaXMgbm90IFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlcG9cbiAqICAgICBsb29wIGZvciBlYWNoIGlkIGluIHVuaXF1ZVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5yZXBvOiByZWFkKGlkKVxuICogICAgICAgcmVwby0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVhZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkXG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBlbHNlIGFycmF5VHlwZSBpcyBcIm9iamVjdFwiXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogcHJvcGVydHlWYWx1ZXNbMF1cbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcGtOYW1lXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY3JlYXRlIHJlc3VsdCBzZXRcbiAqICAgICBsb29wIGZvciBlYWNoIG0gaW4gcHJvcGVydHlWYWx1ZXNcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG0sIGNvbnRleHRcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBhZGQgcmVjb3JkW3BrTmFtZV0gdG8gcmVzdWx0XG4gKiAgICAgZW5kXG4gKiAgICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4ucmVzdWx0XVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMgfHwgIXByb3BlcnR5VmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZXNbMF07XG4gIGlmICghcHJvcGVydHlWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gdHlwZW9mIGl0ZW0gPT09IGFycmF5VHlwZSkpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgSW52YWxpZCBvcGVyYXRpb24uIEFsbCBlbGVtZW50cyBvZiBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IG11c3QgbWF0Y2ggdGhlIHNhbWUgdHlwZS5gXG4gICAgKTtcbiAgY29uc3QgdW5pcXVlVmFsdWVzID0gbmV3IFNldChbLi4ucHJvcGVydHlWYWx1ZXNdKTtcbiAgaWYgKGFycmF5VHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzKSB7XG4gICAgICBjb25zdCByZWFkID0gYXdhaXQgcmVwby5yZWFkKGlkKTtcbiAgICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgcmVhZCk7XG4gICAgfVxuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwa05hbWUgPSBmaW5kUHJpbWFyeUtleShwcm9wZXJ0eVZhbHVlc1swXSkuaWQ7XG5cbiAgY29uc3QgcmVzdWx0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IG0gb2YgcHJvcGVydHlWYWx1ZXMpIHtcbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBjcmVhdGVPclVwZGF0ZShtLCBjb250ZXh0LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCByZWNvcmRbcGtOYW1lXSwgcmVjb3JkKTtcbiAgICByZXN1bHQuYWRkKHJlY29yZFtwa05hbWVdKTtcbiAgfVxuXG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4ucmVzdWx0XTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgdXBkYXRlc1xuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZGVsZWdhdGluZyB0byBvbmVUb01hbnlPbkNyZWF0ZSBpZiBjYXNjYWRlIHVwZGF0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPblVwZGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPblVwZGF0ZS0+Pm9uZVRvTWFueU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICogICAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFwcGx5KHRoaXMsIFtjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXSlcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0tPj5vbmVUb01hbnlPblVwZGF0ZTogdm9pZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjYXNjYWRlIH0gPSBkYXRhO1xuICBpZiAoY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuICByZXR1cm4gb25lVG9NYW55T25DcmVhdGUuYXBwbHkodGhpcyBhcyBhbnksIFtcbiAgICBjb250ZXh0LFxuICAgIGRhdGEsXG4gICAga2V5IGFzIGtleW9mIE1vZGVsLFxuICAgIG1vZGVsLFxuICBdKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgZGVsZXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIGFsbCByZWxhdGVkIG1vZGVscyBpZiBjYXNjYWRlIGRlbGV0ZSBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uRGVsZXRlXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb01hbnlPbkRlbGV0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBjYXNjYWRlLmRlbGV0ZSBpcyBDQVNDQURFXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIHZhbHVlcyBleGlzdHMgYW5kIGhhcyBsZW5ndGhcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgYWxsIGVsZW1lbnRzIGhhdmUgc2FtZSB0eXBlXG4gKlxuICogICBhbHQgaXNJbnN0YW50aWF0ZWQgKGFycmF5VHlwZSBpcyBcIm9iamVjdFwiKVxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwodmFsdWVzWzBdKVxuICogICAgIFJlcG9zaXRvcnktLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZWxzZSBub3QgaW5zdGFudGlhdGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiByZXBvXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY3JlYXRlIHVuaXF1ZVZhbHVlcyBzZXRcbiAqXG4gKiAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5yZXBvOiBkZWxldGUoaWQsIGNvbnRleHQpXG4gKiAgICAgcmVwby0tPj5vbmVUb01hbnlPbkRlbGV0ZTogZGVsZXRlZFxuICogICAgIG9uZVRvTWFueU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZFxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IHNldCBtb2RlbFtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc11cbiAqICAgb25lVG9NYW55T25EZWxldGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkRlbGV0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGF0YS5jYXNjYWRlLmRlbGV0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIGNvbnN0IHZhbHVlcyA9IG1vZGVsW2tleV0gYXMgYW55O1xuICBpZiAoIXZhbHVlcyB8fCAhdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBhcnJheVR5cGUgPSB0eXBlb2YgdmFsdWVzWzBdO1xuICBjb25zdCBhcmVBbGxTYW1lVHlwZSA9IHZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKTtcbiAgaWYgKCFhcmVBbGxTYW1lVHlwZSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCBpc0luc3RhbnRpYXRlZCA9IGFycmF5VHlwZSA9PT0gXCJvYmplY3RcIjtcbiAgY29uc3QgcmVwbyA9IGlzSW5zdGFudGlhdGVkXG4gICAgPyBSZXBvc2l0b3J5LmZvck1vZGVsKHZhbHVlc1swXSwgdGhpcy5hZGFwdGVyLmFsaWFzKVxuICAgIDogcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIGtleSwgdGhpcy5hZGFwdGVyLmFsaWFzKTtcblxuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oaXNJbnN0YW50aWF0ZWRcbiAgICAgID8gdmFsdWVzLm1hcCgodjogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdltyZXBvLnBrIGFzIHN0cmluZ10pXG4gICAgICA6IHZhbHVlcyksXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgaWQgb2YgdW5pcXVlVmFsdWVzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgZGVsZXRlZCA9IGF3YWl0IHJlcG8uZGVsZXRlKGlkLCBjb250ZXh0KTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIGRlbGV0ZWQpO1xuICB9XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEga2V5IGZvciBjYWNoaW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgdW5pcXVlIGtleSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBwb3B1bGF0ZWQgbW9kZWwgcmVsYXRpb25zaGlwcyBpbiB0aGUgY2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHJldHVybiB7c3RyaW5nfSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9wdWxhdGVLZXkoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuKSB7XG4gIHJldHVybiBbUGVyc2lzdGVuY2VLZXlzLlBPUFVMQVRFLCB0YWJsZU5hbWUsIGZpZWxkTmFtZSwgaWRdLmpvaW4oXCIuXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDYWNoZXMgYSBtb2RlbCBmb3IgbGF0ZXIgcG9wdWxhdGlvblxuICogQHN1bW1hcnkgU3RvcmVzIGEgbW9kZWwgaW4gdGhlIGNvbnRleHQgY2FjaGUgZm9yIGVmZmljaWVudCByZXRyaWV2YWwgZHVyaW5nIHJlbGF0aW9uc2hpcCBwb3B1bGF0aW9uXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtNfSBwYXJlbnRNb2RlbCAtIFRoZSBwYXJlbnQgbW9kZWwgdGhhdCBjb250YWlucyB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBwa1ZhbHVlIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcGFyYW0ge2FueX0gY2FjaGVWYWx1ZSAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjYWNoZVxuICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGNhY2hlIG9wZXJhdGlvblxuICogQGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZU1vZGVsRm9yUG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbj4oXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIHBhcmVudE1vZGVsOiBNLFxuICBwcm9wZXJ0eUtleToga2V5b2YgTSB8IHN0cmluZyxcbiAgcGtWYWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBjYWNoZVZhbHVlOiBhbnlcbikge1xuICBjb25zdCBjYWNoZUtleSA9IGdldFBvcHVsYXRlS2V5KFxuICAgIHBhcmVudE1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nLFxuICAgIHBrVmFsdWVcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQuYWNjdW11bGF0ZSh7IFtjYWNoZUtleV06IGNhY2hlVmFsdWUgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnBvcHVsYXRlKSByZXR1cm47XG4gIGNvbnN0IG5lc3RlZDogYW55ID0gbW9kZWxba2V5XTtcbiAgY29uc3QgaXNBcnIgPSBBcnJheS5pc0FycmF5KG5lc3RlZCk7XG4gIGlmICh0eXBlb2YgbmVzdGVkID09PSBcInVuZGVmaW5lZFwiIHx8IChpc0FyciAmJiBuZXN0ZWQubGVuZ3RoID09PSAwKSkgcmV0dXJuO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgYzogQ29udGV4dDxGPixcbiAgICBtb2RlbDogTSxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIHByb3BLZXlWYWx1ZXM6IGFueVtdLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIGxldCBjYWNoZUtleTogc3RyaW5nO1xuICAgIGxldCB2YWw6IGFueTtcbiAgICBjb25zdCByZXN1bHRzOiBNW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb0tleVZhbHVlIG9mIHByb3BLZXlWYWx1ZXMpIHtcbiAgICAgIGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkobW9kZWwuY29uc3RydWN0b3IubmFtZSwgcHJvcE5hbWUsIHByb0tleVZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbCA9IGF3YWl0IGMuZ2V0KGNhY2hlS2V5IGFzIGFueSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBjb25zdCByZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEobW9kZWwsIHByb3BOYW1lLCBhbGlhcyk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTGlzdCBvZiBjb21tb24gSmF2YVNjcmlwdCB0eXBlc1xuICogQHN1bW1hcnkgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgY29tbW9uIEphdmFTY3JpcHQgdHlwZXMgdGhhdCBhcmUgbm90IGN1c3RvbSBtb2RlbCB0eXBlc1xuICogQGNvbnN0IGNvbW1vbVR5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuY29uc3QgY29tbW9tVHlwZXMgPSBbXG4gIFwiYXJyYXlcIixcbiAgXCJzdHJpbmdcIixcbiAgXCJudW1iZXJcIixcbiAgXCJib29sZWFuXCIsXG4gIFwic3ltYm9sXCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJvYmplY3RcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJudWxsXCIsXG4gIFwiYmlnaW50XCIsXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsIHByb3BlcnR5IGJhc2VkIG9uIGl0cyB0eXBlIG1ldGFkYXRhXG4gKiBAc3VtbWFyeSBFeGFtaW5lcyBhIG1vZGVsIHByb3BlcnR5J3MgdHlwZSBtZXRhZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgZm9yIHJlbGF0ZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHthbnl9IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGV4YW1pbmVcbiAqIEByZXR1cm4ge1JlcG88TT59IEEgcmVwb3NpdG9yeSBmb3IgdGhlIG1vZGVsIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IFJlZmxlY3RcbiAqICAgcGFydGljaXBhbnQgVmFsaWRhdGlvblxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BlcnR5S2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlZhbGlkYXRpb246IGtleShBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSkgPyBWYWxpZGF0aW9uS2V5cy5MSVNUIDogVmFsaWRhdGlvbktleXMuVFlQRSlcbiAqICAgVmFsaWRhdGlvbi0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdmFsaWRhdGlvbktleVxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZWZsZWN0OiBnZXRNZXRhZGF0YSh2YWxpZGF0aW9uS2V5LCBtb2RlbCwgcHJvcGVydHlLZXkpXG4gKiAgIFJlZmxlY3QtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHR5cGVzXG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBkZXRlcm1pbmUgY3VzdG9tVHlwZXMgYmFzZWQgb24gcHJvcGVydHkgdHlwZVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiB0eXBlcyBhbmQgY3VzdG9tVHlwZXMgZXhpc3RcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNyZWF0ZSBhbGxvd2VkVHlwZXMgYXJyYXlcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogZmluZCBjb25zdHJ1Y3Rvck5hbWUgbm90IGluIGNvbW1vbVR5cGVzXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yTmFtZSBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+TW9kZWw6IGdldChjb25zdHJ1Y3Rvck5hbWUpXG4gKiAgIE1vZGVsLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjb25zdHJ1Y3RvclxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBjaGVjayBpZiBjb25zdHJ1Y3RvciBleGlzdHNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgIFJlcG9zaXRvcnktLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IHJlcG9cbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+PkNhbGxlcjogcmVwb1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcGVydHlLZXk6IHN0cmluZyB8IGtleW9mIE0sXG4gIGFsaWFzPzogc3RyaW5nXG4pOiBSZXBvPE0+IHtcbiAgY29uc3QgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIFZhbGlkYXRpb24ua2V5KFxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICA6IFZhbGlkYXRpb25LZXlzLlRZUEVcbiAgICApLFxuICAgIG1vZGVsLFxuICAgIHByb3BlcnR5S2V5IGFzIHN0cmluZ1xuICApO1xuICBjb25zdCBjdXN0b21UeXBlczogYW55ID0gQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eUtleV0pXG4gICAgPyB0eXBlcy5jbGF6elxuICAgIDogdHlwZXMuY3VzdG9tVHlwZXM7XG4gIGlmICghdHlwZXMgfHwgIWN1c3RvbVR5cGVzKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmaW5kIHR5cGVzIGRlY29yYXRvcnMgZm9yIHByb3BlcnR5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfWBcbiAgICApO1xuXG4gIGNvbnN0IGFsbG93ZWRUeXBlczogc3RyaW5nW10gPSAoXG4gICAgQXJyYXkuaXNBcnJheShjdXN0b21UeXBlcykgPyBbLi4uY3VzdG9tVHlwZXNdIDogW2N1c3RvbVR5cGVzXVxuICApLm1hcCgodCkgPT4gKHR5cGVvZiB0ID09PSBcImZ1bmN0aW9uXCIgPyB0KCkgOiB0KSk7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGFsbG93ZWRUeXBlcy5maW5kKFxuICAgICh0KSA9PiAhY29tbW9tVHlwZXMuaW5jbHVkZXMoYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIGlmICghY29uc3RydWN0b3JOYW1lKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFByb3BlcnR5IGtleSAke3Byb3BlcnR5S2V5IGFzIHN0cmluZ30gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGNvbnN0cnVjdG9yIHR5cGVgXG4gICAgKTtcbiAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPE0+IHwgdW5kZWZpbmVkID0gTW9kZWwuZ2V0KGNvbnN0cnVjdG9yTmFtZSk7XG4gIGlmICghY29uc3RydWN0b3IpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7Y29uc3RydWN0b3JOYW1lfWApO1xuXG4gIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCBhbGlhcyk7XG59XG5cbiIsImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgb25EZWxldGUsXG4gIG9uVXBkYXRlLFxuICBhZnRlckFueSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0LFxuICB0aW1lc3RhbXAsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgSm9pbkNvbHVtbk9wdGlvbnMsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IHNldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cyAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3NcbiAqIEBmdW5jdGlvbiB0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlPE9QVFMgPSBzdHJpbmc+KG9wdHM6IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWV0YWRhdGEsXG4gICAgICBhcmdzOiBba2V5LCBvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KG5hbWU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW11cbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW10sXG4gIG5hbWU6IHN0cmluZ1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChjb21wb3NpdGlvbnM6IHN0cmluZ1tdKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgY29tcG9zaXRpb25zOiBzdHJpbmdbXSxcbiAgbmFtZTogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbmFtZT86IHN0cmluZ1xuKSB7XG4gIGZ1bmN0aW9uIGluZGV4KFxuICAgIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb3NpdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBjb21wb3NpdGlvbnM7XG4gICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY29tcG9zaXRpb25zICYmIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGlyZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChkKSA9PiAhW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXS5pbmNsdWRlcyhkIGFzIGFueSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvc2l0aW9ucyA9IGRpcmVjdGlvbnMgYXMgc3RyaW5nW107XG4gICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5JTkRFWClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5kZXgsXG4gICAgICBhcmdzOiBbZGlyZWN0aW9ucywgY29tcG9zaXRpb25zLCBuYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmZvcmNlcyB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgZHVyaW5nIG1vZGVsIGNyZWF0aW9uIGFuZCB1cGRhdGVcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHVuaXF1ZSBkZWNvcmF0b3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2VcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIG1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlIG9yIHJlamVjdHMgd2l0aCBhIENvbmZsaWN0RXJyb3JcbiAqIEBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSkuZXEobW9kZWxba2V5XSkpXG4gICAgLmV4ZWN1dGUoKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlbnN1cmVzIGEgcHJvcGVydHkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdW5pcXVlKClcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoW09wZXJhdGlvbktleXMuQ1JFQVRFXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAb25lVG9PbmUoUHJvZmlsZSlcbiAqICAgcHJvZmlsZSE6IHN0cmluZyB8IFByb2ZpbGU7XG4gKiB9XG4gKlxuICogY2xhc3MgUHJvZmlsZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIGJpbyE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbiAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBmdW5jdGlvbiBvbmVUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhLmpvaW5UYWJsZSA9IGpvaW5Db2x1bW5PcHRzO1xuICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIG1ldGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pbkNvbHVtbk9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenogYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgIFN0cmluZyxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEJpZ2ludCBpcyBub3QgYSBjb25zdHJ1Y3RvclxuICAgICAgICBCaWdJbnQsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcblxuICBmdW5jdGlvbiBtYW55VG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGlmICghY2xhenoubmFtZSlcbiAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yPE0+KSgpIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBtYW55VG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQWxsKHBvcHVsYXRlLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pblRhYmxlT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucyxcbiAgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7XG4gIERCS2V5cyxcbiAgR3JvdXBTb3J0LFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgcmVhZG9ubHksXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbmNvbnN0IGRlZmF1bHRQa1ByaW9yaXR5ID0gNjA7IC8vIERlZmF1bHQgcHJpb3JpdHkgZm9yIHByaW1hcnkga2V5IHRvIHJ1biBsYXR0ZXIgdGhhbiBvdGhlciBwcm9wZXJ0aWVzXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmltYXJ5IGtleSBjcmVhdGlvblxuICogQHN1bW1hcnkgSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcHJpbWFyeSBrZXkgdmFsdWVzIGZvciBtb2RlbHMgdXNpbmcgc2VxdWVuY2VzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSB0aGF0IGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIHRoYXQgZXh0ZW5kcyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBzZXF1ZW5jZSBvcHRpb25zXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgYXMgcHJpbWFyeSBrZXlcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIHNldFxuICogQGZ1bmN0aW9uIHBrT25DcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHBrT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTZXF1ZW5jZVxuICpcbiAqICAgTW9kZWwtPj5wa09uQ3JlYXRlOiBDYWxsIHdpdGggbW9kZWwgaW5zdGFuY2VcbiAqICAgTm90ZSBvdmVyIHBrT25DcmVhdGU6IENoZWNrIGlmIGtleSBhbHJlYWR5IGV4aXN0c1xuICogICBhbHQgS2V5IGV4aXN0cyBvciBubyB0eXBlIHNwZWNpZmllZFxuICogICAgIHBrT25DcmVhdGUtLT4+TW9kZWw6IFJldHVybiBlYXJseVxuICogICBlbHNlIEtleSBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PnBrT25DcmVhdGU6IEdlbmVyYXRlIHNlcXVlbmNlIG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PkFkYXB0ZXI6IFJlcXVlc3QgU2VxdWVuY2UoZGF0YSlcbiAqICAgICBBZGFwdGVyLT4+U2VxdWVuY2U6IENyZWF0ZSBzZXF1ZW5jZVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBzZXF1ZW5jZVxuICogICAgIHBrT25DcmVhdGUtPj5TZXF1ZW5jZTogQ2FsbCBuZXh0KClcbiAqICAgICBTZXF1ZW5jZS0tPj5wa09uQ3JlYXRlOiBSZXR1cm4gbmV4dCB2YWx1ZVxuICogICAgIHBrT25DcmVhdGUtPj5Nb2RlbDogU2V0IHByaW1hcnkga2V5IHZhbHVlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGtPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFNlcXVlbmNlT3B0aW9ucyxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgIWRhdGEuZ2VuZXJhdGVkIHx8IG1vZGVsW2tleV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXRQcmltYXJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgbGV0IHNlcXVlbmNlOiBTZXF1ZW5jZTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAgc2V0UHJpbWFyeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBLZXkgRGVjb3JhdG9yXG4gKiBAc3VtbWFyeSBNYXJrcyBhIHByb3BlcnR5IGFzIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5IHdpdGggYXV0b21hdGljIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNvbWJpbmVzIG11bHRpcGxlIGJlaGF2aW9yczogaXQgbWFya3MgdGhlIHByb3BlcnR5IGFzIHVuaXF1ZSwgcmVxdWlyZWQsXG4gKiBhbmQgZW5zdXJlcyB0aGUgaW5kZXggaXMgY3JlYXRlZCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHNlcXVlbmNlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09taXQ8U2VxdWVuY2VPcHRpb25zLCBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiPn0gb3B0cyAtIE9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtb2RlbCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gcGtcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBwaygpXG4gKiAgIGlkITogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBrKFxuICBvcHRzOiBPbWl0PFxuICAgIFNlcXVlbmNlT3B0aW9ucyxcbiAgICBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiXG4gID4gPSBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4pIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsIG9wdHMsIHtcbiAgICBnZW5lcmF0ZWQ6XG4gICAgICBvcHRzLnR5cGUgJiYgdHlwZW9mIG9wdHMuZ2VuZXJhdGVkID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IG9wdHMuZ2VuZXJhdGVkIHx8IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMuZ2VuZXJhdGVkLFxuICB9KSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcbiAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zLCBncm91cHNvcnQ/OiBHcm91cFNvcnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBpbmRleChbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdKSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwgb3B0aW9ucyksXG4gICAgICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdGlvbnMsIGdyb3Vwc29ydCksXG4gICAgICAgIHByb3BNZXRhZGF0YShEQktleXMuSUQsIGF0dHIpXG4gICAgICApKG9iaiwgYXR0cik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIGFyZ3M6IFtvcHRzLCB7IHByaW9yaXR5OiBkZWZhdWx0UGtQcmlvcml0eSB9XSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgbW9kZWwgY2xhc3MgZm9yIGFsbCBkb21haW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgY2xhc3MgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBhbmQgYWRkcyB0aW1lc3RhbXAgZnVuY3Rpb25hbGl0eS5cbiAqIEFsbCBkb21haW4gbW9kZWxzIGluIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW5oZXJpdCBjb21tb24gcHJvcGVydGllcyBhbmQgYmVoYXZpb3JzLlxuICogQHBhcmFtIHtNb2RlbEFyZzxCYXNlTW9kZWw+fSBhcmcgLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgbW9kZWxcbiAqIEBjbGFzcyBCYXNlTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiAgIFxuICogICBAZW1haWwoKVxuICogICBlbWFpbCE6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNb2RlbEFyZzxVc2VyPikge1xuICogICAgIHN1cGVyKGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IHVzZXJuYW1lOiAnam9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWRcbiAgICovXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkT24hOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFzdCB1cGRhdGUgdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIG1vZGlmaWVkXG4gICAqL1xuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZE9uITogRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8QmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhZ2luZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcGFnaW5hdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbmF2aWdhdGluZyB0aHJvdWdoIHBhZ2luYXRlZCBxdWVyeSByZXN1bHRzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgbmF2aWdhdGlvbiBvZiBwYWdpbmF0ZWQgZGF0YWJhc2UgcXVlcnkgcmVzdWx0cy5cbiAqIEl0IHRyYWNrcyB0aGUgY3VycmVudCBwYWdlLCB0b3RhbCBwYWdlcywgYW5kIHJlY29yZCBjb3VudCwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBtb3ZpbmcgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgcGFnaW5hdG9yIG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFnaW5hdGVkIHF1ZXJ5IChkZWZhdWx0cyB0byBNW10pXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIChkZWZhdWx0cyB0byBhbnkpXG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAcGFyYW0ge1F9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCB0eXBlXG4gKiBAY2xhc3MgUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIGZvciBhIHVzZXIgcXVlcnlcbiAqIGNvbnN0IHVzZXJRdWVyeSA9IGRiLnNlbGVjdCgpLmZyb20oVXNlcik7XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCB1c2VyUXVlcnkucGFnaW5hdGUoMTApOyAvLyAxMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZSBvZiByZXN1bHRzXG4gKiBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBwYWdlXG4gKiBjb25zdCBzZWNvbmRQYWdlID0gYXdhaXQgcGFnaW5hdG9yLm5leHQoKTtcbiAqXG4gKiAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2luYXRpb25cbiAqIGNvbnNvbGUubG9nKGBQYWdlICR7cGFnaW5hdG9yLmN1cnJlbnR9IG9mICR7cGFnaW5hdG9yLnRvdGFsfSwgJHtwYWdpbmF0b3IuY291bnR9IHRvdGFsIHJlY29yZHNgKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3JcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEYXRhYmFzZVxuICpcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXcgUGFnaW5hdG9yKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eilcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogcHJlcGFyZShxdWVyeSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKlxuICogICBDbGllbnQtPj5QYWdpbmF0b3I6IG5leHQoKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHBhZ2UoY3VycmVudCArIDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBleGVjdXRlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICogICBBZGFwdGVyLT4+RGF0YWJhc2U6IGV4ZWN1dGUgcXVlcnlcbiAqICAgRGF0YWJhc2UtLT4+QWRhcHRlcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJldHVybiByZXN1bHRzXG4gKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJldHVybiBwYWdlIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFIgPSBNW10sIFEgPSBhbnk+IHtcbiAgcHJvdGVjdGVkIF9jdXJyZW50UGFnZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF90b3RhbFBhZ2VzITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3JlY29yZENvdW50ITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGltaXQhOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfc3RhdGVtZW50PzogUTtcblxuICBnZXQgY3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBnZXQgdG90YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkQ291bnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN0YXRlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3N0YXRlbWVudCkgdGhpcy5fc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMucXVlcnkpO1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnksIFEsIGFueSwgYW55PixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcXVlcnk6IFEsXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUSk6IFE7XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCArIDEpO1xuICB9XG5cbiAgYXN5bmMgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSh0aGlzLmN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHBhZ2UgPCAxIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpKVxuICAgICAgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFxuICAgICAgICBcIlBhZ2UgbnVtYmVyIGNhbm5vdCBiZSB1bmRlciAxIGFuZCBtdXN0IGJlIGFuIGludGVnZXJcIlxuICAgICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3RvdGFsUGFnZXMgIT09IFwidW5kZWZpbmVkXCIgJiYgcGFnZSA+IHRoaXMuX3RvdGFsUGFnZXMpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIGBPbmx5ICR7dGhpcy5fdG90YWxQYWdlc30gYXJlIGF2YWlsYWJsZS4gQ2Fubm90IGdvIHRvIHBhZ2UgJHtwYWdlfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cblxuICBhYnN0cmFjdCBwYWdlKHBhZ2U/OiBudW1iZXIpOiBQcm9taXNlPFJbXT47XG59XG4iLCJpbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRnJvbVNlbGVjdG9yLFxuICBHcm91cEJ5U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3RvcixcbiAgU2VsZWN0U2VsZWN0b3IsXG59IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIExpbWl0T3B0aW9uLFxuICBNYXhPcHRpb24sXG4gIE1pbk9wdGlvbixcbiAgT2Zmc2V0T3B0aW9uLFxuICBPcmRlckFuZEdyb3VwT3B0aW9uLFxuICBTZWxlY3RPcHRpb24sXG4gIFdoZXJlT3B0aW9uLFxufSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBQYWdpbmF0YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1BhZ2luYXRhYmxlXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgZGF0YWJhc2UgcXVlcnkgc3RhdGVtZW50c1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBhbmQgZXhlY3V0aW5nIGRhdGFiYXNlIHF1ZXJpZXNcbiAqXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIHF1ZXJ5IGJ1aWxkZXIgcGF0dGVybiBmb3IgY29uc3RydWN0aW5nXG4gKiBkYXRhYmFzZSBxdWVyaWVzLiBJdCBzdXBwb3J0cyB2YXJpb3VzIHF1ZXJ5IG9wZXJhdGlvbnMgbGlrZSBzZWxlY3QsIGZyb20sXG4gKiB3aGVyZSwgb3JkZXJCeSwgZ3JvdXBCeSwgbGltaXQsIGFuZCBvZmZzZXQuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIGV4ZWN1dGluZyBxdWVyaWVzIGFuZCBoYW5kbGluZyBwYWdpbmF0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgc3BlY2lmaWMgdG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBzdGF0ZW1lbnQgb3BlcmF0ZXMgb25cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+fSBhZGFwdGVyIC0gVGhlIGRhdGFiYXNlIGFkYXB0ZXIgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQGNsYXNzIFN0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHN0YXRlbWVudCB0byBxdWVyeSB1c2Vyc1xuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFNRTFN0YXRlbWVudChhZGFwdGVyKTtcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZShcInN0YXR1c1wiKS5lcShcImFjdGl2ZVwiKSlcbiAqICAgLm9yZGVyQnkoW1wiY3JlYXRlZEF0XCIsIFwiREVTQ1wiXSlcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICpcbiAqIC8vIFVzZSBwYWdpbmF0aW9uXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLnNlbGVjdCgpXG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC5wYWdpbmF0ZSgyMCk7IC8vIDIwIHVzZXJzIHBlciBwYWdlXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogc2VsZWN0KClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBmcm9tKE1vZGVsKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHdoZXJlKGNvbmRpdGlvbilcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBvcmRlckJ5KFtmaWVsZCwgZGlyZWN0aW9uXSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBsaW1pdCh2YWx1ZSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBleGVjdXRlKClcbiAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBidWlsZCgpXG4gKiAgIFN0YXRlbWVudC0+PkFkYXB0ZXI6IHJhdyhxdWVyeSlcbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+U3RhdGVtZW50OiByZXR1cm4gcHJvY2Vzc2VkIHJlc3VsdHNcbiAqICAgU3RhdGVtZW50LS0+PkNsaWVudDogcmV0dXJuIGZpbmFsIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudDxRLCBNIGV4dGVuZHMgTW9kZWwsIFI+XG4gIGV4dGVuZHMgTG9nZ2VkQ2xhc3NcbiAgaW1wbGVtZW50cyBFeGVjdXRvcjxSPiwgUmF3RXhlY3V0b3I8UT4sIFBhZ2luYXRhYmxlPE0sIFIsIFE+XG57XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+W107XG4gIHByb3RlY3RlZCBkaXN0aW5jdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtYXhTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgbWluU2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGNvdW50U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGZyb21TZWxlY3RvciE6IENvbnN0cnVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgd2hlcmVDb25kaXRpb24/OiBDb25kaXRpb248TT47XG4gIHByb3RlY3RlZCBvcmRlckJ5U2VsZWN0b3I/OiBPcmRlckJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBncm91cEJ5U2VsZWN0b3I/OiBHcm91cEJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBsaW1pdFNlbGVjdG9yPzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb2Zmc2V0U2VsZWN0b3I/OiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBRLCBhbnksIGFueT4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmxvZy5mb3IoU3RhdGVtZW50KTtcbiAgfVxuXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogU2VsZWN0T3B0aW9uPE0sIE1bXT47XG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIEBmaW5hbCgpXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZWxlY3RTZWxlY3RvclwiLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0b3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgZGlzdGluY3Q8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihcbiAgICBzZWxlY3RvcjogU1xuICApOiBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+IHtcbiAgICB0aGlzLmRpc3RpbmN0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWF4PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNYXhPcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWF4U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNYXhPcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtaW48UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1pbk9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5taW5TZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1pbk9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGNvdW50PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I/OiBTKTogQ291bnRPcHRpb248TSwgbnVtYmVyPiB7XG4gICAgdGhpcy5jb3VudFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgQ291bnRPcHRpb248TSwgbnVtYmVyPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBmcm9tKHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT4pOiBXaGVyZU9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5mcm9tU2VsZWN0b3IgPSAoXG4gICAgICB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgQ291bGQgbm90IGZpbmQgc2VsZWN0b3IgbW9kZWw6ICR7c2VsZWN0b3J9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgd2hlcmUoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBPcmRlckFuZEdyb3VwT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLndoZXJlQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9yZGVyQnkoXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcjxNPlxuICApOiBMaW1pdE9wdGlvbjxNLCBSPiAmIE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5vcmRlckJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBncm91cEJ5KHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3I8TT4pOiBMaW1pdE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5ncm91cEJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBsaW1pdCh2YWx1ZTogbnVtYmVyKTogT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLmxpbWl0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvZmZzZXQodmFsdWU6IG51bWJlcik6IEV4ZWN1dG9yPFI+IHtcbiAgICB0aGlzLm9mZnNldFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5yYXcocXVlcnkpKSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PFI+KHJhd0lucHV0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHJldHVybiByZXN1bHRzO1xuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgbmV3ICh0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPikoKVxuICAgICkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IoXG4gICAgICB0aGlzOiBTdGF0ZW1lbnQ8USwgTSwgUj4sXG4gICAgICByOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzIGFzIGFueSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGQoKTogUTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFE7XG4gIGFic3RyYWN0IHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFE+Pjtcbn1cbiIsImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgT3JkZXJCeVNlbGVjdG9yIH0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBxdWVyeSBidWlsZGluZyBiZWhhdmlvci5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBRdWVyeU9wdGlvbnNgIHR5cGUgZGVmaW5lcyBmbGFncyB0aGF0IGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gY2xhdXNlc1xuICogKGxpbWl0LCBvZmZzZXQsIG9yZGVyIGJ5KSBhcmUgcGVybWl0dGVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgdmlvbGF0aW9uc1xuICogc2hvdWxkIHRocm93IGFuIGVycm9yIGR1cmluZyBxdWVyeSBjb25zdHJ1Y3Rpb24uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnMgPSB7XG4gIGFsbG93TGltaXQ/OiBib29sZWFuO1xuICBhbGxvd09mZnNldD86IGJvb2xlYW47XG4gIGFsbG93T3JkZXJCeT86IGJvb2xlYW47XG4gIHRocm93cz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogU3RydWN0dXJlZCBxdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHBhcnNlZCBxdWVyeSBjbGF1c2VzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5QXNzaXN0YCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHJldHVybmVkXG4gKiBieSBxdWVyeSBidWlsZGVycy4gSXQgaW5jbHVkZXMgYWN0aW9ucyBzdWNoIGFzIGZpbmQsIG9wdGlvbmFsIGNsYXVzZXNcbiAqIGxpa2Ugc2VsZWN0LCBncm91cEJ5LCBhbmQgb3JkZXJCeSwgYW5kIHBhZ2luYXRpb24gY29udHJvbHMgKGxpbWl0LCBvZmZzZXQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSBlbnRpdHkgb3IgcmVjb3JkIHR5cGUgdGhhdCBjb25kaXRpb25zIG1heSBhcHBseSB0by5cbiAqXG4gKiBAaW50ZXJmYWNlIFF1ZXJ5QXNzaXN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3Npc3Qge1xuICBhY3Rpb246IFwiZmluZFwiO1xuICBzZWxlY3Q6IHVuZGVmaW5lZCB8IHN0cmluZ1tdO1xuICB3aGVyZTogQ29uZGl0aW9uPGFueT47XG4gIGdyb3VwQnk/OiBzdHJpbmdbXTtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHF1ZXJ5IGNsYXVzZXMgZm9yIGJ1aWxkaW5nIG1ldGhvZC1iYXNlZCBxdWVyaWVzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5Q2xhdXNlYCBlbnVtIGRlZmluZXMgc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50XG4gKiBkaWZmZXJlbnQgc2VnbWVudHMgb2YgYSBxdWVyeSAoZS5nLiwgYGZpbmRCeWAsIGBTZWxlY3RgLCBgQW5kYCwgYE9yYCkuXG4gKlxuICogQGVudW0gUXVlcnlDbGF1c2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGVudW0gUXVlcnlDbGF1c2Uge1xuICBGSU5EX0JZID0gXCJmaW5kQnlcIixcbiAgU0VMRUNUID0gXCJTZWxlY3RcIixcbiAgQU5EID0gXCJBbmRcIixcbiAgT1IgPSBcIk9yXCIsXG4gIEdST1VQX0JZID0gXCJHcm91cEJ5XCIsXG4gIE9SREVSX0JZID0gXCJPcmRlckJ5XCIsXG4gIFRIRU4gPSBcIlRoZW5cIixcbiAgVEhFTl9CWSA9IFwiVGhlbkJ5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGdW5jdGlvbiBzaWduYXR1cmUgZm9yIHBhcnNpbmcgb3BlcmF0b3JzIGluIHF1ZXJ5IGJ1aWxkaW5nLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE9wZXJhdG9yUGFyc2VyYCB0eXBlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgZmllbGQgbmFtZVxuICogYW5kIGFyZ3VtZW50cywgdGhlbiBwcm9kdWNlcyBhIGBDb25kaXRpb25gIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcXVlcnkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZpZWxkIHtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHBhcnNlZC5cbiAqIEBwYXJhbSBhcmdzIHthbnlbXX0gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3Igb3BlcmF0b3IgZXZhbHVhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb248YW55Pn0gQSBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIG9wZXJhdG9yLlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0b3JQYXJzZXIgPSAoZmllbGQ6IHN0cmluZywgLi4uYXJnczogYW55KSA9PiBDb25kaXRpb248YW55PjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlc2NyaXB0b3IgZm9yIGZpZWxkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvcGVyYXRvcnMgaW4gcXVlcnkgcGFyc2luZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBGaWx0ZXJEZXNjcmlwdG9yYCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHVzZWQgd2hlbiBwYXJzaW5nXG4gKiBtZXRob2Qgc2VnbWVudHMgaW50byBmaWx0ZXJhYmxlIGZpZWxkcyBhbmQgYXNzb2NpYXRlZCBvcGVyYXRvcnMuXG4gKlxuICogQGludGVyZmFjZSBGaWx0ZXJEZXNjcmlwdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRGVzY3JpcHRvciB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRvclBhcnNlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBNYXAgb2Ygc3VwcG9ydGVkIG9wZXJhdG9ycyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHBhcnNlciBmdW5jdGlvbnMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgT3BlcmF0b3JzTWFwYCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRvciBuYW1lcyBhcyBrZXlzXG4gKiAoc3VjaCBhcyBgRXF1YWxzYCwgYExlc3NUaGFuYCwgYEJldHdlZW5gLCBldGMuKSwgZWFjaCBtYXBwZWQgdG8gYVxuICogZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGEgYENvbmRpdGlvbmAgb2JqZWN0IGZvciB0aGF0IG9wZXJhdG9yLlxuICogVGhlc2UgZnVuY3Rpb25zIHRyYW5zbGF0ZSBxdWVyeSBjbGF1c2VzIGludG8gY29uY3JldGUgY29uZGl0aW9uXG4gKiBidWlsZGVycywgZW5hYmxpbmcgZHluYW1pYyBxdWVyeSBjb25zdHJ1Y3Rpb24gZnJvbSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIHZhbHVlcyB1c2VkIGluIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIGYge3N0cmluZ30gLSBUaGUgZmllbGQgbmFtZSB0aGUgY29uZGl0aW9uIGFwcGxpZXMgdG8uXG4gKiBAcGFyYW0gdjEge2FueX0gLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgZmllbGQgYWdhaW5zdCBvciB0aGUgbG93ZXIgYm91bmQgdmFsdWUgZm9yIHJhbmdlLWJhc2VkIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB2MiB7YW55fSAtIFRoZSB1cHBlciBib3VuZCB2YWx1ZSBmb3IgcmFuZ2UtYmFzZWQgb3BlcmF0b3JzLlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvciBhcHBsaWVkIHRvIHRoZSBmaWVsZC5cbiAqXG4gKiBAZnVuY3Rpb24gT3BlcmF0b3JzTWFwXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnQgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IE1hcCBhcyBPcGVyYXRvcnNNYXBcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIE9wZXJhdG9yUGFyc2VyXG4gKiAgIHBhcnRpY2lwYW50IENvbmQgYXMgQ29uZGl0aW9uXG4gKlxuICogICBDbGllbnQtPj5NYXA6IFJlcXVlc3Qgb3BlcmF0b3IgcGFyc2VyIChcIkJldHdlZW5cIiwgZmllbGQsIHYxLCB2MilcbiAqICAgTWFwLT4+UGFyc2VyOiBDYWxsIGNvcnJlc3BvbmRpbmcgb3BlcmF0b3IgZnVuY3Rpb25cbiAqICAgUGFyc2VyLT4+Q29uZDogQ29uZGl0aW9uLmF0dHJpYnV0ZShmaWVsZClcbiAqICAgQ29uZC0tPj5QYXJzZXI6IENvbmRpdGlvbiBpbnN0YW5jZVxuICogICBQYXJzZXItPj5Db25kOiBBcHBseSBndGUodjEpXG4gKiAgIFBhcnNlci0+PkNvbmQ6IEFwcGx5IGFuZChsdGUodjIpKVxuICogICBQYXJzZXItLT4+Q2xpZW50OiBSZXR1cm4gYnVpbHQgQ29uZGl0aW9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JzTWFwOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRvclBhcnNlcj4gPSB7XG4gIEVxdWFsczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZXEodiksXG4gIERpZmY6IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmRpZih2KSxcbiAgTGVzc1RoYW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmx0KHYpLFxuICBMZXNzVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5sdGUodiksXG4gIEdyZWF0ZXJUaGFuOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5ndCh2KSxcbiAgR3JlYXRlclRoYW5FcXVhbDogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZ3RlKHYpLFxuICBCZXR3ZWVuOiAoZiwgdjEsIHYyKSA9PlxuICAgIENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZ3RlKHYxKS5hbmQoQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5sdGUodjIpKSxcbiAgSW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmluKHYpLFxuICBNYXRjaGVzOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5yZWdleHAodiksXG59O1xuIiwiaW1wb3J0IHsgQ29uZGl0aW9uLCBPcmRlckJ5U2VsZWN0b3IgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IEZpbHRlckRlc2NyaXB0b3IsIFF1ZXJ5QXNzaXN0LCBRdWVyeUNsYXVzZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPcGVyYXRvcnNNYXAgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5jb25zdCBsb3dlckZpcnN0ID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+XG4gIHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFV0aWxpdHkgY2xhc3MgdG8gYnVpbGQgcXVlcnkgb2JqZWN0cyBmcm9tIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWVzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE1ldGhvZFF1ZXJ5QnVpbGRlcmAgY2xhc3MgcGFyc2VzIG1ldGhvZCBuYW1lcyB0aGF0IGZvbGxvdyBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uXG4gKiAoZS5nLiwgYGZpbmRCeU5hbWVBbmRBZ2VPcmRlckJ5Q291bnRyeUFzY2ApIGFuZCBjb252ZXJ0cyB0aGVtIGludG8gc3RydWN0dXJlZCBxdWVyeSBvYmplY3RzXG4gKiAoYFF1ZXJ5QXNzaXN0YCkuIEl0IGV4dHJhY3RzIGNsYXVzZXMgc3VjaCBhcyBgc2VsZWN0YCwgYHdoZXJlYCwgYGdyb3VwQnlgLCBgb3JkZXJCeWAsIGBsaW1pdGAsXG4gKiBhbmQgYG9mZnNldGAsIGVuc3VyaW5nIHRoYXQgZGV2ZWxvcGVycyBjYW4gZGVjbGFyZSByZXBvc2l0b3J5IHF1ZXJpZXMgdXNpbmcgZXhwcmVzc2l2ZSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgcmVwb3NpdG9yeSBtZXRob2QgbmFtZSB0byBwYXJzZSBhbmQgY29udmVydCBpbnRvIGEgcXVlcnkuXG4gKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gbWV0aG9kIHBhcmFtZXRlcnMgdXNlZCBmb3IgcXVlcnkgY29uZGl0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtRdWVyeUFzc2lzdH0gQSBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdCBkZXNjcmliaW5nIHRoZSBwYXJzZWQgYWN0aW9uLCBzZWxlY3QsIHdoZXJlLFxuICogZ3JvdXBCeSwgb3JkZXJCeSwgbGltaXQsIGFuZCBvZmZzZXQgY2xhdXNlcy5cbiAqXG4gKiBAY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHF1ZXJ5ID0gTWV0aG9kUXVlcnlCdWlsZGVyLmJ1aWxkKFxuICogICBcImZpbmRCeU5hbWVBbmRBZ2VPcmRlckJ5Q291bnRyeUFzY1wiLFxuICogICBcIkpvaG5cIixcbiAqICAgMjUsXG4gKiAgIFtbXCJjb3VudHJ5XCIsIFwiQVNDXCJdXVxuICogKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhxdWVyeSk7XG4gKiAvLyB7XG4gKiAvLyAgIGFjdGlvbjogXCJmaW5kXCIsXG4gKiAvLyAgIHNlbGVjdDogdW5kZWZpbmVkLFxuICogLy8gICB3aGVyZTogeyAuLi4gfSxcbiAqIC8vICAgZ3JvdXBCeTogdW5kZWZpbmVkLFxuICogLy8gICBvcmRlckJ5OiBbW1wiY291bnRyeVwiLCBcIkFTQ1wiXV0sXG4gKiAvLyAgIGxpbWl0OiB1bmRlZmluZWQsXG4gKiAvLyAgIG9mZnNldDogdW5kZWZpbmVkXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFJlcG8gYXMgUmVwb3NpdG9yeSBNZXRob2RcbiAqICAgcGFydGljaXBhbnQgTVFCIGFzIE1ldGhvZFF1ZXJ5QnVpbGRlclxuICogICBwYXJ0aWNpcGFudCBRdWVyeSBhcyBRdWVyeUFzc2lzdFxuICpcbiAqICAgUmVwby0+Pk1RQjogYnVpbGQobWV0aG9kTmFtZSwgLi4udmFsdWVzKVxuICogICBNUUItPj5NUUI6IGV4dHJhY3RDb3JlKG1ldGhvZE5hbWUpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdFNlbGVjdChtZXRob2ROYW1lKVxuICogICBNUUItPj5NUUI6IGV4dHJhY3RHcm91cEJ5KG1ldGhvZE5hbWUpXG4gKiAgIE1RQi0+Pk1RQjogYnVpbGRXaGVyZShjb3JlLCB2YWx1ZXMpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdE9yZGVyTGltaXRPZmZzZXQoY29yZSwgdmFsdWVzKVxuICogICBNUUItPj5RdWVyeTogcmV0dXJuIHN0cnVjdHVyZWQgUXVlcnlBc3Npc3Qgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRob2RRdWVyeUJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJ1aWxkcyBhIGBRdWVyeUFzc2lzdGAgb2JqZWN0IGJ5IHBhcnNpbmcgYSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIGFuZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFRoZSBtZXRob2QgdmFsaWRhdGVzIHRoZSBtZXRob2QgbmFtZSwgZXh0cmFjdHMgY2xhdXNlcyAoY29yZSwgc2VsZWN0LCBncm91cEJ5LCB3aGVyZSxcbiAgICogb3JkZXJCeSwgbGltaXQsIGFuZCBvZmZzZXQpLCBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0XG4gICAqIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFnYWluc3QgYSBkYXRhIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgcmVwb3NpdG9yeSBtZXRob2QgbmFtZSB0aGF0IGVuY29kZXMgcXVlcnkgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBjb25kaXRpb25zIGFuZCBleHRyYSBjbGF1c2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtRdWVyeUFzc2lzdH0gQSBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhcnNlZCBxdWVyeS5cbiAgICovXG4gIHN0YXRpYyBidWlsZChtZXRob2ROYW1lOiBzdHJpbmcsIC4uLnZhbHVlczogYW55W10pOiBRdWVyeUFzc2lzdCB7XG4gICAgaWYgKCFtZXRob2ROYW1lLnN0YXJ0c1dpdGgoUXVlcnlDbGF1c2UuRklORF9CWSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbWV0aG9kICR7bWV0aG9kTmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3JlID0gdGhpcy5leHRyYWN0Q29yZShtZXRob2ROYW1lKTtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLmV4dHJhY3RTZWxlY3QobWV0aG9kTmFtZSk7XG4gICAgY29uc3QgZ3JvdXBCeSA9IHRoaXMuZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZSk7XG4gICAgLy8gY29uc3Qgb3JkZXJCeSA9IHRoaXMuZXh0cmFjdE9yZGVyQnkobWV0aG9kTmFtZSk7XG4gICAgY29uc3Qgd2hlcmUgPSB0aGlzLmJ1aWxkV2hlcmUoY29yZSwgdmFsdWVzKTtcbiAgICBjb25zdCB7IG9yZGVyQnksIGxpbWl0LCBvZmZzZXQgfSA9IHRoaXMuZXh0cmFjdE9yZGVyTGltaXRPZmZzZXQoXG4gICAgICBjb3JlLFxuICAgICAgdmFsdWVzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZmluZFwiLFxuICAgICAgc2VsZWN0OiBzZWxlY3QsXG4gICAgICB3aGVyZSxcbiAgICAgIGdyb3VwQnksXG4gICAgICBvcmRlckJ5LFxuICAgICAgbGltaXQsXG4gICAgICBvZmZzZXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgdGhlIGNvcmUgcGFydCBvZiB0aGUgbWV0aG9kIG5hbWUgYWZ0ZXIgYGZpbmRCeWAgYW5kIGJlZm9yZSBhbnkgc3BlY2lhbCBjbGF1c2VzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBSZW1vdmVzIHByZWZpeGVzIGFuZCBkZXRlY3RzIGRlbGltaXRlcnMgKGBUaGVuYCwgYE9yZGVyQnlgLCBgR3JvdXBCeWAsIGBMaW1pdGAsIGBPZmZzZXRgKVxuICAgKiB0byBpc29sYXRlIHRoZSBtYWluIGNvbmRpdGlvbmFsIHBhcnQgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZXh0cmFjdGVkIGNvcmUgc3RyaW5nIHVzZWQgZm9yIGJ1aWxkaW5nIGNvbmRpdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0Q29yZShtZXRob2ROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFmdGVyRmluZEJ5ID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoUXVlcnlDbGF1c2UuRklORF9CWS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlZ2V4ID0gLyhUaGVuW0EtWl18T3JkZXJCeXxHcm91cEJ5fExpbWl0fE9mZnNldCkvO1xuICAgIGNvbnN0IG1hdGNoID0gYWZ0ZXJGaW5kQnkubWF0Y2gocmVnZXgpO1xuICAgIHJldHVybiBtYXRjaCA/IGFmdGVyRmluZEJ5LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgOiBhZnRlckZpbmRCeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgdGhlIHNlbGVjdCBjbGF1c2UgZnJvbSBhIG1ldGhvZCBuYW1lLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEZXRlY3RzIHRoZSBgU2VsZWN0YCBrZXl3b3JkIGluIHRoZSBtZXRob2QgbmFtZSwgaXNvbGF0ZXMgdGhlIGZpZWxkcyBmb2xsb3dpbmcgaXQsXG4gICAqIGFuZCByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXkgb2YgbG93ZXJjYXNlLWZpcnN0IHN0cmluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gQW4gYXJyYXkgb2Ygc2VsZWN0ZWQgZmllbGRzIG9yIGB1bmRlZmluZWRgIGlmIG5vIHNlbGVjdCBjbGF1c2UgZXhpc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFNlbGVjdChtZXRob2ROYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VsZWN0SW5kZXggPSBtZXRob2ROYW1lLmluZGV4T2YoUXVlcnlDbGF1c2UuU0VMRUNUKTtcbiAgICBpZiAoc2VsZWN0SW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYWZ0ZXJTZWxlY3QgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhcbiAgICAgIHNlbGVjdEluZGV4ICsgUXVlcnlDbGF1c2UuU0VMRUNULmxlbmd0aFxuICAgICk7XG5cbiAgICAvLyBTZWFyY2ggZm9yIG5leHQgVGhlbiwgR3JvdXBCeSwgT3JkZXJCeS4uLlxuICAgIGNvbnN0IG1hdGNoID0gYWZ0ZXJTZWxlY3QubWF0Y2goLyhUaGVuW0EtWl18T3JkZXJCeXxHcm91cEJ5fExpbWl0fE9mZnNldCkvKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcnQgPSBtYXRjaFxuICAgICAgPyBhZnRlclNlbGVjdC5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpXG4gICAgICA6IGFmdGVyU2VsZWN0O1xuXG4gICAgcmV0dXJuIHNlbGVjdFBhcnQuc3BsaXQoUXVlcnlDbGF1c2UuQU5EKS5tYXAobG93ZXJGaXJzdCkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgZ3JvdXAgYnkgY2xhdXNlIGZyb20gYSBtZXRob2QgbmFtZS5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRGV0ZWN0cyB0aGUgYEdyb3VwQnlgIGtleXdvcmQgaW4gdGhlIG1ldGhvZCBuYW1lLCBpc29sYXRlcyB0aGUgZmllbGRzIGZvbGxvd2luZyBpdCxcbiAgICogYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheSBvZiBsb3dlcmNhc2UtZmlyc3Qgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBBbiBhcnJheSBvZiBncm91cCBieSBmaWVsZHMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZ3JvdXAgYnkgY2xhdXNlIGV4aXN0cy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RHcm91cEJ5KG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBncm91cEJ5SW5kZXggPSBtZXRob2ROYW1lLmluZGV4T2YoUXVlcnlDbGF1c2UuR1JPVVBfQlkpO1xuICAgIGlmIChncm91cEJ5SW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYWZ0ZXIgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhcbiAgICAgIGdyb3VwQnlJbmRleCArIFF1ZXJ5Q2xhdXNlLkdST1VQX0JZLmxlbmd0aFxuICAgICk7XG4gICAgY29uc3QgZ3JvdXBCeVBhcnQgPSBhZnRlci5zcGxpdChRdWVyeUNsYXVzZS5PUkRFUl9CWSlbMF07XG4gICAgcmV0dXJuIGdyb3VwQnlQYXJ0XG4gICAgICAuc3BsaXQoUXVlcnlDbGF1c2UuVEhFTl9CWSlcbiAgICAgIC5tYXAobG93ZXJGaXJzdClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvLyBwcml2YXRlIHN0YXRpYyBleHRyYWN0T3JkZXJCeShcbiAgLy8gICBtZXRob2ROYW1lOiBzdHJpbmdcbiAgLy8gKTogT3JkZXJCeVNlbGVjdG9yPGFueT5bXSB8IHVuZGVmaW5lZCB7XG4gIC8vICAgY29uc3Qgb3JkZXJCeUluZGV4ID0gbWV0aG9kTmFtZS5pbmRleE9mKFF1ZXJ5Q2xhdXNlLk9SREVSX0JZKTtcbiAgLy8gICBpZiAob3JkZXJCeUluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy9cbiAgLy8gICBjb25zdCBhZnRlciA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAvLyAgICAgb3JkZXJCeUluZGV4ICsgUXVlcnlDbGF1c2UuT1JERVJfQlkubGVuZ3RoXG4gIC8vICAgKTtcbiAgLy8gICBjb25zdCBvcmRlclBhcnRzID0gYWZ0ZXIuc3BsaXQoXCJUaGVuQnlcIik7XG4gIC8vXG4gIC8vICAgcmV0dXJuIG9yZGVyUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gIC8vICAgICBjb25zdCBtYXRjaCA9IHBhcnQubWF0Y2goLyguKj8pKEFzY3xEZXNjfERzYykkLyk7XG4gIC8vICAgICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgT3JkZXJCeSBwYXJ0OiAke3BhcnR9YCk7XG4gIC8vICAgICBjb25zdCBbLCBmaWVsZCwgZGlyXSA9IG1hdGNoO1xuICAvLyAgICAgcmV0dXJuIFtcbiAgLy8gICAgICAgbG93ZXJGaXJzdChmaWVsZCksXG4gIC8vICAgICAgIGRpci50b0xvd2VyQ2FzZSgpID09PSBcImRzY1wiXG4gIC8vICAgICAgICAgPyBPcmRlckRpcmVjdGlvbi5EU0NcbiAgLy8gICAgICAgICA6IChkaXIudG9Mb3dlckNhc2UoKSBhcyBPcmRlckRpcmVjdGlvbiksXG4gIC8vICAgICBdO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCdWlsZHMgdGhlIGB3aGVyZWAgY29uZGl0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgcGFyc2VkIGNvcmUgc3RyaW5nIGFuZCBwYXJhbWV0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBTcGxpdHMgdGhlIGNvcmUgc3RyaW5nIGJ5IGxvZ2ljYWwgb3BlcmF0b3JzIChgQW5kYCwgYE9yYCksIHBhcnNlcyBlYWNoIHRva2VuIGludG8gYSBmaWVsZFxuICAgKiBhbmQgb3BlcmF0b3IsIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBgQ29uZGl0aW9uYCBvYmplY3QgdXNpbmcgdGhlIHByb3ZpZGVkIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIGNvcmUge3N0cmluZ30gLSBUaGUgZXh0cmFjdGVkIGNvcmUgc3RyaW5nIGZyb20gdGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIHN0cnVjdHVyZWQgY29uZGl0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHF1ZXJ5J3Mgd2hlcmUgY2xhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRXaGVyZShjb3JlOiBzdHJpbmcsIHZhbHVlczogYW55W10pOiBDb25kaXRpb248YW55PiB7XG4gICAgY29uc3QgcGFydHMgPSBjb3JlLnNwbGl0KC9PcmRlckJ5fEdyb3VwQnkvKVswXSB8fCBcIlwiO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBwYXJ0cy5zcGxpdCgvQW5kfE9yLyk7XG5cbiAgICBjb25zdCBvcGVyYXRvcnMgPSBjb3JlLm1hdGNoKC9BbmR8T3IvZykgfHwgW107XG5cbiAgICBsZXQgd2hlcmU6IENvbmRpdGlvbjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uZGl0aW9ucy5mb3JFYWNoKCh0b2tlbiwgaWR4KSA9PiB7XG4gICAgICBjb25zdCB7IGZpZWxkLCBvcGVyYXRvciB9ID0gdGhpcy5wYXJzZUZpZWxkQW5kT3BlcmF0b3IodG9rZW4pO1xuICAgICAgY29uc3QgcGFyc2VyID0gb3BlcmF0b3IgPyBPcGVyYXRvcnNNYXBbb3BlcmF0b3JdIDogT3BlcmF0b3JzTWFwLkVxdWFscztcbiAgICAgIGlmICghcGFyc2VyKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG9wZXJhdG9yICR7b3BlcmF0b3J9YCk7XG5cbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gdmFsdWVzW2lkeF07XG4gICAgICBpZiAodHlwZW9mIGNvbmRpdGlvblZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3IgZmllbGQgJHtmaWVsZH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29uZGl0aW9uID0gcGFyc2VyKGZpZWxkLCBjb25kaXRpb25WYWx1ZSk7XG4gICAgICB3aGVyZSA9XG4gICAgICAgIGlkeCA9PT0gMFxuICAgICAgICAgID8gY29uZGl0aW9uXG4gICAgICAgICAgOiBvcGVyYXRvcnNbaWR4IC0gMV0gPT09IFF1ZXJ5Q2xhdXNlLkFORFxuICAgICAgICAgICAgPyB3aGVyZSEuYW5kKGNvbmRpdGlvbilcbiAgICAgICAgICAgIDogd2hlcmUhLm9yKGNvbmRpdGlvbik7XG4gICAgfSk7XG5cbiAgICBpZiAoIXdoZXJlKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25kaXRpb25zIGZvdW5kIGluIG1ldGhvZCBuYW1lXCIpO1xuICAgIHJldHVybiB3aGVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUGFyc2VzIGEgZmllbGQgbmFtZSBhbmQgb3BlcmF0b3IgZnJvbSBhIHN0cmluZyB0b2tlbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWRlbnRpZmllcyB0aGUgb3BlcmF0b3Igc3VmZml4IChpZiBwcmVzZW50KSBhbmQgcmV0dXJucyBhIGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgZmllbGRcbiAgICogbmFtZSBpbiBsb3dlcmNhc2UtZmlyc3QgZm9ybWF0IGFsb25nIHdpdGggdGhlIG9wZXJhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyIHtzdHJpbmd9IC0gVGhlIHRva2VuIHN0cmluZyB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7RmlsdGVyRGVzY3JpcHRvcn0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkIG5hbWUgYW5kIG9wZXJhdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VGaWVsZEFuZE9wZXJhdG9yKHN0cjogc3RyaW5nKTogRmlsdGVyRGVzY3JpcHRvciB7XG4gICAgZm9yIChjb25zdCBvcGVyYXRvciBvZiBPYmplY3Qua2V5cyhPcGVyYXRvcnNNYXApKSB7XG4gICAgICBpZiAoc3RyLmVuZHNXaXRoKG9wZXJhdG9yKSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHN0ci5zbGljZSgwLCAtb3BlcmF0b3IubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHsgZmllbGQ6IGxvd2VyRmlyc3QoZmllbGQpLCBvcGVyYXRvciB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBmaWVsZDogbG93ZXJGaXJzdChzdHIpIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIGBvcmRlckJ5YCwgYGxpbWl0YCwgYW5kIGBvZmZzZXRgIGNsYXVzZXMgZnJvbSBtZXRob2QgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgY29uZGl0aW9uIGFyZ3VtZW50cywgdGhlbiBjaGVja3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHNcbiAgICogdG8gcmVzb2x2ZSBzb3J0aW5nLCBsaW1pdGluZywgYW5kIHBhZ2luYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb3JlIHtzdHJpbmd9IC0gVGhlIGV4dHJhY3RlZCBjb3JlIHN0cmluZyBmcm9tIHRoZSBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIG1ldGhvZCBhcmd1bWVudHMsIGluY2x1ZGluZyBjb25kaXRpb25zIGFuZCBleHRyYXMuXG4gICAqXG4gICAqIEByZXR1cm4ge3tcbiAgICogICBvcmRlckJ5PzogT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcbiAgICogICBsaW1pdD86IG51bWJlcjtcbiAgICogICBvZmZzZXQ/OiBudW1iZXI7XG4gICAqIH19IEFuIG9iamVjdCBjb250YWluaW5nIG9yZGVyQnksIGxpbWl0LCBhbmQgb2Zmc2V0IHZhbHVlcyBpZiBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdE9yZGVyTGltaXRPZmZzZXQoXG4gICAgY29yZTogc3RyaW5nLFxuICAgIHZhbHVlczogYW55W11cbiAgKTogeyBvcmRlckJ5PzogT3JkZXJCeVNlbGVjdG9yPGFueT5bXTsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlciB9IHtcbiAgICBjb25zdCBjb25kaXRpb25Db3VudCA9IGNvcmUuc3BsaXQoL0FuZHxPci8pLmxlbmd0aDtcbiAgICBjb25zdCBleHRyYUFyZ3MgPSB2YWx1ZXMuc2xpY2UoY29uZGl0aW9uQ291bnQpO1xuXG4gICAgbGV0IG9yZGVyQnk6IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGV4dHJhQXJncy5sZW5ndGggPj0gMSAmJiBBcnJheS5pc0FycmF5KGV4dHJhQXJnc1swXSkpXG4gICAgICBvcmRlckJ5ID0gZXh0cmFBcmdzWzBdIGFzIE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG5cbiAgICBpZiAoZXh0cmFBcmdzLmxlbmd0aCA+PSAyICYmIHR5cGVvZiBleHRyYUFyZ3NbMV0gPT09IFwibnVtYmVyXCIpXG4gICAgICBsaW1pdCA9IGV4dHJhQXJnc1sxXTtcblxuICAgIGlmIChleHRyYUFyZ3MubGVuZ3RoID49IDMgJiYgdHlwZW9mIGV4dHJhQXJnc1syXSA9PT0gXCJudW1iZXJcIilcbiAgICAgIG9mZnNldCA9IGV4dHJhQXJnc1syXTtcblxuICAgIHJldHVybiB7IG9yZGVyQnksIGxpbWl0LCBvZmZzZXQgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUXVlcnlPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1ldGhvZFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL01ldGhvZFF1ZXJ5QnVpbGRlclwiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnkob3B0aW9uczogUXVlcnlPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKTogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PiB8IHZvaWQgPT4ge1xuICAgIC8vIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXkudG9TdHJpbmcoKTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBjb25zdCB7IHNlbGVjdCwgd2hlcmUsIGdyb3VwQnksIG9yZGVyQnksIGxpbWl0LCBvZmZzZXQgfSA9XG4gICAgICAgIE1ldGhvZFF1ZXJ5QnVpbGRlci5idWlsZChtZXRob2ROYW1lLCAuLi5hcmdzKTtcblxuICAgICAgbGV0IHN0bXQgPSAodGhpcyBhcyBhbnkpLnNlbGVjdChzZWxlY3QpIGFzIGFueTtcbiAgICAgIGlmICh3aGVyZSkgc3RtdCA9IHN0bXQud2hlcmUod2hlcmUpO1xuICAgICAgLy8gaWYgKG9yZGVyQnkpIHN0bXQgPSBzdG10Lm9yZGVyQnkob3JkZXJCeVswXSk7XG4gICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAvLyBncm91cCBieSBub3QgaW1wbGVtZW50ZWQgeWV0XG4gICAgICAgIC8qIHN0bXQgPSBzdG10Lmdyb3VwQnkoZ3JvdXBCeSk7ICovXG4gICAgICB9XG5cbiAgICAgIC8vIGFsbG93IGxpbWl0IGFuZCBvZmZzZXQgYnkgZGVmYXVsdFxuICAgICAgY29uc3QgeyBhbGxvd0xpbWl0LCBhbGxvd09mZnNldCwgYWxsb3dPcmRlckJ5LCB0aHJvd3MgfSA9IHtcbiAgICAgICAgYWxsb3dMaW1pdDogdHJ1ZSxcbiAgICAgICAgYWxsb3dPcmRlckJ5OiB0cnVlLFxuICAgICAgICBhbGxvd09mZnNldDogdHJ1ZSxcbiAgICAgICAgdGhyb3dzOiB0cnVlLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSBhcyBRdWVyeU9wdGlvbnM7XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgICAgLy8ga2VlcCB0aGUgb3JkZXIgdG8gZW5zdXJlIHRoZSBleHBlY3RlZCBiZWhhdmlvclxuICAgICAgICB7IGtleTogXCJvcmRlckJ5XCIsIHZhbHVlOiAob3JkZXJCeSB8fCBbXSlbMF0sIGFsbG93ZWQ6IGFsbG93T3JkZXJCeSB9LCAvLyBvcmRlckJ5IG9ubHkgc3VwcG9ydHMgb25lIHNlbnRlbmNlXG4gICAgICAgIHsga2V5OiBcImxpbWl0XCIsIHZhbHVlOiBsaW1pdCwgYWxsb3dlZDogYWxsb3dMaW1pdCB9LFxuICAgICAgICB7IGtleTogXCJvZmZzZXRcIiwgdmFsdWU6IG9mZnNldCwgYWxsb3dlZDogYWxsb3dPZmZzZXQgfSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFwYXJhbS5hbGxvd2VkICYmIHRocm93cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgICAgIGAke3BhcmFtLmtleVswXS50b1VwcGVyQ2FzZSgpICsgcGFyYW0ua2V5LnNsaWNlKDEpfSBpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBxdWVyeWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5hbGxvd2VkKSB7XG4gICAgICAgICAgICBzdG10ID0gc3RtdFtwYXJhbS5rZXldKHBhcmFtLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0bXQuZXhlY3V0ZSgpO1xuICAgIH07XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSYXdSYW1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHBhZ2luYXRvciBpbXBsZW1lbnRhdGlvblxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBQYWdpbmF0b3IgY2xhc3MgdG8gcHJvdmlkZSBwYWdpbmF0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIFJBTSBhZGFwdGVyIHF1ZXJpZXMuXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIHBhZ2luYXRpb24gb2YgcXVlcnkgcmVzdWx0cyBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZSwgYWxsb3dpbmdcbiAqIGZvciBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGxhcmdlIHJlc3VsdCBzZXRzIGluIHNtYWxsZXIgY2h1bmtzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwYWdpbmF0ZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBwYWdpbmF0b3JcbiAqIEBjbGFzcyBSYW1QYWdpbmF0b3JcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBxdWVyeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgcXVlcnk6IFJhd1JhbVF1ZXJ5PFVzZXI+ID0ge1xuICogICBzZWxlY3Q6IHVuZGVmaW5lZCwgLy8gU2VsZWN0IGFsbCBmaWVsZHNcbiAqICAgZnJvbTogVXNlcixcbiAqICAgd2hlcmU6ICh1c2VyKSA9PiB1c2VyLmFjdGl2ZSA9PT0gdHJ1ZVxuICogfTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBwYWdpbmF0b3Igd2l0aCBwYWdlIHNpemUgb2YgMTBcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBSYW1QYWdpbmF0b3I8VXNlciwgVXNlcj4oYWRhcHRlciwgcXVlcnksIDEwLCBVc2VyKTtcbiAqXG4gKiAvLyBHZXQgdGhlIGZpcnN0IHBhZ2Ugb2YgcmVzdWx0c1xuICogY29uc3QgZmlyc3RQYWdlID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKlxuICogLy8gR2V0IHRoZSBuZXh0IHBhZ2VcbiAqIGNvbnN0IHNlY29uZFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFJhd1JhbVF1ZXJ5PE0+XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogQWRhcHRlcjxhbnksIFJhd1JhbVF1ZXJ5PE0+LCBhbnksIGFueT4sXG4gICAgcXVlcnk6IFJhd1JhbVF1ZXJ5PE0+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBSQU0gcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSBzdGF0ZW1lbnQgdG8gaW5jbHVkZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnMuXG4gICAqIFRoaXMgcHJvdGVjdGVkIG1ldGhvZCBzZXRzIHRoZSBsaW1pdCBwYXJhbWV0ZXIgb24gdGhlIHF1ZXJ5IHRvIG1hdGNoIHRoZSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8TT59IHJhd1N0YXRlbWVudCAtIFRoZSBvcmlnaW5hbCBxdWVyeSBzdGF0ZW1lbnRcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IFRoZSBtb2RpZmllZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBSYXdSYW1RdWVyeTxNPik6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCBxdWVyeTogUmF3UmFtUXVlcnk8YW55PiA9IE9iamVjdC5hc3NpZ24oe30sIHJhd1N0YXRlbWVudCk7XG4gICAgcXVlcnkubGltaXQgPSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHNcbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBza2lwIHZhbHVlIGJhc2VkIG9uIHRoZSBwYWdlIG51bWJlciBhbmQgcGFnZSBzaXplLFxuICAgKiBleGVjdXRlcyB0aGUgcXVlcnksIGFuZCB1cGRhdGVzIHRoZSBjdXJyZW50IHBhZ2UgdHJhY2tpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSAtIFRoZSBwYWdlIG51bWJlciB0byByZXRyaWV2ZSAoMS1iYXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxSW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXN1bHRzIGZvciB0aGUgcmVxdWVzdGVkIHBhZ2VcbiAgICovXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMuc3RhdGVtZW50KTtcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoeyAuLi5zdGF0ZW1lbnQsIGxpbWl0OiB1bmRlZmluZWQgfSkgfHwgW107XG4gICAgICAgIHRoaXMuX3JlY29yZENvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmRDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBzdGF0ZW1lbnQ/LmxpbWl0IHx8IHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5fcmVjb3JkQ291bnQgLyBzaXplKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhZ2UgPSB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcbiAgICBzdGF0ZW1lbnQuc2tpcCA9IChwYWdlIC0gMSkgKiB0aGlzLnNpemU7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHN0YXRlbWVudCk7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBQYWdpbmF0b3IsXG4gIFF1ZXJ5RXJyb3IsXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgUmF3UmFtUXVlcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSYW1QYWdpbmF0b3IgfSBmcm9tIFwiLi9SYW1QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tIFwiLi9SYW1BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTS1zcGVjaWZpYyBxdWVyeSBzdGF0ZW1lbnQgYnVpbGRlclxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBTdGF0ZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBxdWVyeSBidWlsZGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gKiBUaGlzIGNsYXNzIHRyYW5zbGF0ZXMgaGlnaC1sZXZlbCBxdWVyeSBvcGVyYXRpb25zIGludG8gcHJlZGljYXRlcyB0aGF0IGNhbiBmaWx0ZXIgYW5kIHNvcnRcbiAqIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZXMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHF1ZXJpZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBxdWVyeVxuICogQHBhcmFtIHtSYW1BZGFwdGVyfSBhZGFwdGVyIC0gVGhlIFJBTSBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBSYW1TdGF0ZW1lbnRcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nIFVzZXIgbW9kZWxzXG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgUmFtU3RhdGVtZW50PFVzZXIsIFVzZXI+KHJhbUFkYXB0ZXIpO1xuICpcbiAqIC8vIEJ1aWxkIGEgcXVlcnkgdG8gZmluZCBhY3RpdmUgdXNlcnMgd2l0aCBhZ2UgPiAxOFxuICogY29uc3QgcmVzdWx0cyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmFuZChcbiAqICAgICBDb25kaXRpb24uZXEoJ2FjdGl2ZScsIHRydWUpLFxuICogICAgIENvbmRpdGlvbi5ndCgnYWdlJywgMTgpXG4gKiAgICkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBSYXdSYW1RdWVyeTxNPixcbiAgTSxcbiAgUlxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFJhbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzb3J0IGNvbXBhcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBvcmRlckJ5IGNyaXRlcmlhLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGRpZmZlcmVudCBkYXRhIHR5cGVzIChzdHJpbmcsIG51bWJlciwgZGF0ZSkgYW5kIHNvcnQgZGlyZWN0aW9ucyAoYXNjLCBkZXNjKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb24oTW9kZWwsIE1vZGVsKTogbnVtYmVyfSBBIGNvbXBhcmF0b3IgZnVuY3Rpb24gZm9yIHNvcnRpbmcgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnQoKSB7XG4gICAgcmV0dXJuIChlbDE6IE1vZGVsLCBlbDI6IE1vZGVsKSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBcIm9yZGVyQnlTZWxlY3RvciBub3Qgc2V0LiBTaG91bGQgYmUgaW1wb3NzaWJsZVwiXG4gICAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMub3JkZXJCeVNlbGVjdG9yO1xuICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IHNlbGVjdG9yO1xuICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoZWwxLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgIGlmICghdHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBzb3J0aW5nOiAke3R5cGV9YCk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IDEgOiAtMSkgKlxuICAgICAgICAgICAgKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5sb2NhbGVDb21wYXJlKFxuICAgICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAoKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgbnVtYmVyKSAtXG4gICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIG51bWJlcikpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBpbnN0YW5jZW9mIERhdGVcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAgICgoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBEYXRlKS52YWx1ZU9mKCkgLVxuICAgICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIERhdGUpLnZhbHVlT2YoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYFNvcnRpbmcgbm90IHN1cHBvcnRlZCBmb3Igbm90IGRhdGUgY2xhc3Nlc2ApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGBzb3J0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFJBTSBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIHNlbGVjdG9ycyBhbmQgY29uZGl0aW9ucyBpbnRvIGEgUmF3UmFtUXVlcnkgb2JqZWN0XG4gICAqIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBSQU0gYWRhcHRlci4gVGhpcyBtZXRob2QgYXNzZW1ibGVzIGFsbCBxdWVyeSBjb21wb25lbnRzXG4gICAqIChzZWxlY3QsIGZyb20sIHdoZXJlLCBsaW1pdCwgb2Zmc2V0LCBzb3J0KSBpbnRvIHRoZSBmaW5hbCBxdWVyeSBzdHJ1Y3R1cmUuXG4gICAqIEByZXR1cm4ge1Jhd1JhbVF1ZXJ5PE0+fSBUaGUgY29uc3RydWN0ZWQgUkFNIHF1ZXJ5IG9iamVjdFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJhd1JhbVF1ZXJ5PE0+ID0ge1xuICAgICAgc2VsZWN0OiB0aGlzLnNlbGVjdFNlbGVjdG9yLFxuICAgICAgZnJvbTogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICB3aGVyZTogdGhpcy53aGVyZUNvbmRpdGlvblxuICAgICAgICA/IHRoaXMucGFyc2VDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbikud2hlcmVcbiAgICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgKGVsOiBNKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgbGltaXQ6IHRoaXMubGltaXRTZWxlY3RvcixcbiAgICAgIHNraXA6IHRoaXMub2Zmc2V0U2VsZWN0b3IsXG4gICAgfTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHJlc3VsdC5zb3J0ID0gdGhpcy5nZXRTb3J0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHdyYXBzIGl0IGluIGEgUmFtUGFnaW5hdG9yIHRvIGVuYWJsZSBwYWdpbmF0aW9uIG9mIHJlc3VsdHMuXG4gICAqIFRoaXMgYWxsb3dzIHJldHJpZXZpbmcgbGFyZ2UgcmVzdWx0IHNldHMgaW4gc21hbGxlciBjaHVua3MuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIHBhZ2Ugc2l6ZSAobnVtYmVyIG9mIHJlc3VsdHMgcGVyIHBhZ2UpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yIGZvciB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiBuZXcgUmFtUGFnaW5hdG9yPE0sIFI+KFxuICAgICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBzaXplLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBSQU0gcXVlcnkgcHJlZGljYXRlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWRcbiAgICogdG8gZmlsdGVyIG1vZGVsIGluc3RhbmNlcyBpbiBtZW1vcnkuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBzaW1wbGUgY29uZGl0aW9uc1xuICAgKiAoZXF1YWxzLCBncmVhdGVyIHRoYW4sIGV0Yy4pIGFuZCBjb21wbGV4IGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUikuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IEEgUkFNIHF1ZXJ5IG9iamVjdCB3aXRoIGEgd2hlcmUgcHJlZGljYXRlIGZ1bmN0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbVN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFNpbXBsZUNvbmRpdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IENvbXBsZXhDb25kaXRpb25cbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICogICBhbHQgU2ltcGxlIGNvbmRpdGlvbiAoZXEsIGd0LCBsdCwgZXRjLilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlNpbXBsZUNvbmRpdGlvbjogRXh0cmFjdCBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb25cbiAgICogICAgIFNpbXBsZUNvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IFJldHVybiBwcmVkaWNhdGUgZnVuY3Rpb25cbiAgICogICBlbHNlIExvZ2ljYWwgb3BlcmF0b3IgKEFORCwgT1IpXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5Db21wbGV4Q29uZGl0aW9uOiBFeHRyYWN0IG5lc3RlZCBjb25kaXRpb25zXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGxlZnRDb25kaXRpb24pXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKHJpZ2h0Q29uZGl0aW9uKVxuICAgKiAgICAgQ29tcGxleENvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IENvbWJpbmUgcHJlZGljYXRlcyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JcbiAgICogICBlbmRcbiAgICogICBSYW1TdGF0ZW1lbnQtLT4+Q2FsbGVyOiBSZXR1cm4gcXVlcnkgd2l0aCB3aGVyZSBwcmVkaWNhdGVcbiAgICovXG4gIHBhcnNlQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBSYXdSYW1RdWVyeTxNPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiAobTogTW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICAgICApID09PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID4gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPj0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRElGRkVSRU5UOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkVRVUFMOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlJFR0VYUDpcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBJbnZhbGlkIHJlZ2V4cCBjb21wYXJpc29uIG9uIGEgbm9uIHN0cmluZyBhdHRyaWJ1dGU6ICR7bVthdHRyMSBhcyBrZXlvZiBNb2RlbF19YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiAhIShtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZykubWF0Y2goXG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChjb21wYXJpc29uLCBcImdcIilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDwgY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDw9IGNvbXBhcmlzb247XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3Igc3RhbmRhcmQgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb3AxOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGF0dHIxIGFzIENvbmRpdGlvbjxNPlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3AyOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pICYmIG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG9wMS53aGVyZShtKSB8fCBvcDIud2hlcmUobSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3IgQW5kL09yIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBhcyBSYXdSYW1RdWVyeTxhbnk+O1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRleHQgY2xhc3MgZm9yIFJBTSBhZGFwdGVyIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgY29udGV4dCBmb3IgUkFNIGFkYXB0ZXIgb3BlcmF0aW9ucywgZXh0ZW5kaW5nIHRoZSBiYXNlIENvbnRleHQgd2l0aCBSQU0tc3BlY2lmaWMgZmxhZ3MuIFRoaXMgY29udGV4dCBpcyB1c2VkIHRvIHBhc3Mgb3BlcmF0aW9uIHBhcmFtZXRlcnMgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gKiBAY2xhc3MgUmFtQ29udGV4dFxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBSQU0gY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IG5ldyBSYW1Db250ZXh0KCk7XG4gKiAvLyBPcHRpb25hbGx5IHNldCBhIGZsYWdcbiAqIGNvbnRleHQuc2V0KCdVVUlEJywgJzEyM2U0NTY3LWU4OWItMTJkMy1hNDU2LTQyNjYxNDE3NDAwMCcpO1xuICogLy8gQWNjZXNzIGEgZmxhZyBmcm9tIHRoZSBjb250ZXh0XG4gKiBjb25zdCB1dWlkID0gY29udGV4dC5nZXQoJ1VVSUQnKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgUmFtQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBCYXNlQ29udGV4dCBhcyBDb250ZXh0XG4gKiAgIENhbGxlci0+PlJhbUNvbnRleHQ6IG5ldyBSYW1Db250ZXh0KClcbiAqICAgUmFtQ29udGV4dC0+PkJhc2VDb250ZXh0OiBzdXBlcigpXG4gKiAgIFJhbUNvbnRleHQtLT4+Q2FsbGVyOiBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgUmFtQ29udGV4dCBleHRlbmRzIENvbnRleHQ8UmFtRmxhZ3M+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEJhc2VNb2RlbCwgaW5kZXgsIHRhYmxlIH0gZnJvbSBcIi4uLy4uL21vZGVsXCI7XG5pbXBvcnQgeyBwayB9IGZyb20gXCIuLi8uLi9pZGVudGl0eVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0gc2VxdWVuY2UgbW9kZWwgZm9yIGF1dG8taW5jcmVtZW50aW5nIHZhbHVlc1xuICogQHN1bW1hcnkgQSBtb2RlbCBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBpbiB0aGUgUkFNIGFkYXB0ZXIuIEl0IHN0b3JlcyB0aGUgY3VycmVudCB2YWx1ZVxuICogb2YgYSBzZXF1ZW5jZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgaWRlbnRpZmllcnMgZm9yIGVudGl0aWVzLlxuICogVGhlIHNlcXVlbmNlIGlzIGlkZW50aWZpZWQgYnkgaXRzIElEIGFuZCBtYWludGFpbnMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKiBAcGFyYW0ge01vZGVsQXJnPFNlcXVlbmNlPn0gc2VxIC0gSW5pdGlhbCBzZXF1ZW5jZSBkYXRhXG4gKiBAY2xhc3MgU2VxdWVuY2VcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgc2VxdWVuY2VcbiAqIGNvbnN0IG9yZGVyU2VxdWVuY2UgPSBuZXcgU2VxdWVuY2UoeyBpZDogJ29yZGVyX3NlcScsIGN1cnJlbnQ6IDEgfSk7XG4gKlxuICogLy8gVXNlIHRoZSBzZXF1ZW5jZSB0byBnZXQgdGhlIG5leHQgdmFsdWVcbiAqIGNvbnN0IG5leHRPcmRlcklkID0gcGFyc2VJbnQob3JkZXJTZXF1ZW5jZS5jdXJyZW50LnRvU3RyaW5nKCkpICsgMTtcbiAqIG9yZGVyU2VxdWVuY2UuY3VycmVudCA9IG5leHRPcmRlcklkO1xuICogYGBgXG4gKi9cbkB0YWJsZShcIl9fUmFtU2VxdWVuY2VcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmFtU2VxdWVuY2VNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBrZXkgaWRlbnRpZmllciBmb3IgdGhlIHNlcXVlbmNlXG4gICAqL1xuICBAcGsoKVxuICBpZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIFVzZWQgdG8gZ2VuZXJhdGUgdGhlIG5leHQgc2VxdWVudGlhbCB2YWx1ZVxuICAgKi9cbiAgQHJlcXVpcmVkKClcbiAgQGluZGV4KClcbiAgY3VycmVudCE6IHN0cmluZyB8IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZXE/OiBNb2RlbEFyZzxSYW1TZXF1ZW5jZU1vZGVsPikge1xuICAgIHN1cGVyKHNlcSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJhbVNlcXVlbmNlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC9SYW1TZXF1ZW5jZU1vZGVsXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tIFwiLi9SYW1BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHNlcXVlbmNlIGltcGxlbWVudGF0aW9uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFNlcXVlbmNlIGNsYXNzIHRvIHByb3ZpZGUgYXV0by1pbmNyZW1lbnRpbmcgc2VxdWVuY2UgZnVuY3Rpb25hbGl0eVxuICogZm9yIHRoZSBSQU0gYWRhcHRlci4gVGhpcyBjbGFzcyBtYW5hZ2VzIHNlcXVlbmNlcyBzdG9yZWQgaW4gbWVtb3J5LCBhbGxvd2luZyBmb3IgdGhlIGdlbmVyYXRpb25cbiAqIG9mIHNlcXVlbnRpYWwgaWRlbnRpZmllcnMgZm9yIGVudGl0aWVzLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICogQHBhcmFtIHtSYW1BZGFwdGVyfSBhZGFwdGVyIC0gVGhlIFJBTSBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3Igc3RvcmFnZVxuICogQGNsYXNzIFJhbVNlcXVlbmNlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IG51bWVyaWMgc2VxdWVuY2Ugc3RhcnRpbmcgYXQgMVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUmFtU2VxdWVuY2Uoe1xuICogICBuYW1lOiAnb3JkZXJfc2VxdWVuY2UnLFxuICogICB0eXBlOiAnTnVtYmVyJyxcbiAqICAgc3RhcnRXaXRoOiAxLFxuICogICBpbmNyZW1lbnRCeTogMVxuICogfSwgcmFtQWRhcHRlcik7XG4gKlxuICogLy8gR2V0IHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICogY29uc3QgbmV4dElkID0gYXdhaXQgc2VxdWVuY2UubmV4dCgpO1xuICpcbiAqIC8vIEdldCBhIHJhbmdlIG9mIHZhbHVlc1xuICogY29uc3QgaWRSYW5nZSA9IGF3YWl0IHNlcXVlbmNlLnJhbmdlKDUpOyAvLyBSZXR1cm5zIDUgc2VxdWVudGlhbCB2YWx1ZXNcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIHByb3RlY3RlZCByZXBvOiBSZXBvPFJhbVNlcXVlbmNlTW9kZWw+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucywgYWRhcHRlcjogUmFtQWRhcHRlcikge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoUmFtU2VxdWVuY2VNb2RlbCwgYWRhcHRlci5hbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UgZnJvbSBzdG9yYWdlLiBJZiB0aGUgc2VxdWVuY2VcbiAgICogZG9lc24ndCBleGlzdCB5ZXQsIGl0IHJldHVybnMgdGhlIGNvbmZpZ3VyZWQgc3RhcnRpbmcgdmFsdWUuXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWVcbiAgICovXG4gIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IG5hbWUsIHN0YXJ0V2l0aCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXF1ZW5jZTogUmFtU2VxdWVuY2VNb2RlbCA9IGF3YWl0IHRoaXMucmVwby5yZWFkKG5hbWUgYXMgc3RyaW5nKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKHNlcXVlbmNlLmN1cnJlbnQgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXJ0V2l0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIFwiU3RhcnRpbmcgdmFsdWUgaXMgbm90IGRlZmluZWQgZm9yIGEgbm9uIGV4aXN0aW5nIHNlcXVlbmNlXCJcbiAgICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKHN0YXJ0V2l0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBpbml0aWFsIHZhbHVlIGZvciBzZXF1ZW5jZSAke3N0YXJ0V2l0aH06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmV0cmlldmUgY3VycmVudCB2YWx1ZSBmb3Igc2VxdWVuY2UgJHtuYW1lfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHNlcXVlbmNlIHR5cGVcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlIHNlcXVlbmNlIChzdHJpbmcsIG51bWJlciwgb3IgYmlnaW50KVxuICAgKiB1c2luZyB0aGUgYmFzZSBTZXF1ZW5jZSBjbGFzcydzIHBhcnNlVmFsdWUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGFyc2VcbiAgICogQHJldHVybiB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBUaGUgcGFyc2VkIHZhbHVlIGluIHRoZSBjb3JyZWN0IHR5cGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2UodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgcmV0dXJuIFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLnR5cGUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgdmFsdWVcbiAgICogQHN1bW1hcnkgSW5jcmVhc2VzIHRoZSBjdXJyZW50IHNlcXVlbmNlIHZhbHVlIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50IGFuZCBwZXJzaXN0c1xuICAgKiB0aGUgbmV3IHZhbHVlIHRvIHN0b3JhZ2UuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBudW1lcmljIGFuZCBCaWdJbnQgc2VxdWVuY2UgdHlwZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdIC0gT3B0aW9uYWwgYW1vdW50IHRvIGluY3JlbWVudCBieSwgZGVmYXVsdHMgdG8gdGhlIHNlcXVlbmNlJ3MgaW5jcmVtZW50QnkgdmFsdWVcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHNlcXVlbmNlIHZhbHVlIGFmdGVyIGluY3JlbWVudGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGxldCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgY29uc3QgdG9JbmNyZW1lbnRCeSA9IGNvdW50IHx8IGluY3JlbWVudEJ5O1xuICAgIGlmICh0b0luY3JlbWVudEJ5ICUgaW5jcmVtZW50QnkgIT09IDApXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFZhbHVlIHRvIGluY3JlbWVudCBkb2VzIG5vdCBjb25zaWRlciB0aGUgaW5jcmVtZW50Qnkgc2V0dGluZzogJHtpbmNyZW1lbnRCeX1gXG4gICAgICApO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICBuZXh0ID0gKHRoaXMucGFyc2UoY3VycmVudCkgYXMgbnVtYmVyKSArIHRvSW5jcmVtZW50Qnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICBuZXh0ID0gKHRoaXMucGFyc2UoY3VycmVudCkgYXMgYmlnaW50KSArIEJpZ0ludCh0b0luY3JlbWVudEJ5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBuZXZlciBoYXBwZW5cIik7XG4gICAgfVxuICAgIGxldCBzZXE6IFJhbVNlcXVlbmNlTW9kZWw7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMucmVwby5vdmVycmlkZSh7XG4gICAgICBpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXM6IFtcInVwZGF0ZWRPblwiXSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgc2VxID0gYXdhaXQgcmVwby51cGRhdGUobmV3IFJhbVNlcXVlbmNlTW9kZWwoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHNlcSA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBSYW1TZXF1ZW5jZU1vZGVsKHsgaWQ6IG5hbWUsIGN1cnJlbnQ6IG5leHQgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXEuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UgYW5kIGluY3JlbWVudHMgaXQgYnkgdGhlXG4gICAqIGNvbmZpZ3VyZWQgaW5jcmVtZW50IGFtb3VudC4gVGhpcyBpcyB0aGUgbWFpbiBtZXRob2QgdXNlZCB0byBnZXQgYSBuZXcgc2VxdWVudGlhbCB2YWx1ZS5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSByYW5nZSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIGZyb20gdGhlIHNlcXVlbmNlLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGFsbG9jYXRlIG11bHRpcGxlIElEcyBhdCBvbmNlLlxuICAgKiBUaGUgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlcXVlbmNlIGJ5IHRoZSB0b3RhbCBhbW91bnQgbmVlZGVkIGFuZCByZXR1cm5zIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIGdlbmVyYXRlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKFxuICAgICAgdGhpcy5vcHRpb25zLmluY3JlbWVudEJ5IGFzIG51bWJlclxuICAgICkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5pbXBvcnQgeyBSYW1GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNyZWF0ZWQgYnkgZmllbGQgb24gYSBtb2RlbCBkdXJpbmcgUkFNIGNyZWF0ZS91cGRhdGUgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQXV0b21hdGljYWxseSBwb3B1bGF0ZXMgYSBtb2RlbCBmaWVsZCB3aXRoIHRoZSBVVUlEIGZyb20gdGhlIGNvbnRleHQgZHVyaW5nIGNyZWF0ZSBvciB1cGRhdGUgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGhhbmRsZXIgZm9yIFJBTSBvcGVyYXRpb25zIHRvIHRyYWNrIGVudGl0eSBjcmVhdGlvbi5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBvZiB0aGUgbW9kZWwgYmVpbmcgY3JlYXRlZC91cGRhdGVkXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgb2YgdGhlIHJlcG9zaXRvcnkgaGFuZGxpbmcgdGhlIG1vZGVsXG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUeXBlIG9mIHRoZSBSQU0gZmxhZ3NcbiAqIEB0ZW1wbGF0ZSBDIC0gVHlwZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaWRlbnRpZmljYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSBVVUlEXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQvdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmllbGQgaGFzIGJlZW4gc2V0XG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQGNhdGVnb3J5IFJhbVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJhbUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gIGlmICghdXVpZClcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIHRoZSBSQU0gYWRhcHRlclxuICogQHN1bW1hcnkgQSBjb25zdGFudCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBSQU0gYWRhcHRlciBpbiB0aGUgc3lzdGVtLiBVc2VkIGZvciBhZGFwdGVyIHR5cGUgaWRlbnRpZmljYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gYWNyb3NzIHRoZSBjb3JlIG1vZHVsZS5cbiAqIEBjb25zdCBSYW1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbUZsYXZvdXIgPSBcInJhbVwiO1xuIiwiaW1wb3J0IHtcbiAgUmFtRmxhZ3MsXG4gIFJhd1JhbVF1ZXJ5LFxuICBSYW1TdG9yYWdlLFxuICBSYW1SZXBvc2l0b3J5LFxuICBSYW1Db25maWcsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNvbnRleHQgfSBmcm9tIFwiLi9SYW1Db250ZXh0XCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIGhhc2hPYmosXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1TZXF1ZW5jZSB9IGZyb20gXCIuL1JhbVNlcXVlbmNlXCI7XG5pbXBvcnQgeyBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQgeyBSYW1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChSYW1GbGF2b3VyKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IGFkYXB0ZXIgZm9yIGRhdGEgcGVyc2lzdGVuY2VcbiAqIEBzdW1tYXJ5IFRoZSBSYW1BZGFwdGVyIHByb3ZpZGVzIGFuIGluLW1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIuXG4gKiBJdCBzdG9yZXMgZGF0YSBpbiBKYXZhU2NyaXB0IE1hcHMgYW5kIHByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgcXVlcnkgY2FwYWJpbGl0aWVzLlxuICogVGhpcyBhZGFwdGVyIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgcHJvdG90eXBpbmcsIGFuZCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCByZXF1aXJlXG4gKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWNyb3NzIGFwcGxpY2F0aW9uIHJlc3RhcnRzLlxuICogQGNsYXNzIFJhbUFkYXB0ZXJcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgUkFNIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUmFtQWRhcHRlcignbXlSYW1BZGFwdGVyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShVc2VyLCBhZGFwdGVyKTtcbiAqXG4gKiAvLyBQZXJmb3JtIENSVUQgb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IG5ldyBVc2VyKHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYXdhaXQgdXNlclJlcG8uY3JlYXRlKHVzZXIpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLmZpbmRCeUlkKHVzZXIuaWQpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICogICBSYW1BZGFwdGVyLS0+PlJlcG9zaXRvcnk6IG1vZGVsXG4gKiAgIFJlcG9zaXRvcnktLT4+Q2xpZW50OiBtb2RlbFxuICpcbiAqICAgQ2xpZW50LT4+UmVwb3NpdG9yeTogZmluZEJ5SWQoaWQpXG4gKiAgIFJlcG9zaXRvcnktPj5SYW1BZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogbW9kZWxcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1Db25maWcsXG4gIFJhbVN0b3JhZ2UsXG4gIFJhd1JhbVF1ZXJ5PGFueT4sXG4gIFJhbUZsYWdzLFxuICBSYW1Db250ZXh0XG4+IHtcbiAgY29uc3RydWN0b3IoY29uZjogUmFtQ29uZmlnID0ge30gYXMgYW55LCBhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKGNvbmYsIFJhbUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZGVsIHR5cGUuXG4gICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIFJBTS1zcGVjaWZpYyByZXBvc2l0b3J5IGZ1bmN0aW9uYWxpdHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+fSBBIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBSQU0gcmVwb3NpdG9yaWVzXG4gICAqL1xuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogQ29uc3RydWN0b3I8XG4gICAgUmFtUmVwb3NpdG9yeTxNPlxuICA+IHtcbiAgICByZXR1cm4gc3VwZXIucmVwb3NpdG9yeTxNPigpIGFzIENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyB3aXRoIFVVSURcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBmbGFncyB3aXRoIGEgVVVJRCBmb3IgdXNlciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IGFsbCBvcGVyYXRpb25zIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxSYW1GbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBleHRlbmRlZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJhbUZsYWdzPn0gQ29tcGxldGUgZmxhZ3Mgd2l0aCBVVUlEXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UmFtRmxhZ3M+XG4gICk6IFByb21pc2U8UmFtRmxhZ3M+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IHRoaXMuY29uZmlnLnVzZXIgfHwgXCJcIiArIERhdGUubm93KCksXG4gICAgfSkgYXMgUmFtRmxhZ3M7XG4gIH1cblxuICBvdmVycmlkZSBDb250ZXh0ID0gUmFtQ29udGV4dDtcblxuICBwcml2YXRlIGluZGV4ZXM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgYW55Pj5cbiAgPiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jayA9IG5ldyBMb2NrKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRleGVzIG1vZGVscyBpbiB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbmRleGluZyBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGV4cGxpY2l0IGluZGV4aW5nLCB0aGlzIG1ldGhvZCBzaW1wbHkgcmVzb2x2ZXMgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBNb2RlbHMgdG8gYmUgaW5kZXhlZCAodW51c2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5kZXhpbmcgaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5kZXgoLi4ubW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3Igc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBzdG9yYWdlIGluIHRoZSBSQU0gYWRhcHRlci5cbiAgICogVGhpcyBtZXRob2QgZXh0cmFjdHMgdGhlIHByaW1hcnkga2V5IGFuZCBjcmVhdGVzIGEgcmVjb3JkIHdpdGhvdXQgdGhlIHByaW1hcnkga2V5IGZpZWxkLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHByZXBhcmVkXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIE9iamVjdCBjb250YWluaW5nIHRoZSByZWNvcmQgYW5kIElEXG4gICAqL1xuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKTogeyByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT47IGlkOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG4gICAgZGVsZXRlIHByZXBhcmVkLnJlY29yZFtwayBhcyBzdHJpbmddO1xuICAgIHJldHVybiBwcmVwYXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdG9yZWQgcmVjb3JkIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGEgc3RvcmVkIHJlY29yZCBieSBhZGRpbmcgYmFjayB0aGUgcHJpbWFyeSBrZXkuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBwcmVwYXJlIG1ldGhvZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0byByZXZlcnQgdG9cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmogLSBUaGUgc3RvcmVkIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IE0ge1xuICAgIGNvbnN0IHJlcyA9IHN1cGVyLnJldmVydChvYmosIGNsYXp6LCBwaywgaWQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBTdG9yZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBzcGVjaWZpZWQgdGFibGUgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY3JlYXRlcyB0aGUgdGFibGUgaWYgaXQgZG9lc24ndCBleGlzdCxcbiAgICogY2hlY2tzIGZvciBjb25mbGljdHMsIGFuZCBzdG9yZXMgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZWNvcmQgaW5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgcmVjb3JkIGRhdGEgdG8gc3RvcmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN0b3JlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQodGFibGVOYW1lLCBuZXcgTWFwKCkpXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IENvbmZsaWN0RXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSkgdGhpcy5jbGllbnQuc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKTtcbiAgICBpZiAodGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSkgJiYgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0IGFuZCB0aHJvd3MgYXBwcm9wcmlhdGUgZXJyb3JzIGlmIG5vdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZXRyaWV2ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogYW5kIHVwZGF0ZXMgdGhlIHJlY29yZCB3aXRoIHRoZSBuZXcgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbmV3IHJlY29yZCBkYXRhXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHVwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LnNldChpZCwgbW9kZWwpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCxcbiAgICogcmV0cmlldmVzIHRoZSByZWNvcmQgYmVmb3JlIGRlbGV0aW9uLCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBjb250YWluaW5nIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IGRlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBnZXQoaWQpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiByZWNvcmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZGVsZXRlKGlkKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGVOYW1lKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgbmF0aXZlZCA9IHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5nZXQoaWQpO1xuICAgIHRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5kZWxldGUoaWQpO1xuICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgcmV0dXJuIG5hdGl2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgY3JlYXRlcyBhIHRhYmxlIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIE1hcCByZXByZXNlbnRpbmcgYSB0YWJsZSBmb3IgYSBnaXZlbiBtb2RlbCBvciB0YWJsZSBuYW1lLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHVzZWRcbiAgICogYnkgb3RoZXIgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc3RvcmFnZSBsb2NhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3I8TT59IGZyb20gLSBUaGUgbW9kZWwgY2xhc3Mgb3IgdGFibGUgbmFtZVxuICAgKiBAcmV0dXJuIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBhbnk+IHwgdW5kZWZpbmVkfSBUaGUgdGFibGUgTWFwIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIHRhYmxlRm9yPE0gZXh0ZW5kcyBNb2RlbD4oZnJvbTogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09IFwic3RyaW5nXCIpIGZyb20gPSBNb2RlbC5nZXQoZnJvbSkgYXMgQ29uc3RydWN0b3I8TT47XG4gICAgY29uc3QgdGFibGUgPSBSZXBvc2l0b3J5LnRhYmxlKGZyb20pO1xuICAgIGlmICghdGhpcy5jbGllbnQuaGFzKHRhYmxlKSkgdGhpcy5jbGllbnQuc2V0KHRhYmxlLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQodGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhIHF1ZXJ5IG9wZXJhdGlvbiBvbiB0aGUgaW4tbWVtb3J5IGRhdGEgc3RvcmUgdXNpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5IHNwZWNpZmljYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGZpbHRlcmluZywgc29ydGluZywgcGFnaW5hdGlvbiwgYW5kIGZpZWxkIHNlbGVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UmF3UmFtUXVlcnk8YW55Pn0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgc3BlY2lmaWNhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJhdyhyYXdJbnB1dClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogdGFibGVGb3IoZnJvbSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSlcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZW50cmllcygpXG4gICAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJldmVydChyLCBmcm9tLCBpZCwgcGspXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFdoZXJlIGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuZmlsdGVyKHdoZXJlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTb3J0IGNvbmRpdGlvbiBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc29ydChzb3J0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTa2lwIHNwZWNpZmllZFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zbGljZShza2lwKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBMaW1pdCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2UoMCwgbGltaXQpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNlbGVjdCBmaWVsZHMgc3BlY2lmaWVkXG4gICAqICAgICBsb29wIEZvciBlYWNoIHJlc3VsdFxuICAgKiAgICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogRmlsdGVyIHRvIHNlbGVjdGVkIGZpZWxkc1xuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBSYXdSYW1RdWVyeTxhbnk+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgeyB3aGVyZSwgc29ydCwgbGltaXQsIHNraXAsIGZyb20gfSA9IHJhd0lucHV0O1xuICAgIGxldCB7IHNlbGVjdCB9ID0gcmF3SW5wdXQ7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMudGFibGVGb3IoZnJvbSk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFRhYmxlICR7ZnJvbX0gbm90IGZvdW5kIGluIFJhbUFkYXB0ZXJgKTtcbiAgICBjb25zdCB7IGlkLCBwcm9wcyB9ID0gZmluZFByaW1hcnlLZXkobmV3IGZyb20oKSk7XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IEFycmF5LmZyb20oY29sbGVjdGlvbi5lbnRyaWVzKCkpLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICBmcm9tLFxuICAgICAgICBpZCBhcyBhbnksXG4gICAgICAgIFNlcXVlbmNlLnBhcnNlVmFsdWUocHJvcHMudHlwZSBhcyBhbnksIHBrIGFzIHN0cmluZykgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcblxuICAgIHJlc3VsdCA9IHdoZXJlID8gcmVzdWx0LmZpbHRlcih3aGVyZSkgOiByZXN1bHQ7XG5cbiAgICBpZiAoc29ydCkgcmVzdWx0ID0gcmVzdWx0LnNvcnQoc29ydCk7XG5cbiAgICBpZiAoc2tpcCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKHNraXApO1xuICAgIGlmIChsaW1pdCkgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGxpbWl0KTtcblxuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIHNlbGVjdCA9IEFycmF5LmlzQXJyYXkoc2VsZWN0KSA/IHNlbGVjdCA6IFtzZWxlY3RdO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocikgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocikucmVkdWNlKChhY2M6IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAoKHNlbGVjdCBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoa2V5KSkgYWNjW2tleV0gPSB2YWw7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBSO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYW5kIGNvbnZlcnRzIGVycm9ycyB0byBhcHByb3ByaWF0ZSB0eXBlc1xuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgZXJyb3JzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nLlxuICAgKiBJZiB0aGUgZXJyb3IgaXMgYWxyZWFkeSBhIEJhc2VFcnJvciwgaXQncyByZXR1cm5lZCBhcyBpczsgb3RoZXJ3aXNlLCBpdCdzIHdyYXBwZWQgaW4gYW4gSW50ZXJuYWxFcnJvci5cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgZXhwZWN0ZWQgZXJyb3IgdHlwZSwgZXh0ZW5kaW5nIEJhc2VFcnJvclxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHJldHVybiB7Vn0gVGhlIHBhcnNlZCBlcnJvciBvZiB0aGUgZXhwZWN0ZWQgdHlwZVxuICAgKi9cbiAgcGFyc2VFcnJvcjxWIGV4dGVuZHMgQmFzZUVycm9yPihlcnI6IEVycm9yKTogViB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBWO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpIGFzIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHF1ZXJpZXNcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFJhbVN0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllcy5cbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIGZvciBmbHVlbnQgcXVlcnkgY29uc3RydWN0aW9uIGFnYWluc3QgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgc3RhdGVtZW50XG4gICAqIEByZXR1cm4ge1JhbVN0YXRlbWVudDxNLCBhbnk+fSBBIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBpbnN0YW5jZVxuICAgKi9cbiAgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogUmFtU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50PE0sIGFueT4odGhpcyBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHNlcXVlbnRpYWwgSURzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TZXF1ZW5jZSBpbnN0YW5jZSBmb3IgSUQgZ2VuZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIGF1dG8taW5jcmVtZW50aW5nIHNlcXVlbmNlcyBmb3IgZW50aXR5IElEcy5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG92ZXJyaWRlIGZvcihjb25maWc6IFBhcnRpYWw8UmFtQ29uZmlnPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcywgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogYW55KSA9PiB7XG4gICAgICAgIGlmIChwID09PSBcIl9jb25maWdcIikge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uZjogUmFtQ29uZmlnID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbmFsQ29uZiwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucHJveGllc1trZXldID0gcHJveHk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIFJBTS1zcGVjaWZpYyBkZWNvcmF0aW9ucyBmb3IgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRpb25zIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdXAgaGFuZGxlcnMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gICAqIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyB3aXRoIHRoZSBjdXJyZW50IHVzZXIncyBVVUlEIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUmFtQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlJhbUFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKTogdm9pZCB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Q2xpZW50KCk6IFJhbVN0b3JhZ2Uge1xuICAgIHJldHVybiBuZXcgTWFwKCk7XG4gIH1cbn1cblxuUmFtQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5BZGFwdGVyLnNldEN1cnJlbnQoUmFtRmxhdm91cik7XG4iLCIvKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGRlc2NyaXB0aW9uIENvcmUgbW9kdWxlIGZvciB0aGUgRGVjYWYgVHlwZVNjcmlwdCBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50cyBvZiB0aGUgRGVjYWYgZnJhbWV3b3JrLCBpbmNsdWRpbmcgaWRlbnRpdHkgbWFuYWdlbWVudCxcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5L2luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG4vLyBpbXBvcnRlZCBmaXJzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYW0vUmFtQWRhcHRlclwiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJQZXJzaXN0ZW5jZUtleXMiLCJCYWRSZXF1ZXN0RXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiTW9kZWwiLCJSZXBvc2l0b3J5IiwiRGVjb3JhdGlvbiIsIkRlZmF1bHRGbGF2b3VyIiwiTG9nZ2VkQ2xhc3MiLCJDb250ZXh0IiwiRGVmYXVsdFJlcG9zaXRvcnlGbGFncyIsIk9wZXJhdGlvbktleXMiLCJtb2RlbFRvVHJhbnNpZW50IiwiUmVwbyIsIkRCS2V5cyIsImhhc2hPYmoiLCJfX2RlY29yYXRlIiwiT3JkZXJEaXJlY3Rpb24iLCJDYXNjYWRlIiwiTG9nZ2luZyIsImFwcGx5IiwibWV0YWRhdGEiLCJSZXAiLCJ3cmFwTWV0aG9kV2l0aENvbnRleHQiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsImZpbmRQcmltYXJ5S2V5IiwiUmVmbGVjdGlvbiIsInNmIiwiSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIiwiSW5qZWN0YWJsZXMiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJpbmplY3QiLCJNb2RlbEtleXMiLCJpbmplY3RhYmxlIiwiT3BlcmF0b3IiLCJHcm91cE9wZXJhdG9yIiwicmVxdWlyZWQiLCJOb3RGb3VuZEVycm9yIiwiVmFsaWRhdGlvbiIsIlZhbGlkYXRpb25LZXlzIiwicHJvcE1ldGFkYXRhIiwiQ29uZmxpY3RFcnJvciIsIm9uQ3JlYXRlVXBkYXRlIiwib25DcmVhdGUiLCJ0aW1lc3RhbXAiLCJwb3B1bGF0ZSIsInByb3AiLCJ0eXBlIiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImFmdGVyQW55IiwicG9wIiwibGlzdCIsInJlYWRvbmx5IiwiX19tZXRhZGF0YSIsIlF1ZXJ5Q2xhdXNlIiwibW9kZWwiLCJMb2NrIiwiQmFzZUVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFBQTs7Ozs7O0lBTUc7QUFDU0E7SUFBWixDQUFBLFVBQVksZUFBZSxFQUFBOztJQUV6QixJQUFBLGVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUdmLElB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
|
5725
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9wZXJzaXN0ZW5jZS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91dGlscy9lcnJvcnMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvT2JzZXJ2ZXJIYW5kbGVyLnRzIiwiLi4vc3JjL2lkZW50aXR5L3V0aWxzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL0FkYXB0ZXIudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcGVyc2lzdGVuY2UvZXJyb3JzLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL1NlcXVlbmNlLnRzIiwiLi4vc3JjL3BlcnNpc3RlbmNlL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL3JlcG9zaXRvcnkvdXRpbHMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9pbmplY3RhYmxlcy50cyIsIi4uL3NyYy9wZXJzaXN0ZW5jZS9EaXNwYXRjaC50cyIsIi4uL3NyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVwb3NpdG9yeS9lcnJvcnMudHMiLCIuLi9zcmMvaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnMudHMiLCIuLi9zcmMvcXVlcnkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3F1ZXJ5L2Vycm9ycy50cyIsIi4uL3NyYy9xdWVyeS9Db25kaXRpb24udHMiLCIuLi9zcmMvbW9kZWwvY29uc3RydWN0aW9uLnRzIiwiLi4vc3JjL21vZGVsL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvaWRlbnRpdHkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9CYXNlTW9kZWwudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyIsIi4uL3NyYy9xdWVyeS90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS91dGlscy50cyIsIi4uL3NyYy9xdWVyeS9NZXRob2RRdWVyeUJ1aWxkZXIudHMiLCIuLi9zcmMvcXVlcnkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9yYW0vUmFtUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3JhbS9SYW1TdGF0ZW1lbnQudHMiLCIuLi9zcmMvcmFtL1JhbUNvbnRleHQudHMiLCIuLi9zcmMvcmFtL21vZGVsL1JhbVNlcXVlbmNlTW9kZWwudHMiLCIuLi9zcmMvcmFtL1JhbVNlcXVlbmNlLnRzIiwiLi4vc3JjL3JhbS9oYW5kbGVycy50cyIsIi4uL3NyYy9yYW0vY29uc3RhbnRzLnRzIiwiLi4vc3JjL3JhbS9SYW1BZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFBlcnNpc3RlbmNlLXJlbGF0ZWQgY29uc3RhbnQga2V5c1xuICogQHN1bW1hcnkgRW51bSBjb250YWluaW5nIHN0cmluZyBjb25zdGFudHMgdXNlZCB0aHJvdWdob3V0IHRoZSBwZXJzaXN0ZW5jZSBsYXllciBmb3IgbWV0YWRhdGEsIHJlbGF0aW9ucywgYW5kIG90aGVyIHBlcnNpc3RlbmNlLXJlbGF0ZWQgb3BlcmF0aW9uc1xuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIFBlcnNpc3RlbmNlS2V5cyB7XG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBpbmRleCBtZXRhZGF0YSAqL1xuICBJTkRFWCA9IFwiaW5kZXhcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdW5pcXVlIGNvbnN0cmFpbnQgbWV0YWRhdGEgKi9cbiAgVU5JUVVFID0gXCJ1bmlxdWVcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgYWRhcHRlciBtZXRhZGF0YSAqL1xuICBBREFQVEVSID0gXCJhZGFwdGVyXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBUZW1wbGF0ZSBmb3IgaW5qZWN0YWJsZSBhZGFwdGVyIG5hbWVzICovXG4gIElOSkVDVEFCTEUgPSBcImRlY2FmX3swfV9hZGFwdGVyX2Zvcl97MX1cIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdGFibGUgbmFtZSBtZXRhZGF0YSAqL1xuICBUQUJMRSA9IFwidGFibGVcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgY29sdW1uIG5hbWUgbWV0YWRhdGEgKi9cbiAgQ09MVU1OID0gXCJjb2x1bW5cIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgZ2VuZXJhbCBtZXRhZGF0YSBzdG9yYWdlICovXG4gIE1FVEFEQVRBID0gXCJfX21ldGFkYXRhXCIsXG5cbiAgLy8gT3duZXJzaGlwXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBjcmVhdGVkLWJ5IG93bmVyc2hpcCBtZXRhZGF0YSAqL1xuICBPV05FUlNISVAgPSBcIm93bmVyc2hpcFwiLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBjcmVhdGVkLWJ5IG93bmVyc2hpcCBtZXRhZGF0YSAqL1xuICBDUkVBVEVEX0JZID0gYCR7T1dORVJTSElQfS5jcmVhdGVkLWJ5YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgdXBkYXRlZC1ieSBvd25lcnNoaXAgbWV0YWRhdGEgKi9cbiAgVVBEQVRFRF9CWSA9IGAke09XTkVSU0hJUH0udXBkYXRlZC1ieWAsXG5cbiAgLy8gUmVsYXRpb25zXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHJlbGF0aW9ucyBtZXRhZGF0YSBzdG9yYWdlICovXG4gIFJFTEFUSU9OUyA9IFwiX19yZWxhdGlvbnNcIixcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgcmVsYXRpb25zIG1ldGFkYXRhIHN0b3JhZ2UgKi9cbiAgUkVMQVRJT04gPSBcInJlbGF0aW9uXCIsXG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIG9uZS10by1vbmUgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgT05FX1RPX09ORSA9IGAke1JFTEFUSU9OfS5vbmUtdG8tb25lYCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3Igb25lLXRvLW1hbnkgcmVsYXRpb24gbWV0YWRhdGEgKi9cbiAgT05FX1RPX01BTlkgPSBgJHtSRUxBVElPTn0ub25lLXRvLW1hbnlgLFxuXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBtYW55LXRvLW9uZSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBNQU5ZX1RPX09ORSA9IGAke1JFTEFUSU9OfS5tYW55LXRvLW9uZWAsXG4gIC8qKiBAZGVzY3JpcHRpb24gS2V5IGZvciBtYW55LXRvLW9uZSByZWxhdGlvbiBtZXRhZGF0YSAqL1xuICBNQU5ZX1RPX01BTlkgPSBgJHtSRUxBVElPTn0ubWFueS10by1tYW55YCxcblxuICAvKiogQGRlc2NyaXB0aW9uIEtleSBmb3IgcG9wdWxhdGUgbWV0YWRhdGEgKi9cbiAgUE9QVUxBVEUgPSBcInBvcHVsYXRlXCIsXG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbWFrZXMgYSBtZXRob2Qgbm9uLWNvbmZpZ3VyYWJsZVxuICogQHN1bW1hcnkgVGhpcyBkZWNvcmF0b3IgcHJldmVudHMgYSBtZXRob2QgZnJvbSBiZWluZyBvdmVycmlkZGVuIGJ5IG1ha2luZyBpdCBub24tY29uZmlndXJhYmxlLlxuICogSXQgdGhyb3dzIGFuIGVycm9yIGlmIHVzZWQgb24gYW55dGhpbmcgb3RoZXIgdGhhbiBhIG1ldGhvZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG1ldGhvZHNcbiAqIEBmdW5jdGlvbiBmaW5hbFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbCgpIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICghZGVzY3JpcHRvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmFsIGRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIG9uIG1ldGhvZHNcIik7XG4gICAgaWYgKGRlc2NyaXB0b3I/LmNvbmZpZ3VyYWJsZSkge1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBCYWRSZXF1ZXN0RXJyb3IsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gYW4gYWN0aW9uXG4gKiBAc3VtbWFyeSBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSByZXNvdXJjZSBvciBwZXJmb3JtIGFuIGFjdGlvbiB3aXRob3V0IHByb3BlciBhdXRoZW50aWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIEVycm9yIG9iamVjdFxuICogQGNsYXNzIEF1dGhvcml6YXRpb25FcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgdGhyb3dpbmcgYW4gQXV0aG9yaXphdGlvbkVycm9yXG4gKiBpZiAoIXVzZXIuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAqICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcignVXNlciBub3QgYXV0aGVudGljYXRlZCcpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3IgZXh0ZW5kcyBCYWRSZXF1ZXN0RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yLCBuYW1lID0gQXV0aG9yaXphdGlvbkVycm9yLm5hbWUsIGNvZGUgPSA0MDEpIHtcbiAgICBzdXBlcihtc2csIG5hbWUsIGNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgdXNlciBpcyBmb3JiaWRkZW4gZnJvbSBhY2Nlc3NpbmcgYSByZXNvdXJjZVxuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBhbiBhdXRoZW50aWNhdGVkIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgcmVzb3VyY2Ugb3IgcGVyZm9ybSBhbiBhY3Rpb24gdGhleSBkb24ndCBoYXZlIHBlcm1pc3Npb24gZm9yXG4gKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZvcmJpZGRlbkVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiB0aHJvd2luZyBhIEZvcmJpZGRlbkVycm9yXG4gKiBpZiAoIXVzZXIuaGFzUGVybWlzc2lvbignYWRtaW4nKSkge1xuICogICB0aHJvdyBuZXcgRm9yYmlkZGVuRXJyb3IoJ1VzZXIgZG9lcyBub3QgaGF2ZSBhZG1pbiBwZXJtaXNzaW9ucycpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5FcnJvciBleHRlbmRzIEF1dGhvcml6YXRpb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEZvcmJpZGRlbkVycm9yLm5hbWUsIDQwMyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSBjb25uZWN0aW9uIHRvIGEgc2VydmljZSBmYWlsc1xuICogQHN1bW1hcnkgVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiB0aGUgYXBwbGljYXRpb24gZmFpbHMgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byBhIHJlcXVpcmVkIHNlcnZpY2Ugb3IgcmVzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQ29ubmVjdGlvbkVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBvZiB0aHJvd2luZyBhIENvbm5lY3Rpb25FcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgZGF0YWJhc2UuY29ubmVjdCgpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignRmFpbGVkIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2UnKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIENvbm5lY3Rpb25FcnJvci5uYW1lLCA1MDMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBFdmVudElkcywgT2JzZXJ2ZXJGaWx0ZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZlcnMgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICogQHN1bW1hcnkgVGhlIE9ic2VydmVySGFuZGxlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBjZW50cmFsaXplZFxuICogd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBvYnNlcnZlcnMuIEl0IGFsbG93cyByZWdpc3RlcmluZyBvYnNlcnZlcnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzIHRvIGNvbnRyb2xcbiAqIHdoaWNoIGV2ZW50cyB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IsIGFuZCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIG5vdGlmeWluZyBhbGwgcmVsZXZhbnRcbiAqIG9ic2VydmVycyB3aGVuIGRhdGFiYXNlIGV2ZW50cyBvY2N1ci5cbiAqIEBjbGFzcyBPYnNlcnZlckhhbmRsZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaGFuZGxlclxuICogY29uc3QgaGFuZGxlciA9IG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlclxuICogY29uc3QgbXlPYnNlcnZlciA9IHtcbiAqICAgcmVmcmVzaDogYXN5bmMgKHRhYmxlLCBldmVudCwgaWQpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlIGluICR7dGFibGV9OiAke2V2ZW50fSBmb3IgSUQgJHtpZH1gKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiAvLyBBZGQgb2JzZXJ2ZXIgd2l0aCBhIGZpbHRlciBmb3Igb25seSB1c2VyIHRhYmxlIGV2ZW50c1xuICogaGFuZGxlci5vYnNlcnZlKG15T2JzZXJ2ZXIsICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB0YWJsZSA9PT0gJ3VzZXJzJyk7XG4gKlxuICogLy8gTm90aWZ5IG9ic2VydmVycyBhYm91dCBhbiBldmVudFxuICogYXdhaXQgaGFuZGxlci51cGRhdGVPYnNlcnZlcnMobG9nZ2VyLCAndXNlcnMnLCAnQ1JFQVRFJywgMTIzKTtcbiAqXG4gKiAvLyBSZW1vdmUgYW4gb2JzZXJ2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkXG4gKiBoYW5kbGVyLnVuT2JzZXJ2ZShteU9ic2VydmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyIGltcGxlbWVudHMgT2JzZXJ2YWJsZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBvYnNlcnZlciBvYmplY3RzIGFsb25nIHdpdGggdGhlaXIgb3B0aW9uYWwgZmlsdGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVyczoge1xuICAgIG9ic2VydmVyOiBPYnNlcnZlcjtcbiAgICBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcjtcbiAgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2Ygb2JzZXJ2ZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiByZWdpc3RlcmVkIG9ic2VydmVyc1xuICAgKi9cbiAgY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgbmV3IG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gdGhlIGNvbGxlY3Rpb24gd2l0aCBhbiBvcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMubWFwKChvKSA9PiBvLm9ic2VydmVyKS5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKHsgb2JzZXJ2ZXI6IG9ic2VydmVyLCBmaWx0ZXI6IGZpbHRlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVsZXZhbnQgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgRmlsdGVycyBvYnNlcnZlcnMgYmFzZWQgb24gdGhlaXIgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgY2FsbHMgcmVmcmVzaCBvbiBlYWNoIG1hdGNoaW5nIG9ic2VydmVyXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgZm9yIHJlY29yZGluZyBub3RpZmljYXRpb24gYWN0aXZpdGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJIYW5kbGVyXG4gICAqICAgcGFydGljaXBhbnQgT2JzZXJ2ZXJcbiAgICpcbiAgICogICBDbGllbnQtPj5PYnNlcnZlckhhbmRsZXI6IHVwZGF0ZU9ic2VydmVycyhsb2csIHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqXG4gICAqICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXJIYW5kbGVyOiBGaWx0ZXIgb2JzZXJ2ZXJzXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBvYnNlcnZlciB3aXRoIG1hdGNoaW5nIGZpbHRlclxuICAgKiAgICAgYWx0IE9ic2VydmVyIGhhcyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IEFwcGx5IGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKVxuICAgKiAgICAgICBhbHQgRmlsdGVyIHRocm93cyBlcnJvclxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIHRydWVcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKVxuICAgKiAgICAgICBlbHNlIEZpbHRlciByZXR1cm5zIGZhbHNlXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLS0+Pk9ic2VydmVySGFuZGxlcjogU2tpcCBvYnNlcnZlclxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgTm8gZmlsdGVyXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IFByb2Nlc3MgcmVzdWx0c1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggcmVzdWx0XG4gICAqICAgICBhbHQgUmVzdWx0IGlzIHJlamVjdGVkXG4gICAqICAgICAgIE9ic2VydmVySGFuZGxlci0+PkxvZ2dlcjogTG9nIGVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItLT4+Q2xpZW50OiBSZXR1cm5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBsb2c6IExvZ2dlcixcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhpcy5vYnNlcnZlcnNcbiAgICAgICAgLmZpbHRlcigobykgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyIH0gPSBvO1xuICAgICAgICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcih0YWJsZSwgZXZlbnQsIGlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmlsdGVyIG9ic2VydmVyICR7by5vYnNlcnZlci50b1N0cmluZygpfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAubWFwKChvKSA9PiB7XG4gICAgICAgICAgby5vYnNlcnZlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV0udG9TdHJpbmcoKX06ICR7cmVzdWx0LnJlYXNvbn1gXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsIGJ5IGNoZWNraW5nIG1ldGFkYXRhIG9yIGZhbGxpbmcgYmFjayB0byB0aGUgY29uc3RydWN0b3IgbmFtZVxuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdldCB0aGUgdGFibGUgbmFtZSBmb3JcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBtb2RlbFxuICogQGZ1bmN0aW9uIGdldFRhYmxlTmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU5hbWU8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb2JqID0gbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWw7XG5cbiAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSksXG4gICAgb2JqXG4gICk7XG4gIGlmIChtZXRhZGF0YSkge1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuICBpZiAobW9kZWwgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG4gIHJldHVybiBtb2RlbC5uYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSxcbiAgYXR0cmlidXRlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICBtb2RlbCxcbiAgICBhdHRyaWJ1dGVcbiAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEgOiBhdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHNlcXVlbmNlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgc2VxdWVuY2UgbmFtZSBieSBjb21iaW5pbmcgdGhlIHRhYmxlIG5hbWUgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICogQHRlbXBsYXRlIE0gLSBUeXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBuYW1lIGZvclxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGFyZ3MgLSBBZGRpdGlvbmFsIHN0cmluZyBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBzZXF1ZW5jZSBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgbmFtZVxuICogQGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlTmFtZUZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pIHtcbiAgcmV0dXJuIFtnZXRUYWJsZU5hbWUobW9kZWwpLCAuLi5hcmdzXS5qb2luKFwiX1wiKTtcbn1cbiIsImltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgREJLZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBDb250ZXh0LFxuICBPcGVyYXRpb25LZXlzLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHR1YWwsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWxUb1RyYW5zaWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgTW9kZWxSZWdpc3RyeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdFeGVjdXRvciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1Jhd0V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBFcnJvclBhcnNlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWUsIGdldFRhYmxlTmFtZSB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyRGlzcGF0Y2ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5EZWNvcmF0aW9uLnNldEZsYXZvdXJSZXNvbHZlcigob2JqOiBvYmplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgQWRhcHRlci5mbGF2b3VyT2YoTW9kZWwuaXNNb2RlbChvYmopID8gb2JqLmNvbnN0cnVjdG9yIDogKG9iaiBhcyBhbnkpKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fFxuICAgICAgRGVmYXVsdEZsYXZvdXJcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8IERlZmF1bHRGbGF2b3VyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxufSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEZhY2FkZSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UgYWRhcHRlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZGF0YWJhc2UgYWRhcHRlcnMgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUaGlzIGNsYXNzXG4gKiBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBwcm92aWRlIGEgY29uc2lzdGVudCBBUEkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMsIG9ic2VydmVyXG4gKiBwYXR0ZXJuIHN1cHBvcnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSXQgbWFuYWdlcyBhZGFwdGVyIHJlZ2lzdHJhdGlvbiwgQ1JVRCBvcGVyYXRpb25zLCBhbmRcbiAqIG9ic2VydmVyIG5vdGlmaWNhdGlvbnMuXG4gKiBAdGVtcGxhdGUgQ09ORklHIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDT05GSUd9IF9jb25maWcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtfYWxpYXNdIC0gT3B0aW9uYWwgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBhZGFwdGVyXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIGFkYXB0ZXJcbiAqIGNsYXNzIFBvc3RncmVzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8cGcuUG9vbENvbmZpZywgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLlBvb2xDb25maWcpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8RkxBR1M+ID0gQ29udGV4dDxGTEFHUz4sXG4gID5cbiAgZXh0ZW5kcyBMb2dnZWRDbGFzc1xuICBpbXBsZW1lbnRzXG4gICAgUmF3RXhlY3V0b3I8UVVFUlk+LFxuICAgIENvbnRleHR1YWw8RkxBR1MsIENPTlRFWFQ+LFxuICAgIE9ic2VydmFibGUsXG4gICAgT2JzZXJ2ZXIsXG4gICAgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlUmVwb3NpdG9yeTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxhbnksIGFueSwgYW55LCBhbnksIGFueT5cbiAgPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VEaXNwYXRjaDogQ29uc3RydWN0b3I8RGlzcGF0Y2g+O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IEFkYXB0ZXJEaXNwYXRjaDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb2JzZXJ2ZXJIYW5kbGVyPzogT2JzZXJ2ZXJIYW5kbGVyO1xuXG4gIHByb3RlY3RlZCBfY2xpZW50PzogQ09OTjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBjb25maWdcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTkZcbiAgICogQHJldHVybiB7Q09ORn0gVGhlIG5hdGl2ZSBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gICAqL1xuICBnZXQgY29uZmlnKCk6IENPTkYge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIncyBhbGlhcyBvciBmbGF2b3IgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBhbGlhcyBpZiBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBmbGF2b3IgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyJ3MgaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0IGFsaWFzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzIHx8IHRoaXMuZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBhZGFwdGVyXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBRVUVSWSwgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+LCBGTEFHUywgQ09OVEVYVD4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8XG4gICAgICBNLFxuICAgICAgUVVFUlksXG4gICAgICBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sXG4gICAgICBGTEFHUyxcbiAgICAgIENPTlRFWFRcbiAgICA+XG4gID4ge1xuICAgIGlmICghQWRhcHRlci5fYmFzZVJlcG9zaXRvcnkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlcGxhY2VkIGxhemlseWBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIHNodXRkb3duUHJveGllcyhrPzogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHJldHVybjtcbiAgICBpZiAoayAmJiAhKGsgaW4gdGhpcy5wcm94aWVzKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBwcm94eSBmb3VuZCBmb3IgJHtrfWApO1xuICAgIGlmICghaykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wcm94aWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tleV0uc2h1dGRvd24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a2V5fTogJHtlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94aWVzW2tdLnNodXRkb3duKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb3hpZXNba107XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gcHJveGllZCBhZGFwdGVyICR7a306ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHRhc2tzLCBzdWNoIGFzIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgICogV2hlbiBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLCBlbnN1cmUgdG8gY2FsbCB0aGUgYmFzZSBtZXRob2QgZmlyc3RcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzaHV0ZG93biBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93blByb3hpZXMoKTtcbiAgICBpZiAodGhpcy5kaXNwYXRjaCkgYXdhaXQgdGhpcy5kaXNwYXRjaC5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgbmF0aXZlIGRyaXZlciBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBhZGFwdGVyIGNhY2hlXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDT05GLFxuICAgIHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh0aGlzLmFsaWFzIGluIEFkYXB0ZXIuX2NhY2hlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gYWxyZWFkeSByZWdpc3RlcmVkYFxuICAgICAgKTtcbiAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmFsaWFzXSA9IHRoaXM7XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDcmVhdGVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBwZXJzaXN0ZW5jZSBhZGFwdGVyYFxuICAgICk7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgRGVmaW5lZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgYXMgY3VycmVudGApO1xuICAgICAgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB0aGlzLmFsaWFzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgc3RhdGVtZW50IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgcXVlcmllcyBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1N0YXRlbWVudH0gQSBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgdGhlIG1vZGVsXG4gICAqL1xuICBhYnN0cmFjdCBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8UVVFUlksIE0sIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGRpc3BhdGNoIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7RGlzcGF0Y2h9IEEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgRGlzcGF0Y2goKTogRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgQWRhcHRlci5fYmFzZURpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gb2JzZXJ2ZXIgaGFuZGxlciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge09ic2VydmVySGFuZGxlcn0gQSBuZXcgb2JzZXJ2ZXIgaGFuZGxlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIE9ic2VydmVySGFuZGxlcigpOiBPYnNlcnZlckhhbmRsZXIge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2ZXJIYW5kbGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhYXR0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgZGF0YWJhc2UgZXJyb3IgaW50byBhIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBkYXRhYmFzZS1zcGVjaWZpYyBlcnJvcnMgaW50byBzdGFuZGFyZGl6ZWQgYXBwbGljYXRpb24gZXJyb3JzXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBvcmlnaW5hbCBkYXRhYmFzZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IEEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqL1xuICBhYnN0cmFjdCBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgYWRhcHRlciwgc3VjaCBhcyBlc3RhYmxpc2hpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VxdWVuY2UgZ2VuZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvciBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIG5ldyBzZXF1ZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgYWJzdHJhY3QgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHJlcG9zaXRvcnkgZmxhZ3MgZm9yIGFuIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXNjcmliZSBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgY29tYmluaW5nIGRlZmF1bHQgZmxhZ3Mgd2l0aCBvdmVycmlkZXNcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBGbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Rj59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RkxBR1M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZMQUdTPiB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRSZXBvc2l0b3J5RmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogZ2V0VGFibGVOYW1lKG1vZGVsKSxcbiAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgIH0pIGFzIEZMQUdTO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIENvbnRleHQgPSBDb250ZXh0PEZMQUdTPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb250ZXh0IGZvciBhIGRhdGFiYXNlIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBjb250ZXh0IG9iamVjdCB0aGF0IGRlc2NyaWJlcyBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgdXNlZCBmb3IgdHJhY2tpbmcgYW5kIGF1ZGl0aW5nXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5DUkVBVEV8T3BlcmF0aW9uS2V5cy5SRUFEfE9wZXJhdGlvbktleXMuVVBEQVRFfE9wZXJhdGlvbktleXMuREVMRVRFfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBvdmVycmlkZXMgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZXh0IG9iamVjdFxuICAgKi9cbiAgQGZpbmFsKClcbiAgYXN5bmMgY29udGV4dDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5SRUFEXG4gICAgICB8IE9wZXJhdGlvbktleXMuVVBEQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGTEFHUz4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Q09OVEVYVD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsLm5hbWV9IG1vZGVsIHdpdGggZmxhZyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKX1gXG4gICAgKTtcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgb3ZlcnJpZGVzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoZmxhZ3MpIGFzIHVua25vd24gYXMgQ09OVEVYVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gbW9kZWxUb1RyYW5zaWVudChtb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoc3BsaXQubW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gZ2V0Q29sdW1uTmFtZShtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IG1vZGVsW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHBhcmFtIFt0cmFuc2llbnRdIC0gVHJhbnNpZW50IHByb3BlcnRpZXMgdG8gcmVhdHRhY2hcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW2dldENvbHVtbk5hbWUoYWNjdW0sIGtleSldO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIG0pO1xuXG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHJlc3VsdClcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgbWV0YWRhdGEgZm9yICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfTogJHttZXRhZGF0YX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIGZvciB0aGUgbmV3IHJlY29yZHNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0IGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBjcmVhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMuY3JlYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXRyaWV2ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMucmVhZCh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIGFuIGV4aXN0aW5nIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgbXVsdGlwbGUgZXhpc3RpbmcgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciBlYWNoIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiB1cGRhdGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFVwZGF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5hcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlbGV0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5kZWxldGUodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBbGxvd3MgZXhlY3V0aW5nIGRhdGFiYXNlLXNwZWNpZmljIHF1ZXJpZXMgZGlyZWN0bHlcbiAgICogQHRlbXBsYXRlIFEgLSBUaGUgcmF3IHF1ZXJ5IHR5cGVcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7UX0gcmF3SW5wdXQgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgYWJzdHJhY3QgcmF3PFI+KHJhd0lucHV0OiBRVUVSWSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBkYXRhYmFzZSBldmVudHNcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byBiZSBub3RpZmllZCBhYm91dCBkYXRhYmFzZSBjaGFuZ2VzLiBUaGUgb2JzZXJ2ZXIgY2FuIG9wdGlvbmFsbHlcbiAgICogcHJvdmlkZSBhIGZpbHRlciBmdW5jdGlvbiB0byByZWNlaXZlIG9ubHkgc3BlY2lmaWMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge09ic2VydmVyRmlsdGVyfSBbZmlsdGVyXSAtIE9wdGlvbmFsIGZpbHRlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlciEub2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKTtcbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLm9ic2VydmUpXG4gICAgICAudmVyYm9zZShgUmVnaXN0ZXJpbmcgbmV3IG9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX1gKTtcbiAgICBpZiAoIXRoaXMuZGlzcGF0Y2gpIHtcbiAgICAgIHRoaXMubG9nLmZvcih0aGlzLm9ic2VydmUpLmluZm8oYENyZWF0aW5nIGRpc3BhdGNoIGZvciAke3RoaXMuYWxpYXN9YCk7XG4gICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5EaXNwYXRjaCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaC5vYnNlcnZlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvYnNlcnZlciBzbyBpdCBubyBsb25nZXIgcmVjZWl2ZXMgZGF0YWJhc2UgZXZlbnQgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBAZmluYWwoKVxuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVuT2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51bk9ic2VydmUpXG4gICAgICAudmVyYm9zZShgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBTZW5kcyBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2UsXG4gICAqIGZpbHRlcmluZyBiYXNlZCBvbiBlYWNoIG9ic2VydmVyJ3MgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBVcGRhdGluZyAke3RoaXMub2JzZXJ2ZXJIYW5kbGVyLmNvdW50KCl9IG9ic2VydmVycyBmb3IgYWRhcHRlciAke3RoaXMuYWxpYXN9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5vYnNlcnZlckhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgdGhpcy5sb2csXG4gICAgICB0YWJsZSxcbiAgICAgIGV2ZW50LFxuICAgICAgaWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIGRhdGEgYmFzZWQgb24gYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byB1cGRhdGVPYnNlcnZlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyByZWxhdGVkIHRvIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyByZWZyZXNoKFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqL1xuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBBZGFwdGVyYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlciBmbGF2b3IgYXNzb2NpYXRlZCB3aXRoIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIGZsYXZvciB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNsYXNzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWRhcHRlciBmbGF2b3IgbmFtZVxuICAgKi9cbiAgc3RhdGljIGZsYXZvdXJPZjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEodGhpcy5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIHRoaXMuY3VycmVudD8uZmxhdm91clxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGN1cnJlbnRGbGF2b3VyKCkge1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHBlcnNpc3RlbmNlIGZsYXZvdXIgc2V0LiBQbGVhc2UgaW5pdGlhbGl6ZSB5b3VyIGFkYXB0ZXJgXG4gICAgICApO1xuICAgIHJldHVybiBBZGFwdGVyLl9jdXJyZW50Rmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBhZGFwdGVyIHRoYXQgaXMgY3VycmVudGx5IHNldCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJuIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IFRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgY3VycmVudCgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLmN1cnJlbnRGbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbiBhZGFwdGVyIGJ5IGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSByZWdpc3RlcmVkIGFkYXB0ZXIgYnkgaXRzIGZsYXZvciBuYW1lXG4gICAqIEB0ZW1wbGF0ZSBDT05GIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBjb25maWdcbiAgICogQHRlbXBsYXRlIENPTk4gLSBUaGUgZGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlXG4gICAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBDQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHRlbXBsYXRlIEZMQUdTIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhULCBGTEFHUz4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPixcbiAgICBGTEFHUyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgPihmbGF2b3VyPzogYW55KTogQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgRkxBR1MsIENPTlRFWFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENoYW5nZXMgd2hpY2ggYWRhcHRlciBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHNldCBhcyBjdXJyZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxhdm91ciA9IGZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc3RhbmRhcmRpemVkIG1ldGFkYXRhIGtleSBmb3IgcGVyc2lzdGVuY2UtcmVsYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvLmtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBtb2RlbHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEgc3BlY2lmaWMgYWRhcHRlciBmbGF2b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBhZGFwdGVyIGZsYXZvciB0byBmaW5kIG1vZGVscyBmb3JcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHN0YXRpYyBtb2RlbHM8TSBleHRlbmRzIE1vZGVsPihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSAoTW9kZWwgYXMgYW55KS5nZXRSZWdpc3RyeSgpIGFzIE1vZGVsUmVnaXN0cnk8YW55PjtcbiAgICAgIGNvbnN0IGNhY2hlID0gKFxuICAgICAgICByZWdpc3RyeSBhcyB1bmtub3duIGFzIHsgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8YW55Pj4gfVxuICAgICAgKS5jYWNoZTtcbiAgICAgIGNvbnN0IG1hbmFnZWRNb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gT2JqZWN0LnZhbHVlcyhjYWNoZSlcbiAgICAgICAgLm1hcCgobTogTW9kZWxDb25zdHJ1Y3RvcjxNPikgPT4ge1xuICAgICAgICAgIGxldCBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZiAmJiBmID09PSBmbGF2b3VyKSByZXR1cm4gbTtcbiAgICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG8gPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBSZXBvLmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXBvKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gKHRoaXMuX2Jhc2VSZXBvc2l0b3J5IGFzIGFueSkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgcHJveGllcz86IFJlY29yZDxzdHJpbmcsIHR5cGVvZiB0aGlzPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDT04gLSBUaGUgdHlwZSBvZiB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0NPTn0gVGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBmdW5jdGlvbiBnZXRDbGllbnRcbiAgICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xpZW50KCk6IENPTk47XG5cbiAgQGZpbmFsKClcbiAgZ2V0IGNsaWVudCgpOiBDT05OIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxDT05GPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHNvcnQgZGlyZWN0aW9ucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBzb3J0IGRpcmVjdGlvbnMgZm9yIG9yZGVyaW5nIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gT3JkZXJEaXJlY3Rpb24ge1xuICAvKiogQXNjZW5kaW5nIG9yZGVyIChBIHRvIFosIDAgdG8gOSkgKi9cbiAgQVNDID0gXCJhc2NcIixcblxuICAvKiogRGVzY2VuZGluZyBvcmRlciAoWiB0byBBLCA5IHRvIDApICovXG4gIERTQyA9IFwiZGVzY1wiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBjYXNjYWRlIG9wZXJhdGlvbiB0eXBlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGF2YWlsYWJsZSBjYXNjYWRlIGJlaGF2aW9ycyBmb3IgZW50aXR5IHJlbGF0aW9uc2hpcHMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gQ2FzY2FkZSB7XG4gIC8qKiBQZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgQ0FTQ0FERSA9IFwiY2FzY2FkZVwiLFxuICAvKiogRG8gbm90IHBlcmZvcm0gY2FzY2FkZSBvcGVyYXRpb24gb24gcmVsYXRlZCBlbnRpdGllcyAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBkZWZhdWx0IGNhc2NhZGUgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBpbiByZXBvc2l0b3JpZXMuXG4gKiBAc3VtbWFyeSBEb2N1bWVudHMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY2FzY2FkZSBjb25maWd1cmF0aW9uIHdpdGggZXhwbGljaXQgdXBkYXRlIGFuZCBkZWxldGUgYmVoYXZpb3JzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSB1cGRhdGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgdXBkYXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAcHJvcGVydHkgeydjYXNjYWRlJ3wnbm9uZSd9IGRlbGV0ZSAtIERldGVybWluZXMgd2hldGhlciBkZWxldGVzIGNhc2NhZGUgdG8gcmVsYXRlZCBlbnRpdGllcy5cbiAqIEB0eXBlRGVmIERlZmF1bHRDYXNjYWRlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbn07XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBVbnN1cHBvcnRlZEVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHNlcXVlbmNlTmFtZUZvck1vZGVsIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIHZhbHVlcyAobGlrZSBwcmltYXJ5IGtleXMpIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhbmRsZSB0aGUgc3BlY2lmaWNzIG9mIGhvdyBzZXF1ZW5jZXMgYXJlIHN0b3JlZCBhbmQgaW5jcmVtZW50ZWQgaW4gZGlmZmVyZW50XG4gKiBkYXRhYmFzZSBzeXN0ZW1zLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3JcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgZGF0YWJhc2VcbiAqIGNsYXNzIFBvc3RncmVzU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge1xuICogICAgIHN1cGVyKG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gdG8gZ2V0IG5leHQgdmFsdWUgZnJvbSBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcHRpb25zLmV4ZWN1dG9yLnJhdyhgU0VMRUNUIG5leHR2YWwoJyR7dGhpcy5vcHRpb25zLm5hbWV9JylgKTtcbiAqICAgICByZXR1cm4gcGFyc2VJbnQocmVzdWx0LnJvd3NbMF0ubmV4dHZhbCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgY3VycmVudCB2YWx1ZSBmcm9tIFBvc3RncmVTUUwgc2VxdWVuY2VcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZXhlY3V0b3IucmF3KGBTRUxFQ1QgY3VycnZhbCgnJHt0aGlzLm9wdGlvbnMubmFtZX0nKWApO1xuICogICAgIHJldHVybiBwYXJzZUludChyZXN1bHQucm93c1swXS5jdXJydmFsKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiB0byBnZXQgYSByYW5nZSBvZiB2YWx1ZXNcbiAqICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gKiAgICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLm5leHQoKSk7XG4gKiAgICAgfVxuICogICAgIHJldHVybiB2YWx1ZXM7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBVc2FnZVxuICogY29uc3Qgc2VxdWVuY2UgPSBuZXcgUG9zdGdyZXNTZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICd1c2VyX2lkX3NlcScsXG4gKiAgIGV4ZWN1dG9yOiBkYkV4ZWN1dG9yXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTGF6aWx5IGluaXRpYWxpemVkIGxvZ2dlciBmb3IgdGhlIHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY2Vzc29yIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIGxvZ2dlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSk7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucykge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBzZXF1ZW5jZSwgaW5jcmVtZW50aW5nIGl0IGluIHRoZSBwcm9jZXNzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gICAqL1xuICBhYnN0cmFjdCBuZXh0KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2Ugd2l0aG91dCBpbmNyZW1lbnRpbmcgaXRcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICovXG4gIGFic3RyYWN0IGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBtdWx0aXBsZSBzZXF1ZW50aWFsIHZhbHVlcyBhdCBvbmNlLCB3aGljaCBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIG5leHQoKSBtdWx0aXBsZSB0aW1lc1xuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgdmFsdWVzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygc2VxdWVudGlhbCB2YWx1ZXNcbiAgICovXG4gIGFic3RyYWN0IHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgcHJpbWFyeSBrZXkgc2VxdWVuY2UgbmFtZSBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBVdGlsaXR5IG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIHN0YW5kYXJkaXplZCBzZXF1ZW5jZSBuYW1lIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXlcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge018Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5XG4gICAqL1xuICBzdGF0aWMgcGs8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgcmV0dXJuIHNlcXVlbmNlTmFtZUZvck1vZGVsKG1vZGVsLCBcInBrXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBzZXF1ZW5jZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHNlcXVlbmNlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSAoTnVtYmVyIG9yIEJpZ0ludClcbiAgICogQHBhcmFtIHtcIk51bWJlclwifFwiQmlnSW50XCJ8dW5kZWZpbmVkfSB0eXBlIC0gVGhlIHRhcmdldCB0eXBlIHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsdWUoXG4gICAgdHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSlcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBCaWdJbnQodmFsdWUpO1xuICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZTogJHt0eXBlfSBmb3IgYWRhcHRlciAke3RoaXN9YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi9BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvciBhIG1vZGVsIHNob3VsZCB1c2VcbiAqIEBzdW1tYXJ5IFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gYSBtb2RlbCBjbGFzcyB0byBpbmRpY2F0ZSB3aGljaCBwZXJzaXN0ZW5jZSBhZGFwdGVyIGZsYXZvclxuICogc2hvdWxkIGJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGRhdGFiYXNlIG9wZXJhdGlvbnMgb24gaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gVGhlIGZsYXZvciBpcyBhIHN0cmluZ1xuICogaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhZGFwdGVyIGZsYXZvciB0byB1c2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgbW9kZWwgY2xhc3NcbiAqIEBmdW5jdGlvbiB1c2VzXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlcyhmbGF2b3VyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZXMob3JpZ2luYWw6IGFueSkge1xuICAgIHJldHVybiBhcHBseShtZXRhZGF0YShBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksIGZsYXZvdXIpKShcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgSVJlcG9zaXRvcnksXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnkgYXMgUmVwLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgd3JhcE1ldGhvZFdpdGhDb250ZXh0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyB0eXBlIE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBXaGVyZU9wdGlvbiB9IGZyb20gXCIuLi9xdWVyeS9vcHRpb25zXCI7XG5pbXBvcnQgeyBPcmRlckJ5U2VsZWN0b3IsIFNlbGVjdFNlbGVjdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZSwgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5pbXBvcnQgeyB1c2VzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJIYW5kbGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV2ZW50SWRzLFxuICBJbmZlcnJlZEFkYXB0ZXJDb25maWcsXG4gIHR5cGUgT2JzZXJ2ZXJGaWx0ZXIsXG59IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGFsaWFzIGZvciBSZXBvc2l0b3J5IGNsYXNzIHdpdGggc2ltcGxpZmllZCBnZW5lcmljIHBhcmFtZXRlcnMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG1vcmUgY29uY2lzZSB3YXkgdG8gcmVmZXJlbmNlIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggaXRzIGdlbmVyaWMgcGFyYW1ldGVycy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLlxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAqIEB0eXBlZGVmIFJlcG9cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgdHlwZSBSZXBvPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBhbnksXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gYW55LFxuICBRID0gYW55LFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgUSwgRiwgQz4gPSBhbnksXG4+ID0gUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29yZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zIG9uIG1vZGVscyBvbiBhIHRhYmxlIGJ5IHRhYmxlIHdheS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucywgcXVlcnlpbmcgY2FwYWJpbGl0aWVzLCBhbmQgb2JzZXJ2ZXIgcGF0dGVybiBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwgcGVyc2lzdGVuY2UuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlci5cbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZS5cbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBmb3Igb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7QX0gW2FkYXB0ZXJdIC0gT3B0aW9uYWwgYWRhcHRlciBpbnN0YW5jZSBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBPcHRpb25hbCBjb25zdHJ1Y3RvciBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlcG9zaXRvcnkgaW5pdGlhbGl6YXRpb24uXG4gKiBAY2xhc3MgUmVwb3NpdG9yeVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0aW5nIGEgcmVwb3NpdG9yeSBmb3IgVXNlciBtb2RlbFxuICogY29uc3QgdXNlclJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKFVzZXIpO1xuICpcbiAqIC8vIFVzaW5nIHRoZSByZXBvc2l0b3J5IGZvciBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiAnSm9obicgfSkpO1xuICogY29uc3QgcmV0cmlldmVkVXNlciA9IGF3YWl0IHVzZXJSZXBvLnJlYWQodXNlci5pZCk7XG4gKiB1c2VyLm5hbWUgPSAnSmFuZSc7XG4gKiBhd2FpdCB1c2VyUmVwby51cGRhdGUodXNlcik7XG4gKiBhd2FpdCB1c2VyUmVwby5kZWxldGUodXNlci5pZCk7XG4gKlxuICogLy8gUXVlcnlpbmcgd2l0aCBjb25kaXRpb25zXG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHVzZXJSZXBvXG4gKiAgIC5zZWxlY3QoKVxuICogICAud2hlcmUoeyBuYW1lOiAnSmFuZScgfSlcbiAqICAgLm9yZGVyQnkoJ2NyZWF0ZWRBdCcsIE9yZGVyRGlyZWN0aW9uLkRTQylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAqXG4gKiAgIEMtPj4rUjogY3JlYXRlKG1vZGVsKVxuICogICBSLT4+UjogY3JlYXRlUHJlZml4KG1vZGVsKVxuICogICBSLT4+K0E6IHByZXBhcmUobW9kZWwpXG4gKiAgIEEtLT4+LVI6IHByZXBhcmVkIGRhdGFcbiAqICAgUi0+PitBOiBjcmVhdGUodGFibGUsIGlkLCByZWNvcmQpXG4gKiAgIEEtPj4rREI6IEluc2VydCBPcGVyYXRpb25cbiAqICAgREItLT4+LUE6IFJlc3VsdFxuICogICBBLS0+Pi1SOiByZWNvcmRcbiAqICAgUi0+PitBOiByZXZlcnQocmVjb3JkKVxuICogICBBLS0+Pi1SOiBtb2RlbCBpbnN0YW5jZVxuICogICBSLT4+UjogY3JlYXRlU3VmZml4KG1vZGVsKVxuICogICBSLT4+K086IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgQ1JFQVRFLCBpZClcbiAqICAgTy0tPj4tUjogTm90aWZpY2F0aW9uIGNvbXBsZXRlXG4gKiAgIFItLT4+LUM6IGNyZWF0ZWQgbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJlcG9zaXRvcnk8XG4gICAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICAgIFEsXG4gICAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIFEsIEYsIEM+LFxuICAgIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MgPSBSZXBvc2l0b3J5RmxhZ3MsXG4gICAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuICA+XG4gIGV4dGVuZHMgUmVwPE0sIEYsIEM+XG4gIGltcGxlbWVudHMgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIFF1ZXJpYWJsZTxNPiwgSVJlcG9zaXRvcnk8TSwgRiwgQz5cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFJlcG88TW9kZWw+PiB8IFJlcG88TW9kZWw+XG4gID4gPSB7fTtcblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hZGFwdGVyITogQTtcbiAgcHJpdmF0ZSBfdGFibGVOYW1lITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX292ZXJyaWRlcz86IFBhcnRpYWw8Rj47XG5cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW5zdGFuY2UgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb2dnZXIgZm9yIHRoaXMgcmVwb3NpdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpXG4gICAgICB0aGlzLmxvZ2dlciA9IChcbiAgICAgICAgdGhpcy5hZGFwdGVyW1wibG9nXCIgYXMga2V5b2YgdHlwZW9mIHRoaXMuYWRhcHRlcl0gYXMgTG9nZ2VyXG4gICAgICApLmZvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhZGFwdGVyIGluc3RhbmNlIGZvciB0aGlzIHJlcG9zaXRvcnkuXG4gICAqIEB0ZW1wbGF0ZSBBIC0gVGhlIGFkYXB0ZXIgdHlwZS5cbiAgICogQHJldHVybiB7QX0gVGhlIGFkYXB0ZXIgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGFkYXB0ZXIgaXMgZm91bmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGFibGUgbmFtZSBmb3IgdGhpcyByZXBvc2l0b3J5J3MgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeSdzIG1vZGVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3RhYmxlTmFtZSkgdGhpcy5fdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZSh0aGlzLmNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBwcm9wZXJ0aWVzIGZvciB0aGlzIHJlcG9zaXRvcnkncyBtb2RlbC5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgc2VxdWVuY2Ugb3B0aW9ucyBjb250YWluaW5nIHByaW1hcnkga2V5IGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJuIHtTZXF1ZW5jZU9wdGlvbnN9IFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBwa1Byb3BzKCk6IFNlcXVlbmNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHN1cGVyLnBrUHJvcHM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI/OiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgICBpZiAoYWRhcHRlcikgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgaWYgKGNsYXp6KSB7XG4gICAgICBSZXBvc2l0b3J5LnJlZ2lzdGVyKGNsYXp6LCB0aGlzLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgY29uc3QgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgIGNsYXp6XG4gICAgICAgICk7XG4gICAgICAgIGlmIChmbGF2b3VyICYmIGZsYXZvdXIgIT09IGFkYXB0ZXIuZmxhdm91cilcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkluY29tcGF0aWJsZSBmbGF2b3Vyc1wiKTtcbiAgICAgICAgdXNlcyhhZGFwdGVyLmZsYXZvdXIpKGNsYXp6KTtcbiAgICAgIH1cbiAgICB9XG4gICAgW3RoaXMuY3JlYXRlQWxsLCB0aGlzLnJlYWRBbGwsIHRoaXMudXBkYXRlQWxsLCB0aGlzLmRlbGV0ZUFsbF0uZm9yRWFjaChcbiAgICAgIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICAgIHdyYXBNZXRob2RXaXRoQ29udGV4dChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiUHJlZml4XCJdLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgKHRoaXMgYXMgYW55KVtuYW1lICsgXCJTdWZmaXhcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcHJveHkgd2l0aCBvdmVycmlkZGVuIHJlcG9zaXRvcnkgZmxhZ3MuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBwcm94eSBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIGZsYWdzIG92ZXJyaWRkZW4uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBUaGUgZmxhZ3MgdG8gb3ZlcnJpZGUuXG4gICAqIEByZXR1cm4ge1JlcG9zaXRvcnl9IEEgcHJveHkgb2YgdGhpcyByZXBvc2l0b3J5IHdpdGggb3ZlcnJpZGRlbiBmbGFncy5cbiAgICovXG4gIG92ZXJyaWRlKGZsYWdzOiBQYXJ0aWFsPEY+KTogUmVwb3NpdG9yeTxNLCBRLCBBLCBGLCBDPiB7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vdmVycmlkZSlcbiAgICAgIC5kZWJ1ZyhgT3ZlcnJpZGluZyByZXBvc2l0b3J5IGZsYWdzIHdpdGggJHtKU09OLnN0cmluZ2lmeShmbGFncyl9YCk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwICE9PSBcIl9vdmVycmlkZXNcIikgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdCwgZmxhZ3MpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUmVwb3NpdG9yeSBjbGFzcyB3aXRoIGEgc3BlY2lmaWMgYWRhcHRlciBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgQSAtIFRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSB0eXBlIG9mIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDIC0gVGhlIHR5cGUgb2YgdGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+fSBjb25mIC0gYWRhcHRlciBjb25maWd1cmF0aW9ucyB0byBvdmVycmlkZS5cbiAgICogQHBhcmFtIFthcmdzXSAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBSZXBvc2l0b3J5IGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBhZGFwdGVyIGFuZCBhcmd1bWVudHMuXG4gICAqL1xuICBmb3IoXG4gICAgY29uZjogUGFydGlhbDxJbmZlcnJlZEFkYXB0ZXJDb25maWc8QT4+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFJlcG9zaXRvcnk8TSwgUSwgQSwgRiwgQz4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiBhbnksIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJhZGFwdGVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmZvcihjb25mLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXIuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGUgbW9kZWwgYW5kIHByZXBhcmVzIGl0IGZvciBjcmVhdGlvbiBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVsIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBJZiB0aGUgbW9kZWwgZmFpbHMgdmFsaWRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVQcmVmaXgoXG4gICAgbW9kZWw6IE0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxbTSwgLi4uYW55W11dPiB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3M8TSwgQywgRj4oXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBtb2RlbCA9IG5ldyB0aGlzLmNsYXNzKG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBtb2RlbC5oYXNFcnJvcnMoXG4gICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmIChlcnJvcnMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtb2RlbCBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UgdG8gdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCB3aXRoIHVwZGF0ZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgbGV0IGM6IEMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIEM7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUG9zdC1jcmVhdGlvbiBob29rLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyBhZnRlciBhIG1vZGVsIGlzIGNyZWF0ZWQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgY3JlYXRlZCBtb2RlbC5cbiAgICogQHBhcmFtIHtDfSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcHJvY2Vzc2VkIG1vZGVsLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlU3VmZml4KG1vZGVsOiBNLCBjb250ZXh0OiBDKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVN1ZmZpeChtb2RlbCwgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIHRvIHRoZSBkYXRhYmFzZSBpbiBhIGJhdGNoIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGNyZWF0ZWQgbW9kZWxzIHdpdGggdXBkYXRlZCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIG11bHRpcGxlIG1vZGVscyBmb3IgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIGNyZWF0aW9uIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gICAgY29uc3Qgb3B0cyA9IFJlcG9zaXRvcnkuZ2V0U2VxdWVuY2VPcHRpb25zKG1vZGVsc1swXSk7XG4gICAgbGV0IGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZClbXSA9IFtdO1xuICAgIGlmIChvcHRzLnR5cGUpIHtcbiAgICAgIGlmICghb3B0cy5uYW1lKSBvcHRzLm5hbWUgPSBTZXF1ZW5jZS5wayhtb2RlbHNbMF0pO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtW3RoaXMucGtdID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFByaW1hcnkga2V5IGlzIG5vdCBkZWZpbmVkIGZvciBtb2RlbCBpbiBwb3NpdGlvbiAke2l9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBtW3RoaXMucGtdIGFzIHN0cmluZztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGlmIChvcHRzLnR5cGUpIG1bdGhpcy5wa10gPSBpZHNbaV0gYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtKSA9PiBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMoLi4uaWdub3JlZFByb3BzKSkpXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICBpZiAoZSlcbiAgICAgICAgYWNjdW0gPVxuICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICA6IGAgLSAke2l9OiAke2UudG9TdHJpbmcoKX1gO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlcykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvck1lc3NhZ2VzKTtcbiAgICByZXR1cm4gW21vZGVscywgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGZvciByZWFkaW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSByZWFkaW5nIGEgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkUHJlZml4KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGNvbnRleHRBcmdzID0gYXdhaXQgQ29udGV4dC5hcmdzKFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICBtb2RlbFt0aGlzLnBrXSA9IGtleSBhcyBNW2tleW9mIE1dO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICk7XG4gICAgcmV0dXJuIFtrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgY29udGV4dCBhbmQgZW5mb3JjZXMgZGVjb3JhdG9ycyBiZWZvcmUgcmVhZGluZyBtdWx0aXBsZSBtb2RlbHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGtleXMgLSBUaGUgcHJpbWFyeSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIFRoZSBrZXlzIGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgIHRoaXMuX292ZXJyaWRlcyB8fCB7fVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBrZXlzLm1hcChhc3luYyAoaykgPT4ge1xuICAgICAgICBjb25zdCBtID0gbmV3IHRoaXMuY2xhc3MoKTtcbiAgICAgICAgbVt0aGlzLnBrXSA9IGsgYXMgTVtrZXlvZiBNXTtcbiAgICAgICAgcmV0dXJuIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgZnJvbSB0aGUgZGF0YWJhc2UgYnkgSURzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIG1vZGVsIGluc3RhbmNlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gVGhlIHVwZGF0ZWQgbW9kZWwgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgdXBkYXRlLlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG1vZGVsIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXBkYXRlIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUgcHJlcGFyZWQgbW9kZWwgYW5kIGNvbnRleHQgYXJndW1lbnRzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgbW9kZWwgaGFzIG5vIHByaW1hcnkga2V5IHZhbHVlLlxuICAgKiBAdGhyb3dzIHtWYWxpZGF0aW9uRXJyb3J9IElmIHRoZSBtb2RlbCBmYWlscyB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IHBrID0gbW9kZWxbdGhpcy5wa10gYXMgc3RyaW5nO1xuICAgIGlmICghcGspXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHZhbHVlIGZvciB0aGUgSWQgaXMgZGVmaW5lZCB1bmRlciB0aGUgcHJvcGVydHkgJHt0aGlzLnBrIGFzIHN0cmluZ31gXG4gICAgICApO1xuICAgIGNvbnN0IG9sZE1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKHBrLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbCA9IHRoaXMubWVyZ2Uob2xkTW9kZWwsIG1vZGVsKTtcbiAgICBhd2FpdCBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgdGhpcyxcbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIG1vZGVsLmhhc0Vycm9ycyhcbiAgICAgICAgb2xkTW9kZWwsXG4gICAgICAgIC4uLlJlcG9zaXRvcnkucmVsYXRpb25zKHRoaXMuY2xhc3MpLFxuICAgICAgICAuLi4oY29udGV4dEFyZ3MuY29udGV4dC5nZXQoXCJpZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXNcIikgfHwgW10pXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycy50b1N0cmluZygpKTtcbiAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbCkpIHtcbiAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtb2RlbCkpXG4gICAgICAgIFJlcG9zaXRvcnkuc2V0TWV0YWRhdGEobW9kZWwsIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIFttb2RlbCwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBkYXRhYmFzZS5cbiAgICogQHN1bW1hcnkgUGVyc2lzdHMgY2hhbmdlcyB0byBtdWx0aXBsZSBleGlzdGluZyBtb2RlbCBpbnN0YW5jZXMgaW4gdGhlIGRhdGFiYXNlIGluIGEgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMgd2l0aCByZWZyZXNoZWQgcHJvcGVydGllcy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGVBbGwoXG4gICAgICB0aGlzLnRhYmxlTmFtZSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLmlkKSxcbiAgICAgIHJlY29yZHMubWFwKChyKSA9PiByLnJlY29yZCksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHUsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHUsIHRoaXMuY2xhc3MsIHRoaXMucGssIHJlY29yZHNbaV0uaWQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgbXVsdGlwbGUgbW9kZWxzIGZvciB1cGRhdGUuXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyBtdWx0aXBsZSBtb2RlbHMgYW5kIHByZXBhcmVzIHRoZW0gZm9yIHVwZGF0ZSBpbiB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueVtdPn0gVGhlIHByZXBhcmVkIG1vZGVscyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFueSBtb2RlbCBoYXMgbm8gcHJpbWFyeSBrZXkgdmFsdWUuXG4gICAqIEB0aHJvd3Mge1ZhbGlkYXRpb25FcnJvcn0gSWYgYW55IG1vZGVsIGZhaWxzIHZhbGlkYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsUHJlZml4KFxuICAgIG1vZGVsczogTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGNvbnN0IGlkcyA9IG1vZGVscy5tYXAoKG0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gbVt0aGlzLnBrXSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIm1pc3NpbmcgaWQgb24gdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9KTtcbiAgICBjb25zdCBvbGRNb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoaWRzLCAuLi5jb250ZXh0QXJncy5hcmdzKTtcbiAgICBtb2RlbHMgPSBtb2RlbHMubWFwKChtLCBpKSA9PiB7XG4gICAgICBtID0gdGhpcy5tZXJnZShvbGRNb2RlbHNbaV0sIG0pO1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG07XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgaWdub3JlZFByb3BzID1cbiAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXG4gICAgY29uc3QgZXJyb3JzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKChtLCBpKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUobS5oYXNFcnJvcnMob2xkTW9kZWxzW2ldLCBtLCAuLi5pZ25vcmVkUHJvcHMpKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3JzLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgaWYgKGUpXG4gICAgICAgIGFjY3VtID1cbiAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gYWNjdW0gKyBgXFxuIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB1bmRlZmluZWQpO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZXMpIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG5cbiAgICBtb2RlbHMuZm9yRWFjaCgobSwgaSkgPT4ge1xuICAgICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSkge1xuICAgICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobSkpXG4gICAgICAgICAgUmVwb3NpdG9yeS5zZXRNZXRhZGF0YShtLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsc1tpXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgZm9yIGRlbGV0aW5nIGEgbW9kZWwgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBjb250ZXh0IGFuZCBlbmZvcmNlcyBkZWNvcmF0b3JzIGJlZm9yZSBkZWxldGluZyBhIG1vZGVsLlxuICAgKiBAcGFyYW0ge2FueX0ga2V5IC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5IGFuZCBjb250ZXh0IGFyZ3VtZW50cy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVQcmVmaXgoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZChrZXksIC4uLmNvbnRleHRBcmdzLmFyZ3MpO1xuICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICB0aGlzLFxuICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgIG1vZGVsLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgKTtcbiAgICByZXR1cm4gW2tleSwgLi4uY29udGV4dEFyZ3MuYXJnc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBmb3IgZGVsZXRpbmcgbXVsdGlwbGUgbW9kZWxzIGJ5IElEcy5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIGNvbnRleHQgYW5kIGVuZm9yY2VzIGRlY29yYXRvcnMgYmVmb3JlIGRlbGV0aW5nIG11bHRpcGxlIG1vZGVscy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBUaGUga2V5cyBhbmQgY29udGV4dCBhcmd1bWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsUHJlZml4KFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwoa2V5cywgLi4uY29udGV4dEFyZ3MuYXJncyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIHJldHVybiBlbmZvcmNlREJEZWNvcmF0b3JzKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgY29udGV4dEFyZ3MuY29udGV4dCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuREVMRVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT05cbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gW2tleXMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRHMuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgbW9kZWwgaW5zdGFuY2VzIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIHRoZWlyIHByaW1hcnkga2V5cy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBwcmltYXJ5IGtleXMgb2YgdGhlIG1vZGVscyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAga2V5czogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzZWxlY3QgcXVlcnkgd2l0aG91dCBzcGVjaWZ5aW5nIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbGwgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlciBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc2VsZWN0PFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXSxcbiAgPigpOiBXaGVyZU9wdGlvbjxNLCBNW10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlbGVjdCBxdWVyeSB3aXRoIHNwZWNpZmljIGZpZWxkcy5cbiAgICogQHN1bW1hcnkgU3RhcnRzIGJ1aWxkaW5nIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBvbmx5IHRoZSBzcGVjaWZpZWQgZmllbGRzIG9mIHRoZSBtb2RlbC5cbiAgICogQHRlbXBsYXRlIFMgLSBUaGUgYXJyYXkgdHlwZSBvZiBzZWxlY3Qgc2VsZWN0b3JzLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgZmllbGRzIHRvIHNlbGVjdC5cbiAgICogQHJldHVybiBBIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZHMuXG4gICAqL1xuICBzZWxlY3Q8UyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10+KFxuICAgIHNlbGVjdG9yOiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNlbGVjdCBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIGZvciB0aGUgbW9kZWwgd2l0aCBvcHRpb25hbCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBTIC0gVGhlIGFycmF5IHR5cGUgb2Ygc2VsZWN0IHNlbGVjdG9ycy5cbiAgICogQHBhcmFtIFtzZWxlY3Rvcl0gLSBPcHRpb25hbCBmaWVsZHMgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJuIEEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogV2hlcmVPcHRpb248TSwgTVtdPiB8IFdoZXJlT3B0aW9uPE0sIFBpY2s8TSwgU1tudW1iZXJdPltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlclxuICAgICAgLlN0YXRlbWVudDxNPigpXG4gICAgICAuc2VsZWN0KHNlbGVjdG9yIGFzIHJlYWRvbmx5IFsuLi5TXSlcbiAgICAgIC5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBjb25kaXRpb25zIGFuZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHNpbXBsaWZpZWQgd2F5IHRvIHF1ZXJ5IHRoZSBkYXRhYmFzZSB3aXRoIGNvbW1vbiBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBmaWx0ZXIgcmVjb3Jkcy5cbiAgICogQHBhcmFtIG9yZGVyQnkgLSBUaGUgZmllbGQgdG8gb3JkZXIgcmVzdWx0cyBieS5cbiAgICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbn0gW29yZGVyPU9yZGVyRGlyZWN0aW9uLkFTQ10gLSBUaGUgc29ydCBkaXJlY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gT3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF0gLSBPcHRpb25hbCBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBxdWVyeSByZXN1bHRzIGFzIG1vZGVsIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIG9yZGVyQnk6IGtleW9mIE0sXG4gICAgb3JkZXI6IE9yZGVyRGlyZWN0aW9uID0gT3JkZXJEaXJlY3Rpb24uQVNDLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIHNraXA/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCBzb3J0OiBPcmRlckJ5U2VsZWN0b3I8TT4gPSBbb3JkZXJCeSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXIgZm9yIHRoaXMgcmVwb3NpdG9yeS5cbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byBtb2RlbHMgaW4gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3Rlci5cbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgdG8gbGltaXQgd2hpY2ggZXZlbnRzIHRoZSBvYnNlcnZlciByZWNlaXZlcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIsIGZpbHRlcj86IE9ic2VydmVyRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9ic2VydmVySGFuZGxlclwiLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLk9ic2VydmVySGFuZGxlcigpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHRoaXMuYWRhcHRlci5vYnNlcnZlKHRoaXMsICh0YWJsZTogc3RyaW5nKSA9PiB0YWJsZU5hbWUgPT09IHRhYmxlKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBub3cgb2JzZXJ2aW5nICR7dGhpcy5hZGFwdGVyfSBmaWx0ZXJpbmcgb24gdGFibGUgPT09ICR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIHRoaXMub2JzZXJ2ZXJIYW5kbGVyIS5vYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpO1xuICAgIGxvZy52ZXJib3NlKGBSZWdpc3RlcmVkIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZyb20gdGhpcyByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIG9ic2VydmVyIHNvIGl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaGFuZGxlciBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSkge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIG1vcmUgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgZm9yICR7dGhpcy5hZGFwdGVyfSwgdW5zdWJzY3JpYmluZ2BcbiAgICAgICk7XG4gICAgICB0aGlzLmFkYXB0ZXIudW5PYnNlcnZlKHRoaXMpO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgTm8gbG9uZ2VyIG9ic2VydmluZyBhZGFwdGVyICR7dGhpcy5hZGFwdGVyLmZsYXZvdXJ9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGEgZGF0YWJhc2UgZXZlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgSUQgb3IgSURzIG9mIHRoZSBhZmZlY3RlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWQuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBoYW5kbGVyIGlzIG5vdCBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy51cGRhdGVPYnNlcnZlcnMpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgYFVwZGF0aW5nICR7dGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKX0gb2JzZXJ2ZXJzIGZvciAke3RoaXN9YFxuICAgICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmVySGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICB0aGlzLmxvZyxcbiAgICAgIHRhYmxlLFxuICAgICAgZXZlbnQsXG4gICAgICBBcnJheS5pc0FycmF5KGlkKVxuICAgICAgICA/IGlkLm1hcCgoaSkgPT4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLnBrUHJvcHMudHlwZSwgaSkgYXMgc3RyaW5nKVxuICAgICAgICA6IChTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMucGtQcm9wcy50eXBlLCBpZCkgYXMgc3RyaW5nKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIG9mIGFuIGV2ZW50IChhbGlhcyBmb3IgdXBkYXRlT2JzZXJ2ZXJzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlIG5hbWUgd2hlcmUgdGhlIGV2ZW50IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBldmVudCB0aGF0IG9jY3VycmVkLlxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBJRCBvciBJRHMgb2YgdGhlIGFmZmVjdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWwuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgdGhhdCBleHRlbmRzIFJlcG88TT4uXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGRlZmF1bHQgYWRhcHRlciBmbGF2b3VyIGlmIG5vdCBzcGVjaWZpZWQgb24gdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBbYXJnc10gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSfSBBIHJlcG9zaXRvcnkgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyByZWdpc3RlcmVkIGZvciB0aGUgZmxhdm91ci5cbiAgICovXG4gIHN0YXRpYyBmb3JNb2RlbDxNIGV4dGVuZHMgTW9kZWwsIFIgZXh0ZW5kcyBSZXBvPE0+PihcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgYWxpYXM/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUiB7XG4gICAgbGV0IHJlcG86IFIgfCBDb25zdHJ1Y3RvcjxSPiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IF9hbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIGFsaWFzIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyO1xuICAgIHRyeSB7XG4gICAgICByZXBvID0gdGhpcy5nZXQobW9kZWwsIF9hbGlhcykgYXMgQ29uc3RydWN0b3I8Uj4gfCBSO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmVwbyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVwbyBpbnN0YW5jZW9mIFJlcG9zaXRvcnkpIHJldHVybiByZXBvIGFzIFI7XG5cbiAgICBjb25zdCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgYWxpYXMgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCBtb2RlbCkgfHxcbiAgICAgIChyZXBvICYmXG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLCByZXBvKSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXI7XG4gICAgY29uc3QgYWRhcHRlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkID0gZmxhdm91clxuICAgICAgPyBBZGFwdGVyLmdldChmbGF2b3VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmVwbyA9IHJlcG8gfHwgKGFkYXB0ZXIucmVwb3NpdG9yeSgpIGFzIENvbnN0cnVjdG9yPFI+KTtcbiAgICByZXR1cm4gbmV3IHJlcG8oYWRhcHRlciwgbW9kZWwsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgZnJvbSB0aGUgY2FjaGUuXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsIGZyb20gdGhlIGludGVybmFsIGNhY2hlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gVGhlIGFkYXB0ZXIgYWxpYXMuXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIHJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPiB7XG4gICAgbGV0IG5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBpZiAoYWxpYXMpIHtcbiAgICAgIG5hbWUgPSBbbmFtZSwgYWxpYXNdLmpvaW4oRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmIChuYW1lIGluIHRoaXMuX2NhY2hlKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlW25hbWVdIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UmVwbzxNPj4gfCBSZXBvPE0+O1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBmaW5kIHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCB1bmRlciAke25hbWV9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwuXG4gICAqIEBzdW1tYXJ5IEFzc29jaWF0ZXMgYSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggYSBtb2RlbCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxSZXBvPE0+PiB8IFJlcG88TT59IHJlcG8gLSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc10gdGhlIGFkYXB0ZXIgYWxpYXMvZmxhdm91ci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYSByZXBvc2l0b3J5IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG88TT4+IHwgUmVwbzxNPixcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgbmFtZSA9IFJlcG9zaXRvcnkudGFibGUobW9kZWwpO1xuICAgIGlmIChhbGlhcykge1xuICAgICAgbmFtZSA9IFtuYW1lLCBhbGlhc10uam9pbihEZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtZXRhZGF0YSBvbiBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBdHRhY2hlcyBtZXRhZGF0YSB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0YWRhdGEgLSBUaGUgbWV0YWRhdGEgdG8gYXR0YWNoIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCBtZXRhZGF0YTogYW55KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHByZXZpb3VzbHkgYXR0YWNoZWQgbWV0YWRhdGEgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgbWV0YWRhdGEgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAgICovXG4gIHN0YXRpYyBnZXRNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgPyBkZXNjcmlwdG9yLnZhbHVlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIG1ldGFkYXRhIGZyb20gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgRGVsZXRlcyB0aGUgbWV0YWRhdGEgcHJvcGVydHkgZnJvbSBhIG1vZGVsIGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHNlcXVlbmNlIG9wdGlvbnMgZm9yIGEgbW9kZWwncyBwcmltYXJ5IGtleS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIGZvciBhIG1vZGVsJ3MgcHJpbWFyeSBrZXkgZnJvbSBtZXRhZGF0YS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge1NlcXVlbmNlT3B0aW9uc30gVGhlIHNlcXVlbmNlIG9wdGlvbnMgZm9yIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5LlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyBzZXF1ZW5jZSBvcHRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2VxdWVuY2VPcHRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG1vZGVsKS5pZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpLFxuICAgICAgbW9kZWwsXG4gICAgICBwayBhcyBzdHJpbmdcbiAgICApO1xuICAgIGlmICghbWV0YWRhdGEpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJObyBzZXF1ZW5jZSBvcHRpb25zIGRlZmluZWQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSB0aGUgQHBrIGRlY29yYXRvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBpbmRleGVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFsbCBpbmRleCBtZXRhZGF0YSBmcm9tIGEgbW9kZWwncyBwcm9wZXJ0eSBkZWNvcmF0b3JzLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj59IEEgbmVzdGVkIHJlY29yZCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBpbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHN0YXRpYyBpbmRleGVzPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGNvbnN0IGluZGV4RGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsIDogbmV3IG1vZGVsKCksXG4gICAgICBEQktleXMuUkVGTEVDVFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGluZGV4RGVjb3JhdG9ycyB8fCB7fSkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPj4sIFtrLCB2YWxdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB2YWwuZmlsdGVyKCh2KSA9PiB2LmtleS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlS2V5cy5JTkRFWCkpO1xuICAgICAgICBpZiAoZGVjcyAmJiBkZWNzLmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wcyB9ID0gZGVjO1xuICAgICAgICAgICAgYWNjdW1ba10gPSBhY2N1bVtrXSB8fCB7fTtcbiAgICAgICAgICAgIGFjY3VtW2tdW2tleV0gPSBwcm9wcyBhcyBJbmRleE1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCByZWxhdGlvbiBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lcyBvZiBhbGwgcHJvcGVydGllcyBtYXJrZWQgYXMgcmVsYXRpb25zIGluIHRoZSBtb2RlbCBoaWVyYXJjaHkuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICAgKiBAcGFyYW0ge00gfCBDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IGFyZSByZWxhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHByb3RvdHlwZSA9XG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsXG4gICAgICAgID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZGVsKVxuICAgICAgICA6IChtb2RlbCBhcyBhbnkpLnByb3RvdHlwZTtcbiAgICB3aGlsZSAocHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BzOiBzdHJpbmdbXSA9IHByb3RvdHlwZVtQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TXTtcbiAgICAgIGlmIChwcm9wcykge1xuICAgICAgICByZXN1bHQucHVzaCguLi5wcm9wcyk7XG4gICAgICB9XG4gICAgICBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNIHwgQ29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIG9yIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0YWJsZSBuYW1lIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0VGFibGVOYW1lKG1vZGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29sdW1uIG5hbWUgZm9yIGEgbW9kZWwgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUvcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sdW1uIG5hbWUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBzdGF0aWMgY29sdW1uPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZShtb2RlbCwgYXR0cmlidXRlKTtcbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlUmVwb3NpdG9yeVwiXSA9IFJlcG9zaXRvcnk7XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lIH0gZnJvbSBcIi4uL2lkZW50aXR5L3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHVuaXF1ZSBpbmplY3RhYmxlIG5hbWUgZm9yIGEgcmVwb3NpdG9yeS5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgcmVwb3NpdG9yaWVzIHVzaW5nIHRoZSBhZGFwdGVyIGZsYXZvdXIgYW5kIG1vZGVsIHRhYmxlIG5hbWUuXG4gKiBUaGlzIGhlbHBzIHRoZSBESSBzeXN0ZW0gcmVnaXN0ZXIgYW5kIHJlc29sdmUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgY29uc2lzdGVudGx5IGFjcm9zcyBhZGFwdGVycy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD4gfCBUfSBtb2RlbCBUaGUgbW9kZWwgY29uc3RydWN0b3Igb3IgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcy4gSWYgb21pdHRlZCwgaXQgaXMgcmVhZCBmcm9tIG1vZGVsIG1ldGFkYXRhLlxuICogQHJldHVybiB7c3RyaW5nfSBBIG5hbWVzcGFjZWQgaW5qZWN0YWJsZSB0b2tlbiBmb3IgdGhlIHJlcG9zaXRvcnkgKGUuZy4sIFwiZGI6cmVwbzpyYW06dXNlcnNcIikuXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgZmxhdm91ciBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIGFyZ3VtZW50cyBvciBtZXRhZGF0YS5cbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICogICBwYXJ0aWNpcGFudCBVIGFzIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdCBNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUyBhcyBTdHJpbmcgRm9ybWF0dGVyXG4gKiAgIEMtPj5VOiBjYWxsKG1vZGVsLCBmbGF2b3VyPylcbiAqICAgYWx0IGZsYXZvdXIgcHJvdmlkZWRcbiAqICAgICBVLS0+PlU6IHVzZSBwcm92aWRlZCBmbGF2b3VyXG4gKiAgIGVsc2UgZmxhdm91ciBub3QgcHJvdmlkZWRcbiAqICAgICBVLT4+QTogQWRhcHRlci5rZXkoQURBUFRFUilcbiAqICAgICBVLT4+UjogZ2V0TWV0YWRhdGEoa2V5LCBtb2RlbHxtb2RlbC5jdG9yKVxuICogICAgIGFsdCBtZXRhZGF0YSBwcmVzZW50XG4gKiAgICAgICBSLS0+PlU6IGZsYXZvdXJcbiAqICAgICBlbHNlIG1pc3NpbmdcbiAqICAgICAgIFUtLT4+QzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgVS0+PlM6IHNmKElOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKVxuICogICBTLS0+PkM6IHRva2VuIHN0cmluZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoIWZsYXZvdXIpIHtcbiAgICBjb25zdCBrZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgZmxhdm91ciA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBrZXksXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiBtb2RlbFxuICAgICk7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDb3VsZCBub3QgcmV0cmlldmUgZmxhdm91ciBmcm9tIG1vZGVsICR7bW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUgOiBtb2RlbC5uYW1lfWBcbiAgICAgICk7XG4gIH1cbiAgcmV0dXJuIHNmKFBlcnNpc3RlbmNlS2V5cy5JTkpFQ1RBQkxFLCBmbGF2b3VyLCBnZXRUYWJsZU5hbWUobW9kZWwpKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RyeSBmb3IgaW5qZWN0YWJsZSByZXBvc2l0b3JpZXMgd2l0aCBhdXRvLXJlc29sdXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhbiBJbmplY3RhYmxlUmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdGhhdCByZXNvbHZlcyByZXBvc2l0b3JpZXMgYnkgbW9kZWwgbmFtZSBvciBjb25zdHJ1Y3Rvci4gSWYgYSByZXBvc2l0b3J5XG4gKiBpcyBub3QgZXhwbGljaXRseSByZWdpc3RlcmVkLCBpdCBhdHRlbXB0cyB0byBpbmZlciB0aGUgY29ycmVjdCByZXBvc2l0b3J5IHVzaW5nIG1vZGVsIG1ldGFkYXRhIGFuZCB0aGUgYWN0aXZlIG9yIHNwZWNpZmllZCBhZGFwdGVyIGZsYXZvdXIuXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVycyByZXF1aXJlZDsgdGhlIHN1cGVyY2xhc3MgaGFuZGxlcyBpbnRlcm5hbCBzdGF0ZS5cbiAqIEBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2U6IHJldHJpZXZlIGEgcmVwb3NpdG9yeSBieSBtb2RlbCBuYW1lXG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCk7XG4gKiBjb25zdCB1c2VyUmVwbyA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oJ1VzZXInKTtcbiAqIC8vIElmIFVzZXJSZXBvc2l0b3J5IGlzIHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBhIFVzZXIgbW9kZWwgZXhpc3RzLlxuICpcbiAqIC8vIFJldHJpZXZlIGJ5IGNvbnN0cnVjdG9yIGFuZCBzcGVjaWZ5IGFkYXB0ZXIgZmxhdm91clxuICogY29uc3QgcmVwb0J5Q3RvciA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4oVXNlck1vZGVsLCAncmFtJyk7XG4gKlxuICogLy8gUmV0cmlldmUgYnkgc3ltYm9sIChlLmcuLCBpbmplY3RhYmxlIHRva2VuKVxuICogY29uc3QgdG9rZW4gPSBTeW1ib2wuZm9yKCdVc2VyUmVwb3NpdG9yeScpO1xuICogY29uc3QgYnlUb2tlbiA9IHJlZ2lzdHJ5LmdldDxVc2VyUmVwb3NpdG9yeT4odG9rZW4pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnN1bWVyXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VSZWdpc3RyeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gKiAgIEMtPj5SOiBnZXQobmFtZSwgZmxhdm91cj8pXG4gKiAgIGFjdGl2YXRlIFJcbiAqICAgUi0+PkI6IHN1cGVyLmdldChuYW1lKVxuICogICBhbHQgRm91bmQgaW4gYmFzZSByZWdpc3RyeVxuICogICAgIEItLT4+UjogaW5qZWN0YWJsZVxuICogICAgIFItLT4+QzogaW5qZWN0YWJsZVxuICogICBlbHNlIE5vdCBmb3VuZFxuICogICAgIFItPj5NOiBNb2RlbC5nZXQobmFtZSlcbiAqICAgICBhbHQgTW9kZWwgZm91bmRcbiAqICAgICAgIFItPj5BOiByZXNvbHZlIGZsYXZvdXIgKGZyb20gYXJnL21ldGFkYXRhL2N1cnJlbnQpXG4gKiAgICAgICBSLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAqICAgICAgIGFsdCBSZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICAgIFJQLS0+PlI6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbHNlIFJlcG9zaXRvcnkgY3RvclxuICogICAgICAgICBSLT4+QTogQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBvciBBZGFwdGVyLmN1cnJlbnRcbiAqICAgICAgICAgQS0tPj5SOiBhZGFwdGVyIGluc3RhbmNlXG4gKiAgICAgICAgIFItPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAqICAgICAgICAgUi0tPj5DOiByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiAgICAgICBlbmRcbiAqICAgICBlbHNlIE1vZGVsIG5vdCBmb3VuZFxuICogICAgICAgUi0tPj5DOiB1bmRlZmluZWRcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlc1JlZ2lzdHJ5IGV4dGVuZHMgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIHtcbiAgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMgYXMgYW55KTtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZSBhbiBpbmplY3RhYmxlIHdpdGggcmVwb3NpdG9yeSBhdXRvLXJlc29sdXRpb24uXG4gICAqIEBzdW1tYXJ5IEF0dGVtcHRzIHRvIGdldCBhbiBpbmplY3RhYmxlIGZyb20gdGhlIGJhc2UgcmVnaXN0cnk7IGlmIG5vdCBmb3VuZCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEga25vd24gbW9kZWwsIGl0XG4gICAqIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSByZXBvc2l0b3J5IHVzaW5nIHRoZSBzcGVjaWZpZWQgZmxhdm91ciBvciBtb2RlbCBtZXRhZGF0YSwgZmFsbGluZyBiYWNrIHRvIHRoZSBjdXJyZW50IGFkYXB0ZXIgd2hlbiBuZWVkZWQuXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSBpbmplY3RhYmxlIHR5cGUgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3I8VD59IG5hbWUgVG9rZW4sIG1vZGVsIG5hbWUsIG9yIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5qZWN0YWJsZSBvciBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIgKGUuZy4sIFwicmFtXCIpLiBJZiBvbWl0dGVkLCBkZXJpdmVzIGZyb20gbWV0YWRhdGEgb3IgY3VycmVudCBhZGFwdGVyLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSBUaGUgbG9jYXRlZCBvciBhdXRvLWNyZWF0ZWQgaW5qZWN0YWJsZSBpbnN0YW5jZTsgb3RoZXJ3aXNlIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgZ2V0KG5hbWUsIGZsYXZvdXI/KVxuICAgKiAgIHBhcnRpY2lwYW50IEJSIGFzIEJhc2VSZWdpc3RyeVxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBSUCBhcyBSZXBvc2l0b3J5XG4gICAqICAgRy0+PkJSOiBzdXBlci5nZXQobmFtZSlcbiAgICogICBhbHQgRm91bmRcbiAgICogICAgIEJSLS0+Pkc6IGluamVjdGFibGVcbiAgICogICBlbHNlIE5vdCBmb3VuZFxuICAgKiAgICAgRy0+Pk06IGRlcml2ZSBtb2RlbEN0b3IgZnJvbSBuYW1lXG4gICAqICAgICBhbHQgbW9kZWxDdG9yIHJlc29sdmVkXG4gICAqICAgICAgIEctPj5BOiByZXNvbHZlIGZsYXZvdXIgKGFyZyB8IG1ldGFkYXRhIHwgY3VycmVudClcbiAgICogICAgICAgRy0+PlJQOiBSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsQ3RvciwgYWxpYXMpXG4gICAqICAgICAgIGFsdCByZXR1cm5zIGluc3RhbmNlXG4gICAqICAgICAgICAgUlAtLT4+RzogUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgKiAgICAgICBlbHNlIHJldHVybnMgY3RvclxuICAgKiAgICAgICAgIEctPj5BOiBBZGFwdGVyLmdldChmbGF2b3VyKSB8IEFkYXB0ZXIuY3VycmVudFxuICAgKiAgICAgICAgIEEtLT4+RzogYWRhcHRlciBpbnN0YW5jZVxuICAgKiAgICAgICAgIEctPj5SUDogbmV3IHJlcG9DdG9yKGFkYXB0ZXIsIG1vZGVsQ3RvcilcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIG5vIG1vZGVsQ3RvclxuICAgKiAgICAgICBHLS0+Pkc6IHJldHVybiB1bmRlZmluZWRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IENvbnN0cnVjdG9yPFQ+IHwgc3RyaW5nLFxuICAgIGZsYXZvdXI/OiBzdHJpbmdcbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZ2V0KTtcbiAgICAvLyBGaXJzdCwgdHJ5IGJhc2UgcmVnaXN0cnksIGJ1dCBndWFyZCBhZ2FpbnN0IHRocm93biBlcnJvcnNcbiAgICBsZXQgaW5qZWN0YWJsZTogVCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lIGFzIGFueSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nLiB3ZSBoYW5kbGUgaXQgbGF0ZXJcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIGxldCBtb2RlbEN0b3I6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIikgbW9kZWxDdG9yID0gbmFtZSBhcyBDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIgfHwgdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbW9kZWxDdG9yID0gTW9kZWwuZ2V0KG5hbWUudG9TdHJpbmcoKSkgYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+O1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vZGVsQ3RvcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgLy8gUmVzb2x2ZSBmbGF2b3VyIGZyb20gbWV0YWRhdGEgaWYgbm90IHByb3ZpZGVkXG4gICAgICBjb25zdCBtZXRhS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRGbGF2b3VyID1cbiAgICAgICAgZmxhdm91ciB8fFxuICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCBtb2RlbEN0b3IpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERldGVybWluZSBhbiBhbGlhcyB0byB1c2U6IHByZWZlciBhIGRpcmVjdGx5IHJlZ2lzdGVyZWQgYWRhcHRlcjsgb3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBhZGFwdGVyXG4gICAgICAgIC8vIGhhcyB0aGUgc2FtZSBmbGF2b3VyLCB1c2UgaXRzIGFsaWFzIHRvIHNhdGlzZnkgUmVwb3NpdG9yeS5mb3JNb2RlbC9BZGFwdGVyLmdldCBsb29rdXBzLlxuICAgICAgICBsZXQgYWxpYXNUb1VzZSA9IHJlc29sdmVkRmxhdm91cjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRGbGF2b3VyKSBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gQWRhcHRlci5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmZsYXZvdXIgPT09IHJlc29sdmVkRmxhdm91cilcbiAgICAgICAgICAgIGFsaWFzVG9Vc2UgPSBjdXJyZW50LmFsaWFzO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICAgICAgbW9kZWxDdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgYWxpYXNUb1VzZVxuICAgICAgICApIGFzIFQ7XG4gICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZ2lzdGVyIHRoZSByZXNvbHZlZCBpbmplY3RhYmxlIG5hbWUgZm9yIGxhdGVyIHJldHJpZXZhbFxuICAgICAgICBjb25zdCBmID1cbiAgICAgICAgICByZXNvbHZlZEZsYXZvdXIgfHxcbiAgICAgICAgICAoUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhS2V5LCAoaW5qZWN0YWJsZSBhcyBhbnkpLmNvbnN0cnVjdG9yKSBhc1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgIG1vZGVsQ3RvciBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICBmIGFzIHN0cmluZ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmRlYnVnKFxuICAgICAgICAgIGBObyByZWdpc3RlcmVkIHJlcG9zaXRvcnkgb3IgYWRhcHRlciBmb3VuZC4gZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYWRhcHRlci4gRXJyb3I6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVwb0N0b3IgPSAoUmVwb3NpdG9yeSBhcyBhbnkpW1wiZ2V0XCJdKG1vZGVsQ3RvciwgcmVzb2x2ZWRGbGF2b3VyKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBvQ3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlciA9IHJlc29sdmVkRmxhdm91clxuICAgICAgICAgICAgPyAoQWRhcHRlci5nZXQocmVzb2x2ZWRGbGF2b3VyKSBhcyBhbnkpXG4gICAgICAgICAgICA6IChBZGFwdGVyLmN1cnJlbnQgYXMgYW55KTtcbiAgICAgICAgICBpZiAoIWFkYXB0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKTtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgVDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJEaXNwYXRjaCwgRXZlbnRJZHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlcyBkYXRhYmFzZSBvcGVyYXRpb24gZXZlbnRzIHRvIG9ic2VydmVyc1xuICogQHN1bW1hcnkgVGhlIERpc3BhdGNoIGNsYXNzIGltcGxlbWVudHMgdGhlIE9ic2VydmFibGUgaW50ZXJmYWNlIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJjZXB0aW5nXG4gKiBkYXRhYmFzZSBvcGVyYXRpb25zIGZyb20gYW4gQWRhcHRlciBhbmQgbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGNoYW5nZXMgb2NjdXIuIEl0IHVzZXMgcHJveGllcyB0b1xuICogd3JhcCB0aGUgYWRhcHRlcidzIENSVUQgbWV0aG9kcyBhbmQgYXV0b21hdGljYWxseSB0cmlnZ2VyIG9ic2VydmVyIHVwZGF0ZXMgYWZ0ZXIgb3BlcmF0aW9ucyBjb21wbGV0ZS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnNcbiAqIEBjbGFzcyBEaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0aW5nIGFuZCB1c2luZyBhIERpc3BhdGNoIGluc3RhbmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBEaXNwYXRjaDxQb3N0Z3Jlc0RyaXZlcj4oKTtcbiAqXG4gKiAvLyBDb25uZWN0IGl0IHRvIGFuIGFkYXB0ZXJcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKGNvbm5lY3Rpb24pO1xuICogZGlzcGF0Y2gub2JzZXJ2ZShhZGFwdGVyKTtcbiAqXG4gKiAvLyBOb3cgYW55IENSVUQgb3BlcmF0aW9ucyBvbiB0aGUgYWRhcHRlciB3aWxsIGF1dG9tYXRpY2FsbHlcbiAqIC8vIHRyaWdnZXIgb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICogYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMTIzLCB1c2VyTW9kZWwpO1xuICogLy8gT2JzZXJ2ZXJzIHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIGNyZWF0aW9uXG4gKlxuICogLy8gV2hlbiBkb25lLCB5b3UgY2FuIGRpc2Nvbm5lY3RcbiAqIGRpc3BhdGNoLnVuT2JzZXJ2ZShhZGFwdGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2ggZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIEFkYXB0ZXJEaXNwYXRjaCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGFkYXB0ZXIgYmVpbmcgb2JzZXJ2ZWRcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHdob3NlIG9wZXJhdGlvbnMgYXJlIGJlaW5nIG1vbml0b3JlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFkYXB0ZXI/OiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqIEBzdW1tYXJ5IEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGFkYXB0ZXJcbiAgICovXG4gIHByb3RlY3RlZCBtb2RlbHMhOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRGlzcGF0Y2ggaW5zdGFuY2Ugd2l0aG91dCBhbnkgYWRhcHRlclxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoIGJ5IHByb3h5aW5nIGFkYXB0ZXIgbWV0aG9kc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHByb3hpZXMgb24gdGhlIGFkYXB0ZXIncyBDUlVEIG1ldGhvZHMgdG8gaW50ZXJjZXB0IG9wZXJhdGlvbnMgYW5kIG5vdGlmeSBvYnNlcnZlcnMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gYWRhcHRlciBpcyBvYnNlcnZlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBQcm94eVxuICAgKlxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IGluaXRpYWxpemUoKVxuICAgKiAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IENoZWNrIGlmIGFkYXB0ZXIgZXhpc3RzXG4gICAqICAgYWx0IE5vIGFkYXB0ZXJcbiAgICogICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgbG9vcCBGb3IgZWFjaCBDUlVEIG1ldGhvZFxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBpZiBtZXRob2QgZXhpc3RzXG4gICAqICAgICBhbHQgTWV0aG9kIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgICAgRGlzcGF0Y2gtLT4+RGlzcGF0Y2g6IFRocm93IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBHZXQgcHJvcGVydHkgZGVzY3JpcHRvclxuICAgKiAgICAgbG9vcCBXaGlsZSBkZXNjcmlwdG9yIG5vdCBmb3VuZFxuICAgKiAgICAgICBEaXNwYXRjaC0+PkFkYXB0ZXI6IENoZWNrIHByb3RvdHlwZSBjaGFpblxuICAgKiAgICAgZW5kXG4gICAqXG4gICAqICAgICBhbHQgRGVzY3JpcHRvciBub3QgZm91bmQgb3Igbm90IHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+RGlzcGF0Y2g6IExvZyBlcnJvciBhbmQgY29udGludWVcbiAgICogICAgIGVsc2UgRGVzY3JpcHRvciBmb3VuZCBhbmQgd3JpdGFibGVcbiAgICogICAgICAgRGlzcGF0Y2gtPj5Qcm94eTogQ3JlYXRlIHByb3h5IGZvciBtZXRob2RcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBSZXBsYWNlIG1ldGhvZCB3aXRoIHByb3h5XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAvLyBHcmFjZWZ1bGx5IHNraXAgaW5pdGlhbGl6YXRpb24gd2hlbiBubyBhZGFwdGVyIGlzIG9ic2VydmVkIHlldC5cbiAgICAgIC8vIFNvbWUgdGVzdHMgb3Igc2V0dXBzIG1heSBjb25zdHJ1Y3QgYSBEaXNwYXRjaCBiZWZvcmUgY2FsbGluZyBvYnNlcnZlKCkuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHRocm93aW5nLCB3ZSBuby1vcCBzbyB0aGF0IGxhdGVyIG9ic2VydmUoKSBjYW4gcHJvY2VlZC5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBObyBhZGFwdGVyIG9ic2VydmVkIGZvciBkaXNwYXRjaDsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb25gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PjtcbiAgICAoXG4gICAgICBbXG4gICAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgICBdIGFzIChrZXlvZiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4pW11cbiAgICApLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgaWYgKCFhZGFwdGVyW21ldGhvZF0pXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBNZXRob2QgJHttZXRob2R9IG5vdCBmb3VuZCBpbiAke2FkYXB0ZXIuYWxpYXN9IGFkYXB0ZXIgdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcblxuICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFkYXB0ZXIsIG1ldGhvZCk7XG4gICAgICBsZXQgcHJvdG86IGFueSA9IGFkYXB0ZXI7XG4gICAgICB3aGlsZSAoIWRlc2NyaXB0b3IgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgICAgICBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbWV0aG9kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBtZXRob2QgJHttZXRob2R9IHRvIGJpbmQgT2JzZXJ2YWJsZXMgRGlzcGF0Y2hgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJ1bGtUb1NpbmdsZShtZXRob2Q6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5DUkVBVEU7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLlVQREFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuREVMRVRFO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJlY2F1c2UgdGhlcmUgYXJlIHJlYWQgb25seSBwcm9wZXJ0aWVzXG4gICAgICBhZGFwdGVyW21ldGhvZF0gPSBuZXcgUHJveHkoYWRhcHRlclttZXRob2RdLCB7XG4gICAgICAgIGFwcGx5OiBhc3luYyAodGFyZ2V0OiBhbnksIHRoaXNBcmcsIGFyZ0FycmF5OiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFt0YWJsZU5hbWUsIGlkc10gPSBhcmdBcnJheTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXJnZXQuYXBwbHkodGhpc0FyZywgYXJnQXJyYXkpO1xuICAgICAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlTmFtZSwgYnVsa1RvU2luZ2xlKG1ldGhvZCksIGlkcyBhcyBFdmVudElkcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgICBgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7bWV0aG9kfSBmb3IgJHt0YWJsZU5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHttZXRob2R9IG9uICR7dGFibGVOYW1lfTogJHtlfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZGlzcGF0Y2hcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIHdoZW4gdGhlIGRpc3BhdGNoIGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjbG9zaW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB0byBub3RoaW5nIGluIHRoaXMgaW5zdGFuY2UgYnV0IG1heSBiZSByZXF1aXJlZCBmb3IgY2xvc2luZyBjb25uZWN0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgb2JzZXJ2aW5nIGFuIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ29ubmVjdHMgdGhpcyBkaXNwYXRjaCB0byBhbiBhZGFwdGVyIHRvIG1vbml0b3IgaXRzIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT59IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gb2JzZXJ2ZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+KTogdm9pZCB7XG4gICAgaWYgKCEob2JzZXJ2ZXIgaW5zdGFuY2VvZiBBZGFwdGVyKSlcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiT25seSBBZGFwdGVycyBjYW4gYmUgb2JzZXJ2ZWQgYnkgZGlzcGF0Y2hcIik7XG4gICAgdGhpcy5hZGFwdGVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5tb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBEaXNwYXRjaCBpbml0aWFsaXplZCBmb3IgJHt0aGlzLmFkYXB0ZXIhLmFsaWFzfSBhZGFwdGVyYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0b3BzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IERpc2Nvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggZnJvbSBhbiBhZGFwdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIGFkYXB0ZXIgdG8gc3RvcCBvYnNlcnZpbmdcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGFwdGVyICE9PSBvYnNlcnZlcilcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICBcIk9ubHkgdGhlIGFkYXB0ZXIgdGhhdCB3YXMgdXNlZCB0byBvYnNlcnZlIGNhbiBiZSB1bm9ic2VydmVkXCJcbiAgICAgICk7XG4gICAgdGhpcy5hZGFwdGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBhYm91dCBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoZXJlIHRoZSBjaGFuZ2Ugb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBkaXNwYXRjaDogJHtlfWApO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoQWRhcHRlcikgQWRhcHRlcltcIl9iYXNlRGlzcGF0Y2hcIl0gPSBEaXNwYXRjaDtcbiIsImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZGVjb3JhdG9yIGZvciBtb2RlbCBjbGFzc2VzLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FuIGJlIHVzZWQgYXMgYm90aCBhIHByb3BlcnR5IGRlY29yYXRvciBhbmQgYSBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD59IG1vZGVsIC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSB0aGUgcmVxdWlyZWQgYWRhcHRlcidzIGZsYXZvdXIvYWxpYXMuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuLlxuICogQHJldHVybiB7YW55fSAtIFRoZSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKlxuICogICBDLT4+RDogQXBwbHkgQHJlcG9zaXRvcnkoTW9kZWwpXG4gKiAgIGFsdCBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAqICAgICBELT4+RDogQ2hlY2sgaWYgcHJvcGVydHlLZXkgZXhpc3RzXG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0KG5hbWUpIGRlY29yYXRvclxuICogICBlbHNlIENsYXNzIERlY29yYXRvclxuICogICAgIEQtPj5NOiBTZXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBvbiBtb2RlbFxuICogICAgIEQtPj5SOiBSZWdpc3RlciBtb2RlbCB3aXRoIFJlcG9zaXRvcnlcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3RhYmxlIGRlY29yYXRvciB3aXRoIGNvbmZpZ1xuICogICAgIEMtPj5DOiBEZWZpbmUgREJLZXlzLkNMQVNTIHByb3BlcnR5XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwpKFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLCBvcmlnaW5hbC5uYW1lKShtb2RlbCk7XG4gICAgZmxhdm91ciA9XG4gICAgICBmbGF2b3VyIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgb3JpZ2luYWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIGZsYXZvdXJcbiAgICApO1xuICAgIHJldHVybiBpbmplY3RhYmxlKG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCwge1xuICAgICAgY2FsbGJhY2s6IChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0pKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgcmVwb3NpdG9yeSBvYnNlcnZlciBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9ic2VydmVyRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPYnNlcnZlckVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3Igc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBzZXF1ZW5jZXNcbiAqIEBpbnRlcmZhY2UgU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU9wdGlvbnM8XG4gIFRZUEUgPSBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgZ2VuZXJhdGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBnZW5lcmF0ZXMgTnVtYmVyIG9yIEJpZ0ludCB2YWx1ZXNcbiAgICovXG4gIHR5cGU6IFRZUEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIHZhbHVlIHRoYXQgdGhlIHNlcXVlbmNlIHN0YXJ0cyB3aXRoXG4gICAqL1xuICBzdGFydFdpdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIGVhY2ggc3RlcCBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2VxdWVuY2UgaW5jcmVhc2VzIHdpdGggZWFjaCBjYWxsXG4gICAqL1xuICBpbmNyZW1lbnRCeTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3B0aW9uYWwgbWluaW11bSB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgdmFsdWUgdGhhdCB0aGUgc2VxdWVuY2UgY2FuIGdlbmVyYXRlXG4gICAqL1xuICBtaW5WYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbmFsIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCB2YWx1ZSB0aGF0IHRoZSBzZXF1ZW5jZSBjYW4gZ2VuZXJhdGVcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgc2VxdWVuY2Ugc2hvdWxkIGN5Y2xlIHdoZW4gcmVhY2hpbmcgaXRzIGxpbWl0c1xuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCB0aGUgc2VxdWVuY2Ugd2lsbCByZXN0YXJ0IGZyb20gbWluVmFsdWUgd2hlbiByZWFjaGluZyBtYXhWYWx1ZVxuICAgKi9cbiAgY3ljbGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgb3B0aW9ucyBmb3Igc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIG51bWJlciBzZXF1ZW5jZXMgc3RhcnRpbmcgYXQgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDFcbiAqIEBjb25zdCBOb25lU2VxdWVuY2VPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE5vbmVTZXF1ZW5jZU9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyA9IHtcbiAgdHlwZTogdW5kZWZpbmVkLFxuICBnZW5lcmF0ZWQ6IGZhbHNlLFxuICBzdGFydFdpdGg6IDAsXG4gIGluY3JlbWVudEJ5OiAxLFxuICBjeWNsZTogZmFsc2UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IG9wdGlvbnMgZm9yIHNlcXVlbmNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgRGVmYXVsdFNlcXVlbmNlT3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VxdWVuY2VPcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMgPSBOb25lU2VxdWVuY2VPcHRpb25zO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmVkZWZpbmVkIG9wdGlvbnMgZm9yIG51bWVyaWMgc2VxdWVuY2VzXG4gKiBAc3VtbWFyeSBDb25maWd1cmF0aW9uIGZvciBzdGFuZGFyZCBudW1iZXIgc2VxdWVuY2VzIHN0YXJ0aW5nIGF0IDAgYW5kIGluY3JlbWVudGluZyBieSAxXG4gKiBAY29uc3QgTnVtZXJpY1NlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNTZXF1ZW5jZTogU2VxdWVuY2VPcHRpb25zID0ge1xuICB0eXBlOiBcIk51bWJlclwiLFxuICBnZW5lcmF0ZWQ6IHRydWUsXG4gIHN0YXJ0V2l0aDogMCxcbiAgaW5jcmVtZW50Qnk6IDEsXG4gIGN5Y2xlOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByZWRlZmluZWQgb3B0aW9ucyBmb3IgQmlnSW50IHNlcXVlbmNlc1xuICogQHN1bW1hcnkgQ29uZmlndXJhdGlvbiBmb3IgQmlnSW50IHNlcXVlbmNlcyBzdGFydGluZyBhdCAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgMVxuICogQGNvbnN0IEJpZ0ludFNlcXVlbmNlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGNvbnN0IEJpZ0ludFNlcXVlbmNlOiBTZXF1ZW5jZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgTnVtZXJpY1NlcXVlbmNlLFxuICB7XG4gICAgdHlwZTogXCJCaWdJbnRcIixcbiAgfVxuKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBhcmlzb24gb3BlcmF0b3JzIGZvciBxdWVyeSBjb25kaXRpb25zXG4gKiBAc3VtbWFyeSBFbnVtIGRlZmluaW5nIHRoZSBhdmFpbGFibGUgb3BlcmF0b3JzIGZvciBjb21wYXJpbmcgdmFsdWVzIGluIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgZW51bSBPcGVyYXRvciB7XG4gIC8qKiBFcXVhbCBjb21wYXJpc29uICg9KSAqL1xuICBFUVVBTCA9IFwiRVFVQUxcIixcbiAgLyoqIE5vdCBlcXVhbCBjb21wYXJpc29uICghPSkgKi9cbiAgRElGRkVSRU5UID0gXCJESUZGRVJFTlRcIixcbiAgLyoqIEdyZWF0ZXIgdGhhbiBjb21wYXJpc29uICg+KSAqL1xuICBCSUdHRVIgPSBcIkJJR0dFUlwiLFxuICAvKiogR3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKD49KSAqL1xuICBCSUdHRVJfRVEgPSBcIkJJR0dFUl9FUVwiLFxuICAvKiogTGVzcyB0aGFuIGNvbXBhcmlzb24gKDwpICovXG4gIFNNQUxMRVIgPSBcIlNNQUxMRVJcIixcbiAgLyoqIExlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uICg8PSkgKi9cbiAgU01BTExFUl9FUSA9IFwiU01BTExFUl9FUVwiLFxuICAvLyBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIC8qKiBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKSAqL1xuICBOT1QgPSBcIk5PVFwiLFxuICAvKiogSW5jbHVzaW9uIG9wZXJhdG9yIChJTikgKi9cbiAgSU4gPSBcIklOXCIsXG4gIC8vIElTID0gXCJJU1wiLFxuICAvKiogUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nICovXG4gIFJFR0VYUCA9IFwiUkVHRVhQXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExvZ2ljYWwgb3BlcmF0b3JzIGZvciBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9uc1xuICogQHN1bW1hcnkgRW51bSBkZWZpbmluZyB0aGUgYXZhaWxhYmxlIG9wZXJhdG9ycyBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgY29uZGl0aW9ucyBpbiBkYXRhYmFzZSBxdWVyaWVzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGVudW0gR3JvdXBPcGVyYXRvciB7XG4gIC8qKiBMb2dpY2FsIEFORCBvcGVyYXRvciAtIGFsbCBjb25kaXRpb25zIG11c3QgYmUgdHJ1ZSAqL1xuICBBTkQgPSBcIkFORFwiLFxuICAvKiogTG9naWNhbCBPUiBvcGVyYXRvciAtIGF0IGxlYXN0IG9uZSBjb25kaXRpb24gbXVzdCBiZSB0cnVlICovXG4gIE9SID0gXCJPUlwiLFxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gZHVyaW5nIHF1ZXJ5IG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHF1ZXJ5IGJ1aWxkaW5nIG9yIGV4ZWN1dGlvblxuICogQHBhcmFtIHtzdHJpbmcgfCBFcnJvcn0gbXNnIC0gVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0XG4gKiBAY2xhc3MgUXVlcnlFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUXVlcnlFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBRdWVyeUVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIGR1cmluZyBwYWdpbmF0aW9uIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHBhZ2luYXRpb24gc2V0dXAgb3IgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3RcbiAqIEBjbGFzcyBQYWdpbmdFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFnaW5nRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgUGFnaW5nRXJyb3IubmFtZSwgNTAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXR0cmlidXRlT3B0aW9uLCBDb25kaXRpb25CdWlsZGVyT3B0aW9uIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uYWxBc3luYyxcbiAgTW9kZWwsXG4gIE1vZGVsRXJyb3JEZWZpbml0aW9uLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxudHlwZSBJbmZlckFzeW5jPE0+ID0gTSBleHRlbmRzIE1vZGVsPGluZmVyIEE+ID8gQSA6IGZhbHNlO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25kaXRpb24gZm9yIGRhdGFiYXNlIHF1ZXJpZXNcbiAqIEBzdW1tYXJ5IEEgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgcXVlcnkgY29uZGl0aW9ucyB3aXRoIHN1cHBvcnQgZm9yIGNvbXBsZXggbG9naWNhbCBvcGVyYXRpb25zLlxuICogVGhpcyBjbGFzcyBhbGxvd3MgZm9yIGJ1aWxkaW5nIGFuZCBjb21iaW5pbmcgcXVlcnkgY29uZGl0aW9ucyB1c2luZyBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUiwgTk9UKVxuICogYW5kIGNvbXBhcmlzb24gb3BlcmF0b3JzIChlcXVhbHMsIG5vdCBlcXVhbHMsIGdyZWF0ZXIgdGhhbiwgZXRjLikuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbmRpdGlvbjxNPn0gYXR0cjEgLSBUaGUgYXR0cmlidXRlIG5hbWUgb3IgYSBuZXN0ZWQgY29uZGl0aW9uXG4gKiBAcGFyYW0ge09wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcn0gb3BlcmF0b3IgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gKiBAcGFyYW0ge2FueX0gY29tcGFyaXNvbiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3Qgb3IgYW5vdGhlciBjb25kaXRpb25cbiAqIEBjbGFzcyBDb25kaXRpb25cbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBzaW1wbGUgY29uZGl0aW9uXG4gKiBjb25zdCBuYW1lQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcIm5hbWVcIikuZXEoXCJKb2huXCIpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGNvbXBsZXggY29uZGl0aW9uXG4gKiBjb25zdCBjb21wbGV4Q29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZShcImFnZVwiKS5ndCgxOClcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKTtcbiAqXG4gKiAvLyBVc2UgdGhlIGJ1aWxkZXIgcGF0dGVyblxuICogY29uc3QgdXNlclF1ZXJ5ID0gQ29uZGl0aW9uLmJ1aWxkZXIoKVxuICogICAuYXR0cmlidXRlKFwiZW1haWxcIikucmVnZXhwKFwiLipAZXhhbXBsZS5jb21cIilcbiAqICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKFwibGFzdExvZ2luXCIpLmd0KG5ldyBEYXRlKFwiMjAyMy0wMS0wMVwiKSkpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBEZXZcbiAqICAgcGFydGljaXBhbnQgQ29uZGl0aW9uXG4gKiAgIERldi0+PkNvbmRpdGlvbjogYnVpbGRlcigpLmF0dHJpYnV0ZShcImFnZVwiKS5ndCgxOClcbiAqICAgQ29uZGl0aW9uLS0+PkRldjogQ29uZGl0aW9uKGFnZSA+IDE4KVxuICogICBEZXYtPj5Db25kaXRpb246IC5hbmQoYXR0cmlidXRlKFwic3RhdHVzXCIpLmVxKFwiYWN0aXZlXCIpKVxuICogICBDb25kaXRpb24tLT4+RGV2OiBDb25kaXRpb24oKGFnZSA+IDE4KSBBTkQgKHN0YXR1cyA9IFwiYWN0aXZlXCIpKVxuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbDxhbnk+PiBleHRlbmRzIE1vZGVsPEluZmVyQXN5bmM8TT4+IHtcbiAgQHJlcXVpcmVkKClcbiAgcHJvdGVjdGVkIGF0dHIxPzogc3RyaW5nIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICBAcmVxdWlyZWQoKVxuICBwcm90ZWN0ZWQgb3BlcmF0b3I/OiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3IgPSB1bmRlZmluZWQ7XG4gIEByZXF1aXJlZCgpXG4gIHByb3RlY3RlZCBjb21wYXJpc29uPzogYW55ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yLFxuICAgIGNvbXBhcmlzb246IGFueVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXR0cjEgPSBhdHRyMTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy5jb21wYXJpc29uID0gY29tcGFyaXNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgQU5EXG4gICAqIEBzdW1tYXJ5IEpvaW5zIHR3byBjb25kaXRpb25zIHdpdGggYW4gQU5EIG9wZXJhdG9yLCByZXF1aXJpbmcgYm90aCB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIGFuZChjb25kaXRpb246IENvbmRpdGlvbjxNPik6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5hbmQodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tYmluZXMgdGhpcyBjb25kaXRpb24gd2l0aCBhbm90aGVyIHVzaW5nIGxvZ2ljYWwgT1JcbiAgICogQHN1bW1hcnkgSm9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBPUiBvcGVyYXRvciwgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSB0byBiZSB0cnVlXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIGNvbWJpbmUgd2l0aCB0aGlzIG9uZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgb3IoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24ub3IodGhpcywgY29uZGl0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5lZ2F0aW9uIGNvbmRpdGlvblxuICAgKiBAc3VtbWFyeSBFeGNsdWRlcyBhIHZhbHVlIGZyb20gdGhlIHJlc3VsdCBieSBhcHBseWluZyBhIE5PVCBvcGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIG5lZ2F0ZVxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE5PVCBvcGVyYXRpb25cbiAgICovXG4gIG5vdCh2YWw6IGFueSk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb24odGhpcywgT3BlcmF0b3IuTk9ULCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgdGhlIGNvbmRpdGlvbiBhbmQgY2hlY2tzIGZvciBlcnJvcnNcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGUgY29uZGl0aW9uIGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gey4uLnN0cmluZ1tdfSBleGNlcHRpb25zIC0gRmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSB2YWxpZGF0aW9uXG4gICAqIEByZXR1cm4ge01vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSBFcnJvciBkZWZpbml0aW9uIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIG92ZXJyaWRlIGhhc0Vycm9ycyhcbiAgICAuLi5leGNlcHRpb25zOiBzdHJpbmdbXVxuICApOiBDb25kaXRpb25hbEFzeW5jPEluZmVyQXN5bmM8TT4sIE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY29uZGl0aW9uQ2hlY2sgPSAoKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZE9wTWVzc2FnZSA9IGBJbnZhbGlkIG9wZXJhdG9yICR7dGhpcy5vcGVyYXRvcn19YDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dHIxID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhcmlzb24gaW5zdGFuY2VvZiBDb25kaXRpb24pXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBhcmlzb246IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICAgIFwiQm90aCBzaWRlcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoT3BlcmF0b3IpLmluZGV4T2YodGhpcy5vcGVyYXRvciBhcyBPcGVyYXRvcikgPT09IC0xKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVyYXRvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IGludmFsaWRPcE1lc3NhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgTW9kZWxFcnJvckRlZmluaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmF0dHIxIGluc3RhbmNlb2YgQ29uZGl0aW9uKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKHRoaXMuY29tcGFyaXNvbiBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiZcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yICE9PSBPcGVyYXRvci5OT1RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wYXJpc29uOiB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogaW52YWxpZE9wTWVzc2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBNb2RlbEVycm9yRGVmaW5pdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoR3JvdXBPcGVyYXRvcikuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xICYmXG4gICAgICAgICAgdGhpcy5vcGVyYXRvciAhPT0gT3BlcmF0b3IuTk9UXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BlcmF0b3I6IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBpbnZhbGlkT3BNZXNzYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIE1vZGVsRXJyb3JEZWZpbml0aW9uO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBlcnJvcnMgPSBzdXBlci5oYXNFcnJvcnMoLi4uZXhjZXB0aW9ucyk7XG4gICAgaWYgKCF0aGlzLmlzQXN5bmMoKSlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlcnJvcnMgYXMgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQpID8/XG4gICAgICAgIChjb25kaXRpb25DaGVjaygpIGFzIGFueSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBlcnJvcnMgYXMgdW5rbm93biBhcyBQcm9taXNlPE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPlxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNvbHZlZCA/PyBjb25kaXRpb25DaGVjaygpO1xuICAgIH0pKCkgYXMgQ29uZGl0aW9uYWxBc3luYzxJbmZlckFzeW5jPE0+LCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIEFORFxuICAgKiBAc3VtbWFyeSBTdGF0aWMgbWV0aG9kIHRoYXQgam9pbnMgdHdvIGNvbmRpdGlvbnMgd2l0aCBhbiBBTkQgb3BlcmF0b3IsIHJlcXVpcmluZyBib3RoIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIEFORCBvcGVyYXRpb25cbiAgICovXG4gIHN0YXRpYyBhbmQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjb25kaXRpb24xOiBDb25kaXRpb248TT4sXG4gICAgY29uZGl0aW9uMjogQ29uZGl0aW9uPE0+XG4gICk6IENvbmRpdGlvbjxNPiB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5ncm91cChjb25kaXRpb24xLCBHcm91cE9wZXJhdG9yLkFORCwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIE9SXG4gICAqIEBzdW1tYXJ5IFN0YXRpYyBtZXRob2QgdGhhdCBqb2lucyB0d28gY29uZGl0aW9ucyB3aXRoIGFuIE9SIG9wZXJhdG9yLCByZXF1aXJpbmcgYXQgbGVhc3Qgb25lIHRvIGJlIHRydWVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSB0aGlzIGNvbmRpdGlvbiBvcGVyYXRlcyBvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uMSAtIFRoZSBmaXJzdCBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIE9SIG9wZXJhdGlvblxuICAgKi9cbiAgc3RhdGljIG9yPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uZGl0aW9uMTogQ29uZGl0aW9uPE0+LFxuICAgIGNvbmRpdGlvbjI6IENvbmRpdGlvbjxNPlxuICApOiBDb25kaXRpb248TT4ge1xuICAgIHJldHVybiBDb25kaXRpb24uZ3JvdXAoY29uZGl0aW9uMSwgR3JvdXBPcGVyYXRvci5PUiwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIHRoYXQgZ3JvdXBzIHR3byBjb25kaXRpb25zIHdpdGggYSBzcGVjaWZpZWQgb3BlcmF0b3JcbiAgICogQHN1bW1hcnkgUHJpdmF0ZSBzdGF0aWMgbWV0aG9kIHRoYXQgY29tYmluZXMgdHdvIGNvbmRpdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZCBncm91cCBvcGVyYXRvclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24xIC0gVGhlIGZpcnN0IGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0dyb3VwT3BlcmF0b3J9IG9wZXJhdG9yIC0gVGhlIGdyb3VwIG9wZXJhdG9yIHRvIHVzZSAoQU5ELCBPUilcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbjIgLSBUaGUgc2Vjb25kIGNvbmRpdGlvblxuICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyb3VwZWQgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBncm91cDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNvbmRpdGlvbjE6IENvbmRpdGlvbjxNPixcbiAgICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvcixcbiAgICBjb25kaXRpb24yOiBDb25kaXRpb248TT5cbiAgKTogQ29uZGl0aW9uPE0+IHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbihjb25kaXRpb24xLCBvcGVyYXRvciwgY29uZGl0aW9uMik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjb25kaXRpb24gYnVpbGRlciBmb3IgYSBzcGVjaWZpYyBtb2RlbCBhdHRyaWJ1dGVcbiAgICogQHN1bW1hcnkgU3RhdGljIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHJpYnV0ZTxNIGV4dGVuZHMgTW9kZWw+KGF0dHI6IGtleW9mIE0pIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbi5CdWlsZGVyPE0+KCkuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICogQHN1bW1hcnkgU2hvcnRoYW5kIG1ldGhvZCB0aGF0IGluaXRpYWxpemVzIGEgY29uZGl0aW9uIGJ1aWxkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIG9wZXJhdGVzIG9uXG4gICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byBidWlsZCBhIGNvbmRpdGlvbiBmb3JcbiAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBBIGNvbmRpdGlvbiBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgc3RhdGljIGF0dHI8TSBleHRlbmRzIE1vZGVsPihhdHRyOiBrZXlvZiBNKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhIGZsdWVudCBBUEkgdG8gYnVpbGQgcXVlcnkgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBBIGJ1aWxkZXIgY2xhc3MgdGhhdCBzaW1wbGlmaWVzIHRoZSBjcmVhdGlvbiBvZiBkYXRhYmFzZSBxdWVyeSBjb25kaXRpb25zXG4gICAqIHdpdGggYSBjaGFpbmFibGUgaW50ZXJmYWNlIGZvciBzZXR0aW5nIGF0dHJpYnV0ZXMgYW5kIG9wZXJhdG9yc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgb3BlcmF0ZXMgb25cbiAgICogQGNsYXNzIENvbmRpdGlvbkJ1aWxkZXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgPSBjbGFzcyBDb25kaXRpb25CdWlsZGVyPE0gZXh0ZW5kcyBNb2RlbD5cbiAgICBpbXBsZW1lbnRzIENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4sIEF0dHJpYnV0ZU9wdGlvbjxNPlxuICB7XG4gICAgYXR0cjE/OiBrZXlvZiBNIHwgQ29uZGl0aW9uPE0+ID0gdW5kZWZpbmVkO1xuICAgIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIGNvbXBhcmlzb24/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYXR0cmlidXRlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIG1vZGVsIGF0dHJpYnV0ZSB0aGUgY29uZGl0aW9uIHdpbGwgb3BlcmF0ZSBvblxuICAgICAqIEBwYXJhbSBhdHRyIC0gVGhlIG1vZGVsIGF0dHJpYnV0ZSB0byB1c2UgaW4gdGhlIGNvbmRpdGlvblxuICAgICAqIEByZXR1cm4ge0F0dHJpYnV0ZU9wdGlvbjxNPn0gVGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGUoYXR0cjoga2V5b2YgTSk6IEF0dHJpYnV0ZU9wdGlvbjxNPiB7XG4gICAgICB0aGlzLmF0dHIxID0gYXR0cjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBbGlhcyBmb3IgdGhlIGF0dHJpYnV0ZSBtZXRob2RcbiAgICAgKiBAc3VtbWFyeSBTaG9ydGhhbmQgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggbW9kZWwgYXR0cmlidXRlIHRoZSBjb25kaXRpb24gd2lsbCBvcGVyYXRlIG9uXG4gICAgICogQHBhcmFtIGF0dHIgLSBUaGUgbW9kZWwgYXR0cmlidXRlIHRvIHVzZSBpbiB0aGUgY29uZGl0aW9uXG4gICAgICogQHJldHVybiB7QXR0cmlidXRlT3B0aW9uPE0+fSBUaGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgICAqL1xuICAgIGF0dHIoYXR0cjoga2V5b2YgTSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlKGF0dHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGVxKHZhbDogYW55KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRPcChPcGVyYXRvci5FUVVBTCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmVxdWFsaXR5IGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBkaWYodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkRJRkZFUkVOVCwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGdyZWF0ZXIgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgZ3QodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLkJJR0dFUiwgdmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxlc3MgdGhhbiBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBCdWlsZHMgYSBjb25kaXRpb24gdGhhdCBjaGVja3MgaWYgdGhlIGF0dHJpYnV0ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWwgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGxlc3MgdGhhbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgbHQodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVIsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsIC0gVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIGF0dHJpYnV0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICAgICAqL1xuICAgIGd0ZSh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuQklHR0VSX0VRLCB2YWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBhdHRyaWJ1dGUgYWdhaW5zdFxuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIHJlcHJlc2VudGluZyB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAgICAgKi9cbiAgICBsdGUodmFsOiBhbnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldE9wKE9wZXJhdG9yLlNNQUxMRVJfRVEsIHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5jbHVzaW9uIGNvbmRpdGlvblxuICAgICAqIEBzdW1tYXJ5IEJ1aWxkcyBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjaWZpZWQgYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgLSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIGNoZWNrIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiByZXByZXNlbnRpbmcgdGhlIGluY2x1c2lvbiBjb21wYXJpc29uXG4gICAgICovXG4gICAgaW4oYXJyOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuSU4sIGFycik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gY29uZGl0aW9uXG4gICAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBhdHRyaWJ1dGUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0XG4gICAgICogQHJldHVybiB7Q29uZGl0aW9uPE0+fSBBIG5ldyBjb25kaXRpb24gcmVwcmVzZW50aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGFyaXNvblxuICAgICAqL1xuICAgIHJlZ2V4cCh2YWw6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0T3AoT3BlcmF0b3IuUkVHRVhQLCBuZXcgUmVnRXhwKHZhbCkuc291cmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb3BlcmF0b3IgYW5kIGNvbXBhcmlzb24gdmFsdWUgZm9yIHRoZSBjb25kaXRpb25cbiAgICAgKiBAc3VtbWFyeSBQcml2YXRlIG1ldGhvZCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3AgLSBUaGUgb3BlcmF0b3IgdG8gdXNlIGZvciB0aGUgY29uZGl0aW9uXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgICAgKiBAcmV0dXJuIHtDb25kaXRpb248TT59IEEgbmV3IGNvbmRpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmF0b3IgYW5kIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRPcChvcDogT3BlcmF0b3IsIHZhbDogYW55KSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gb3A7XG4gICAgICB0aGlzLmNvbXBhcmlzb24gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RzIGEgQ29uZGl0aW9uIGluc3RhbmNlIGZyb20gdGhlIGJ1aWxkZXIncyBzdGF0ZVxuICAgICAqIEBzdW1tYXJ5IEZpbmFsaXplcyB0aGUgY29uZGl0aW9uIGJ1aWxkaW5nIHByb2Nlc3MgYnkgY3JlYXRpbmcgYSBuZXcgQ29uZGl0aW9uIGluc3RhbmNlXG4gICAgICogQHRocm93cyB7UXVlcnlFcnJvcn0gSWYgdGhlIGNvbmRpdGlvbiBjYW5ub3QgYmUgYnVpbHQgZHVlIHRvIGludmFsaWQgcGFyYW1ldGVyc1xuICAgICAqIEByZXR1cm4ge0NvbmRpdGlvbjxNPn0gQSBuZXcgY29uZGl0aW9uIGluc3RhbmNlIHdpdGggdGhlIGNvbmZpZ3VyZWQgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGQoKTogQ29uZGl0aW9uPE0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgIHRoaXMuYXR0cjEgYXMgc3RyaW5nIHwgQ29uZGl0aW9uPE0+LFxuICAgICAgICAgIHRoaXMub3BlcmF0b3IgYXMgT3BlcmF0b3IsXG4gICAgICAgICAgdGhpcy5jb21wYXJpc29uIGFzIGFueVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29uZGl0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb25kaXRpb24gYnVpbGRlclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgY29uZGl0aW9uIGJ1aWxkZXIgd2lsbCBvcGVyYXRlIG9uXG4gICAqIEByZXR1cm4ge0NvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT59IEEgbmV3IGNvbmRpdGlvbiBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGRlcjxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbmRpdGlvbkJ1aWxkZXJPcHRpb248TT4ge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uLkJ1aWxkZXI8TT4oKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBSZXBvc2l0b3J5RmxhZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ2FzY2FkZSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9yIHVwZGF0ZXMgYSBtb2RlbCBpbnN0YW5jZVxuICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNyZWF0ZSBhIG5ldyBtb2RlbCBvciB1cGRhdGUgYW4gZXhpc3Rpbmcgb25lIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHByaW1hcnkga2V5XG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNyZWF0ZSBvciB1cGRhdGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1JlcG88TSwgRiwgQ29udGV4dDxGPj59IFtyZXBvc2l0b3J5XSAtIE9wdGlvbmFsIHJlcG9zaXRvcnkgdG8gdXNlIGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBvciB1cGRhdGVkIG1vZGVsXG4gKiBAZnVuY3Rpb24gY3JlYXRlT3JVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICpcbiAqICAgQ2FsbGVyLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsLCBjb250ZXh0LCByZXBvc2l0b3J5P1xuICogICBhbHQgcmVwb3NpdG9yeSBub3QgcHJvdmlkZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+Pk1vZGVsOiBnZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSlcbiAqICAgICBNb2RlbC0tPj5jcmVhdGVPclVwZGF0ZTogY29uc3RydWN0b3JcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IGZvck1vZGVsKGNvbnN0cnVjdG9yKVxuICogICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHJlcG9zaXRvcnlcbiAqICAgZW5kXG4gKlxuICogICBhbHQgcHJpbWFyeSBrZXkgdW5kZWZpbmVkXG4gKiAgICAgY3JlYXRlT3JVcGRhdGUtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwsIGNvbnRleHQpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICBlbHNlIHByaW1hcnkga2V5IGRlZmluZWRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0+PlJlcG9zaXRvcnk6IHVwZGF0ZShtb2RlbCwgY29udGV4dClcbiAqICAgICBhbHQgdXBkYXRlIHN1Y2Nlc3NmdWxcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Y3JlYXRlT3JVcGRhdGU6IHVwZGF0ZWQgbW9kZWxcbiAqICAgICBlbHNlIE5vdEZvdW5kRXJyb3JcbiAqICAgICAgIGNyZWF0ZU9yVXBkYXRlLT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjb250ZXh0KVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5jcmVhdGVPclVwZGF0ZTogY3JlYXRlZCBtb2RlbFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGNyZWF0ZU9yVXBkYXRlLS0+PkNhbGxlcjogbW9kZWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4+KFxuICBtb2RlbDogTSxcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgYWxpYXM/OiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk/OiBSZXBvPE0sIEYsIENvbnRleHQ8Rj4+XG4pOiBQcm9taXNlPE0+IHtcbiAgaWYgKCFyZXBvc2l0b3J5KSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWw8TSwgUmVwbzxNPj4oXG4gICAgICBjb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIE1vZGVsQ29uc3RydWN0b3I8TT4sXG4gICAgICBhbGlhc1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2RlbFtyZXBvc2l0b3J5LnBrXSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXR1cm4gcmVwb3NpdG9yeS5jcmVhdGUobW9kZWwsIGNvbnRleHQpO1xuICBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcG9zaXRvcnkudXBkYXRlKG1vZGVsLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIHJldHVybiByZXBvc2l0b3J5LmNyZWF0ZShtb2RlbCwgY29udGV4dCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgY3JlYXRpb25cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gY3JlYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIGNyZWF0aW5nIGEgbmV3IG9uZVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPbkNyZWF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5Nb2RlbDogZ2V0KGRhdGEuY2xhc3MpXG4gKiAgICAgTW9kZWwtLT4+b25lVG9PbmVPbkNyZWF0ZTogY29uc3RydWN0b3JcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+UmVwb3NpdG9yeTogZm9yTW9kZWwoY29uc3RydWN0b3IpXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb09uZU9uQ3JlYXRlOiByZXBvXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PnJlcG86IGNyZWF0ZShwcm9wZXJ0eVZhbHVlKVxuICogICAgIHJlcG8tLT4+b25lVG9PbmVPbkNyZWF0ZTogY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5maW5kUHJpbWFyeUtleTogY3JlYXRlZFxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHBrXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgY3JlYXRlZFtwa10sIGNyZWF0ZWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogc2V0IG1vZGVsW2tleV0gPSBjcmVhdGVkW3BrXVxuICogICBlbmRcbiAqXG4gKiAgIG9uZVRvT25lT25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb09uZU9uQ3JlYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3BlcnR5VmFsdWU6IGFueSA9IG1vZGVsW2tleV07XG4gIGlmICghcHJvcGVydHlWYWx1ZSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGF0YS5jbGFzcyA9XG4gICAgdHlwZW9mIGRhdGEuY2xhc3MgPT09IFwic3RyaW5nXCIgPyBkYXRhLmNsYXNzIDogKGRhdGEuY2xhc3MgYXMgYW55KSgpLm5hbWU7XG5cbiAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZGF0YS5jbGFzcyBhcyBzdHJpbmcpO1xuICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBDb3VsZCBub3QgZmluZCBtb2RlbCAke2RhdGEuY2xhc3N9YCk7XG4gIGNvbnN0IHJlcG86IFJlcG88YW55PiA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShwcm9wZXJ0eVZhbHVlKTtcbiAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShjcmVhdGVkKS5pZDtcbiAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGNyZWF0ZWRbcGtdLCBjcmVhdGVkKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGNyZWF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHVwZGF0ZXNcbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIHdoZW4gdXBkYXRpbmcgYSBtb2RlbCwgZWl0aGVyIGJ5IHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIG1vZGVsIG9yIHVwZGF0aW5nIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPblVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjcmVhdGVPclVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBmaW5kUHJpbWFyeUtleVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvT25lT25VcGRhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IGNoZWNrIGlmIHByb3BlcnR5VmFsdWUgZXhpc3RzXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKlxuICogICBhbHQgcHJvcGVydHlWYWx1ZSBpcyBub3QgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9PbmVPblVwZGF0ZTogaW5uZXJSZXBvXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmlubmVyUmVwbzogcmVhZChwcm9wZXJ0eVZhbHVlKVxuICogICAgIGlubmVyUmVwby0tPj5vbmVUb09uZU9uVXBkYXRlOiByZWFkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHByb3BlcnR5VmFsdWVcbiAqICAgZWxzZSBwcm9wZXJ0eVZhbHVlIGlzIGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jcmVhdGVPclVwZGF0ZTogbW9kZWxba2V5XSwgY29udGV4dFxuICogICAgIGNyZWF0ZU9yVXBkYXRlLS0+Pm9uZVRvT25lT25VcGRhdGU6IHVwZGF0ZWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+ZmluZFByaW1hcnlLZXk6IHVwZGF0ZWRcbiAqICAgICBmaW5kUHJpbWFyeUtleS0tPj5vbmVUb09uZU9uVXBkYXRlOiBwa1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHVwZGF0ZWRbcGtdLCB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+Pm9uZVRvT25lT25VcGRhdGU6IHNldCBtb2RlbFtrZXldID0gdXBkYXRlZFtwa11cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uVXBkYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb25lVG9PbmVPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBhbnkgPSBtb2RlbFtrZXldO1xuICBpZiAoIXByb3BlcnR5VmFsdWUpIHJldHVybjtcbiAgaWYgKGRhdGEuY2FzY2FkZS51cGRhdGUgIT09IENhc2NhZGUuQ0FTQ0FERSkgcmV0dXJuO1xuXG4gIGlmICh0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGlubmVyUmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKFxuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBpbm5lclJlcG8ucmVhZChwcm9wZXJ0eVZhbHVlKTtcbiAgICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoY29udGV4dCwgbW9kZWwsIGtleSwgcHJvcGVydHlWYWx1ZSwgcmVhZCk7XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IHByb3BlcnR5VmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKFxuICAgIG1vZGVsW2tleV0gYXMgTSxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KHVwZGF0ZWQpLmlkO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdXBkYXRlZFtwa10gYXMgc3RyaW5nLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIHRoZSByZWxhdGVkIG1vZGVsIGlmIGNhc2NhZGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25EZWxldGU6IGlubmVyUmVwb1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldW2lubmVyUmVwby5wa10sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBkZWxldGVkW2lubmVyUmVwby5wa10sIGRlbGV0ZWRcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgaW5uZXJSZXBvOiBSZXBvPE0+ID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZyk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW2lubmVyUmVwby5wayBhcyBrZXlvZiBNXSBhcyBzdHJpbmdcbiAgICApO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgZGVsZXRlZFtpbm5lclJlcG8ucGtdIGFzIHN0cmluZyxcbiAgICBkZWxldGVkXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgbW9kZWxzIG9yIGNyZWF0aW5nIG5ldyBvbmVzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgYWx0IGFycmF5VHlwZSBpcyBub3QgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVwb1xuICogICAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG86IHJlYWQoaWQpXG4gKiAgICAgICByZXBvLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIGVsc2UgYXJyYXlUeXBlIGlzIFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBwcm9wZXJ0eVZhbHVlc1swXVxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBwa05hbWVcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgcmVzdWx0IHNldFxuICogICAgIGxvb3AgZm9yIGVhY2ggbSBpbiBwcm9wZXJ0eVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jcmVhdGVPclVwZGF0ZTogbSwgY29udGV4dFxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFkZCByZWNvcmRbcGtOYW1lXSB0byByZXN1bHRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi5yZXN1bHRdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcyB8fCAhcHJvcGVydHlWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1swXTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IGZpbmRQcmltYXJ5S2V5KHByb3BlcnR5VmFsdWVzWzBdKS5pZDtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmQpO1xuICAgIHJlc3VsdC5hZGQocmVjb3JkW3BrTmFtZV0pO1xuICB9XG5cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi5yZXN1bHRdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiB1cGRhdGluZyBhIG1vZGVsLCBkZWxlZ2F0aW5nIHRvIG9uZVRvTWFueU9uQ3JlYXRlIGlmIGNhc2NhZGUgdXBkYXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25VcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25DcmVhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uVXBkYXRlLT4+b25lVG9NYW55T25VcGRhdGU6IGNoZWNrIGlmIGNhc2NhZGUudXBkYXRlIGlzIENBU0NBREVcbiAqXG4gKiAgIGFsdCBjYXNjYWRlLnVwZGF0ZSBpcyBDQVNDQURFXG4gKiAgICAgb25lVG9NYW55T25VcGRhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogYXBwbHkodGhpcywgW2NvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxdKVxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLS0+Pm9uZVRvTWFueU9uVXBkYXRlOiB2b2lkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25VcGRhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPblVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNhc2NhZGUgfSA9IGRhdGE7XG4gIGlmIChjYXNjYWRlLnVwZGF0ZSAhPT0gQ2FzY2FkZS5DQVNDQURFKSByZXR1cm47XG4gIHJldHVybiBvbmVUb01hbnlPbkNyZWF0ZS5hcHBseSh0aGlzIGFzIGFueSwgW1xuICAgIGNvbnRleHQsXG4gICAgZGF0YSxcbiAgICBrZXkgYXMga2V5b2YgTW9kZWwsXG4gICAgbW9kZWwsXG4gIF0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgYWxsIHJlbGF0ZWQgbW9kZWxzIGlmIGNhc2NhZGUgZGVsZXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUuZGVsZXRlIGlzIENBU0NBREVcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgdmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqXG4gKiAgIGFsdCBpc0luc3RhbnRpYXRlZCAoYXJyYXlUeXBlIGlzIFwib2JqZWN0XCIpXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbCh2YWx1ZXNbMF0pXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbHNlIG5vdCBpbnN0YW50aWF0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG86IGRlbGV0ZShpZCwgY29udGV4dClcbiAqICAgICByZXBvLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdLCB0aGlzLmFkYXB0ZXIuYWxpYXMpXG4gICAgOiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuXG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoW1xuICAgIC4uLihpc0luc3RhbnRpYXRlZFxuICAgICAgPyB2YWx1ZXMubWFwKCh2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2W3JlcG8ucGsgYXMgc3RyaW5nXSlcbiAgICAgIDogdmFsdWVzKSxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMudmFsdWVzKCkpIHtcbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgcmVwby5kZWxldGUoaWQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBpZCwgZGVsZXRlZCk7XG4gIH1cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBrZXkgZm9yIGNhY2hpbmcgcG9wdWxhdGVkIG1vZGVsIHJlbGF0aW9uc2hpcHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSB1bmlxdWUga2V5IGZvciBzdG9yaW5nIGFuZCByZXRyaWV2aW5nIHBvcHVsYXRlZCBtb2RlbCByZWxhdGlvbnNoaXBzIGluIHRoZSBjYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWxhdGVkIG1vZGVsXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3B1bGF0ZUtleShcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4pIHtcbiAgcmV0dXJuIFtQZXJzaXN0ZW5jZUtleXMuUE9QVUxBVEUsIHRhYmxlTmFtZSwgZmllbGROYW1lLCBpZF0uam9pbihcIi5cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhY2hlcyBhIG1vZGVsIGZvciBsYXRlciBwb3B1bGF0aW9uXG4gKiBAc3VtbWFyeSBTdG9yZXMgYSBtb2RlbCBpbiB0aGUgY29udGV4dCBjYWNoZSBmb3IgZWZmaWNpZW50IHJldHJpZXZhbCBkdXJpbmcgcmVsYXRpb25zaGlwIHBvcHVsYXRpb25cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmVudE1vZGVsIC0gVGhlIHBhcmVudCBtb2RlbCB0aGF0IGNvbnRhaW5zIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHBrVmFsdWUgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7YW55fSBjYWNoZVZhbHVlIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNhY2hlXG4gKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgY2FjaGUgb3BlcmF0aW9uXG4gKiBAZnVuY3Rpb24gY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlTW9kZWxGb3JQb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuPihcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgcGFyZW50TW9kZWw6IE0sXG4gIHByb3BlcnR5S2V5OiBrZXlvZiBNIHwgc3RyaW5nLFxuICBwa1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGNhY2hlVmFsdWU6IGFueVxuKSB7XG4gIGNvbnN0IGNhY2hlS2V5ID0gZ2V0UG9wdWxhdGVLZXkoXG4gICAgcGFyZW50TW9kZWwuY29uc3RydWN0b3IubmFtZSxcbiAgICBwcm9wZXJ0eUtleSBhcyBzdHJpbmcsXG4gICAgcGtWYWx1ZVxuICApO1xuICByZXR1cm4gY29udGV4dC5hY2N1bXVsYXRlKHsgW2NhY2hlS2V5XTogY2FjaGVWYWx1ZSB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUG9wdWxhdGVzIGEgbW9kZWwncyByZWxhdGlvbnNoaXBcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbmQgYXR0YWNoZXMgcmVsYXRlZCBtb2RlbHMgdG8gYSBtb2RlbCdzIHJlbGF0aW9uc2hpcCBwcm9wZXJ0eVxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBwb3B1bGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwb3B1bGF0ZVxuICogICBwYXJ0aWNpcGFudCBmZXRjaFBvcHVsYXRlVmFsdWVzXG4gKiAgIHBhcnRpY2lwYW50IGdldFBvcHVsYXRlS2V5XG4gKiAgIHBhcnRpY2lwYW50IENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqXG4gKiAgIENhbGxlci0+PnBvcHVsYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IGNoZWNrIGlmIGRhdGEucG9wdWxhdGUgaXMgdHJ1ZVxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBnZXQgbmVzdGVkIHZhbHVlIGFuZCBjaGVjayBpZiBpdCBleGlzdHNcbiAqXG4gKiAgIHBvcHVsYXRlLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogY29udGV4dCwgbW9kZWwsIGtleSwgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXVxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGluaXRpYWxpemUgdmFyaWFibGVzXG4gKlxuICogICBsb29wIGZvciBlYWNoIHByb0tleVZhbHVlIGluIHByb3BLZXlWYWx1ZXNcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Z2V0UG9wdWxhdGVLZXk6IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUsIHByb3BOYW1lLCBwcm9LZXlWYWx1ZVxuICogICAgIGdldFBvcHVsYXRlS2V5LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNhY2hlS2V5XG4gKlxuICogICAgIGFsdCB0cnkgdG8gZ2V0IGZyb20gY2FjaGVcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5Db250ZXh0OiBnZXQoY2FjaGVLZXkpXG4gKiAgICAgICBDb250ZXh0LS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVsc2UgY2F0Y2ggZXJyb3JcbiAqICAgICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIHByb3BOYW1lXG4gKiAgICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiByZXBvXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwbzogcmVhZChwcm9LZXlWYWx1ZSlcbiAqICAgICAgIHJlcG8tLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogdmFsXG4gKiAgICAgZW5kXG4gKlxuICogICAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBhZGQgdmFsIHRvIHJlc3VsdHNcbiAqICAgZW5kXG4gKlxuICogICBmZXRjaFBvcHVsYXRlVmFsdWVzLS0+PnBvcHVsYXRlOiByZXN1bHRzXG4gKiAgIHBvcHVsYXRlLT4+cG9wdWxhdGU6IHNldCBtb2RlbFtrZXldID0gaXNBcnIgPyByZXMgOiByZXNbMF1cbiAqICAgcG9wdWxhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3B1bGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEucG9wdWxhdGUpIHJldHVybjtcbiAgY29uc3QgbmVzdGVkOiBhbnkgPSBtb2RlbFtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0PEY+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W10sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkgYXMgYW55KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwgcHJvcE5hbWUsIGFsaWFzKTtcbiAgICAgICAgaWYgKCFyZXBvKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHJlcG9cIik7XG4gICAgICAgIHZhbCA9IGF3YWl0IHJlcG8ucmVhZChwcm9LZXlWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSBhcyBzdHJpbmcsXG4gICAgaXNBcnIgPyBuZXN0ZWQgOiBbbmVzdGVkXSxcbiAgICB0aGlzLmFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGNvbW1vbiBKYXZhU2NyaXB0IHR5cGVzXG4gKiBAc3VtbWFyeSBBbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBjb21tb24gSmF2YVNjcmlwdCB0eXBlcyB0aGF0IGFyZSBub3QgY3VzdG9tIG1vZGVsIHR5cGVzXG4gKiBAY29uc3QgY29tbW9tVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5jb25zdCBjb21tb21UeXBlcyA9IFtcbiAgXCJhcnJheVwiLFxuICBcInN0cmluZ1wiLFxuICBcIm51bWJlclwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcIm9iamVjdFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJiaWdpbnRcIixcbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWwgcHJvcGVydHkgYmFzZWQgb24gaXRzIHR5cGUgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEV4YW1pbmVzIGEgbW9kZWwgcHJvcGVydHkncyB0eXBlIG1ldGFkYXRhIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgcmVwb3NpdG9yeSBmb3IgcmVsYXRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgY29udGFpbmluZyB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZXhhbWluZVxuICogQHJldHVybiB7UmVwbzxNPn0gQSByZXBvc2l0b3J5IGZvciB0aGUgbW9kZWwgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgUmVmbGVjdFxuICogICBwYXJ0aWNpcGFudCBWYWxpZGF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqXG4gKiAgIENhbGxlci0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwgcHJvcGVydHlLZXlcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+VmFsaWRhdGlvbjoga2V5KEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHlLZXldKSA/IFZhbGlkYXRpb25LZXlzLkxJU1QgOiBWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICogICBWYWxpZGF0aW9uLS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiB2YWxpZGF0aW9uS2V5XG4gKlxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PlJlZmxlY3Q6IGdldE1ldGFkYXRhKHZhbGlkYXRpb25LZXksIG1vZGVsLCBwcm9wZXJ0eUtleSlcbiAqICAgUmVmbGVjdC0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogdHlwZXNcbiAqXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGRldGVybWluZSBjdXN0b21UeXBlcyBiYXNlZCBvbiBwcm9wZXJ0eSB0eXBlXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIHR5cGVzIGFuZCBjdXN0b21UeXBlcyBleGlzdFxuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY3JlYXRlIGFsbG93ZWRUeXBlcyBhcnJheVxuICogICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBmaW5kIGNvbnN0cnVjdG9yTmFtZSBub3QgaW4gY29tbW9tVHlwZXNcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogY2hlY2sgaWYgY29uc3RydWN0b3JOYW1lIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5Nb2RlbDogZ2V0KGNvbnN0cnVjdG9yTmFtZSlcbiAqICAgTW9kZWwtLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNvbnN0cnVjdG9yXG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IGNoZWNrIGlmIGNvbnN0cnVjdG9yIGV4aXN0c1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgUmVwb3NpdG9yeS0tPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogcmVwb1xuICpcbiAqICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+Q2FsbGVyOiByZXBvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogYW55LFxuICBwcm9wZXJ0eUtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgYWxpYXM/OiBzdHJpbmdcbik6IFJlcG88TT4ge1xuICBjb25zdCB0eXBlcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgVmFsaWRhdGlvbi5rZXkoXG4gICAgICBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICAgICAgPyBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRVxuICAgICksXG4gICAgbW9kZWwsXG4gICAgcHJvcGVydHlLZXkgYXMgc3RyaW5nXG4gICk7XG4gIGNvbnN0IGN1c3RvbVR5cGVzOiBhbnkgPSBBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5S2V5XSlcbiAgICA/IHR5cGVzLmNsYXp6XG4gICAgOiB0eXBlcy5jdXN0b21UeXBlcztcbiAgaWYgKCF0eXBlcyB8fCAhY3VzdG9tVHlwZXMpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZpbmQgdHlwZXMgZGVjb3JhdG9ycyBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eUtleSBhcyBzdHJpbmd9YFxuICAgICk7XG5cbiAgY29uc3QgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IChcbiAgICBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKSA/IFsuLi5jdXN0b21UeXBlc10gOiBbY3VzdG9tVHlwZXNdXG4gICkubWFwKCh0KSA9PiAodHlwZW9mIHQgPT09IFwiZnVuY3Rpb25cIiA/IHQoKSA6IHQpKTtcbiAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gYWxsb3dlZFR5cGVzLmZpbmQoXG4gICAgKHQpID0+ICFjb21tb21UeXBlcy5pbmNsdWRlcyhgJHt0fWAudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgaWYgKCFjb25zdHJ1Y3Rvck5hbWUpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgUHJvcGVydHkga2V5ICR7cHJvcGVydHlLZXkgYXMgc3RyaW5nfSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29uc3RydWN0b3IgdHlwZWBcbiAgICApO1xuICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8TT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoY29uc3RydWN0b3JOYW1lKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtjb25zdHJ1Y3Rvck5hbWV9YCk7XG5cbiAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoY29uc3RydWN0b3IsIGFsaWFzKTtcbn1cbiIsImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgb25EZWxldGUsXG4gIG9uVXBkYXRlLFxuICBhZnRlckFueSxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0LFxuICB0aW1lc3RhbXAsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHtcbiAgSm9pbkNvbHVtbk9wdGlvbnMsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWxcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IHNldHMgdGhlIHRhYmxlIG5hbWUgZm9yIGEgbW9kZWwgY2xhc3MgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0cyAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3NcbiAqIEBmdW5jdGlvbiB0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhYmxlPE9QVFMgPSBzdHJpbmc+KG9wdHM6IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWV0YWRhdGEsXG4gICAgICBhcmdzOiBba2V5LCBvcHRzXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lIGZvciBhIG1vZGVsIHByb3BlcnR5XG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBjb2x1bW4gbmFtZSBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpbiB0aGUgZGF0YWJhc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBjb2x1bW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW48T1BUUyA9IHN0cmluZz4oY29sdW1uTmFtZT86IE9QVFMpIHtcbiAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTik7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbihrLCBjKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBjb2x1bW4ob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGEoaywgYyB8fCBhdHRyKShvYmosIGF0dHIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtrZXksIGNvbHVtbk5hbWVdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5kZXggb24gYSBtb2RlbCBwcm9wZXJ0eSBmb3IgaW1wcm92ZWQgcXVlcnkgcGVyZm9ybWFuY2VcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IG1hcmtzIGEgcHJvcGVydHkgdG8gYmUgaW5kZXhlZCBpbiB0aGUgZGF0YWJhc2UsIG9wdGlvbmFsbHkgd2l0aCBzcGVjaWZpYyBkaXJlY3Rpb25zIGFuZCBjb21wb3NpdGlvbnNcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb25bXX0gW2RpcmVjdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2Ygc29ydCBkaXJlY3Rpb25zIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgdG8gY3JlYXRlIGEgY29tcG9zaXRlIGluZGV4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KG5hbWU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW11cbik6IFJldHVyblR5cGU8dHlwZW9mIHByb3BNZXRhZGF0YT47XG5leHBvcnQgZnVuY3Rpb24gaW5kZXgoXG4gIGRpcmVjdGlvbnM6IE9yZGVyRGlyZWN0aW9uW10sXG4gIG5hbWU6IHN0cmluZ1xuKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChjb21wb3NpdGlvbnM6IHN0cmluZ1tdKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJvcE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmRleChcbiAgY29tcG9zaXRpb25zOiBzdHJpbmdbXSxcbiAgbmFtZTogc3RyaW5nXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBwcm9wTWV0YWRhdGE+O1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KFxuICBkaXJlY3Rpb25zPzogT3JkZXJEaXJlY3Rpb25bXSB8IHN0cmluZ1tdIHwgc3RyaW5nLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgbmFtZT86IHN0cmluZ1xuKSB7XG4gIGZ1bmN0aW9uIGluZGV4KFxuICAgIGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdIHwgc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgY29tcG9zaXRpb25zPzogc3RyaW5nW10gfCBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZ1xuICApIHtcbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBkaXJlY3Rpb25zO1xuICAgICAgZGlyZWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXBvc2l0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb21wb3NpdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBjb21wb3NpdGlvbnM7XG4gICAgICBjb21wb3NpdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghY29tcG9zaXRpb25zICYmIGRpcmVjdGlvbnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZGlyZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChkKSA9PiAhW09yZGVyRGlyZWN0aW9uLkFTQywgT3JkZXJEaXJlY3Rpb24uRFNDXS5pbmNsdWRlcyhkIGFzIGFueSlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGNvbXBvc2l0aW9ucyA9IGRpcmVjdGlvbnMgYXMgc3RyaW5nW107XG4gICAgICAgIGRpcmVjdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgICBgJHtQZXJzaXN0ZW5jZUtleXMuSU5ERVh9JHtjb21wb3NpdGlvbnMgJiYgY29tcG9zaXRpb25zLmxlbmd0aCA/IGAuJHtjb21wb3NpdGlvbnMuam9pbihcIi5cIil9YCA6IFwiXCJ9YFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgZGlyZWN0aW9uczogZGlyZWN0aW9ucyxcbiAgICAgICAgY29tcG9zaXRpb25zOiBjb21wb3NpdGlvbnMsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5JTkRFWClcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogaW5kZXgsXG4gICAgICBhcmdzOiBbZGlyZWN0aW9ucywgY29tcG9zaXRpb25zLCBuYW1lXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbmZvcmNlcyB1bmlxdWVuZXNzIGNvbnN0cmFpbnQgZHVyaW5nIG1vZGVsIGNyZWF0aW9uIGFuZCB1cGRhdGVcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIHVuaXF1ZSBkZWNvcmF0b3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSB2YWx1ZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2VcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIG1ldGFkYXRhIHR5cGVcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBjaGVjayBmb3IgdW5pcXVlbmVzc1xuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlIG9yIHJlamVjdHMgd2l0aCBhIENvbmZsaWN0RXJyb3JcbiAqIEBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmlxdWVPbkNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIG9iamVjdCxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEobW9kZWwgYXMgYW55KVtrZXldKSByZXR1cm47XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zZWxlY3QoKVxuICAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlKGtleSkuZXEobW9kZWxba2V5XSkpXG4gICAgLmV4ZWN1dGUoKTtcbiAgaWYgKGV4aXN0aW5nLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgIGBtb2RlbCBhbHJlYWR5IGV4aXN0cyB3aXRoIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gZXF1YWwgdG8gJHtKU09OLnN0cmluZ2lmeSgobW9kZWwgYXMgYW55KVtrZXldLCB1bmRlZmluZWQsIDIpfWBcbiAgICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUYWdzIGEgcHJvcGVydHkgYXMgdW5pcXVlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlbnN1cmVzIGEgcHJvcGVydHkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGEgbW9kZWwgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdW5pcXVlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAdW5pcXVlKClcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoW09wZXJhdGlvbktleXMuQ1JFQVRFXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVkQXQoKSB7XG4gIHJldHVybiB0aW1lc3RhbXAoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAb25lVG9PbmUoUHJvZmlsZSlcbiAqICAgcHJvZmlsZSE6IHN0cmluZyB8IFByb2ZpbGU7XG4gKiB9XG4gKlxuICogY2xhc3MgUHJvZmlsZSBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIGJpbyE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZSxcbiAgam9pbkNvbHVtbk9wdHM/OiBKb2luQ29sdW1uT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gIC8vIE1vZGVsLnJlZ2lzdGVyKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBmdW5jdGlvbiBvbmVUb09uZURlYyhcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICBwb3B1bGF0ZTogYm9vbGVhbixcbiAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgIH07XG4gICAgaWYgKGpvaW5Db2x1bW5PcHRzKSBtZXRhLmpvaW5UYWJsZSA9IGpvaW5Db2x1bW5PcHRzO1xuICAgIGlmIChmaykgbWV0YS5uYW1lID0gZms7XG4gICAgcmV0dXJuIGFwcGx5KFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIHR5cGUoW1xuICAgICAgICBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgXSksXG4gICAgICBvbkNyZWF0ZShvbmVUb09uZU9uQ3JlYXRlLCBtZXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvT25lT25VcGRhdGUsIG1ldGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YSksXG4gICAgICBhZnRlckFueShwb3AsIG1ldGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pbkNvbHVtbk9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKlxuICogICBAb25lVG9NYW55KEJvb2spXG4gKiAgIGJvb2tzITogc3RyaW5nW10gfCBCb29rW107XG4gKiB9XG4gKlxuICogY2xhc3MgQm9vayBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHRpdGxlITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKiBAc2VlIG9uZVRvT25lXG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBvbmVUb01hbnlEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICBsaXN0KFtcbiAgICAgICAgY2xhenogYXMgQ29uc3RydWN0b3I8TT4sXG4gICAgICAgIFN0cmluZyxcbiAgICAgICAgTnVtYmVyLFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEJpZ2ludCBpcyBub3QgYSBjb25zdHJ1Y3RvclxuICAgICAgICBCaWdJbnQsXG4gICAgICBdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIGFyZ3M6IFtjbGF6eiwgY2FzY2FkZU9wdGlvbnMsIHBvcHVsYXRlLCBqb2luVGFibGVPcHRzLCBma10sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgY2FzY2FkZU9wdGlvbnM6IENhc2NhZGVNZXRhZGF0YSA9IERlZmF1bHRDYXNjYWRlLFxuICBwb3B1bGF0ZSA9IHRydWUsXG4gIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgZms/OiBzdHJpbmdcbikge1xuICAvLyBNb2RlbC5yZWdpc3RlcihjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPik7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKTtcblxuICBmdW5jdGlvbiBtYW55VG9PbmVEZWMoXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+IHwgKCgpID0+IENvbnN0cnVjdG9yPE0+KSxcbiAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgam9pblRhYmxlT3B0cz86IEpvaW5UYWJsZU9wdGlvbnMgfCBKb2luVGFibGVNdWx0aXBsZUNvbHVtbnNPcHRpb25zLFxuICAgIGZrPzogc3RyaW5nXG4gICkge1xuICAgIGlmICghY2xhenoubmFtZSlcbiAgICAgIGNsYXp6ID0gKGNsYXp6IGFzICgpID0+IENvbnN0cnVjdG9yPE0+KSgpIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IChjbGF6eiBhcyBhbnkpLFxuICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICB9O1xuICAgIGlmIChqb2luVGFibGVPcHRzKSBtZXRhZGF0YS5qb2luVGFibGUgPSBqb2luVGFibGVPcHRzO1xuICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgIHJldHVybiBhcHBseShcbiAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICB0eXBlKFtcbiAgICAgICAgY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgICAgU3RyaW5nLm5hbWUsXG4gICAgICAgIE51bWJlci5uYW1lLFxuICAgICAgICBCaWdJbnQubmFtZSxcbiAgICAgIF0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogbWFueVRvT25lRGVjLFxuICAgICAgYXJnczogW2NsYXp6LCBjYXNjYWRlT3B0aW9ucywgcG9wdWxhdGUsIGpvaW5UYWJsZU9wdHMsIGZrXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBtYW55LXRvLW9uZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIGN1cnJlbnQgbW9kZWwgYW5kIGFub3RoZXIgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIHJlbGF0ZWQgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzXG4gKiBAcGFyYW0ge0Nhc2NhZGVNZXRhZGF0YX0gW2Nhc2NhZGVPcHRpb25zPURlZmF1bHRDYXNjYWRlXSAtIE9wdGlvbnMgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtib29sZWFufSBbcG9wdWxhdGU9dHJ1ZV0gLSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyB0aGUgcmVsYXRpb25zaGlwIHdoZW4gdGhlIG1vZGVsIGlzIHJldHJpZXZlZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIG1hbnlUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKlxuICogICBAbWFueVRvT25lKEF1dGhvcilcbiAqICAgYXV0aG9yITogc3RyaW5nIHwgQXV0aG9yO1xuICogfVxuICpcbiAqIGNsYXNzIEF1dGhvciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIG5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG9uZVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW55VG9NYW55PE0gZXh0ZW5kcyBNb2RlbD4oXG4gIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlLFxuICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIGZrPzogc3RyaW5nXG4pIHtcbiAgLy8gTW9kZWwucmVnaXN0ZXIoY2xhenogYXMgQ29uc3RydWN0b3I8TT4pO1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcblxuICBmdW5jdGlvbiBtYW55VG9NYW55RGVjKFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPiB8ICgoKSA9PiBDb25zdHJ1Y3RvcjxNPiksXG4gICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgIHBvcHVsYXRlOiBib29sZWFuLFxuICAgIGpvaW5UYWJsZU9wdHM/OiBKb2luVGFibGVPcHRpb25zIHwgSm9pblRhYmxlTXVsdGlwbGVDb2x1bW5zT3B0aW9ucyxcbiAgICBmaz86IHN0cmluZ1xuICApIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiAoY2xhenogYXMgYW55KSxcbiAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgfTtcbiAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICBpZiAoZmspIG1ldGFkYXRhLm5hbWUgPSBmaztcbiAgICByZXR1cm4gYXBwbHkoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgbGlzdChbXG4gICAgICAgIGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogKGNsYXp6IGFzIGFueSksXG4gICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICBdKSxcbiAgICAgIC8vIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIGFmdGVyQWxsKHBvcHVsYXRlLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApO1xuICB9XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG1hbnlUb01hbnlEZWMsXG4gICAgICBhcmdzOiBbY2xhenosIGNhc2NhZGVPcHRpb25zLCBwb3B1bGF0ZSwgam9pblRhYmxlT3B0cywgZmtdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCJpbXBvcnQge1xuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdFNlcXVlbmNlT3B0aW9ucyxcbiAgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7XG4gIERCS2V5cyxcbiAgR3JvdXBTb3J0LFxuICBJbnRlcm5hbEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgcmVhZG9ubHksXG4gIFJlcG9zaXRvcnlGbGFncyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgaW5kZXggfSBmcm9tIFwiLi4vbW9kZWwvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2VxdWVuY2VOYW1lRm9yTW9kZWwgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvU2VxdWVuY2VcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IGFwcGx5IH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5cbmNvbnN0IGRlZmF1bHRQa1ByaW9yaXR5ID0gNjA7IC8vIERlZmF1bHQgcHJpb3JpdHkgZm9yIHByaW1hcnkga2V5IHRvIHJ1biBsYXR0ZXIgdGhhbiBvdGhlciBwcm9wZXJ0aWVzXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmltYXJ5IGtleSBjcmVhdGlvblxuICogQHN1bW1hcnkgSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcHJpbWFyeSBrZXkgdmFsdWVzIGZvciBtb2RlbHMgdXNpbmcgc2VxdWVuY2VzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSB0aGF0IGV4dGVuZHMgU2VxdWVuY2VPcHRpb25zXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgdGhhdCBleHRlbmRzIFJlcG9zaXRvcnlGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIHRoYXQgZXh0ZW5kcyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgZXhlY3V0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSBzZXF1ZW5jZSBvcHRpb25zXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBzZXQgYXMgcHJpbWFyeSBrZXlcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHByaW1hcnkga2V5IGlzIHNldFxuICogQGZ1bmN0aW9uIHBrT25DcmVhdGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHBrT25DcmVhdGVcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTZXF1ZW5jZVxuICpcbiAqICAgTW9kZWwtPj5wa09uQ3JlYXRlOiBDYWxsIHdpdGggbW9kZWwgaW5zdGFuY2VcbiAqICAgTm90ZSBvdmVyIHBrT25DcmVhdGU6IENoZWNrIGlmIGtleSBhbHJlYWR5IGV4aXN0c1xuICogICBhbHQgS2V5IGV4aXN0cyBvciBubyB0eXBlIHNwZWNpZmllZFxuICogICAgIHBrT25DcmVhdGUtLT4+TW9kZWw6IFJldHVybiBlYXJseVxuICogICBlbHNlIEtleSBuZWVkcyB0byBiZSBjcmVhdGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PnBrT25DcmVhdGU6IEdlbmVyYXRlIHNlcXVlbmNlIG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gKiAgICAgcGtPbkNyZWF0ZS0+PkFkYXB0ZXI6IFJlcXVlc3QgU2VxdWVuY2UoZGF0YSlcbiAqICAgICBBZGFwdGVyLT4+U2VxdWVuY2U6IENyZWF0ZSBzZXF1ZW5jZVxuICogICAgIFNlcXVlbmNlLS0+PnBrT25DcmVhdGU6IFJldHVybiBzZXF1ZW5jZVxuICogICAgIHBrT25DcmVhdGUtPj5TZXF1ZW5jZTogQ2FsbCBuZXh0KClcbiAqICAgICBTZXF1ZW5jZS0tPj5wa09uQ3JlYXRlOiBSZXR1cm4gbmV4dCB2YWx1ZVxuICogICAgIHBrT25DcmVhdGUtPj5Nb2RlbDogU2V0IHByaW1hcnkga2V5IHZhbHVlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGtPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFNlcXVlbmNlT3B0aW9ucyxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgIWRhdGEuZ2VuZXJhdGVkIHx8IG1vZGVsW2tleV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXRQcmltYXJ5S2V5VmFsdWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YXJnZXQ6IE0sXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4gICkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBzZXF1ZW5jZU5hbWVGb3JNb2RlbChtb2RlbCwgXCJwa1wiKTtcbiAgbGV0IHNlcXVlbmNlOiBTZXF1ZW5jZTtcbiAgdHJ5IHtcbiAgICBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShkYXRhKTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoKTtcbiAgc2V0UHJpbWFyeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbWFyeSBLZXkgRGVjb3JhdG9yXG4gKiBAc3VtbWFyeSBNYXJrcyBhIHByb3BlcnR5IGFzIHRoZSBtb2RlbCdzIHByaW1hcnkga2V5IHdpdGggYXV0b21hdGljIHNlcXVlbmNlIGdlbmVyYXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGNvbWJpbmVzIG11bHRpcGxlIGJlaGF2aW9yczogaXQgbWFya3MgdGhlIHByb3BlcnR5IGFzIHVuaXF1ZSwgcmVxdWlyZWQsXG4gKiBhbmQgZW5zdXJlcyB0aGUgaW5kZXggaXMgY3JlYXRlZCBwcm9wZXJseSBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIHNlcXVlbmNlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09taXQ8U2VxdWVuY2VPcHRpb25zLCBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiPn0gb3B0cyAtIE9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZSBnZW5lcmF0aW9uXG4gKiBAcmV0dXJuIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBtb2RlbCBwcm9wZXJ0aWVzXG4gKiBAZnVuY3Rpb24gcGtcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBwaygpXG4gKiAgIGlkITogc3RyaW5nO1xuICpcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBrKFxuICBvcHRzOiBPbWl0PFxuICAgIFNlcXVlbmNlT3B0aW9ucyxcbiAgICBcImN5Y2xlXCIgfCBcInN0YXJ0V2l0aFwiIHwgXCJpbmNyZW1lbnRCeVwiXG4gID4gPSBEZWZhdWx0U2VxdWVuY2VPcHRpb25zXG4pIHtcbiAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMsIG9wdHMsIHtcbiAgICBnZW5lcmF0ZWQ6XG4gICAgICBvcHRzLnR5cGUgJiYgdHlwZW9mIG9wdHMuZ2VuZXJhdGVkID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IG9wdHMuZ2VuZXJhdGVkIHx8IERlZmF1bHRTZXF1ZW5jZU9wdGlvbnMuZ2VuZXJhdGVkLFxuICB9KSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG5cbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLklEKTtcbiAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zLCBncm91cHNvcnQ/OiBHcm91cFNvcnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob2JqOiBhbnksIGF0dHI6IGFueSkge1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBpbmRleChbT3JkZXJEaXJlY3Rpb24uQVNDLCBPcmRlckRpcmVjdGlvbi5EU0NdKSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGtleSwgb3B0aW9ucyksXG4gICAgICAgIG9uQ3JlYXRlKHBrT25DcmVhdGUsIG9wdGlvbnMsIGdyb3Vwc29ydCksXG4gICAgICAgIHByb3BNZXRhZGF0YShEQktleXMuSUQsIGF0dHIpXG4gICAgICApKG9iaiwgYXR0cik7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiBwa0RlYyxcbiAgICAgIGFyZ3M6IFtvcHRzLCB7IHByaW9yaXR5OiBkZWZhdWx0UGtQcmlvcml0eSB9XSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuIiwiaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgY3JlYXRlZEF0LCB1cGRhdGVkQXQgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEJhc2UgbW9kZWwgY2xhc3MgZm9yIGFsbCBkb21haW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgY2xhc3MgZnJvbSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBhbmQgYWRkcyB0aW1lc3RhbXAgZnVuY3Rpb25hbGl0eS5cbiAqIEFsbCBkb21haW4gbW9kZWxzIGluIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gaW5oZXJpdCBjb21tb24gcHJvcGVydGllcyBhbmQgYmVoYXZpb3JzLlxuICogQHBhcmFtIHtNb2RlbEFyZzxCYXNlTW9kZWw+fSBhcmcgLSBPcHRpb25hbCBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgbW9kZWxcbiAqIEBjbGFzcyBCYXNlTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdXNlcm5hbWUhOiBzdHJpbmc7XG4gKiAgIFxuICogICBAZW1haWwoKVxuICogICBlbWFpbCE6IHN0cmluZztcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKGRhdGE/OiBNb2RlbEFyZzxVc2VyPikge1xuICogICAgIHN1cGVyKGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IHVzZXJuYW1lOiAnam9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBtb2RlbFxuICAgKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWRcbiAgICovXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkT24hOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGFzdCB1cGRhdGUgdGltZXN0YW1wIGZvciB0aGUgbW9kZWxcbiAgICogQHN1bW1hcnkgQXV0b21hdGljYWxseSB1cGRhdGVkIHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIG1vZGlmaWVkXG4gICAqL1xuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZE9uITogRGF0ZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYXJnPzogTW9kZWxBcmc8QmFzZU1vZGVsPikge1xuICAgIHN1cGVyKGFyZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhZ2luZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcGFnaW5hdGlvbiBmb3IgZGF0YWJhc2UgcXVlcmllc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbmF2aWdhdGluZyB0aHJvdWdoIHBhZ2luYXRlZCBxdWVyeSByZXN1bHRzXG4gKlxuICogVGhpcyBhYnN0cmFjdCBjbGFzcyBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgbmF2aWdhdGlvbiBvZiBwYWdpbmF0ZWQgZGF0YWJhc2UgcXVlcnkgcmVzdWx0cy5cbiAqIEl0IHRyYWNrcyB0aGUgY3VycmVudCBwYWdlLCB0b3RhbCBwYWdlcywgYW5kIHJlY29yZCBjb3VudCwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBtb3ZpbmcgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoaXMgcGFnaW5hdG9yIG9wZXJhdGVzIG9uXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcGFnaW5hdGVkIHF1ZXJ5IChkZWZhdWx0cyB0byBNW10pXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIChkZWZhdWx0cyB0byBhbnkpXG4gKiBAcGFyYW0ge0FkYXB0ZXI8YW55LCBRLCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgZGF0YWJhc2UgYWRhcHRlciB0byB1c2UgZm9yIGV4ZWN1dGluZyBxdWVyaWVzXG4gKiBAcGFyYW0ge1F9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgcGFnZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCB0eXBlXG4gKiBAY2xhc3MgUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgcGFnaW5hdG9yIGZvciBhIHVzZXIgcXVlcnlcbiAqIGNvbnN0IHVzZXJRdWVyeSA9IGRiLnNlbGVjdCgpLmZyb20oVXNlcik7XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCB1c2VyUXVlcnkucGFnaW5hdGUoMTApOyAvLyAxMCB1c2VycyBwZXIgcGFnZVxuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZSBvZiByZXN1bHRzXG4gKiBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBwYWdlXG4gKiBjb25zdCBzZWNvbmRQYWdlID0gYXdhaXQgcGFnaW5hdG9yLm5leHQoKTtcbiAqXG4gKiAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhZ2luYXRpb25cbiAqIGNvbnNvbGUubG9nKGBQYWdlICR7cGFnaW5hdG9yLmN1cnJlbnR9IG9mICR7cGFnaW5hdG9yLnRvdGFsfSwgJHtwYWdpbmF0b3IuY291bnR9IHRvdGFsIHJlY29yZHNgKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3JcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEYXRhYmFzZVxuICpcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBuZXcgUGFnaW5hdG9yKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eilcbiAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogcHJlcGFyZShxdWVyeSlcbiAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogZXhlY3V0ZSBxdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByZXR1cm4gcmVzdWx0c1xuICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXR1cm4gcGFnZSByZXN1bHRzXG4gKlxuICogICBDbGllbnQtPj5QYWdpbmF0b3I6IG5leHQoKVxuICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IHBhZ2UoY3VycmVudCArIDEpXG4gKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogdmFsaWRhdGVQYWdlKGN1cnJlbnQgKyAxKVxuICogICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBleGVjdXRlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICogICBBZGFwdGVyLT4+RGF0YWJhc2U6IGV4ZWN1dGUgcXVlcnlcbiAqICAgRGF0YWJhc2UtLT4+QWRhcHRlcjogcmV0dXJuIHJlc3VsdHNcbiAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJldHVybiByZXN1bHRzXG4gKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJldHVybiBwYWdlIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFIgPSBNW10sIFEgPSBhbnk+IHtcbiAgcHJvdGVjdGVkIF9jdXJyZW50UGFnZSE6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF90b3RhbFBhZ2VzITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3JlY29yZENvdW50ITogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGltaXQhOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfc3RhdGVtZW50PzogUTtcblxuICBnZXQgY3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cblxuICBnZXQgdG90YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkQ291bnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN0YXRlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3N0YXRlbWVudCkgdGhpcy5fc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMucXVlcnkpO1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkYXB0ZXI6IEFkYXB0ZXI8YW55LCBhbnksIFEsIGFueSwgYW55PixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcXVlcnk6IFEsXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUSk6IFE7XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlKHRoaXMuY3VycmVudCArIDEpO1xuICB9XG5cbiAgYXN5bmMgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSh0aGlzLmN1cnJlbnQgLSAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVBhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHBhZ2UgPCAxIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpKVxuICAgICAgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFxuICAgICAgICBcIlBhZ2UgbnVtYmVyIGNhbm5vdCBiZSB1bmRlciAxIGFuZCBtdXN0IGJlIGFuIGludGVnZXJcIlxuICAgICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3RvdGFsUGFnZXMgIT09IFwidW5kZWZpbmVkXCIgJiYgcGFnZSA+IHRoaXMuX3RvdGFsUGFnZXMpXG4gICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXG4gICAgICAgIGBPbmx5ICR7dGhpcy5fdG90YWxQYWdlc30gYXJlIGF2YWlsYWJsZS4gQ2Fubm90IGdvIHRvIHBhZ2UgJHtwYWdlfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cblxuICBhYnN0cmFjdCBwYWdlKHBhZ2U/OiBudW1iZXIpOiBQcm9taXNlPFJbXT47XG59XG4iLCJpbXBvcnQgeyB0eXBlIENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0b3IsIFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRnJvbVNlbGVjdG9yLFxuICBHcm91cEJ5U2VsZWN0b3IsXG4gIE9yZGVyQnlTZWxlY3RvcixcbiAgU2VsZWN0U2VsZWN0b3IsXG59IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb3VudE9wdGlvbixcbiAgRGlzdGluY3RPcHRpb24sXG4gIExpbWl0T3B0aW9uLFxuICBNYXhPcHRpb24sXG4gIE1pbk9wdGlvbixcbiAgT2Zmc2V0T3B0aW9uLFxuICBPcmRlckFuZEdyb3VwT3B0aW9uLFxuICBTZWxlY3RPcHRpb24sXG4gIFdoZXJlT3B0aW9uLFxufSBmcm9tIFwiLi9vcHRpb25zXCI7XG5pbXBvcnQgeyBQYWdpbmF0YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1BhZ2luYXRhYmxlXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgZGF0YWJhc2UgcXVlcnkgc3RhdGVtZW50c1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBhbmQgZXhlY3V0aW5nIGRhdGFiYXNlIHF1ZXJpZXNcbiAqXG4gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIHF1ZXJ5IGJ1aWxkZXIgcGF0dGVybiBmb3IgY29uc3RydWN0aW5nXG4gKiBkYXRhYmFzZSBxdWVyaWVzLiBJdCBzdXBwb3J0cyB2YXJpb3VzIHF1ZXJ5IG9wZXJhdGlvbnMgbGlrZSBzZWxlY3QsIGZyb20sXG4gKiB3aGVyZSwgb3JkZXJCeSwgZ3JvdXBCeSwgbGltaXQsIGFuZCBvZmZzZXQuIEl0IGFsc28gcHJvdmlkZXMgbWV0aG9kcyBmb3JcbiAqIGV4ZWN1dGluZyBxdWVyaWVzIGFuZCBoYW5kbGluZyBwYWdpbmF0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgc3BlY2lmaWMgdG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhpcyBzdGF0ZW1lbnQgb3BlcmF0ZXMgb25cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICogQHBhcmFtIHtBZGFwdGVyPGFueSwgUSwgYW55LCBhbnk+fSBhZGFwdGVyIC0gVGhlIGRhdGFiYXNlIGFkYXB0ZXIgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQGNsYXNzIFN0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIHN0YXRlbWVudCB0byBxdWVyeSB1c2Vyc1xuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFNRTFN0YXRlbWVudChhZGFwdGVyKTtcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5zZWxlY3QoKVxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZShcInN0YXR1c1wiKS5lcShcImFjdGl2ZVwiKSlcbiAqICAgLm9yZGVyQnkoW1wiY3JlYXRlZEF0XCIsIFwiREVTQ1wiXSlcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICpcbiAqIC8vIFVzZSBwYWdpbmF0aW9uXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBhd2FpdCBzdGF0ZW1lbnRcbiAqICAgLnNlbGVjdCgpXG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC5wYWdpbmF0ZSgyMCk7IC8vIDIwIHVzZXJzIHBlciBwYWdlXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgRGF0YWJhc2VcbiAqXG4gKiAgIENsaWVudC0+PlN0YXRlbWVudDogc2VsZWN0KClcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBmcm9tKE1vZGVsKVxuICogICBDbGllbnQtPj5TdGF0ZW1lbnQ6IHdoZXJlKGNvbmRpdGlvbilcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBvcmRlckJ5KFtmaWVsZCwgZGlyZWN0aW9uXSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBsaW1pdCh2YWx1ZSlcbiAqICAgQ2xpZW50LT4+U3RhdGVtZW50OiBleGVjdXRlKClcbiAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBidWlsZCgpXG4gKiAgIFN0YXRlbWVudC0+PkFkYXB0ZXI6IHJhdyhxdWVyeSlcbiAqICAgQWRhcHRlci0+PkRhdGFiYXNlOiBleGVjdXRlIHF1ZXJ5XG4gKiAgIERhdGFiYXNlLS0+PkFkYXB0ZXI6IHJldHVybiByZXN1bHRzXG4gKiAgIEFkYXB0ZXItLT4+U3RhdGVtZW50OiByZXR1cm4gcHJvY2Vzc2VkIHJlc3VsdHNcbiAqICAgU3RhdGVtZW50LS0+PkNsaWVudDogcmV0dXJuIGZpbmFsIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXRlbWVudDxRLCBNIGV4dGVuZHMgTW9kZWwsIFI+XG4gIGV4dGVuZHMgTG9nZ2VkQ2xhc3NcbiAgaW1wbGVtZW50cyBFeGVjdXRvcjxSPiwgUmF3RXhlY3V0b3I8UT4sIFBhZ2luYXRhYmxlPE0sIFIsIFE+XG57XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+W107XG4gIHByb3RlY3RlZCBkaXN0aW5jdFNlbGVjdG9yPzogU2VsZWN0U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBtYXhTZWxlY3Rvcj86IFNlbGVjdFNlbGVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgbWluU2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGNvdW50U2VsZWN0b3I/OiBTZWxlY3RTZWxlY3RvcjxNPjtcbiAgcHJvdGVjdGVkIGZyb21TZWxlY3RvciE6IENvbnN0cnVjdG9yPE0+O1xuICBwcm90ZWN0ZWQgd2hlcmVDb25kaXRpb24/OiBDb25kaXRpb248TT47XG4gIHByb3RlY3RlZCBvcmRlckJ5U2VsZWN0b3I/OiBPcmRlckJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBncm91cEJ5U2VsZWN0b3I/OiBHcm91cEJ5U2VsZWN0b3I8TT47XG4gIHByb3RlY3RlZCBsaW1pdFNlbGVjdG9yPzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb2Zmc2V0U2VsZWN0b3I/OiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55LCBRLCBhbnksIGFueT4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gKHRoaXMuYWRhcHRlciBhcyBhbnkpLmxvZy5mb3IoU3RhdGVtZW50KTtcbiAgfVxuXG4gIHNlbGVjdDxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgUyBleHRlbmRzIHJlYWRvbmx5IFNlbGVjdFNlbGVjdG9yPE0+W10sXG4gID4oKTogU2VsZWN0T3B0aW9uPE0sIE1bXT47XG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I6IHJlYWRvbmx5IFsuLi5TXVxuICApOiBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuXG4gIEBmaW5hbCgpXG4gIHNlbGVjdDxTIGV4dGVuZHMgcmVhZG9ubHkgU2VsZWN0U2VsZWN0b3I8TT5bXT4oXG4gICAgc2VsZWN0b3I/OiByZWFkb25seSBbLi4uU11cbiAgKTogU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZWxlY3RTZWxlY3RvclwiLCB7XG4gICAgICB2YWx1ZTogc2VsZWN0b3IsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMgYXMgU2VsZWN0T3B0aW9uPE0sIE1bXT4gfCBTZWxlY3RPcHRpb248TSwgUGljazxNLCBTW251bWJlcl0+W10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgZGlzdGluY3Q8UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihcbiAgICBzZWxlY3RvcjogU1xuICApOiBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+IHtcbiAgICB0aGlzLmRpc3RpbmN0U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBEaXN0aW5jdE9wdGlvbjxNLCBNW1NdW10+O1xuICB9XG5cbiAgQGZpbmFsKClcbiAgbWF4PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I6IFMpOiBNYXhPcHRpb248TSwgTVtTXT4ge1xuICAgIHRoaXMubWF4U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcyBhcyBNYXhPcHRpb248TSwgTVtTXT47XG4gIH1cblxuICBAZmluYWwoKVxuICBtaW48UyBleHRlbmRzIFNlbGVjdFNlbGVjdG9yPE0+PihzZWxlY3RvcjogUyk6IE1pbk9wdGlvbjxNLCBNW1NdPiB7XG4gICAgdGhpcy5taW5TZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHJldHVybiB0aGlzIGFzIE1pbk9wdGlvbjxNLCBNW1NdPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIGNvdW50PFMgZXh0ZW5kcyBTZWxlY3RTZWxlY3RvcjxNPj4oc2VsZWN0b3I/OiBTKTogQ291bnRPcHRpb248TSwgbnVtYmVyPiB7XG4gICAgdGhpcy5jb3VudFNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgcmV0dXJuIHRoaXMgYXMgQ291bnRPcHRpb248TSwgbnVtYmVyPjtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBmcm9tKHNlbGVjdG9yOiBGcm9tU2VsZWN0b3I8TT4pOiBXaGVyZU9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5mcm9tU2VsZWN0b3IgPSAoXG4gICAgICB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgPyBNb2RlbC5nZXQoc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICApIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGlmICghdGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgQ291bGQgbm90IGZpbmQgc2VsZWN0b3IgbW9kZWw6ICR7c2VsZWN0b3J9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBwdWJsaWMgd2hlcmUoY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBPcmRlckFuZEdyb3VwT3B0aW9uPE0sIFI+IHtcbiAgICB0aGlzLndoZXJlQ29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHVibGljIG9yZGVyQnkoXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcjxNPlxuICApOiBMaW1pdE9wdGlvbjxNLCBSPiAmIE9mZnNldE9wdGlvbjxSPiB7XG4gICAgdGhpcy5vcmRlckJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBncm91cEJ5KHNlbGVjdG9yOiBHcm91cEJ5U2VsZWN0b3I8TT4pOiBMaW1pdE9wdGlvbjxNLCBSPiB7XG4gICAgdGhpcy5ncm91cEJ5U2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBsaW1pdCh2YWx1ZTogbnVtYmVyKTogT2Zmc2V0T3B0aW9uPFI+IHtcbiAgICB0aGlzLmxpbWl0U2VsZWN0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHB1YmxpYyBvZmZzZXQodmFsdWU6IG51bWJlcik6IEV4ZWN1dG9yPFI+IHtcbiAgICB0aGlzLm9mZnNldFNlbGVjdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBAZmluYWwoKVxuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogUSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5yYXcocXVlcnkpKSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3PFI+KHJhd0lucHV0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0U2VsZWN0b3IpIHJldHVybiByZXN1bHRzO1xuICAgIGNvbnN0IHBrQXR0ciA9IGZpbmRQcmltYXJ5S2V5KFxuICAgICAgbmV3ICh0aGlzLmZyb21TZWxlY3RvciBhcyBDb25zdHJ1Y3RvcjxNPikoKVxuICAgICkuaWQ7XG5cbiAgICBjb25zdCBwcm9jZXNzb3IgPSBmdW5jdGlvbiByZWNvcmRQcm9jZXNzb3IoXG4gICAgICB0aGlzOiBTdGF0ZW1lbnQ8USwgTSwgUj4sXG4gICAgICByOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlkID0gcltwa0F0dHJdO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yIGFzIENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgIHBrQXR0cixcbiAgICAgICAgaWRcbiAgICAgICkgYXMgYW55O1xuICAgIH0uYmluZCh0aGlzIGFzIGFueSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHMubWFwKHByb2Nlc3NvcikgYXMgUjtcbiAgICByZXR1cm4gcHJvY2Vzc29yKHJlc3VsdHMpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGQoKTogUTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFE7XG4gIGFic3RyYWN0IHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFE+Pjtcbn1cbiIsImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgT3JkZXJCeVNlbGVjdG9yIH0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBxdWVyeSBidWlsZGluZyBiZWhhdmlvci5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBRdWVyeU9wdGlvbnNgIHR5cGUgZGVmaW5lcyBmbGFncyB0aGF0IGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gY2xhdXNlc1xuICogKGxpbWl0LCBvZmZzZXQsIG9yZGVyIGJ5KSBhcmUgcGVybWl0dGVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgdmlvbGF0aW9uc1xuICogc2hvdWxkIHRocm93IGFuIGVycm9yIGR1cmluZyBxdWVyeSBjb25zdHJ1Y3Rpb24uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnMgPSB7XG4gIGFsbG93TGltaXQ/OiBib29sZWFuO1xuICBhbGxvd09mZnNldD86IGJvb2xlYW47XG4gIGFsbG93T3JkZXJCeT86IGJvb2xlYW47XG4gIHRocm93cz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogU3RydWN0dXJlZCBxdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHBhcnNlZCBxdWVyeSBjbGF1c2VzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5QXNzaXN0YCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHJldHVybmVkXG4gKiBieSBxdWVyeSBidWlsZGVycy4gSXQgaW5jbHVkZXMgYWN0aW9ucyBzdWNoIGFzIGZpbmQsIG9wdGlvbmFsIGNsYXVzZXNcbiAqIGxpa2Ugc2VsZWN0LCBncm91cEJ5LCBhbmQgb3JkZXJCeSwgYW5kIHBhZ2luYXRpb24gY29udHJvbHMgKGxpbWl0LCBvZmZzZXQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSBlbnRpdHkgb3IgcmVjb3JkIHR5cGUgdGhhdCBjb25kaXRpb25zIG1heSBhcHBseSB0by5cbiAqXG4gKiBAaW50ZXJmYWNlIFF1ZXJ5QXNzaXN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3Npc3Qge1xuICBhY3Rpb246IFwiZmluZFwiO1xuICBzZWxlY3Q6IHVuZGVmaW5lZCB8IHN0cmluZ1tdO1xuICB3aGVyZTogQ29uZGl0aW9uPGFueT47XG4gIGdyb3VwQnk/OiBzdHJpbmdbXTtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHF1ZXJ5IGNsYXVzZXMgZm9yIGJ1aWxkaW5nIG1ldGhvZC1iYXNlZCBxdWVyaWVzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5Q2xhdXNlYCBlbnVtIGRlZmluZXMgc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50XG4gKiBkaWZmZXJlbnQgc2VnbWVudHMgb2YgYSBxdWVyeSAoZS5nLiwgYGZpbmRCeWAsIGBTZWxlY3RgLCBgQW5kYCwgYE9yYCkuXG4gKlxuICogQGVudW0gUXVlcnlDbGF1c2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGVudW0gUXVlcnlDbGF1c2Uge1xuICBGSU5EX0JZID0gXCJmaW5kQnlcIixcbiAgU0VMRUNUID0gXCJTZWxlY3RcIixcbiAgQU5EID0gXCJBbmRcIixcbiAgT1IgPSBcIk9yXCIsXG4gIEdST1VQX0JZID0gXCJHcm91cEJ5XCIsXG4gIE9SREVSX0JZID0gXCJPcmRlckJ5XCIsXG4gIFRIRU4gPSBcIlRoZW5cIixcbiAgVEhFTl9CWSA9IFwiVGhlbkJ5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGdW5jdGlvbiBzaWduYXR1cmUgZm9yIHBhcnNpbmcgb3BlcmF0b3JzIGluIHF1ZXJ5IGJ1aWxkaW5nLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE9wZXJhdG9yUGFyc2VyYCB0eXBlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgZmllbGQgbmFtZVxuICogYW5kIGFyZ3VtZW50cywgdGhlbiBwcm9kdWNlcyBhIGBDb25kaXRpb25gIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcXVlcnkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZpZWxkIHtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHBhcnNlZC5cbiAqIEBwYXJhbSBhcmdzIHthbnlbXX0gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3Igb3BlcmF0b3IgZXZhbHVhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb248YW55Pn0gQSBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIG9wZXJhdG9yLlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0b3JQYXJzZXIgPSAoZmllbGQ6IHN0cmluZywgLi4uYXJnczogYW55KSA9PiBDb25kaXRpb248YW55PjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlc2NyaXB0b3IgZm9yIGZpZWxkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvcGVyYXRvcnMgaW4gcXVlcnkgcGFyc2luZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBGaWx0ZXJEZXNjcmlwdG9yYCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHVzZWQgd2hlbiBwYXJzaW5nXG4gKiBtZXRob2Qgc2VnbWVudHMgaW50byBmaWx0ZXJhYmxlIGZpZWxkcyBhbmQgYXNzb2NpYXRlZCBvcGVyYXRvcnMuXG4gKlxuICogQGludGVyZmFjZSBGaWx0ZXJEZXNjcmlwdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRGVzY3JpcHRvciB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRvclBhcnNlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBNYXAgb2Ygc3VwcG9ydGVkIG9wZXJhdG9ycyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHBhcnNlciBmdW5jdGlvbnMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgT3BlcmF0b3JzTWFwYCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRvciBuYW1lcyBhcyBrZXlzXG4gKiAoc3VjaCBhcyBgRXF1YWxzYCwgYExlc3NUaGFuYCwgYEJldHdlZW5gLCBldGMuKSwgZWFjaCBtYXBwZWQgdG8gYVxuICogZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGEgYENvbmRpdGlvbmAgb2JqZWN0IGZvciB0aGF0IG9wZXJhdG9yLlxuICogVGhlc2UgZnVuY3Rpb25zIHRyYW5zbGF0ZSBxdWVyeSBjbGF1c2VzIGludG8gY29uY3JldGUgY29uZGl0aW9uXG4gKiBidWlsZGVycywgZW5hYmxpbmcgZHluYW1pYyBxdWVyeSBjb25zdHJ1Y3Rpb24gZnJvbSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIHZhbHVlcyB1c2VkIGluIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIGYge3N0cmluZ30gLSBUaGUgZmllbGQgbmFtZSB0aGUgY29uZGl0aW9uIGFwcGxpZXMgdG8uXG4gKiBAcGFyYW0gdjEge2FueX0gLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgZmllbGQgYWdhaW5zdCBvciB0aGUgbG93ZXIgYm91bmQgdmFsdWUgZm9yIHJhbmdlLWJhc2VkIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB2MiB7YW55fSAtIFRoZSB1cHBlciBib3VuZCB2YWx1ZSBmb3IgcmFuZ2UtYmFzZWQgb3BlcmF0b3JzLlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvciBhcHBsaWVkIHRvIHRoZSBmaWVsZC5cbiAqXG4gKiBAZnVuY3Rpb24gT3BlcmF0b3JzTWFwXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnQgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IE1hcCBhcyBPcGVyYXRvcnNNYXBcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIE9wZXJhdG9yUGFyc2VyXG4gKiAgIHBhcnRpY2lwYW50IENvbmQgYXMgQ29uZGl0aW9uXG4gKlxuICogICBDbGllbnQtPj5NYXA6IFJlcXVlc3Qgb3BlcmF0b3IgcGFyc2VyIChcIkJldHdlZW5cIiwgZmllbGQsIHYxLCB2MilcbiAqICAgTWFwLT4+UGFyc2VyOiBDYWxsIGNvcnJlc3BvbmRpbmcgb3BlcmF0b3IgZnVuY3Rpb25cbiAqICAgUGFyc2VyLT4+Q29uZDogQ29uZGl0aW9uLmF0dHJpYnV0ZShmaWVsZClcbiAqICAgQ29uZC0tPj5QYXJzZXI6IENvbmRpdGlvbiBpbnN0YW5jZVxuICogICBQYXJzZXItPj5Db25kOiBBcHBseSBndGUodjEpXG4gKiAgIFBhcnNlci0+PkNvbmQ6IEFwcGx5IGFuZChsdGUodjIpKVxuICogICBQYXJzZXItLT4+Q2xpZW50OiBSZXR1cm4gYnVpbHQgQ29uZGl0aW9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JzTWFwOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRvclBhcnNlcj4gPSB7XG4gIEVxdWFsczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmVxKHYpLFxuICBEaWZmOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZGlmKHYpLFxuICBMZXNzVGhhbjogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmx0KHYpLFxuICBMZXNzVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkubHRlKHYpLFxuICBHcmVhdGVyVGhhbjogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLmd0KHYpLFxuICBHcmVhdGVyVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmIGFzIGFueSkuZ3RlKHYpLFxuICBCZXR3ZWVuOiAoZiwgdjEsIHYyKSA9PlxuICAgIENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpXG4gICAgICAuZ3RlKHYxKVxuICAgICAgLmFuZChDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5sdGUodjIpKSxcbiAgSW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYgYXMgYW55KS5pbih2KSxcbiAgTWF0Y2hlczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZiBhcyBhbnkpLnJlZ2V4cCh2KSxcbn07XG4iLCJpbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyQnlTZWxlY3RvciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgRmlsdGVyRGVzY3JpcHRvciwgUXVlcnlBc3Npc3QsIFF1ZXJ5Q2xhdXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdG9yc01hcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGxvd2VyRmlyc3QgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgdHlwZSBPcmRlckxpbWl0T2Zmc2V0RXh0cmFjdCA9IHtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVXRpbGl0eSBjbGFzcyB0byBidWlsZCBxdWVyeSBvYmplY3RzIGZyb20gcmVwb3NpdG9yeSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTWV0aG9kUXVlcnlCdWlsZGVyYCBjbGFzcyBwYXJzZXMgbWV0aG9kIG5hbWVzIHRoYXQgZm9sbG93IGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb25cbiAqIChlLmcuLCBgZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjYCkgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdHNcbiAqIChgUXVlcnlBc3Npc3RgKS4gSXQgZXh0cmFjdHMgY2xhdXNlcyBzdWNoIGFzIGBzZWxlY3RgLCBgd2hlcmVgLCBgZ3JvdXBCeWAsIGBvcmRlckJ5YCwgYGxpbWl0YCxcbiAqIGFuZCBgb2Zmc2V0YCwgZW5zdXJpbmcgdGhhdCBkZXZlbG9wZXJzIGNhbiBkZWNsYXJlIHJlcG9zaXRvcnkgcXVlcmllcyB1c2luZyBleHByZXNzaXZlIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGludG8gYSBxdWVyeS5cbiAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBtZXRob2QgcGFyYW1ldGVycyB1c2VkIGZvciBxdWVyeSBjb25kaXRpb25zLlxuICpcbiAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHBhcnNlZCBhY3Rpb24sIHNlbGVjdCwgd2hlcmUsXG4gKiBncm91cEJ5LCBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCBjbGF1c2VzLlxuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcXVlcnkgPSBNZXRob2RRdWVyeUJ1aWxkZXIuYnVpbGQoXG4gKiAgIFwiZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjXCIsXG4gKiAgIFwiSm9oblwiLFxuICogICAyNSxcbiAqICAgW1tcImNvdW50cnlcIiwgXCJBU0NcIl1dXG4gKiApO1xuICpcbiAqIGNvbnNvbGUubG9nKHF1ZXJ5KTtcbiAqIC8vIHtcbiAqIC8vICAgYWN0aW9uOiBcImZpbmRcIixcbiAqIC8vICAgc2VsZWN0OiB1bmRlZmluZWQsXG4gKiAvLyAgIHdoZXJlOiB7IC4uLiB9LFxuICogLy8gICBncm91cEJ5OiB1bmRlZmluZWQsXG4gKiAvLyAgIG9yZGVyQnk6IFtbXCJjb3VudHJ5XCIsIFwiQVNDXCJdXSxcbiAqIC8vICAgbGltaXQ6IHVuZGVmaW5lZCxcbiAqIC8vICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBSZXBvc2l0b3J5IE1ldGhvZFxuICogICBwYXJ0aWNpcGFudCBNUUIgYXMgTWV0aG9kUXVlcnlCdWlsZGVyXG4gKiAgIHBhcnRpY2lwYW50IFF1ZXJ5IGFzIFF1ZXJ5QXNzaXN0XG4gKlxuICogICBSZXBvLT4+TVFCOiBidWlsZChtZXRob2ROYW1lLCAuLi52YWx1ZXMpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdENvcmUobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWUpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBidWlsZFdoZXJlKGNvcmUsIHZhbHVlcylcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0T3JkZXJMaW1pdE9mZnNldChjb3JlLCB2YWx1ZXMpXG4gKiAgIE1RQi0+PlF1ZXJ5OiByZXR1cm4gc3RydWN0dXJlZCBRdWVyeUFzc2lzdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGhvZFF1ZXJ5QnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQnVpbGRzIGEgYFF1ZXJ5QXNzaXN0YCBvYmplY3QgYnkgcGFyc2luZyBhIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWUgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVGhlIG1ldGhvZCB2YWxpZGF0ZXMgdGhlIG1ldGhvZCBuYW1lLCBleHRyYWN0cyBjbGF1c2VzIChjb3JlLCBzZWxlY3QsIGdyb3VwQnksIHdoZXJlLFxuICAgKiBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCksIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgc3RydWN0dXJlZCBxdWVyeSBvYmplY3RcbiAgICogdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYWdhaW5zdCBhIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRoYXQgZW5jb2RlcyBxdWVyeSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGNvbmRpdGlvbnMgYW5kIGV4dHJhIGNsYXVzZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkKG1ldGhvZE5hbWU6IHN0cmluZywgLi4udmFsdWVzOiBhbnlbXSk6IFF1ZXJ5QXNzaXN0IHtcbiAgICBpZiAoIW1ldGhvZE5hbWUuc3RhcnRzV2l0aChRdWVyeUNsYXVzZS5GSU5EX0JZKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2ROYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcmUgPSB0aGlzLmV4dHJhY3RDb3JlKG1ldGhvZE5hbWUpO1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZXh0cmFjdFNlbGVjdChtZXRob2ROYW1lKTtcbiAgICBjb25zdCBncm91cEJ5ID0gdGhpcy5leHRyYWN0R3JvdXBCeShtZXRob2ROYW1lKTtcbiAgICAvLyBjb25zdCBvcmRlckJ5ID0gdGhpcy5leHRyYWN0T3JkZXJCeShtZXRob2ROYW1lKTtcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMuYnVpbGRXaGVyZShjb3JlLCB2YWx1ZXMpO1xuICAgIGNvbnN0IHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID0gdGhpcy5leHRyYWN0T3JkZXJMaW1pdE9mZnNldChcbiAgICAgIGNvcmUsXG4gICAgICB2YWx1ZXNcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmaW5kXCIsXG4gICAgICBzZWxlY3Q6IHNlbGVjdCxcbiAgICAgIHdoZXJlLFxuICAgICAgZ3JvdXBCeSxcbiAgICAgIG9yZGVyQnksXG4gICAgICBsaW1pdCxcbiAgICAgIG9mZnNldCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgY29yZSBwYXJ0IG9mIHRoZSBtZXRob2QgbmFtZSBhZnRlciBgZmluZEJ5YCBhbmQgYmVmb3JlIGFueSBzcGVjaWFsIGNsYXVzZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFJlbW92ZXMgcHJlZml4ZXMgYW5kIGRldGVjdHMgZGVsaW1pdGVycyAoYFRoZW5gLCBgT3JkZXJCeWAsIGBHcm91cEJ5YCwgYExpbWl0YCwgYE9mZnNldGApXG4gICAqIHRvIGlzb2xhdGUgdGhlIG1haW4gY29uZGl0aW9uYWwgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgdXNlZCBmb3IgYnVpbGRpbmcgY29uZGl0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RDb3JlKG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgYWZ0ZXJGaW5kQnkgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhRdWVyeUNsYXVzZS5GSU5EX0JZLmxlbmd0aCk7XG4gICAgY29uc3QgcmVnZXggPSAvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS87XG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlckZpbmRCeS5tYXRjaChyZWdleCk7XG4gICAgcmV0dXJuIG1hdGNoID8gYWZ0ZXJGaW5kQnkuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSA6IGFmdGVyRmluZEJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgc2VsZWN0IGNsYXVzZSBmcm9tIGEgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVjdHMgdGhlIGBTZWxlY3RgIGtleXdvcmQgaW4gdGhlIG1ldGhvZCBuYW1lLCBpc29sYXRlcyB0aGUgZmllbGRzIGZvbGxvd2luZyBpdCxcbiAgICogYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheSBvZiBsb3dlcmNhc2UtZmlyc3Qgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBBbiBhcnJheSBvZiBzZWxlY3RlZCBmaWVsZHMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc2VsZWN0IGNsYXVzZSBleGlzdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWxlY3RJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5TRUxFQ1QpO1xuICAgIGlmIChzZWxlY3RJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlclNlbGVjdCA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgc2VsZWN0SW5kZXggKyBRdWVyeUNsYXVzZS5TRUxFQ1QubGVuZ3RoXG4gICAgKTtcblxuICAgIC8vIFNlYXJjaCBmb3IgbmV4dCBUaGVuLCBHcm91cEJ5LCBPcmRlckJ5Li4uXG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlclNlbGVjdC5tYXRjaCgvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS8pO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFydCA9IG1hdGNoXG4gICAgICA/IGFmdGVyU2VsZWN0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleClcbiAgICAgIDogYWZ0ZXJTZWxlY3Q7XG5cbiAgICByZXR1cm4gc2VsZWN0UGFydC5zcGxpdChRdWVyeUNsYXVzZS5BTkQpLm1hcChsb3dlckZpcnN0KS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIHRoZSBncm91cCBieSBjbGF1c2UgZnJvbSBhIG1ldGhvZCBuYW1lLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEZXRlY3RzIHRoZSBgR3JvdXBCeWAga2V5d29yZCBpbiB0aGUgbWV0aG9kIG5hbWUsIGlzb2xhdGVzIHRoZSBmaWVsZHMgZm9sbG93aW5nIGl0LFxuICAgKiBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5IG9mIGxvd2VyY2FzZS1maXJzdCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nW10gfCB1bmRlZmluZWR9IEFuIGFycmF5IG9mIGdyb3VwIGJ5IGZpZWxkcyBvciBgdW5kZWZpbmVkYCBpZiBubyBncm91cCBieSBjbGF1c2UgZXhpc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGdyb3VwQnlJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5HUk9VUF9CWSk7XG4gICAgaWYgKGdyb3VwQnlJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlciA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgZ3JvdXBCeUluZGV4ICsgUXVlcnlDbGF1c2UuR1JPVVBfQlkubGVuZ3RoXG4gICAgKTtcbiAgICBjb25zdCBncm91cEJ5UGFydCA9IGFmdGVyLnNwbGl0KFF1ZXJ5Q2xhdXNlLk9SREVSX0JZKVswXTtcbiAgICByZXR1cm4gZ3JvdXBCeVBhcnRcbiAgICAgIC5zcGxpdChRdWVyeUNsYXVzZS5USEVOX0JZKVxuICAgICAgLm1hcChsb3dlckZpcnN0KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgc3RhdGljIGV4dHJhY3RPcmRlckJ5KFxuICAvLyAgIG1ldGhvZE5hbWU6IHN0cmluZ1xuICAvLyApOiBPcmRlckJ5U2VsZWN0b3I8YW55PltdIHwgdW5kZWZpbmVkIHtcbiAgLy8gICBjb25zdCBvcmRlckJ5SW5kZXggPSBtZXRob2ROYW1lLmluZGV4T2YoUXVlcnlDbGF1c2UuT1JERVJfQlkpO1xuICAvLyAgIGlmIChvcmRlckJ5SW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvL1xuICAvLyAgIGNvbnN0IGFmdGVyID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoXG4gIC8vICAgICBvcmRlckJ5SW5kZXggKyBRdWVyeUNsYXVzZS5PUkRFUl9CWS5sZW5ndGhcbiAgLy8gICApO1xuICAvLyAgIGNvbnN0IG9yZGVyUGFydHMgPSBhZnRlci5zcGxpdChcIlRoZW5CeVwiKTtcbiAgLy9cbiAgLy8gICByZXR1cm4gb3JkZXJQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgLy8gICAgIGNvbnN0IG1hdGNoID0gcGFydC5tYXRjaCgvKC4qPykoQXNjfERlc2N8RHNjKSQvKTtcbiAgLy8gICAgIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcmRlckJ5IHBhcnQ6ICR7cGFydH1gKTtcbiAgLy8gICAgIGNvbnN0IFssIGZpZWxkLCBkaXJdID0gbWF0Y2g7XG4gIC8vICAgICByZXR1cm4gW1xuICAvLyAgICAgICBsb3dlckZpcnN0KGZpZWxkKSxcbiAgLy8gICAgICAgZGlyLnRvTG93ZXJDYXNlKCkgPT09IFwiZHNjXCJcbiAgLy8gICAgICAgICA/IE9yZGVyRGlyZWN0aW9uLkRTQ1xuICAvLyAgICAgICAgIDogKGRpci50b0xvd2VyQ2FzZSgpIGFzIE9yZGVyRGlyZWN0aW9uKSxcbiAgLy8gICAgIF07XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJ1aWxkcyB0aGUgYHdoZXJlYCBjb25kaXRpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBwYXJzZWQgY29yZSBzdHJpbmcgYW5kIHBhcmFtZXRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFNwbGl0cyB0aGUgY29yZSBzdHJpbmcgYnkgbG9naWNhbCBvcGVyYXRvcnMgKGBBbmRgLCBgT3JgKSwgcGFyc2VzIGVhY2ggdG9rZW4gaW50byBhIGZpZWxkXG4gICAqIGFuZCBvcGVyYXRvciwgYW5kIGNvbWJpbmVzIHRoZW0gaW50byBhIGBDb25kaXRpb25gIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29yZSB7c3RyaW5nfSAtIFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgZnJvbSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPGFueT59IEEgc3RydWN0dXJlZCBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcXVlcnkncyB3aGVyZSBjbGF1c2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZFdoZXJlKGNvcmU6IHN0cmluZywgdmFsdWVzOiBhbnlbXSk6IENvbmRpdGlvbjxhbnk+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGNvcmUuc3BsaXQoL09yZGVyQnl8R3JvdXBCeS8pWzBdIHx8IFwiXCI7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHBhcnRzLnNwbGl0KC9BbmR8T3IvKTtcblxuICAgIGNvbnN0IG9wZXJhdG9ycyA9IGNvcmUubWF0Y2goL0FuZHxPci9nKSB8fCBbXTtcblxuICAgIGxldCB3aGVyZTogQ29uZGl0aW9uPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25kaXRpb25zLmZvckVhY2goKHRva2VuLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIG9wZXJhdG9yIH0gPSB0aGlzLnBhcnNlRmllbGRBbmRPcGVyYXRvcih0b2tlbik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBvcGVyYXRvciA/IE9wZXJhdG9yc01hcFtvcGVyYXRvcl0gOiBPcGVyYXRvcnNNYXAuRXF1YWxzO1xuICAgICAgaWYgKCFwYXJzZXIpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0b3IgJHtvcGVyYXRvcn1gKTtcblxuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSB2YWx1ZXNbaWR4XTtcbiAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uVmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBmaWVsZCAke2ZpZWxkfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBwYXJzZXIoZmllbGQsIGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIHdoZXJlID1cbiAgICAgICAgaWR4ID09PSAwXG4gICAgICAgICAgPyBjb25kaXRpb25cbiAgICAgICAgICA6IG9wZXJhdG9yc1tpZHggLSAxXSA9PT0gUXVlcnlDbGF1c2UuQU5EXG4gICAgICAgICAgICA/IHdoZXJlIS5hbmQoY29uZGl0aW9uKVxuICAgICAgICAgICAgOiB3aGVyZSEub3IoY29uZGl0aW9uKTtcbiAgICB9KTtcblxuICAgIGlmICghd2hlcmUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmRpdGlvbnMgZm91bmQgaW4gbWV0aG9kIG5hbWVcIik7XG4gICAgcmV0dXJuIHdoZXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQYXJzZXMgYSBmaWVsZCBuYW1lIGFuZCBvcGVyYXRvciBmcm9tIGEgc3RyaW5nIHRva2VuLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZGVudGlmaWVzIHRoZSBvcGVyYXRvciBzdWZmaXggKGlmIHByZXNlbnQpIGFuZCByZXR1cm5zIGEgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBuYW1lIGluIGxvd2VyY2FzZS1maXJzdCBmb3JtYXQgYWxvbmcgd2l0aCB0aGUgb3BlcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBzdHIge3N0cmluZ30gLSBUaGUgdG9rZW4gc3RyaW5nIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGaWx0ZXJEZXNjcmlwdG9yfSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmllbGQgbmFtZSBhbmQgb3BlcmF0b3IuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZUZpZWxkQW5kT3BlcmF0b3Ioc3RyOiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yIHtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdG9yIG9mIE9iamVjdC5rZXlzKE9wZXJhdG9yc01hcCkpIHtcbiAgICAgIGlmIChzdHIuZW5kc1dpdGgob3BlcmF0b3IpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3RyLnNsaWNlKDAsIC1vcGVyYXRvci5sZW5ndGgpO1xuICAgICAgICByZXR1cm4geyBmaWVsZDogbG93ZXJGaXJzdChmaWVsZCksIG9wZXJhdG9yIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZpZWxkOiBsb3dlckZpcnN0KHN0cikgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgYG9yZGVyQnlgLCBgbGltaXRgLCBhbmQgYG9mZnNldGAgY2xhdXNlcyBmcm9tIG1ldGhvZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiBjb25kaXRpb24gYXJndW1lbnRzLCB0aGVuIGNoZWNrcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuICAgKiB0byByZXNvbHZlIHNvcnRpbmcsIGxpbWl0aW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvcmUge3N0cmluZ30gLSBUaGUgZXh0cmFjdGVkIGNvcmUgc3RyaW5nIGZyb20gdGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gbWV0aG9kIGFyZ3VtZW50cywgaW5jbHVkaW5nIGNvbmRpdGlvbnMgYW5kIGV4dHJhcy5cbiAgICpcbiAgICogQHJldHVybiB7T3JkZXJMaW1pdE9mZnNldEV4dHJhY3R9IEFuIG9iamVjdCBjb250YWluaW5nIG9yZGVyQnksIGxpbWl0LCBhbmQgb2Zmc2V0IHZhbHVlcyBpZiBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdE9yZGVyTGltaXRPZmZzZXQoXG4gICAgY29yZTogc3RyaW5nLFxuICAgIHZhbHVlczogYW55W11cbiAgKTogT3JkZXJMaW1pdE9mZnNldEV4dHJhY3Qge1xuICAgIGNvbnN0IGNvbmRpdGlvbkNvdW50ID0gY29yZS5zcGxpdCgvQW5kfE9yLykubGVuZ3RoO1xuICAgIGNvbnN0IGV4dHJhQXJncyA9IHZhbHVlcy5zbGljZShjb25kaXRpb25Db3VudCk7XG5cbiAgICBsZXQgb3JkZXJCeTogT3JkZXJCeVNlbGVjdG9yPGFueT5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXh0cmFBcmdzLmxlbmd0aCA+PSAxICYmIEFycmF5LmlzQXJyYXkoZXh0cmFBcmdzWzBdKSlcbiAgICAgIG9yZGVyQnkgPSBleHRyYUFyZ3NbMF0gYXMgT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcblxuICAgIGlmIChleHRyYUFyZ3MubGVuZ3RoID49IDIgJiYgdHlwZW9mIGV4dHJhQXJnc1sxXSA9PT0gXCJudW1iZXJcIilcbiAgICAgIGxpbWl0ID0gZXh0cmFBcmdzWzFdO1xuXG4gICAgaWYgKGV4dHJhQXJncy5sZW5ndGggPj0gMyAmJiB0eXBlb2YgZXh0cmFBcmdzWzJdID09PSBcIm51bWJlclwiKVxuICAgICAgb2Zmc2V0ID0gZXh0cmFBcmdzWzJdO1xuXG4gICAgcmV0dXJuIHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTWV0aG9kUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vTWV0aG9kUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeShvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgLy8gY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleS50b1N0cmluZygpO1xuICAgIChkZXNjcmlwdG9yIGFzIFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT4pLnZhbHVlID0gZnVuY3Rpb24gKFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0LCB3aGVyZSwgZ3JvdXBCeSwgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID1cbiAgICAgICAgTWV0aG9kUXVlcnlCdWlsZGVyLmJ1aWxkKG1ldGhvZE5hbWUsIC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc3RtdCA9ICh0aGlzIGFzIGFueSkuc2VsZWN0KHNlbGVjdCkgYXMgYW55O1xuICAgICAgaWYgKHdoZXJlKSBzdG10ID0gc3RtdC53aGVyZSh3aGVyZSk7XG4gICAgICAvLyBpZiAob3JkZXJCeSkgc3RtdCA9IHN0bXQub3JkZXJCeShvcmRlckJ5WzBdKTtcbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIC8vIGdyb3VwIGJ5IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgICAgICAgLyogc3RtdCA9IHN0bXQuZ3JvdXBCeShncm91cEJ5KTsgKi9cbiAgICAgIH1cblxuICAgICAgLy8gYWxsb3cgbGltaXQgYW5kIG9mZnNldCBieSBkZWZhdWx0XG4gICAgICBjb25zdCB7IGFsbG93TGltaXQsIGFsbG93T2Zmc2V0LCBhbGxvd09yZGVyQnksIHRocm93cyB9ID0ge1xuICAgICAgICBhbGxvd0xpbWl0OiB0cnVlLFxuICAgICAgICBhbGxvd09yZGVyQnk6IHRydWUsXG4gICAgICAgIGFsbG93T2Zmc2V0OiB0cnVlLFxuICAgICAgICB0aHJvd3M6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9IGFzIFF1ZXJ5T3B0aW9ucztcblxuICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAvLyBrZWVwIHRoZSBvcmRlciB0byBlbnN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yXG4gICAgICAgIHsga2V5OiBcIm9yZGVyQnlcIiwgdmFsdWU6IChvcmRlckJ5IHx8IFtdKVswXSwgYWxsb3dlZDogYWxsb3dPcmRlckJ5IH0sIC8vIG9yZGVyQnkgb25seSBzdXBwb3J0cyBvbmUgc2VudGVuY2VcbiAgICAgICAgeyBrZXk6IFwibGltaXRcIiwgdmFsdWU6IGxpbWl0LCBhbGxvd2VkOiBhbGxvd0xpbWl0IH0sXG4gICAgICAgIHsga2V5OiBcIm9mZnNldFwiLCB2YWx1ZTogb2Zmc2V0LCBhbGxvd2VkOiBhbGxvd09mZnNldCB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtLmFsbG93ZWQgJiYgdGhyb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgYCR7cGFyYW0ua2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBwYXJhbS5rZXkuc2xpY2UoMSl9IGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIHF1ZXJ5YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHN0bXQgPSBzdG10W3BhcmFtLmtleV0ocGFyYW0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RtdC5leGVjdXRlKCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFJhd1JhbVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0tc3BlY2lmaWMgcGFnaW5hdG9yIGltcGxlbWVudGF0aW9uXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFBhZ2luYXRvciBjbGFzcyB0byBwcm92aWRlIHBhZ2luYXRpb24gZnVuY3Rpb25hbGl0eSBmb3IgUkFNIGFkYXB0ZXIgcXVlcmllcy5cbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgcGFnaW5hdGlvbiBvZiBxdWVyeSByZXN1bHRzIGZyb20gdGhlIGluLW1lbW9yeSBzdG9yYWdlLCBhbGxvd2luZ1xuICogZm9yIGVmZmljaWVudCByZXRyaWV2YWwgb2YgbGFyZ2UgcmVzdWx0IHNldHMgaW4gc21hbGxlciBjaHVua3MuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHBhZ2luYXRlZFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgdGhlIHBhZ2luYXRvclxuICogQGNsYXNzIFJhbVBhZ2luYXRvclxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHF1ZXJ5IGZvciBVc2VyIG1vZGVsXG4gKiBjb25zdCBxdWVyeTogUmF3UmFtUXVlcnk8VXNlcj4gPSB7XG4gKiAgIHNlbGVjdDogdW5kZWZpbmVkLCAvLyBTZWxlY3QgYWxsIGZpZWxkc1xuICogICBmcm9tOiBVc2VyLFxuICogICB3aGVyZTogKHVzZXIpID0+IHVzZXIuYWN0aXZlID09PSB0cnVlXG4gKiB9O1xuICpcbiAqIC8vIENyZWF0ZSBhIHBhZ2luYXRvciB3aXRoIHBhZ2Ugc2l6ZSBvZiAxMFxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFJhbVBhZ2luYXRvcjxVc2VyLCBVc2VyPihhZGFwdGVyLCBxdWVyeSwgMTAsIFVzZXIpO1xuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZSBvZiByZXN1bHRzXG4gKiBjb25zdCBmaXJzdFBhZ2UgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBHZXQgdGhlIG5leHQgcGFnZVxuICogY29uc3Qgc2Vjb25kUGFnZSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgUmF3UmFtUXVlcnk8TT5cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBBZGFwdGVyPGFueSwgUmF3UmFtUXVlcnk8TT4sIGFueSwgYW55PixcbiAgICBxdWVyeTogUmF3UmFtUXVlcnk8TT4sXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIFJBTSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHN0YXRlbWVudCB0byBpbmNsdWRlIHBhZ2luYXRpb24gcGFyYW1ldGVycy5cbiAgICogVGhpcyBwcm90ZWN0ZWQgbWV0aG9kIHNldHMgdGhlIGxpbWl0IHBhcmFtZXRlciBvbiB0aGUgcXVlcnkgdG8gbWF0Y2ggdGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtSYXdSYW1RdWVyeTxNPn0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIHF1ZXJ5IHN0YXRlbWVudFxuICAgKiBAcmV0dXJuIHtSYXdSYW1RdWVyeTxNPn0gVGhlIG1vZGlmaWVkIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IFJhd1JhbVF1ZXJ5PE0+KTogUmF3UmFtUXVlcnk8TT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSYXdSYW1RdWVyeTxhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3U3RhdGVtZW50KTtcbiAgICBxdWVyeS5saW1pdCA9IHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0c1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHMuXG4gICAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGFwcHJvcHJpYXRlIHNraXAgdmFsdWUgYmFzZWQgb24gdGhlIHBhZ2UgbnVtYmVyIGFuZCBwYWdlIHNpemUsXG4gICAqIGV4ZWN1dGVzIHRoZSBxdWVyeSwgYW5kIHVwZGF0ZXMgdGhlIGN1cnJlbnQgcGFnZSB0cmFja2luZy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlPTFdIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlICgxLWJhc2VkKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMgZm9yIHRoZSByZXF1ZXN0ZWQgcGFnZVxuICAgKi9cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLnByZXBhcmUodGhpcy5zdGF0ZW1lbnQpO1xuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IHRoaXMuX3JlY29yZENvdW50ID0gMDtcbiAgICAgICAgY29uc3QgcmVzdWx0czogUltdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7IC4uLnN0YXRlbWVudCwgbGltaXQ6IHVuZGVmaW5lZCB9KSB8fCBbXTtcbiAgICAgICAgdGhpcy5fcmVjb3JkQ291bnQgPSByZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuX3JlY29yZENvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHN0YXRlbWVudD8ubGltaXQgfHwgdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHNpemUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFnZSA9IHRoaXMudmFsaWRhdGVQYWdlKHBhZ2UpO1xuICAgIHN0YXRlbWVudC5za2lwID0gKHBhZ2UgLSAxKSAqIHRoaXMuc2l6ZTtcbiAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoc3RhdGVtZW50KTtcbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIFBhZ2luYXRvcixcbiAgUXVlcnlFcnJvcixcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBSYXdSYW1RdWVyeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJhbVBhZ2luYXRvciB9IGZyb20gXCIuL1JhbVBhZ2luYXRvclwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNLXNwZWNpZmljIHF1ZXJ5IHN0YXRlbWVudCBidWlsZGVyXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIFN0YXRlbWVudCBjbGFzcyB0byBwcm92aWRlIHF1ZXJ5IGJ1aWxkaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAqIFRoaXMgY2xhc3MgdHJhbnNsYXRlcyBoaWdoLWxldmVsIHF1ZXJ5IG9wZXJhdGlvbnMgaW50byBwcmVkaWNhdGVzIHRoYXQgY2FuIGZpbHRlciBhbmQgc29ydFxuICogaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgYmVpbmcgcXVlcmllZFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5XG4gKiBAcGFyYW0ge1JhbUFkYXB0ZXJ9IGFkYXB0ZXIgLSBUaGUgUkFNIGFkYXB0ZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBleGVjdXRpbmcgcXVlcmllc1xuICogQGNsYXNzIFJhbVN0YXRlbWVudFxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHN0YXRlbWVudCBmb3IgcXVlcnlpbmcgVXNlciBtb2RlbHNcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBSYW1TdGF0ZW1lbnQ8VXNlciwgVXNlcj4ocmFtQWRhcHRlcik7XG4gKlxuICogLy8gQnVpbGQgYSBxdWVyeSB0byBmaW5kIGFjdGl2ZSB1c2VycyB3aXRoIGFnZSA+IDE4XG4gKiBjb25zdCByZXN1bHRzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYW5kKFxuICogICAgIENvbmRpdGlvbi5lcSgnYWN0aXZlJywgdHJ1ZSksXG4gKiAgICAgQ29uZGl0aW9uLmd0KCdhZ2UnLCAxOClcbiAqICAgKSlcbiAqICAgLm9yZGVyQnkoJ2xhc3ROYW1lJywgJ2FzYycpXG4gKiAgIC5saW1pdCgxMClcbiAqICAgLmV4ZWN1dGUoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmFtU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIFJhd1JhbVF1ZXJ5PE0+LFxuICBNLFxuICBSXG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogUmFtQWRhcHRlcikge1xuICAgIHN1cGVyKGFkYXB0ZXIgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNvcnQgY29tcGFyYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBtb2RlbCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlIG9yZGVyQnkgY3JpdGVyaWEuXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgZGlmZmVyZW50IGRhdGEgdHlwZXMgKHN0cmluZywgbnVtYmVyLCBkYXRlKSBhbmQgc29ydCBkaXJlY3Rpb25zIChhc2MsIGRlc2MpLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbihNb2RlbCwgTW9kZWwpOiBudW1iZXJ9IEEgY29tcGFyYXRvciBmdW5jdGlvbiBmb3Igc29ydGluZyBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0U29ydCgpIHtcbiAgICByZXR1cm4gKGVsMTogTW9kZWwsIGVsMjogTW9kZWwpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIFwib3JkZXJCeVNlbGVjdG9yIG5vdCBzZXQuIFNob3VsZCBiZSBpbXBvc3NpYmxlXCJcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5vcmRlckJ5U2VsZWN0b3I7XG4gICAgICBjb25zdCBba2V5LCBkaXJlY3Rpb25dID0gc2VsZWN0b3I7XG4gICAgICBjb25zdCB0eXBlID0gUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihlbDEsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgaWYgKCF0eXBlKVxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgdHlwZSBub3QgY29tcGF0aWJsZSB3aXRoIHNvcnRpbmc6ICR7dHlwZX1gKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmcpLmxvY2FsZUNvbXBhcmUoXG4gICAgICAgICAgICAgIGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyAxIDogLTEpICpcbiAgICAgICAgICAgICgoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBudW1iZXIpIC1cbiAgICAgICAgICAgICAgKGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgbnVtYmVyKSlcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgICAgIGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IFwiYXNjXCIgPyAxIDogLTEpICpcbiAgICAgICAgICAgICAgKChlbDFba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIERhdGUpLnZhbHVlT2YoKSAtXG4gICAgICAgICAgICAgICAgKGVsMltrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgRGF0ZSkudmFsdWVPZigpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihgU29ydGluZyBub3Qgc3VwcG9ydGVkIGZvciBub3QgZGF0ZSBjbGFzc2VzYCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYHNvcnRpbmcgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgUkFNIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3Mgc2VsZWN0b3JzIGFuZCBjb25kaXRpb25zIGludG8gYSBSYXdSYW1RdWVyeSBvYmplY3RcbiAgICogdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIFJBTSBhZGFwdGVyLiBUaGlzIG1ldGhvZCBhc3NlbWJsZXMgYWxsIHF1ZXJ5IGNvbXBvbmVudHNcbiAgICogKHNlbGVjdCwgZnJvbSwgd2hlcmUsIGxpbWl0LCBvZmZzZXQsIHNvcnQpIGludG8gdGhlIGZpbmFsIHF1ZXJ5IHN0cnVjdHVyZS5cbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IFRoZSBjb25zdHJ1Y3RlZCBSQU0gcXVlcnkgb2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGQoKTogUmF3UmFtUXVlcnk8TT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmF3UmFtUXVlcnk8TT4gPSB7XG4gICAgICBzZWxlY3Q6IHRoaXMuc2VsZWN0U2VsZWN0b3IsXG4gICAgICBmcm9tOiB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIHdoZXJlOiB0aGlzLndoZXJlQ29uZGl0aW9uXG4gICAgICAgID8gdGhpcy5wYXJzZUNvbmRpdGlvbih0aGlzLndoZXJlQ29uZGl0aW9uKS53aGVyZVxuICAgICAgICA6IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAoZWw6IE0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICBsaW1pdDogdGhpcy5saW1pdFNlbGVjdG9yLFxuICAgICAgc2tpcDogdGhpcy5vZmZzZXRTZWxlY3RvcixcbiAgICB9O1xuICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcikgcmVzdWx0LnNvcnQgPSB0aGlzLmdldFNvcnQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgcXVlcnlcbiAgICogQHN1bW1hcnkgQnVpbGRzIHRoZSBxdWVyeSBhbmQgd3JhcHMgaXQgaW4gYSBSYW1QYWdpbmF0b3IgdG8gZW5hYmxlIHBhZ2luYXRpb24gb2YgcmVzdWx0cy5cbiAgICogVGhpcyBhbGxvd3MgcmV0cmlldmluZyBsYXJnZSByZXN1bHQgc2V0cyBpbiBzbWFsbGVyIGNodW5rcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgcGFnZSBzaXplIChudW1iZXIgb2YgcmVzdWx0cyBwZXIgcGFnZSlcbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgUmF3UmFtUXVlcnk8TT4+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYWdpbmF0b3IgZm9yIHRoZSBxdWVyeVxuICAgKi9cbiAgYXN5bmMgcGFnaW5hdGUoc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgUmF3UmFtUXVlcnk8TT4+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5idWlsZCgpO1xuICAgICAgcmV0dXJuIG5ldyBSYW1QYWdpbmF0b3I8TSwgUj4oXG4gICAgICAgIHRoaXMuYWRhcHRlcixcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIFJBTSBxdWVyeSBwcmVkaWNhdGVcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBDb25kaXRpb24gb2JqZWN0IGludG8gYSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZFxuICAgKiB0byBmaWx0ZXIgbW9kZWwgaW5zdGFuY2VzIGluIG1lbW9yeS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIHNpbXBsZSBjb25kaXRpb25zXG4gICAqIChlcXVhbHMsIGdyZWF0ZXIgdGhhbiwgZXRjLikgYW5kIGNvbXBsZXggY29uZGl0aW9ucyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JzIChBTkQsIE9SKS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIGNvbmRpdGlvblxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxNPn0gY29uZGl0aW9uIC0gVGhlIGNvbmRpdGlvbiB0byBwYXJzZVxuICAgKiBAcmV0dXJuIHtSYXdSYW1RdWVyeTxNPn0gQSBSQU0gcXVlcnkgb2JqZWN0IHdpdGggYSB3aGVyZSBwcmVkaWNhdGUgZnVuY3Rpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgU2ltcGxlQ29uZGl0aW9uXG4gICAqICAgcGFydGljaXBhbnQgQ29tcGxleENvbmRpdGlvblxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29uZGl0aW9uKVxuICAgKiAgIGFsdCBTaW1wbGUgY29uZGl0aW9uIChlcSwgZ3QsIGx0LCBldGMuKVxuICAgKiAgICAgUmFtU3RhdGVtZW50LT4+U2ltcGxlQ29uZGl0aW9uOiBFeHRyYWN0IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvblxuICAgKiAgICAgU2ltcGxlQ29uZGl0aW9uLS0+PlJhbVN0YXRlbWVudDogUmV0dXJuIHByZWRpY2F0ZSBmdW5jdGlvblxuICAgKiAgIGVsc2UgTG9naWNhbCBvcGVyYXRvciAoQU5ELCBPUilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PkNvbXBsZXhDb25kaXRpb246IEV4dHJhY3QgbmVzdGVkIGNvbmRpdGlvbnNcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24obGVmdENvbmRpdGlvbilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlJhbVN0YXRlbWVudDogcGFyc2VDb25kaXRpb24ocmlnaHRDb25kaXRpb24pXG4gICAqICAgICBDb21wbGV4Q29uZGl0aW9uLS0+PlJhbVN0YXRlbWVudDogQ29tYmluZSBwcmVkaWNhdGVzIHdpdGggbG9naWNhbCBvcGVyYXRvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbVN0YXRlbWVudC0tPj5DYWxsZXI6IFJldHVybiBxdWVyeSB3aXRoIHdoZXJlIHByZWRpY2F0ZVxuICAgKi9cbiAgcGFyc2VDb25kaXRpb248TSBleHRlbmRzIE1vZGVsPihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2hlcmU6IChtOiBNb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFtHcm91cE9wZXJhdG9yLkFORCwgR3JvdXBPcGVyYXRvci5PUiwgT3BlcmF0b3IuTk9UXS5pbmRleE9mKFxuICAgICAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgICAgICkgPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPiBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5ESUZGRVJFTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRVFVQUw6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA9PT0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuUkVHRVhQOlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEludmFsaWQgcmVnZXhwIGNvbXBhcmlzb24gb24gYSBub24gc3RyaW5nIGF0dHJpYnV0ZTogJHttW2F0dHIxIGFzIGtleW9mIE1vZGVsXX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuICEhKG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5tYXRjaChcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGNvbXBhcmlzb24sIFwiZ1wiKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPCBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TTUFMTEVSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPD0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBzdGFuZGFyZCBjb21wYXJpc29uczogJHtvcGVyYXRvcn1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvcDE6IFJhd1JhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgYXR0cjEgYXMgQ29uZGl0aW9uPE0+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvcDI6IFJhd1JhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT5cbiAgICAgICAgICApO1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICAgIHJldHVybiBvcDEud2hlcmUobSkgJiYgb3AyLndoZXJlKG0pO1xuICAgICAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLk9SOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pIHx8IG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBBbmQvT3IgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IGFzIFJhd1JhbVF1ZXJ5PGFueT47XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udGV4dCBjbGFzcyBmb3IgUkFNIGFkYXB0ZXIgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzcGVjaWFsaXplZCBjb250ZXh0IGZvciBSQU0gYWRhcHRlciBvcGVyYXRpb25zLCBleHRlbmRpbmcgdGhlIGJhc2UgQ29udGV4dCB3aXRoIFJBTS1zcGVjaWZpYyBmbGFncy4gVGhpcyBjb250ZXh0IGlzIHVzZWQgdG8gcGFzcyBvcGVyYXRpb24gcGFyYW1ldGVycyBhbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAqIEBjbGFzcyBSYW1Db250ZXh0XG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IFJBTSBjb250ZXh0XG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IFJhbUNvbnRleHQoKTtcbiAqIC8vIE9wdGlvbmFsbHkgc2V0IGEgZmxhZ1xuICogY29udGV4dC5zZXQoJ1VVSUQnLCAnMTIzZTQ1NjctZTg5Yi0xMmQzLWE0NTYtNDI2NjE0MTc0MDAwJyk7XG4gKiAvLyBBY2Nlc3MgYSBmbGFnIGZyb20gdGhlIGNvbnRleHRcbiAqIGNvbnN0IHV1aWQgPSBjb250ZXh0LmdldCgnVVVJRCcpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBSYW1Db250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IEJhc2VDb250ZXh0IGFzIENvbnRleHRcbiAqICAgQ2FsbGVyLT4+UmFtQ29udGV4dDogbmV3IFJhbUNvbnRleHQoKVxuICogICBSYW1Db250ZXh0LT4+QmFzZUNvbnRleHQ6IHN1cGVyKClcbiAqICAgUmFtQ29udGV4dC0tPj5DYWxsZXI6IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1Db250ZXh0IGV4dGVuZHMgQ29udGV4dDxSYW1GbGFncz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQmFzZU1vZGVsLCBpbmRleCwgdGFibGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxcIjtcbmltcG9ydCB7IHBrIH0gZnJvbSBcIi4uLy4uL2lkZW50aXR5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTSBzZXF1ZW5jZSBtb2RlbCBmb3IgYXV0by1pbmNyZW1lbnRpbmcgdmFsdWVzXG4gKiBAc3VtbWFyeSBBIG1vZGVsIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNlcXVlbmNlIGluIHRoZSBSQU0gYWRhcHRlci4gSXQgc3RvcmVzIHRoZSBjdXJyZW50IHZhbHVlXG4gKiBvZiBhIHNlcXVlbmNlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCBpZGVudGlmaWVycyBmb3IgZW50aXRpZXMuXG4gKiBUaGUgc2VxdWVuY2UgaXMgaWRlbnRpZmllZCBieSBpdHMgSUQgYW5kIG1haW50YWlucyB0aGUgY3VycmVudCB2YWx1ZS5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8U2VxdWVuY2U+fSBzZXEgLSBJbml0aWFsIHNlcXVlbmNlIGRhdGFcbiAqIEBjbGFzcyBTZXF1ZW5jZVxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBzZXF1ZW5jZVxuICogY29uc3Qgb3JkZXJTZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZSh7IGlkOiAnb3JkZXJfc2VxJywgY3VycmVudDogMSB9KTtcbiAqXG4gKiAvLyBVc2UgdGhlIHNlcXVlbmNlIHRvIGdldCB0aGUgbmV4dCB2YWx1ZVxuICogY29uc3QgbmV4dE9yZGVySWQgPSBwYXJzZUludChvcmRlclNlcXVlbmNlLmN1cnJlbnQudG9TdHJpbmcoKSkgKyAxO1xuICogb3JkZXJTZXF1ZW5jZS5jdXJyZW50ID0gbmV4dE9yZGVySWQ7XG4gKiBgYGBcbiAqL1xuQHRhYmxlKFwiX19SYW1TZXF1ZW5jZVwiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSYW1TZXF1ZW5jZU1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogVXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV4dCBzZXF1ZW50aWFsIHZhbHVlXG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBjdXJyZW50ITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlcT86IE1vZGVsQXJnPFJhbVNlcXVlbmNlTW9kZWw+KSB7XG4gICAgc3VwZXIoc2VxKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmFtU2VxdWVuY2VNb2RlbCB9IGZyb20gXCIuL21vZGVsL1JhbVNlcXVlbmNlTW9kZWxcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSQU0tc3BlY2lmaWMgc2VxdWVuY2UgaW1wbGVtZW50YXRpb25cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgdGhlIGJhc2UgU2VxdWVuY2UgY2xhc3MgdG8gcHJvdmlkZSBhdXRvLWluY3JlbWVudGluZyBzZXF1ZW5jZSBmdW5jdGlvbmFsaXR5XG4gKiBmb3IgdGhlIFJBTSBhZGFwdGVyLiBUaGlzIGNsYXNzIG1hbmFnZXMgc2VxdWVuY2VzIHN0b3JlZCBpbiBtZW1vcnksIGFsbG93aW5nIGZvciB0aGUgZ2VuZXJhdGlvblxuICogb2Ygc2VxdWVudGlhbCBpZGVudGlmaWVycyBmb3IgZW50aXRpZXMuXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gKiBAcGFyYW0ge1JhbUFkYXB0ZXJ9IGFkYXB0ZXIgLSBUaGUgUkFNIGFkYXB0ZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBzdG9yYWdlXG4gKiBAY2xhc3MgUmFtU2VxdWVuY2VcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgbnVtZXJpYyBzZXF1ZW5jZSBzdGFydGluZyBhdCAxXG4gKiBjb25zdCBzZXF1ZW5jZSA9IG5ldyBSYW1TZXF1ZW5jZSh7XG4gKiAgIG5hbWU6ICdvcmRlcl9zZXF1ZW5jZScsXG4gKiAgIHR5cGU6ICdOdW1iZXInLFxuICogICBzdGFydFdpdGg6IDEsXG4gKiAgIGluY3JlbWVudEJ5OiAxXG4gKiB9LCByYW1BZGFwdGVyKTtcbiAqXG4gKiAvLyBHZXQgdGhlIG5leHQgdmFsdWUgaW4gdGhlIHNlcXVlbmNlXG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXF1ZW5jZS5uZXh0KCk7XG4gKlxuICogLy8gR2V0IGEgcmFuZ2Ugb2YgdmFsdWVzXG4gKiBjb25zdCBpZFJhbmdlID0gYXdhaXQgc2VxdWVuY2UucmFuZ2UoNSk7IC8vIFJldHVybnMgNSBzZXF1ZW50aWFsIHZhbHVlc1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1TZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgcHJvdGVjdGVkIHJlcG86IFJlcG88UmFtU2VxdWVuY2VNb2RlbD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogU2VxdWVuY2VPcHRpb25zLCBhZGFwdGVyOiBSYW1BZGFwdGVyKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5yZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChSYW1TZXF1ZW5jZU1vZGVsLCBhZGFwdGVyLmFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZVxuICAgKiBAc3VtbWFyeSBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZSBmcm9tIHN0b3JhZ2UuIElmIHRoZSBzZXF1ZW5jZVxuICAgKiBkb2Vzbid0IGV4aXN0IHlldCwgaXQgcmV0dXJucyB0aGUgY29uZmlndXJlZCBzdGFydGluZyB2YWx1ZS5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCBzZXF1ZW5jZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcXVlbmNlOiBSYW1TZXF1ZW5jZU1vZGVsID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQobmFtZSBhcyBzdHJpbmcpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxdWVuY2UuY3VycmVudCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnRXaXRoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgXCJTdGFydGluZyB2YWx1ZSBpcyBub3QgZGVmaW5lZCBmb3IgYSBub24gZXhpc3Rpbmcgc2VxdWVuY2VcIlxuICAgICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc3RhcnRXaXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGluaXRpYWwgdmFsdWUgZm9yIHNlcXVlbmNlICR7c3RhcnRXaXRofTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSBjdXJyZW50IHZhbHVlIGZvciBzZXF1ZW5jZSAke25hbWV9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIHZhbHVlIGFjY29yZGluZyB0byB0aGUgc2VxdWVuY2UgdHlwZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgc2VxdWVuY2UgKHN0cmluZywgbnVtYmVyLCBvciBiaWdpbnQpXG4gICAqIHVzaW5nIHRoZSBiYXNlIFNlcXVlbmNlIGNsYXNzJ3MgcGFyc2VWYWx1ZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwYXJzZVxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IFRoZSBwYXJzZWQgdmFsdWUgaW4gdGhlIGNvcnJlY3QgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSB2YWx1ZVxuICAgKiBAc3VtbWFyeSBJbmNyZWFzZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgdmFsdWUgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQgYW5kIHBlcnNpc3RzXG4gICAqIHRoZSBuZXcgdmFsdWUgdG8gc3RvcmFnZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIG51bWVyaWMgYW5kIEJpZ0ludCBzZXF1ZW5jZSB0eXBlcy5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudF0gLSBPcHRpb25hbCBhbW91bnQgdG8gaW5jcmVtZW50IGJ5LCBkZWZhdWx0cyB0byB0aGUgc2VxdWVuY2UncyBpbmNyZW1lbnRCeSB2YWx1ZVxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgc2VxdWVuY2UgdmFsdWUgYWZ0ZXIgaW5jcmVtZW50aW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgbGV0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICBjb25zdCB0b0luY3JlbWVudEJ5ID0gY291bnQgfHwgaW5jcmVtZW50Qnk7XG4gICAgaWYgKHRvSW5jcmVtZW50QnkgJSBpbmNyZW1lbnRCeSAhPT0gMClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVmFsdWUgdG8gaW5jcmVtZW50IGRvZXMgbm90IGNvbnNpZGVyIHRoZSBpbmNyZW1lbnRCeSBzZXR0aW5nOiAke2luY3JlbWVudEJ5fWBcbiAgICAgICk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBudW1iZXIpICsgdG9JbmNyZW1lbnRCeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgIG5leHQgPSAodGhpcy5wYXJzZShjdXJyZW50KSBhcyBiaWdpbnQpICsgQmlnSW50KHRvSW5jcmVtZW50QnkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiU2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICB9XG4gICAgbGV0IHNlcTogUmFtU2VxdWVuY2VNb2RlbDtcbiAgICBjb25zdCByZXBvID0gdGhpcy5yZXBvLm92ZXJyaWRlKHtcbiAgICAgIGlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllczogW1widXBkYXRlZE9uXCJdLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBzZXEgPSBhd2FpdCByZXBvLnVwZGF0ZShuZXcgUmFtU2VxdWVuY2VNb2RlbCh7IGlkOiBuYW1lLCBjdXJyZW50OiBuZXh0IH0pKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgc2VxID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFJhbVNlcXVlbmNlTW9kZWwoeyBpZDogbmFtZSwgY3VycmVudDogbmV4dCB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcS5jdXJyZW50IGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZXF1ZW5jZSBhbmQgaW5jcmVtZW50cyBpdCBieSB0aGVcbiAgICogY29uZmlndXJlZCBpbmNyZW1lbnQgYW1vdW50LiBUaGlzIGlzIHRoZSBtYWluIG1ldGhvZCB1c2VkIHRvIGdldCBhIG5ldyBzZXF1ZW50aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBzZXF1ZW5jZVxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgdmFsdWVzXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VxdWVudGlhbCB2YWx1ZXMgZnJvbSB0aGUgc2VxdWVuY2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gYWxsb2NhdGUgbXVsdGlwbGUgSURzIGF0IG9uY2UuXG4gICAqIFRoZSBtZXRob2QgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgYnkgdGhlIHRvdGFsIGFtb3VudCBuZWVkZWQgYW5kIHJldHVybnMgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2Ygc2VxdWVudGlhbCB2YWx1ZXMgdG8gZ2VuZXJhdGVcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBzZXF1ZW50aWFsIHZhbHVlc1xuICAgKi9cbiAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhaXQgdGhpcy5jdXJyZW50KCkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBpbmNyZW1lbnRCeSA9IHRoaXMucGFyc2UoXG4gICAgICB0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkgYXMgbnVtYmVyXG4gICAgKSBhcyBudW1iZXI7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50ID0gYXdhaXQgdGhpcy5pbmNyZW1lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgKHRoaXMucGFyc2UoY291bnQpIGFzIG51bWJlcikgKiBpbmNyZW1lbnRCeVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2U6IChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IGNvdW50OyBpKyspIHtcbiAgICAgIHJhbmdlLnB1c2goY3VycmVudCArIGluY3JlbWVudEJ5ICogKHRoaXMucGFyc2UoaSkgYXMgbnVtYmVyKSk7XG4gICAgfVxuICAgIGlmIChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSAhPT0gbmV4dClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzY2FsY3VsYXRpb24gb2YgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG8gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWxcIjtcbmltcG9ydCB7IFJhbUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRlZCBieSBmaWVsZCBvbiBhIG1vZGVsIGR1cmluZyBSQU0gY3JlYXRlL3VwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyBhIG1vZGVsIGZpZWxkIHdpdGggdGhlIFVVSUQgZnJvbSB0aGUgY29udGV4dCBkdXJpbmcgY3JlYXRlIG9yIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgaGFuZGxlciBmb3IgUkFNIG9wZXJhdGlvbnMgdG8gdHJhY2sgZW50aXR5IGNyZWF0aW9uLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyBjcmVhdGVkL3VwZGF0ZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBvZiB0aGUgcmVwb3NpdG9yeSBoYW5kbGluZyB0aGUgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgb2YgdGhlIFJBTSBmbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIG9mIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgdXNlciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHdpdGggdGhlIFVVSURcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZC91cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWVsZCBoYXMgYmVlbiBzZXRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmFtRmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgaWYgKCF1dWlkKVxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgICApO1xuICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gSWRlbnRpZmllciBmb3IgdGhlIFJBTSBhZGFwdGVyXG4gKiBAc3VtbWFyeSBBIGNvbnN0YW50IHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIFJBTSBhZGFwdGVyIGluIHRoZSBzeXN0ZW0uIFVzZWQgZm9yIGFkYXB0ZXIgdHlwZSBpZGVudGlmaWNhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBhY3Jvc3MgdGhlIGNvcmUgbW9kdWxlLlxuICogQGNvbnN0IFJhbUZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQGNhdGVnb3J5IFJhbVxuICovXG5leHBvcnQgY29uc3QgUmFtRmxhdm91ciA9IFwicmFtXCI7XG4iLCJpbXBvcnQge1xuICBSYW1GbGFncyxcbiAgUmF3UmFtUXVlcnksXG4gIFJhbVN0b3JhZ2UsXG4gIFJhbVJlcG9zaXRvcnksXG4gIFJhbUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJhbVN0YXRlbWVudCB9IGZyb20gXCIuL1JhbVN0YXRlbWVudFwiO1xuaW1wb3J0IHsgUmFtQ29udGV4dCB9IGZyb20gXCIuL1JhbUNvbnRleHRcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZUtleXMsIFNlcXVlbmNlIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTG9jayB9IGZyb20gXCJAZGVjYWYtdHMvdHJhbnNhY3Rpb25hbC1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgaGFzaE9iaixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbVNlcXVlbmNlIH0gZnJvbSBcIi4vUmFtU2VxdWVuY2VcIjtcbmltcG9ydCB7IGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlIH0gZnJvbSBcIi4vaGFuZGxlcnNcIjtcbmltcG9ydCB7IFJhbUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuQWRhcHRlci5zZXRDdXJyZW50KFJhbUZsYXZvdXIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbi1tZW1vcnkgYWRhcHRlciBmb3IgZGF0YSBwZXJzaXN0ZW5jZVxuICogQHN1bW1hcnkgVGhlIFJhbUFkYXB0ZXIgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBwZXJzaXN0ZW5jZSBsYXllci5cbiAqIEl0IHN0b3JlcyBkYXRhIGluIEphdmFTY3JpcHQgTWFwcyBhbmQgcHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBxdWVyeSBjYXBhYmlsaXRpZXMuXG4gKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZnVsIGZvciB0ZXN0aW5nLCBwcm90b3R5cGluZywgYW5kIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHJlcXVpcmVcbiAqIHBlcnNpc3RlbnQgc3RvcmFnZSBhY3Jvc3MgYXBwbGljYXRpb24gcmVzdGFydHMuXG4gKiBAY2xhc3MgUmFtQWRhcHRlclxuICogQGNhdGVnb3J5IFJhbVxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBSQU0gYWRhcHRlclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBSYW1BZGFwdGVyKCdteVJhbUFkYXB0ZXInKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSByZXBvc2l0b3J5IGZvciBhIG1vZGVsXG4gKiBjb25zdCB1c2VyUmVwbyA9IG5ldyAoYWRhcHRlci5yZXBvc2l0b3J5PFVzZXI+KCkpKFVzZXIsIGFkYXB0ZXIpO1xuICpcbiAqIC8vIFBlcmZvcm0gQ1JVRCBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBhd2FpdCB1c2VyUmVwby5jcmVhdGUodXNlcik7XG4gKiBjb25zdCByZXRyaWV2ZWRVc2VyID0gYXdhaXQgdXNlclJlcG8uZmluZEJ5SWQodXNlci5pZCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gKlxuICogICBDbGllbnQtPj5SZXBvc2l0b3J5OiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG9zaXRvcnktPj5SYW1BZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KGlkLCBtb2RlbClcbiAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gKiAgIFJhbUFkYXB0ZXItLT4+UmVwb3NpdG9yeTogbW9kZWxcbiAqICAgUmVwb3NpdG9yeS0tPj5DbGllbnQ6IG1vZGVsXG4gKlxuICogICBDbGllbnQtPj5SZXBvc2l0b3J5OiBmaW5kQnlJZChpZClcbiAqICAgUmVwb3NpdG9yeS0+PlJhbUFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGdldChpZClcbiAqICAgU3RvcmFnZS0tPj5SYW1BZGFwdGVyOiBtb2RlbFxuICogICBSYW1BZGFwdGVyLS0+PlJlcG9zaXRvcnk6IG1vZGVsXG4gKiAgIFJlcG9zaXRvcnktLT4+Q2xpZW50OiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmFtQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIFJhbUNvbmZpZyxcbiAgUmFtU3RvcmFnZSxcbiAgUmF3UmFtUXVlcnk8YW55PixcbiAgUmFtRmxhZ3MsXG4gIFJhbUNvbnRleHRcbj4ge1xuICBjb25zdHJ1Y3Rvcihjb25mOiBSYW1Db25maWcgPSB7fSBhcyBhbnksIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoY29uZiwgUmFtRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgcmVwb3NpdG9yaWVzIHRoYXQgd29yayB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZWwgdHlwZS5cbiAgICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgUkFNLXNwZWNpZmljIHJlcG9zaXRvcnkgZnVuY3Rpb25hbGl0eS5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHJlcG9zaXRvcnlcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj59IEEgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIFJBTSByZXBvc2l0b3JpZXNcbiAgICovXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSYW1SZXBvc2l0b3J5PE0+XG4gID4ge1xuICAgIHJldHVybiBzdXBlci5yZXBvc2l0b3J5PE0+KCkgYXMgQ29uc3RydWN0b3I8UmFtUmVwb3NpdG9yeTxNPj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3BlcmF0aW9uIGZsYWdzIHdpdGggVVVJRFxuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGZsYWdzIHdpdGggYSBVVUlEIGZvciB1c2VyIGlkZW50aWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgYWxsIG9wZXJhdGlvbnMgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0cmFja2luZyBwdXJwb3Nlcy5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPFJhbUZsYWdzPn0gZmxhZ3MgLSBQYXJ0aWFsIGZsYWdzIHRvIGJlIGV4dGVuZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmFtRmxhZ3M+fSBDb21wbGV0ZSBmbGFncyB3aXRoIFVVSURcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxSYW1GbGFncz5cbiAgKTogUHJvbWlzZTxSYW1GbGFncz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgVVVJRDogdGhpcy5jb25maWcudXNlciB8fCBcIlwiICsgRGF0ZS5ub3coKSxcbiAgICB9KSBhcyBSYW1GbGFncztcbiAgfVxuXG4gIG92ZXJyaWRlIENvbnRleHQgPSBSYW1Db250ZXh0O1xuXG4gIHByaXZhdGUgaW5kZXhlczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICA+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2NrID0gbmV3IExvY2soKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGV4ZXMgbW9kZWxzIGluIHRoZSBSQU0gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBBIG5vLW9wIGluZGV4aW5nIG1ldGhvZCBmb3IgdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBTaW5jZSBSQU0gYWRhcHRlciBkb2Vzbid0IHJlcXVpcmUgZXhwbGljaXQgaW5kZXhpbmcsIHRoaXMgbWV0aG9kIHNpbXBseSByZXNvbHZlcyBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIG1vZGVscyAtIE1vZGVscyB0byBiZSBpbmRleGVkICh1bnVzZWQpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbmRleGluZyBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbmRleCguLi5tb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgbW9kZWwgaW5zdGFuY2UgdG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIHN0b3JhZ2UgaW4gdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNyZWF0ZXMgYSByZWNvcmQgd2l0aG91dCB0aGUgcHJpbWFyeSBrZXkgZmllbGQuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgYmVpbmcgcHJlcGFyZWRcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlY29yZCBhbmQgSURcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTVxuICApOiB7IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjsgaWQ6IHN0cmluZyB9IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHN1cGVyLnByZXBhcmUobW9kZWwsIHBrKTtcbiAgICBkZWxldGUgcHJlcGFyZWQucmVjb3JkW3BrIGFzIHN0cmluZ107XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0b3JlZCByZWNvcmQgYmFjayB0byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gYSBzdG9yZWQgcmVjb3JkIGJ5IGFkZGluZyBiYWNrIHRoZSBwcmltYXJ5IGtleS5cbiAgICogVGhpcyBtZXRob2QgaXMgdGhlIGludmVyc2Ugb2YgdGhlIHByZXBhcmUgbWV0aG9kLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRvIHJldmVydCB0b1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzdG9yZWQgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlXG4gICAqIEByZXR1cm4ge019IFRoZSByZWNvbnN0cnVjdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBvdmVycmlkZSByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogTSB7XG4gICAgY29uc3QgcmVzID0gc3VwZXIucmV2ZXJ0KG9iaiwgY2xhenosIHBrLCBpZCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyByZWNvcmQgaW4gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhIG5ldyByZWNvcmQgaW4gdGhlIHNwZWNpZmllZCB0YWJsZSB3aXRoIHRoZSBnaXZlbiBJRC5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjcmVhdGVzIHRoZSB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LFxuICAgKiBjaGVja3MgZm9yIGNvbmZsaWN0cywgYW5kIHN0b3JlcyB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gc3RvcmUgdGhlIHJlY29yZCBpblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YSB0byBzdG9yZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgc3RvcmVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldCh0YWJsZU5hbWUsIG5ldyBNYXAoKSlcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgQ29uZmxpY3RFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQoaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiBtb2RlbFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLmFjcXVpcmUoKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50Lmhhcyh0YWJsZU5hbWUpKSB0aGlzLmNsaWVudC5zZXQodGFibGVOYW1lLCBuZXcgTWFwKCkpO1xuICAgIGlmICh0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKSAmJiB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uaGFzKGlkKSlcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gYWxyZWFkeSBleGlzdHMgaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uc2V0KGlkLCBtb2RlbCk7XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlY29yZCBmcm9tIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGdpdmVuIHRhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QgYW5kIHRocm93cyBhcHByb3ByaWF0ZSBlcnJvcnMgaWYgbm90LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJldHJpZXZlIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiByZWFkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGdldChpZClcbiAgICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IHJlY29yZFxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZWNvcmRcbiAgICovXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuY2xpZW50Lmhhcyh0YWJsZU5hbWUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW4gZXhpc3RpbmcgcmVjb3JkIGluIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0LFxuICAgKiBhbmQgdXBkYXRlcyB0aGUgcmVjb3JkIHdpdGggdGhlIG5ldyBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBuZXcgcmVjb3JkIGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgTm90Rm91bmRFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQoaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLnJlbGVhc2UoKVxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiBtb2RlbFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLmFjcXVpcmUoKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50Lmhhcyh0YWJsZU5hbWUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICB0aGlzLmNsaWVudC5nZXQodGFibGVOYW1lKT8uc2V0KGlkLCBtb2RlbCk7XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZWNvcmQgZnJvbSB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgZ2l2ZW4gdGFibGUuXG4gICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIGEgbG9jayB0byBlbnN1cmUgdGhyZWFkIHNhZmV0eSwgY2hlY2tzIGlmIHRoZSB0YWJsZSBhbmQgcmVjb3JkIGV4aXN0LFxuICAgKiByZXRyaWV2ZXMgdGhlIHJlY29yZCBiZWZvcmUgZGVsZXRpb24sIGFuZCB0aGVuIHJlbW92ZXMgaXQgZnJvbSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogZGVsZXRlKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGdldChpZClcbiAgICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IHJlY29yZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBkZWxldGUoaWQpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlY29yZFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLmFjcXVpcmUoKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50Lmhhcyh0YWJsZU5hbWUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIXRoaXMuY2xpZW50LmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCBuYXRpdmVkID0gdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmdldChpZCk7XG4gICAgdGhpcy5jbGllbnQuZ2V0KHRhYmxlTmFtZSk/LmRlbGV0ZShpZCk7XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbmF0aXZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBvciBjcmVhdGVzIGEgdGFibGUgaW4gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgTWFwIHJlcHJlc2VudGluZyBhIHRhYmxlIGZvciBhIGdpdmVuIG1vZGVsIG9yIHRhYmxlIG5hbWUuXG4gICAqIElmIHRoZSB0YWJsZSBkb2Vzbid0IGV4aXN0LCBpdCBjcmVhdGVzIGEgbmV3IG9uZS4gVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdXNlZFxuICAgKiBieSBvdGhlciBtZXRob2RzIHRvIGFjY2VzcyB0aGUgY29ycmVjdCBzdG9yYWdlIGxvY2F0aW9uLlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPn0gZnJvbSAtIFRoZSBtb2RlbCBjbGFzcyBvciB0YWJsZSBuYW1lXG4gICAqIEByZXR1cm4ge01hcDxzdHJpbmcgfCBudW1iZXIsIGFueT4gfCB1bmRlZmluZWR9IFRoZSB0YWJsZSBNYXAgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdGFibGVGb3I8TSBleHRlbmRzIE1vZGVsPihmcm9tOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPikge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gXCJzdHJpbmdcIikgZnJvbSA9IE1vZGVsLmdldChmcm9tKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbiAgICBjb25zdCB0YWJsZSA9IFJlcG9zaXRvcnkudGFibGUoZnJvbSk7XG4gICAgaWYgKCF0aGlzLmNsaWVudC5oYXModGFibGUpKSB0aGlzLmNsaWVudC5zZXQodGFibGUsIG5ldyBNYXAoKSk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldCh0YWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgcXVlcnkgb3BlcmF0aW9uIG9uIHRoZSBpbi1tZW1vcnkgZGF0YSBzdG9yZSB1c2luZyB0aGUgcHJvdmlkZWQgcXVlcnkgc3BlY2lmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgZmlsdGVyaW5nLCBzb3J0aW5nLCBwYWdpbmF0aW9uLCBhbmQgZmllbGQgc2VsZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtSYXdSYW1RdWVyeTxhbnk+fSByYXdJbnB1dCAtIFRoZSBxdWVyeSBzcGVjaWZpY2F0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogcmF3KHJhd0lucHV0KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiB0YWJsZUZvcihmcm9tKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBmaW5kUHJpbWFyeUtleShuZXcgZnJvbSgpKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBlbnRyaWVzKClcbiAgICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IGVudHJpZXNcbiAgICogICBsb29wIEZvciBlYWNoIGVudHJ5XG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmV2ZXJ0KHIsIGZyb20sIGlkLCBwaylcbiAgICogICBlbmRcbiAgICogICBhbHQgV2hlcmUgY29uZGl0aW9uIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5maWx0ZXIod2hlcmUpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNvcnQgY29uZGl0aW9uIGV4aXN0c1xuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zb3J0KHNvcnQpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IFNraXAgc3BlY2lmaWVkXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNsaWNlKHNraXApXG4gICAqICAgZW5kXG4gICAqICAgYWx0IExpbWl0IHNwZWNpZmllZFxuICAgKiAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHJlc3VsdC5zbGljZSgwLCBsaW1pdClcbiAgICogICBlbmRcbiAgICogICBhbHQgU2VsZWN0IGZpZWxkcyBzcGVjaWZpZWRcbiAgICogICAgIGxvb3AgRm9yIGVhY2ggcmVzdWx0XG4gICAqICAgICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBGaWx0ZXIgdG8gc2VsZWN0ZWQgZmllbGRzXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVzdWx0XG4gICAqL1xuICBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFJhd1JhbVF1ZXJ5PGFueT4pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IHdoZXJlLCBzb3J0LCBsaW1pdCwgc2tpcCwgZnJvbSB9ID0gcmF3SW5wdXQ7XG4gICAgbGV0IHsgc2VsZWN0IH0gPSByYXdJbnB1dDtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gdGhpcy50YWJsZUZvcihmcm9tKTtcbiAgICBpZiAoIWNvbGxlY3Rpb24pXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVGFibGUgJHtmcm9tfSBub3QgZm91bmQgaW4gUmFtQWRhcHRlcmApO1xuICAgIGNvbnN0IHsgaWQsIHByb3BzIH0gPSBmaW5kUHJpbWFyeUtleShuZXcgZnJvbSgpKTtcblxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gQXJyYXkuZnJvbShjb2xsZWN0aW9uLmVudHJpZXMoKSkubWFwKChbcGssIHJdKSA9PlxuICAgICAgdGhpcy5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIGZyb20sXG4gICAgICAgIGlkIGFzIGFueSxcbiAgICAgICAgU2VxdWVuY2UucGFyc2VWYWx1ZShwcm9wcy50eXBlIGFzIGFueSwgcGsgYXMgc3RyaW5nKSBhcyBzdHJpbmdcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmVzdWx0ID0gd2hlcmUgPyByZXN1bHQuZmlsdGVyKHdoZXJlKSA6IHJlc3VsdDtcblxuICAgIGlmIChzb3J0KSByZXN1bHQgPSByZXN1bHQuc29ydChzb3J0KTtcblxuICAgIGlmIChza2lwKSByZXN1bHQgPSByZXN1bHQuc2xpY2Uoc2tpcCk7XG4gICAgaWYgKGxpbWl0KSByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbGltaXQpO1xuXG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgc2VsZWN0ID0gQXJyYXkuaXNBcnJheShzZWxlY3QpID8gc2VsZWN0IDogW3NlbGVjdF07XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChyKSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyKS5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgIGlmICgoc2VsZWN0IGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhrZXkpKSBhY2Nba2V5XSA9IHZhbDtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIFI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbmQgY29udmVydHMgZXJyb3JzIHRvIGFwcHJvcHJpYXRlIHR5cGVzXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhhdCBlcnJvcnMgYXJlIG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmcuXG4gICAqIElmIHRoZSBlcnJvciBpcyBhbHJlYWR5IGEgQmFzZUVycm9yLCBpdCdzIHJldHVybmVkIGFzIGlzOyBvdGhlcndpc2UsIGl0J3Mgd3JhcHBlZCBpbiBhbiBJbnRlcm5hbEVycm9yLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSBleHBlY3RlZCBlcnJvciB0eXBlLCBleHRlbmRpbmcgQmFzZUVycm9yXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcmV0dXJuIHtWfSBUaGUgcGFyc2VkIGVycm9yIG9mIHRoZSBleHBlY3RlZCB0eXBlXG4gICAqL1xuICBwYXJzZUVycm9yPFYgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IpOiBWIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIFY7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgcXVlcmllc1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUmFtU3RhdGVtZW50IGluc3RhbmNlIGZvciBidWlsZGluZyBxdWVyaWVzLlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgZm9yIGZsdWVudCBxdWVyeSBjb25zdHJ1Y3Rpb24gYWdhaW5zdCB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBzdGF0ZW1lbnRcbiAgICogQHJldHVybiB7UmFtU3RhdGVtZW50PE0sIGFueT59IEEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGluc3RhbmNlXG4gICAqL1xuICBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PigpOiBSYW1TdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBSYW1TdGF0ZW1lbnQ8TSwgYW55Pih0aGlzIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc2VxdWVuY2UgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCBJRHNcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFJhbVNlcXVlbmNlIGluc3RhbmNlIGZvciBJRCBnZW5lcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHdheSB0byBjcmVhdGUgYXV0by1pbmNyZW1lbnRpbmcgc2VxdWVuY2VzIGZvciBlbnRpdHkgSURzLlxuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2VxdWVuY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBSYW1TZXF1ZW5jZShvcHRpb25zLCB0aGlzKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZm9yKGNvbmZpZzogUGFydGlhbDxSYW1Db25maWc+LCAuLi5hcmdzOiBhbnlbXSk6IHR5cGVvZiB0aGlzIHtcbiAgICBpZiAoIXRoaXMucHJveGllcykgdGhpcy5wcm94aWVzID0ge307XG4gICAgY29uc3Qga2V5ID0gYCR7dGhpcy5hbGlhc30gLSAke2hhc2hPYmooY29uZmlnKX1gO1xuICAgIGlmIChrZXkgaW4gdGhpcy5wcm94aWVzKSByZXR1cm4gdGhpcy5wcm94aWVzW2tleV0gYXMgdHlwZW9mIHRoaXM7XG5cbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NvbmZpZ1wiKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb25mOiBSYW1Db25maWcgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgUkFNLXNwZWNpZmljIGRlY29yYXRpb25zIGZvciBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdGlvbnMgZm9yIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGZpZWxkcyBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIHNldCB1cCBoYW5kbGVycyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAgICogcG9wdWxhdGUgdGhlc2UgZmllbGRzIHdpdGggdGhlIGN1cnJlbnQgdXNlcidzIFVVSUQgZHVyaW5nIGNyZWF0ZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEZWNvcmF0aW9uXG4gICAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5SZXBvc2l0b3J5OiBrZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpXG4gICAqICAgUmVwb3NpdG9yeS0tPj5SYW1BZGFwdGVyOiBjcmVhdGVkQnlLZXlcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogdXBkYXRlZEJ5S2V5XG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcihjcmVhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAqICAgRGVjb3JhdGlvbi0tPj5SYW1BZGFwdGVyOiBEZWNvcmF0b3JCdWlsZGVyXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgUmFtQWRhcHRlci0+PkRlY29yYXRpb246IGRlZmluZShvbkNyZWF0ZSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBhcHBseSgpXG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgZGVjb3JhdGlvbigpOiB2b2lkIHtcbiAgICBzdXBlci5kZWNvcmF0aW9uKCk7XG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRDbGllbnQoKTogUmFtU3RvcmFnZSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoKTtcbiAgfVxufVxuXG5SYW1BZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChSYW1GbGF2b3VyKTtcbiIsIi8qKlxuICogQG1vZHVsZSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gQ29yZSBtb2R1bGUgZm9yIHRoZSBEZWNhZiBUeXBlU2NyaXB0IGZyYW1ld29ya1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb25hbCBjb21wb25lbnRzIG9mIHRoZSBEZWNhZiBmcmFtZXdvcmssIGluY2x1ZGluZyBpZGVudGl0eSBtYW5hZ2VtZW50LFxuICogbW9kZWwgZGVmaW5pdGlvbnMsIHJlcG9zaXRvcnkgcGF0dGVybnMsIHBlcnNpc3RlbmNlIGxheWVyLCBxdWVyeSBidWlsZGluZywgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLlxuICogSXQgZXhwb3J0cyBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCBzZXRzIHVwIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5IGZvciByZXBvc2l0b3J5IGRlY29yYXRvcnMuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZXNSZWdpc3RyeSB9IGZyb20gXCIuL3JlcG9zaXRvcnkvaW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcblxuLy8gb3ZlcnJpZGVzIHRoZSBwcmV2aW91cyBJbmplY3RhYmxlcyByZWdpc3RyeSB0byBlbmFibGUgdGhlIEByZXBvc2l0b3J5IGRlY29yYXRvclxuSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVzUmVnaXN0cnkoKSk7XG5cbi8vIGltcG9ydGVkIGZpcnN0IG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL3JlcG9zaXRvcnlcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9xdWVyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JhbS9SYW1BZGFwdGVyXCI7XG4vL2xlZnQgdG8gbGFzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9wZXJzaXN0ZW5jZVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAc3VtbWFyeSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIlBlcnNpc3RlbmNlS2V5cyIsIkJhZFJlcXVlc3RFcnJvciIsIkludGVybmFsRXJyb3IiLCJNb2RlbCIsIlJlcG9zaXRvcnkiLCJEZWNvcmF0aW9uIiwiRGVmYXVsdEZsYXZvdXIiLCJMb2dnZWRDbGFzcyIsIkNvbnRleHQiLCJEZWZhdWx0UmVwb3NpdG9yeUZsYWdzIiwiT3BlcmF0aW9uS2V5cyIsIm1vZGVsVG9UcmFuc2llbnQiLCJSZXBvIiwiREJLZXlzIiwiaGFzaE9iaiIsIl9fZGVjb3JhdGUiLCJPcmRlckRpcmVjdGlvbiIsIkNhc2NhZGUiLCJMb2dnaW5nIiwiYXBwbHkiLCJtZXRhZGF0YSIsIlJlcCIsIndyYXBNZXRob2RXaXRoQ29udGV4dCIsImVuZm9yY2VEQkRlY29yYXRvcnMiLCJWYWxpZGF0aW9uRXJyb3IiLCJEZWZhdWx0U2VwYXJhdG9yIiwiZmluZFByaW1hcnlLZXkiLCJSZWZsZWN0aW9uIiwic2YiLCJJbmplY3RhYmxlUmVnaXN0cnlJbXAiLCJJbmplY3RhYmxlcyIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsImluamVjdCIsIk1vZGVsS2V5cyIsImluamVjdGFibGUiLCJPcGVyYXRvciIsIkdyb3VwT3BlcmF0b3IiLCJyZXF1aXJlZCIsIk5vdEZvdW5kRXJyb3IiLCJWYWxpZGF0aW9uIiwiVmFsaWRhdGlvbktleXMiLCJwcm9wTWV0YWRhdGEiLCJDb25mbGljdEVycm9yIiwib25DcmVhdGVVcGRhdGUiLCJvbkNyZWF0ZSIsInRpbWVzdGFtcCIsInBvcHVsYXRlIiwicHJvcCIsInR5cGUiLCJvblVwZGF0ZSIsIm9uRGVsZXRlIiwiYWZ0ZXJBbnkiLCJwb3AiLCJsaXN0IiwicmVhZG9ubHkiLCJfX21ldGFkYXRhIiwiUXVlcnlDbGF1c2UiLCJtb2RlbCIsIkxvY2siLCJCYXNlRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7SUFNRztBQUNTQTtJQUFaLENBQUEsVUFBWSxlQUFl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
|