breeze-client 2.1.5 → 2.1.6
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/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -1
- package/breeze-client.metadata.json +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +4 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +8 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -1
- package/bundles/breeze-client.umd.js +103 -20
- 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/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
- package/esm2015/src/abstract-data-service-adapter.js +1 -1
- package/esm2015/src/core.js +14 -9
- package/esm2015/src/data-type.js +60 -1
- package/esm2015/src/entity-action.js +1 -1
- package/esm2015/src/entity-aspect.js +6 -8
- package/esm2015/src/entity-manager.js +1 -1
- package/esm2015/src/entity-metadata.js +1 -1
- package/esm2015/src/entity-query.js +1 -1
- package/esm2015/src/entity-state.js +9 -1
- package/esm2015/src/enum.js +1 -1
- package/esm2015/src/key-generator.js +1 -1
- package/esm2015/src/mapping-context.js +9 -3
- package/esm2015/src/predicate.js +12 -5
- package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
- package/esm5/src/abstract-data-service-adapter.js +1 -1
- package/esm5/src/core.js +13 -8
- package/esm5/src/data-type.js +60 -1
- package/esm5/src/entity-action.js +1 -1
- package/esm5/src/entity-aspect.js +6 -8
- package/esm5/src/entity-manager.js +1 -1
- package/esm5/src/entity-metadata.js +1 -1
- package/esm5/src/entity-query.js +1 -1
- package/esm5/src/entity-state.js +9 -1
- package/esm5/src/enum.js +1 -1
- package/esm5/src/key-generator.js +1 -1
- package/esm5/src/mapping-context.js +9 -3
- package/esm5/src/predicate.js +12 -5
- package/fesm2015/breeze-client-adapter-data-service-odata.js +4 -0
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js +9 -2
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -1
- package/fesm2015/breeze-client.js +104 -21
- package/fesm2015/breeze-client.js.map +1 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js +4 -0
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js +9 -2
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -1
- package/fesm5/breeze-client.js +103 -20
- package/fesm5/breeze-client.js.map +1 -1
- package/package.json +1 -1
- package/src/abstract-data-service-adapter.d.ts +0 -1
- package/src/data-type.d.ts +5 -0
- package/src/entity-aspect.d.ts +5 -5
- package/src/entity-manager.d.ts +4 -4
- package/src/entity-metadata.d.ts +37 -27
- package/src/entity-state.d.ts +4 -0
- package/src/mapping-context.d.ts +1 -1
- package/src/predicate.d.ts +4 -7
package/esm5/src/entity-query.js
CHANGED
|
@@ -1020,4 +1020,4 @@ var ExpandClause = /** @class */ (function () {
|
|
|
1020
1020
|
return ExpandClause;
|
|
1021
1021
|
}());
|
|
1022
1022
|
export { ExpandClause };
|
|
1023
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9lbnRpdHktcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQTJCLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQWlCLFVBQVUsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFnQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXeEM7Ozs7OztHQU1HO0FBQ0g7SUF3Q0U7Ozs7Ozs7O09BUUc7SUFDSCxxQkFBWSxZQUE4QjtRQUN4QyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsRUFBRTtZQUM5RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDckM7UUFDRCw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFzQixDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FB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YSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQVMsR0FBVCxVQUFVLE9BQStCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUFwQ0QsSUFvQ0M7O0FBRUQ7OztHQUdHO0FBQ0g7SUFHRSxzQkFBWSxhQUF1QjtRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZ0NBQVMsR0FBVCxVQUFVLE9BQStCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFSCxtQkFBQztBQUFELENBQUMsQUFiRCxJQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSwgQ2FsbGJhY2ssIEVycm9yQ2FsbGJhY2sgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IEVudGl0eUFzcGVjdCwgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgRW50aXR5S2V5IH0gZnJvbSAnLi9lbnRpdHkta2V5JztcclxuaW1wb3J0IHsgQnJlZXplRW51bSB9IGZyb20gJy4vZW51bSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlLCBKc29uUmVzdWx0c0FkYXB0ZXIgfSBmcm9tICcuL2RhdGEtc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1ldGFkYXRhU3RvcmUsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgRW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IFF1ZXJ5T3B0aW9ucywgTWVyZ2VTdHJhdGVneSwgRmV0Y2hTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IFByZWRpY2F0ZSB9IGZyb20gJy4vcHJlZGljYXRlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJzaXZlQXJyYXk8VD4ge1xyXG4gIFtpOiBudW1iZXJdOiBUIHwgUmVjdXJzaXZlQXJyYXk8VD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5UXVlcnlKc29uQ29udGV4dCB7XHJcbiAgZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XHJcbiAgcHJvcGVydHlQYXRoRm4/OiBGdW5jdGlvbjsgLy8gVE9ET1xyXG4gIHRvTmFtZU9uU2VydmVyPzogYm9vbGVhbjtcclxufVxyXG4vKipcclxuQW4gRW50aXR5UXVlcnkgaW5zdGFuY2UgaXMgdXNlZCB0byBxdWVyeSBlbnRpdGllcyBlaXRoZXIgZnJvbSBhIHJlbW90ZSBkYXRhc291cmNlIG9yIGZyb20gYSBsb2NhbCBbW0VudGl0eU1hbmFnZXJdXS5cclxuXHJcbkVudGl0eVF1ZXJpZXMgYXJlIGltbXV0YWJsZSAtIHRoaXMgbWVhbnMgdGhhdCBhbGwgRW50aXR5UXVlcnkgbWV0aG9kcyB0aGF0IHJldHVybiBhbiBFbnRpdHlRdWVyeSBhY3R1YWxseSBjcmVhdGUgYSBuZXcgRW50aXR5UXVlcnkuICBUaGlzIG1lYW5zIHRoYXRcclxuRW50aXR5UXVlcmllcyBjYW4gYmUgJ21vZGlmaWVkJyB3aXRob3V0IGFmZmVjdGluZyBhbnkgY3VycmVudCBpbnN0YW5jZXMuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5UXVlcnkge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gYWN0dWFsbHkgcGxhY2VkIG9uIHByb3RvdHlwZVxyXG4gIC8vIHRvcCA9IHRoaXMudGFrZTsgLy8gVE9ETzogY29uc2lkZXJcclxuICAvKiogVGhlIHJlc291cmNlIG5hbWUgdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBUaGUgW1tFbnRpdHlUeXBlXV0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlICdmcm9tJyBjbGF1c2UgKCByZXNvdXJjZU5hbWUpIG9mIHRoZSBxdWVyeS4gIFRoaXMgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIGJlIHNldCBBRlRFUiB0aGUgcXVlcnlcclxuICBoYXMgYmVlbiBleGVjdXRlZCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIFtbTWV0YWRhdGFTdG9yZV1dIGFzc29jaWF0ZWQgd2l0aCB0aGUgW1tFbnRpdHlNYW5hZ2VyXV0gdGhhdCB0aGUgcXVlcnkgd2FzIGV4ZWN1dGVkIGFnYWluc3QuXHJcbiAgVGhpcyB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGUgZW50aXR5VHlwZSBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2VOYW1lLiBfX1JlYWQgT25seV9fICovXHJcbiAgZnJvbUVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG4gIC8qKiBUaGUgJ3doZXJlJyBbW1ByZWRpY2F0ZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIHdoZXJlUHJlZGljYXRlOiBQcmVkaWNhdGU7IC8vIFRPRE9cclxuICAvKiogVGhlIFtbT3JkZXJCeUNsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIG9yZGVyQnlDbGF1c2U/OiBPcmRlckJ5Q2xhdXNlO1xyXG4gIC8qKiBUaGUgW1tFeHBhbmRDbGF1c2VdXSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBleHBhbmRDbGF1c2U/OiBFeHBhbmRDbGF1c2U7XHJcbiAgLyoqIFRoZSBbW1NlbGVjdENsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIHNlbGVjdENsYXVzZT86IFNlbGVjdENsYXVzZTtcclxuICAvKiogVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byAnc2tpcCcgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBza2lwQ291bnQ/OiBudW1iZXI7XHJcbiAgLyoqIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gJ3Rha2UnIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgdGFrZUNvdW50PzogbnVtYmVyO1xyXG4gIC8qKiBBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgcXVlcnkgdmlhIHRoZSAnd2l0aFBhcmFtZXRlcnMnIG1ldGhvZC4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIHBhcmFtZXRlcnM6IE9iamVjdDtcclxuICAvKiogV2hldGhlciBhbiBpbmxpbmUgY291bnQgaXMgcmV0dXJuZWQgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBpbmxpbmVDb3VudEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IHRyYWNraW5nIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgbm9UcmFja2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBbW1F1ZXJ5T3B0aW9uc11dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICAvLyBkZWZhdWx0IGlzIHRvIGdldCBxdWVyeU9wdGlvbnMgYW5kIGRhdGFTZXJ2aWNlIGZyb20gdGhlIGVudGl0eU1hbmFnZXIuXHJcbiAgcXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25zO1xyXG4gIC8qKiBUaGUgW1tEYXRhU2VydmljZV1dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkYXRhU2VydmljZT86IERhdGFTZXJ2aWNlO1xyXG4gIC8qKiBUaGUgW1tFbnRpdHlNYW5hZ2VyXV0gZm9yIHRoaXMgcXVlcnkuIFRoaXMgbWF5IGJlIG51bGwgYW5kIGNhbiBiZSBzZXQgdmlhIHRoZSAndXNpbmcnIG1ldGhvZC4gICoqL1xyXG4gIGVudGl0eU1hbmFnZXI/OiBFbnRpdHlNYW5hZ2VyO1xyXG4gIC8qKiAgVGhlIGVudGl0eVR5cGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoaXMgcXVlcnkuIFxyXG4gIFRoaXMgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHNldCBpZiB0aGUgJ3RvVHlwZScgbWV0aG9kIHdhcyBjYWxsZWQuIF9fUmVhZCBPbmx5X18gKi9cclxuICByZXN1bHRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgc3RyaW5nO1xyXG4gIHVzZXNOYW1lT25TZXJ2ZXI/OiBib29sZWFuO1xyXG5cclxuICAvKiogQ29uc3RydWN0b3JcclxuICA+ICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG5cclxuICBVc3VhbGx5IHRoaXMgY29uc3RydWN0b3Igd2lsbCBiZSBmb2xsb3dlZCBieSBjYWxscyB0byBmaWx0ZXJpbmcsIG9yZGVyaW5nIG9yIHNlbGVjdGlvbiBtZXRob2RzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIlJlZ2lvblwiKTtcclxuICBAcGFyYW0gcmVzb3VyY2VOYW1lIC0gZWl0aGVyIGEgcmVzb3VyY2UgbmFtZSBvciBhIHNlcmlhbGl6ZWQgRW50aXR5UXVlcnkgKCBjcmVhdGVkIGJ5IFtbRW50aXR5UXVlcnkudG9KU09OXV0pXHJcbiAgKiovXHJcbiAgY29uc3RydWN0b3IocmVzb3VyY2VOYW1lPzogc3RyaW5nIHwgT2JqZWN0KSB7XHJcbiAgICBpZiAocmVzb3VyY2VOYW1lICE9IG51bGwgJiYgKHR5cGVvZiByZXNvdXJjZU5hbWUgIT09ICdzdHJpbmcnKSkge1xyXG4gICAgICByZXR1cm4gZnJvbUpTT04odGhpcywgcmVzb3VyY2VOYW1lKTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IGNhc3QgYXMgc3RyaW5nIGJlbG93IG5lZWRlZCBmb3IgZWFybHkgdmVyc2lvbnMgb2YgVHlwZURvYyAtIGJ1dCBub3QgZm9yIHJlZ3VsYXIgY29tcGlsZSAtIGNoZWNrIGxhdGVyXHJcbiAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZSBhcyBzdHJpbmc7XHJcbiAgICB0aGlzLmZyb21FbnRpdHlUeXBlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy53aGVyZVByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMub3JkZXJCeUNsYXVzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0Q2xhdXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5za2lwQ291bnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRha2VDb3VudCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZXhwYW5kQ2xhdXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5wYXJhbWV0ZXJzID0ge307XHJcbiAgICB0aGlzLmlubGluZUNvdW50RW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5ub1RyYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgLy8gZGVmYXVsdCBpcyB0byBnZXQgcXVlcnlPcHRpb25zIGFuZCBkYXRhU2VydmljZSBmcm9tIHRoZSBlbnRpdHlNYW5hZ2VyLlxyXG4gICAgLy8gdGhpcy5xdWVyeU9wdGlvbnMgPSBuZXcgUXVlcnlPcHRpb25zKCk7XHJcbiAgICAvLyB0aGlzLmRhdGFTZXJ2aWNlID0gbmV3IERhdGFTZXJ2aWNlKCk7XHJcbiAgICB0aGlzLmVudGl0eU1hbmFnZXIgPSB1bmRlZmluZWQ7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdG8gcXVlcnkgZm9yIHRoaXMgRW50aXR5UXVlcnkuXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeSgpXHJcbiAgPiAgICAgICAgLmZyb20oXCJDdXN0b21lcnNcIik7XHJcblxyXG4gIGlzIHRoZSBzYW1lIGFzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKTtcclxuICBAcGFyYW0gcmVzb3VyY2VOYW1lIC0gVGhlIHJlc291cmNlIHRvIHF1ZXJ5LlxyXG4gICoqL1xyXG4gIGZyb20ocmVzb3VyY2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IGFsbG93aW5nIGVudGl0eVR5cGUgYXMgd2VsbFxyXG4gICAgYXNzZXJ0UGFyYW0ocmVzb3VyY2VOYW1lLCBcInJlc291cmNlTmFtZVwiKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJyZXNvdXJjZU5hbWVcIiwgcmVzb3VyY2VOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiBvZiB0aGUgXCJmcm9tXCIgbWV0aG9kIGFuZCBpdCBjcmVhdGVzIGEgJ2Jhc2UnIGVudGl0eVF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIG5hbWUuXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb20oXCJDdXN0b21lcnNcIik7XHJcblxyXG4gIGlzIHRoZSBzYW1lIGFzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKTtcclxuICBAcGFyYW0gcmVzb3VyY2VOYW1lIC0gVGhlIHJlc291cmNlIHRvIHF1ZXJ5LlxyXG4gICoqL1xyXG4gIHN0YXRpYyBmcm9tKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBhc3NlcnRQYXJhbShyZXNvdXJjZU5hbWUsIFwicmVzb3VyY2VOYW1lXCIpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBuZXcgRW50aXR5UXVlcnkocmVzb3VyY2VOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFNwZWNpZmllcyB0aGUgdG9wIGxldmVsIEVudGl0eVR5cGUgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgcmV0dXJuLiAgT25seSBuZWVkZWQgd2hlbiBhIHF1ZXJ5IHJldHVybnMgYSBqc29uIHJlc3VsdCB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdHlwZSBpbmZvcm1hdGlvbixcclxuICBvciB3aGVuIHVzaW5nIGEgcmVzb3VyY2UgbmFtZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHRvIGFuIEVudGl0eVR5cGUuXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeSgpXHJcbiAgPiAgICAgICAgLmZyb20oXCJNeUN1c3RvbU1ldGhvZFwiKVxyXG4gID4gICAgICAgIC50b1R5cGUoXCJDdXN0b21lclwiKVxyXG4gIEBwYXJhbSBlbnRpdHlUeXBlIC0gVGhlIHRvcCBsZXZlbCBFbnRpdHlUeXBlIHRoYXQgdGhpcyBxdWVyeSB3aWxsIHJldHVybi5cclxuICBAc3VtbWFyeSBJZiB0aGUganNvbiByZXN1bHQgY29uc2lzdHMgb2YgbW9yZSB0aGFuIGEgc2ltcGxlIGVudGl0eSBvciBhcnJheSBvZiBlbnRpdGllcywgY29uc2lkZXIgdXNpbmcgYSBbW0pzb25SZXN1bHRzQWRhcHRlcl1dIGluc3RlYWQuXHJcbiAgKiovXHJcbiAgdG9UeXBlKGVudGl0eVR5cGU6IHN0cmluZyB8IEVudGl0eVR5cGUpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eVR5cGUsIFwiZW50aXR5VHlwZVwiKS5pc1N0cmluZygpLm9yKCkuaXNJbnN0YW5jZU9mKEVudGl0eVR5cGUpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJyZXN1bHRFbnRpdHlUeXBlXCIsIGVudGl0eVR5cGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHdoZXJlKHByZWRpY2F0ZT86IFByZWRpY2F0ZSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByZWRpY2F0ZTogT2JqZWN0KTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIG9wZXJhdG9yOiBGaWx0ZXJRdWVyeU9wLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgZmlsdGVyb3A6IEZpbHRlclF1ZXJ5T3AsIHByb3BlcnR5Mjogc3RyaW5nLCBmaWx0ZXJvcDI6IEZpbHRlclF1ZXJ5T3AsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTsgIC8vIGZvciBhbnkvYWxsIGNsYXVzZXNcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBmaWx0ZXJvcDogc3RyaW5nLCBwcm9wZXJ0eTI6IHN0cmluZywgZmlsdGVyb3AyOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTsgIC8vIGZvciBhbnkvYWxsIGNsYXVzZXNcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBmaWx0ZXJvcDogc3RyaW5nLCBwcm9wZXJ0eTI6IHN0cmluZywgZmlsdGVyb3AyOiBzdHJpbmcsIHByb3BlcnR5Mzogc3RyaW5nLCBmaWx0ZXJvcDM6IHN0cmluZywgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5OyAgLy8gZm9yIGFueS9hbGwgY2xhdXNlc1xyXG4gIHdoZXJlKGFuQXJyYXk6IFJlY3Vyc2l2ZUFycmF5PHN0cmluZyB8IG51bWJlciB8IEZpbHRlclF1ZXJ5T3AgfCBQcmVkaWNhdGU+KTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB3aXRoIGFuIGFkZGVkIGZpbHRlciBjcml0ZXJpYTsgQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aGljaCBtZWFucyB0byAnYW5kJyB3aXRoIGFueSBleGlzdGluZ1xyXG4gIFByZWRpY2F0ZSBvciBjYW4gYmUgY2FsbGVkIHdpdGggbnVsbCB0byBjbGVhciBhbGwgcHJlZGljYXRlcy5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpO1xyXG5cclxuICBUaGlzIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCB1c2luZyBhbiBleHBsaWNpdCBbW0ZpbHRlclF1ZXJ5T3BdXSBhc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIEZpbHRlclF1ZXJ5T3AuU3RhcnRzV2l0aCwgXCJDXCIpO1xyXG5cclxuICBvciBhIHByZWNvbnN0cnVjdGVkIFtbUHJlZGljYXRlXV0gbWF5IGJlIHVzZWRcclxuICA+ICAgICAgbGV0IHByZWQgPSBuZXcgUHJlZGljYXRlKFwiQ29tcGFueU5hbWVcIiwgRmlsdGVyUXVlcnlPcC5TdGFydHNXaXRoLCBcIkNcIik7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKS53aGVyZShwcmVkKTtcclxuXHJcbiAgUHJlZGljYXRlcyBhcmUgb2Z0ZW4gdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gY29tYmluZSBtdWx0aXBsZSBjb25kaXRpb25zIGluIGEgc2luZ2xlIGZpbHRlciwgc3VjaCBhc1xyXG4gID4gICAgICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5jcmVhdGUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJDXCIpLmFuZChcIlJlZ2lvblwiLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywgbnVsbCk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKHByZWQpO1xyXG5cclxuICBNb3JlIGNvbXBsaWNhdGVkIHF1ZXJpZXMgY2FuIG1ha2UgdXNlIG9mIG5lc3RlZCBwcm9wZXJ0eSBwYXRoc1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJQcm9kdWN0c1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwiQ2F0ZWdvcnkuQ2F0ZWdvcnlOYW1lXCIsIFwic3RhcnRzd2l0aFwiLCBcIlNcIik7XHJcblxyXG4gIG9yIE9EYXRhIGZ1bmN0aW9ucyAtIEEgbGlzdCBvZiB2YWxpZCBPRGF0YSBmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIHdpdGhpbiB0aGUgW1tQcmVkaWNhdGVdXSBkb2N1bWVudGF0aW9uLlxyXG4gIFxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcInRvTG93ZXIoQ29tcGFueU5hbWUpXCIsIFwic3RhcnRzV2l0aFwiLCBcImNcIik7XHJcblxyXG4gIG9yIHRvIGJlIGV2ZW4gbW9yZSBiYXJvcXVlXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwidG9VcHBlcihzdWJzdHJpbmcoQ29tcGFueU5hbWUsIDEsIDIpKVwiLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywgXCJPTVwiKTtcclxuICBAcGFyYW0gcHJlZGljYXRlIC0gIENhbiBiZSBlaXRoZXJcclxuICAgIC0gYSBzaW5nbGUgW1tQcmVkaWNhdGVdXVxyXG5cclxuICAgIC0gdGhlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgJ3NpbXBsZScgUHJlZGljYXRlXHJcbiAgICAtIC0gIGEgcHJvcGVydHkgbmFtZSwgYSBwcm9wZXJ0eSBwYXRoIHdpdGggJy4nIGFzIHBhdGggc2VwZXJhdG9ycyBvciBhIHByb3BlcnR5IGV4cHJlc3Npb24ge1N0cmluZ31cclxuICAgIC0gLSAgYW4gb3BlcmF0b3IgLSBbW0ZpbHRlclF1ZXJ5T3BdXSBvciBpdCdzIHN0cmluZyByZXByZXNlbnRhdGlvbi4gQ2FzZSBpcyBpZ25vcmVkXHJcbiAgICB3aGVuIGlmIGEgc3RyaW5nIGlzIHByb3ZpZGVkIGFuZCBhbnkgc3RyaW5nIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlIEZpbHRlclF1ZXJ5T3AgYWxpYXNlcyB3aWxsIGJlIGFjY2VwdGVkLlxyXG4gICAgLSAtICBhIHZhbHVlIHtPYmplY3R9IC0gVGhpcyB3aWxsIGJlIHRyZWF0ZWQgYXMgZWl0aGVyIGEgcHJvcGVydHkgZXhwcmVzc2lvbiBvciBhIGxpdGVyYWwgZGVwZW5kaW5nIG9uIGNvbnRleHQuICBcclxuICAgIEluIGdlbmVyYWwsIGlmIHRoZSB2YWx1ZSBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBwcm9wZXJ0eSBleHByZXNzaW9uIGl0IHdpbGwgYmUsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBsaXRlcmFsLlxyXG4gICAgSW4gbW9zdCBjYXNlcyB0aGlzIHdvcmtzIHdlbGwsIGJ1dCB5b3UgY2FuIGFsc28gZm9yY2UgdGhlIGludGVycHJldGF0aW9uIGJ5IG1ha2luZyB0aGUgdmFsdWUgYXJndW1lbnQgaXRzZWxmIGFuIG9iamVjdCBcclxuICAgIHdpdGggYSAndmFsdWUnIHByb3BlcnR5IGFuZCBhbiAnaXNMaXRlcmFsJyBwcm9wZXJ0eSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuXHJcbiAgICBCcmVlemUgYWxzbyB0cmllcyB0byBpbmZlciB0aGUgZGF0YVR5cGUgb2YgYW55IGxpdGVyYWwgYmFzZWQgb24gY29udGV4dCwgaWYgdGhpcyBmYWlscyB5b3UgY2FuIGZvcmNlIHRoaXMgaW5mZXJlbmNlIGJ5IG1ha2luZyB0aGUgdmFsdWUgYXJndW1lbnQgXHJcbiAgICBhbiBvYmplY3Qgd2l0aCBhICd2YWx1ZScgcHJvcGVydHkgYW5kIGEgJ2RhdGFUeXBlJ3Byb3BlcnR5IHNldCB0byBvbmUgb2YgdGhlIERhdGFUeXBlIGVudW1lcmF0aW9uIGluc3RhbmNlcy5cclxuXHJcbiAgICAtIGEgbnVsbCBvciB1bmRlZmluZWQgKCB0aGlzIGNhdXNlcyBhbnkgZXhpc3Rpbmcgd2hlcmUgY2xhdXNlIHRvIGJlIHJlbW92ZWQpXHJcbiAgKiovXHJcbiAgd2hlcmUoLi4uYXJnczogYW55W10pIHtcclxuICAgIGxldCB3aGVyZVByZWRpY2F0ZTogUHJlZGljYXRlIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdICE9IG51bGwpIHtcclxuICAgICAgd2hlcmVQcmVkaWNhdGUgPSBQcmVkaWNhdGUuY3JlYXRlKC4uLjxhbnk+YXJncyk7XHJcbiAgICAgIGlmICh0aGlzLmZyb21FbnRpdHlUeXBlKSB3aGVyZVByZWRpY2F0ZS5fdmFsaWRhdGUodGhpcy5mcm9tRW50aXR5VHlwZSk7XHJcbiAgICAgIGlmICh0aGlzLndoZXJlUHJlZGljYXRlKSB7XHJcbiAgICAgICAgd2hlcmVQcmVkaWNhdGUgPSB0aGlzLndoZXJlUHJlZGljYXRlLmFuZCh3aGVyZVByZWRpY2F0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcIndoZXJlUHJlZGljYXRlXCIsIHdoZXJlUHJlZGljYXRlKTtcclxuICB9XHJcblxyXG5cclxuICBvcmRlckJ5KHByb3BlcnR5UGF0aHM/OiBzdHJpbmcsIGlzRGVzY2VuZGluZz86IGJvb2xlYW4pOiBFbnRpdHlRdWVyeTtcclxuICBvcmRlckJ5KHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdLCBpc0Rlc2NlbmRpbmc/OiBib29sZWFuKTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IG9yZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgYnkgcHJvcGVydHkgbmFtZS4gIEJ5IGRlZmF1bHQgc29ydGluZyBvY2N1cnMgaXMgYXNjZW5kaW5nIG9yZGVyLCBidXQgc29ydGluZyBpbiBkZXNjZW5kaW5nIG9yZGVyIGlzIHN1cHBvcnRlZCBhcyB3ZWxsLlxyXG4gIE9yZGVyQnkgY2xhdXNlcyBtYXkgYmUgY2hhaW5lZC5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIkNvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBvciB0byBzb3J0IGFjcm9zcyBtdWx0aXBsZSBwcm9wZXJ0aWVzXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJSZWdpb24sIENvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBOZXN0ZWQgcHJvcGVydHkgcGF0aHMgYXJlIGFsc28gc3VwcG9ydGVkXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiUHJvZHVjdHNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIkNhdGVnb3J5LkNhdGVnb3J5TmFtZVwiKTtcclxuXHJcbiAgU29ydGluZyBpbiBkZXNjZW5kaW5nIG9yZGVyIGlzIHN1cHBvcnRlZCB2aWEgdGhlIGFkZGl0aW9uIG9mICcgZGVzYycgdG8gdGhlIGVuZCBvZiBhbnkgcHJvcGVydHkgcGF0aC5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIkNvbXBhbnlOYW1lIGRlc2NcIik7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJSZWdpb24gZGVzYywgQ29tcGFueU5hbWUgZGVzY1wiKTtcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkICgnLCcpIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBvciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBwYXRocy5cclxuICBFYWNoIHByb3BlcnR5IHBhdGggY2FuIG9wdGlvbmFsbHkgZW5kIHdpdGggXCIgZGVzY1wiIHRvIGZvcmNlIGEgZGVzY2VuZGluZyBzb3J0IG9yZGVyLiBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFsbCBvcmRlcmluZyBpcyByZW1vdmVkLlxyXG4gIEBwYXJhbSBpc0Rlc2NlbmRpbmcgLSBJZiBzcGVjaWZpZWQsIG92ZXJyaWRlcyBhbGwgb2YgdGhlIGVtYmVkZGVkICdkZXNjJyB0YWdzIGluIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBwcm9wZXJ0eSBwYXRocy5cclxuICAqKi9cclxuICBvcmRlckJ5KHByb3BlcnR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdLCBpc0Rlc2NlbmRpbmc/OiBib29sZWFuKSB7XHJcbiAgICAvLyBwcm9wZXJ0eVBhdGhzOiBjYW4gcGFzcyBpbiBjcmVhdGUoXCJBLlgsQlwiKSBvciBjcmVhdGUoXCJBLlggZGVzYywgQlwiKSBvciBjcmVhdGUoXCJBLlggZGVzYyxCXCIsIHRydWVdKVxyXG4gICAgLy8gaXNEZXNjIHBhcmFtZXRlciB0cnVtcHMgaXNEZXNjIGluIHByb3BlcnR5TmFtZS5cclxuICAgIGxldCBvcmRlckJ5Q2xhdXNlID0gcHJvcGVydHlQYXRocyA9PSBudWxsID8gbnVsbCA6IG5ldyBPcmRlckJ5Q2xhdXNlKG5vcm1hbGl6ZVByb3BlcnR5UGF0aHMocHJvcGVydHlQYXRocyksIGlzRGVzY2VuZGluZyk7XHJcbiAgICBpZiAodGhpcy5vcmRlckJ5Q2xhdXNlICYmIG9yZGVyQnlDbGF1c2UpIHtcclxuICAgICAgb3JkZXJCeUNsYXVzZSA9IG5ldyBPcmRlckJ5Q2xhdXNlKFt0aGlzLm9yZGVyQnlDbGF1c2UsIG9yZGVyQnlDbGF1c2VdKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcIm9yZGVyQnlDbGF1c2VcIiwgb3JkZXJCeUNsYXVzZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb3JkZXJCeURlc2MocHJvcGVydHlQYXRoczogc3RyaW5nKTogRW50aXR5UXVlcnk7XHJcbiAgb3JkZXJCeURlc2MocHJvcGVydHlQYXRoczogc3RyaW5nW10pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgb3JkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBieSBwcm9wZXJ0eSBuYW1lIGluIGRlc2NlbmRpbmcgb3JkZXIuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnlEZXNjKFwiQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIG9yIHRvIHNvcnQgYWNyb3NzIG11bHRpcGxlIHByb3BlcnRpZXNcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeURlc2MoXCJSZWdpb24sIENvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBOZXN0ZWQgcHJvcGVydHkgcGF0aHMgYXJlIGFsc28gc3VwcG9ydGVkXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiUHJvZHVjdHNcIilcclxuICA+ICAgICAgICAub3JkZXJCeURlc2MoXCJDYXRlZ29yeS5DYXRlZ29yeU5hbWVcIik7XHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCAoJywnKSBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgcGF0aHMuXHJcbiAgSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbGwgb3JkZXJpbmcgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBvcmRlckJ5RGVzYyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMub3JkZXJCeShwcm9wZXJ0eVBhdGhzIGFzIGFueSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgc2VsZWN0cyBhIGxpc3Qgb2YgcHJvcGVydGllcyBmcm9tIHRoZSByZXN1bHRzIG9mIHRoZSBvcmlnaW5hbCBxdWVyeSBhbmQgcmV0dXJucyB0aGUgdmFsdWVzIG9mIGp1c3QgdGhlc2UgcHJvcGVydGllcy4gVGhpc1xyXG4gIHdpbGwgYmUgcmVmZXJyZWQgdG8gYXMgYSBwcm9qZWN0aW9uLlxyXG4gIElmIHRoZSByZXN1bHQgb2YgdGhpcyBzZWxlY3Rpb24gXCJwcm9qZWN0aW9uXCIgY29udGFpbnMgZW50aXRpZXMsIHRoZXNlIGVudGl0aWVzIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBFbnRpdHlNYW5hZ2VyJ3MgY2FjaGUgYW5kIHdpbGxcclxuICBiZSBtYWRlICdvYnNlcnZhYmxlJy5cclxuICBBbnkgc2ltcGxlIHByb3BlcnRpZXMsIGkuZS4gc3RyaW5ncywgbnVtYmVycyBvciBkYXRlcyB3aXRoaW4gYSBwcm9qZWN0aW9uIHdpbGwgbm90IGJlIGNhY2hlZCBhcmUgd2lsbCBOT1QgYmUgbWFkZSAnb2JzZXJ2YWJsZScuXHJcbiAgXHJcbiAgU2ltcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gYmUgcHJvamVjdGVkXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAgLnNlbGVjdChcIkNvbXBhbnlOYW1lXCIpO1xyXG5cclxuICBUaGlzIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgZWFjaCB3aXRoIGEgc2luZ2xlIFwiQ29tcGFueU5hbWVcIiBwcm9wZXJ0eSBvZiB0eXBlIHN0cmluZy5cclxuICBBIHNpbWlsYXIgcXVlcnkgY291bGQgcmV0dXJuIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBpbnN0ZWFkXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5zZWxlY3QoXCJPcmRlcnNcIik7XHJcblxyXG4gIHdoZXJlIHRoZSByZXN1bHQgd291bGQgYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBlYWNoIHdpdGggYSBzaW5nbGUgXCJPcmRlcnNcIiBwcm9wZXJ0eSB0aGF0IHdvdWxkIGl0c2VsZiBiZSBhbiBhcnJheSBvZiBcIk9yZGVyXCIgZW50aXRpZXMuXHJcbiAgQ29tcG9zaXRlIHByb2plY3Rpb25zIGFyZSBhbHNvIHBvc3NpYmxlOlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuc2VsZWN0KFwiQ29tcGFueU5hbWUsIE9yZGVyc1wiKTtcclxuXHJcbiAgQXMgd2VsbCBhcyBwcm9qZWN0aW9ucyBpbnZvbHZpbmcgbmVzdGVkIHByb3BlcnR5IHBhdGhzXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDdXN0b21lci5Db21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLnNlbGVjdChcIkN1c3RvbWVyLkNvbXBhbnlOYW1lLCBDdXN0b21lciwgT3JkZXJEYXRlXCIpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgKCcsJykgc3RyaW5nIG9mIHByb3BlcnR5IHBhdGhzIG9yIGFuIGFycmF5IG9mIHByb3BlcnR5IHBhdGhzLlxyXG4gIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nIHByb2plY3Rpb24gb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgc2VsZWN0KHByb3BlcnR5UGF0aHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgbGV0IHNlbGVjdENsYXVzZSA9IHByb3BlcnR5UGF0aHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgU2VsZWN0Q2xhdXNlKG5vcm1hbGl6ZVByb3BlcnR5UGF0aHMocHJvcGVydHlQYXRocykpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwic2VsZWN0Q2xhdXNlXCIsIHNlbGVjdENsYXVzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgc2tpcHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50aXRpZXMgd2hlbiByZXR1cm5pbmcgcmVzdWx0cy5cclxuICBBbnkgZXhpc3RpbmcgJ3NraXAnIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgJ3NraXAnIHdpdGggbm8gYXJndW1lbnRzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgLnNraXAoNSk7XHJcbiAgQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byBza2lwIG92ZXIuIElmIG9taXR0ZWQgb3IgbnVsbCBhbnkgZXhpc3Rpbmcgc2tpcCBjb3VudCBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBza2lwKGNvdW50PzogbnVtYmVyKSB7XHJcbiAgICBhc3NlcnRQYXJhbShjb3VudCwgXCJjb3VudFwiKS5pc09wdGlvbmFsKCkuaXNOdW1iZXIoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwic2tpcENvdW50XCIsIChjb3VudCA9PSBudWxsKSA/IG51bGwgOiBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudGl0aWVzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMuIC0gU2FtZSBhcyAndGFrZScuXHJcbiAgQW55IGV4aXN0aW5nICd0b3AnIGNhbiBiZSBjbGVhcmVkIGJ5IGNhbGxpbmcgJ3RvcCcgd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLnRvcCg1KTtcclxuICBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHJldHVybi5cclxuICBJZiAnY291bnQnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgJ3RvcCcgY291bnQgb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgdG9wKGNvdW50PzogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy50YWtlKGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50aXRpZXMgd2hlbiByZXR1cm5pbmcgcmVzdWx0cyAtIFNhbWUgYXMgJ3RvcCcuXHJcbiAgQW55IGV4aXN0aW5nIHRha2UgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyB0YWtlIHdpdGggbm8gYXJndW1lbnRzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC50YWtlKDUpO1xyXG4gIEBwYXJhbSBjb3VudCAtIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gcmV0dXJuLlxyXG4gIElmICdjb3VudCcgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyAndGFrZScgY291bnQgb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgdGFrZShjb3VudD86IG51bWJlcikge1xyXG4gICAgYXNzZXJ0UGFyYW0oY291bnQsIFwiY291bnRcIikuaXNPcHRpb25hbCgpLmlzTnVtYmVyKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInRha2VDb3VudFwiLCAoY291bnQgPT0gbnVsbCkgPyBudWxsIDogY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIHJlbGF0ZWQgZW50aXRpZXMgbmVzdGVkIHdpdGhpbiBpdHMgcmVzdWx0cy4gVGhlIGV4cGFuZCBtZXRob2QgYWxsb3dzIHlvdSB0byBpZGVudGlmeSByZWxhdGVkIGVudGl0aWVzLCB2aWEgbmF2aWdhdGlvbiBwcm9wZXJ0eVxyXG4gIG5hbWVzIHN1Y2ggdGhhdCBhIGdyYXBoIG9mIGVudGl0aWVzIG1heSBiZSByZXRyaWV2ZWQgd2l0aCBhIHNpbmdsZSByZXF1ZXN0LiBBbnkgZmlsdGVyaW5nIG9jY3VycyBiZWZvcmUgdGhlIHJlc3VsdHMgYXJlICdleHBhbmRlZCcuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5leHBhbmQoXCJPcmRlcnNcIik7XHJcblxyXG4gIHdpbGwgcmV0dXJuIHRoZSBmaWx0ZXJlZCBjdXN0b21lcnMgZWFjaCB3aXRoIGl0cyBcIk9yZGVyc1wiIHByb3BlcnRpZXMgZnVsbHkgcmVzb2x2ZWQuXHJcbiAgTXVsdGlwbGUgcGF0aHMgbWF5IGJlIHNwZWNpZmllZCBieSBzZXBhcmF0aW5nIHRoZSBwYXRocyBieSBhICcsJ1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC5leHBhbmQoXCJDdXN0b21lciwgRW1wbG95ZWVcIilcclxuXHJcbiAgYW5kIG5lc3RlZCBwcm9wZXJ0eSBwYXRocyBteSBiZSBzcGVjaWZpZWQgYXMgd2VsbFxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC5leHBhbmQoXCJDdXN0b21lciwgT3JkZXJEZXRhaWxzLCBPcmRlckRldGFpbHMuUHJvZHVjdFwiKVxyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYXZpZ2F0aW9uIHByb3BlcnR5IG5hbWVzIG9yIGFuIGFycmF5IG9mIG5hdmlnYXRpb24gcHJvcGVydHkgbmFtZXMuIEVhY2ggTmF2aWdhdGlvbiBQcm9wZXJ0eSBuYW1lIGNhbiBiZSBmb2xsb3dlZFxyXG4gIGJ5IGEgJy4nIGFuZCBhbm90aGVyIG5hdmlnYXRpb24gcHJvcGVydHkgbmFtZSB0byBlbmFibGUgaWRlbnRpZnlpbmcgYSBtdWx0aS1sZXZlbCByZWxhdGlvbnNoaXAuXHJcbiAgSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgJ2V4cGFuZCcgY2xhdXNlIG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIGV4cGFuZChwcm9wZXJ0eVBhdGhzPzogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGxldCBleHBhbmRDbGF1c2UgPSBwcm9wZXJ0eVBhdGhzID09IG51bGwgPyBudWxsIDogbmV3IEV4cGFuZENsYXVzZShub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHMpKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcImV4cGFuZENsYXVzZVwiLCBleHBhbmRDbGF1c2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IGluY2x1ZGVzIGEgY29sbGVjdGlvbiBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIHNlcnZlci5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tKFwiRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGVcIilcclxuICA+ICAgICAgICAud2l0aFBhcmFtZXRlcnMoeyBCaXJ0aERhdGU6IFwiMS8xLzE5NjBcIiwgQ291bnRyeTogXCJVU0FcIiB9KTtcclxuICAgXHJcbiAgd2lsbCBjYWxsIHRoZSAnRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGUnIG1ldGhvZCBvbiB0aGUgc2VydmVyIGFuZCBwYXNzIGluIDIgcGFyYW1ldGVycy4gVGhpc1xyXG4gIHF1ZXJ5IHdpbGwgYmUgdXJpIGVuY29kZWQgYXNcclxuICA+ICAgICAge3NlcnZpY2VBcGl9L0VtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlP2JpcnRoRGF0ZT0xJTJGMSUyRjE5NjAmY291bnRyeT1VU0FcclxuXHJcbiAgUGFyYW1ldGVycyBtYXkgYWxzbyBiZSBtaXhlZCBpbiB3aXRoIG90aGVyIHF1ZXJ5IGNyaXRlcmlhLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb20oXCJFbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZVwiKVxyXG4gID4gICAgICAgIC53aXRoUGFyYW1ldGVycyh7IEJpcnRoRGF0ZTogXCIxLzEvMTk2MFwiLCBDb3VudHJ5OiBcIlVTQVwiIH0pXHJcbiAgPiAgICAgICAgLndoZXJlKFwiTGFzdE5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiU1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQmlydGhEYXRlXCIpO1xyXG4gIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQSBwYXJhbWV0ZXJzIG9iamVjdCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIHBhcmFtZXRlciBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIHBhcmFtZXRlciB2YWx1ZXMuXHJcbiAgKiovXHJcbiAgd2l0aFBhcmFtZXRlcnMocGFyYW1ldGVyczogT2JqZWN0KSB7XHJcbiAgICBhc3NlcnRQYXJhbShwYXJhbWV0ZXJzLCBcInBhcmFtZXRlcnNcIikuaXNPYmplY3QoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwicGFyYW1ldGVyc1wiLCBwYXJhbWV0ZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBxdWVyeSB3aXRoIHRoZSAnaW5saW5lQ291bnQnIGNhcGFiaWxpdHkgZWl0aGVyIGVuYWJsZWQgb3IgZGlzYWJsZWQuICBXaXRoICdpbmxpbmVDb3VudCcgZW5hYmxlZCwgYW4gYWRkaXRpb25hbCAnaW5saW5lQ291bnQnIHByb3BlcnR5XHJcbiAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBxdWVyeSByZXN1bHRzIHRoYXQgd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgZW50aXRpZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhpc1xyXG4gIHF1ZXJ5IHdpdGggb25seSB0aGUgJ3doZXJlJy8nZmlsdGVyJyBjbGF1c2VzIGFwcGxpZWQsIGkuZS4gd2l0aG91dCBhbnkgJ3NraXAnLyd0YWtlJyBvcGVyYXRvcnMgYXBwbGllZC4gRm9yIGxvY2FsIHF1ZXJpZXMgdGhpcyBjbGF1c2UgaXMgaWdub3JlZC5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAudGFrZSgyMClcclxuICA+ICAgICAgICAub3JkZXJCeShcIkNvbXBhbnlOYW1lXCIpXHJcbiAgPiAgICAgICAgLmlubGluZUNvdW50KHRydWUpO1xyXG5cclxuICB3aWxsIHJldHVybiB0aGUgZmlyc3QgMjAgY3VzdG9tZXJzIGFzIHdlbGwgYXMgYSBjb3VudCBvZiBhbGwgb2YgdGhlIGN1c3RvbWVycyBpbiB0aGUgcmVtb3RlIHN0b3JlLlxyXG4gIEBwYXJhbSBlbmFibGVkIC0gKGRlZmF1bHQgPSB0cnVlKSBXaGV0aGVyIG9yIG5vdCBpbmxpbmVDb3VudCBjYXBhYmlsaXR5IHNob3VsZCBiZSBlbmFibGVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0cnVlIGlzIGFzc3VtZWQuXHJcbiAgKiovXHJcbiAgaW5saW5lQ291bnQoZW5hYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKGVuYWJsZWQsIFwiZW5hYmxlZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGVuYWJsZWQgPSAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIWVuYWJsZWQ7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJpbmxpbmVDb3VudEVuYWJsZWRcIiwgZW5hYmxlZCk7XHJcbiAgfVxyXG5cclxuICB1c2VOYW1lT25TZXJ2ZXIodXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKHVzZXNOYW1lT25TZXJ2ZXIsIFwidXNlc05hbWVPblNlcnZlclwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIHVzZXNOYW1lT25TZXJ2ZXIgPSAodXNlc05hbWVPblNlcnZlciA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIXVzZXNOYW1lT25TZXJ2ZXI7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJ1c2VzTmFtZU9uU2VydmVyXCIsIHVzZXNOYW1lT25TZXJ2ZXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHF1ZXJ5IHdpdGggdGhlICdub1RyYWNraW5nJyBjYXBhYmlsaXR5IGVpdGhlciBlbmFibGVkIG9yIGRpc2FibGVkLiAgV2l0aCAnbm9UcmFja2luZycgZW5hYmxlZCwgdGhlIHJlc3VsdHMgb2YgdGhpcyBxdWVyeVxyXG4gIHdpbGwgbm90IGJlIGNvZXJjZWQgaW50byBlbnRpdGllcyBidXQgd2lsbCBpbnN0ZWFkIGxvb2sgbGlrZSByYXcgamF2YXNjcmlwdCBwcm9qZWN0aW9ucy4gaS5lLiBzaW1wbGUgamF2YXNjcmlwdCBvYmplY3RzLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAudGFrZSgyMClcclxuICA+ICAgICAgICAgLm9yZGVyQnkoXCJDb21wYW55TmFtZVwiKVxyXG4gID4gICAgICAgICAubm9UcmFja2luZyh0cnVlKTtcclxuICBAcGFyYW0gZW5hYmxlZCAtIChkZWZhdWx0ID0gdHJ1ZSkgV2hldGhlciBvciBub3QgdGhlIG5vVHJhY2tpbmcgY2FwYWJpbGl0eSBzaG91bGQgYmUgZW5hYmxlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdHJ1ZSBpcyBhc3N1bWVkLlxyXG4gICoqL1xyXG4gIG5vVHJhY2tpbmcoZW5hYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGFzc2VydFBhcmFtKGVuYWJsZWQsIFwiZW5hYmxlZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGVuYWJsZWQgPSAoZW5hYmxlZCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiAhIWVuYWJsZWQ7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJub1RyYWNraW5nRW5hYmxlZFwiLCBlbmFibGVkKTtcclxuICB9XHJcblxyXG4gIHVzaW5nKG9iajogRW50aXR5TWFuYWdlcik6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogRGF0YVNlcnZpY2UpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IEpzb25SZXN1bHRzQWRhcHRlcik6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogUXVlcnlPcHRpb25zKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBNZXJnZVN0cmF0ZWd5KTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBGZXRjaFN0cmF0ZWd5KTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBFbnRpdHlRdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgW1tFbnRpdHlNYW5hZ2VyXV0sIFtbRGF0YVNlcnZpY2VdXSxcclxuICBbW0pzb25SZXN1bHRzQWRhcHRlcl1dLCBbW01lcmdlU3RyYXRlZ3ldXSBvciBbW0ZldGNoU3RyYXRlZ3ldXSBhcHBsaWVkLlxyXG4gID4gICAgICAvLyAndXNpbmcnIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIG5ldyBxdWVyeSB3aXRoIGEgc3BlY2lmaWVkIEVudGl0eU1hbmFnZXIuXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+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/IG5ldyBFeHBhbmRDbGF1c2UodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJza2lwQ291bnQsc2tpcFwiOiBudWxsLFxyXG4gICAgXCJ0YWtlQ291bnQsdGFrZVwiOiBudWxsLFxyXG4gICAgcGFyYW1ldGVyczogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gY29yZS5pc0VtcHR5KHYpID8gdW5kZWZpbmVkIDogdjtcclxuICAgIH0sXHJcbiAgICBcImlubGluZUNvdW50RW5hYmxlZCxpbmxpbmVDb3VudFwiOiBmYWxzZSxcclxuICAgIFwibm9UcmFja2luZ0VuYWJsZWQsbm9UcmFja2luZ1wiOiBmYWxzZSxcclxuICAgIHF1ZXJ5T3B0aW9uczogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IFF1ZXJ5T3B0aW9ucy5mcm9tSlNPTih2KSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9LCBlcSk7XHJcbiAgcmV0dXJuIGVxO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZShlcTogRW50aXR5UXVlcnksIHByb3BOYW1lPzogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xyXG4gIC8vIGltbXV0YWJsZSBxdWVyaWVzIG1lYW4gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNsb25lIGlmIG5vIGNoYW5nZSBpbiB2YWx1ZS5cclxuICBpZiAocHJvcE5hbWUpIHtcclxuICAgIGlmIChlcVtwcm9wTmFtZV0gPT09IHZhbHVlKSByZXR1cm4gZXE7XHJcbiAgfVxyXG4gIC8vIGNvcHlpbmcgUXVlcnlPcHRpb25zIGlzIHNhZmUgYmVjYXVzZSB0aGV5IGFyZSBhcmUgaW1tdXRhYmxlO1xyXG4gIGxldCBjb3B5ID0gY29yZS5leHRlbmQobmV3IEVudGl0eVF1ZXJ5KCksIGVxLCBbXHJcbiAgICBcInJlc291cmNlTmFtZVwiLFxyXG4gICAgXCJmcm9tRW50aXR5VHlwZVwiLFxyXG4gICAgXCJ3aGVyZVByZWRpY2F0ZVwiLFxyXG4gICAgXCJvcmRlckJ5Q2xhdXNlXCIsXHJcbiAgICBcInNlbGVjdENsYXVzZVwiLFxyXG4gICAgXCJza2lwQ291bnRcIixcclxuICAgIFwidGFrZUNvdW50XCIsXHJcbiAgICBcImV4cGFuZENsYXVzZVwiLFxyXG4gICAgXCJpbmxpbmVDb3VudEVuYWJsZWRcIixcclxuICAgIFwibm9UcmFja2luZ0VuYWJsZWRcIixcclxuICAgIFwidXNlc05hbWVPblNlcnZlclwiLFxyXG4gICAgXCJxdWVyeU9wdGlvbnNcIixcclxuICAgIFwiZW50aXR5TWFuYWdlclwiLFxyXG4gICAgXCJkYXRhU2VydmljZVwiLFxyXG4gICAgXCJyZXN1bHRFbnRpdHlUeXBlXCJcclxuICBdKSBhcyBFbnRpdHlRdWVyeTtcclxuICBjb3B5LnBhcmFtZXRlcnMgPSBjb3JlLmV4dGVuZCh7fSwgZXEucGFyYW1ldGVycyk7XHJcbiAgaWYgKHByb3BOYW1lKSB7XHJcbiAgICBjb3B5W3Byb3BOYW1lXSA9IHZhbHVlO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1VzaW5nKGVxOiBFbnRpdHlRdWVyeSwgbWFwOiBPYmplY3QsIHZhbHVlOiBhbnksIHByb3BlcnR5TmFtZT86IHN0cmluZykge1xyXG4gIGxldCB0eXBlTmFtZSA9IHZhbHVlLl8kdHlwZU5hbWUgfHwgKCh2YWx1ZSBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pICYmICh2YWx1ZS5jb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWUpO1xyXG4gIGxldCBrZXkgPSB0eXBlTmFtZSAmJiB0eXBlTmFtZS5zdWJzdHIoMCwgMSkudG9Mb3dlckNhc2UoKSArIHR5cGVOYW1lLnN1YnN0cigxKTtcclxuICBpZiAocHJvcGVydHlOYW1lICYmIGtleSAhPT0gcHJvcGVydHlOYW1lKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eTogXCIgKyBwcm9wZXJ0eU5hbWUpO1xyXG4gIH1cclxuICBpZiAoa2V5KSB7XHJcbiAgICBsZXQgZm4gPSBtYXBba2V5XTtcclxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZmlnIHByb3BlcnR5OiBcIiArIGtleSk7XHJcbiAgICB9IGVsc2UgaWYgKGZuID09PSBudWxsKSB7XHJcbiAgICAgIGVxW2tleV0gPSB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZuKGVxLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvcmUub2JqZWN0Rm9yRWFjaCh2YWx1ZSwgKHByb3BOYW1lLCB2YWwpID0+IHtcclxuICAgICAgcHJvY2Vzc1VzaW5nKGVxLCBtYXAsIHZhbCwgcHJvcE5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eVBhdGhzKHByb3BlcnR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgYXNzZXJ0UGFyYW0ocHJvcGVydHlQYXRocywgXCJwcm9wZXJ0eVBhdGhzXCIpLmlzT3B0aW9uYWwoKS5pc1N0cmluZygpLm9yKCkuaXNBcnJheSgpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICBpZiAodHlwZW9mIHByb3BlcnR5UGF0aHMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocy5zcGxpdChcIixcIik7XHJcbiAgfVxyXG5cclxuICBwcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICByZXR1cm4gcHAudHJpbSgpO1xyXG4gIH0pO1xyXG4gIHJldHVybiBwcm9wZXJ0eVBhdGhzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZFByZWRpY2F0ZShlbnRpdHk6IEVudGl0eSkge1xyXG4gIGxldCBlbnRpdHlUeXBlID0gZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgbGV0IHByZWRQYXJ0cyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKGtwKSB7XHJcbiAgICByZXR1cm4gUHJlZGljYXRlLmNyZWF0ZShrcC5uYW1lLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywgZW50aXR5LmdldFByb3BlcnR5KGtwLm5hbWUpKTtcclxuICB9KTtcclxuICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5hbmQocHJlZFBhcnRzKTtcclxuICByZXR1cm4gcHJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gYnVpbGRLZXlQcmVkaWNhdGUoZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICBsZXQga2V5UHJvcHMgPSBlbnRpdHlLZXkuZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzO1xyXG4gIGxldCBwcmVkcyA9IGNvcmUuYXJyYXlaaXAoa2V5UHJvcHMsIGVudGl0eUtleS52YWx1ZXMsIGZ1bmN0aW9uIChrcCwgdikge1xyXG4gICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoa3AubmFtZSwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIHYpO1xyXG4gIH0pO1xyXG4gIGxldCBwcmVkID0gUHJlZGljYXRlLmFuZChwcmVkcyk7XHJcbiAgcmV0dXJuIHByZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblByZWRpY2F0ZShlbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICBpZiAobmF2aWdhdGlvblByb3BlcnR5LmlzU2NhbGFyKSB7XHJcbiAgICBpZiAobmF2aWdhdGlvblByb3BlcnR5LmZvcmVpZ25LZXlOYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgbGV0IHJlbGF0ZWRLZXlWYWx1ZXMgPSBuYXZpZ2F0aW9uUHJvcGVydHkuZm9yZWlnbktleU5hbWVzLm1hcCgoZmtOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBlbnRpdHkuZ2V0UHJvcGVydHkoZmtOYW1lKTtcclxuICAgIH0pO1xyXG4gICAgbGV0IGVudGl0eUtleSA9IG5ldyBFbnRpdHlLZXkobmF2aWdhdGlvblByb3BlcnR5LmVudGl0eVR5cGUsIHJlbGF0ZWRLZXlWYWx1ZXMpO1xyXG4gICAgcmV0dXJuIGJ1aWxkS2V5UHJlZGljYXRlKGVudGl0eUtleSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBpbnZlcnNlTnAgPSBuYXZpZ2F0aW9uUHJvcGVydHkuaW52ZXJzZTtcclxuICAgIGxldCBmb3JlaWduS2V5TmFtZXMgPSBpbnZlcnNlTnAgPyBpbnZlcnNlTnAuZm9yZWlnbktleU5hbWVzIDogbmF2aWdhdGlvblByb3BlcnR5LmludkZvcmVpZ25LZXlOYW1lcztcclxuICAgIGlmIChmb3JlaWduS2V5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBrZXlWYWx1ZXMgPSBlbnRpdHkuZW50aXR5QXNwZWN0LmdldEtleSgpLnZhbHVlcztcclxuICAgIGxldCBwcmVkUGFydHMgPSBjb3JlLmFycmF5WmlwKGZvcmVpZ25LZXlOYW1lcywga2V5VmFsdWVzLCAoZmtOYW1lLCBrdikgPT4ge1xyXG4gICAgICByZXR1cm4gUHJlZGljYXRlLmNyZWF0ZShma05hbWUsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBrdik7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBQcmVkaWNhdGUuYW5kKHByZWRQYXJ0cyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogQmFzZSBjbGFzcyBmb3IgQm9vbGVhblF1ZXJ5T3AgYW5kIEZpbHRlclF1ZXJ5T3AgKi9cclxuZXhwb3J0IGludGVyZmFjZSBRdWVyeU9wIHtcclxuICAvKiogVGhlIG9wZXJhdG9yIGZvciB0aGlzIGVudW0uICovXHJcbiAgb3BlcmF0b3I6IHN0cmluZztcclxufVxyXG5cclxuXHJcblxyXG4vKipcclxuRmlsdGVyUXVlcnlPcCBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbGlkICBbW1ByZWRpY2F0ZV1dXHJcbmZpbHRlciBvcGVyYXRvcnMgZm9yIGFuIFtbRW50aXR5UXVlcnldXS5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJRdWVyeU9wIGV4dGVuZHMgQnJlZXplRW51bSBpbXBsZW1lbnRzIFF1ZXJ5T3Age1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IgZm9yIHRoaXMgZW51bS4gKi9cclxuICBvcGVyYXRvcjogc3RyaW5nO1xyXG5cclxuICAvKiogQWxpYXNlczogXCJlcVwiLCBcIj09XCIgKiovXHJcbiAgc3RhdGljIEVxdWFscyA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZXFcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibmVcIiwgXCIhPVwiICAqKi9cclxuICBzdGF0aWMgTm90RXF1YWxzID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJuZVwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImd0XCIsIFwiPlwiICAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJndFwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImx0XCIsIFwiPFwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW4gPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImx0XCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcImdlXCIsIFwiPj1cIiAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuT3JFcXVhbCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZ2VcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibGVcIiwgXCI8PVwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW5PckVxdWFsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJsZVwiIH0pO1xyXG4gIC8qKiAgU3RyaW5nIG9wZXJhdGlvbjogSXMgYSBzdHJpbmcgYSBzdWJzdHJpbmcgb2YgYW5vdGhlciBzdHJpbmcuICBBbGlhc2VzOiBcInN1YnN0cmluZ29mXCIgICAqKi9cclxuICBzdGF0aWMgQ29udGFpbnMgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImNvbnRhaW5zXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgU3RhcnRzV2l0aCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwic3RhcnRzd2l0aFwiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIEVuZHNXaXRoID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJlbmRzd2l0aFwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJzb21lXCIgICoqL1xyXG4gIHN0YXRpYyBBbnkgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFueVwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJldmVyeVwiICAqKi9cclxuICBzdGF0aWMgQWxsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbGxcIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJbiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaW5cIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJc1R5cGVPZiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaXNvZlwiIH0pO1xyXG59XHJcbkZpbHRlclF1ZXJ5T3AucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkZpbHRlclF1ZXJ5T3BcIjtcclxuRXJyb3JbJ3gnXSA9IEZpbHRlclF1ZXJ5T3AucmVzb2x2ZVN5bWJvbHMoKTtcclxuXHJcblxyXG4vKipcclxuIEJvb2xlYW5RdWVyeU9wIGlzIGFuICdFbnVtJyBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsaWQgIGJvb2xlYW5cclxub3BlcmF0b3JzIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgQm9vbGVhblF1ZXJ5T3AgZXh0ZW5kcyBCcmVlemVFbnVtIGltcGxlbWVudHMgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIG9wZXJhdG9yOiBzdHJpbmc7XHJcblxyXG4gIHN0YXRpYyBBbmQgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbmRcIiB9KTtcclxuICBzdGF0aWMgT3IgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJvclwiIH0pO1xyXG4gIHN0YXRpYyBOb3QgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJub3RcIiB9KTtcclxuXHJcbn1cclxuQm9vbGVhblF1ZXJ5T3AucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkJvb2xlYW5RdWVyeU9wXCI7XHJcbkVycm9yWyd4J10gPSBCb29sZWFuUXVlcnlPcC5yZXNvbHZlU3ltYm9scygpO1xyXG5cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuXHJcblxyXG5BbiBPcmRlckJ5Q2xhdXNlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnRpZXMgYW5kIGRpcmVjdGlvbiB0aGF0IHRoZSByZXN1bHRcclxub2YgYSBxdWVyeSBzaG91bGQgYmUgc29ydGVkIGluLiAgT3JkZXJCeUNsYXVzZXMgYXJlIGltbXV0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBhbnlcclxubWV0aG9kIHRoYXQgd291bGQgbW9kaWZ5IGFuIE9yZGVyQnlDbGF1c2UgYWN0dWFsbHkgcmV0dXJucyBhIG5ldyBPcmRlckJ5Q2xhdXNlLlxyXG5cclxuRm9yIGV4YW1wbGUgZm9yIGFuIEVtcGxveWVlIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgb2YgJ0NvbXBhbnknIGFuZCAnTGFzdE5hbWUnIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdmFsaWQgZXhwcmVzc2lvbnM6XHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUsIExhc3ROYW1lXCIpXHJcblxyXG5vclxyXG4+ICAgICBsZXQgb2JjID0gbmV3IE9yZGVyQnlDbGF1c2UoXCJDb21wYW55LkNvbXBhbnlOYW1lIGRlc2MsIExhc3ROYW1lXCIpXHJcblxyXG5vclxyXG4+ICAgICBsZXQgb2JjID0gbmV3IE9yZGVyQnlDbGF1c2UoXCJDb21wYW55LkNvbXBhbnlOYW1lLCBMYXN0TmFtZVwiLCB0cnVlKTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIE9yZGVyQnlDbGF1c2Uge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGl0ZW1zOiBPcmRlckJ5SXRlbVtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSB8IE9yZGVyQnlDbGF1c2VbXSwgaXNEZXNjPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHByb3BlcnR5UGF0aHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9yZGVyQnlDbGF1c2UgY2Fubm90IGJlIGVtcHR5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGFycmF5IG9mIG9yZGVyQnlDbGF1c2VzXHJcbiAgICBpZiAocHJvcGVydHlQYXRoc1swXSBpbnN0YW5jZW9mIE9yZGVyQnlDbGF1c2UpIHtcclxuICAgICAgbGV0IGNsYXVzZXMgPSBwcm9wZXJ0eVBhdGhzIGFzIE9yZGVyQnlDbGF1c2VbXTtcclxuICAgICAgdGhpcy5pdGVtcyA9IGNvcmUuYXJyYXlGbGF0TWFwKGNsYXVzZXMsIGMgPT4gYy5pdGVtcyk7XHJcbiAgICAgIC8vIHRoaXMuaXRlbXMgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KGNsYXVzZXNbMF0uaXRlbXMsIGNsYXVzZXMuc2xpY2UoMSkubWFwKGNvcmUucGx1Y2soXCJpdGVtc1wiKSkpO1xyXG4gICAgICAvLyB0aGlzLml0ZW1zID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgY2xhdXNlcy5tYXAoY29yZS5wbHVjayhcIml0ZW1zXCIpKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLml0ZW1zID0gKHByb3BlcnR5UGF0aHMgYXMgc3RyaW5nW10pLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtKHBwLCBpc0Rlc2MpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbGlkYXRlKGVudGl0eVR5cGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb21wYXJlcihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBsZXQgb3JkZXJCeUZ1bmNzID0gdGhpcy5pdGVtcy5tYXAoZnVuY3Rpb24gKG9iYykge1xyXG4gICAgICByZXR1cm4gb2JjLmdldENvbXBhcmVyKGVudGl0eVR5cGUpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTE6IGFueSwgZW50aXR5MjogYW55KSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJCeUZ1bmNzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG9yZGVyQnlGdW5jc1tpXShlbnRpdHkxLCBlbnRpdHkyKTtcclxuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0b0pTT05FeHQoY29udGV4dDogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5UGF0aEZuIShpdGVtLnByb3BlcnR5UGF0aCkgKyAoaXRlbS5pc0Rlc2MgPyBcIiBkZXNjXCIgOiBcIlwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgT3JkZXJCeUl0ZW0ge1xyXG4gIHByb3BlcnR5UGF0aDogc3RyaW5nO1xyXG4gIGlzRGVzYzogYm9vbGVhbjtcclxuICBsYXN0UHJvcGVydHk6IEVudGl0eVByb3BlcnR5O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGg6IHN0cmluZywgaXNEZXNjPzogYm9vbGVhbikge1xyXG4gICAgaWYgKCEodHlwZW9mIHByb3BlcnR5UGF0aCA9PT0gJ3N0cmluZycpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInByb3BlcnR5UGF0aCBpcyBub3QgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcbiAgICBwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGgudHJpbSgpO1xyXG5cclxuICAgIGxldCBwYXJ0cyA9IHByb3BlcnR5UGF0aC5zcGxpdCgnICcpO1xyXG4gICAgLy8gcGFydHNbMF0gaXMgdGhlIHByb3BlcnR5UGF0aDsgWzFdIHdvdWxkIGJlIHdoZXRoZXIgZGVzY2VuZGluZyBvciBub3QuXHJcbiAgICAvLyBpZiAocGFydHMubGVuZ3RoID4gMSAmJiBpc0Rlc2MgIT09IHRydWUgJiYgaXNEZXNjICE9PSBmYWxzZSkge1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEgJiYgaXNEZXNjID09IG51bGwpIHtcclxuICAgICAgaXNEZXNjID0gY29yZS5zdHJpbmdTdGFydHNXaXRoKHBhcnRzWzFdLnRvTG93ZXJDYXNlKCksIFwiZGVzY1wiKTtcclxuICAgICAgaWYgKCFpc0Rlc2MpIHtcclxuICAgICAgICAvLyBpc0Rlc2MgaXMgZmFsc2UgYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdHMgaW50ZW5kZWQuXHJcbiAgICAgICAgbGV0IGlzQXNjID0gY29yZS5zdHJpbmdTdGFydHNXaXRoKHBhcnRzWzFdLnRvTG93ZXJDYXNlKCksIFwiYXNjXCIpO1xyXG4gICAgICAgIGlmICghaXNBc2MpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoZSBzZWNvbmQgd29yZCBpbiB0aGUgcHJvcGVydHlQYXRoIG11c3QgYmVnaW4gd2l0aCAnZGVzYycgb3IgJ2FzYydcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGggPSBwYXJ0c1swXTtcclxuICAgIHRoaXMuaXNEZXNjID0gaXNEZXNjIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEVudGl0eVByb3BlcnR5IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuO1xyXG4gICAgLy8gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gb24gYmFkIHByb3BlcnR5UGF0aFxyXG4gICAgdGhpcy5sYXN0UHJvcGVydHkgPSBlbnRpdHlUeXBlLmdldFByb3BlcnR5KHRoaXMucHJvcGVydHlQYXRoLCB0cnVlKSBhcyBFbnRpdHlQcm9wZXJ0eTtcclxuICAgIHJldHVybiB0aGlzLmxhc3RQcm9wZXJ0eTtcclxuICB9XHJcblxyXG4gIGdldENvbXBhcmVyKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGxldCBwcm9wRGF0YVR5cGU6IERhdGFUeXBlO1xyXG4gICAgbGV0IGlzQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcclxuICAgIGlmICghdGhpcy5sYXN0UHJvcGVydHkpIHRoaXMudmFsaWRhdGUoZW50aXR5VHlwZSk7XHJcbiAgICBpZiAodGhpcy5sYXN0UHJvcGVydHkpIHtcclxuICAgICAgcHJvcERhdGFUeXBlID0gKHRoaXMubGFzdFByb3BlcnR5IGFzIGFueSkuZGF0YVR5cGU7XHJcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFByb3BlcnR5LnBhcmVudFR5cGUubWV0YWRhdGFTdG9yZS5sb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMuaXNDYXNlU2Vuc2l0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwcm9wZXJ0eVBhdGggPSB0aGlzLnByb3BlcnR5UGF0aDtcclxuICAgIGxldCBpc0Rlc2MgPSB0aGlzLmlzRGVzYztcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTE6IGFueSwgZW50aXR5MjogYW55KSB7XHJcbiAgICAgIGxldCB2YWx1ZTEgPSBFbnRpdHlBc3BlY3QuZ2V0UHJvcGVydHlQYXRoVmFsdWUoZW50aXR5MSwgcHJvcGVydHlQYXRoKTtcclxuICAgICAgbGV0IHZhbHVlMiA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHkyLCBwcm9wZXJ0eVBhdGgpO1xyXG4gICAgICBsZXQgZGF0YVR5cGUgPSBwcm9wRGF0YVR5cGUgfHwgKHZhbHVlMSAmJiBEYXRhVHlwZS5mcm9tVmFsdWUodmFsdWUxKSkgfHwgRGF0YVR5cGUuZnJvbVZhbHVlKHZhbHVlMik7XHJcbiAgICAgIGlmIChkYXRhVHlwZSA9PT0gRGF0YVR5cGUuU3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGlzQ2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgdmFsdWUxID0gdmFsdWUxIHx8IFwiXCI7XHJcbiAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgfHwgXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUxID0gKHZhbHVlMSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgdmFsdWUyID0gKHZhbHVlMiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgbm9ybWFsaXplID0gRGF0YVR5cGUuZ2V0Q29tcGFyYWJsZUZuKGRhdGFUeXBlKTtcclxuICAgICAgICB2YWx1ZTEgPSBub3JtYWxpemUodmFsdWUxKTtcclxuICAgICAgICB2YWx1ZTIgPSBub3JtYWxpemUodmFsdWUyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSBlbHNlIGlmICh2YWx1ZTEgPiB2YWx1ZTIgfHwgdmFsdWUyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gaXNEZXNjID8gLTEgOiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBpc0Rlc2MgPyAxIDogLTE7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGluIG1vc3QgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbnNcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RDbGF1c2Uge1xyXG4gIHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9wYXRoTmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocztcclxuICAgIHRoaXMuX3BhdGhOYW1lcyA9IHByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gcHAucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjsgLy8gY2FuJ3QgdmFsaWRhdGUgeWV0XHJcbiAgICAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBiYWQgcHJvcGVydHlQYXRoXHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocGF0aCkge1xyXG4gICAgICBlbnRpdHlUeXBlLmdldFByb3BlcnR5KHBhdGgsIHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b0Z1bmN0aW9uKC8qIGNvbmZpZyAqLykge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0ge307XHJcbiAgICAgIHRoYXQucHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoLCBpKSB7XHJcbiAgICAgICAgcmVzdWx0W3RoYXQuX3BhdGhOYW1lc1tpXV0gPSBFbnRpdHlBc3BlY3QuZ2V0UHJvcGVydHlQYXRoVmFsdWUoZW50aXR5LCBwYXRoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ6IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLnByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eVBhdGhGbiEocHApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGluIG1vc3QgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbnNcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBFeHBhbmRDbGF1c2Uge1xyXG4gIHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocztcclxuICB9XHJcblxyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVBhdGhzLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHlQYXRoRm4hKHBwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
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==
|
package/esm5/src/entity-state.js
CHANGED
|
@@ -65,6 +65,10 @@ var EntityState = /** @class */ (function (_super) {
|
|
|
65
65
|
EntityState.prototype.isDetached = function () {
|
|
66
66
|
return this === EntityState.Detached;
|
|
67
67
|
};
|
|
68
|
+
/** Return true if EntityState is Deleted or Detached */
|
|
69
|
+
EntityState.prototype.isDeletedOrDetached = function () {
|
|
70
|
+
return this === EntityState.Detached || this === EntityState.Detached;
|
|
71
|
+
};
|
|
68
72
|
/**
|
|
69
73
|
Returns whether an entityState instance is EntityState.Unchanged or EntityState.Modified.
|
|
70
74
|
> var es = anEntity.entityAspect.entityState;
|
|
@@ -76,6 +80,10 @@ var EntityState = /** @class */ (function (_super) {
|
|
|
76
80
|
EntityState.prototype.isUnchangedOrModified = function () {
|
|
77
81
|
return this === EntityState.Unchanged || this === EntityState.Modified;
|
|
78
82
|
};
|
|
83
|
+
/** Return true if EntityStatis is Added or Modified */
|
|
84
|
+
EntityState.prototype.isAddedOrModified = function () {
|
|
85
|
+
return this === EntityState.Added || this === EntityState.Modified;
|
|
86
|
+
};
|
|
79
87
|
/** Returns whether an entityState instance is EntityState.Added or EntityState.Modified or EntityState.Deleted.
|
|
80
88
|
> var es = anEntity.entityAspect.entityState;
|
|
81
89
|
> return es.isAddedModifiedOrDeleted();
|
|
@@ -103,4 +111,4 @@ var EntityState = /** @class */ (function (_super) {
|
|
|
103
111
|
export { EntityState };
|
|
104
112
|
EntityState.prototype._$typeName = "EntityState";
|
|
105
113
|
Error['x'] = EntityState.resolveSymbols();
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXN0YXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9lbnRpdHktc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEM7O0dBRUc7QUFDSDtJQUFpQywrQkFBVTtJQUEzQzs7SUE4R0EsQ0FBQztJQWpHQzs7Ozs7OztPQU9HO0lBQ0gsaUNBQVcsR0FBWDtRQUNFLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsNkJBQU8sR0FBUDtRQUNFLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQ0FBVSxHQUFWO1FBQ0UsT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCwrQkFBUyxHQUFUO1FBQ0UsT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGdDQUFVLEdBQVY7UUFDRSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQseUNBQW1CLEdBQW5CO1FBQ0UsT0FBTyxJQUFJLEtBQUssV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLEtBQUssV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILDJDQUFxQixHQUFyQjtRQUNFLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxLQUFLLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDekUsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCx1Q0FBaUIsR0FBakI7UUFDRSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUMsS0FBSyxJQUFJLElBQUksS0FBSyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw4Q0FBd0IsR0FBeEI7UUFDRSxPQUFPLElBQUksS0FBSyxXQUFXLENBQUMsS0FBSztZQUMvQixJQUFJLEtBQUssV0FBVyxDQUFDLFFBQVE7WUFDN0IsSUFBSSxLQUFLLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQTFHRCw4QkFBOEI7SUFDdkIscUJBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3JDLDRCQUE0QjtJQUNyQixpQkFBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDakMsZ0NBQWdDO0lBQ3pCLG9CQUFRLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNwQyw4QkFBOEI7SUFDdkIsbUJBQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ25DLCtCQUErQjtJQUN4QixvQkFBUSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFtR3RDLGtCQUFDO0NBQUEsQUE5R0QsQ0FBaUMsVUFBVSxHQThHMUM7U0E5R1ksV0FBVztBQStHeEIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ2pELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVlemVFbnVtIH0gZnJvbSAnLi9lbnVtJztcclxuXHJcbi8qKlxyXG5FbnRpdHlTdGF0ZSBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbGlkIHN0YXRlcyBmb3IgYW4gJ0VudGl0eScuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRW50aXR5U3RhdGUgZXh0ZW5kcyBCcmVlemVFbnVtIHtcclxuXHJcbiAgLyoqIFRoZSAnVW5jaGFuZ2VkJyBzdGF0ZS4gKiovXHJcbiAgc3RhdGljIFVuY2hhbmdlZCA9IG5ldyBFbnRpdHlTdGF0ZSgpO1xyXG4gIC8qKiAgVGhlICdBZGRlZCcgc3RhdGUuICAqKi9cclxuICBzdGF0aWMgQWRkZWQgPSBuZXcgRW50aXR5U3RhdGUoKTtcclxuICAvKiogIFRoZSAnTW9kaWZpZWQnIHN0YXRlLiAgICoqL1xyXG4gIHN0YXRpYyBNb2RpZmllZCA9IG5ldyBFbnRpdHlTdGF0ZSgpO1xyXG4gIC8qKiAgVGhlICdEZWxldGVkJyBzdGF0ZS4gICoqL1xyXG4gIHN0YXRpYyBEZWxldGVkID0gbmV3IEVudGl0eVN0YXRlKCk7XHJcbiAgLyoqICBUaGUgJ0RldGFjaGVkJyBzdGF0ZS4gICoqL1xyXG4gIHN0YXRpYyBEZXRhY2hlZCA9IG5ldyBFbnRpdHlTdGF0ZSgpO1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHdoZXRoZXIgYW4gZW50aXR5U3RhdGUgaW5zdGFuY2UgaXMgRW50aXR5U3RhdGUuVW5jaGFuZ2VkLlxyXG4gID4gICAgIHZhciBlcyA9IGFuRW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZTtcclxuICA+ICAgICByZXR1cm4gZXMuaXNVbmNoYW5nZWQoKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICByZXR1cm4gZXMgPT09IEVudGl0eVN0YXRlLlVuY2hhbmdlZDtcclxuICAqKi9cclxuICBpc1VuY2hhbmdlZCgpIHtcclxuICAgIHJldHVybiB0aGlzID09PSBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm4gd2hldGhlciBhbiBlbnRpdHlTdGF0ZSBpbnN0YW5jZSBpcyBFbnRpdHlTdGF0ZS5BZGRlZC5cclxuICBcclxuICA+ICAgICB2YXIgZXMgPSBhbkVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGU7XHJcbiAgPiAgICAgcmV0dXJuIGVzLmlzQWRkZWQoKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICByZXR1cm4gZXMgPT09IEVudGl0eVN0YXRlLkFkZGVkO1xyXG4gICoqL1xyXG4gIGlzQWRkZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcyA9PT0gRW50aXR5U3RhdGUuQWRkZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHdoZXRoZXIgYW4gZW50aXR5U3RhdGUgaW5zdGFuY2UgaXMgRW50aXR5U3RhdGUuTW9kaWZpZWQuXHJcbiAgPiAgICAgdmFyIGVzID0gYW5FbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gID4gICAgIHJldHVybiBlcy5pc01vZGlmaWVkKCk7XHJcblxyXG4gIGlzIHRoZSBzYW1lIGFzXHJcbiAgPiAgICAgcmV0dXJuIGVzID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZDtcclxuICAqKi9cclxuICBpc01vZGlmaWVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMgPT09IEVudGl0eVN0YXRlLk1vZGlmaWVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB3aGV0aGVyIGFuIGVudGl0eVN0YXRlIGluc3RhbmNlIGlzIEVudGl0eVN0YXRlLkRlbGV0ZWQuXHJcbiAgPiAgICAgdmFyIGVzID0gYW5FbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gID4gICAgIHJldHVybiBlcy5pc0RlbGV0ZWQoKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICBcclxuICA+ICAgICByZXR1cm4gZXMgPT09IEVudGl0eVN0YXRlLkRlbGV0ZWQ7XHJcbiAgKiovXHJcbiAgaXNEZWxldGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMgPT09IEVudGl0eVN0YXRlLkRlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHdoZXRoZXIgYW4gZW50aXR5U3RhdGUgaW5zdGFuY2UgaXMgRW50aXR5U3RhdGUuRGV0YWNoZWQuXHJcbiAgPiAgICAgdmFyIGVzID0gYW5FbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gID4gICAgIHJldHVybiBlcy5pc0RldGFjaGVkKCk7XHJcblxyXG4gIGlzIHRoZSBzYW1lIGFzXHJcbiAgPiAgICAgcmV0dXJuIGVzID09PSBFbnRpdHlTdGF0ZS5EZXRhY2hlZDtcclxuICAqKi9cclxuICBpc0RldGFjaGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMgPT09IEVudGl0eVN0YXRlLkRldGFjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybiB0cnVlIGlmIEVudGl0eVN0YXRlIGlzIERlbGV0ZWQgb3IgRGV0YWNoZWQgKi9cclxuICBpc0RlbGV0ZWRPckRldGFjaGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMgPT09IEVudGl0eVN0YXRlLkRldGFjaGVkIHx8IHRoaXMgPT09IEVudGl0eVN0YXRlLkRldGFjaGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB3aGV0aGVyIGFuIGVudGl0eVN0YXRlIGluc3RhbmNlIGlzIEVudGl0eVN0YXRlLlVuY2hhbmdlZCBvciBFbnRpdHlTdGF0ZS5Nb2RpZmllZC5cclxuICA+ICAgICB2YXIgZXMgPSBhbkVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGU7XHJcbiAgPiAgICAgcmV0dXJuIGVzLmlzVW5jaGFuZ2VkT3JNb2RpZmllZCgpO1xyXG5cclxuICBpcyB0aGUgc2FtZSBhc1xyXG4gID4gICAgIHJldHVybiBlcyA9PT0gRW50aXR5U3RhdGUuVW5jaGFuZ2VkIHx8IGVzID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZFxyXG4gICoqL1xyXG4gIGlzVW5jaGFuZ2VkT3JNb2RpZmllZCgpIHtcclxuICAgIHJldHVybiB0aGlzID09PSBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQgfHwgdGhpcyA9PT0gRW50aXR5U3RhdGUuTW9kaWZpZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIHRydWUgaWYgRW50aXR5U3RhdGlzIGlzIEFkZGVkIG9yIE1vZGlmaWVkICovXHJcbiAgaXNBZGRlZE9yTW9kaWZpZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcyA9PT0gRW50aXR5U3RhdGUuQWRkZWQgfHwgdGhpcyA9PT0gRW50aXR5U3RhdGUuTW9kaWZpZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB3aGV0aGVyIGFuIGVudGl0eVN0YXRlIGluc3RhbmNlIGlzIEVudGl0eVN0YXRlLkFkZGVkIG9yIEVudGl0eVN0YXRlLk1vZGlmaWVkIG9yIEVudGl0eVN0YXRlLkRlbGV0ZWQuXHJcbiAgPiAgICAgdmFyIGVzID0gYW5FbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gID4gICAgIHJldHVybiBlcy5pc0FkZGVkTW9kaWZpZWRPckRlbGV0ZWQoKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICByZXR1cm4gZXMgPT09IEVudGl0eVN0YXRlLkFkZGVkIHx8IGVzID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZCB8fCBlcyA9PT0gRW50aXR5U3RhdGUuRGVsZXRlZFxyXG4gICoqL1xyXG4gIGlzQWRkZWRNb2RpZmllZE9yRGVsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzID09PSBFbnRpdHlTdGF0ZS5BZGRlZCB8fFxyXG4gICAgICB0aGlzID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZCB8fFxyXG4gICAgICB0aGlzID09PSBFbnRpdHlTdGF0ZS5EZWxldGVkO1xyXG4gIH1cclxuXHJcbn1cclxuRW50aXR5U3RhdGUucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkVudGl0eVN0YXRlXCI7XHJcbkVycm9yWyd4J10gPSBFbnRpdHlTdGF0ZS5yZXNvbHZlU3ltYm9scygpO1xyXG4iXX0=
|
package/esm5/src/enum.js
CHANGED
|
@@ -141,4 +141,4 @@ var BreezeEnum = /** @class */ (function () {
|
|
|
141
141
|
return BreezeEnum;
|
|
142
142
|
}());
|
|
143
143
|
export { BreezeEnum };
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdDRTtBQUNGO0lBU0UsT0FBTztJQUNQLG9CQUFZLGFBQXNCO1FBQWxDLGlCQUlDO1FBSEMsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxLQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUE5QixDQUE4QixDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFVLEdBQWpCO1FBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxDQUFDLE1BQU0sRUFBVCxDQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFRLEdBQWY7UUFDRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsSUFBSSxFQUFQLENBQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBUSxHQUFmLFVBQWdCLElBQVk7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx5QkFBYyxHQUFyQjtRQUNFLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUFFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQ3hFLElBQUksTUFBTSxHQUEwQyxFQUFFLENBQUM7UUFFdkQsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxZQUFZLFVBQVUsRUFBRTtvQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLG1CQUFRLEdBQWYsVUFBZ0IsR0FBZTtRQUM3QixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksVUFBVSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUdELE1BQU07SUFDTiwwRkFBMEY7SUFDMUYsNENBQTRDO0lBQzVDLGtEQUFrRDtJQUNsRCw4QkFBOEI7SUFDOUIsV0FBVztJQUNYLE1BQU07SUFDTiw4QkFBOEI7SUFDOUIsc0NBQXNDO0lBQ3RDLEtBQUs7SUFFTCwyQ0FBMkM7SUFDM0MsNkJBQVEsR0FBUjtRQUNFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLDJCQUFNLEdBQU47UUFDRSxPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSyxJQUFJLENBQUMsV0FBbUIsQ0FBQyxJQUFJO1lBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVILGlCQUFDO0FBQUQsQ0FBQyxBQTlHRCxJQThHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAyMDEyLTIwMjMgSWRlYUJsYWRlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgXHJcbiAqIFVzZSwgcmVwcm9kdWN0aW9uLCBkaXN0cmlidXRpb24sIGFuZCBtb2RpZmljYXRpb24gb2YgdGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBcclxuICogY29uZGl0aW9ucyBvZiB0aGUgSWRlYUJsYWRlIEJyZWV6ZSBsaWNlbnNlLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icmVlemVqcy5jb20vbGljZW5zZVxyXG4gKlxyXG4gKiBBdXRob3I6IEpheSBUcmFiYW5kXHJcbiAqL1xyXG5cclxuLyoqXHJcbkJhc2UgY2xhc3MgZm9yIGFsbCBCcmVlemUgZW51bWVyYXRpb25zLCBzdWNoIGFzIEVudGl0eVN0YXRlLCBEYXRhVHlwZSwgRmV0Y2hTdHJhdGVneSwgTWVyZ2VTdHJhdGVneSBldGMuXHJcbkEgQnJlZXplIEVudW0gaXMgYSBuYW1lc3BhY2VkIHNldCBvZiBjb25zdGFudCB2YWx1ZXMuICBFYWNoIEVudW0gY29uc2lzdHMgb2YgYSBncm91cCBvZiByZWxhdGVkIGNvbnN0YW50cywgY2FsbGVkICdzeW1ib2xzJy5cclxuVW5saWtlIGVudW1zIGluIHNvbWUgb3RoZXIgZW52aXJvbm1lbnRzLCBlYWNoICdzeW1ib2wnIGNhbiBoYXZlIGJvdGggbWV0aG9kcyBhbmQgcHJvcGVydGllcy5cclxuPiAgICAgY2xhc3MgRGF5T2ZXZWVrIGV4dGVuZHMgQnJlZXplRW51bSB7XHJcbj4gICAgICAgZGF5SW5kZXg6IG51bWJlcjtcclxuPiAgICAgICBpc1dlZWtlbmQ/OiBib29sZWFuO1xyXG4+ICAgICAgIG5leHREYXkoKSB7XHJcbj4gICAgICAgICBsZXQgbmV4dEluZGV4ID0gKHRoaXMuZGF5SW5kZXggKyAxKSAlIDc7XHJcbj4gICAgICAgICByZXR1cm4gRGF5T2ZXZWVrLmdldFN5bWJvbHMoKVtuZXh0SW5kZXhdO1xyXG4+ICAgICAgIH1cclxuPlxyXG4+ICAgICAgIHN0YXRpYyBNb25kYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAwfSk7XHJcbj4gICAgICAgc3RhdGljIFR1ZXNkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAxIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBXZWRuZXNkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAyIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBUaHVyc2RheSA9IG5ldyBEYXlPZldlZWsoIHsgZGF5SW5kZXg6IDMgfSk7XHJcbj4gICAgICAgc3RhdGljIEZyaWRheSA9IG5ldyBEYXlPZldlZWsoIHsgZGF5SW5kZXg6IDQgfSk7XHJcbj4gICAgICAgc3RhdGljIFNhdHVyZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogNSwgaXNXZWVrZW5kOiB0cnVlIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBTdW5kYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiA2LCBpc1dlZWtlbmQ6IHRydWUgfSk7XHJcbj4gICAgIH1cclxuPlxyXG4+ICAgICBkZXNjcmliZShcIkRheU9mV2Vla1wiLCAoKSA9PiB7XHJcbj4gICAgICAgdGVzdChcInNob3VsZCBzdXBwb3J0IGZ1bGwgZW51bSBjYXBhYmlsaXRpZXNcIiwgZnVuY3Rpb24oKSB7XHJcbj4gICAgICAgICAvLyAvLyBjdXN0b20gbWV0aG9kc1xyXG4+ICAgICAgICAgbGV0IGRvd1N5bWJvbHMgPSBEYXlPZldlZWsuZ2V0U3ltYm9scygpO1xyXG4+ICAgICAgICAgZXhwZWN0KGRvd1N5bWJvbHMubGVuZ3RoKS50b0JlKDcpO1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5Nb25kYXkubmV4dERheSgpKS50b0JlKERheU9mV2Vlay5UdWVzZGF5KTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuU3VuZGF5Lm5leHREYXkoKSkudG9CZShEYXlPZldlZWsuTW9uZGF5KTtcclxuPiAgICAgICAvLyAvLyBjdXN0b20gcHJvcGVydGllc1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5UdWVzZGF5LmlzV2Vla2VuZCkudG9CZSh1bmRlZmluZWQpO1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5TYXR1cmRheS5pc1dlZWtlbmQpLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgLy8gLy8gU3RhbmRhcmQgZW51bSBjYXBhYmlsaXRpZXNcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuVGh1cnNkYXkgaW5zdGFuY2VvZiBEYXlPZldlZWspLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgICBleHBlY3QoQnJlZXplRW51bS5pc1N5bWJvbChEYXlPZldlZWsuV2VkbmVzZGF5KSkudG9CZSh0cnVlKTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuY29udGFpbnMoRGF5T2ZXZWVrLlRodXJzZGF5KSkudG9CZSh0cnVlKTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuRnJpZGF5LnRvU3RyaW5nKCkpLnRvQmUoXCJGcmlkYXlcIik7XHJcbj4gICAgICAgfSk7XHJcbj4gICB9KTtcclxuTm90ZSB0aGF0IHdlIGhhdmUgRXJyb3JbJ3gnXSA9IC4uLiBpbiBzb21lIHBsYWNlcyBpbiB0aGUgY29kZSB0byBwcmV2ZW50IFRlcnNlciBmcm9tIG9wdGltaXppbmcgb3V0IHNvbWUgaW1wb3J0YW50IGNhbGxzLlxyXG5AZHluYW1pY1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgQnJlZXplRW51bSB7XHJcbiAgLy8gLy8gVE9ETzogdGhpbmsgYWJvdXQgQ29tcG9zaXRlRW51bSAoZmxhZ3MgaW1wbCkuXHJcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sICovXHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUeXBlIG9mIHRoZSBlbnVtOyBzZXQgaW4gcHJvdG90eXBlIG9mIGVhY2ggZW51bSAqL1xyXG4gIF8kdHlwZU5hbWU6IHN0cmluZztcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBzdGF0aWMgX3Jlc29sdmVkTmFtZXNBbmRTeW1ib2xzOiB7IG5hbWU6IHN0cmluZywgc3ltYm9sOiBCcmVlemVFbnVtIH1bXTtcclxuXHJcbiAgLyoqICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnRpZXNPYmo/OiBPYmplY3QpIHtcclxuICAgIGlmIChwcm9wZXJ0aWVzT2JqKSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXNPYmopLmZvckVhY2goKGtleSkgPT4gdGhpc1trZXldID0gcHJvcGVydGllc09ialtrZXldKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYWxsIG9mIHRoZSBzeW1ib2xzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFbnVtLlxyXG4gID4gICAgIGxldCBzeW1ib2xzID0gRGF5T2ZXZWVrLmdldFN5bWJvbHMoKTtcclxuICBAcmV0dXJuIEFsbCBvZiB0aGUgc3ltYm9scyBjb250YWluZWQgd2l0aGluIHRoaXMgRW51bS5cclxuICAqKi9cclxuICBzdGF0aWMgZ2V0U3ltYm9scygpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc29sdmVTeW1ib2xzKCkubWFwKGtzID0+IGtzLnN5bWJvbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgb2YgdGhlIHN5bWJvbHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIEVudW0uXHJcbiAgPiAgICAgbGV0IHN5bWJvbHMgPSBEYXlPZldlZWsuZ2V0TmFtZXMoKTtcclxuICBAcmV0dXJuICBBbGwgb2YgdGhlIG5hbWVzIG9mIHRoZSBzeW1ib2xzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFbnVtLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBnZXROYW1lcygpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc29sdmVTeW1ib2xzKCkubWFwKGtzID0+IGtzLm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhbiBFbnVtIHN5bWJvbCBnaXZlbiBpdHMgbmFtZS5cclxuICA+ICAgICBsZXQgZGF5T2ZXZWVrID0gRGF5T2ZXZWVrLmZyb20oXCJUaHVyc2RheVwiKTtcclxuICA+ICAgICAvLyBub3dkYXlPZldlZWsgPT09IERheU9mV2Vlay5UaHVyc2RheVxyXG4gIEBwYXJhbSBuYW1lIC0gTmFtZSBmb3Igd2hpY2ggYW4gZW51bSBzeW1ib2wgc2hvdWxkIGJlIHJldHVybmVkLlxyXG4gIEByZXR1cm4gVGhlIHN5bWJvbCB0aGF0IG1hdGNoZXMgdGhlIG5hbWUgb3IgJ3VuZGVmaW5lZCcgaWYgbm90IGZvdW5kLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBmcm9tTmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzW25hbWVdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU2VhbHMgdGhpcyBlbnVtIHNvIHRoYXQgbm8gbW9yZSBzeW1ib2xzIG1heSBiZSBhZGRlZCB0byBpdC4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHN5bWJvbHNcclxuICBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgRW51bS4gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSAnbmFtZScgcHJvcGVydHkgb24gZWFjaCBvZiB0aGUgc3ltYm9scy5cclxuICA+ICAgICBEYXlPZldlZWsucmVzb2x2ZVN5bWJvbHMoKTtcclxuICAqKi9cclxuICBzdGF0aWMgcmVzb2x2ZVN5bWJvbHMoKSB7XHJcbiAgICBpZiAodGhpcy5fcmVzb2x2ZWROYW1lc0FuZFN5bWJvbHMpIHJldHVybiB0aGlzLl9yZXNvbHZlZE5hbWVzQW5kU3ltYm9scztcclxuICAgIGxldCByZXN1bHQ6IHtuYW1lOiBzdHJpbmcsIHN5bWJvbDogQnJlZXplRW51bSB9W10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcykge1xyXG4gICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgbGV0IHN5bWIgPSB0aGlzW2tleV07XHJcbiAgICAgICAgaWYgKHN5bWIgaW5zdGFuY2VvZiBCcmVlemVFbnVtKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCggeyBuYW1lOiBrZXksIHN5bWJvbDogc3ltYiB9KTtcclxuICAgICAgICAgIHRoaXNba2V5XSA9IHN5bWI7XHJcbiAgICAgICAgICBzeW1iLm5hbWUgPSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZXNvbHZlZE5hbWVzQW5kU3ltYm9scyA9IHJlc3VsdDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHdoZXRoZXIgYW4gRW51bSBjb250YWlucyBhIHNwZWNpZmllZCBzeW1ib2wuXHJcbiAgPiAgICAgbGV0IHN5bWJvbCA9IERheU9mV2Vlay5GcmlkYXk7XHJcbiAgPiAgICAgaWYgKERheU9mV2Vlay5jb250YWlucyhzeW1ib2wpKSB7XHJcbiAgPiAgICAgICAgIC8vIGRvIHNvbWV0aGluZ1xyXG4gID4gICAgIH1cclxuICBAcGFyYW0gc3ltIC0gT2JqZWN0IG9yIHN5bWJvbCB0byB0ZXN0LlxyXG4gIEByZXR1cm4gV2hldGhlciB0aGlzIEVudW0gY29udGFpbnMgdGhlIHNwZWNpZmllZCBzeW1ib2wuXHJcbiAgKiovXHJcbiAgc3RhdGljIGNvbnRhaW5zKHN5bTogQnJlZXplRW51bSkge1xyXG4gICAgaWYgKCEoc3ltIGluc3RhbmNlb2YgQnJlZXplRW51bSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzW3N5bS5uYW1lXSAhPSBudWxsO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIC8qKlxyXG4gIC8vIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYW4gRW51bSAnc3ltYm9sJy4gVXNlIHRoZSAnY29udGFpbnMnIG1ldGhvZCBpbnN0ZWFkIG9mIHRoaXMgb25lIFxyXG4gIC8vIGlmIHlvdSB3YW50IHRvIHRlc3QgZm9yIGEgc3BlY2lmaWMgRW51bS4gXHJcbiAgLy8gPiAgICAgaWYgKEVudW0uaXNTeW1ib2woRGF5T2ZXZWVrLldlZG5lc2RheSkpIHtcclxuICAvLyA+ICAgICAgIC8vIGRvIHNvbWV0aGluZyAuLi5cclxuICAvLyA+ICAgICB9O1xyXG4gIC8vICoqL1xyXG4gIC8vIHN0YXRpYyBpc1N5bWJvbChvYmo6IGFueSkge1xyXG4gIC8vICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEJyZWV6ZUVudW07XHJcbiAgLy8gfTtcclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyBuYW1lIG9mIHRoaXMgRW51bSAqL1xyXG4gIHRvU3RyaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXR1cm4gZW51bSBuYW1lIGFuZCBzeW1ib2wgbmFtZSAqL1xyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIF8kdHlwZU5hbWU6IHRoaXNbJ18kdHlwZU5hbWUnXSB8fCAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWUsXHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdDRTtBQUNGO0lBU0UsT0FBTztJQUNQLG9CQUFZLGFBQXNCO1FBQWxDLGlCQUlDO1FBSEMsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxLQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUE5QixDQUE4QixDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHFCQUFVLEdBQWpCO1FBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxDQUFDLE1BQU0sRUFBVCxDQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFRLEdBQWY7UUFDRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSxFQUFFLENBQUMsSUFBSSxFQUFQLENBQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBUSxHQUFmLFVBQWdCLElBQVk7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx5QkFBYyxHQUFyQjtRQUNFLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUFFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQ3hFLElBQUksTUFBTSxHQUEwQyxFQUFFLENBQUM7UUFFdkQsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxZQUFZLFVBQVUsRUFBRTtvQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNqQjthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLG1CQUFRLEdBQWYsVUFBZ0IsR0FBZTtRQUM3QixJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksVUFBVSxDQUFDLEVBQUU7WUFDaEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUdELE1BQU07SUFDTiwwRkFBMEY7SUFDMUYsNENBQTRDO0lBQzVDLGtEQUFrRDtJQUNsRCw4QkFBOEI7SUFDOUIsV0FBVztJQUNYLE1BQU07SUFDTiw4QkFBOEI7SUFDOUIsc0NBQXNDO0lBQ3RDLEtBQUs7SUFFTCwyQ0FBMkM7SUFDM0MsNkJBQVEsR0FBUjtRQUNFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLDJCQUFNLEdBQU47UUFDRSxPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSyxJQUFJLENBQUMsV0FBbUIsQ0FBQyxJQUFJO1lBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVILGlCQUFDO0FBQUQsQ0FBQyxBQTlHRCxJQThHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAyMDEyLTIwMjMgSWRlYUJsYWRlLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgXHJcbiAqIFVzZSwgcmVwcm9kdWN0aW9uLCBkaXN0cmlidXRpb24sIGFuZCBtb2RpZmljYXRpb24gb2YgdGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBcclxuICogY29uZGl0aW9ucyBvZiB0aGUgSWRlYUJsYWRlIEJyZWV6ZSBsaWNlbnNlLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icmVlemVqcy5jb20vbGljZW5zZVxyXG4gKlxyXG4gKiBBdXRob3I6IEpheSBUcmFiYW5kXHJcbiAqL1xyXG5cclxuLyoqXHJcbkJhc2UgY2xhc3MgZm9yIGFsbCBCcmVlemUgZW51bWVyYXRpb25zLCBzdWNoIGFzIEVudGl0eVN0YXRlLCBEYXRhVHlwZSwgRmV0Y2hTdHJhdGVneSwgTWVyZ2VTdHJhdGVneSBldGMuXHJcbkEgQnJlZXplIEVudW0gaXMgYSBuYW1lc3BhY2VkIHNldCBvZiBjb25zdGFudCB2YWx1ZXMuICBFYWNoIEVudW0gY29uc2lzdHMgb2YgYSBncm91cCBvZiByZWxhdGVkIGNvbnN0YW50cywgY2FsbGVkICdzeW1ib2xzJy5cclxuVW5saWtlIGVudW1zIGluIHNvbWUgb3RoZXIgZW52aXJvbm1lbnRzLCBlYWNoICdzeW1ib2wnIGNhbiBoYXZlIGJvdGggbWV0aG9kcyBhbmQgcHJvcGVydGllcy5cclxuPiAgICAgY2xhc3MgRGF5T2ZXZWVrIGV4dGVuZHMgQnJlZXplRW51bSB7XHJcbj4gICAgICAgZGF5SW5kZXg6IG51bWJlcjtcclxuPiAgICAgICBpc1dlZWtlbmQ/OiBib29sZWFuO1xyXG4+ICAgICAgIG5leHREYXkoKSB7XHJcbj4gICAgICAgICBsZXQgbmV4dEluZGV4ID0gKHRoaXMuZGF5SW5kZXggKyAxKSAlIDc7XHJcbj4gICAgICAgICByZXR1cm4gRGF5T2ZXZWVrLmdldFN5bWJvbHMoKVtuZXh0SW5kZXhdO1xyXG4+ICAgICAgIH1cclxuPlxyXG4+ICAgICAgIHN0YXRpYyBNb25kYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAwfSk7XHJcbj4gICAgICAgc3RhdGljIFR1ZXNkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAxIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBXZWRuZXNkYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiAyIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBUaHVyc2RheSA9IG5ldyBEYXlPZldlZWsoIHsgZGF5SW5kZXg6IDMgfSk7XHJcbj4gICAgICAgc3RhdGljIEZyaWRheSA9IG5ldyBEYXlPZldlZWsoIHsgZGF5SW5kZXg6IDQgfSk7XHJcbj4gICAgICAgc3RhdGljIFNhdHVyZGF5ID0gbmV3IERheU9mV2VlayggeyBkYXlJbmRleDogNSwgaXNXZWVrZW5kOiB0cnVlIH0pO1xyXG4+ICAgICAgIHN0YXRpYyBTdW5kYXkgPSBuZXcgRGF5T2ZXZWVrKCB7IGRheUluZGV4OiA2LCBpc1dlZWtlbmQ6IHRydWUgfSk7XHJcbj4gICAgIH1cclxuPlxyXG4+ICAgICBkZXNjcmliZShcIkRheU9mV2Vla1wiLCAoKSA9PiB7XHJcbj4gICAgICAgdGVzdChcInNob3VsZCBzdXBwb3J0IGZ1bGwgZW51bSBjYXBhYmlsaXRpZXNcIiwgZnVuY3Rpb24oKSB7XHJcbj4gICAgICAgICAvLyAvLyBjdXN0b20gbWV0aG9kc1xyXG4+ICAgICAgICAgbGV0IGRvd1N5bWJvbHMgPSBEYXlPZldlZWsuZ2V0U3ltYm9scygpO1xyXG4+ICAgICAgICAgZXhwZWN0KGRvd1N5bWJvbHMubGVuZ3RoKS50b0JlKDcpO1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5Nb25kYXkubmV4dERheSgpKS50b0JlKERheU9mV2Vlay5UdWVzZGF5KTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuU3VuZGF5Lm5leHREYXkoKSkudG9CZShEYXlPZldlZWsuTW9uZGF5KTtcclxuPiAgICAgICAvLyAvLyBjdXN0b20gcHJvcGVydGllc1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5UdWVzZGF5LmlzV2Vla2VuZCkudG9CZSh1bmRlZmluZWQpO1xyXG4+ICAgICAgICAgZXhwZWN0KERheU9mV2Vlay5TYXR1cmRheS5pc1dlZWtlbmQpLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgLy8gLy8gU3RhbmRhcmQgZW51bSBjYXBhYmlsaXRpZXNcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuVGh1cnNkYXkgaW5zdGFuY2VvZiBEYXlPZldlZWspLnRvQmUodHJ1ZSk7XHJcbj4gICAgICAgICBleHBlY3QoQnJlZXplRW51bS5pc1N5bWJvbChEYXlPZldlZWsuV2VkbmVzZGF5KSkudG9CZSh0cnVlKTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuY29udGFpbnMoRGF5T2ZXZWVrLlRodXJzZGF5KSkudG9CZSh0cnVlKTtcclxuPiAgICAgICAgIGV4cGVjdChEYXlPZldlZWsuRnJpZGF5LnRvU3RyaW5nKCkpLnRvQmUoXCJGcmlkYXlcIik7XHJcbj4gICAgICAgfSk7XHJcbj4gICB9KTtcclxuTm90ZSB0aGF0IHdlIGhhdmUgRXJyb3JbJ3gnXSA9IC4uLiBpbiBzb21lIHBsYWNlcyBpbiB0aGUgY29kZSB0byBwcmV2ZW50IFRlcnNlciBmcm9tIG9wdGltaXppbmcgb3V0IHNvbWUgaW1wb3J0YW50IGNhbGxzLlxyXG5AZHluYW1pY1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgQnJlZXplRW51bSB7XHJcbiAgLy8gLy8gVE9ETzogdGhpbmsgYWJvdXQgQ29tcG9zaXRlRW51bSAoZmxhZ3MgaW1wbCkuXHJcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sICovXHJcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFR5cGUgb2YgdGhlIGVudW07IHNldCBpbiBwcm90b3R5cGUgb2YgZWFjaCBlbnVtICovXHJcbiAgZGVjbGFyZSBfJHR5cGVOYW1lOiBzdHJpbmc7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgc3RhdGljIF9yZXNvbHZlZE5hbWVzQW5kU3ltYm9sczogeyBuYW1lOiBzdHJpbmcsIHN5bWJvbDogQnJlZXplRW51bSB9W107XHJcblxyXG4gIC8qKiAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzT2JqPzogT2JqZWN0KSB7XHJcbiAgICBpZiAocHJvcGVydGllc09iaikge1xyXG4gICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzT2JqKS5mb3JFYWNoKChrZXkpID0+IHRoaXNba2V5XSA9IHByb3BlcnRpZXNPYmpba2V5XSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGFsbCBvZiB0aGUgc3ltYm9scyBjb250YWluZWQgd2l0aGluIHRoaXMgRW51bS5cclxuICA+ICAgICBsZXQgc3ltYm9scyA9IERheU9mV2Vlay5nZXRTeW1ib2xzKCk7XHJcbiAgQHJldHVybiBBbGwgb2YgdGhlIHN5bWJvbHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIEVudW0uXHJcbiAgKiovXHJcbiAgc3RhdGljIGdldFN5bWJvbHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3ltYm9scygpLm1hcChrcyA9PiBrcy5zeW1ib2wpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIG9mIHRoZSBzeW1ib2xzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFbnVtLlxyXG4gID4gICAgIGxldCBzeW1ib2xzID0gRGF5T2ZXZWVrLmdldE5hbWVzKCk7XHJcbiAgQHJldHVybiAgQWxsIG9mIHRoZSBuYW1lcyBvZiB0aGUgc3ltYm9scyBjb250YWluZWQgd2l0aGluIHRoaXMgRW51bS5cclxuICAqKi9cclxuICBzdGF0aWMgZ2V0TmFtZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU3ltYm9scygpLm1hcChrcyA9PiBrcy5uYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYW4gRW51bSBzeW1ib2wgZ2l2ZW4gaXRzIG5hbWUuXHJcbiAgPiAgICAgbGV0IGRheU9mV2VlayA9IERheU9mV2Vlay5mcm9tKFwiVGh1cnNkYXlcIik7XHJcbiAgPiAgICAgLy8gbm93ZGF5T2ZXZWVrID09PSBEYXlPZldlZWsuVGh1cnNkYXlcclxuICBAcGFyYW0gbmFtZSAtIE5hbWUgZm9yIHdoaWNoIGFuIGVudW0gc3ltYm9sIHNob3VsZCBiZSByZXR1cm5lZC5cclxuICBAcmV0dXJuIFRoZSBzeW1ib2wgdGhhdCBtYXRjaGVzIHRoZSBuYW1lIG9yICd1bmRlZmluZWQnIGlmIG5vdCBmb3VuZC5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbU5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpc1tuYW1lXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFNlYWxzIHRoaXMgZW51bSBzbyB0aGF0IG5vIG1vcmUgc3ltYm9scyBtYXkgYmUgYWRkZWQgdG8gaXQuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBzeW1ib2xzXHJcbiAgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIEVudW0uIFRoaXMgbWV0aG9kIGFsc28gc2V0cyB0aGUgJ25hbWUnIHByb3BlcnR5IG9uIGVhY2ggb2YgdGhlIHN5bWJvbHMuXHJcbiAgPiAgICAgRGF5T2ZXZWVrLnJlc29sdmVTeW1ib2xzKCk7XHJcbiAgKiovXHJcbiAgc3RhdGljIHJlc29sdmVTeW1ib2xzKCkge1xyXG4gICAgaWYgKHRoaXMuX3Jlc29sdmVkTmFtZXNBbmRTeW1ib2xzKSByZXR1cm4gdGhpcy5fcmVzb2x2ZWROYW1lc0FuZFN5bWJvbHM7XHJcbiAgICBsZXQgcmVzdWx0OiB7bmFtZTogc3RyaW5nLCBzeW1ib2w6IEJyZWV6ZUVudW0gfVtdID0gW107XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIHRoaXMpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGxldCBzeW1iID0gdGhpc1trZXldO1xyXG4gICAgICAgIGlmIChzeW1iIGluc3RhbmNlb2YgQnJlZXplRW51bSkge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goIHsgbmFtZToga2V5LCBzeW1ib2w6IHN5bWIgfSk7XHJcbiAgICAgICAgICB0aGlzW2tleV0gPSBzeW1iO1xyXG4gICAgICAgICAgc3ltYi5uYW1lID0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVzb2x2ZWROYW1lc0FuZFN5bWJvbHMgPSByZXN1bHQ7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB3aGV0aGVyIGFuIEVudW0gY29udGFpbnMgYSBzcGVjaWZpZWQgc3ltYm9sLlxyXG4gID4gICAgIGxldCBzeW1ib2wgPSBEYXlPZldlZWsuRnJpZGF5O1xyXG4gID4gICAgIGlmIChEYXlPZldlZWsuY29udGFpbnMoc3ltYm9sKSkge1xyXG4gID4gICAgICAgICAvLyBkbyBzb21ldGhpbmdcclxuICA+ICAgICB9XHJcbiAgQHBhcmFtIHN5bSAtIE9iamVjdCBvciBzeW1ib2wgdG8gdGVzdC5cclxuICBAcmV0dXJuIFdoZXRoZXIgdGhpcyBFbnVtIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3ltYm9sLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBjb250YWlucyhzeW06IEJyZWV6ZUVudW0pIHtcclxuICAgIGlmICghKHN5bSBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpc1tzeW0ubmFtZV0gIT0gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICAvLyAvKipcclxuICAvLyBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGFuIEVudW0gJ3N5bWJvbCcuIFVzZSB0aGUgJ2NvbnRhaW5zJyBtZXRob2QgaW5zdGVhZCBvZiB0aGlzIG9uZSBcclxuICAvLyBpZiB5b3Ugd2FudCB0byB0ZXN0IGZvciBhIHNwZWNpZmljIEVudW0uIFxyXG4gIC8vID4gICAgIGlmIChFbnVtLmlzU3ltYm9sKERheU9mV2Vlay5XZWRuZXNkYXkpKSB7XHJcbiAgLy8gPiAgICAgICAvLyBkbyBzb21ldGhpbmcgLi4uXHJcbiAgLy8gPiAgICAgfTtcclxuICAvLyAqKi9cclxuICAvLyBzdGF0aWMgaXNTeW1ib2wob2JqOiBhbnkpIHtcclxuICAvLyAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBCcmVlemVFbnVtO1xyXG4gIC8vIH07XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGlzIEVudW0gKi9cclxuICB0b1N0cmluZygpIHtcclxuICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJuIGVudW0gbmFtZSBhbmQgc3ltYm9sIG5hbWUgKi9cclxuICB0b0pTT04oKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBfJHR5cGVOYW1lOiB0aGlzWydfJHR5cGVOYW1lJ10gfHwgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5uYW1lLFxyXG4gICAgICBuYW1lOiB0aGlzLm5hbWVcclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|