breeze-client 2.1.6 → 2.1.7
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 +1 -1
- package/breeze-client.metadata.json +1 -1
- package/bundles/breeze-client.umd.js +88 -38
- package/bundles/breeze-client.umd.js.map +1 -1
- package/bundles/breeze-client.umd.min.js +1 -1
- package/bundles/breeze-client.umd.min.js.map +1 -1
- package/esm2015/src/abstract-data-service-adapter.js +68 -37
- package/esm2015/src/entity-query.js +23 -4
- package/esm5/src/abstract-data-service-adapter.js +68 -37
- package/esm5/src/entity-query.js +23 -4
- package/fesm2015/breeze-client.js +88 -38
- package/fesm2015/breeze-client.js.map +1 -1
- package/fesm5/breeze-client.js +88 -38
- package/fesm5/breeze-client.js.map +1 -1
- package/package.json +1 -1
- package/src/abstract-data-service-adapter.d.ts +20 -0
- package/src/entity-query.d.ts +17 -3
package/esm5/src/entity-query.js
CHANGED
|
@@ -42,6 +42,7 @@ var EntityQuery = /** @class */ (function () {
|
|
|
42
42
|
this.parameters = {};
|
|
43
43
|
this.inlineCountEnabled = false;
|
|
44
44
|
this.noTrackingEnabled = false;
|
|
45
|
+
this.usePostEnabled = false;
|
|
45
46
|
// default is to get queryOptions and dataService from the entityManager.
|
|
46
47
|
// this.queryOptions = new QueryOptions();
|
|
47
48
|
// this.dataService = new DataService();
|
|
@@ -315,7 +316,7 @@ var EntityQuery = /** @class */ (function () {
|
|
|
315
316
|
return clone(this, "parameters", parameters);
|
|
316
317
|
};
|
|
317
318
|
/**
|
|
318
|
-
Returns a query with the
|
|
319
|
+
Returns a query with the `inlineCount` capability either enabled or disabled. With `inlineCount` enabled, an additional 'inlineCount' property
|
|
319
320
|
will be returned with the query results that will contain the number of entities that would have been returned by this
|
|
320
321
|
query with only the 'where'/'filter' clauses applied, i.e. without any 'skip'/'take' operators applied. For local queries this clause is ignored.
|
|
321
322
|
> let query = new EntityQuery("Customers")
|
|
@@ -323,7 +324,7 @@ var EntityQuery = /** @class */ (function () {
|
|
|
323
324
|
> .orderBy("CompanyName")
|
|
324
325
|
> .inlineCount(true);
|
|
325
326
|
|
|
326
|
-
will return the first 20 customers as well as a count of
|
|
327
|
+
will return the first 20 customers as well as a count of _all_ of the customers in the remote store.
|
|
327
328
|
@param enabled - (default = true) Whether or not inlineCount capability should be enabled. If this parameter is omitted, true is assumed.
|
|
328
329
|
**/
|
|
329
330
|
EntityQuery.prototype.inlineCount = function (enabled) {
|
|
@@ -337,7 +338,7 @@ var EntityQuery = /** @class */ (function () {
|
|
|
337
338
|
return clone(this, "usesNameOnServer", usesNameOnServer);
|
|
338
339
|
};
|
|
339
340
|
/**
|
|
340
|
-
Returns a query with the
|
|
341
|
+
Returns a query with the `noTracking` capability either enabled or disabled. With `noTracking` enabled, the results of this query
|
|
341
342
|
will not be coerced into entities but will instead look like raw javascript projections. i.e. simple javascript objects.
|
|
342
343
|
> let query = new EntityQuery("Customers")
|
|
343
344
|
> .take(20)
|
|
@@ -351,6 +352,22 @@ var EntityQuery = /** @class */ (function () {
|
|
|
351
352
|
return clone(this, "noTrackingEnabled", enabled);
|
|
352
353
|
};
|
|
353
354
|
/**
|
|
355
|
+
Returns a query with the `usePost` capability either enabled or disabled. With `usePost` enabled, the query is sent
|
|
356
|
+
as a POST request (instead of GET) and the query expression will be sent as JSON in the body of the post.
|
|
357
|
+
Note that the server must be able to parse the body of the request; otherwise the query expression will be ignored.
|
|
358
|
+
> let query = new EntityQuery("Customers")
|
|
359
|
+
> .where("companyId", "eq", 1)
|
|
360
|
+
> .usePost(true);
|
|
361
|
+
results in a POST request to `{host}/{path}/Customers`
|
|
362
|
+
with body `{"where": {"companyId":{"eq":1}}}`
|
|
363
|
+
@param enabled - (default = true) Whether or not usePost should be enabled. If this parameter is omitted, true is assumed.
|
|
364
|
+
**/
|
|
365
|
+
EntityQuery.prototype.usePost = function (enabled) {
|
|
366
|
+
assertParam(enabled, "enabled").isBoolean().isOptional().check();
|
|
367
|
+
enabled = (enabled === undefined) ? true : !!enabled;
|
|
368
|
+
return clone(this, "usePostEnabled", enabled);
|
|
369
|
+
};
|
|
370
|
+
/**
|
|
354
371
|
Returns a copy of this EntityQuery with the specified [[EntityManager]], [[DataService]],
|
|
355
372
|
[[JsonResultsAdapter]], [[MergeStrategy]] or [[FetchStrategy]] applied.
|
|
356
373
|
> // 'using' can be used to return a new query with a specified EntityManager.
|
|
@@ -664,6 +681,7 @@ function fromJSON(eq, json) {
|
|
|
664
681
|
},
|
|
665
682
|
"inlineCountEnabled,inlineCount": false,
|
|
666
683
|
"noTrackingEnabled,noTracking": false,
|
|
684
|
+
"usePostEnabled,usePost": false,
|
|
667
685
|
queryOptions: function (v) {
|
|
668
686
|
return v ? QueryOptions.fromJSON(v) : undefined;
|
|
669
687
|
}
|
|
@@ -688,6 +706,7 @@ function clone(eq, propName, value) {
|
|
|
688
706
|
"expandClause",
|
|
689
707
|
"inlineCountEnabled",
|
|
690
708
|
"noTrackingEnabled",
|
|
709
|
+
"usePostEnabled",
|
|
691
710
|
"usesNameOnServer",
|
|
692
711
|
"queryOptions",
|
|
693
712
|
"entityManager",
|
|
@@ -1020,4 +1039,4 @@ var ExpandClause = /** @class */ (function () {
|
|
|
1020
1039
|
return ExpandClause;
|
|
1021
1040
|
}());
|
|
1022
1041
|
export { ExpandClause };
|
|
1023
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9lbnRpdHktcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQTJCLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQWlCLFVBQVUsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXeEM7Ozs7OztHQU1HO0FBQ0g7SUF3Q0U7Ozs7Ozs7O09BUUc7SUFDSCxxQkFBWSxZQUE4QjtRQUN4QyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsRUFBRTtZQUM5RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDckM7UUFDRCw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFzQixDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FB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YSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQVMsR0FBVCxVQUFVLE9BQStCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUFwQ0QsSUFvQ0M7O0FBRUQ7OztHQUdHO0FBQ0g7SUFHRSxzQkFBWSxhQUF1QjtRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZ0NBQVMsR0FBVCxVQUFVLE9BQStCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFSCxtQkFBQztBQUFELENBQUMsQUFiRCxJQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSwgQ2FsbGJhY2ssIEVycm9yQ2FsbGJhY2sgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IEVudGl0eUFzcGVjdCwgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgRW50aXR5S2V5IH0gZnJvbSAnLi9lbnRpdHkta2V5JztcclxuaW1wb3J0IHsgQnJlZXplRW51bSB9IGZyb20gJy4vZW51bSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlLCBKc29uUmVzdWx0c0FkYXB0ZXIgfSBmcm9tICcuL2RhdGEtc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgRW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IFF1ZXJ5T3B0aW9ucywgTWVyZ2VTdHJhdGVneSwgRmV0Y2hTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IFByZWRpY2F0ZSB9IGZyb20gJy4vcHJlZGljYXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJzaXZlQXJyYXk8VD4ge1xyXG4gIFtpOiBudW1iZXJdOiBUIHwgUmVjdXJzaXZlQXJyYXk8VD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5UXVlcnlKc29uQ29udGV4dCB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgcHJvcGVydHlQYXRoRm4/OiBGdW5jdGlvbjsgLy8gVE9ET1xyXG4gIHRvTmFtZU9uU2VydmVyPzogYm9vbGVhbjtcclxufVxyXG4vKipcclxuQW4gRW50aXR5UXVlcnkgaW5zdGFuY2UgaXMgdXNlZCB0byBxdWVyeSBlbnRpdGllcyBlaXRoZXIgZnJvbSBhIHJlbW90ZSBkYXRhc291cmNlIG9yIGZyb20gYSBsb2NhbCBbW0VudGl0eU1hbmFnZXJdXS5cclxuXHJcbkVudGl0eVF1ZXJpZXMgYXJlIGltbXV0YWJsZSAtIHRoaXMgbWVhbnMgdGhhdCBhbGwgRW50aXR5UXVlcnkgbWV0aG9kcyB0aGF0IHJldHVybiBhbiBFbnRpdHlRdWVyeSBhY3R1YWxseSBjcmVhdGUgYSBuZXcgRW50aXR5UXVlcnkuICBUaGlzIG1lYW5zIHRoYXRcclxuRW50aXR5UXVlcmllcyBjYW4gYmUgJ21vZGlmaWVkJyB3aXRob3V0IGFmZmVjdGluZyBhbnkgY3VycmVudCBpbnN0YW5jZXMuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5UXVlcnkge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBhY3R1YWxseSBwbGFjZWQgb24gcHJvdG90eXBlXHJcbiAgLy8gdG9wID0gdGhpcy50YWtlOyAvLyBUT0RPOiBjb25zaWRlclxyXG4gIC8qKiBUaGUgcmVzb3VyY2UgbmFtZSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHJlc291cmNlTmFtZT86IHN0cmluZztcclxuICAvKiogVGhlIFtbRW50aXR5VHlwZV1dIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAnZnJvbScgY2xhdXNlICggcmVzb3VyY2VOYW1lKSBvZiB0aGUgcXVlcnkuICBUaGlzIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBiZSBzZXQgQUZURVIgdGhlIHF1ZXJ5XHJcbiAgaGFzIGJlZW4gZXhlY3V0ZWQgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBbW01ldGFkYXRhU3RvcmVdXSBhc3NvY2lhdGVkIHdpdGggdGhlIFtbRW50aXR5TWFuYWdlcl1dIHRoYXQgdGhlIHF1ZXJ5IHdhcyBleGVjdXRlZCBhZ2FpbnN0LlxyXG4gIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIGVudGl0eVR5cGUgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlTmFtZS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgZnJvbUVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG4gIC8qKiBUaGUgJ3doZXJlJyBbW1ByZWRpY2F0ZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgd2hlcmVQcmVkaWNhdGU6IFByZWRpY2F0ZTsgLy8gVE9ET1xyXG4gIC8qKiBUaGUgW1tPcmRlckJ5Q2xhdXNlXV0gdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSBvcmRlckJ5Q2xhdXNlPzogT3JkZXJCeUNsYXVzZTtcclxuICAvKiogVGhlIFtbRXhwYW5kQ2xhdXNlXV0gdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSBleHBhbmRDbGF1c2U/OiBFeHBhbmRDbGF1c2U7XHJcbiAgLyoqIFRoZSBbW1NlbGVjdENsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgc2VsZWN0Q2xhdXNlPzogU2VsZWN0Q2xhdXNlO1xyXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvICdza2lwJyBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgc2tpcENvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvICd0YWtlJyBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgdGFrZUNvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgcXVlcnkgdmlhIHRoZSAnd2l0aFBhcmFtZXRlcnMnIG1ldGhvZC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgcGFyYW1ldGVyczogT2JqZWN0O1xyXG4gIC8qKiBXaGV0aGVyIGFuIGlubGluZSBjb3VudCBpcyByZXR1cm5lZCBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgaW5saW5lQ291bnRFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSB0cmFja2luZyBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgbm9UcmFja2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBbW1F1ZXJ5T3B0aW9uc11dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICAvLyBkZWZhdWx0IGlzIHRvIGdldCBxdWVyeU9wdGlvbnMgYW5kIGRhdGFTZXJ2aWNlIGZyb20gdGhlIGVudGl0eU1hbmFnZXIuXHJcbiAgZGVjbGFyZSBxdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW0RhdGFTZXJ2aWNlXV0gZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgZGF0YVNlcnZpY2U/OiBEYXRhU2VydmljZTtcclxuICAvKiogVGhlIFtbRW50aXR5TWFuYWdlcl1dIGZvciB0aGlzIHF1ZXJ5LiBUaGlzIG1heSBiZSBudWxsIGFuZCBjYW4gYmUgc2V0IHZpYSB0aGUgJ3VzaW5nJyBtZXRob2QuICAqKi9cclxuICBkZWNsYXJlIGVudGl0eU1hbmFnZXI/OiBFbnRpdHlNYW5hZ2VyO1xyXG4gIC8qKiAgVGhlIGVudGl0eVR5cGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoaXMgcXVlcnkuIFxyXG4gIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHNldCBpZiB0aGUgJ3RvVHlwZScgbWV0aG9kIHdhcyBjYWxsZWQuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHJlc3VsdEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCBzdHJpbmc7XHJcbiAgZGVjbGFyZSB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIENvbnN0cnVjdG9yXHJcbiAgPiAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuXHJcbiAgVXN1YWxseSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZmlsdGVyaW5nLCBvcmRlcmluZyBvciBzZWxlY3Rpb24gbWV0aG9kc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJSZWdpb25cIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIGVpdGhlciBhIHJlc291cmNlIG5hbWUgb3IgYSBzZXJpYWxpemVkIEVudGl0eVF1ZXJ5ICggY3JlYXRlZCBieSBbW0VudGl0eVF1ZXJ5LnRvSlNPTl1dKVxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKHJlc291cmNlTmFtZT86IHN0cmluZyB8IE9iamVjdCkge1xyXG4gICAgaWYgKHJlc291cmNlTmFtZSAhPSBudWxsICYmICh0eXBlb2YgcmVzb3VyY2VOYW1lICE9PSAnc3RyaW5nJykpIHtcclxuICAgICAgcmV0dXJuIGZyb21KU09OKHRoaXMsIHJlc291cmNlTmFtZSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBjYXN0IGFzIHN0cmluZyBiZWxvdyBuZWVkZWQgZm9yIGVhcmx5IHZlcnNpb25zIG9mIFR5cGVEb2MgLSBidXQgbm90IGZvciByZWd1bGFyIGNvbXBpbGUgLSBjaGVjayBsYXRlclxyXG4gICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWUgYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mcm9tRW50aXR5VHlwZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMud2hlcmVQcmVkaWNhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLm9yZGVyQnlDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdENsYXVzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2tpcENvdW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50YWtlQ291bnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmV4cGFuZENsYXVzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGFyYW1ldGVycyA9IHt9O1xyXG4gICAgdGhpcy5pbmxpbmVDb3VudEVuYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMubm9UcmFja2luZ0VuYWJsZWQgPSBmYWxzZTtcclxuICAgIC8vIGRlZmF1bHQgaXMgdG8gZ2V0IHF1ZXJ5T3B0aW9ucyBhbmQgZGF0YVNlcnZpY2UgZnJvbSB0aGUgZW50aXR5TWFuYWdlci5cclxuICAgIC8vIHRoaXMucXVlcnlPcHRpb25zID0gbmV3IFF1ZXJ5T3B0aW9ucygpO1xyXG4gICAgLy8gdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZSgpO1xyXG4gICAgdGhpcy5lbnRpdHlNYW5hZ2VyID0gdW5kZWZpbmVkO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBTcGVjaWZpZXMgdGhlIHJlc291cmNlIHRvIHF1ZXJ5IGZvciB0aGlzIEVudGl0eVF1ZXJ5LlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoKVxyXG4gID4gICAgICAgIC5mcm9tKFwiQ3VzdG9tZXJzXCIpO1xyXG5cclxuICBpcyB0aGUgc2FtZSBhc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIFRoZSByZXNvdXJjZSB0byBxdWVyeS5cclxuICAqKi9cclxuICBmcm9tKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAvLyBUT0RPOiB0aGluayBhYm91dCBhbGxvd2luZyBlbnRpdHlUeXBlIGFzIHdlbGxcclxuICAgIGFzc2VydFBhcmFtKHJlc291cmNlTmFtZSwgXCJyZXNvdXJjZU5hbWVcIikuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwicmVzb3VyY2VOYW1lXCIsIHJlc291cmNlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBUaGlzIGlzIGEgc3RhdGljIHZlcnNpb24gb2YgdGhlIFwiZnJvbVwiIG1ldGhvZCBhbmQgaXQgY3JlYXRlcyBhICdiYXNlJyBlbnRpdHlRdWVyeSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBuYW1lLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tKFwiQ3VzdG9tZXJzXCIpO1xyXG5cclxuICBpcyB0aGUgc2FtZSBhc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIFRoZSByZXNvdXJjZSB0byBxdWVyeS5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xyXG4gICAgYXNzZXJ0UGFyYW0ocmVzb3VyY2VOYW1lLCBcInJlc291cmNlTmFtZVwiKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eVF1ZXJ5KHJlc291cmNlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTcGVjaWZpZXMgdGhlIHRvcCBsZXZlbCBFbnRpdHlUeXBlIHRoYXQgdGhpcyBxdWVyeSB3aWxsIHJldHVybi4gIE9ubHkgbmVlZGVkIHdoZW4gYSBxdWVyeSByZXR1cm5zIGEganNvbiByZXN1bHQgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHR5cGUgaW5mb3JtYXRpb24sXHJcbiAgb3Igd2hlbiB1c2luZyBhIHJlc291cmNlIG5hbWUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB0byBhbiBFbnRpdHlUeXBlLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoKVxyXG4gID4gICAgICAgIC5mcm9tKFwiTXlDdXN0b21NZXRob2RcIilcclxuICA+ICAgICAgICAudG9UeXBlKFwiQ3VzdG9tZXJcIilcclxuICBAcGFyYW0gZW50aXR5VHlwZSAtIFRoZSB0b3AgbGV2ZWwgRW50aXR5VHlwZSB0aGF0IHRoaXMgcXVlcnkgd2lsbCByZXR1cm4uXHJcbiAgQHN1bW1hcnkgSWYgdGhlIGpzb24gcmVzdWx0IGNvbnNpc3RzIG9mIG1vcmUgdGhhbiBhIHNpbXBsZSBlbnRpdHkgb3IgYXJyYXkgb2YgZW50aXRpZXMsIGNvbnNpZGVyIHVzaW5nIGEgW1tKc29uUmVzdWx0c0FkYXB0ZXJdXSBpbnN0ZWFkLlxyXG4gICoqL1xyXG4gIHRvVHlwZShlbnRpdHlUeXBlOiBzdHJpbmcgfCBFbnRpdHlUeXBlKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHlUeXBlLCBcImVudGl0eVR5cGVcIikuaXNTdHJpbmcoKS5vcigpLmlzSW5zdGFuY2VPZihFbnRpdHlUeXBlKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwicmVzdWx0RW50aXR5VHlwZVwiLCBlbnRpdHlUeXBlKTtcclxuICB9XHJcblxyXG5cclxuICB3aGVyZShwcmVkaWNhdGU/OiBQcmVkaWNhdGUpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcmVkaWNhdGU6IE9iamVjdCk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBvcGVyYXRvcjogRmlsdGVyUXVlcnlPcCwgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBGaWx0ZXJRdWVyeU9wLCBwcm9wZXJ0eTI6IHN0cmluZywgZmlsdGVyb3AyOiBGaWx0ZXJRdWVyeU9wLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgZmlsdGVyb3A6IHN0cmluZywgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgZmlsdGVyb3A6IHN0cmluZywgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogc3RyaW5nLCBwcm9wZXJ0eTM6IHN0cmluZywgZmlsdGVyb3AzOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTsgIC8vIGZvciBhbnkvYWxsIGNsYXVzZXNcclxuICB3aGVyZShhbkFycmF5OiBSZWN1cnNpdmVBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBGaWx0ZXJRdWVyeU9wIHwgUHJlZGljYXRlPik6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgd2l0aCBhbiBhZGRlZCBmaWx0ZXIgY3JpdGVyaWE7IENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2hpY2ggbWVhbnMgdG8gJ2FuZCcgd2l0aCBhbnkgZXhpc3RpbmdcclxuICBQcmVkaWNhdGUgb3IgY2FuIGJlIGNhbGxlZCB3aXRoIG51bGwgdG8gY2xlYXIgYWxsIHByZWRpY2F0ZXMuXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKTtcclxuXHJcbiAgVGhpcyBjYW4gYWxzbyBiZSBleHByZXNzZWQgdXNpbmcgYW4gZXhwbGljaXQgW1tGaWx0ZXJRdWVyeU9wXV0gYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBGaWx0ZXJRdWVyeU9wLlN0YXJ0c1dpdGgsIFwiQ1wiKTtcclxuXHJcbiAgb3IgYSBwcmVjb25zdHJ1Y3RlZCBbW1ByZWRpY2F0ZV1dIG1heSBiZSB1c2VkXHJcbiAgPiAgICAgIGxldCBwcmVkID0gbmV3IFByZWRpY2F0ZShcIkNvbXBhbnlOYW1lXCIsIEZpbHRlclF1ZXJ5T3AuU3RhcnRzV2l0aCwgXCJDXCIpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIikud2hlcmUocHJlZCk7XHJcblxyXG4gIFByZWRpY2F0ZXMgYXJlIG9mdGVuIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGNvbWJpbmUgbXVsdGlwbGUgY29uZGl0aW9ucyBpbiBhIHNpbmdsZSBmaWx0ZXIsIHN1Y2ggYXNcclxuICA+ICAgICAgbGV0IHByZWQgPSBQcmVkaWNhdGUuY3JlYXRlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHN3aXRoXCIsIFwiQ1wiKS5hbmQoXCJSZWdpb25cIiwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIG51bGwpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShwcmVkKTtcclxuXHJcbiAgTW9yZSBjb21wbGljYXRlZCBxdWVyaWVzIGNhbiBtYWtlIHVzZSBvZiBuZXN0ZWQgcHJvcGVydHkgcGF0aHNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiUHJvZHVjdHNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcIkNhdGVnb3J5LkNhdGVnb3J5TmFtZVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJTXCIpO1xyXG5cclxuICBvciBPRGF0YSBmdW5jdGlvbnMgLSBBIGxpc3Qgb2YgdmFsaWQgT0RhdGEgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCB3aXRoaW4gdGhlIFtbUHJlZGljYXRlXV0gZG9jdW1lbnRhdGlvbi5cclxuICBcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJ0b0xvd2VyKENvbXBhbnlOYW1lKVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJjXCIpO1xyXG5cclxuICBvciB0byBiZSBldmVuIG1vcmUgYmFyb3F1ZVxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcInRvVXBwZXIoc3Vic3RyaW5nKENvbXBhbnlOYW1lLCAxLCAyKSlcIiwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIFwiT01cIik7XHJcbiAgQHBhcmFtIHByZWRpY2F0ZSAtICBDYW4gYmUgZWl0aGVyXHJcbiAgICAtIGEgc2luZ2xlIFtbUHJlZGljYXRlXV1cclxuXHJcbiAgICAtIHRoZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhICdzaW1wbGUnIFByZWRpY2F0ZVxyXG4gICAgLSAtICBhIHByb3BlcnR5IG5hbWUsIGEgcHJvcGVydHkgcGF0aCB3aXRoICcuJyBhcyBwYXRoIHNlcGVyYXRvcnMgb3IgYSBwcm9wZXJ0eSBleHByZXNzaW9uIHtTdHJpbmd9XHJcbiAgICAtIC0gIGFuIG9wZXJhdG9yIC0gW1tGaWx0ZXJRdWVyeU9wXV0gb3IgaXQncyBzdHJpbmcgcmVwcmVzZW50YXRpb24uIENhc2UgaXMgaWdub3JlZFxyXG4gICAgd2hlbiBpZiBhIHN0cmluZyBpcyBwcm92aWRlZCBhbmQgYW55IHN0cmluZyB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZSBGaWx0ZXJRdWVyeU9wIGFsaWFzZXMgd2lsbCBiZSBhY2NlcHRlZC5cclxuICAgIC0gLSAgYSB2YWx1ZSB7T2JqZWN0fSAtIFRoaXMgd2lsbCBiZSB0cmVhdGVkIGFzIGVpdGhlciBhIHByb3BlcnR5IGV4cHJlc3Npb24gb3IgYSBsaXRlcmFsIGRlcGVuZGluZyBvbiBjb250ZXh0LiAgXHJcbiAgICBJbiBnZW5lcmFsLCBpZiB0aGUgdmFsdWUgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgZXhwcmVzc2lvbiBpdCB3aWxsIGJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbGl0ZXJhbC5cclxuICAgIEluIG1vc3QgY2FzZXMgdGhpcyB3b3JrcyB3ZWxsLCBidXQgeW91IGNhbiBhbHNvIGZvcmNlIHRoZSBpbnRlcnByZXRhdGlvbiBieSBtYWtpbmcgdGhlIHZhbHVlIGFyZ3VtZW50IGl0c2VsZiBhbiBvYmplY3QgXHJcbiAgICB3aXRoIGEgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYW4gJ2lzTGl0ZXJhbCcgcHJvcGVydHkgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLlxyXG4gICAgQnJlZXplIGFsc28gdHJpZXMgdG8gaW5mZXIgdGhlIGRhdGFUeXBlIG9mIGFueSBsaXRlcmFsIGJhc2VkIG9uIGNvbnRleHQsIGlmIHRoaXMgZmFpbHMgeW91IGNhbiBmb3JjZSB0aGlzIGluZmVyZW5jZSBieSBtYWtpbmcgdGhlIHZhbHVlIGFyZ3VtZW50IFxyXG4gICAgYW4gb2JqZWN0IHdpdGggYSAndmFsdWUnIHByb3BlcnR5IGFuZCBhICdkYXRhVHlwZSdwcm9wZXJ0eSBzZXQgdG8gb25lIG9mIHRoZSBEYXRhVHlwZSBlbnVtZXJhdGlvbiBpbnN0YW5jZXMuXHJcblxyXG4gICAgLSBhIG51bGwgb3IgdW5kZWZpbmVkICggdGhpcyBjYXVzZXMgYW55IGV4aXN0aW5nIHdoZXJlIGNsYXVzZSB0byBiZSByZW1vdmVkKVxyXG4gICoqL1xyXG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQgd2hlcmVQcmVkaWNhdGU6IFByZWRpY2F0ZSB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXSAhPSBudWxsKSB7XHJcbiAgICAgIHdoZXJlUHJlZGljYXRlID0gUHJlZGljYXRlLmNyZWF0ZSguLi48YW55PmFyZ3MpO1xyXG4gICAgICBpZiAodGhpcy5mcm9tRW50aXR5VHlwZSkgd2hlcmVQcmVkaWNhdGUuX3ZhbGlkYXRlKHRoaXMuZnJvbUVudGl0eVR5cGUpO1xyXG4gICAgICBpZiAodGhpcy53aGVyZVByZWRpY2F0ZSkge1xyXG4gICAgICAgIHdoZXJlUHJlZGljYXRlID0gdGhpcy53aGVyZVByZWRpY2F0ZS5hbmQod2hlcmVQcmVkaWNhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ3aGVyZVByZWRpY2F0ZVwiLCB3aGVyZVByZWRpY2F0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzPzogc3RyaW5nLCBpc0Rlc2NlbmRpbmc/OiBib29sZWFuKTogRW50aXR5UXVlcnk7XHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSwgaXNEZXNjZW5kaW5nPzogYm9vbGVhbik6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBvcmRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IGJ5IHByb3BlcnR5IG5hbWUuICBCeSBkZWZhdWx0IHNvcnRpbmcgb2NjdXJzIGlzIGFzY2VuZGluZyBvcmRlciwgYnV0IHNvcnRpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBzdXBwb3J0ZWQgYXMgd2VsbC5cclxuICBPcmRlckJ5IGNsYXVzZXMgbWF5IGJlIGNoYWluZWQuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgb3IgdG8gc29ydCBhY3Jvc3MgbXVsdGlwbGUgcHJvcGVydGllc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uLCBDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgTmVzdGVkIHByb3BlcnR5IHBhdGhzIGFyZSBhbHNvIHN1cHBvcnRlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDYXRlZ29yeS5DYXRlZ29yeU5hbWVcIik7XHJcblxyXG4gIFNvcnRpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBzdXBwb3J0ZWQgdmlhIHRoZSBhZGRpdGlvbiBvZiAnIGRlc2MnIHRvIHRoZSBlbmQgb2YgYW55IHByb3BlcnR5IHBhdGguXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZSBkZXNjXCIpO1xyXG5cclxuICBvclxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uIGRlc2MsIENvbXBhbnlOYW1lIGRlc2NcIik7XHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCAoJywnKSBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgcGF0aHMuXHJcbiAgRWFjaCBwcm9wZXJ0eSBwYXRoIGNhbiBvcHRpb25hbGx5IGVuZCB3aXRoIFwiIGRlc2NcIiB0byBmb3JjZSBhIGRlc2NlbmRpbmcgc29ydCBvcmRlci4gSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbGwgb3JkZXJpbmcgaXMgcmVtb3ZlZC5cclxuICBAcGFyYW0gaXNEZXNjZW5kaW5nIC0gSWYgc3BlY2lmaWVkLCBvdmVycmlkZXMgYWxsIG9mIHRoZSBlbWJlZGRlZCAnZGVzYycgdGFncyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgcHJvcGVydHkgcGF0aHMuXHJcbiAgKiovXHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSwgaXNEZXNjZW5kaW5nPzogYm9vbGVhbikge1xyXG4gICAgLy8gcHJvcGVydHlQYXRoczogY2FuIHBhc3MgaW4gY3JlYXRlKFwiQS5YLEJcIikgb3IgY3JlYXRlKFwiQS5YIGRlc2MsIEJcIikgb3IgY3JlYXRlKFwiQS5YIGRlc2MsQlwiLCB0cnVlXSlcclxuICAgIC8vIGlzRGVzYyBwYXJhbWV0ZXIgdHJ1bXBzIGlzRGVzYyBpbiBwcm9wZXJ0eU5hbWUuXHJcbiAgICBsZXQgb3JkZXJCeUNsYXVzZSA9IHByb3BlcnR5UGF0aHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgT3JkZXJCeUNsYXVzZShub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHMpLCBpc0Rlc2NlbmRpbmcpO1xyXG4gICAgaWYgKHRoaXMub3JkZXJCeUNsYXVzZSAmJiBvcmRlckJ5Q2xhdXNlKSB7XHJcbiAgICAgIG9yZGVyQnlDbGF1c2UgPSBuZXcgT3JkZXJCeUNsYXVzZShbdGhpcy5vcmRlckJ5Q2xhdXNlLCBvcmRlckJ5Q2xhdXNlXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJvcmRlckJ5Q2xhdXNlXCIsIG9yZGVyQnlDbGF1c2UpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZyk6IEVudGl0eVF1ZXJ5O1xyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IG9yZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgYnkgcHJvcGVydHkgbmFtZSBpbiBkZXNjZW5kaW5nIG9yZGVyLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIkNvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBvciB0byBzb3J0IGFjcm9zcyBtdWx0aXBsZSBwcm9wZXJ0aWVzXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnlEZXNjKFwiUmVnaW9uLCBDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgTmVzdGVkIHByb3BlcnR5IHBhdGhzIGFyZSBhbHNvIHN1cHBvcnRlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnlEZXNjKFwiQ2F0ZWdvcnkuQ2F0ZWdvcnlOYW1lXCIpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgKCcsJykgc3RyaW5nIG9mIHByb3BlcnR5IHBhdGhzIG9yIGFuIGFycmF5IG9mIHByb3BlcnR5IHBhdGhzLlxyXG4gIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYWxsIG9yZGVyaW5nIGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgb3JkZXJCeURlc2MocHJvcGVydHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIHJldHVybiB0aGlzLm9yZGVyQnkocHJvcGVydHlQYXRocyBhcyBhbnksIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHNlbGVjdHMgYSBsaXN0IG9mIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzdWx0cyBvZiB0aGUgb3JpZ2luYWwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHZhbHVlcyBvZiBqdXN0IHRoZXNlIHByb3BlcnRpZXMuIFRoaXNcclxuICB3aWxsIGJlIHJlZmVycmVkIHRvIGFzIGEgcHJvamVjdGlvbi5cclxuICBJZiB0aGUgcmVzdWx0IG9mIHRoaXMgc2VsZWN0aW9uIFwicHJvamVjdGlvblwiIGNvbnRhaW5zIGVudGl0aWVzLCB0aGVzZSBlbnRpdGllcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gRW50aXR5TWFuYWdlcidzIGNhY2hlIGFuZCB3aWxsXHJcbiAgYmUgbWFkZSAnb2JzZXJ2YWJsZScuXHJcbiAgQW55IHNpbXBsZSBwcm9wZXJ0aWVzLCBpLmUuIHN0cmluZ3MsIG51bWJlcnMgb3IgZGF0ZXMgd2l0aGluIGEgcHJvamVjdGlvbiB3aWxsIG5vdCBiZSBjYWNoZWQgYXJlIHdpbGwgTk9UIGJlIG1hZGUgJ29ic2VydmFibGUnLlxyXG4gIFxyXG4gIFNpbXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIGJlIHByb2plY3RlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgIC5zZWxlY3QoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgVGhpcyB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIGVhY2ggd2l0aCBhIHNpbmdsZSBcIkNvbXBhbnlOYW1lXCIgcHJvcGVydHkgb2YgdHlwZSBzdHJpbmcuXHJcbiAgQSBzaW1pbGFyIHF1ZXJ5IGNvdWxkIHJldHVybiBhIG5hdmlnYXRpb24gcHJvcGVydHkgaW5zdGVhZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuc2VsZWN0KFwiT3JkZXJzXCIpO1xyXG5cclxuICB3aGVyZSB0aGUgcmVzdWx0IHdvdWxkIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgZWFjaCB3aXRoIGEgc2luZ2xlIFwiT3JkZXJzXCIgcHJvcGVydHkgdGhhdCB3b3VsZCBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgXCJPcmRlclwiIGVudGl0aWVzLlxyXG4gIENvbXBvc2l0ZSBwcm9qZWN0aW9ucyBhcmUgYWxzbyBwb3NzaWJsZTpcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLnNlbGVjdChcIkNvbXBhbnlOYW1lLCBPcmRlcnNcIik7XHJcblxyXG4gIEFzIHdlbGwgYXMgcHJvamVjdGlvbnMgaW52b2x2aW5nIG5lc3RlZCBwcm9wZXJ0eSBwYXRoc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ3VzdG9tZXIuQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5zZWxlY3QoXCJDdXN0b21lci5Db21wYW55TmFtZSwgQ3VzdG9tZXIsIE9yZGVyRGF0ZVwiKTtcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkICgnLCcpIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBvciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBwYXRocy5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyBwcm9qZWN0aW9uIG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHNlbGVjdChwcm9wZXJ0eVBhdGhzPzogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGxldCBzZWxlY3RDbGF1c2UgPSBwcm9wZXJ0eVBhdGhzID09IG51bGwgPyBudWxsIDogbmV3IFNlbGVjdENsYXVzZShub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHMpKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInNlbGVjdENsYXVzZVwiLCBzZWxlY3RDbGF1c2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHNraXBzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudGl0aWVzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMuXHJcbiAgQW55IGV4aXN0aW5nICdza2lwJyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nICdza2lwJyB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgIC5za2lwKDUpO1xyXG4gIEBwYXJhbSBjb3VudCAtIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gc2tpcCBvdmVyLiBJZiBvbWl0dGVkIG9yIG51bGwgYW55IGV4aXN0aW5nIHNraXAgY291bnQgb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgc2tpcChjb3VudD86IG51bWJlcikge1xyXG4gICAgYXNzZXJ0UGFyYW0oY291bnQsIFwiY291bnRcIikuaXNPcHRpb25hbCgpLmlzTnVtYmVyKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInNraXBDb3VudFwiLCAoY291bnQgPT0gbnVsbCkgPyBudWxsIDogY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzLiAtIFNhbWUgYXMgJ3Rha2UnLlxyXG4gIEFueSBleGlzdGluZyAndG9wJyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nICd0b3AnIHdpdGggbm8gYXJndW1lbnRzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC50b3AoNSk7XHJcbiAgQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byByZXR1cm4uXHJcbiAgSWYgJ2NvdW50JyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICd0b3AnIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHRvcChjb3VudD86IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudGFrZShjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudGl0aWVzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMgLSBTYW1lIGFzICd0b3AnLlxyXG4gIEFueSBleGlzdGluZyB0YWtlIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgdGFrZSB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAudGFrZSg1KTtcclxuICBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHJldHVybi5cclxuICBJZiAnY291bnQnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgJ3Rha2UnIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHRha2UoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIGFzc2VydFBhcmFtKGNvdW50LCBcImNvdW50XCIpLmlzT3B0aW9uYWwoKS5pc051bWJlcigpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ0YWtlQ291bnRcIiwgKGNvdW50ID09IG51bGwpID8gbnVsbCA6IGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCB3aWxsIHJldHVybiByZWxhdGVkIGVudGl0aWVzIG5lc3RlZCB3aXRoaW4gaXRzIHJlc3VsdHMuIFRoZSBleHBhbmQgbWV0aG9kIGFsbG93cyB5b3UgdG8gaWRlbnRpZnkgcmVsYXRlZCBlbnRpdGllcywgdmlhIG5hdmlnYXRpb24gcHJvcGVydHlcclxuICBuYW1lcyBzdWNoIHRoYXQgYSBncmFwaCBvZiBlbnRpdGllcyBtYXkgYmUgcmV0cmlldmVkIHdpdGggYSBzaW5nbGUgcmVxdWVzdC4gQW55IGZpbHRlcmluZyBvY2N1cnMgYmVmb3JlIHRoZSByZXN1bHRzIGFyZSAnZXhwYW5kZWQnLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiT3JkZXJzXCIpO1xyXG5cclxuICB3aWxsIHJldHVybiB0aGUgZmlsdGVyZWQgY3VzdG9tZXJzIGVhY2ggd2l0aCBpdHMgXCJPcmRlcnNcIiBwcm9wZXJ0aWVzIGZ1bGx5IHJlc29sdmVkLlxyXG4gIE11bHRpcGxlIHBhdGhzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGUgcGF0aHMgYnkgYSAnLCdcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiQ3VzdG9tZXIsIEVtcGxveWVlXCIpXHJcblxyXG4gIGFuZCBuZXN0ZWQgcHJvcGVydHkgcGF0aHMgbXkgYmUgc3BlY2lmaWVkIGFzIHdlbGxcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiQ3VzdG9tZXIsIE9yZGVyRGV0YWlscywgT3JkZXJEZXRhaWxzLlByb2R1Y3RcIilcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lcyBvciBhbiBhcnJheSBvZiBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWVzLiBFYWNoIE5hdmlnYXRpb24gUHJvcGVydHkgbmFtZSBjYW4gYmUgZm9sbG93ZWRcclxuICBieSBhICcuJyBhbmQgYW5vdGhlciBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWUgdG8gZW5hYmxlIGlkZW50aWZ5aW5nIGEgbXVsdGktbGV2ZWwgcmVsYXRpb25zaGlwLlxyXG4gIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICdleHBhbmQnIGNsYXVzZSBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBleHBhbmQocHJvcGVydHlQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgZXhwYW5kQ2xhdXNlID0gcHJvcGVydHlQYXRocyA9PSBudWxsID8gbnVsbCA6IG5ldyBFeHBhbmRDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJleHBhbmRDbGF1c2VcIiwgZXhwYW5kQ2xhdXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBpbmNsdWRlcyBhIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkVtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlXCIpXHJcbiAgPiAgICAgICAgLndpdGhQYXJhbWV0ZXJzKHsgQmlydGhEYXRlOiBcIjEvMS8xOTYwXCIsIENvdW50cnk6IFwiVVNBXCIgfSk7XHJcbiAgIFxyXG4gIHdpbGwgY2FsbCB0aGUgJ0VtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlJyBtZXRob2Qgb24gdGhlIHNlcnZlciBhbmQgcGFzcyBpbiAyIHBhcmFtZXRlcnMuIFRoaXNcclxuICBxdWVyeSB3aWxsIGJlIHVyaSBlbmNvZGVkIGFzXHJcbiAgPiAgICAgIHtzZXJ2aWNlQXBpfS9FbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZT9iaXJ0aERhdGU9MSUyRjElMkYxOTYwJmNvdW50cnk9VVNBXHJcblxyXG4gIFBhcmFtZXRlcnMgbWF5IGFsc28gYmUgbWl4ZWQgaW4gd2l0aCBvdGhlciBxdWVyeSBjcml0ZXJpYS5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tKFwiRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGVcIilcclxuICA+ICAgICAgICAud2l0aFBhcmFtZXRlcnMoeyBCaXJ0aERhdGU6IFwiMS8xLzE5NjBcIiwgQ291bnRyeTogXCJVU0FcIiB9KVxyXG4gID4gICAgICAgIC53aGVyZShcIkxhc3ROYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIlNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIkJpcnRoRGF0ZVwiKTtcclxuICBAcGFyYW0gcGFyYW1ldGVycyAtIEEgcGFyYW1ldGVycyBvYmplY3Qgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLlxyXG4gICoqL1xyXG4gIHdpdGhQYXJhbWV0ZXJzKHBhcmFtZXRlcnM6IE9iamVjdCkge1xyXG4gICAgYXNzZXJ0UGFyYW0ocGFyYW1ldGVycywgXCJwYXJhbWV0ZXJzXCIpLmlzT2JqZWN0KCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInBhcmFtZXRlcnNcIiwgcGFyYW1ldGVycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcXVlcnkgd2l0aCB0aGUgJ2lubGluZUNvdW50JyBjYXBhYmlsaXR5IGVpdGhlciBlbmFibGVkIG9yIGRpc2FibGVkLiAgV2l0aCAnaW5saW5lQ291bnQnIGVuYWJsZWQsIGFuIGFkZGl0aW9uYWwgJ2lubGluZUNvdW50JyBwcm9wZXJ0eVxyXG4gIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgcXVlcnkgcmVzdWx0cyB0aGF0IHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IHRoaXNcclxuICBxdWVyeSB3aXRoIG9ubHkgdGhlICd3aGVyZScvJ2ZpbHRlcicgY2xhdXNlcyBhcHBsaWVkLCBpLmUuIHdpdGhvdXQgYW55ICdza2lwJy8ndGFrZScgb3BlcmF0b3JzIGFwcGxpZWQuIEZvciBsb2NhbCBxdWVyaWVzIHRoaXMgY2xhdXNlIGlzIGlnbm9yZWQuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLnRha2UoMjApXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKVxyXG4gID4gICAgICAgIC5pbmxpbmVDb3VudCh0cnVlKTtcclxuXHJcbiAgd2lsbCByZXR1cm4gdGhlIGZpcnN0IDIwIGN1c3RvbWVycyBhcyB3ZWxsIGFzIGEgY291bnQgb2YgYWxsIG9mIHRoZSBjdXN0b21lcnMgaW4gdGhlIHJlbW90ZSBzdG9yZS5cclxuICBAcGFyYW0gZW5hYmxlZCAtIChkZWZhdWx0ID0gdHJ1ZSkgV2hldGhlciBvciBub3QgaW5saW5lQ291bnQgY2FwYWJpbGl0eSBzaG91bGQgYmUgZW5hYmxlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdHJ1ZSBpcyBhc3N1bWVkLlxyXG4gICoqL1xyXG4gIGlubGluZUNvdW50KGVuYWJsZWQ/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbmFibGVkLCBcImVuYWJsZWRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBlbmFibGVkID0gKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISFlbmFibGVkO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwiaW5saW5lQ291bnRFbmFibGVkXCIsIGVuYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgdXNlTmFtZU9uU2VydmVyKHVzZXNOYW1lT25TZXJ2ZXI/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbSh1c2VzTmFtZU9uU2VydmVyLCBcInVzZXNOYW1lT25TZXJ2ZXJcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICB1c2VzTmFtZU9uU2VydmVyID0gKHVzZXNOYW1lT25TZXJ2ZXIgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISF1c2VzTmFtZU9uU2VydmVyO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwidXNlc05hbWVPblNlcnZlclwiLCB1c2VzTmFtZU9uU2VydmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBxdWVyeSB3aXRoIHRoZSAnbm9UcmFja2luZycgY2FwYWJpbGl0eSBlaXRoZXIgZW5hYmxlZCBvciBkaXNhYmxlZC4gIFdpdGggJ25vVHJhY2tpbmcnIGVuYWJsZWQsIHRoZSByZXN1bHRzIG9mIHRoaXMgcXVlcnlcclxuICB3aWxsIG5vdCBiZSBjb2VyY2VkIGludG8gZW50aXRpZXMgYnV0IHdpbGwgaW5zdGVhZCBsb29rIGxpa2UgcmF3IGphdmFzY3JpcHQgcHJvamVjdGlvbnMuIGkuZS4gc2ltcGxlIGphdmFzY3JpcHQgb2JqZWN0cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgLnRha2UoMjApXHJcbiAgPiAgICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIilcclxuICA+ICAgICAgICAgLm5vVHJhY2tpbmcodHJ1ZSk7XHJcbiAgQHBhcmFtIGVuYWJsZWQgLSAoZGVmYXVsdCA9IHRydWUpIFdoZXRoZXIgb3Igbm90IHRoZSBub1RyYWNraW5nIGNhcGFiaWxpdHkgc2hvdWxkIGJlIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRydWUgaXMgYXNzdW1lZC5cclxuICAqKi9cclxuICBub1RyYWNraW5nKGVuYWJsZWQ/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbmFibGVkLCBcImVuYWJsZWRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBlbmFibGVkID0gKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISFlbmFibGVkO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwibm9UcmFja2luZ0VuYWJsZWRcIiwgZW5hYmxlZCk7XHJcbiAgfVxyXG5cclxuICB1c2luZyhvYmo6IEVudGl0eU1hbmFnZXIpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IERhdGFTZXJ2aWNlKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBKc29uUmVzdWx0c0FkYXB0ZXIpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IFF1ZXJ5T3B0aW9ucyk6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogTWVyZ2VTdHJhdGVneSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogRmV0Y2hTdHJhdGVneSk6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgRW50aXR5UXVlcnkgd2l0aCB0aGUgc3BlY2lmaWVkIFtbRW50aXR5TWFuYWdlcl1dLCBbW0RhdGFTZXJ2aWNlXV0sXHJcbiAgW1tKc29uUmVzdWx0c0FkYXB0ZXJdXSwgW1tNZXJnZVN0cmF0ZWd5XV0gb3IgW1tGZXRjaFN0cmF0ZWd5XV0gYXBwbGllZC5cclxuICA+ICAgICAgLy8gJ3VzaW5nJyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBuZXcgcXVlcnkgd2l0aCBhIHNwZWNpZmllZCBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC51c2luZyhlbSk7XHJcblxyXG4gIG9yIHdpdGggYSBzcGVjaWZpZWQgW1tNZXJnZVN0cmF0ZWd5XV1cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAudXNpbmcoTWVyZ2VTdHJhdGVneS5QcmVzZXJ2ZUNoYW5nZXMpO1xyXG5cclxuICBvciB3aXRoIGEgc3BlY2lmaWVkIFtbRmV0Y2hTdHJhdGVneV1dXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLnVzaW5nKEZldGNoU3RyYXRlZ3kuRnJvbUxvY2FsQ2FjaGUpO1xyXG4gIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIHVwZGF0ZSBpbiBjcmVhdGluZyBhIG5ldyBFbnRpdHlRdWVyeSBmcm9tIGFuIGV4aXN0aW5nIG9uZS5cclxuICAqKi9cclxuICB1c2luZyhvYmo6IGFueSkge1xyXG4gICAgaWYgKCFvYmopIHJldHVybiB0aGlzO1xyXG4gICAgbGV0IGVxID0gY2xvbmUodGhpcyk7XHJcbiAgICBwcm9jZXNzVXNpbmcoZXEsIHtcclxuICAgICAgXCJlbnRpdHlNYW5hZ2VyXCI6IG51bGwsXHJcbiAgICAgIFwiZGF0YVNlcnZpY2VcIjogbnVsbCxcclxuICAgICAgXCJxdWVyeU9wdGlvbnNcIjogbnVsbCxcclxuICAgICAgXCJmZXRjaFN0cmF0ZWd5XCI6IChlcTogRW50aXR5UXVlcnksIHZhbDogYW55KSA9PiB7XHJcbiAgICAgICAgZXEucXVlcnlPcHRpb25zID0gKGVxLnF1ZXJ5T3B0aW9ucyB8fCBuZXcgUXVlcnlPcHRpb25zKCkpLnVzaW5nKHZhbCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwibWVyZ2VTdHJhdGVneVwiOiAoZXE6IEVudGl0eVF1ZXJ5LCB2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGVxLnF1ZXJ5T3B0aW9ucyA9IChlcS5xdWVyeU9wdGlvbnMgfHwgbmV3IFF1ZXJ5T3B0aW9ucygpKS51c2luZyh2YWwpO1xyXG4gICAgICB9LFxyXG4gICAgICBcImpzb25SZXN1bHRzQWRhcHRlclwiOiAoZXE6IEVudGl0eVF1ZXJ5LCB2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGVxLmRhdGFTZXJ2aWNlID0gKGVxLmRhdGFTZXJ2aWNlIHx8IG5ldyBEYXRhU2VydmljZSgpKS51c2luZyh7IGpzb25SZXN1bHRzQWRhcHRlcjogdmFsIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCBvYmopO1xyXG4gICAgcmV0dXJuIGVxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgRXhlY3V0ZXMgdGhpcyBxdWVyeS4gIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgYW4gRW50aXR5TWFuYWdlciBoYXMgYmVlbiBwcmV2aW91c2x5IHNwZWNpZmllZCB2aWEgdGhlIFwidXNpbmdcIiBtZXRob2QuXHJcbiAgXHJcbiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB1c2luZyBhICdwcm9taXNlcycgc3ludGF4ICggcmVjb21tZW5kZWQpXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpLnVzaW5nKGVtKTtcclxuICA+ICAgICAgcXVlcnkuZXhlY3V0ZSgpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pLmNhdGNoKCBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pO1xyXG5cclxuICBvciB3aXRoIGNhbGxiYWNrc1xyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhlbSk7XHJcbiAgPiAgICAgIHF1ZXJ5LmV4ZWN1dGUoXHJcbiAgPiAgICAgICAgZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICAgICAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgICAgICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgICAgICAgICAgIH0sXHJcbiAgPiAgICAgICAgZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgICAgICAgICAgICAgLi4uIHF1ZXJ5IGZhaWx1cmUgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICBFaXRoZXIgd2F5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgdGhlIEVudGl0eU1hbmFnZXIgJ2V4ZWN1dGUnIG1ldGhvZC5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgIGVtLmV4ZWN1dGVRdWVyeShxdWVyeSkudGhlbiggZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICBsZXQgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgfSkuY2F0Y2goIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICB9KTtcclxuXHJcbiAgQHBhcmFtIGNhbGxiYWNrIC0gIEZ1bmN0aW9uIGNhbGxlZCBvbiBzdWNjZXNzLlxyXG4gIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0gRnVuY3Rpb24gY2FsbGVkIG9uIGZhaWx1cmUuXHJcbiAgQHJldHVybiBQcm9taXNlXHJcbiAgKiovXHJcbiAgZXhlY3V0ZShjYWxsYmFjaz86IENhbGxiYWNrLCBlcnJvckNhbGxiYWNrPzogRXJyb3JDYWxsYmFjayk6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcclxuICAgIGlmICghdGhpcy5lbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFuIEVudGl0eVF1ZXJ5IG11c3QgaGF2ZSBpdHMgRW50aXR5TWFuYWdlciBwcm9wZXJ0eSBzZXQgYmVmb3JlIGNhbGxpbmcgJ2V4ZWN1dGUnXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnkodGhpcywgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgRXhlY3V0ZXMgdGhpcyBxdWVyeSBhZ2FpbnN0IHRoZSBsb2NhbCBjYWNoZS4gIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgYW4gRW50aXR5TWFuYWdlciBoYXZlIGJlZW4gcHJldmlvdXNseSBzcGVjaWZpZWQgdmlhIHRoZSBcInVzaW5nXCIgbWV0aG9kLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0gaXMgYW4gZW50aXR5TWFuYWdlciBhbHJlYWR5IGZpbGxlZCB3aXRoIG9yZGVyIGVudGl0aWVzO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIikudXNpbmcoZW0pO1xyXG4gID4gICAgICBsZXQgb3JkZXJzID0gcXVlcnkuZXhlY3V0ZUxvY2FsbHkoKTtcclxuXHJcbiAgTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBbW0VudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5TG9jYWxseV1dLlxyXG4gICoqL1xyXG4gIGV4ZWN1dGVMb2NhbGx5KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eU1hbmFnZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gRW50aXR5UXVlcnkgbXVzdCBoYXZlIGl0cyBFbnRpdHlNYW5hZ2VyIHByb3BlcnR5IHNldCBiZWZvcmUgY2FsbGluZyAnZXhlY3V0ZUxvY2FsbHknXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9KU09ORXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogVHlwaWNhbGx5IG9ubHkgZm9yIHVzZSB3aGVuIGJ1aWxkaW5nIFVyaUJ1aWxkZXJBZGFwdGVycy4gIFxyXG4gIEBoaWRkZW4gQGludGVybmFsICBcclxuICAqL1xyXG4gIHRvSlNPTkV4dChjb250ZXh0PzogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgICBjb250ZXh0LmVudGl0eVR5cGUgPSBjb250ZXh0LmVudGl0eVR5cGUgfHwgdGhpcy5mcm9tRW50aXR5VHlwZTtcclxuICAgIGNvbnRleHQucHJvcGVydHlQYXRoRm4gPSBjb250ZXh0LnRvTmFtZU9uU2VydmVyID8gY29udGV4dC5lbnRpdHlUeXBlIS5jbGllbnRQcm9wZXJ0eVBhdGhUb1NlcnZlci5iaW5kKGNvbnRleHQuZW50aXR5VHlwZSkgOiBjb3JlLmlkZW50aXR5O1xyXG5cclxuICAgIGxldCB0b0pTT05FeHRGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyB2LnRvSlNPTkV4dChjb250ZXh0KSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gY29yZS50b0pzb24odGhpcywge1xyXG4gICAgICBcImZyb20scmVzb3VyY2VOYW1lXCI6IG51bGwsXHJcbiAgICAgIFwidG9UeXBlLHJlc3VsdEVudGl0eVR5cGVcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICAgIC8vIHJlc3VsdEVudGl0eVR5cGUgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBlbnRpdHlUeXBlXHJcbiAgICAgICAgcmV0dXJuIHYgPyAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IHYubmFtZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwid2hlcmUsd2hlcmVQcmVkaWNhdGVcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwib3JkZXJCeSxvcmRlckJ5Q2xhdXNlXCI6IHRvSlNPTkV4dEZuLFxyXG4gICAgICBcInNlbGVjdCxzZWxlY3RDbGF1c2VcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwiZXhwYW5kLGV4cGFuZENsYXVzZVwiOiB0b0pTT05FeHRGbixcclxuICAgICAgXCJza2lwLHNraXBDb3VudFwiOiBudWxsLFxyXG4gICAgICBcInRha2UsdGFrZUNvdW50XCI6IG51bGwsXHJcbiAgICAgIHBhcmFtZXRlcnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gY29yZS5pc0VtcHR5KHYpID8gdW5kZWZpbmVkIDogdjtcclxuICAgICAgfSxcclxuICAgICAgXCJpbmxpbmVDb3VudCxpbmxpbmVDb3VudEVuYWJsZWRcIjogZmFsc2UsXHJcbiAgICAgIFwibm9UcmFja2luZyxub1RyYWNraW5nRW5hYmxlZFwiOiBmYWxzZSxcclxuICAgICAgcXVlcnlPcHRpb25zOiBudWxsXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUVudGl0aWVzKGVudGl0eTogRW50aXR5KTogRW50aXR5UXVlcnk7XHJcbiAgc3RhdGljIGZyb21FbnRpdGllcyhlbnRpdGllczogRW50aXR5W10pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBTdGF0aWMgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBFbnRpdHlRdWVyeSB0aGF0IHdpbGwgYWxsb3cgJ3JlcXVlcnlpbmcnIGFuIGVudGl0eSBvciBhIGNvbGxlY3Rpb24gb2YgZW50aXRpZXMgYnkgcHJpbWFyeSBrZXkuIFRoaXMgY2FuIGJlIHVzZWZ1bFxyXG4gIHRvIGZvcmNlIGEgcmVxdWVyeSBvZiBzZWxlY3RlZCBlbnRpdGllcywgb3IgdG8gcmVzdHJpY3QgYW4gZXhpc3RpbmcgY29sbGVjdGlvbiBvZiBlbnRpdGllcyBhY2NvcmRpbmcgdG8gc29tZSBmaWx0ZXIuXHJcblxyXG4gIFdvcmtzIGZvciBhIHNpbmdsZSBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXMgb2YgdGhlIFNBTUUgdHlwZS5cclxuICBEb2VzIG5vdCB3b3JrIGZvciBhbiBhcnJheSBvZiBlbnRpdGllcyBvZiBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgPiAgICAgIC8vIGFzc3VtaW5nICdjdXN0b21lcnMnIGlzIGFuIGFycmF5IG9mICdDdXN0b21lcicgZW50aXRpZXMgcmV0cmlldmVkIGVhcmxpZXIuXHJcbiAgPiAgICAgIGxldCBjdXN0b21lcnNRdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdGllcyhjdXN0b21lcnMpO1xyXG5cclxuICBUaGUgcmVzdWx0aW5nIHF1ZXJ5IGNhbiwgb2YgY291cnNlLCBiZSBleHRlbmRlZFxyXG4gID4gICAgICAvLyBhc3N1bWluZyAnY3VzdG9tZXJzJyBpcyBhbiBhcnJheSBvZiAnQ3VzdG9tZXInIGVudGl0aWVzIHJldHJpZXZlZCBlYXJsaWVyLlxyXG4gID4gICAgICBsZXQgY3VzdG9tZXJzUXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXRpZXMoY3VzdG9tZXJzKVxyXG4gID4gICAgICAgIC53aGVyZShcIlJlZ2lvblwiLCBGaWx0ZXJRdWVyeU9wLk5vdEVxdWFscywgbnVsbCk7XHJcblxyXG4gIFNpbmdsZSBlbnRpdGllcyBjYW4gcmVxdWVyaWVkIGFzIHdlbGwuXHJcbiAgPiAgICAgIC8vIGFzc3VtaW5nICdjdXN0b21lcicgaXMgYSAnQ3VzdG9tZXInIGVudGl0eSByZXRyaWV2ZWQgZWFybGllci5cclxuICA+ICAgICAgbGV0IGN1c3RvbWVyUXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXRpZXMoY3VzdG9tZXIpO1xyXG5cclxuICB3aWxsIGNyZWF0ZSBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhIHNpbmdsZSBjdXN0b21lciBlbnRpdHkuXHJcbiAgQHBhcmFtIGVudGl0aWVzIC0gVGhlIGVudGl0aWVzIGZvciB3aGljaCB3ZSB3YW50IHRvIGNyZWF0ZSBhbiBFbnRpdHlRdWVyeS5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbUVudGl0aWVzKGVudGl0aWVzOiBFbnRpdHkgfCBFbnRpdHlbXSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXRpZXMsIFwiZW50aXRpZXNcIikuaXNFbnRpdHkoKS5vcigpLmlzTm9uRW1wdHlBcnJheSgpLmlzRW50aXR5KCkuY2hlY2soKTtcclxuICAgIGxldCBlbnRzID0gKEFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXTtcclxuXHJcbiAgICBsZXQgZmlyc3RFbnRpdHkgPSBlbnRzWzBdO1xyXG4gICAgbGV0IHR5cGUgPSBmaXJzdEVudGl0eS5lbnRpdHlUeXBlO1xyXG4gICAgaWYgKGVudHMuc29tZShmdW5jdGlvbiAoZSkge1xyXG4gICAgICByZXR1cm4gZS5lbnRpdHlUeXBlICE9PSB0eXBlO1xyXG4gICAgfSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWxsICdmcm9tRW50aXRpZXMnIG11c3QgYmUgdGhlIHNhbWUgdHlwZTsgYXQgbGVhc3Qgb25lIGlzIG5vdCBvZiB0eXBlIFwiICtcclxuICAgICAgICB0eXBlLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgbGV0IHEgPSBuZXcgRW50aXR5UXVlcnkodHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcmVkcyA9IGVudHMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgICAgcmV0dXJuIGJ1aWxkUHJlZGljYXRlKGVudGl0eSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBwcmVkID0gUHJlZGljYXRlLm9yKHByZWRzKTtcclxuICAgIHEgPSBxLndoZXJlKHByZWQpO1xyXG4gICAgbGV0IGVtID0gZmlyc3RFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICBpZiAoZW0pIHtcclxuICAgICAgcSA9IHEudXNpbmcoZW0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGFuIEVudGl0eVF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIFtbRW50aXR5S2V5XV0uXHJcbiAgPiAgICAgIGxldCBlbXBUeXBlID0gbWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgIGxldCBlbnRpdHlLZXkgPSBuZXcgRW50aXR5S2V5KGVtcFR5cGUsIDEpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5S2V5KGVudGl0eUtleSk7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgIC8vICdlbXBsb3llZScgaXMgYSBwcmV2aW91c2x5IHF1ZXJpZWQgZW1wbG95ZWVcclxuICA+ICAgICAgbGV0IGVudGl0eUtleSA9IGVtcGxveWVlLmVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0eUtleShlbnRpdHlLZXkpO1xyXG4gIEBwYXJhbSBlbnRpdHlLZXkgLSBUaGUgW1tFbnRpdHlLZXldXSBmb3Igd2hpY2ggYSBxdWVyeSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FbnRpdHlLZXkoZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eUtleSwgXCJlbnRpdHlLZXlcIikuaXNJbnN0YW5jZU9mKEVudGl0eUtleSkuY2hlY2soKTtcclxuICAgIGxldCBxID0gbmV3IEVudGl0eVF1ZXJ5KGVudGl0eUtleS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByZWQgPSBidWlsZEtleVByZWRpY2F0ZShlbnRpdHlLZXkpO1xyXG4gICAgcSA9IHEud2hlcmUocHJlZCkudG9UeXBlKGVudGl0eUtleS5lbnRpdHlUeXBlKTtcclxuICAgIHJldHVybiBxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhbiBFbnRpdHlRdWVyeSBmb3IgdGhlIHNwZWNpZmllZCBlbnRpdHkgYW5kIFtbTmF2aWdhdGlvblByb3BlcnR5XV0uXHJcbiAgPiAgICAgIC8vICdlbXBsb3llZScgaXMgYSBwcmV2aW91c2x5IHF1ZXJpZWQgZW1wbG95ZWVcclxuICA+ICAgICAgbGV0IG9yZGVyc05hdlByb3AgPSBlbXBsb3llZS5lbnRpdHlUeXBlLmdldFByb3BlcnR5KFwiT3JkZXJzXCIpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5TmF2aWdhdGlvbihlbXBsb3llZSwgb3JkZXJzTmF2UHJvcCk7XHJcblxyXG4gIHdpbGwgcmV0dXJuIGEgcXVlcnkgZm9yIHRoZSBcIk9yZGVyc1wiIG9mIHRoZSBzcGVjaWZpZWQgJ2VtcGxveWVlJy5cclxuICBAcGFyYW0gZW50aXR5IC0gVGhlIEVudGl0eSB3aG9zZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpbGwgYmUgcXVlcmllZC5cclxuICBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IC0gVGhlIFtbTmF2aWdhdGlvblByb3BlcnR5XV0gb3IgbmFtZSBvZiB0aGUgTmF2aWdhdGlvblByb3BlcnR5IHRvIGJlIHF1ZXJpZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FbnRpdHlOYXZpZ2F0aW9uID0gZnVuY3Rpb24gKGVudGl0eTogRW50aXR5LCBuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHN0cmluZykge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5LCBcImVudGl0eVwiKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgbmF2UHJvcGVydHkgPSBlbnRpdHkuZW50aXR5VHlwZS5fY2hlY2tOYXZQcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgbGV0IHEgPSBuZXcgRW50aXR5UXVlcnkobmF2UHJvcGVydHkuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcmVkID0gYnVpbGROYXZpZ2F0aW9uUHJlZGljYXRlKGVudGl0eSwgbmF2UHJvcGVydHkpO1xyXG4gICAgaWYgKHByZWQgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gY3JlYXRlIGEgTmF2aWdhdGlvblF1ZXJ5IGZvciBuYXZpZ2F0aW9uUHJvcGVydHk6IFwiICsgbmF2UHJvcGVydHkubmFtZSApO1xyXG4gICAgfVxyXG4gICAgcSA9IHEud2hlcmUocHJlZCk7XHJcbiAgICBsZXQgZW0gPSBlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICByZXR1cm4gZW0gPyBxLnVzaW5nKGVtKSA6IHE7XHJcbiAgfTtcclxuXHJcbiAgLy8gcHJvdGVjdGVkIG1ldGhvZHNcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgdGhyb3dFcnJvcklmTm90Rm91bmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyBVbmNvbW1lbnQgbmV4dCB0d28gbGluZXMgaWYgd2UgbWFrZSB0aGlzIG1ldGhvZCBwdWJsaWMuXHJcbiAgICAvLyBhc3NlcnRQYXJhbShtZXRhZGF0YVN0b3JlLCBcIm1ldGFkYXRhU3RvcmVcIikuaXNJbnN0YW5jZU9mKE1ldGFkYXRhU3RvcmUpLmNoZWNrKCk7XHJcbiAgICAvLyBhc3NlcnRQYXJhbSh0aHJvd0Vycm9ySWZOb3RGb3VuZCwgXCJ0aHJvd0Vycm9ySWZOb3RGb3VuZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGxldCBlbnRpdHlUeXBlID0gdGhpcy5mcm9tRW50aXR5VHlwZTtcclxuICAgIGlmIChlbnRpdHlUeXBlKSByZXR1cm4gZW50aXR5VHlwZTtcclxuXHJcbiAgICBsZXQgcmVzb3VyY2VOYW1lID0gdGhpcy5yZXNvdXJjZU5hbWU7XHJcbiAgICBpZiAoIXJlc291cmNlTmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyByZXNvdXJjZU5hbWUgZm9yIHRoaXMgcXVlcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFkYXRhU3RvcmUuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0aHJvd0Vycm9ySWZOb3RGb3VuZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIG1ldGFkYXRhIGF2YWlsYWJsZSBmb3IgdGhpcyBxdWVyeS4gXCIgK1xyXG4gICAgICAgICAgXCJBcmUgeW91IHF1ZXJ5aW5nIHRoZSBsb2NhbCBjYWNoZSBiZWZvcmUgeW91J3ZlIGZldGNoZWQgbWV0YWRhdGE/XCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBtZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGVOYW1lRm9yUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7XHJcbiAgICBpZiAoZW50aXR5VHlwZU5hbWUpIHtcclxuICAgICAgZW50aXR5VHlwZSA9IG1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGVudGl0eVR5cGVOYW1lKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZW50aXR5VHlwZSA9IHRoaXMuX2dldFRvRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWVudGl0eVR5cGUpIHtcclxuICAgICAgaWYgKHRocm93RXJyb3JJZk5vdEZvdW5kKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvcmUuZm9ybWF0U3RyaW5nKFwiQ2Fubm90IGZpbmQgYW4gZW50aXR5VHlwZSBmb3IgcmVzb3VyY2VOYW1lOiAnJTEnLiBcIiwgcmVzb3VyY2VOYW1lKSArIGNvcmUuc3RyaW5ncy5UT19UWVBFKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mcm9tRW50aXR5VHlwZSA9IGVudGl0eVR5cGU7XHJcbiAgICByZXR1cm4gZW50aXR5VHlwZTtcclxuXHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZ2V0VG9FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIHNraXBGcm9tQ2hlY2s/OiBib29sZWFuKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAvLyBza2lwRnJvbUNoZWNrIGlzIHRvIGF2b2lkIHJlY3Vyc2lvbiBpZiBjYWxsZWQgZnJvbSBfZ2V0RnJvbUVudGl0eVR5cGU7XHJcbiAgICBpZiAodGhpcy5yZXN1bHRFbnRpdHlUeXBlIGluc3RhbmNlb2YgRW50aXR5VHlwZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnJlc3VsdEVudGl0eVR5cGUpIHtcclxuICAgICAgLy8gcmVzdWx0RW50aXR5VHlwZSBpcyBhIHN0cmluZ1xyXG4gICAgICB0aGlzLnJlc3VsdEVudGl0eVR5cGUgPSBtZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZSh0aGlzLnJlc3VsdEVudGl0eVR5cGUsIGZhbHNlKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmVzb2x2ZSBpdCwgaWYgcG9zc2libGUsIHZpYSB0aGUgcmVzb3VyY2VOYW1lXHJcbiAgICAgIC8vIGRvIG5vdCBjYWNoZSB0aGlzIHZhbHVlIGluIHRoaXMgY2FzZVxyXG4gICAgICAvLyBjYW5ub3QgZGV0ZXJtaW5lIHRoZSByZXN1bHRFbnRpdHlUeXBlIGlmIGEgc2VsZWN0Q2xhdXNlIGlzIHByZXNlbnQuXHJcbiAgICAgIC8vIHJldHVybiBza2lwRnJvbUNoZWNrID8gbnVsbCA6ICghdGhpcy5zZWxlY3RDbGF1c2UpICYmIHRoaXMuX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIGZhbHNlKTtcclxuICAgICAgaWYgKHNraXBGcm9tQ2hlY2sgfHwgdGhpcy5zZWxlY3RDbGF1c2UpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIGZvciB0ZXN0aW5nXHJcbiAgX3RvVXJpKGVtOiBFbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICBsZXQgZHMgPSBEYXRhU2VydmljZS5yZXNvbHZlKFtlbS5kYXRhU2VydmljZV0pO1xyXG4gICAgcmV0dXJuIGRzIS51cmlCdWlsZGVyIS5idWlsZFVyaSh0aGlzLCBlbS5tZXRhZGF0YVN0b3JlKTtcclxuICB9XHJcblxyXG59XHJcbkVudGl0eVF1ZXJ5LnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJFbnRpdHlRdWVyeVwiO1xyXG5cclxuLy8gcHJpdmF0ZSBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIGZyb21KU09OKGVxOiBFbnRpdHlRdWVyeSwganNvbjogT2JqZWN0KSB7XHJcbiAgY29yZS50b0pzb24oanNvbiwge1xyXG4gICAgXCJyZXNvdXJjZU5hbWUsZnJvbVwiOiBudWxsLFxyXG4gICAgLy8ganVzdCB0aGUgbmFtZSBjb21lcyBiYWNrIGFuZCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyXHJcbiAgICBcInJlc3VsdEVudGl0eVR5cGUsdG9UeXBlXCI6IG51bGwsXHJcbiAgICBcIndoZXJlUHJlZGljYXRlLHdoZXJlXCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgUHJlZGljYXRlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwib3JkZXJCeUNsYXVzZSxvcmRlckJ5XCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgT3JkZXJCeUNsYXVzZSh2KSA6IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcbiAgICBcInNlbGVjdENsYXVzZSxzZWxlY3RcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IG5ldyBTZWxlY3RDbGF1c2UodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJleHBhbmRDbGF1c2UsZXhwYW5kXCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgRXhwYW5kQ2xhdXNlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwic2tpcENvdW50LHNraXBcIjogbnVsbCxcclxuICAgIFwidGFrZUNvdW50LHRha2VcIjogbnVsbCxcclxuICAgIHBhcmFtZXRlcnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNFbXB0eSh2KSA/IHVuZGVmaW5lZCA6IHY7XHJcbiAgICB9LFxyXG4gICAgXCJpbmxpbmVDb3VudEVuYWJsZWQsaW5saW5lQ291bnRcIjogZmFsc2UsXHJcbiAgICBcIm5vVHJhY2tpbmdFbmFibGVkLG5vVHJhY2tpbmdcIjogZmFsc2UsXHJcbiAgICBxdWVyeU9wdGlvbnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBRdWVyeU9wdGlvbnMuZnJvbUpTT04odikgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfSwgZXEpO1xyXG4gIHJldHVybiBlcTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xvbmUoZXE6IEVudGl0eVF1ZXJ5LCBwcm9wTmFtZT86IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcclxuICAvLyBpbW11dGFibGUgcXVlcmllcyBtZWFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjbG9uZSBpZiBubyBjaGFuZ2UgaW4gdmFsdWUuXHJcbiAgaWYgKHByb3BOYW1lKSB7XHJcbiAgICBpZiAoZXFbcHJvcE5hbWVdID09PSB2YWx1ZSkgcmV0dXJuIGVxO1xyXG4gIH1cclxuICAvLyBjb3B5aW5nIFF1ZXJ5T3B0aW9ucyBpcyBzYWZlIGJlY2F1c2UgdGhleSBhcmUgYXJlIGltbXV0YWJsZTtcclxuICBsZXQgY29weSA9IGNvcmUuZXh0ZW5kKG5ldyBFbnRpdHlRdWVyeSgpLCBlcSwgW1xyXG4gICAgXCJyZXNvdXJjZU5hbWVcIixcclxuICAgIFwiZnJvbUVudGl0eVR5cGVcIixcclxuICAgIFwid2hlcmVQcmVkaWNhdGVcIixcclxuICAgIFwib3JkZXJCeUNsYXVzZVwiLFxyXG4gICAgXCJzZWxlY3RDbGF1c2VcIixcclxuICAgIFwic2tpcENvdW50XCIsXHJcbiAgICBcInRha2VDb3VudFwiLFxyXG4gICAgXCJleHBhbmRDbGF1c2VcIixcclxuICAgIFwiaW5saW5lQ291bnRFbmFibGVkXCIsXHJcbiAgICBcIm5vVHJhY2tpbmdFbmFibGVkXCIsXHJcbiAgICBcInVzZXNOYW1lT25TZXJ2ZXJcIixcclxuICAgIFwicXVlcnlPcHRpb25zXCIsXHJcbiAgICBcImVudGl0eU1hbmFnZXJcIixcclxuICAgIFwiZGF0YVNlcnZpY2VcIixcclxuICAgIFwicmVzdWx0RW50aXR5VHlwZVwiXHJcbiAgXSkgYXMgRW50aXR5UXVlcnk7XHJcbiAgY29weS5wYXJhbWV0ZXJzID0gY29yZS5leHRlbmQoe30sIGVxLnBhcmFtZXRlcnMpO1xyXG4gIGlmIChwcm9wTmFtZSkge1xyXG4gICAgY29weVtwcm9wTmFtZV0gPSB2YWx1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NVc2luZyhlcTogRW50aXR5UXVlcnksIG1hcDogT2JqZWN0LCB2YWx1ZTogYW55LCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHtcclxuICBsZXQgdHlwZU5hbWUgPSB2YWx1ZS5fJHR5cGVOYW1lIHx8ICgodmFsdWUgaW5zdGFuY2VvZiBCcmVlemVFbnVtKSAmJiAodmFsdWUuY29uc3RydWN0b3IgYXMgYW55KS5uYW1lKTtcclxuICBsZXQga2V5ID0gdHlwZU5hbWUgJiYgdHlwZU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyB0eXBlTmFtZS5zdWJzdHIoMSk7XHJcbiAgaWYgKHByb3BlcnR5TmFtZSAmJiBrZXkgIT09IHByb3BlcnR5TmFtZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHk6IFwiICsgcHJvcGVydHlOYW1lKTtcclxuICB9XHJcbiAgaWYgKGtleSkge1xyXG4gICAgbGV0IGZuID0gbWFwW2tleV07XHJcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZyBwcm9wZXJ0eTogXCIgKyBrZXkpO1xyXG4gICAgfSBlbHNlIGlmIChmbiA9PT0gbnVsbCkge1xyXG4gICAgICBlcVtrZXldID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmbihlcSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb3JlLm9iamVjdEZvckVhY2godmFsdWUsIChwcm9wTmFtZSwgdmFsKSA9PiB7XHJcbiAgICAgIHByb2Nlc3NVc2luZyhlcSwgbWFwLCB2YWwsIHByb3BOYW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gIGFzc2VydFBhcmFtKHByb3BlcnR5UGF0aHMsIFwicHJvcGVydHlQYXRoc1wiKS5pc09wdGlvbmFsKCkuaXNTdHJpbmcoKS5vcigpLmlzQXJyYXkoKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVBhdGhzID09PSAnc3RyaW5nJykge1xyXG4gICAgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHMuc3BsaXQoXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgcmV0dXJuIHBwLnRyaW0oKTtcclxuICB9KTtcclxuICByZXR1cm4gcHJvcGVydHlQYXRocztcclxufVxyXG5cclxuZnVuY3Rpb24gYnVpbGRQcmVkaWNhdGUoZW50aXR5OiBFbnRpdHkpIHtcclxuICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eS5lbnRpdHlUeXBlO1xyXG4gIGxldCBwcmVkUGFydHMgPSBlbnRpdHlUeXBlLmtleVByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChrcCkge1xyXG4gICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoa3AubmFtZSwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIGVudGl0eS5nZXRQcm9wZXJ0eShrcC5uYW1lKSk7XHJcbiAgfSk7XHJcbiAgbGV0IHByZWQgPSBQcmVkaWNhdGUuYW5kKHByZWRQYXJ0cyk7XHJcbiAgcmV0dXJuIHByZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkS2V5UHJlZGljYXRlKGVudGl0eUtleTogRW50aXR5S2V5KSB7XHJcbiAgbGV0IGtleVByb3BzID0gZW50aXR5S2V5LmVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICBsZXQgcHJlZHMgPSBjb3JlLmFycmF5WmlwKGtleVByb3BzLCBlbnRpdHlLZXkudmFsdWVzLCBmdW5jdGlvbiAoa3AsIHYpIHtcclxuICAgIHJldHVybiBQcmVkaWNhdGUuY3JlYXRlKGtwLm5hbWUsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCB2KTtcclxuICB9KTtcclxuICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5hbmQocHJlZHMpO1xyXG4gIHJldHVybiBwcmVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZE5hdmlnYXRpb25QcmVkaWNhdGUoZW50aXR5OiBFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eS5mb3JlaWduS2V5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZWxhdGVkS2V5VmFsdWVzID0gbmF2aWdhdGlvblByb3BlcnR5LmZvcmVpZ25LZXlOYW1lcy5tYXAoKGZrTmFtZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZW50aXR5LmdldFByb3BlcnR5KGZrTmFtZSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBlbnRpdHlLZXkgPSBuZXcgRW50aXR5S2V5KG5hdmlnYXRpb25Qcm9wZXJ0eS5lbnRpdHlUeXBlLCByZWxhdGVkS2V5VmFsdWVzKTtcclxuICAgIHJldHVybiBidWlsZEtleVByZWRpY2F0ZShlbnRpdHlLZXkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgaW52ZXJzZU5wID0gbmF2aWdhdGlvblByb3BlcnR5LmludmVyc2U7XHJcbiAgICBsZXQgZm9yZWlnbktleU5hbWVzID0gaW52ZXJzZU5wID8gaW52ZXJzZU5wLmZvcmVpZ25LZXlOYW1lcyA6IG5hdmlnYXRpb25Qcm9wZXJ0eS5pbnZGb3JlaWduS2V5TmFtZXM7XHJcbiAgICBpZiAoZm9yZWlnbktleU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQga2V5VmFsdWVzID0gZW50aXR5LmVudGl0eUFzcGVjdC5nZXRLZXkoKS52YWx1ZXM7XHJcbiAgICBsZXQgcHJlZFBhcnRzID0gY29yZS5hcnJheVppcChmb3JlaWduS2V5TmFtZXMsIGtleVZhbHVlcywgKGZrTmFtZSwga3YpID0+IHtcclxuICAgICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoZmtOYW1lLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywga3YpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gUHJlZGljYXRlLmFuZChwcmVkUGFydHMpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEJhc2UgY2xhc3MgZm9yIEJvb2xlYW5RdWVyeU9wIGFuZCBGaWx0ZXJRdWVyeU9wICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIG9wZXJhdG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbkZpbHRlclF1ZXJ5T3AgaXMgYW4gJ0VudW0nIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWxpZCAgW1tQcmVkaWNhdGVdXVxyXG5maWx0ZXIgb3BlcmF0b3JzIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRmlsdGVyUXVlcnlPcCBleHRlbmRzIEJyZWV6ZUVudW0gaW1wbGVtZW50cyBRdWVyeU9wIHtcclxuICAvKiogVGhlIG9wZXJhdG9yIGZvciB0aGlzIGVudW0uICovXHJcbiAgZGVjbGFyZSBvcGVyYXRvcjogc3RyaW5nO1xyXG5cclxuICAvKiogQWxpYXNlczogXCJlcVwiLCBcIj09XCIgKiovXHJcbiAgc3RhdGljIEVxdWFscyA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZXFcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibmVcIiwgXCIhPVwiICAqKi9cclxuICBzdGF0aWMgTm90RXF1YWxzID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJuZVwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImd0XCIsIFwiPlwiICAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJndFwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImx0XCIsIFwiPFwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW4gPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImx0XCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcImdlXCIsIFwiPj1cIiAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuT3JFcXVhbCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZ2VcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibGVcIiwgXCI8PVwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW5PckVxdWFsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJsZVwiIH0pO1xyXG4gIC8qKiAgU3RyaW5nIG9wZXJhdGlvbjogSXMgYSBzdHJpbmcgYSBzdWJzdHJpbmcgb2YgYW5vdGhlciBzdHJpbmcuICBBbGlhc2VzOiBcInN1YnN0cmluZ29mXCIgICAqKi9cclxuICBzdGF0aWMgQ29udGFpbnMgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImNvbnRhaW5zXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgU3RhcnRzV2l0aCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwic3RhcnRzd2l0aFwiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIEVuZHNXaXRoID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJlbmRzd2l0aFwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJzb21lXCIgICoqL1xyXG4gIHN0YXRpYyBBbnkgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFueVwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJldmVyeVwiICAqKi9cclxuICBzdGF0aWMgQWxsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbGxcIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJbiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaW5cIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJc1R5cGVPZiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaXNvZlwiIH0pO1xyXG59XHJcbkZpbHRlclF1ZXJ5T3AucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkZpbHRlclF1ZXJ5T3BcIjtcclxuRXJyb3JbJ3gnXSA9IEZpbHRlclF1ZXJ5T3AucmVzb2x2ZVN5bWJvbHMoKTtcclxuXHJcblxyXG4vKipcclxuIEJvb2xlYW5RdWVyeU9wIGlzIGFuICdFbnVtJyBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsaWQgIGJvb2xlYW5cclxub3BlcmF0b3JzIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgQm9vbGVhblF1ZXJ5T3AgZXh0ZW5kcyBCcmVlemVFbnVtIGltcGxlbWVudHMgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIGRlY2xhcmUgb3BlcmF0b3I6IHN0cmluZztcclxuXHJcbiAgc3RhdGljIEFuZCA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFuZFwiIH0pO1xyXG4gIHN0YXRpYyBPciA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcIm9yXCIgfSk7XHJcbiAgc3RhdGljIE5vdCA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcIm5vdFwiIH0pO1xyXG5cclxufVxyXG5Cb29sZWFuUXVlcnlPcC5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiQm9vbGVhblF1ZXJ5T3BcIjtcclxuRXJyb3JbJ3gnXSA9IEJvb2xlYW5RdWVyeU9wLnJlc29sdmVTeW1ib2xzKCk7XHJcblxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuICBUaGUgY2xhc3MgaXMgdXNlZCBpbiBtb3N0IFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb25zXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW5cclxuXHJcbkFuIE9yZGVyQnlDbGF1c2UgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydGllcyBhbmQgZGlyZWN0aW9uIHRoYXQgdGhlIHJlc3VsdFxyXG5vZiBhIHF1ZXJ5IHNob3VsZCBiZSBzb3J0ZWQgaW4uICBPcmRlckJ5Q2xhdXNlcyBhcmUgaW1tdXRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGFueVxyXG5tZXRob2QgdGhhdCB3b3VsZCBtb2RpZnkgYW4gT3JkZXJCeUNsYXVzZSBhY3R1YWxseSByZXR1cm5zIGEgbmV3IE9yZGVyQnlDbGF1c2UuXHJcblxyXG5Gb3IgZXhhbXBsZSBmb3IgYW4gRW1wbG95ZWUgb2JqZWN0IHdpdGggcHJvcGVydGllcyBvZiAnQ29tcGFueScgYW5kICdMYXN0TmFtZScgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSB2YWxpZCBleHByZXNzaW9uczpcclxuPiAgICAgbGV0IG9iYyA9IG5ldyBPcmRlckJ5Q2xhdXNlKFwiQ29tcGFueS5Db21wYW55TmFtZSwgTGFzdE5hbWVcIilcclxuXHJcbm9yXHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUgZGVzYywgTGFzdE5hbWVcIilcclxuXHJcbm9yXHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUsIExhc3ROYW1lXCIsIHRydWUpO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgT3JkZXJCeUNsYXVzZSB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgaXRlbXM6IE9yZGVyQnlJdGVtW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdIHwgT3JkZXJCeUNsYXVzZVtdLCBpc0Rlc2M/OiBib29sZWFuKSB7XHJcbiAgICBpZiAocHJvcGVydHlQYXRocy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3JkZXJCeUNsYXVzZSBjYW5ub3QgYmUgZW1wdHlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8geW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gYXJyYXkgb2Ygb3JkZXJCeUNsYXVzZXNcclxuICAgIGlmIChwcm9wZXJ0eVBhdGhzWzBdIGluc3RhbmNlb2YgT3JkZXJCeUNsYXVzZSkge1xyXG4gICAgICBsZXQgY2xhdXNlcyA9IHByb3BlcnR5UGF0aHMgYXMgT3JkZXJCeUNsYXVzZVtdO1xyXG4gICAgICB0aGlzLml0ZW1zID0gY29yZS5hcnJheUZsYXRNYXAoY2xhdXNlcywgYyA9PiBjLml0ZW1zKTtcclxuICAgICAgLy8gdGhpcy5pdGVtcyA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoY2xhdXNlc1swXS5pdGVtcywgY2xhdXNlcy5zbGljZSgxKS5tYXAoY29yZS5wbHVjayhcIml0ZW1zXCIpKSk7XHJcbiAgICAgIC8vIHRoaXMuaXRlbXMgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjbGF1c2VzLm1hcChjb3JlLnBsdWNrKFwiaXRlbXNcIikpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSAocHJvcGVydHlQYXRocyBhcyBzdHJpbmdbXSkubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW0ocHAsIGlzRGVzYyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsaWRhdGUoZW50aXR5VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENvbXBhcmVyKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGxldCBvcmRlckJ5RnVuY3MgPSB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbiAob2JjKSB7XHJcbiAgICAgIHJldHVybiBvYmMuZ2V0Q29tcGFyZXIoZW50aXR5VHlwZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5MTogYW55LCBlbnRpdHkyOiBhbnkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlckJ5RnVuY3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gb3JkZXJCeUZ1bmNzW2ldKGVudGl0eTEsIGVudGl0eTIpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHlQYXRoRm4hKGl0ZW0ucHJvcGVydHlQYXRoKSArIChpdGVtLmlzRGVzYyA/IFwiIGRlc2NcIiA6IFwiXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBPcmRlckJ5SXRlbSB7XHJcbiAgcHJvcGVydHlQYXRoOiBzdHJpbmc7XHJcbiAgaXNEZXNjOiBib29sZWFuO1xyXG4gIGxhc3RQcm9wZXJ0eTogRW50aXR5UHJvcGVydHk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aDogc3RyaW5nLCBpc0Rlc2M/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoISh0eXBlb2YgcHJvcGVydHlQYXRoID09PSAnc3RyaW5nJykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJvcGVydHlQYXRoIGlzIG5vdCBhIHN0cmluZ1wiKTtcclxuICAgIH1cclxuICAgIHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aC50cmltKCk7XHJcblxyXG4gICAgbGV0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcgJyk7XHJcbiAgICAvLyBwYXJ0c1swXSBpcyB0aGUgcHJvcGVydHlQYXRoOyBbMV0gd291bGQgYmUgd2hldGhlciBkZXNjZW5kaW5nIG9yIG5vdC5cclxuICAgIC8vIGlmIChwYXJ0cy5sZW5ndGggPiAxICYmIGlzRGVzYyAhPT0gdHJ1ZSAmJiBpc0Rlc2MgIT09IGZhbHNlKSB7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSAmJiBpc0Rlc2MgPT0gbnVsbCkge1xyXG4gICAgICBpc0Rlc2MgPSBjb3JlLnN0cmluZ1N0YXJ0c1dpdGgocGFydHNbMV0udG9Mb3dlckNhc2UoKSwgXCJkZXNjXCIpO1xyXG4gICAgICBpZiAoIWlzRGVzYykge1xyXG4gICAgICAgIC8vIGlzRGVzYyBpcyBmYWxzZSBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIGl0cyBpbnRlbmRlZC5cclxuICAgICAgICBsZXQgaXNBc2MgPSBjb3JlLnN0cmluZ1N0YXJ0c1dpdGgocGFydHNbMV0udG9Mb3dlckNhc2UoKSwgXCJhc2NcIik7XHJcbiAgICAgICAgaWYgKCFpc0FzYykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIHNlY29uZCB3b3JkIGluIHRoZSBwcm9wZXJ0eVBhdGggbXVzdCBiZWdpbiB3aXRoICdkZXNjJyBvciAnYXNjJ1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHBhcnRzWzBdO1xyXG4gICAgdGhpcy5pc0Rlc2MgPSBpc0Rlc2MgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRW50aXR5UHJvcGVydHkgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKGVudGl0eVR5cGUgPT0gbnVsbCB8fCBlbnRpdHlUeXBlLmlzQW5vbnltb3VzKSByZXR1cm47XHJcbiAgICAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBiYWQgcHJvcGVydHlQYXRoXHJcbiAgICB0aGlzLmxhc3RQcm9wZXJ0eSA9IGVudGl0eVR5cGUuZ2V0UHJvcGVydHkodGhpcy5wcm9wZXJ0eVBhdGgsIHRydWUpIGFzIEVudGl0eVByb3BlcnR5O1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdFByb3BlcnR5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcGFyZXIoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgbGV0IHByb3BEYXRhVHlwZTogRGF0YVR5cGU7XHJcbiAgICBsZXQgaXNDYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xyXG4gICAgaWYgKCF0aGlzLmxhc3RQcm9wZXJ0eSkgdGhpcy52YWxpZGF0ZShlbnRpdHlUeXBlKTtcclxuICAgIGlmICh0aGlzLmxhc3RQcm9wZXJ0eSkge1xyXG4gICAgICBwcm9wRGF0YVR5cGUgPSAodGhpcy5sYXN0UHJvcGVydHkgYXMgYW55KS5kYXRhVHlwZTtcclxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gdGhpcy5sYXN0UHJvcGVydHkucGFyZW50VHlwZS5tZXRhZGF0YVN0b3JlLmxvY2FsUXVlcnlDb21wYXJpc29uT3B0aW9ucy5pc0Nhc2VTZW5zaXRpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHByb3BlcnR5UGF0aCA9IHRoaXMucHJvcGVydHlQYXRoO1xyXG4gICAgbGV0IGlzRGVzYyA9IHRoaXMuaXNEZXNjO1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5MTogYW55LCBlbnRpdHkyOiBhbnkpIHtcclxuICAgICAgbGV0IHZhbHVlMSA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHkxLCBwcm9wZXJ0eVBhdGgpO1xyXG4gICAgICBsZXQgdmFsdWUyID0gRW50aXR5QXNwZWN0LmdldFByb3BlcnR5UGF0aFZhbHVlKGVudGl0eTIsIHByb3BlcnR5UGF0aCk7XHJcbiAgICAgIGxldCBkYXRhVHlwZSA9IHByb3BEYXRhVHlwZSB8fCAodmFsdWUxICYmIERhdGFUeXBlLmZyb21WYWx1ZSh2YWx1ZTEpKSB8fCBEYXRhVHlwZS5mcm9tVmFsdWUodmFsdWUyKTtcclxuICAgICAgaWYgKGRhdGFUeXBlID09PSBEYXRhVHlwZS5TdHJpbmcpIHtcclxuICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTEgfHwgXCJcIjtcclxuICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMiB8fCBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWx1ZTEgPSAodmFsdWUxIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICB2YWx1ZTIgPSAodmFsdWUyIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBub3JtYWxpemUgPSBEYXRhVHlwZS5nZXRDb21wYXJhYmxlRm4oZGF0YVR5cGUpO1xyXG4gICAgICAgIHZhbHVlMSA9IG5vcm1hbGl6ZSh2YWx1ZTEpO1xyXG4gICAgICAgIHZhbHVlMiA9IG5vcm1hbGl6ZSh2YWx1ZTIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlMSA+IHZhbHVlMiB8fCB2YWx1ZTIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBpc0Rlc2MgPyAtMSA6IDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVzYyA/IDEgOiAtMTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFNlbGVjdENsYXVzZSB7XHJcbiAgcHJvcGVydHlQYXRoczogc3RyaW5nW107XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3BhdGhOYW1lczogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzO1xyXG4gICAgdGhpcy5fcGF0aE5hbWVzID0gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgIHJldHVybiBwcC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuOyAvLyBjYW4ndCB2YWxpZGF0ZSB5ZXRcclxuICAgIC8vIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGJhZCBwcm9wZXJ0eVBhdGhcclxuICAgIHRoaXMucHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XHJcbiAgICAgIGVudGl0eVR5cGUuZ2V0UHJvcGVydHkocGF0aCwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvRnVuY3Rpb24oLyogY29uZmlnICovKSB7XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTogRW50aXR5KSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSB7fTtcclxuICAgICAgdGhhdC5wcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHBhdGgsIGkpIHtcclxuICAgICAgICByZXN1bHRbdGhhdC5fcGF0aE5hbWVzW2ldXSA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHksIHBhdGgpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0b0pTT05FeHQoY29udGV4dDogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5UGF0aEZuIShwcCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEV4cGFuZENsYXVzZSB7XHJcbiAgcHJvcGVydHlQYXRoczogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzO1xyXG4gIH1cclxuXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ6IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLnByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eVBhdGhGbiEocHApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|
|
1042
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9lbnRpdHktcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQTJCLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQWlCLFVBQVUsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXeEM7Ozs7OztHQU1HO0FBQ0g7SUEwQ0U7Ozs7Ozs7O09BUUc7SUFDSCxxQkFBWSxZQUE4QjtRQUN4QyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsRUFBRTtZQUM5RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDckM7UUFDRCw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFzQixDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FB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Q0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFSCxtQkFBQztBQUFELENBQUMsQUFiRCxJQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSwgQ2FsbGJhY2ssIEVycm9yQ2FsbGJhY2sgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IEVudGl0eUFzcGVjdCwgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgRW50aXR5S2V5IH0gZnJvbSAnLi9lbnRpdHkta2V5JztcclxuaW1wb3J0IHsgQnJlZXplRW51bSB9IGZyb20gJy4vZW51bSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlLCBKc29uUmVzdWx0c0FkYXB0ZXIgfSBmcm9tICcuL2RhdGEtc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgRW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IFF1ZXJ5T3B0aW9ucywgTWVyZ2VTdHJhdGVneSwgRmV0Y2hTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IFByZWRpY2F0ZSB9IGZyb20gJy4vcHJlZGljYXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJzaXZlQXJyYXk8VD4ge1xyXG4gIFtpOiBudW1iZXJdOiBUIHwgUmVjdXJzaXZlQXJyYXk8VD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5UXVlcnlKc29uQ29udGV4dCB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgcHJvcGVydHlQYXRoRm4/OiBGdW5jdGlvbjsgLy8gVE9ET1xyXG4gIHRvTmFtZU9uU2VydmVyPzogYm9vbGVhbjtcclxufVxyXG4vKipcclxuQW4gRW50aXR5UXVlcnkgaW5zdGFuY2UgaXMgdXNlZCB0byBxdWVyeSBlbnRpdGllcyBlaXRoZXIgZnJvbSBhIHJlbW90ZSBkYXRhc291cmNlIG9yIGZyb20gYSBsb2NhbCBbW0VudGl0eU1hbmFnZXJdXS5cclxuXHJcbkVudGl0eVF1ZXJpZXMgYXJlIGltbXV0YWJsZSAtIHRoaXMgbWVhbnMgdGhhdCBhbGwgRW50aXR5UXVlcnkgbWV0aG9kcyB0aGF0IHJldHVybiBhbiBFbnRpdHlRdWVyeSBhY3R1YWxseSBjcmVhdGUgYSBuZXcgRW50aXR5UXVlcnkuICBUaGlzIG1lYW5zIHRoYXRcclxuRW50aXR5UXVlcmllcyBjYW4gYmUgJ21vZGlmaWVkJyB3aXRob3V0IGFmZmVjdGluZyBhbnkgY3VycmVudCBpbnN0YW5jZXMuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5UXVlcnkge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBhY3R1YWxseSBwbGFjZWQgb24gcHJvdG90eXBlXHJcbiAgLy8gdG9wID0gdGhpcy50YWtlOyAvLyBUT0RPOiBjb25zaWRlclxyXG4gIC8qKiBUaGUgcmVzb3VyY2UgbmFtZSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHJlc291cmNlTmFtZT86IHN0cmluZztcclxuICAvKiogVGhlIFtbRW50aXR5VHlwZV1dIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAnZnJvbScgY2xhdXNlICggcmVzb3VyY2VOYW1lKSBvZiB0aGUgcXVlcnkuICBUaGlzIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBiZSBzZXQgQUZURVIgdGhlIHF1ZXJ5XHJcbiAgaGFzIGJlZW4gZXhlY3V0ZWQgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBbW01ldGFkYXRhU3RvcmVdXSBhc3NvY2lhdGVkIHdpdGggdGhlIFtbRW50aXR5TWFuYWdlcl1dIHRoYXQgdGhlIHF1ZXJ5IHdhcyBleGVjdXRlZCBhZ2FpbnN0LlxyXG4gIFRoaXMgdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIGVudGl0eVR5cGUgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlTmFtZS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgZnJvbUVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG4gIC8qKiBUaGUgJ3doZXJlJyBbW1ByZWRpY2F0ZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgd2hlcmVQcmVkaWNhdGU6IFByZWRpY2F0ZTsgLy8gVE9ET1xyXG4gIC8qKiBUaGUgW1tPcmRlckJ5Q2xhdXNlXV0gdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSBvcmRlckJ5Q2xhdXNlPzogT3JkZXJCeUNsYXVzZTtcclxuICAvKiogVGhlIFtbRXhwYW5kQ2xhdXNlXV0gdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSBleHBhbmRDbGF1c2U/OiBFeHBhbmRDbGF1c2U7XHJcbiAgLyoqIFRoZSBbW1NlbGVjdENsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgc2VsZWN0Q2xhdXNlPzogU2VsZWN0Q2xhdXNlO1xyXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvICdza2lwJyBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgc2tpcENvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvICd0YWtlJyBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgdGFrZUNvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgcXVlcnkgdmlhIHRoZSAnd2l0aFBhcmFtZXRlcnMnIG1ldGhvZC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgcGFyYW1ldGVyczogT2JqZWN0O1xyXG4gIC8qKiBXaGV0aGVyIGFuIGlubGluZSBjb3VudCBpcyByZXR1cm5lZCBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgaW5saW5lQ291bnRFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSB0cmFja2luZyBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgbm9UcmFja2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdG8gc2VuZCBxdWVyeSBhcyB0aGUgYm9keSBvZiBhIFBPU1QgcmVxdWVzdC4gIChTZXJ2ZXIgbmVlZHMgdG8gYWNjb21vZGF0ZSBQT1NUKS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgdXNlUG9zdEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBbW1F1ZXJ5T3B0aW9uc11dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICAvLyBkZWZhdWx0IGlzIHRvIGdldCBxdWVyeU9wdGlvbnMgYW5kIGRhdGFTZXJ2aWNlIGZyb20gdGhlIGVudGl0eU1hbmFnZXIuXHJcbiAgZGVjbGFyZSBxdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbnM7XHJcbiAgLyoqIFRoZSBbW0RhdGFTZXJ2aWNlXV0gZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgZGF0YVNlcnZpY2U/OiBEYXRhU2VydmljZTtcclxuICAvKiogVGhlIFtbRW50aXR5TWFuYWdlcl1dIGZvciB0aGlzIHF1ZXJ5LiBUaGlzIG1heSBiZSBudWxsIGFuZCBjYW4gYmUgc2V0IHZpYSB0aGUgJ3VzaW5nJyBtZXRob2QuICAqKi9cclxuICBkZWNsYXJlIGVudGl0eU1hbmFnZXI/OiBFbnRpdHlNYW5hZ2VyO1xyXG4gIC8qKiAgVGhlIGVudGl0eVR5cGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoaXMgcXVlcnkuIFxyXG4gIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHNldCBpZiB0aGUgJ3RvVHlwZScgbWV0aG9kIHdhcyBjYWxsZWQuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHJlc3VsdEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCBzdHJpbmc7XHJcbiAgZGVjbGFyZSB1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIENvbnN0cnVjdG9yXHJcbiAgPiAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuXHJcbiAgVXN1YWxseSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZmlsdGVyaW5nLCBvcmRlcmluZyBvciBzZWxlY3Rpb24gbWV0aG9kc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJSZWdpb25cIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIGVpdGhlciBhIHJlc291cmNlIG5hbWUgb3IgYSBzZXJpYWxpemVkIEVudGl0eVF1ZXJ5ICggY3JlYXRlZCBieSBbW0VudGl0eVF1ZXJ5LnRvSlNPTl1dKVxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKHJlc291cmNlTmFtZT86IHN0cmluZyB8IE9iamVjdCkge1xyXG4gICAgaWYgKHJlc291cmNlTmFtZSAhPSBudWxsICYmICh0eXBlb2YgcmVzb3VyY2VOYW1lICE9PSAnc3RyaW5nJykpIHtcclxuICAgICAgcmV0dXJuIGZyb21KU09OKHRoaXMsIHJlc291cmNlTmFtZSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBjYXN0IGFzIHN0cmluZyBiZWxvdyBuZWVkZWQgZm9yIGVhcmx5IHZlcnNpb25zIG9mIFR5cGVEb2MgLSBidXQgbm90IGZvciByZWd1bGFyIGNvbXBpbGUgLSBjaGVjayBsYXRlclxyXG4gICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWUgYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mcm9tRW50aXR5VHlwZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMud2hlcmVQcmVkaWNhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLm9yZGVyQnlDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdENsYXVzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2tpcENvdW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50YWtlQ291bnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmV4cGFuZENsYXVzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGFyYW1ldGVycyA9IHt9O1xyXG4gICAgdGhpcy5pbmxpbmVDb3VudEVuYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMubm9UcmFja2luZ0VuYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlUG9zdEVuYWJsZWQgPSBmYWxzZTtcclxuICAgIC8vIGRlZmF1bHQgaXMgdG8gZ2V0IHF1ZXJ5T3B0aW9ucyBhbmQgZGF0YVNlcnZpY2UgZnJvbSB0aGUgZW50aXR5TWFuYWdlci5cclxuICAgIC8vIHRoaXMucXVlcnlPcHRpb25zID0gbmV3IFF1ZXJ5T3B0aW9ucygpO1xyXG4gICAgLy8gdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZSgpO1xyXG4gICAgdGhpcy5lbnRpdHlNYW5hZ2VyID0gdW5kZWZpbmVkO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBTcGVjaWZpZXMgdGhlIHJlc291cmNlIHRvIHF1ZXJ5IGZvciB0aGlzIEVudGl0eVF1ZXJ5LlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoKVxyXG4gID4gICAgICAgIC5mcm9tKFwiQ3VzdG9tZXJzXCIpO1xyXG5cclxuICBpcyB0aGUgc2FtZSBhc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIFRoZSByZXNvdXJjZSB0byBxdWVyeS5cclxuICAqKi9cclxuICBmcm9tKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAvLyBUT0RPOiB0aGluayBhYm91dCBhbGxvd2luZyBlbnRpdHlUeXBlIGFzIHdlbGxcclxuICAgIGFzc2VydFBhcmFtKHJlc291cmNlTmFtZSwgXCJyZXNvdXJjZU5hbWVcIikuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwicmVzb3VyY2VOYW1lXCIsIHJlc291cmNlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBUaGlzIGlzIGEgc3RhdGljIHZlcnNpb24gb2YgdGhlIFwiZnJvbVwiIG1ldGhvZCBhbmQgaXQgY3JlYXRlcyBhICdiYXNlJyBlbnRpdHlRdWVyeSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBuYW1lLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tKFwiQ3VzdG9tZXJzXCIpO1xyXG5cclxuICBpcyB0aGUgc2FtZSBhc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIik7XHJcbiAgQHBhcmFtIHJlc291cmNlTmFtZSAtIFRoZSByZXNvdXJjZSB0byBxdWVyeS5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xyXG4gICAgYXNzZXJ0UGFyYW0ocmVzb3VyY2VOYW1lLCBcInJlc291cmNlTmFtZVwiKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gbmV3IEVudGl0eVF1ZXJ5KHJlc291cmNlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTcGVjaWZpZXMgdGhlIHRvcCBsZXZlbCBFbnRpdHlUeXBlIHRoYXQgdGhpcyBxdWVyeSB3aWxsIHJldHVybi4gIE9ubHkgbmVlZGVkIHdoZW4gYSBxdWVyeSByZXR1cm5zIGEganNvbiByZXN1bHQgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHR5cGUgaW5mb3JtYXRpb24sXHJcbiAgb3Igd2hlbiB1c2luZyBhIHJlc291cmNlIG5hbWUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB0byBhbiBFbnRpdHlUeXBlLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoKVxyXG4gID4gICAgICAgIC5mcm9tKFwiTXlDdXN0b21NZXRob2RcIilcclxuICA+ICAgICAgICAudG9UeXBlKFwiQ3VzdG9tZXJcIilcclxuICBAcGFyYW0gZW50aXR5VHlwZSAtIFRoZSB0b3AgbGV2ZWwgRW50aXR5VHlwZSB0aGF0IHRoaXMgcXVlcnkgd2lsbCByZXR1cm4uXHJcbiAgQHN1bW1hcnkgSWYgdGhlIGpzb24gcmVzdWx0IGNvbnNpc3RzIG9mIG1vcmUgdGhhbiBhIHNpbXBsZSBlbnRpdHkgb3IgYXJyYXkgb2YgZW50aXRpZXMsIGNvbnNpZGVyIHVzaW5nIGEgW1tKc29uUmVzdWx0c0FkYXB0ZXJdXSBpbnN0ZWFkLlxyXG4gICoqL1xyXG4gIHRvVHlwZShlbnRpdHlUeXBlOiBzdHJpbmcgfCBFbnRpdHlUeXBlKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHlUeXBlLCBcImVudGl0eVR5cGVcIikuaXNTdHJpbmcoKS5vcigpLmlzSW5zdGFuY2VPZihFbnRpdHlUeXBlKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwicmVzdWx0RW50aXR5VHlwZVwiLCBlbnRpdHlUeXBlKTtcclxuICB9XHJcblxyXG5cclxuICB3aGVyZShwcmVkaWNhdGU/OiBQcmVkaWNhdGUpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcmVkaWNhdGU6IE9iamVjdCk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBvcGVyYXRvcjogRmlsdGVyUXVlcnlPcCwgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBGaWx0ZXJRdWVyeU9wLCBwcm9wZXJ0eTI6IHN0cmluZywgZmlsdGVyb3AyOiBGaWx0ZXJRdWVyeU9wLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgZmlsdGVyb3A6IHN0cmluZywgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgZmlsdGVyb3A6IHN0cmluZywgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogc3RyaW5nLCBwcm9wZXJ0eTM6IHN0cmluZywgZmlsdGVyb3AzOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTsgIC8vIGZvciBhbnkvYWxsIGNsYXVzZXNcclxuICB3aGVyZShhbkFycmF5OiBSZWN1cnNpdmVBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBGaWx0ZXJRdWVyeU9wIHwgUHJlZGljYXRlPik6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgd2l0aCBhbiBhZGRlZCBmaWx0ZXIgY3JpdGVyaWE7IENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2hpY2ggbWVhbnMgdG8gJ2FuZCcgd2l0aCBhbnkgZXhpc3RpbmdcclxuICBQcmVkaWNhdGUgb3IgY2FuIGJlIGNhbGxlZCB3aXRoIG51bGwgdG8gY2xlYXIgYWxsIHByZWRpY2F0ZXMuXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKTtcclxuXHJcbiAgVGhpcyBjYW4gYWxzbyBiZSBleHByZXNzZWQgdXNpbmcgYW4gZXhwbGljaXQgW1tGaWx0ZXJRdWVyeU9wXV0gYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBGaWx0ZXJRdWVyeU9wLlN0YXJ0c1dpdGgsIFwiQ1wiKTtcclxuXHJcbiAgb3IgYSBwcmVjb25zdHJ1Y3RlZCBbW1ByZWRpY2F0ZV1dIG1heSBiZSB1c2VkXHJcbiAgPiAgICAgIGxldCBwcmVkID0gbmV3IFByZWRpY2F0ZShcIkNvbXBhbnlOYW1lXCIsIEZpbHRlclF1ZXJ5T3AuU3RhcnRzV2l0aCwgXCJDXCIpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIikud2hlcmUocHJlZCk7XHJcblxyXG4gIFByZWRpY2F0ZXMgYXJlIG9mdGVuIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGNvbWJpbmUgbXVsdGlwbGUgY29uZGl0aW9ucyBpbiBhIHNpbmdsZSBmaWx0ZXIsIHN1Y2ggYXNcclxuICA+ICAgICAgbGV0IHByZWQgPSBQcmVkaWNhdGUuY3JlYXRlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHN3aXRoXCIsIFwiQ1wiKS5hbmQoXCJSZWdpb25cIiwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIG51bGwpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShwcmVkKTtcclxuXHJcbiAgTW9yZSBjb21wbGljYXRlZCBxdWVyaWVzIGNhbiBtYWtlIHVzZSBvZiBuZXN0ZWQgcHJvcGVydHkgcGF0aHNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiUHJvZHVjdHNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcIkNhdGVnb3J5LkNhdGVnb3J5TmFtZVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJTXCIpO1xyXG5cclxuICBvciBPRGF0YSBmdW5jdGlvbnMgLSBBIGxpc3Qgb2YgdmFsaWQgT0RhdGEgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCB3aXRoaW4gdGhlIFtbUHJlZGljYXRlXV0gZG9jdW1lbnRhdGlvbi5cclxuICBcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJ0b0xvd2VyKENvbXBhbnlOYW1lKVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJjXCIpO1xyXG5cclxuICBvciB0byBiZSBldmVuIG1vcmUgYmFyb3F1ZVxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcInRvVXBwZXIoc3Vic3RyaW5nKENvbXBhbnlOYW1lLCAxLCAyKSlcIiwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIFwiT01cIik7XHJcbiAgQHBhcmFtIHByZWRpY2F0ZSAtICBDYW4gYmUgZWl0aGVyXHJcbiAgICAtIGEgc2luZ2xlIFtbUHJlZGljYXRlXV1cclxuXHJcbiAgICAtIHRoZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhICdzaW1wbGUnIFByZWRpY2F0ZVxyXG4gICAgLSAtICBhIHByb3BlcnR5IG5hbWUsIGEgcHJvcGVydHkgcGF0aCB3aXRoICcuJyBhcyBwYXRoIHNlcGVyYXRvcnMgb3IgYSBwcm9wZXJ0eSBleHByZXNzaW9uIHtTdHJpbmd9XHJcbiAgICAtIC0gIGFuIG9wZXJhdG9yIC0gW1tGaWx0ZXJRdWVyeU9wXV0gb3IgaXQncyBzdHJpbmcgcmVwcmVzZW50YXRpb24uIENhc2UgaXMgaWdub3JlZFxyXG4gICAgd2hlbiBpZiBhIHN0cmluZyBpcyBwcm92aWRlZCBhbmQgYW55IHN0cmluZyB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZSBGaWx0ZXJRdWVyeU9wIGFsaWFzZXMgd2lsbCBiZSBhY2NlcHRlZC5cclxuICAgIC0gLSAgYSB2YWx1ZSB7T2JqZWN0fSAtIFRoaXMgd2lsbCBiZSB0cmVhdGVkIGFzIGVpdGhlciBhIHByb3BlcnR5IGV4cHJlc3Npb24gb3IgYSBsaXRlcmFsIGRlcGVuZGluZyBvbiBjb250ZXh0LiAgXHJcbiAgICBJbiBnZW5lcmFsLCBpZiB0aGUgdmFsdWUgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgZXhwcmVzc2lvbiBpdCB3aWxsIGJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbGl0ZXJhbC5cclxuICAgIEluIG1vc3QgY2FzZXMgdGhpcyB3b3JrcyB3ZWxsLCBidXQgeW91IGNhbiBhbHNvIGZvcmNlIHRoZSBpbnRlcnByZXRhdGlvbiBieSBtYWtpbmcgdGhlIHZhbHVlIGFyZ3VtZW50IGl0c2VsZiBhbiBvYmplY3QgXHJcbiAgICB3aXRoIGEgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYW4gJ2lzTGl0ZXJhbCcgcHJvcGVydHkgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLlxyXG4gICAgQnJlZXplIGFsc28gdHJpZXMgdG8gaW5mZXIgdGhlIGRhdGFUeXBlIG9mIGFueSBsaXRlcmFsIGJhc2VkIG9uIGNvbnRleHQsIGlmIHRoaXMgZmFpbHMgeW91IGNhbiBmb3JjZSB0aGlzIGluZmVyZW5jZSBieSBtYWtpbmcgdGhlIHZhbHVlIGFyZ3VtZW50IFxyXG4gICAgYW4gb2JqZWN0IHdpdGggYSAndmFsdWUnIHByb3BlcnR5IGFuZCBhICdkYXRhVHlwZSdwcm9wZXJ0eSBzZXQgdG8gb25lIG9mIHRoZSBEYXRhVHlwZSBlbnVtZXJhdGlvbiBpbnN0YW5jZXMuXHJcblxyXG4gICAgLSBhIG51bGwgb3IgdW5kZWZpbmVkICggdGhpcyBjYXVzZXMgYW55IGV4aXN0aW5nIHdoZXJlIGNsYXVzZSB0byBiZSByZW1vdmVkKVxyXG4gICoqL1xyXG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICBsZXQgd2hlcmVQcmVkaWNhdGU6IFByZWRpY2F0ZSB8IHVuZGVmaW5lZDtcclxuICAgIGlmIChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXSAhPSBudWxsKSB7XHJcbiAgICAgIHdoZXJlUHJlZGljYXRlID0gUHJlZGljYXRlLmNyZWF0ZSguLi48YW55PmFyZ3MpO1xyXG4gICAgICBpZiAodGhpcy5mcm9tRW50aXR5VHlwZSkgd2hlcmVQcmVkaWNhdGUuX3ZhbGlkYXRlKHRoaXMuZnJvbUVudGl0eVR5cGUpO1xyXG4gICAgICBpZiAodGhpcy53aGVyZVByZWRpY2F0ZSkge1xyXG4gICAgICAgIHdoZXJlUHJlZGljYXRlID0gdGhpcy53aGVyZVByZWRpY2F0ZS5hbmQod2hlcmVQcmVkaWNhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ3aGVyZVByZWRpY2F0ZVwiLCB3aGVyZVByZWRpY2F0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzPzogc3RyaW5nLCBpc0Rlc2NlbmRpbmc/OiBib29sZWFuKTogRW50aXR5UXVlcnk7XHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSwgaXNEZXNjZW5kaW5nPzogYm9vbGVhbik6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBvcmRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IGJ5IHByb3BlcnR5IG5hbWUuICBCeSBkZWZhdWx0IHNvcnRpbmcgb2NjdXJzIGlzIGFzY2VuZGluZyBvcmRlciwgYnV0IHNvcnRpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBzdXBwb3J0ZWQgYXMgd2VsbC5cclxuICBPcmRlckJ5IGNsYXVzZXMgbWF5IGJlIGNoYWluZWQuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgb3IgdG8gc29ydCBhY3Jvc3MgbXVsdGlwbGUgcHJvcGVydGllc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uLCBDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgTmVzdGVkIHByb3BlcnR5IHBhdGhzIGFyZSBhbHNvIHN1cHBvcnRlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDYXRlZ29yeS5DYXRlZ29yeU5hbWVcIik7XHJcblxyXG4gIFNvcnRpbmcgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBzdXBwb3J0ZWQgdmlhIHRoZSBhZGRpdGlvbiBvZiAnIGRlc2MnIHRvIHRoZSBlbmQgb2YgYW55IHByb3BlcnR5IHBhdGguXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZSBkZXNjXCIpO1xyXG5cclxuICBvclxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uIGRlc2MsIENvbXBhbnlOYW1lIGRlc2NcIik7XHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCAoJywnKSBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgcGF0aHMuXHJcbiAgRWFjaCBwcm9wZXJ0eSBwYXRoIGNhbiBvcHRpb25hbGx5IGVuZCB3aXRoIFwiIGRlc2NcIiB0byBmb3JjZSBhIGRlc2NlbmRpbmcgc29ydCBvcmRlci4gSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbGwgb3JkZXJpbmcgaXMgcmVtb3ZlZC5cclxuICBAcGFyYW0gaXNEZXNjZW5kaW5nIC0gSWYgc3BlY2lmaWVkLCBvdmVycmlkZXMgYWxsIG9mIHRoZSBlbWJlZGRlZCAnZGVzYycgdGFncyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgcHJvcGVydHkgcGF0aHMuXHJcbiAgKiovXHJcbiAgb3JkZXJCeShwcm9wZXJ0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSwgaXNEZXNjZW5kaW5nPzogYm9vbGVhbikge1xyXG4gICAgLy8gcHJvcGVydHlQYXRoczogY2FuIHBhc3MgaW4gY3JlYXRlKFwiQS5YLEJcIikgb3IgY3JlYXRlKFwiQS5YIGRlc2MsIEJcIikgb3IgY3JlYXRlKFwiQS5YIGRlc2MsQlwiLCB0cnVlXSlcclxuICAgIC8vIGlzRGVzYyBwYXJhbWV0ZXIgdHJ1bXBzIGlzRGVzYyBpbiBwcm9wZXJ0eU5hbWUuXHJcbiAgICBsZXQgb3JkZXJCeUNsYXVzZSA9IHByb3BlcnR5UGF0aHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgT3JkZXJCeUNsYXVzZShub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHMpLCBpc0Rlc2NlbmRpbmcpO1xyXG4gICAgaWYgKHRoaXMub3JkZXJCeUNsYXVzZSAmJiBvcmRlckJ5Q2xhdXNlKSB7XHJcbiAgICAgIG9yZGVyQnlDbGF1c2UgPSBuZXcgT3JkZXJCeUNsYXVzZShbdGhpcy5vcmRlckJ5Q2xhdXNlLCBvcmRlckJ5Q2xhdXNlXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJvcmRlckJ5Q2xhdXNlXCIsIG9yZGVyQnlDbGF1c2UpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZyk6IEVudGl0eVF1ZXJ5O1xyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IG9yZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgYnkgcHJvcGVydHkgbmFtZSBpbiBkZXNjZW5kaW5nIG9yZGVyLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIkNvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBvciB0byBzb3J0IGFjcm9zcyBtdWx0aXBsZSBwcm9wZXJ0aWVzXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnlEZXNjKFwiUmVnaW9uLCBDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgTmVzdGVkIHByb3BlcnR5IHBhdGhzIGFyZSBhbHNvIHN1cHBvcnRlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnlEZXNjKFwiQ2F0ZWdvcnkuQ2F0ZWdvcnlOYW1lXCIpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgKCcsJykgc3RyaW5nIG9mIHByb3BlcnR5IHBhdGhzIG9yIGFuIGFycmF5IG9mIHByb3BlcnR5IHBhdGhzLlxyXG4gIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYWxsIG9yZGVyaW5nIGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgb3JkZXJCeURlc2MocHJvcGVydHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIHJldHVybiB0aGlzLm9yZGVyQnkocHJvcGVydHlQYXRocyBhcyBhbnksIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHNlbGVjdHMgYSBsaXN0IG9mIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzdWx0cyBvZiB0aGUgb3JpZ2luYWwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHZhbHVlcyBvZiBqdXN0IHRoZXNlIHByb3BlcnRpZXMuIFRoaXNcclxuICB3aWxsIGJlIHJlZmVycmVkIHRvIGFzIGEgcHJvamVjdGlvbi5cclxuICBJZiB0aGUgcmVzdWx0IG9mIHRoaXMgc2VsZWN0aW9uIFwicHJvamVjdGlvblwiIGNvbnRhaW5zIGVudGl0aWVzLCB0aGVzZSBlbnRpdGllcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gRW50aXR5TWFuYWdlcidzIGNhY2hlIGFuZCB3aWxsXHJcbiAgYmUgbWFkZSAnb2JzZXJ2YWJsZScuXHJcbiAgQW55IHNpbXBsZSBwcm9wZXJ0aWVzLCBpLmUuIHN0cmluZ3MsIG51bWJlcnMgb3IgZGF0ZXMgd2l0aGluIGEgcHJvamVjdGlvbiB3aWxsIG5vdCBiZSBjYWNoZWQgYXJlIHdpbGwgTk9UIGJlIG1hZGUgJ29ic2VydmFibGUnLlxyXG4gIFxyXG4gIFNpbXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIGJlIHByb2plY3RlZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgIC5zZWxlY3QoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgVGhpcyB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIGVhY2ggd2l0aCBhIHNpbmdsZSBcIkNvbXBhbnlOYW1lXCIgcHJvcGVydHkgb2YgdHlwZSBzdHJpbmcuXHJcbiAgQSBzaW1pbGFyIHF1ZXJ5IGNvdWxkIHJldHVybiBhIG5hdmlnYXRpb24gcHJvcGVydHkgaW5zdGVhZFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuc2VsZWN0KFwiT3JkZXJzXCIpO1xyXG5cclxuICB3aGVyZSB0aGUgcmVzdWx0IHdvdWxkIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgZWFjaCB3aXRoIGEgc2luZ2xlIFwiT3JkZXJzXCIgcHJvcGVydHkgdGhhdCB3b3VsZCBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgXCJPcmRlclwiIGVudGl0aWVzLlxyXG4gIENvbXBvc2l0ZSBwcm9qZWN0aW9ucyBhcmUgYWxzbyBwb3NzaWJsZTpcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLnNlbGVjdChcIkNvbXBhbnlOYW1lLCBPcmRlcnNcIik7XHJcblxyXG4gIEFzIHdlbGwgYXMgcHJvamVjdGlvbnMgaW52b2x2aW5nIG5lc3RlZCBwcm9wZXJ0eSBwYXRoc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ3VzdG9tZXIuQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5zZWxlY3QoXCJDdXN0b21lci5Db21wYW55TmFtZSwgQ3VzdG9tZXIsIE9yZGVyRGF0ZVwiKTtcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkICgnLCcpIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBvciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBwYXRocy5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyBwcm9qZWN0aW9uIG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHNlbGVjdChwcm9wZXJ0eVBhdGhzPzogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGxldCBzZWxlY3RDbGF1c2UgPSBwcm9wZXJ0eVBhdGhzID09IG51bGwgPyBudWxsIDogbmV3IFNlbGVjdENsYXVzZShub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHMpKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInNlbGVjdENsYXVzZVwiLCBzZWxlY3RDbGF1c2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHNraXBzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudGl0aWVzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMuXHJcbiAgQW55IGV4aXN0aW5nICdza2lwJyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nICdza2lwJyB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgIC5za2lwKDUpO1xyXG4gIEBwYXJhbSBjb3VudCAtIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gc2tpcCBvdmVyLiBJZiBvbWl0dGVkIG9yIG51bGwgYW55IGV4aXN0aW5nIHNraXAgY291bnQgb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgc2tpcChjb3VudD86IG51bWJlcikge1xyXG4gICAgYXNzZXJ0UGFyYW0oY291bnQsIFwiY291bnRcIikuaXNPcHRpb25hbCgpLmlzTnVtYmVyKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInNraXBDb3VudFwiLCAoY291bnQgPT0gbnVsbCkgPyBudWxsIDogY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzLiAtIFNhbWUgYXMgJ3Rha2UnLlxyXG4gIEFueSBleGlzdGluZyAndG9wJyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nICd0b3AnIHdpdGggbm8gYXJndW1lbnRzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC50b3AoNSk7XHJcbiAgQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byByZXR1cm4uXHJcbiAgSWYgJ2NvdW50JyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICd0b3AnIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHRvcChjb3VudD86IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMudGFrZShjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudGl0aWVzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMgLSBTYW1lIGFzICd0b3AnLlxyXG4gIEFueSBleGlzdGluZyB0YWtlIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgdGFrZSB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAudGFrZSg1KTtcclxuICBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHJldHVybi5cclxuICBJZiAnY291bnQnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgJ3Rha2UnIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHRha2UoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIGFzc2VydFBhcmFtKGNvdW50LCBcImNvdW50XCIpLmlzT3B0aW9uYWwoKS5pc051bWJlcigpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ0YWtlQ291bnRcIiwgKGNvdW50ID09IG51bGwpID8gbnVsbCA6IGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCB3aWxsIHJldHVybiByZWxhdGVkIGVudGl0aWVzIG5lc3RlZCB3aXRoaW4gaXRzIHJlc3VsdHMuIFRoZSBleHBhbmQgbWV0aG9kIGFsbG93cyB5b3UgdG8gaWRlbnRpZnkgcmVsYXRlZCBlbnRpdGllcywgdmlhIG5hdmlnYXRpb24gcHJvcGVydHlcclxuICBuYW1lcyBzdWNoIHRoYXQgYSBncmFwaCBvZiBlbnRpdGllcyBtYXkgYmUgcmV0cmlldmVkIHdpdGggYSBzaW5nbGUgcmVxdWVzdC4gQW55IGZpbHRlcmluZyBvY2N1cnMgYmVmb3JlIHRoZSByZXN1bHRzIGFyZSAnZXhwYW5kZWQnLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiT3JkZXJzXCIpO1xyXG5cclxuICB3aWxsIHJldHVybiB0aGUgZmlsdGVyZWQgY3VzdG9tZXJzIGVhY2ggd2l0aCBpdHMgXCJPcmRlcnNcIiBwcm9wZXJ0aWVzIGZ1bGx5IHJlc29sdmVkLlxyXG4gIE11bHRpcGxlIHBhdGhzIG1heSBiZSBzcGVjaWZpZWQgYnkgc2VwYXJhdGluZyB0aGUgcGF0aHMgYnkgYSAnLCdcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiQ3VzdG9tZXIsIEVtcGxveWVlXCIpXHJcblxyXG4gIGFuZCBuZXN0ZWQgcHJvcGVydHkgcGF0aHMgbXkgYmUgc3BlY2lmaWVkIGFzIHdlbGxcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAuZXhwYW5kKFwiQ3VzdG9tZXIsIE9yZGVyRGV0YWlscywgT3JkZXJEZXRhaWxzLlByb2R1Y3RcIilcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lcyBvciBhbiBhcnJheSBvZiBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWVzLiBFYWNoIE5hdmlnYXRpb24gUHJvcGVydHkgbmFtZSBjYW4gYmUgZm9sbG93ZWRcclxuICBieSBhICcuJyBhbmQgYW5vdGhlciBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWUgdG8gZW5hYmxlIGlkZW50aWZ5aW5nIGEgbXVsdGktbGV2ZWwgcmVsYXRpb25zaGlwLlxyXG4gIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICdleHBhbmQnIGNsYXVzZSBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBleHBhbmQocHJvcGVydHlQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgZXhwYW5kQ2xhdXNlID0gcHJvcGVydHlQYXRocyA9PSBudWxsID8gbnVsbCA6IG5ldyBFeHBhbmRDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJleHBhbmRDbGF1c2VcIiwgZXhwYW5kQ2xhdXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBpbmNsdWRlcyBhIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkVtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlXCIpXHJcbiAgPiAgICAgICAgLndpdGhQYXJhbWV0ZXJzKHsgQmlydGhEYXRlOiBcIjEvMS8xOTYwXCIsIENvdW50cnk6IFwiVVNBXCIgfSk7XHJcbiAgIFxyXG4gIHdpbGwgY2FsbCB0aGUgJ0VtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlJyBtZXRob2Qgb24gdGhlIHNlcnZlciBhbmQgcGFzcyBpbiAyIHBhcmFtZXRlcnMuIFRoaXNcclxuICBxdWVyeSB3aWxsIGJlIHVyaSBlbmNvZGVkIGFzXHJcbiAgPiAgICAgIHtzZXJ2aWNlQXBpfS9FbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZT9iaXJ0aERhdGU9MSUyRjElMkYxOTYwJmNvdW50cnk9VVNBXHJcblxyXG4gIFBhcmFtZXRlcnMgbWF5IGFsc28gYmUgbWl4ZWQgaW4gd2l0aCBvdGhlciBxdWVyeSBjcml0ZXJpYS5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tKFwiRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGVcIilcclxuICA+ICAgICAgICAud2l0aFBhcmFtZXRlcnMoeyBCaXJ0aERhdGU6IFwiMS8xLzE5NjBcIiwgQ291bnRyeTogXCJVU0FcIiB9KVxyXG4gID4gICAgICAgIC53aGVyZShcIkxhc3ROYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIlNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIkJpcnRoRGF0ZVwiKTtcclxuICBAcGFyYW0gcGFyYW1ldGVycyAtIEEgcGFyYW1ldGVycyBvYmplY3Qgd2hlcmUgdGhlIGtleXMgYXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLlxyXG4gICoqL1xyXG4gIHdpdGhQYXJhbWV0ZXJzKHBhcmFtZXRlcnM6IE9iamVjdCkge1xyXG4gICAgYXNzZXJ0UGFyYW0ocGFyYW1ldGVycywgXCJwYXJhbWV0ZXJzXCIpLmlzT2JqZWN0KCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInBhcmFtZXRlcnNcIiwgcGFyYW1ldGVycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcXVlcnkgd2l0aCB0aGUgYGlubGluZUNvdW50YCBjYXBhYmlsaXR5IGVpdGhlciBlbmFibGVkIG9yIGRpc2FibGVkLiAgV2l0aCBgaW5saW5lQ291bnRgIGVuYWJsZWQsIGFuIGFkZGl0aW9uYWwgJ2lubGluZUNvdW50JyBwcm9wZXJ0eVxyXG4gIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgcXVlcnkgcmVzdWx0cyB0aGF0IHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IHRoaXNcclxuICBxdWVyeSB3aXRoIG9ubHkgdGhlICd3aGVyZScvJ2ZpbHRlcicgY2xhdXNlcyBhcHBsaWVkLCBpLmUuIHdpdGhvdXQgYW55ICdza2lwJy8ndGFrZScgb3BlcmF0b3JzIGFwcGxpZWQuIEZvciBsb2NhbCBxdWVyaWVzIHRoaXMgY2xhdXNlIGlzIGlnbm9yZWQuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLnRha2UoMjApXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKVxyXG4gID4gICAgICAgIC5pbmxpbmVDb3VudCh0cnVlKTtcclxuXHJcbiAgd2lsbCByZXR1cm4gdGhlIGZpcnN0IDIwIGN1c3RvbWVycyBhcyB3ZWxsIGFzIGEgY291bnQgb2YgX2FsbF8gb2YgdGhlIGN1c3RvbWVycyBpbiB0aGUgcmVtb3RlIHN0b3JlLlxyXG4gIEBwYXJhbSBlbmFibGVkIC0gKGRlZmF1bHQgPSB0cnVlKSBXaGV0aGVyIG9yIG5vdCBpbmxpbmVDb3VudCBjYXBhYmlsaXR5IHNob3VsZCBiZSBlbmFibGVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0cnVlIGlzIGFzc3VtZWQuXHJcbiAgKiovXHJcbiAgaW5saW5lQ291bnQoZW5hYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKGVuYWJsZWQsIFwiZW5hYmxlZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGVuYWJsZWQgPSAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIWVuYWJsZWQ7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJpbmxpbmVDb3VudEVuYWJsZWRcIiwgZW5hYmxlZCk7XHJcbiAgfVxyXG5cclxuICB1c2VOYW1lT25TZXJ2ZXIodXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKHVzZXNOYW1lT25TZXJ2ZXIsIFwidXNlc05hbWVPblNlcnZlclwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIHVzZXNOYW1lT25TZXJ2ZXIgPSAodXNlc05hbWVPblNlcnZlciA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIXVzZXNOYW1lT25TZXJ2ZXI7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ1c2VzTmFtZU9uU2VydmVyXCIsIHVzZXNOYW1lT25TZXJ2ZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHF1ZXJ5IHdpdGggdGhlIGBub1RyYWNraW5nYCBjYXBhYmlsaXR5IGVpdGhlciBlbmFibGVkIG9yIGRpc2FibGVkLiAgV2l0aCBgbm9UcmFja2luZ2AgZW5hYmxlZCwgdGhlIHJlc3VsdHMgb2YgdGhpcyBxdWVyeVxyXG4gIHdpbGwgbm90IGJlIGNvZXJjZWQgaW50byBlbnRpdGllcyBidXQgd2lsbCBpbnN0ZWFkIGxvb2sgbGlrZSByYXcgamF2YXNjcmlwdCBwcm9qZWN0aW9ucy4gaS5lLiBzaW1wbGUgamF2YXNjcmlwdCBvYmplY3RzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAudGFrZSgyMClcclxuICA+ICAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKVxyXG4gID4gICAgICAgICAubm9UcmFja2luZyh0cnVlKTtcclxuICBAcGFyYW0gZW5hYmxlZCAtIChkZWZhdWx0ID0gdHJ1ZSkgV2hldGhlciBvciBub3QgdGhlIG5vVHJhY2tpbmcgY2FwYWJpbGl0eSBzaG91bGQgYmUgZW5hYmxlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdHJ1ZSBpcyBhc3N1bWVkLlxyXG4gICoqL1xyXG4gIG5vVHJhY2tpbmcoZW5hYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKGVuYWJsZWQsIFwiZW5hYmxlZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGVuYWJsZWQgPSAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIWVuYWJsZWQ7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJub1RyYWNraW5nRW5hYmxlZFwiLCBlbmFibGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBxdWVyeSB3aXRoIHRoZSBgdXNlUG9zdGAgY2FwYWJpbGl0eSBlaXRoZXIgZW5hYmxlZCBvciBkaXNhYmxlZC4gIFdpdGggYHVzZVBvc3RgIGVuYWJsZWQsIHRoZSBxdWVyeSBpcyBzZW50XHJcbiAgYXMgYSBQT1NUIHJlcXVlc3QgKGluc3RlYWQgb2YgR0VUKSBhbmQgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gd2lsbCBiZSBzZW50IGFzIEpTT04gaW4gdGhlIGJvZHkgb2YgdGhlIHBvc3QuXHJcbiAgTm90ZSB0aGF0IHRoZSBzZXJ2ZXIgbXVzdCBiZSBhYmxlIHRvIHBhcnNlIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0OyBvdGhlcndpc2UgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gd2lsbCBiZSBpZ25vcmVkLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAud2hlcmUoXCJjb21wYW55SWRcIiwgXCJlcVwiLCAxKVxyXG4gID4gICAgICAgICAudXNlUG9zdCh0cnVlKTtcclxuICByZXN1bHRzIGluIGEgUE9TVCByZXF1ZXN0IHRvIGB7aG9zdH0ve3BhdGh9L0N1c3RvbWVyc2BcclxuICB3aXRoIGJvZHkgYHtcIndoZXJlXCI6IHtcImNvbXBhbnlJZFwiOntcImVxXCI6MX19fWBcclxuICBAcGFyYW0gZW5hYmxlZCAtIChkZWZhdWx0ID0gdHJ1ZSkgV2hldGhlciBvciBub3QgdXNlUG9zdCBzaG91bGQgYmUgZW5hYmxlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdHJ1ZSBpcyBhc3N1bWVkLlxyXG4gICoqL1xyXG4gIHVzZVBvc3QoZW5hYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKGVuYWJsZWQsIFwiZW5hYmxlZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGVuYWJsZWQgPSAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIWVuYWJsZWQ7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ1c2VQb3N0RW5hYmxlZFwiLCBlbmFibGVkKTtcclxuICB9XHJcblxyXG4gIHVzaW5nKG9iajogRW50aXR5TWFuYWdlcik6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogRGF0YVNlcnZpY2UpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IEpzb25SZXN1bHRzQWRhcHRlcik6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogUXVlcnlPcHRpb25zKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBNZXJnZVN0cmF0ZWd5KTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBGZXRjaFN0cmF0ZWd5KTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBFbnRpdHlRdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlNYW5hZ2VyXV0sIFtbRGF0YVNlcnZpY2VdXSxcclxuICBbW0pzb25SZXN1bHRzQWRhcHRlcl1dLCBbW01lcmdlU3RyYXRlZ3ldXSBvciBbW0ZldGNoU3RyYXRlZ3ldXSBhcHBsaWVkLlxyXG4gID4gICAgICAvLyAndXNpbmcnIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIG5ldyBxdWVyeSB3aXRoIGEgc3BlY2lmaWVkIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLnVzaW5nKGVtKTtcclxuXHJcbiAgb3Igd2l0aCBhIHNwZWNpZmllZCBbW01lcmdlU3RyYXRlZ3ldXVxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC51c2luZyhNZXJnZVN0cmF0ZWd5LlByZXNlcnZlQ2hhbmdlcyk7XHJcblxyXG4gIG9yIHdpdGggYSBzcGVjaWZpZWQgW1tGZXRjaFN0cmF0ZWd5XV1cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAudXNpbmcoRmV0Y2hTdHJhdGVneS5Gcm9tTG9jYWxDYWNoZSk7XHJcbiAgQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gdXBkYXRlIGluIGNyZWF0aW5nIGEgbmV3IEVudGl0eVF1ZXJ5IGZyb20gYW4gZXhpc3Rpbmcgb25lLlxyXG4gICoqL1xyXG4gIHVzaW5nKG9iajogYW55KSB7XHJcbiAgICBpZiAoIW9iaikgcmV0dXJuIHRoaXM7XHJcbiAgICBsZXQgZXEgPSBjbG9uZSh0aGlzKTtcclxuICAgIHByb2Nlc3NVc2luZyhlcSwge1xyXG4gICAgICBcImVudGl0eU1hbmFnZXJcIjogbnVsbCxcclxuICAgICAgXCJkYXRhU2VydmljZVwiOiBudWxsLFxyXG4gICAgICBcInF1ZXJ5T3B0aW9uc1wiOiBudWxsLFxyXG4gICAgICBcImZldGNoU3RyYXRlZ3lcIjogKGVxOiBFbnRpdHlRdWVyeSwgdmFsOiBhbnkpID0+IHtcclxuICAgICAgICBlcS5xdWVyeU9wdGlvbnMgPSAoZXEucXVlcnlPcHRpb25zIHx8IG5ldyBRdWVyeU9wdGlvbnMoKSkudXNpbmcodmFsKTtcclxuICAgICAgfSxcclxuICAgICAgXCJtZXJnZVN0cmF0ZWd5XCI6IChlcTogRW50aXR5UXVlcnksIHZhbDogYW55KSA9PiB7XHJcbiAgICAgICAgZXEucXVlcnlPcHRpb25zID0gKGVxLnF1ZXJ5T3B0aW9ucyB8fCBuZXcgUXVlcnlPcHRpb25zKCkpLnVzaW5nKHZhbCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwianNvblJlc3VsdHNBZGFwdGVyXCI6IChlcTogRW50aXR5UXVlcnksIHZhbDogYW55KSA9PiB7XHJcbiAgICAgICAgZXEuZGF0YVNlcnZpY2UgPSAoZXEuZGF0YVNlcnZpY2UgfHwgbmV3IERhdGFTZXJ2aWNlKCkpLnVzaW5nKHsganNvblJlc3VsdHNBZGFwdGVyOiB2YWwgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sIG9iaik7XHJcbiAgICByZXR1cm4gZXE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBFeGVjdXRlcyB0aGlzIHF1ZXJ5LiAgVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBhbiBFbnRpdHlNYW5hZ2VyIGhhcyBiZWVuIHByZXZpb3VzbHkgc3BlY2lmaWVkIHZpYSB0aGUgXCJ1c2luZ1wiIG1ldGhvZC5cclxuICBcclxuICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHVzaW5nIGEgJ3Byb21pc2VzJyBzeW50YXggKCByZWNvbW1lbmRlZClcclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIikudXNpbmcoZW0pO1xyXG4gID4gICAgICBxdWVyeS5leGVjdXRlKCkudGhlbiggZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgfSkuY2F0Y2goIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAgLi4uIHF1ZXJ5IGZhaWx1cmUgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgfSk7XHJcblxyXG4gIG9yIHdpdGggY2FsbGJhY2tzXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpLnVzaW5nKGVtKTtcclxuICA+ICAgICAgcXVlcnkuZXhlY3V0ZShcclxuICA+ICAgICAgICBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgICAgICAgICAgICAgbGV0IG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgICAgICAgICAgICAgICAuLi4gcXVlcnkgcmVzdWx0cyBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICAgICAgICAgICAgfSxcclxuICA+ICAgICAgICBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgICAgICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gIEVpdGhlciB3YXkgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyB0aGUgRW50aXR5TWFuYWdlciAnZXhlY3V0ZScgbWV0aG9kLlxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKTtcclxuICA+ICAgICAgZW0uZXhlY3V0ZVF1ZXJ5KHF1ZXJ5KS50aGVuKCBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgICAuLi4gcXVlcnkgcmVzdWx0cyBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICB9KS5jYXRjaCggZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pO1xyXG5cclxuICBAcGFyYW0gY2FsbGJhY2sgLSAgRnVuY3Rpb24gY2FsbGVkIG9uIHN1Y2Nlc3MuXHJcbiAgQHBhcmFtIGVycm9yQ2FsbGJhY2sgLSBGdW5jdGlvbiBjYWxsZWQgb24gZmFpbHVyZS5cclxuICBAcmV0dXJuIFByb21pc2VcclxuICAqKi9cclxuICBleGVjdXRlKGNhbGxiYWNrPzogQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s/OiBFcnJvckNhbGxiYWNrKTogUHJvbWlzZTxRdWVyeVJlc3VsdD4ge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eU1hbmFnZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gRW50aXR5UXVlcnkgbXVzdCBoYXZlIGl0cyBFbnRpdHlNYW5hZ2VyIHByb3BlcnR5IHNldCBiZWZvcmUgY2FsbGluZyAnZXhlY3V0ZSdcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeSh0aGlzLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBFeGVjdXRlcyB0aGlzIHF1ZXJ5IGFnYWluc3QgdGhlIGxvY2FsIGNhY2hlLiAgVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBhbiBFbnRpdHlNYW5hZ2VyIGhhdmUgYmVlbiBwcmV2aW91c2x5IHNwZWNpZmllZCB2aWEgdGhlIFwidXNpbmdcIiBtZXRob2QuXHJcbiAgPiAgICAgIC8vIGFzc3VtZSBlbSBpcyBhbiBlbnRpdHlNYW5hZ2VyIGFscmVhZHkgZmlsbGVkIHdpdGggb3JkZXIgZW50aXRpZXM7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhlbSk7XHJcbiAgPiAgICAgIGxldCBvcmRlcnMgPSBxdWVyeS5leGVjdXRlTG9jYWxseSgpO1xyXG5cclxuICBOb3RlIHRoYXQgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIFtbRW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5XV0uXHJcbiAgKiovXHJcbiAgZXhlY3V0ZUxvY2FsbHkoKSB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5TWFuYWdlcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBFbnRpdHlRdWVyeSBtdXN0IGhhdmUgaXRzIEVudGl0eU1hbmFnZXIgcHJvcGVydHkgc2V0IGJlZm9yZSBjYWxsaW5nICdleGVjdXRlTG9jYWxseSdcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeUxvY2FsbHkodGhpcyk7XHJcbiAgfVxyXG5cclxuICB0b0pTT04oKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b0pTT05FeHQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBUeXBpY2FsbHkgb25seSBmb3IgdXNlIHdoZW4gYnVpbGRpbmcgVXJpQnVpbGRlckFkYXB0ZXJzLiAgXHJcbiAgQGhpZGRlbiBAaW50ZXJuYWwgIFxyXG4gICovXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ/OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICBjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcclxuICAgIGNvbnRleHQuZW50aXR5VHlwZSA9IGNvbnRleHQuZW50aXR5VHlwZSB8fCB0aGlzLmZyb21FbnRpdHlUeXBlO1xyXG4gICAgY29udGV4dC5wcm9wZXJ0eVBhdGhGbiA9IGNvbnRleHQudG9OYW1lT25TZXJ2ZXIgPyBjb250ZXh0LmVudGl0eVR5cGUhLmNsaWVudFByb3BlcnR5UGF0aFRvU2VydmVyLmJpbmQoY29udGV4dC5lbnRpdHlUeXBlKSA6IGNvcmUuaWRlbnRpdHk7XHJcblxyXG4gICAgbGV0IHRvSlNPTkV4dEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IHYudG9KU09ORXh0KGNvbnRleHQpIDogdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBjb3JlLnRvSnNvbih0aGlzLCB7XHJcbiAgICAgIFwiZnJvbSxyZXNvdXJjZU5hbWVcIjogbnVsbCxcclxuICAgICAgXCJ0b1R5cGUscmVzdWx0RW50aXR5VHlwZVwiOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgICAgLy8gcmVzdWx0RW50aXR5VHlwZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGVudGl0eVR5cGVcclxuICAgICAgICByZXR1cm4gdiA/ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogdi5uYW1lKSA6IHVuZGVmaW5lZDtcclxuICAgICAgfSxcclxuICAgICAgXCJ3aGVyZSx3aGVyZVByZWRpY2F0ZVwiOiB0b0pTT05FeHRGbixcclxuICAgICAgXCJvcmRlckJ5LG9yZGVyQnlDbGF1c2VcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwic2VsZWN0LHNlbGVjdENsYXVzZVwiOiB0b0pTT05FeHRGbixcclxuICAgICAgXCJleHBhbmQsZXhwYW5kQ2xhdXNlXCI6IHRvSlNPTkV4dEZuLFxyXG4gICAgICBcInNraXAsc2tpcENvdW50XCI6IG51bGwsXHJcbiAgICAgIFwidGFrZSx0YWtlQ291bnRcIjogbnVsbCxcclxuICAgICAgcGFyYW1ldGVyczogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBjb3JlLmlzRW1wdHkodikgPyB1bmRlZmluZWQgOiB2O1xyXG4gICAgICB9LFxyXG4gICAgICBcImlubGluZUNvdW50LGlubGluZUNvdW50RW5hYmxlZFwiOiBmYWxzZSxcclxuICAgICAgXCJub1RyYWNraW5nLG5vVHJhY2tpbmdFbmFibGVkXCI6IGZhbHNlLFxyXG4gICAgICBxdWVyeU9wdGlvbnM6IG51bGxcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tRW50aXRpZXMoZW50aXR5OiBFbnRpdHkpOiBFbnRpdHlRdWVyeTtcclxuICBzdGF0aWMgZnJvbUVudGl0aWVzKGVudGl0aWVzOiBFbnRpdHlbXSk6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFN0YXRpYyBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIEVudGl0eVF1ZXJ5IHRoYXQgd2lsbCBhbGxvdyAncmVxdWVyeWluZycgYW4gZW50aXR5IG9yIGEgY29sbGVjdGlvbiBvZiBlbnRpdGllcyBieSBwcmltYXJ5IGtleS4gVGhpcyBjYW4gYmUgdXNlZnVsXHJcbiAgdG8gZm9yY2UgYSByZXF1ZXJ5IG9mIHNlbGVjdGVkIGVudGl0aWVzLCBvciB0byByZXN0cmljdCBhbiBleGlzdGluZyBjb2xsZWN0aW9uIG9mIGVudGl0aWVzIGFjY29yZGluZyB0byBzb21lIGZpbHRlci5cclxuXHJcbiAgV29ya3MgZm9yIGEgc2luZ2xlIGVudGl0eSBvciBhbiBhcnJheSBvZiBlbnRpdGllcyBvZiB0aGUgU0FNRSB0eXBlLlxyXG4gIERvZXMgbm90IHdvcmsgZm9yIGFuIGFycmF5IG9mIGVudGl0aWVzIG9mIGRpZmZlcmVudCB0eXBlcy5cclxuICA+ICAgICAgLy8gYXNzdW1pbmcgJ2N1c3RvbWVycycgaXMgYW4gYXJyYXkgb2YgJ0N1c3RvbWVyJyBlbnRpdGllcyByZXRyaWV2ZWQgZWFybGllci5cclxuICA+ICAgICAgbGV0IGN1c3RvbWVyc1F1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0aWVzKGN1c3RvbWVycyk7XHJcblxyXG4gIFRoZSByZXN1bHRpbmcgcXVlcnkgY2FuLCBvZiBjb3Vyc2UsIGJlIGV4dGVuZGVkXHJcbiAgPiAgICAgIC8vIGFzc3VtaW5nICdjdXN0b21lcnMnIGlzIGFuIGFycmF5IG9mICdDdXN0b21lcicgZW50aXRpZXMgcmV0cmlldmVkIGVhcmxpZXIuXHJcbiAgPiAgICAgIGxldCBjdXN0b21lcnNRdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdGllcyhjdXN0b21lcnMpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiUmVnaW9uXCIsIEZpbHRlclF1ZXJ5T3AuTm90RXF1YWxzLCBudWxsKTtcclxuXHJcbiAgU2luZ2xlIGVudGl0aWVzIGNhbiByZXF1ZXJpZWQgYXMgd2VsbC5cclxuICA+ICAgICAgLy8gYXNzdW1pbmcgJ2N1c3RvbWVyJyBpcyBhICdDdXN0b21lcicgZW50aXR5IHJldHJpZXZlZCBlYXJsaWVyLlxyXG4gID4gICAgICBsZXQgY3VzdG9tZXJRdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdGllcyhjdXN0b21lcik7XHJcblxyXG4gIHdpbGwgY3JlYXRlIGEgcXVlcnkgdGhhdCB3aWxsIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGEgc2luZ2xlIGN1c3RvbWVyIGVudGl0eS5cclxuICBAcGFyYW0gZW50aXRpZXMgLSBUaGUgZW50aXRpZXMgZm9yIHdoaWNoIHdlIHdhbnQgdG8gY3JlYXRlIGFuIEVudGl0eVF1ZXJ5LlxyXG4gICoqL1xyXG4gIHN0YXRpYyBmcm9tRW50aXRpZXMoZW50aXRpZXM6IEVudGl0eSB8IEVudGl0eVtdKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdGllcywgXCJlbnRpdGllc1wiKS5pc0VudGl0eSgpLm9yKCkuaXNOb25FbXB0eUFycmF5KCkuaXNFbnRpdHkoKS5jaGVjaygpO1xyXG4gICAgbGV0IGVudHMgPSAoQXJyYXkuaXNBcnJheShlbnRpdGllcykpID8gZW50aXRpZXMgOiBbZW50aXRpZXNdO1xyXG5cclxuICAgIGxldCBmaXJzdEVudGl0eSA9IGVudHNbMF07XHJcbiAgICBsZXQgdHlwZSA9IGZpcnN0RW50aXR5LmVudGl0eVR5cGU7XHJcbiAgICBpZiAoZW50cy5zb21lKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHJldHVybiBlLmVudGl0eVR5cGUgIT09IHR5cGU7XHJcbiAgICB9KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbGwgJ2Zyb21FbnRpdGllcycgbXVzdCBiZSB0aGUgc2FtZSB0eXBlOyBhdCBsZWFzdCBvbmUgaXMgbm90IG9mIHR5cGUgXCIgK1xyXG4gICAgICAgIHR5cGUubmFtZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcSA9IG5ldyBFbnRpdHlRdWVyeSh0eXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByZWRzID0gZW50cy5tYXAoZnVuY3Rpb24gKGVudGl0eSkge1xyXG4gICAgICByZXR1cm4gYnVpbGRQcmVkaWNhdGUoZW50aXR5KTtcclxuICAgIH0pO1xyXG4gICAgbGV0IHByZWQgPSBQcmVkaWNhdGUub3IocHJlZHMpO1xyXG4gICAgcSA9IHEud2hlcmUocHJlZCk7XHJcbiAgICBsZXQgZW0gPSBmaXJzdEVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICAgIGlmIChlbSkge1xyXG4gICAgICBxID0gcS51c2luZyhlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYW4gRW50aXR5UXVlcnkgZm9yIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlLZXldXS5cclxuICA+ICAgICAgbGV0IGVtcFR5cGUgPSBtZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFbXBsb3llZVwiKTtcclxuICA+ICAgICAgbGV0IGVudGl0eUtleSA9IG5ldyBFbnRpdHlLZXkoZW1wVHlwZSwgMSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdHlLZXkoZW50aXR5S2V5KTtcclxuXHJcbiAgb3JcclxuICA+ICAgICAgLy8gJ2VtcGxveWVlJyBpcyBhIHByZXZpb3VzbHkgcXVlcmllZCBlbXBsb3llZVxyXG4gID4gICAgICBsZXQgZW50aXR5S2V5ID0gZW1wbG95ZWUuZW50aXR5QXNwZWN0LmdldEtleSgpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5S2V5KGVudGl0eUtleSk7XHJcbiAgQHBhcmFtIGVudGl0eUtleSAtIFRoZSBbW0VudGl0eUtleV1dIGZvciB3aGljaCBhIHF1ZXJ5IHdpbGwgYmUgY3JlYXRlZC5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbUVudGl0eUtleShlbnRpdHlLZXk6IEVudGl0eUtleSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5S2V5LCBcImVudGl0eUtleVwiKS5pc0luc3RhbmNlT2YoRW50aXR5S2V5KS5jaGVjaygpO1xyXG4gICAgbGV0IHEgPSBuZXcgRW50aXR5UXVlcnkoZW50aXR5S2V5LmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSk7XHJcbiAgICBsZXQgcHJlZCA9IGJ1aWxkS2V5UHJlZGljYXRlKGVudGl0eUtleSk7XHJcbiAgICBxID0gcS53aGVyZShwcmVkKS50b1R5cGUoZW50aXR5S2V5LmVudGl0eVR5cGUpO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGFuIEVudGl0eVF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIGVudGl0eSBhbmQgW1tOYXZpZ2F0aW9uUHJvcGVydHldXS5cclxuICA+ICAgICAgLy8gJ2VtcGxveWVlJyBpcyBhIHByZXZpb3VzbHkgcXVlcmllZCBlbXBsb3llZVxyXG4gID4gICAgICBsZXQgb3JkZXJzTmF2UHJvcCA9IGVtcGxveWVlLmVudGl0eVR5cGUuZ2V0UHJvcGVydHkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdHlOYXZpZ2F0aW9uKGVtcGxveWVlLCBvcmRlcnNOYXZQcm9wKTtcclxuXHJcbiAgd2lsbCByZXR1cm4gYSBxdWVyeSBmb3IgdGhlIFwiT3JkZXJzXCIgb2YgdGhlIHNwZWNpZmllZCAnZW1wbG95ZWUnLlxyXG4gIEBwYXJhbSBlbnRpdHkgLSBUaGUgRW50aXR5IHdob3NlIG5hdmlnYXRpb24gcHJvcGVydHkgd2lsbCBiZSBxdWVyaWVkLlxyXG4gIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgLSBUaGUgW1tOYXZpZ2F0aW9uUHJvcGVydHldXSBvciBuYW1lIG9mIHRoZSBOYXZpZ2F0aW9uUHJvcGVydHkgdG8gYmUgcXVlcmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbUVudGl0eU5hdmlnYXRpb24gPSBmdW5jdGlvbiAoZW50aXR5OiBFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5IHwgc3RyaW5nKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHksIFwiZW50aXR5XCIpLmlzRW50aXR5KCkuY2hlY2soKTtcclxuICAgIGxldCBuYXZQcm9wZXJ0eSA9IGVudGl0eS5lbnRpdHlUeXBlLl9jaGVja05hdlByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgICBsZXQgcSA9IG5ldyBFbnRpdHlRdWVyeShuYXZQcm9wZXJ0eS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByZWQgPSBidWlsZE5hdmlnYXRpb25QcmVkaWNhdGUoZW50aXR5LCBuYXZQcm9wZXJ0eSk7XHJcbiAgICBpZiAocHJlZCA9PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBjcmVhdGUgYSBOYXZpZ2F0aW9uUXVlcnkgZm9yIG5hdmlnYXRpb25Qcm9wZXJ0eTogXCIgKyBuYXZQcm9wZXJ0eS5uYW1lICk7XHJcbiAgICB9XHJcbiAgICBxID0gcS53aGVyZShwcmVkKTtcclxuICAgIGxldCBlbSA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICAgIHJldHVybiBlbSA/IHEudXNpbmcoZW0pIDogcTtcclxuICB9O1xyXG5cclxuICAvLyBwcm90ZWN0ZWQgbWV0aG9kc1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9nZXRGcm9tRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlLCB0aHJvd0Vycm9ySWZOb3RGb3VuZD86IGJvb2xlYW4pIHtcclxuICAgIC8vIFVuY29tbWVudCBuZXh0IHR3byBsaW5lcyBpZiB3ZSBtYWtlIHRoaXMgbWV0aG9kIHB1YmxpYy5cclxuICAgIC8vIGFzc2VydFBhcmFtKG1ldGFkYXRhU3RvcmUsIFwibWV0YWRhdGFTdG9yZVwiKS5pc0luc3RhbmNlT2YoTWV0YWRhdGFTdG9yZSkuY2hlY2soKTtcclxuICAgIC8vIGFzc2VydFBhcmFtKHRocm93RXJyb3JJZk5vdEZvdW5kLCBcInRocm93RXJyb3JJZk5vdEZvdW5kXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgbGV0IGVudGl0eVR5cGUgPSB0aGlzLmZyb21FbnRpdHlUeXBlO1xyXG4gICAgaWYgKGVudGl0eVR5cGUpIHJldHVybiBlbnRpdHlUeXBlO1xyXG5cclxuICAgIGxldCByZXNvdXJjZU5hbWUgPSB0aGlzLnJlc291cmNlTmFtZTtcclxuICAgIGlmICghcmVzb3VyY2VOYW1lKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIHJlc291cmNlTmFtZSBmb3IgdGhpcyBxdWVyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWV0YWRhdGFTdG9yZS5pc0VtcHR5KCkpIHtcclxuICAgICAgaWYgKHRocm93RXJyb3JJZk5vdEZvdW5kKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gbWV0YWRhdGEgYXZhaWxhYmxlIGZvciB0aGlzIHF1ZXJ5LiBcIiArXHJcbiAgICAgICAgICBcIkFyZSB5b3UgcXVlcnlpbmcgdGhlIGxvY2FsIGNhY2hlIGJlZm9yZSB5b3UndmUgZmV0Y2hlZCBtZXRhZGF0YT9cIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBlbnRpdHlUeXBlTmFtZSA9IG1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZU5hbWVGb3JSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTtcclxuICAgIGlmIChlbnRpdHlUeXBlTmFtZSkge1xyXG4gICAgICBlbnRpdHlUeXBlID0gbWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUoZW50aXR5VHlwZU5hbWUpIGFzIEVudGl0eVR5cGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBlbnRpdHlUeXBlID0gdGhpcy5fZ2V0VG9FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZW50aXR5VHlwZSkge1xyXG4gICAgICBpZiAodGhyb3dFcnJvcklmTm90Rm91bmQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29yZS5mb3JtYXRTdHJpbmcoXCJDYW5ub3QgZmluZCBhbiBlbnRpdHlUeXBlIGZvciByZXNvdXJjZU5hbWU6ICclMScuIFwiLCByZXNvdXJjZU5hbWUpICsgY29yZS5zdHJpbmdzLlRPX1RZUEUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZyb21FbnRpdHlUeXBlID0gZW50aXR5VHlwZTtcclxuICAgIHJldHVybiBlbnRpdHlUeXBlO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9nZXRUb0VudGl0eVR5cGUobWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgc2tpcEZyb21DaGVjaz86IGJvb2xlYW4pOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcclxuICAgIC8vIHNraXBGcm9tQ2hlY2sgaXMgdG8gYXZvaWQgcmVjdXJzaW9uIGlmIGNhbGxlZCBmcm9tIF9nZXRGcm9tRW50aXR5VHlwZTtcclxuICAgIGlmICh0aGlzLnJlc3VsdEVudGl0eVR5cGUgaW5zdGFuY2VvZiBFbnRpdHlUeXBlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdEVudGl0eVR5cGU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0RW50aXR5VHlwZSkge1xyXG4gICAgICAvLyByZXN1bHRFbnRpdHlUeXBlIGlzIGEgc3RyaW5nXHJcbiAgICAgIHRoaXMucmVzdWx0RW50aXR5VHlwZSA9IG1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKHRoaXMucmVzdWx0RW50aXR5VHlwZSwgZmFsc2UpIGFzIEVudGl0eVR5cGU7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlc3VsdEVudGl0eVR5cGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyByZXNvbHZlIGl0LCBpZiBwb3NzaWJsZSwgdmlhIHRoZSByZXNvdXJjZU5hbWVcclxuICAgICAgLy8gZG8gbm90IGNhY2hlIHRoaXMgdmFsdWUgaW4gdGhpcyBjYXNlXHJcbiAgICAgIC8vIGNhbm5vdCBkZXRlcm1pbmUgdGhlIHJlc3VsdEVudGl0eVR5cGUgaWYgYSBzZWxlY3RDbGF1c2UgaXMgcHJlc2VudC5cclxuICAgICAgLy8gcmV0dXJuIHNraXBGcm9tQ2hlY2sgPyBudWxsIDogKCF0aGlzLnNlbGVjdENsYXVzZSkgJiYgdGhpcy5fZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZSwgZmFsc2UpO1xyXG4gICAgICBpZiAoc2tpcEZyb21DaGVjayB8fCB0aGlzLnNlbGVjdENsYXVzZSkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZSwgZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgLy8gZm9yIHRlc3RpbmdcclxuICBfdG9VcmkoZW06IEVudGl0eU1hbmFnZXIpIHtcclxuICAgIGxldCBkcyA9IERhdGFTZXJ2aWNlLnJlc29sdmUoW2VtLmRhdGFTZXJ2aWNlXSk7XHJcbiAgICByZXR1cm4gZHMhLnVyaUJ1aWxkZXIhLmJ1aWxkVXJpKHRoaXMsIGVtLm1ldGFkYXRhU3RvcmUpO1xyXG4gIH1cclxuXHJcbn1cclxuRW50aXR5UXVlcnkucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkVudGl0eVF1ZXJ5XCI7XHJcblxyXG4vLyBwcml2YXRlIGZ1bmN0aW9uc1xyXG5cclxuZnVuY3Rpb24gZnJvbUpTT04oZXE6IEVudGl0eVF1ZXJ5LCBqc29uOiBPYmplY3QpIHtcclxuICBjb3JlLnRvSnNvbihqc29uLCB7XHJcbiAgICBcInJlc291cmNlTmFtZSxmcm9tXCI6IG51bGwsXHJcbiAgICAvLyBqdXN0IHRoZSBuYW1lIGNvbWVzIGJhY2sgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXJcclxuICAgIFwicmVzdWx0RW50aXR5VHlwZSx0b1R5cGVcIjogbnVsbCxcclxuICAgIFwid2hlcmVQcmVkaWNhdGUsd2hlcmVcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IG5ldyBQcmVkaWNhdGUodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJvcmRlckJ5Q2xhdXNlLG9yZGVyQnlcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IG5ldyBPcmRlckJ5Q2xhdXNlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwic2VsZWN0Q2xhdXNlLHNlbGVjdFwiOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gbmV3IFNlbGVjdENsYXVzZSh2KSA6IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcbiAgICBcImV4cGFuZENsYXVzZSxleHBhbmRcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IG5ldyBFeHBhbmRDbGF1c2UodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJza2lwQ291bnQsc2tpcFwiOiBudWxsLFxyXG4gICAgXCJ0YWtlQ291bnQsdGFrZVwiOiBudWxsLFxyXG4gICAgcGFyYW1ldGVyczogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gY29yZS5pc0VtcHR5KHYpID8gdW5kZWZpbmVkIDogdjtcclxuICAgIH0sXHJcbiAgICBcImlubGluZUNvdW50RW5hYmxlZCxpbmxpbmVDb3VudFwiOiBmYWxzZSxcclxuICAgIFwibm9UcmFja2luZ0VuYWJsZWQsbm9UcmFja2luZ1wiOiBmYWxzZSxcclxuICAgIFwidXNlUG9zdEVuYWJsZWQsdXNlUG9zdFwiOiBmYWxzZSxcclxuICAgIHF1ZXJ5T3B0aW9uczogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IFF1ZXJ5T3B0aW9ucy5mcm9tSlNPTih2KSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9LCBlcSk7XHJcbiAgcmV0dXJuIGVxO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZShlcTogRW50aXR5UXVlcnksIHByb3BOYW1lPzogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xyXG4gIC8vIGltbXV0YWJsZSBxdWVyaWVzIG1lYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNsb25lIGlmIG5vIGNoYW5nZSBpbiB2YWx1ZS5cclxuICBpZiAocHJvcE5hbWUpIHtcclxuICAgIGlmIChlcVtwcm9wTmFtZV0gPT09IHZhbHVlKSByZXR1cm4gZXE7XHJcbiAgfVxyXG4gIC8vIGNvcHlpbmcgUXVlcnlPcHRpb25zIGlzIHNhZmUgYmVjYXVzZSB0aGV5IGFyZSBhcmUgaW1tdXRhYmxlO1xyXG4gIGxldCBjb3B5ID0gY29yZS5leHRlbmQobmV3IEVudGl0eVF1ZXJ5KCksIGVxLCBbXHJcbiAgICBcInJlc291cmNlTmFtZVwiLFxyXG4gICAgXCJmcm9tRW50aXR5VHlwZVwiLFxyXG4gICAgXCJ3aGVyZVByZWRpY2F0ZVwiLFxyXG4gICAgXCJvcmRlckJ5Q2xhdXNlXCIsXHJcbiAgICBcInNlbGVjdENsYXVzZVwiLFxyXG4gICAgXCJza2lwQ291bnRcIixcclxuICAgIFwidGFrZUNvdW50XCIsXHJcbiAgICBcImV4cGFuZENsYXVzZVwiLFxyXG4gICAgXCJpbmxpbmVDb3VudEVuYWJsZWRcIixcclxuICAgIFwibm9UcmFja2luZ0VuYWJsZWRcIixcclxuICAgIFwidXNlUG9zdEVuYWJsZWRcIixcclxuICAgIFwidXNlc05hbWVPblNlcnZlclwiLFxyXG4gICAgXCJxdWVyeU9wdGlvbnNcIixcclxuICAgIFwiZW50aXR5TWFuYWdlclwiLFxyXG4gICAgXCJkYXRhU2VydmljZVwiLFxyXG4gICAgXCJyZXN1bHRFbnRpdHlUeXBlXCJcclxuICBdKSBhcyBFbnRpdHlRdWVyeTtcclxuICBjb3B5LnBhcmFtZXRlcnMgPSBjb3JlLmV4dGVuZCh7fSwgZXEucGFyYW1ldGVycyk7XHJcbiAgaWYgKHByb3BOYW1lKSB7XHJcbiAgICBjb3B5W3Byb3BOYW1lXSA9IHZhbHVlO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1VzaW5nKGVxOiBFbnRpdHlRdWVyeSwgbWFwOiBPYmplY3QsIHZhbHVlOiBhbnksIHByb3BlcnR5TmFtZT86IHN0cmluZykge1xyXG4gIGxldCB0eXBlTmFtZSA9IHZhbHVlLl8kdHlwZU5hbWUgfHwgKCh2YWx1ZSBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pICYmICh2YWx1ZS5jb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWUpO1xyXG4gIGxldCBrZXkgPSB0eXBlTmFtZSAmJiB0eXBlTmFtZS5zdWJzdHIoMCwgMSkudG9Mb3dlckNhc2UoKSArIHR5cGVOYW1lLnN1YnN0cigxKTtcclxuICBpZiAocHJvcGVydHlOYW1lICYmIGtleSAhPT0gcHJvcGVydHlOYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eTogXCIgKyBwcm9wZXJ0eU5hbWUpO1xyXG4gIH1cclxuICBpZiAoa2V5KSB7XHJcbiAgICBsZXQgZm4gPSBtYXBba2V5XTtcclxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZmlnIHByb3BlcnR5OiBcIiArIGtleSk7XHJcbiAgICB9IGVsc2UgaWYgKGZuID09PSBudWxsKSB7XHJcbiAgICAgIGVxW2tleV0gPSB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZuKGVxLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvcmUub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgKHByb3BOYW1lLCB2YWwpID0+IHtcclxuICAgICAgcHJvY2Vzc1VzaW5nKGVxLCBtYXAsIHZhbCwgcHJvcE5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgYXNzZXJ0UGFyYW0ocHJvcGVydHlQYXRocywgXCJwcm9wZXJ0eVBhdGhzXCIpLmlzT3B0aW9uYWwoKS5pc1N0cmluZygpLm9yKCkuaXNBcnJheSgpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICBpZiAodHlwZW9mIHByb3BlcnR5UGF0aHMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocy5zcGxpdChcIixcIik7XHJcbiAgfVxyXG5cclxuICBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICByZXR1cm4gcHAudHJpbSgpO1xyXG4gIH0pO1xyXG4gIHJldHVybiBwcm9wZXJ0eVBhdGhzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZFByZWRpY2F0ZShlbnRpdHk6IEVudGl0eSkge1xyXG4gIGxldCBlbnRpdHlUeXBlID0gZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgbGV0IHByZWRQYXJ0cyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtwKSB7XHJcbiAgICByZXR1cm4gUHJlZGljYXRlLmNyZWF0ZShrcC5uYW1lLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywgZW50aXR5LmdldFByb3BlcnR5KGtwLm5hbWUpKTtcclxuICB9KTtcclxuICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5hbmQocHJlZFBhcnRzKTtcclxuICByZXR1cm4gcHJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gYnVpbGRLZXlQcmVkaWNhdGUoZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICBsZXQga2V5UHJvcHMgPSBlbnRpdHlLZXkuZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzO1xyXG4gIGxldCBwcmVkcyA9IGNvcmUuYXJyYXlaaXAoa2V5UHJvcHMsIGVudGl0eUtleS52YWx1ZXMsIGZ1bmN0aW9uIChrcCwgdikge1xyXG4gICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoa3AubmFtZSwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIHYpO1xyXG4gIH0pO1xyXG4gIGxldCBwcmVkID0gUHJlZGljYXRlLmFuZChwcmVkcyk7XHJcbiAgcmV0dXJuIHByZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblByZWRpY2F0ZShlbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICBpZiAobmF2aWdhdGlvblByb3BlcnR5LmlzU2NhbGFyKSB7XHJcbiAgICBpZiAobmF2aWdhdGlvblByb3BlcnR5LmZvcmVpZ25LZXlOYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlbGF0ZWRLZXlWYWx1ZXMgPSBuYXZpZ2F0aW9uUHJvcGVydHkuZm9yZWlnbktleU5hbWVzLm1hcCgoZmtOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBlbnRpdHkuZ2V0UHJvcGVydHkoZmtOYW1lKTtcclxuICAgIH0pO1xyXG4gICAgbGV0IGVudGl0eUtleSA9IG5ldyBFbnRpdHlLZXkobmF2aWdhdGlvblByb3BlcnR5LmVudGl0eVR5cGUsIHJlbGF0ZWRLZXlWYWx1ZXMpO1xyXG4gICAgcmV0dXJuIGJ1aWxkS2V5UHJlZGljYXRlKGVudGl0eUtleSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBpbnZlcnNlTnAgPSBuYXZpZ2F0aW9uUHJvcGVydHkuaW52ZXJzZTtcclxuICAgIGxldCBmb3JlaWduS2V5TmFtZXMgPSBpbnZlcnNlTnAgPyBpbnZlcnNlTnAuZm9yZWlnbktleU5hbWVzIDogbmF2aWdhdGlvblByb3BlcnR5LmludkZvcmVpZ25LZXlOYW1lcztcclxuICAgIGlmIChmb3JlaWduS2V5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBrZXlWYWx1ZXMgPSBlbnRpdHkuZW50aXR5QXNwZWN0LmdldEtleSgpLnZhbHVlcztcclxuICAgIGxldCBwcmVkUGFydHMgPSBjb3JlLmFycmF5WmlwKGZvcmVpZ25LZXlOYW1lcywga2V5VmFsdWVzLCAoZmtOYW1lLCBrdikgPT4ge1xyXG4gICAgICByZXR1cm4gUHJlZGljYXRlLmNyZWF0ZShma05hbWUsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBrdik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBQcmVkaWNhdGUuYW5kKHByZWRQYXJ0cyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogQmFzZSBjbGFzcyBmb3IgQm9vbGVhblF1ZXJ5T3AgYW5kIEZpbHRlclF1ZXJ5T3AgKi9cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeU9wIHtcclxuICAvKiogVGhlIG9wZXJhdG9yIGZvciB0aGlzIGVudW0uICovXHJcbiAgb3BlcmF0b3I6IHN0cmluZztcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuRmlsdGVyUXVlcnlPcCBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbGlkICBbW1ByZWRpY2F0ZV1dXHJcbmZpbHRlciBvcGVyYXRvcnMgZm9yIGFuIFtbRW50aXR5UXVlcnldXS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJRdWVyeU9wIGV4dGVuZHMgQnJlZXplRW51bSBpbXBsZW1lbnRzIFF1ZXJ5T3Age1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IgZm9yIHRoaXMgZW51bS4gKi9cclxuICBkZWNsYXJlIG9wZXJhdG9yOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBBbGlhc2VzOiBcImVxXCIsIFwiPT1cIiAqKi9cclxuICBzdGF0aWMgRXF1YWxzID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJlcVwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJuZVwiLCBcIiE9XCIgICoqL1xyXG4gIHN0YXRpYyBOb3RFcXVhbHMgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcIm5lXCIgfSk7XHJcbiAgLyoqIEFsaWFzZXM6IFwiZ3RcIiwgXCI+XCIgICAqKi9cclxuICBzdGF0aWMgR3JlYXRlclRoYW4gPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImd0XCIgfSk7XHJcbiAgLyoqIEFsaWFzZXM6IFwibHRcIiwgXCI8XCIgICoqL1xyXG4gIHN0YXRpYyBMZXNzVGhhbiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwibHRcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwiZ2VcIiwgXCI+PVwiICAqKi9cclxuICBzdGF0aWMgR3JlYXRlclRoYW5PckVxdWFsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJnZVwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJsZVwiLCBcIjw9XCIgICoqL1xyXG4gIHN0YXRpYyBMZXNzVGhhbk9yRXF1YWwgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImxlXCIgfSk7XHJcbiAgLyoqICBTdHJpbmcgb3BlcmF0aW9uOiBJcyBhIHN0cmluZyBhIHN1YnN0cmluZyBvZiBhbm90aGVyIHN0cmluZy4gIEFsaWFzZXM6IFwic3Vic3RyaW5nb2ZcIiAgICoqL1xyXG4gIHN0YXRpYyBDb250YWlucyA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiY29udGFpbnNcIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBTdGFydHNXaXRoID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJzdGFydHN3aXRoXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgRW5kc1dpdGggPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImVuZHN3aXRoXCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcInNvbWVcIiAgKiovXHJcbiAgc3RhdGljIEFueSA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiYW55XCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcImV2ZXJ5XCIgICoqL1xyXG4gIHN0YXRpYyBBbGwgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFsbFwiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIEluID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJpblwiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIElzVHlwZU9mID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJpc29mXCIgfSk7XHJcbn1cclxuRmlsdGVyUXVlcnlPcC5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRmlsdGVyUXVlcnlPcFwiO1xyXG5FcnJvclsneCddID0gRmlsdGVyUXVlcnlPcC5yZXNvbHZlU3ltYm9scygpO1xyXG5cclxuXHJcbi8qKlxyXG4gQm9vbGVhblF1ZXJ5T3AgaXMgYW4gJ0VudW0nIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWxpZCAgYm9vbGVhblxyXG5vcGVyYXRvcnMgZm9yIGFuIFtbRW50aXR5UXVlcnldXS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBCb29sZWFuUXVlcnlPcCBleHRlbmRzIEJyZWV6ZUVudW0gaW1wbGVtZW50cyBRdWVyeU9wIHtcclxuICAvKiogVGhlIG9wZXJhdG9yIGZvciB0aGlzIGVudW0uICovXHJcbiAgZGVjbGFyZSBvcGVyYXRvcjogc3RyaW5nO1xyXG5cclxuICBzdGF0aWMgQW5kID0gbmV3IEJvb2xlYW5RdWVyeU9wKHsgb3BlcmF0b3I6IFwiYW5kXCIgfSk7XHJcbiAgc3RhdGljIE9yID0gbmV3IEJvb2xlYW5RdWVyeU9wKHsgb3BlcmF0b3I6IFwib3JcIiB9KTtcclxuICBzdGF0aWMgTm90ID0gbmV3IEJvb2xlYW5RdWVyeU9wKHsgb3BlcmF0b3I6IFwibm90XCIgfSk7XHJcblxyXG59XHJcbkJvb2xlYW5RdWVyeU9wLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJCb29sZWFuUXVlcnlPcFwiO1xyXG5FcnJvclsneCddID0gQm9vbGVhblF1ZXJ5T3AucmVzb2x2ZVN5bWJvbHMoKTtcclxuXHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGluIG1vc3QgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbnNcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlblxyXG5cclxuQW4gT3JkZXJCeUNsYXVzZSBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCBkaXJlY3Rpb24gdGhhdCB0aGUgcmVzdWx0XHJcbm9mIGEgcXVlcnkgc2hvdWxkIGJlIHNvcnRlZCBpbi4gIE9yZGVyQnlDbGF1c2VzIGFyZSBpbW11dGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgYW55XHJcbm1ldGhvZCB0aGF0IHdvdWxkIG1vZGlmeSBhbiBPcmRlckJ5Q2xhdXNlIGFjdHVhbGx5IHJldHVybnMgYSBuZXcgT3JkZXJCeUNsYXVzZS5cclxuXHJcbkZvciBleGFtcGxlIGZvciBhbiBFbXBsb3llZSBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIG9mICdDb21wYW55JyBhbmQgJ0xhc3ROYW1lJyB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHZhbGlkIGV4cHJlc3Npb25zOlxyXG4+ICAgICBsZXQgb2JjID0gbmV3IE9yZGVyQnlDbGF1c2UoXCJDb21wYW55LkNvbXBhbnlOYW1lLCBMYXN0TmFtZVwiKVxyXG5cclxub3JcclxuPiAgICAgbGV0IG9iYyA9IG5ldyBPcmRlckJ5Q2xhdXNlKFwiQ29tcGFueS5Db21wYW55TmFtZSBkZXNjLCBMYXN0TmFtZVwiKVxyXG5cclxub3JcclxuPiAgICAgbGV0IG9iYyA9IG5ldyBPcmRlckJ5Q2xhdXNlKFwiQ29tcGFueS5Db21wYW55TmFtZSwgTGFzdE5hbWVcIiwgdHJ1ZSk7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBPcmRlckJ5Q2xhdXNlIHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBpdGVtczogT3JkZXJCeUl0ZW1bXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcGVydHlQYXRoczogc3RyaW5nW10gfCBPcmRlckJ5Q2xhdXNlW10sIGlzRGVzYz86IGJvb2xlYW4pIHtcclxuICAgIGlmIChwcm9wZXJ0eVBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcmRlckJ5Q2xhdXNlIGNhbm5vdCBiZSBlbXB0eVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB5b3UgY2FuIGFsc28gcGFzcyBpbiBhbiBhcnJheSBvZiBvcmRlckJ5Q2xhdXNlc1xyXG4gICAgaWYgKHByb3BlcnR5UGF0aHNbMF0gaW5zdGFuY2VvZiBPcmRlckJ5Q2xhdXNlKSB7XHJcbiAgICAgIGxldCBjbGF1c2VzID0gcHJvcGVydHlQYXRocyBhcyBPcmRlckJ5Q2xhdXNlW107XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBjb3JlLmFycmF5RmxhdE1hcChjbGF1c2VzLCBjID0+IGMuaXRlbXMpO1xyXG4gICAgICAvLyB0aGlzLml0ZW1zID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShjbGF1c2VzWzBdLml0ZW1zLCBjbGF1c2VzLnNsaWNlKDEpLm1hcChjb3JlLnBsdWNrKFwiaXRlbXNcIikpKTtcclxuICAgICAgLy8gdGhpcy5pdGVtcyA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIGNsYXVzZXMubWFwKGNvcmUucGx1Y2soXCJpdGVtc1wiKSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IChwcm9wZXJ0eVBhdGhzIGFzIHN0cmluZ1tdKS5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbShwcCwgaXNEZXNjKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgaWYgKGVudGl0eVR5cGUgPT0gbnVsbCB8fCBlbnRpdHlUeXBlLmlzQW5vbnltb3VzKSByZXR1cm47XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaXRlbS52YWxpZGF0ZShlbnRpdHlUeXBlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcGFyZXIoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgbGV0IG9yZGVyQnlGdW5jcyA9IHRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uIChvYmMpIHtcclxuICAgICAgcmV0dXJuIG9iYy5nZXRDb21wYXJlcihlbnRpdHlUeXBlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHkxOiBhbnksIGVudGl0eTI6IGFueSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyQnlGdW5jcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBvcmRlckJ5RnVuY3NbaV0oZW50aXR5MSwgZW50aXR5Mik7XHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ6IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eVBhdGhGbiEoaXRlbS5wcm9wZXJ0eVBhdGgpICsgKGl0ZW0uaXNEZXNjID8gXCIgZGVzY1wiIDogXCJcIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG4vKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIE9yZGVyQnlJdGVtIHtcclxuICBwcm9wZXJ0eVBhdGg6IHN0cmluZztcclxuICBpc0Rlc2M6IGJvb2xlYW47XHJcbiAgbGFzdFByb3BlcnR5OiBFbnRpdHlQcm9wZXJ0eTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcGVydHlQYXRoOiBzdHJpbmcsIGlzRGVzYz86IGJvb2xlYW4pIHtcclxuICAgIGlmICghKHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09ICdzdHJpbmcnKSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcm9wZXJ0eVBhdGggaXMgbm90IGEgc3RyaW5nXCIpO1xyXG4gICAgfVxyXG4gICAgcHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoLnRyaW0oKTtcclxuXHJcbiAgICBsZXQgcGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoJyAnKTtcclxuICAgIC8vIHBhcnRzWzBdIGlzIHRoZSBwcm9wZXJ0eVBhdGg7IFsxXSB3b3VsZCBiZSB3aGV0aGVyIGRlc2NlbmRpbmcgb3Igbm90LlxyXG4gICAgLy8gaWYgKHBhcnRzLmxlbmd0aCA+IDEgJiYgaXNEZXNjICE9PSB0cnVlICYmIGlzRGVzYyAhPT0gZmFsc2UpIHtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxICYmIGlzRGVzYyA9PSBudWxsKSB7XHJcbiAgICAgIGlzRGVzYyA9IGNvcmUuc3RyaW5nU3RhcnRzV2l0aChwYXJ0c1sxXS50b0xvd2VyQ2FzZSgpLCBcImRlc2NcIik7XHJcbiAgICAgIGlmICghaXNEZXNjKSB7XHJcbiAgICAgICAgLy8gaXNEZXNjIGlzIGZhbHNlIGJ1dCBjaGVjayB0byBtYWtlIHN1cmUgaXRzIGludGVuZGVkLlxyXG4gICAgICAgIGxldCBpc0FzYyA9IGNvcmUuc3RyaW5nU3RhcnRzV2l0aChwYXJ0c1sxXS50b0xvd2VyQ2FzZSgpLCBcImFzY1wiKTtcclxuICAgICAgICBpZiAoIWlzQXNjKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgc2Vjb25kIHdvcmQgaW4gdGhlIHByb3BlcnR5UGF0aCBtdXN0IGJlZ2luIHdpdGggJ2Rlc2MnIG9yICdhc2MnXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucHJvcGVydHlQYXRoID0gcGFydHNbMF07XHJcbiAgICB0aGlzLmlzRGVzYyA9IGlzRGVzYyB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBFbnRpdHlQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjtcclxuICAgIC8vIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGJhZCBwcm9wZXJ0eVBhdGhcclxuICAgIHRoaXMubGFzdFByb3BlcnR5ID0gZW50aXR5VHlwZS5nZXRQcm9wZXJ0eSh0aGlzLnByb3BlcnR5UGF0aCwgdHJ1ZSkgYXMgRW50aXR5UHJvcGVydHk7XHJcbiAgICByZXR1cm4gdGhpcy5sYXN0UHJvcGVydHk7XHJcbiAgfVxyXG5cclxuICBnZXRDb21wYXJlcihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBsZXQgcHJvcERhdGFUeXBlOiBEYXRhVHlwZTtcclxuICAgIGxldCBpc0Nhc2VTZW5zaXRpdmU6IGJvb2xlYW47XHJcbiAgICBpZiAoIXRoaXMubGFzdFByb3BlcnR5KSB0aGlzLnZhbGlkYXRlKGVudGl0eVR5cGUpO1xyXG4gICAgaWYgKHRoaXMubGFzdFByb3BlcnR5KSB7XHJcbiAgICAgIHByb3BEYXRhVHlwZSA9ICh0aGlzLmxhc3RQcm9wZXJ0eSBhcyBhbnkpLmRhdGFUeXBlO1xyXG4gICAgICBpc0Nhc2VTZW5zaXRpdmUgPSB0aGlzLmxhc3RQcm9wZXJ0eS5wYXJlbnRUeXBlLm1ldGFkYXRhU3RvcmUubG9jYWxRdWVyeUNvbXBhcmlzb25PcHRpb25zLmlzQ2FzZVNlbnNpdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJvcGVydHlQYXRoID0gdGhpcy5wcm9wZXJ0eVBhdGg7XHJcbiAgICBsZXQgaXNEZXNjID0gdGhpcy5pc0Rlc2M7XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHkxOiBhbnksIGVudGl0eTI6IGFueSkge1xyXG4gICAgICBsZXQgdmFsdWUxID0gRW50aXR5QXNwZWN0LmdldFByb3BlcnR5UGF0aFZhbHVlKGVudGl0eTEsIHByb3BlcnR5UGF0aCk7XHJcbiAgICAgIGxldCB2YWx1ZTIgPSBFbnRpdHlBc3BlY3QuZ2V0UHJvcGVydHlQYXRoVmFsdWUoZW50aXR5MiwgcHJvcGVydHlQYXRoKTtcclxuICAgICAgbGV0IGRhdGFUeXBlID0gcHJvcERhdGFUeXBlIHx8ICh2YWx1ZTEgJiYgRGF0YVR5cGUuZnJvbVZhbHVlKHZhbHVlMSkpIHx8IERhdGFUeXBlLmZyb21WYWx1ZSh2YWx1ZTIpO1xyXG4gICAgICBpZiAoZGF0YVR5cGUgPT09IERhdGFUeXBlLlN0cmluZykge1xyXG4gICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUpIHtcclxuICAgICAgICAgIHZhbHVlMSA9IHZhbHVlMSB8fCBcIlwiO1xyXG4gICAgICAgICAgdmFsdWUyID0gdmFsdWUyIHx8IFwiXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhbHVlMSA9ICh2YWx1ZTEgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgIHZhbHVlMiA9ICh2YWx1ZTIgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG5vcm1hbGl6ZSA9IERhdGFUeXBlLmdldENvbXBhcmFibGVGbihkYXRhVHlwZSk7XHJcbiAgICAgICAgdmFsdWUxID0gbm9ybWFsaXplKHZhbHVlMSk7XHJcbiAgICAgICAgdmFsdWUyID0gbm9ybWFsaXplKHZhbHVlMik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbHVlMSA9PT0gdmFsdWUyKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUxID4gdmFsdWUyIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVzYyA/IC0xIDogMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXNEZXNjID8gMSA6IC0xO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuICBUaGUgY2xhc3MgaXMgdXNlZCBpbiBtb3N0IFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb25zXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgU2VsZWN0Q2xhdXNlIHtcclxuICBwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXTtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfcGF0aE5hbWVzOiBzdHJpbmdbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcGVydHlQYXRoczogc3RyaW5nW10pIHtcclxuICAgIHRoaXMucHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHM7XHJcbiAgICB0aGlzLl9wYXRoTmFtZXMgPSBwcm9wZXJ0eVBhdGhzLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgcmV0dXJuIHBwLnJlcGxhY2UoXCIuXCIsIFwiX1wiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgaWYgKGVudGl0eVR5cGUgPT0gbnVsbCB8fCBlbnRpdHlUeXBlLmlzQW5vbnltb3VzKSByZXR1cm47IC8vIGNhbid0IHZhbGlkYXRlIHlldFxyXG4gICAgLy8gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gb24gYmFkIHByb3BlcnR5UGF0aFxyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHBhdGgpIHtcclxuICAgICAgZW50aXR5VHlwZS5nZXRQcm9wZXJ0eShwYXRoLCB0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9GdW5jdGlvbigvKiBjb25maWcgKi8pIHtcclxuICAgIGxldCB0aGF0ID0gdGhpcztcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHt9O1xyXG4gICAgICB0aGF0LnByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocGF0aCwgaSkge1xyXG4gICAgICAgIHJlc3VsdFt0aGF0Ll9wYXRoTmFtZXNbaV1dID0gRW50aXR5QXNwZWN0LmdldFByb3BlcnR5UGF0aFZhbHVlKGVudGl0eSwgcGF0aCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVBhdGhzLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHlQYXRoRm4hKHBwKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuICBUaGUgY2xhc3MgaXMgdXNlZCBpbiBtb3N0IFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb25zXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRXhwYW5kQ2xhdXNlIHtcclxuICBwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvcGVydHlQYXRoczogc3RyaW5nW10pIHtcclxuICAgIHRoaXMucHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHM7XHJcbiAgfVxyXG5cclxuICB0b0pTT05FeHQoY29udGV4dDogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5UGF0aEZuIShwcCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
|