@bitgo-beta/abstract-eth 1.0.2-beta.2324 → 1.0.2-beta.2325
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/abstractEthLikeNewCoins.d.ts +14 -0
- package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -1
- package/dist/src/abstractEthLikeNewCoins.js +56 -1
- package/dist/src/lib/zamaUtils.d.ts +11 -0
- package/dist/src/lib/zamaUtils.d.ts.map +1 -1
- package/dist/src/lib/zamaUtils.js +24 -1
- package/dist/test/unit/zamaUtils.js +22 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -74,6 +74,17 @@ export declare function assertWrapAmountFitsUint64(amount: string | number | big
|
|
|
74
74
|
* @throws {Error} if the wrapper address is invalid or amount is negative
|
|
75
75
|
*/
|
|
76
76
|
export declare function buildApproveCalldata(wrapperAddress: string, amount: string | number | bigint): string;
|
|
77
|
+
/**
|
|
78
|
+
* Decodes ERC-20 `approve(spender, amount)` calldata.
|
|
79
|
+
*
|
|
80
|
+
* @param data ABI-encoded approve calldata (0x-prefixed)
|
|
81
|
+
* @returns `{ spender, amount }` with checksummed `spender` and decimal-string `amount`
|
|
82
|
+
* @throws {Error} if the selector is not `approve` or the arguments cannot be decoded
|
|
83
|
+
*/
|
|
84
|
+
export declare function decodeApproveCalldata(data: string): {
|
|
85
|
+
spender: string;
|
|
86
|
+
amount: string;
|
|
87
|
+
};
|
|
77
88
|
/**
|
|
78
89
|
* Encodes ERC-7984 `wrap(to, amount)` calldata for the shield path.
|
|
79
90
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zamaUtils.d.ts","sourceRoot":"","sources":["../../../src/lib/zamaUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.finalizeUnwrapMethodId = exports.unwrapMethodId = exports.wrapMethodId = exports.approveMethodId = exports.callFromParentMethodId = exports.aclMulticallMethodId = exports.delegateForUserDecryptionMethodId = exports.UINT64_MAX = exports.finalizeUnwrapTypes = exports.unwrapTypes = exports.wrapTypes = exports.approveTypes = exports.aclMulticallTypes = exports.callFromParentTypes = exports.delegateForUserDecryptionTypes = void 0;
|
|
7
7
|
exports.assertWrapAmountFitsUint64 = assertWrapAmountFitsUint64;
|
|
8
8
|
exports.buildApproveCalldata = buildApproveCalldata;
|
|
9
|
+
exports.decodeApproveCalldata = decodeApproveCalldata;
|
|
9
10
|
exports.buildWrapCalldata = buildWrapCalldata;
|
|
10
11
|
exports.decodeWrapCalldata = decodeWrapCalldata;
|
|
11
12
|
exports.buildUnwrapCalldata = buildUnwrapCalldata;
|
|
@@ -151,6 +152,28 @@ function buildApproveCalldata(wrapperAddress, amount) {
|
|
|
151
152
|
const args = ethereumjs_abi_1.default.rawEncode([...exports.approveTypes], [checksummedWrapper, amountBn.toString()]);
|
|
152
153
|
return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
|
|
153
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Decodes ERC-20 `approve(spender, amount)` calldata.
|
|
157
|
+
*
|
|
158
|
+
* @param data ABI-encoded approve calldata (0x-prefixed)
|
|
159
|
+
* @returns `{ spender, amount }` with checksummed `spender` and decimal-string `amount`
|
|
160
|
+
* @throws {Error} if the selector is not `approve` or the arguments cannot be decoded
|
|
161
|
+
*/
|
|
162
|
+
function decodeApproveCalldata(data) {
|
|
163
|
+
if (!data.toLowerCase().startsWith(exports.approveMethodId.toLowerCase())) {
|
|
164
|
+
throw new Error(`decodeApproveCalldata: expected approve selector ${exports.approveMethodId}, got ${data.slice(0, 10)}`);
|
|
165
|
+
}
|
|
166
|
+
// selector (4 bytes) + two 32-byte words; reject trailing bytes so nothing unparsed rides along
|
|
167
|
+
if (data.length !== 2 + 8 + 2 * 64) {
|
|
168
|
+
throw new Error(`decodeApproveCalldata: expected 68 bytes of calldata, got ${(data.length - 2) / 2}`);
|
|
169
|
+
}
|
|
170
|
+
const abiCoder = new ethers_1.ethers.utils.AbiCoder();
|
|
171
|
+
const decoded = abiCoder.decode([...exports.approveTypes], '0x' + data.slice(10));
|
|
172
|
+
return {
|
|
173
|
+
spender: ethers_1.ethers.utils.getAddress(decoded[0]),
|
|
174
|
+
amount: decoded[1].toString(),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
154
177
|
/**
|
|
155
178
|
* Encodes ERC-7984 `wrap(to, amount)` calldata for the shield path.
|
|
156
179
|
*
|
|
@@ -501,4 +524,4 @@ function decodeFlushERC7984ForwarderTokenCalldata(data) {
|
|
|
501
524
|
encryptedHandle,
|
|
502
525
|
};
|
|
503
526
|
}
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUZBLGdFQXNCQztBQWlCRCxvREFxQkM7QUFrQkQsOENBNkJDO0FBUUQsZ0RBVUM7QUFtQkQsa0RBMkJDO0FBT0Qsb0RBaUJDO0FBaUJELGtFQWtDQztBQU9ELG9FQW9CQztBQWFELDBEQVdDO0FBZUQsNEVBNkJDO0FBZ0JELG9EQVdDO0FBYUQsZ0dBeUNDO0FBV0QsOEZBS0M7QUFZRCwwRkFPQztBQVVELDRGQWtDQztBQTlrQkQscURBQXNFO0FBQ3RFLG9FQUF5QztBQUN6QyxtQ0FBZ0M7QUFDaEMsNkNBQXFHO0FBRXJHLDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLDRCQUE0QjtBQUNmLFFBQUEsOEJBQThCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBQzNFLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQy9ELFFBQUEsaUJBQWlCLEdBQUcsQ0FBQyxTQUFTLENBQVUsQ0FBQztBQUN6QyxRQUFBLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUMvQyxRQUFBLFNBQVMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQVUsQ0FBQztBQUM1QyxRQUFBLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBQ2xFLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBRTNFLHlGQUF5RjtBQUM1RSxRQUFBLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQztBQUNoRDs7O0dBR0c7QUFDVSxRQUFBLGlDQUFpQyxHQUFHLElBQUEsOEJBQVksRUFDM0Qsd0JBQVcsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxHQUFHLHNDQUE4QixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3ZHLENBQUM7QUFFRjs7OztHQUlHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRyxJQUFBLDhCQUFZLEVBQzlDLHdCQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcseUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDMUUsQ0FBQztBQUVGOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBQSw4QkFBWSxFQUNoRCx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsMkJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDakYsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLGVBQWUsR0FBRyxJQUFBLDhCQUFZLEVBQUMsd0JBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxvQkFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUVoSDs7OztHQUlHO0FBQ1UsUUFBQSxZQUFZLEdBQUcsSUFBQSw4QkFBWSxFQUFDLHdCQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdkc7Ozs7R0FJRztBQUNVLFFBQUEsY0FBYyxHQUFHLElBQUEsOEJBQVksRUFBQyx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLG1CQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRTdHOzs7O0dBSUc7QUFDVSxRQUFBLHNCQUFzQixHQUFHLElBQUEsOEJBQVksRUFDaEQsd0JBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2pGLENBQUM7QUFFRiw4RUFBOEU7QUFDOUUscUJBQXFCO0FBQ3JCLDhFQUE4RTtBQUU5RTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFnQyxFQUFFLElBQThCO0lBQ3pHLElBQUksUUFBZ0IsQ0FBQztJQUNyQixJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDSCxRQUFRLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxJQUFJLFFBQVEsR0FBRyxNQUFNLEdBQUcsa0JBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsY0FBc0IsRUFBRSxNQUFnQztJQUMzRixJQUFJLGtCQUEwQixDQUFDO0lBQy9CLElBQUksQ0FBQztRQUNILGtCQUFrQixHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLFFBQWdCLENBQUM7SUFDckIsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxvQkFBWSxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqRyxPQUFPLElBQUEsOEJBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixFQUFVLEVBQ1YsTUFBZ0MsRUFDaEMsSUFBK0I7SUFFL0IsSUFBSSxhQUFxQixDQUFDO0lBQzFCLElBQUksQ0FBQztRQUNILGFBQWEsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxRQUFnQixDQUFDO0lBQ3JCLElBQUksQ0FBQztRQUNILFFBQVEsR0FBRyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZCLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxpQkFBUyxDQUFDLENBQUMsQ0FBQztJQUM1RCxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsT0FBTyxJQUFBLDhCQUFZLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLElBQVk7SUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsb0JBQVksU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RSxPQUFPO1FBQ0wsRUFBRSxFQUFFLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtLQUM5QixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxlQUF1QixFQUFFLFVBQWtCO0lBQ3ZHLElBQUksZUFBdUIsQ0FBQztJQUM1QixJQUFJLGFBQXFCLENBQUM7SUFDMUIsSUFBSSxDQUFDO1FBQ0gsZUFBZSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxhQUFhLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELElBQUksQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyRyxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ2pILENBQUM7SUFDRCxJQUFJLENBQUMsZUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksZUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUYsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RUFBd0UsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxtQkFBVyxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsRUFDaEIsQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUEsMEJBQVEsRUFBQyxlQUFlLENBQUMsRUFBRSxJQUFBLDBCQUFRLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FDbEYsQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLElBQVk7SUFNL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0Qsc0JBQWMsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RSxPQUFPO1FBQ0wsSUFBSSxFQUFFLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxFQUFFLEVBQUUsZUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLGVBQWUsRUFBRSxlQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsVUFBVSxFQUFFLGVBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQ3pDLFNBQWlCLEVBQ2pCLGVBQXlDLEVBQ3pDLGVBQXVCO0lBRXZCLElBQUksQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN6RixNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRCxJQUFJLFFBQWdCLENBQUM7SUFDckIsSUFBSSxDQUFDO1FBQ0gsUUFBUSxHQUFHLE9BQU8sZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSxRQUFRLEdBQUcsa0JBQVUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsSUFBSSxDQUFDLGVBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BHLE1BQU0sSUFBSSxLQUFLLENBQ2IscUZBQXFGLGVBQWUsR0FBRyxDQUN4RyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEYsTUFBTSxJQUFJLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQ2hDLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxFQUN4QixDQUFDLElBQUEsMEJBQVEsRUFBQyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBQSwwQkFBUSxFQUFDLGVBQWUsQ0FBQyxDQUFDLENBQ3RFLENBQUM7SUFDRixPQUFPLElBQUEsOEJBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQiw0QkFBNEIsQ0FBQyxJQUFZO0lBS3ZELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLDhCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSw4QkFBc0IsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUN6RyxDQUFDLEVBQ0QsRUFBRSxDQUNILEVBQUUsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTztRQUNMLFNBQVMsRUFBRSxlQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDdEMsZUFBZSxFQUFFLGVBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsZUFBdUIsRUFDdkIsb0JBQTRCLEVBQzVCLGVBQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFHLHdCQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxDQUFDLENBQUM7SUFDdEcsTUFBTSxJQUFJLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQ2hDLENBQUMsR0FBRyxzQ0FBOEIsQ0FBQyxFQUNuQyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxlQUFlLENBQUMsQ0FDekQsQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQzlDLGVBQXVCLEVBQ3ZCLHNCQUFnQyxFQUNoQyxlQUF1QjtJQUV2QixJQUFJLHNCQUFzQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxNQUFNLFVBQVUsR0FBYSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtRQUN2RSxNQUFNLFdBQVcsR0FBRyx3QkFBVyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLEdBQUcsc0NBQThCLENBQUMsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sU0FBUyxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUNyQyxDQUFDLEdBQUcsc0NBQThCLENBQUMsRUFDbkMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFSCxrQ0FBa0M7SUFDbEMsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyx5QkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDOUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDM0IsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcseUJBQWlCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqRixLQUFLLENBQ04sQ0FBQztJQUNGLE9BQU8sSUFBQSw4QkFBWSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGFBQXFCLEVBQUUsUUFBZ0I7SUFDMUUsTUFBTSxNQUFNLEdBQUcsd0JBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FDaEMsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLEVBQ3hCO1FBQ0UsYUFBYTtRQUNiLENBQUMsRUFBRSx5QkFBeUI7UUFDNUIsSUFBQSwwQkFBUSxFQUFDLFFBQVEsQ0FBQyxFQUFFLDBCQUEwQjtLQUMvQyxDQUNGLENBQUM7SUFDRixPQUFPLElBQUEsOEJBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQiwwQ0FBMEMsQ0FBQyxRQUFnQjtJQUN6RSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRTdDLElBQUksWUFBb0IsQ0FBQztJQUV6QixJQUFJLFFBQVEsS0FBSyw4QkFBc0IsRUFBRSxDQUFDO1FBQ3hDLCtGQUErRjtRQUMvRixrR0FBa0c7UUFDbEcsc0VBQXNFO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLDJCQUFtQixDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRixZQUFZLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLDRCQUFvQixFQUFFLENBQUM7UUFDN0MsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyw0QkFBb0IsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLDRGQUE0RjtJQUM1RixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLFVBQVUsR0FBYyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekMsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO0lBQ3BDLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBbUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDaEcsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksYUFBYSxLQUFLLHlDQUFpQyxFQUFFLENBQUM7WUFDeEQsU0FBUztRQUNYLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsc0NBQThCLENBQUMsRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLGNBQWMsQ0FBQyxJQUFJLENBQUUsWUFBWSxDQUFDLENBQUMsQ0FBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHlDQUF5QyxDQUFDLFNBQWlCLEVBQUUsZUFBdUI7SUFDbEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEYsTUFBTSxZQUFZLEdBQUcsSUFBQSwwQkFBUSxFQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLHdCQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyw2Q0FBZ0MsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDckcsT0FBTyxJQUFBLDhCQUFZLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQix1Q0FBdUMsQ0FDckQsb0JBQTRCLEVBQzVCLGFBQXFCLEVBQ3JCLGVBQXVCO0lBRXZCLE1BQU0sYUFBYSxHQUFHLHlDQUF5QyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNoRyxPQUFPLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0Isd0NBQXdDLENBQUMsSUFBWTtJQUtuRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBc0IsQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDYixzRkFBc0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FDMUcsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGVBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsMkJBQW1CLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sb0JBQW9CLEdBQVcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sYUFBYSxHQUFXLGVBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdEQUFtQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksS0FBSyxDQUNiLGtHQUFrRyxhQUFhLENBQUMsS0FBSyxDQUNuSCxDQUFDLEVBQ0QsRUFBRSxDQUNILEVBQUUsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLDZDQUFnQyxDQUFDLEVBQUUsSUFBSSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RyxNQUFNLGFBQWEsR0FBVyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsTUFBTSxlQUFlLEdBQVcsSUFBQSw2QkFBVyxFQUFDLElBQUEsMEJBQVEsRUFBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE9BQU87UUFDTCxvQkFBb0I7UUFDcEIsYUFBYTtRQUNiLGVBQWU7S0FDaEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZGRIZXhQcmVmaXgsIGJ1ZmZlclRvSGV4LCB0b0J1ZmZlciB9IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcbmltcG9ydCB7IGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZk1ldGhvZElkLCBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZUeXBlcyB9IGZyb20gJy4vd2FsbGV0VXRpbCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQUJJIHBhcmFtZXRlciB0eXBlIGFycmF5c1xuZXhwb3J0IGNvbnN0IGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlcyA9IFsnYWRkcmVzcycsICdhZGRyZXNzJywgJ3VpbnQ2NCddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGNhbGxGcm9tUGFyZW50VHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NicsICdieXRlcyddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGFjbE11bHRpY2FsbFR5cGVzID0gWydieXRlc1tdJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYXBwcm92ZVR5cGVzID0gWydhZGRyZXNzJywgJ3VpbnQyNTYnXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB3cmFwVHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHVud3JhcFR5cGVzID0gWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAnYnl0ZXMzMicsICdieXRlcyddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IGZpbmFsaXplVW53cmFwVHlwZXMgPSBbJ2J5dGVzMzInLCAndWludDY0JywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5cbi8qKiBNYXggdmFsdWUgZm9yIFNvbGlkaXR5IGB1aW50NjRgIC8gRVJDLTc5ODQgY29uZmlkZW50aWFsIGFtb3VudCBkb21haW4gKGBldWludDY0YCkuICovXG5leHBvcnQgY29uc3QgVUlOVDY0X01BWCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1bjtcbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpXG4gKiA9IGtlY2NhazI1NignZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzLGFkZHJlc3MsdWludDY0KScpWzA6NF1cbiAqL1xuZXhwb3J0IGNvbnN0IGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25NZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2RlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24nLCBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSkudG9TdHJpbmcoJ2hleCcpXG4pO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBBQ0wubXVsdGljYWxsKGJ5dGVzW10pXG4gKiA9IGtlY2NhazI1NignbXVsdGljYWxsKGJ5dGVzW10pJylbMDo0XVxuICogQUNMIGluaGVyaXRzIE9wZW5aZXBwZWxpbiBNdWx0aWNhbGxVcGdyYWRlYWJsZSDigJQgcHJlc2VydmVzIG1zZy5zZW5kZXIgdmlhIGRlbGVnYXRlY2FsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjbE11bHRpY2FsbE1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnbXVsdGljYWxsJywgWy4uLmFjbE11bHRpY2FsbFR5cGVzXSkudG9TdHJpbmcoJ2hleCcpXG4pO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBGb3J3YXJkZXJWNC5jYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpXG4gKiA9IGtlY2NhazI1NignY2FsbEZyb21QYXJlbnQoYWRkcmVzcyx1aW50MjU2LGJ5dGVzKScpWzA6NF1cbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGxGcm9tUGFyZW50TWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjYWxsRnJvbVBhcmVudCcsIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSkudG9TdHJpbmcoJ2hleCcpXG4pO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtMjAgYXBwcm92ZShhZGRyZXNzLHVpbnQyNTYpXG4gKiA9IGtlY2NhazI1NignYXBwcm92ZShhZGRyZXNzLHVpbnQyNTYpJylbMDo0XVxuICogVXNlZCBmb3IgZXhhY3QtYW1vdW50IChhbmQgYXBwcm92ZSgwKSByZXNldCkgYXBwcm92YWxzIG9mIHRoZSBFUkMtNzk4NCB3cmFwcGVyIGFzIHNwZW5kZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHByb3ZlTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoRXRoZXJldW1BYmkubWV0aG9kSUQoJ2FwcHJvdmUnLCBbLi4uYXBwcm92ZVR5cGVzXSkudG9TdHJpbmcoJ2hleCcpKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgRVJDLTc5ODQgd3JhcChhZGRyZXNzLHVpbnQyNTYpXG4gKiA9IGtlY2NhazI1Nignd3JhcChhZGRyZXNzLHVpbnQyNTYpJylbMDo0XVxuICogTG9ja3MgdW5kZXJseWluZyBFUkMtMjAgaW4gdGhlIHdyYXBwZXIgYW5kIG1pbnRzIGFuIGVuY3J5cHRlZCBiYWxhbmNlIHRvIGB0b2AuXG4gKi9cbmV4cG9ydCBjb25zdCB3cmFwTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoRXRoZXJldW1BYmkubWV0aG9kSUQoJ3dyYXAnLCBbLi4ud3JhcFR5cGVzXSkudG9TdHJpbmcoJ2hleCcpKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgRVJDLTc5ODQgdW53cmFwKGFkZHJlc3MsYWRkcmVzcyxieXRlczMyLGJ5dGVzKVxuICogPSBrZWNjYWsyNTYoJ3Vud3JhcChhZGRyZXNzLGFkZHJlc3MsYnl0ZXMzMixieXRlcyknKVswOjRdXG4gKiBCdXJucyBjb25maWRlbnRpYWwgYmFsYW5jZSBhbmQgcmVxdWVzdHMgcmVsZWFzZSBvZiB1bmRlcmx5aW5nIEVSQy0yMCBlc2Nyb3cuXG4gKi9cbmV4cG9ydCBjb25zdCB1bndyYXBNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgndW53cmFwJywgWy4uLnVud3JhcFR5cGVzXSkudG9TdHJpbmcoJ2hleCcpKTtcblxuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgRVJDLTc5ODQgZmluYWxpemVVbndyYXAoYnl0ZXMzMix1aW50NjQsYnl0ZXMpXG4gKiA9IGtlY2NhazI1NignZmluYWxpemVVbndyYXAoYnl0ZXMzMix1aW50NjQsYnl0ZXMpJylbMDo0XVxuICogQ29tcGxldGVzIHVuc2hpZWxkIGFmdGVyIG9yYWNsZSBkZWNyeXB0aW9uIG9mIHRoZSBwaGFzZS0xIHVud3JhcCByZXF1ZXN0LlxuICovXG5leHBvcnQgY29uc3QgZmluYWxpemVVbndyYXBNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZpbmFsaXplVW53cmFwJywgWy4uLmZpbmFsaXplVW53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jb2RpbmcgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGNvbmZpZGVudGlhbCBhbW91bnQgbWludGVkIGJ5IGB3cmFwKHRvLCBhbW91bnQpYCBmaXRzIGluIHVpbnQ2NCAoYGV1aW50NjRgKS5cbiAqXG4gKiBUaGUgd3JhcHBlciBtaW50cyBgZmxvb3IoYW1vdW50IC8gcmF0ZSgpKWAg4oCUIGBhbW91bnRgIGlzIGluIHVuZGVybHlpbmctdG9rZW4gYmFzZSB1bml0cyBhbmRcbiAqIGByYXRlKClgIGlzIGAxMCAqKiAodW5kZXJseWluZ0RlY2ltYWxzIC0gNilgICgxIHdoZW4gdGhlIHVuZGVybHlpbmcgaGFzIDw9IDYgZGVjaW1hbHMpIOKAlCBhbmRcbiAqIHJldmVydHMgaWYgdGhhdCBxdW90aWVudCBkb2VzIG5vdCBmaXQgdWludDY0LiBGb3IgYSByYXRlID4gMSB0aGUgdW5kZXJseWluZyBhbW91bnQgY2FuIHRoZXJlZm9yZVxuICogYmUgZmFyIGxhcmdlciB0aGFuIHVpbnQ2NCAoZS5nLiAxIGZ1bGwgMTgtZGVjaW1hbCB0b2tlbiBpcyAxZTE4IGF0IHJhdGUgMWUxMiwgbWludGluZyAxZTYpLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbW91bnQgb3IgcmF0ZSBpcyBpbnZhbGlkLCBvciBgZmxvb3IoYW1vdW50IC8gcmF0ZSlgIGV4Y2VlZHMgdWludDY0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NChhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgcmF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogdm9pZCB7XG4gIGxldCBhbW91bnRCbjogYmlnaW50O1xuICBsZXQgcmF0ZUJuOiBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgYW1vdW50Qm4gPSB0eXBlb2YgYW1vdW50ID09PSAnYmlnaW50JyA/IGFtb3VudCA6IEJpZ0ludChhbW91bnQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0OiBpbnZhbGlkIGFtb3VudCAnJHthbW91bnR9J2ApO1xuICB9XG4gIHRyeSB7XG4gICAgcmF0ZUJuID0gdHlwZW9mIHJhdGUgPT09ICdiaWdpbnQnID8gcmF0ZSA6IEJpZ0ludChyYXRlKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NDogaW52YWxpZCByYXRlICcke3JhdGV9J2ApO1xuICB9XG4gIGlmIChhbW91bnRCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IGFtb3VudCBtdXN0IGJlID4gMCcpO1xuICB9XG4gIGlmIChyYXRlQm4gPD0gMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fzc2VydFdyYXBBbW91bnRGaXRzVWludDY0OiByYXRlIG11c3QgYmUgPiAwJyk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIC8gcmF0ZUJuID4gVUlOVDY0X01BWCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IGFtb3VudCAvIHJhdGUgZXhjZWVkcyB1aW50NjQnKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZXMgRVJDLTIwIGBhcHByb3ZlKHNwZW5kZXIsIGFtb3VudClgIGNhbGxkYXRhIGZvciBFUkMtNzk4NCBzaGllbGQuXG4gKlxuICogVGhlIHNwZW5kZXIgaXMgdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyIGNvbnRyYWN0OyB0aGUgcmVzdWx0aW5nIGNhbGxkYXRhIGlzXG4gKiBzZW50IHRvIHRoZSB1bmRlcmx5aW5nIEVSQy0yMC4gRXhhY3QtYW1vdW50IGFwcHJvdmUgaXMgdXNlZCBmb3IgdGhlIHNoaWVsZFxuICogcGF0aDsgYGFtb3VudCA9IDBgIGlzIHRoZSBVU0RULXN0eWxlIGFsbG93YW5jZSByZXNldCB1c2VkIHdoZW5cbiAqIGByZXF1aXJlc0FwcHJvdmFsUmVzZXRgIGlzIHNldCBvbiB0aGUgd3JhcHBlciBwYWlyLlxuICpcbiAqIERvZXMgbm90IHNldCBnYXNMaW1pdCDigJQgV1Agb3ducyBnYXMuXG4gKlxuICogQHBhcmFtIHdyYXBwZXJBZGRyZXNzICBFUkMtNzk4NCB3cmFwcGVyIGNvbnRyYWN0IChzcGVuZGVyKVxuICogQHBhcmFtIGFtb3VudCAgICAgICAgICBFeGFjdCBhbGxvd2FuY2UgdG8gc2V0IChiYXNlIHVuaXRzKTsgYDBgIGZvciByZXNldFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHdyYXBwZXIgYWRkcmVzcyBpcyBpbnZhbGlkIG9yIGFtb3VudCBpcyBuZWdhdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcHByb3ZlQ2FsbGRhdGEod3JhcHBlckFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcge1xuICBsZXQgY2hlY2tzdW1tZWRXcmFwcGVyOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY2hlY2tzdW1tZWRXcmFwcGVyID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3Mod3JhcHBlckFkZHJlc3MpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkQXBwcm92ZUNhbGxkYXRhOiBpbnZhbGlkIHdyYXBwZXIgYWRkcmVzcyAnJHt3cmFwcGVyQWRkcmVzc30nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDwgMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkQXBwcm92ZUNhbGxkYXRhOiBhbW91bnQgbXVzdCBiZSA+PSAwJyk7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uYXBwcm92ZVR5cGVzXSwgW2NoZWNrc3VtbWVkV3JhcHBlciwgYW1vdW50Qm4udG9TdHJpbmcoKV0pO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtNzk4NCBgd3JhcCh0bywgYW1vdW50KWAgY2FsbGRhdGEgZm9yIHRoZSBzaGllbGQgcGF0aC5cbiAqXG4gKiBDYWxsZGF0YSBpcyBzZW50IHRvIHRoZSBjb25maWRlbnRpYWwgd3JhcHBlciBjb250cmFjdC4gYHRvYCBpcyB0aGUgcmVjaXBpZW50IG9mXG4gKiB0aGUgbWludGVkIGVuY3J5cHRlZCBiYWxhbmNlIChzZWxmLWRpcmVjdGVkIHNoaWVsZHMgdXNlIHRoZSB3YWxsZXQgYmFzZSBhZGRyZXNzKS5cbiAqIFdoZW4gYHJhdGVgIGlzIHByb3ZpZGVkLCB2YWxpZGF0ZXMgdGhhdCB0aGUgbWludGVkIGBmbG9vcihhbW91bnQgLyByYXRlKWAgZml0cyB1aW50NjQgKGBldWludDY0YCkuXG4gKiBgcmF0ZWAgaXMgbm90IGVuY29kZWQgaW4gY2FsbGRhdGEgKGRlc2VyaWFsaXplIHJvdW5kLXRyaXBzIG9taXQgaXQpLlxuICpcbiAqIERvZXMgbm90IHNldCBnYXNMaW1pdCDigJQgV1Agb3ducyBnYXMuXG4gKlxuICogQHBhcmFtIHRvICAgICAgUmVjaXBpZW50IG9mIGNvbmZpZGVudGlhbCB0b2tlbnMgKGNoZWNrc3VtbWVkIC8gbG93ZXJjYXNlZCBhY2NlcHRlZClcbiAqIEBwYXJhbSBhbW91bnQgIFVuZGVybHlpbmcgRVJDLTIwIGFtb3VudCB0byB3cmFwIChiYXNlIHVuaXRzKTsgbXVzdCBiZSA+IDBcbiAqIEBwYXJhbSByYXRlICAgIE9wdGlvbmFsIG9uLWNoYWluIHdyYXBwZXIgYHJhdGUoKWAgZm9yIHVpbnQ2NCB2YWxpZGF0aW9uXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhZGRyZXNzL2Ftb3VudC9yYXRlIGlzIGludmFsaWQgb3IgZmxvb3IoYW1vdW50IC8gcmF0ZSkgZXhjZWVkcyB1aW50NjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhcENhbGxkYXRhKFxuICB0bzogc3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgcmF0ZT86IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludFxuKTogc3RyaW5nIHtcbiAgbGV0IGNoZWNrc3VtbWVkVG86IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZFRvID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3ModG8pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkV3JhcENhbGxkYXRhOiBpbnZhbGlkIHRvIGFkZHJlc3MgJyR7dG99J2ApO1xuICB9XG5cbiAgbGV0IGFtb3VudEJuOiBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgYW1vdW50Qm4gPSB0eXBlb2YgYW1vdW50ID09PSAnYmlnaW50JyA/IGFtb3VudCA6IEJpZ0ludChhbW91bnQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkV3JhcENhbGxkYXRhOiBpbnZhbGlkIGFtb3VudCAnJHthbW91bnR9J2ApO1xuICB9XG4gIGlmIChhbW91bnRCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRXcmFwQ2FsbGRhdGE6IGFtb3VudCBtdXN0IGJlID4gMCcpO1xuICB9XG5cbiAgaWYgKHJhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0KGFtb3VudEJuLCByYXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCd3cmFwJywgWy4uLndyYXBUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi53cmFwVHlwZXNdLCBbY2hlY2tzdW1tZWRUbywgYW1vdW50Qm4udG9TdHJpbmcoKV0pO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBFUkMtNzk4NCBgd3JhcCh0bywgYW1vdW50KWAgY2FsbGRhdGEuXG4gKlxuICogQHBhcmFtIGRhdGEgQUJJLWVuY29kZWQgd3JhcCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBgeyB0bywgYW1vdW50IH1gIHdpdGggY2hlY2tzdW1tZWQgYHRvYCBhbmQgZGVjaW1hbC1zdHJpbmcgYGFtb3VudGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVdyYXBDYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7IHRvOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHdyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlV3JhcENhbGxkYXRhOiBleHBlY3RlZCB3cmFwIHNlbGVjdG9yICR7d3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLndyYXBUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIHJldHVybiB7XG4gICAgdG86IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKGRlY29kZWRbMF0pLFxuICAgIGFtb3VudDogZGVjb2RlZFsxXS50b1N0cmluZygpLFxuICB9O1xufVxuXG4vKipcbiAqIEVuY29kZXMgRVJDLTc5ODQgYHVud3JhcChmcm9tLCB0bywgZW5jcnlwdGVkQW1vdW50LCBpbnB1dFByb29mKWAgY2FsbGRhdGEgZm9yIHVuc2hpZWxkLlxuICpcbiAqIENhbGxkYXRhIGlzIHNlbnQgdG8gdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyLiBQaGFzZS0xIHVuc2hpZWxkIGlzIHNlbGYtZGlyZWN0ZWQ6XG4gKiBgZnJvbWAgYW5kIGB0b2AgYXJlIGJvdGggdGhlIHdhbGxldCBiYXNlIGFkZHJlc3MuIGBlbmNyeXB0ZWRBbW91bnRgIGlzIHRoZVxuICogRkhFLWVuY3J5cHRlZCBidXJuIGFtb3VudCAoYnl0ZXMzMiBoYW5kbGUpIGFuZCBgaW5wdXRQcm9vZmAgaXMgdGhlIFphbWFcbiAqIGVuY3J5cHRpb24gcHJvb2Yg4oCUIGJvdGggcHJvZHVjZWQgYnkgV1AgYFphbWFSZWxheWVyU2VydmljZS5lbmNyeXB0QW1vdW50YC5cbiAqXG4gKiBEb2VzIG5vdCBzZXQgZ2FzTGltaXQg4oCUIFdQIG93bnMgZ2FzLlxuICpcbiAqIEBwYXJhbSBmcm9tICAgICAgICAgICAgIFNvdXJjZSBvZiBjb25maWRlbnRpYWwgYmFsYW5jZSAoYmFzZSBhZGRyZXNzKVxuICogQHBhcmFtIHRvICAgICAgICAgICAgICAgUmVjaXBpZW50IG9mIHJlbGVhc2VkIEVSQy0yMCAoYmFzZSBhZGRyZXNzIGluIHYxKVxuICogQHBhcmFtIGVuY3J5cHRlZEFtb3VudCAgYnl0ZXMzMiBlbmNyeXB0ZWQgYW1vdW50IGhhbmRsZSAoMHgtcHJlZml4ZWQpXG4gKiBAcGFyYW0gaW5wdXRQcm9vZiAgICAgICBFbmNyeXB0aW9uIGlucHV0IHByb29mIGJ5dGVzICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICogQHRocm93cyB7RXJyb3J9IGlmIGFkZHJlc3NlcyBvciBjaXBoZXJ0ZXh0IGZpZWxkcyBhcmUgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVbndyYXBDYWxsZGF0YShmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGVuY3J5cHRlZEFtb3VudDogc3RyaW5nLCBpbnB1dFByb29mOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY2hlY2tzdW1tZWRGcm9tOiBzdHJpbmc7XG4gIGxldCBjaGVja3N1bW1lZFRvOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY2hlY2tzdW1tZWRGcm9tID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZnJvbSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRVbndyYXBDYWxsZGF0YTogaW52YWxpZCBmcm9tIGFkZHJlc3MgJyR7ZnJvbX0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZFRvID0gZXRoZXJzLnV0aWxzLmdldEFkZHJlc3ModG8pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkVW53cmFwQ2FsbGRhdGE6IGludmFsaWQgdG8gYWRkcmVzcyAnJHt0b30nYCk7XG4gIH1cblxuICBpZiAoIWV0aGVycy51dGlscy5pc0hleFN0cmluZyhlbmNyeXB0ZWRBbW91bnQpIHx8IGV0aGVycy51dGlscy5oZXhEYXRhTGVuZ3RoKGVuY3J5cHRlZEFtb3VudCkgIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFVud3JhcENhbGxkYXRhOiBlbmNyeXB0ZWRBbW91bnQgbXVzdCBiZSBhIDMyLWJ5dGUgaGV4IHN0cmluZywgZ290ICcke2VuY3J5cHRlZEFtb3VudH0nYCk7XG4gIH1cbiAgaWYgKCFldGhlcnMudXRpbHMuaXNIZXhTdHJpbmcoaW5wdXRQcm9vZikgfHwgZXRoZXJzLnV0aWxzLmhleERhdGFMZW5ndGgoaW5wdXRQcm9vZikgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkVW53cmFwQ2FsbGRhdGE6IGlucHV0UHJvb2YgbXVzdCBiZSBhIG5vbi1lbXB0eSBoZXggc3RyaW5nLCBnb3QgJyR7aW5wdXRQcm9vZn0nYCk7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgndW53cmFwJywgWy4uLnVud3JhcFR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgWy4uLnVud3JhcFR5cGVzXSxcbiAgICBbY2hlY2tzdW1tZWRGcm9tLCBjaGVja3N1bW1lZFRvLCB0b0J1ZmZlcihlbmNyeXB0ZWRBbW91bnQpLCB0b0J1ZmZlcihpbnB1dFByb29mKV1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgRVJDLTc5ODQgYHVud3JhcChmcm9tLCB0bywgZW5jcnlwdGVkQW1vdW50LCBpbnB1dFByb29mKWAgY2FsbGRhdGEuXG4gKlxuICogQHBhcmFtIGRhdGEgQUJJLWVuY29kZWQgdW53cmFwIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVVud3JhcENhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHtcbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xuICBlbmNyeXB0ZWRBbW91bnQ6IHN0cmluZztcbiAgaW5wdXRQcm9vZjogc3RyaW5nO1xufSB7XG4gIGlmICghZGF0YS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgodW53cmFwTWV0aG9kSWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZVVud3JhcENhbGxkYXRhOiBleHBlY3RlZCB1bndyYXAgc2VsZWN0b3IgJHt1bndyYXBNZXRob2RJZH0sIGdvdCAke2RhdGEuc2xpY2UoMCwgMTApfWApO1xuICB9XG4gIGNvbnN0IGFiaUNvZGVyID0gbmV3IGV0aGVycy51dGlscy5BYmlDb2RlcigpO1xuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi51bndyYXBUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIHJldHVybiB7XG4gICAgZnJvbTogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZGVjb2RlZFswXSksXG4gICAgdG86IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKGRlY29kZWRbMV0pLFxuICAgIGVuY3J5cHRlZEFtb3VudDogZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFsyXSksXG4gICAgaW5wdXRQcm9vZjogZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFszXSksXG4gIH07XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtNzk4NCBgZmluYWxpemVVbndyYXAocmVxdWVzdElkLCBjbGVhcnRleHRBbW91bnQsIGRlY3J5cHRpb25Qcm9vZilgIGNhbGxkYXRhLlxuICpcbiAqIENhbGxkYXRhIGlzIHNlbnQgdG8gdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyIHRvIGNvbXBsZXRlIHVuc2hpZWxkIHBoYXNlLTIgYWZ0ZXJcbiAqIHRoZSBaYW1hIG9yYWNsZSByZXR1cm5zIGEgY2xlYXJ0ZXh0IGFtb3VudCBhbmQgZGVjcnlwdGlvbiBwcm9vZiBmb3IgdGhlIHVud3JhcFxuICogcmVxdWVzdCBjcmVhdGVkIGluIHBoYXNlLTEuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdElkICAgICAgICAgYnl0ZXMzMiB1bndyYXAgcmVxdWVzdCBpZCAoMHgtcHJlZml4ZWQpXG4gKiBAcGFyYW0gY2xlYXJ0ZXh0QW1vdW50ICAgRGVjcnlwdGVkIGNvbmZpZGVudGlhbCBhbW91bnQgKHVpbnQ2NCBkb21haW4pOyBtdXN0IGJlID4gMFxuICogQHBhcmFtIGRlY3J5cHRpb25Qcm9vZiAgIE9yYWNsZSBkZWNyeXB0aW9uIHByb29mIGJ5dGVzICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICogQHRocm93cyB7RXJyb3J9IGlmIHJlcXVlc3RJZCwgYW1vdW50LCBvciBwcm9vZiBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbmFsaXplVW53cmFwQ2FsbGRhdGEoXG4gIHJlcXVlc3RJZDogc3RyaW5nLFxuICBjbGVhcnRleHRBbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgZGVjcnlwdGlvblByb29mOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICghZXRoZXJzLnV0aWxzLmlzSGV4U3RyaW5nKHJlcXVlc3RJZCkgfHwgZXRoZXJzLnV0aWxzLmhleERhdGFMZW5ndGgocmVxdWVzdElkKSAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YTogcmVxdWVzdElkIG11c3QgYmUgYSAzMi1ieXRlIGhleCBzdHJpbmcsIGdvdCAnJHtyZXF1ZXN0SWR9J2ApO1xuICB9XG5cbiAgbGV0IGFtb3VudEJuOiBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgYW1vdW50Qm4gPSB0eXBlb2YgY2xlYXJ0ZXh0QW1vdW50ID09PSAnYmlnaW50JyA/IGNsZWFydGV4dEFtb3VudCA6IEJpZ0ludChjbGVhcnRleHRBbW91bnQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YTogaW52YWxpZCBjbGVhcnRleHRBbW91bnQgJyR7Y2xlYXJ0ZXh0QW1vdW50fSdgKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPD0gMG4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YTogY2xlYXJ0ZXh0QW1vdW50IG11c3QgYmUgPiAwJyk7XG4gIH1cbiAgaWYgKGFtb3VudEJuID4gVUlOVDY0X01BWCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiBjbGVhcnRleHRBbW91bnQgZXhjZWVkcyB1aW50NjQnKTtcbiAgfVxuXG4gIGlmICghZXRoZXJzLnV0aWxzLmlzSGV4U3RyaW5nKGRlY3J5cHRpb25Qcm9vZikgfHwgZXRoZXJzLnV0aWxzLmhleERhdGFMZW5ndGgoZGVjcnlwdGlvblByb29mKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBidWlsZEZpbmFsaXplVW53cmFwQ2FsbGRhdGE6IGRlY3J5cHRpb25Qcm9vZiBtdXN0IGJlIGEgbm9uLWVtcHR5IGhleCBzdHJpbmcsIGdvdCAnJHtkZWNyeXB0aW9uUHJvb2Z9J2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZpbmFsaXplVW53cmFwJywgWy4uLmZpbmFsaXplVW53cmFwVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uZmluYWxpemVVbndyYXBUeXBlc10sXG4gICAgW3RvQnVmZmVyKHJlcXVlc3RJZCksIGFtb3VudEJuLnRvU3RyaW5nKCksIHRvQnVmZmVyKGRlY3J5cHRpb25Qcm9vZildXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIEVSQy03OTg0IGBmaW5hbGl6ZVVud3JhcChyZXF1ZXN0SWQsIGNsZWFydGV4dEFtb3VudCwgZGVjcnlwdGlvblByb29mKWAgY2FsbGRhdGEuXG4gKlxuICogQHBhcmFtIGRhdGEgQUJJLWVuY29kZWQgZmluYWxpemVVbndyYXAgY2FsbGRhdGEgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmluYWxpemVVbndyYXBDYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICBjbGVhcnRleHRBbW91bnQ6IHN0cmluZztcbiAgZGVjcnlwdGlvblByb29mOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChmaW5hbGl6ZVVud3JhcE1ldGhvZElkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGRlY29kZUZpbmFsaXplVW53cmFwQ2FsbGRhdGE6IGV4cGVjdGVkIGZpbmFsaXplVW53cmFwIHNlbGVjdG9yICR7ZmluYWxpemVVbndyYXBNZXRob2RJZH0sIGdvdCAke2RhdGEuc2xpY2UoXG4gICAgICAgIDAsXG4gICAgICAgIDEwXG4gICAgICApfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGFiaUNvZGVyID0gbmV3IGV0aGVycy51dGlscy5BYmlDb2RlcigpO1xuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5maW5hbGl6ZVVud3JhcFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0SWQ6IGV0aGVycy51dGlscy5oZXhsaWZ5KGRlY29kZWRbMF0pLFxuICAgIGNsZWFydGV4dEFtb3VudDogZGVjb2RlZFsxXS50b1N0cmluZygpLFxuICAgIGRlY3J5cHRpb25Qcm9vZjogZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFsyXSksXG4gIH07XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIHNpbmdsZSBBQ0wuZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbigpIGNhbGwuXG4gKlxuICogR3JhbnRzIGBkZWxlZ2F0ZUFkZHJlc3NgIHRoZSByaWdodCB0byBkZWNyeXB0IEVSQy03OTg0IHRva2VuIGJhbGFuY2VzIG9uXG4gKiBiZWhhbGYgb2YgdGhlIGNhbGxpbmcgYWRkcmVzcyAobXNnLnNlbmRlcikgZm9yIHRoZSBzcGVjaWZpZWQgdG9rZW4gY29udHJhY3QuXG4gKlxuICogQHBhcmFtIGRlbGVnYXRlQWRkcmVzcyAgICAgICBCaXRHbyBlbnRlcnByaXNlIHZpZXdpbmcga2V5IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkNvbnRyYWN0QWRkcmVzcyAgRVJDLTc5ODQgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICogQHBhcmFtIGV4cGlyeVRpbWVzdGFtcCAgICAgICBVbml4IHNlY29uZHM7IHJlY29tbWVuZGVkOiBNYXRoLmZsb29yKERhdGUubm93KCkvMTAwMCkgKyAzNjUqODY0MDBcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gIGRlbGVnYXRlQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBleHBpcnlUaW1lc3RhbXA6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2RlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24nLCBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sXG4gICAgW2RlbGVnYXRlQWRkcmVzcywgdG9rZW5Db250cmFjdEFkZHJlc3MsIGV4cGlyeVRpbWVzdGFtcF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgTiBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uIGNhbGxzIGJhdGNoZWQgaW5zaWRlIEFDTC5tdWx0aWNhbGwoKS5cbiAqXG4gKiBQcm9kdWNlcyBhIHNpbmdsZSBUWCB0aGF0IGdyYW50cyBkZWxlZ2F0aW9uIGZvciBhbGwgc3BlY2lmaWVkIHRva2VuIGNvbnRyYWN0cy5cbiAqIFJlcXVpcmVzIHRva2VuQ29udHJhY3RBZGRyZXNzZXMubGVuZ3RoID49IDEuXG4gKiBOb3RlOiBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIgYWx3YXlzIHVzZXMgdGhpcyBmdW5jdGlvbiAoZXZlbiBmb3IgYSBzaW5nbGUgdG9rZW4pXG4gKiB0byBrZWVwIHRoZSB0cmFuc2FjdGlvbiBzaGFwZSBjb25zaXN0ZW50IHJlZ2FyZGxlc3Mgb2YgdG9rZW4gY291bnQuXG4gKlxuICogQHBhcmFtIGRlbGVnYXRlQWRkcmVzcyAgICAgICAgICBCaXRHbyBlbnRlcnByaXNlIHZpZXdpbmcga2V5IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzICAgQXJyYXkgb2YgRVJDLTc5ODQgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzXG4gKiBAcGFyYW0gZXhwaXJ5VGltZXN0YW1wICAgICAgICAgIFVuaXggc2Vjb25kc1xuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShcbiAgZGVsZWdhdGVBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzZXM6IHN0cmluZ1tdLFxuICBleHBpcnlUaW1lc3RhbXA6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgaWYgKHRva2VuQ29udHJhY3RBZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YTogdG9rZW5Db250cmFjdEFkZHJlc3NlcyBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgLy8gQnVpbGQgZWFjaCBpbm5lciBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uIGNhbGwgYXMgcmF3IGJ5dGVzXG4gIGNvbnN0IGlubmVyQ2FsbHM6IEJ1ZmZlcltdID0gdG9rZW5Db250cmFjdEFkZHJlc3Nlcy5tYXAoKHRva2VuQWRkcmVzcykgPT4ge1xuICAgIGNvbnN0IGlubmVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2RlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24nLCBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSk7XG4gICAgY29uc3QgaW5uZXJBcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgICAgWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sXG4gICAgICBbZGVsZWdhdGVBZGRyZXNzLCB0b2tlbkFkZHJlc3MsIGV4cGlyeVRpbWVzdGFtcF1cbiAgICApO1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtpbm5lck1ldGhvZCwgaW5uZXJBcmdzXSk7XG4gIH0pO1xuXG4gIC8vIEVuY29kZSBvdXRlciBtdWx0aWNhbGwoYnl0ZXNbXSlcbiAgLy8gZXRoZXJldW1qcy1hYmkgdjAuNi54IGhhcyBhIGJ1ZyB3aGVyZSBpdCBvbWl0cyB0aGUgcGVyLWVsZW1lbnQgb2Zmc2V0IHRhYmxlXG4gIC8vIGZvciBieXRlc1tdLCBwcm9kdWNpbmcgbWFsZm9ybWVkIGNhbGxkYXRhIHRoYXQgb24tY2hhaW4gQUJJIGRlY29kZXJzIHJlamVjdC5cbiAgLy8gVXNlIGV0aGVycyBBYmlDb2RlciB3aGljaCBjb3JyZWN0bHkgZW1pdHMgdGhlIGhlYWQgb2Zmc2V0IHdvcmRzLlxuICBjb25zdCBvdXRlck1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKTtcbiAgY29uc3Qgb3V0ZXJBcmdzID0gQnVmZmVyLmZyb20oXG4gICAgbmV3IGV0aGVycy51dGlscy5BYmlDb2RlcigpLmVuY29kZShbLi4uYWNsTXVsdGljYWxsVHlwZXNdLCBbaW5uZXJDYWxsc10pLnNsaWNlKDIpLFxuICAgICdoZXgnXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbb3V0ZXJNZXRob2QsIG91dGVyQXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogV3JhcHMgY2FsbGRhdGEgaW4gYSBGb3J3YXJkZXJWNC5jYWxsRnJvbVBhcmVudCh0YXJnZXQsIDAsIGRhdGEpIGNhbGwuXG4gKlxuICogVXNlZCB3aGVuIGEgZm9yd2FyZGVyIGNvbnRyYWN0IG11c3QgYmUgbXNnLnNlbmRlciBmb3IgYW4gZXh0ZXJuYWwgY29udHJhY3RcbiAqIGNhbGwg4oCUIGZvciBleGFtcGxlLCB3aGVuIHRoZSBmb3J3YXJkZXIgaXRzZWxmIG5lZWRzIHRvIGNhbGxcbiAqIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKCkgc28gdGhhdCBpdHMgb3duIGJhbGFuY2UgY2FuIGJlIGRlY3J5cHRlZC5cbiAqXG4gKiBPbmx5IHRoZSBwYXJlbnRBZGRyZXNzIChyb290IHdhbGxldCkgaXMgYWxsb3dlZCB0byBjYWxsIGNhbGxGcm9tUGFyZW50XG4gKiAoZW5mb3JjZWQgYnkgdGhlIGZvcndhcmRlcidzIG9ubHlQYXJlbnQgbW9kaWZpZXIpLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRBZGRyZXNzICBBZGRyZXNzIG9mIHRoZSBjb250cmFjdCB0aGUgZm9yd2FyZGVyIHdpbGwgY2FsbCAoZS5nLiBBQ0wpXG4gKiBAcGFyYW0gY2FsbGRhdGEgICAgICAgQUJJLWVuY29kZWQgaW5uZXIgY2FsbGRhdGEgKGUuZy4gZnJvbSBidWlsZERlbGVnYXRpb25DYWxsZGF0YSlcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxGcm9tUGFyZW50IGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEluQ2FsbEZyb21QYXJlbnQodGFyZ2V0QWRkcmVzczogc3RyaW5nLCBjYWxsZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sXG4gICAgW1xuICAgICAgdGFyZ2V0QWRkcmVzcyxcbiAgICAgIDAsIC8vIHZhbHVlOiBubyBFVEggdHJhbnNmZXJcbiAgICAgIHRvQnVmZmVyKGNhbGxkYXRhKSwgLy8gaW5uZXIgY2FsbGRhdGEgYXMgYnl0ZXNcbiAgICBdXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHRva2VuIGNvbnRyYWN0IGFkZHJlc3NlcyBmcm9tIGRlbGVnYXRpb24gY2FsbGRhdGEuXG4gKlxuICogSGFuZGxlcyB0d28gc2hhcGVzIG9mIGNhbGxkYXRhOlxuICogICAtIERpcmVjdCBBQ0wubXVsdGljYWxsKGJ5dGVzW10pIChyb290IHdhbGxldCBwYXRoKVxuICogICAtIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsIHVpbnQyNTYsIGJ5dGVzKSB3cmFwcGluZyBhIG11bHRpY2FsbCAoZm9yd2FyZGVyIHBhdGgpXG4gKlxuICogQHBhcmFtIGNhbGxkYXRhICBBQkktZW5jb2RlZCBkZWxlZ2F0aW9uIGNhbGxkYXRhICgweC1wcmVmaXhlZCBvciByYXcgaGV4KVxuICogQHJldHVybnMgQXJyYXkgb2YgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzIChsb3dlcmNhc2UpIGZvdW5kIGluIHRoZSBkZWxlZ2F0aW9uIGNhbGxzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGNhbGxkYXRhIGRvZXMgbm90IHN0YXJ0IHdpdGggYSByZWNvZ25pc2VkIG1ldGhvZCBzZWxlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRhdGEgPSBjYWxsZGF0YS5zdGFydHNXaXRoKCcweCcpID8gY2FsbGRhdGEgOiAnMHgnICsgY2FsbGRhdGE7XG4gIGNvbnN0IG1ldGhvZElkID0gZGF0YS5zbGljZSgwLCAxMCk7XG4gIGNvbnN0IGFiaUNvZGVyID0gbmV3IGV0aGVycy51dGlscy5BYmlDb2RlcigpO1xuXG4gIGxldCBtdWx0aWNhbGxIZXg6IHN0cmluZztcblxuICBpZiAobWV0aG9kSWQgPT09IGNhbGxGcm9tUGFyZW50TWV0aG9kSWQpIHtcbiAgICAvLyBEZWNvZGUgY2FsbEZyb21QYXJlbnQoYWRkcmVzcywgdWludDI1NiwgYnl0ZXMpIOKAlCBpbm5lciBieXRlcyBpcyB0aGUgZnVsbCBtdWx0aWNhbGwgY2FsbGRhdGEuXG4gICAgLy8gZXRoZXJzIHY1IHJldHVybnMgYGJ5dGVzYCBhcyBhIGhleCBzdHJpbmc7IHVzZSBoZXhsaWZ5IHRvIG5vcm1hbGlzZSB0byBhIDB4LXByZWZpeGVkIGhleCBzdHJpbmdcbiAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHJ1bnRpbWUgcmV0dXJucyBhIHN0cmluZyBvciBhIFVpbnQ4QXJyYXkuXG4gICAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gICAgbXVsdGljYWxsSGV4ID0gZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFsyXSk7XG4gIH0gZWxzZSBpZiAobWV0aG9kSWQgPT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgbXVsdGljYWxsSGV4ID0gZGF0YTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIGRlbGVnYXRpb24gY2FsbGRhdGEnKTtcbiAgfVxuXG4gIGlmIChtdWx0aWNhbGxIZXguc2xpY2UoMCwgMTApICE9PSBhY2xNdWx0aWNhbGxNZXRob2RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YScpO1xuICB9XG5cbiAgLy8gRGVjb2RlIG11bHRpY2FsbChieXRlc1tdKSDigJQgZWFjaCBlbGVtZW50IGlzIGFuIGlubmVyIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbC5cbiAgLy8gZXRoZXJzIHY1IHJldHVybnMgYnl0ZXNbXSBlbGVtZW50cyBhcyBoZXggc3RyaW5nczsgdXNlIGhleGxpZnkgdG8gbm9ybWFsaXNlIGVhY2ggZWxlbWVudC5cbiAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbJ2J5dGVzW10nXSwgJzB4JyArIG11bHRpY2FsbEhleC5zbGljZSgxMCkpO1xuICBjb25zdCBpbm5lckNhbGxzOiB1bmtub3duW10gPSBkZWNvZGVkWzBdO1xuXG4gIGNvbnN0IHRva2VuQWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGlubmVyQ2FsbCBvZiBpbm5lckNhbGxzKSB7XG4gICAgY29uc3QgaW5uZXJIZXggPSBldGhlcnMudXRpbHMuaGV4bGlmeShpbm5lckNhbGwgYXMgZXRoZXJzLnV0aWxzLkJ5dGVzTGlrZSkuc2xpY2UoMik7IC8vIHN0cmlwIDB4XG4gICAgY29uc3QgaW5uZXJNZXRob2RJZCA9ICcweCcgKyBpbm5lckhleC5zbGljZSgwLCA4KTtcbiAgICBpZiAoaW5uZXJNZXRob2RJZCAhPT0gZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRGVjb2RlIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyBkZWxlZ2F0ZSwgYWRkcmVzcyB0b2tlbkFkZHJlc3MsIHVpbnQ2NCBleHBpcnkpXG4gICAgY29uc3QgaW5uZXJEZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdLCAnMHgnICsgaW5uZXJIZXguc2xpY2UoOCkpO1xuICAgIHRva2VuQWRkcmVzc2VzLnB1c2goKGlubmVyRGVjb2RlZFsxXSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgcmV0dXJuIHRva2VuQWRkcmVzc2VzO1xufVxuXG4vKipcbiAqIEVuY29kZXMgY29uZmlkZW50aWFsVHJhbnNmZXIoYWRkcmVzcyB0bywgYnl0ZXMzMiBlbmNyeXB0ZWRIYW5kbGUpIGNhbGxkYXRhLlxuICogVXNlcyB0aGUgbm8tcHJvb2YgdmFyaWFudCAoc2VsZWN0b3IgMHg1YmViZWQ3ZSkg4oCUIHZhbGlkIHdoZW4gdGhlIGNhbGxlciAoZm9yd2FyZGVyKVxuICogaXMgYWxyZWFkeSBBQ0wtYWxsb3dlZCBvbiB0aGUgaGFuZGxlIGZyb20gd2hlbiBpdCByZWNlaXZlZCB0aGUgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSB0b0FkZHJlc3MgICAgICAgQWRkcmVzcyB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgdG9rZW5zXG4gKiBAcGFyYW0gZW5jcnlwdGVkSGFuZGxlIGJ5dGVzMzIgZW5jcnlwdGVkIGJhbGFuY2UgaGFuZGxlIGZyb20gY29uZmlkZW50aWFsQmFsYW5jZU9mXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhKHRvQWRkcmVzczogc3RyaW5nLCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IEJ1ZmZlci5mcm9tKGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZk1ldGhvZElkLnNsaWNlKDIpLCAnaGV4Jyk7XG4gIGNvbnN0IGhhbmRsZUJ1ZmZlciA9IHRvQnVmZmVyKGVuY3J5cHRlZEhhbmRsZSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoWy4uLmNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzXSwgW3RvQWRkcmVzcywgaGFuZGxlQnVmZmVyXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBmdWxsIGZsdXNoIGNhbGxkYXRhIGZvciBFUkMtNzk4NCBmb3J3YXJkZXIgY29uc29saWRhdGlvbjpcbiAqICAgY2FsbEZyb21QYXJlbnQodG9rZW5Db250cmFjdEFkZHJlc3MsIDAsIGNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSkpXG4gKiBUaGUgZm9yd2FyZGVyIGV4ZWN1dGVzIHRoZSBpbm5lciBjb25maWRlbnRpYWxUcmFuc2ZlciB3aXRoIG1zZy5zZW5kZXIgPSBmb3J3YXJkZXIuXG4gKlxuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzICBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gcGFyZW50QWRkcmVzcyAgICAgICAgIFJvb3Qgd2FsbGV0IGFkZHJlc3MgKGRlc3RpbmF0aW9uIG9mIGZsdXNoZWQgdG9rZW5zKVxuICogQHBhcmFtIGVuY3J5cHRlZEhhbmRsZSAgICAgICBieXRlczMyIGVuY3J5cHRlZCBiYWxhbmNlIGhhbmRsZSBmcm9tIGNvbmZpZGVudGlhbEJhbGFuY2VPZlxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEoXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIHBhcmVudEFkZHJlc3M6IHN0cmluZyxcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGEgPSBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyQnlIYW5kbGVDYWxsZGF0YShwYXJlbnRBZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUpO1xuICByZXR1cm4gd3JhcEluQ2FsbEZyb21QYXJlbnQodG9rZW5Db250cmFjdEFkZHJlc3MsIGlubmVyQ2FsbGRhdGEpO1xufVxuXG4vKipcbiAqIERlY29kZXMgYSBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBjYWxsZGF0YS5cbiAqIFN0cmlwcyB0aGUgb3V0ZXIgY2FsbEZyb21QYXJlbnQgd3JhcHBlciBhbmQgdGhlIGlubmVyIGNvbmZpZGVudGlhbFRyYW5zZmVyLlxuICogUmV0dXJucyB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCBwYXJlbnRBZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUgfS5cbiAqXG4gKiBAcGFyYW0gZGF0YSAgQUJJLWVuY29kZWQgZmx1c2ggY2FsbGRhdGEgKDB4LXByZWZpeGVkKVxuICogQHJldHVybnMgRGVjb2RlZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEoZGF0YTogc3RyaW5nKToge1xuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xuICBwYXJlbnRBZGRyZXNzOiBzdHJpbmc7XG4gIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nO1xufSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKGNhbGxGcm9tUGFyZW50TWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gY2FsbGRhdGE6IGV4cGVjdGVkIGNhbGxGcm9tUGFyZW50IHNlbGVjdG9yLCBnb3QgJHtkYXRhLnNsaWNlKDAsIDEwKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFiaUNvZGVyID0gbmV3IGV0aGVycy51dGlscy5BYmlDb2RlcigpO1xuICBjb25zdCBvdXRlckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLCAnMHgnICsgZGF0YS5zbGljZSgxMCkpO1xuICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nID0gb3V0ZXJEZWNvZGVkWzBdO1xuICBjb25zdCBpbm5lckNhbGxkYXRhOiBzdHJpbmcgPSBldGhlcnMudXRpbHMuaGV4bGlmeShvdXRlckRlY29kZWRbMl0pO1xuXG4gIGlmICghaW5uZXJDYWxsZGF0YS5zdGFydHNXaXRoKGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZk1ldGhvZElkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGlubmVyIGNhbGxkYXRhOiBleHBlY3RlZCBjb25maWRlbnRpYWxUcmFuc2ZlciBzZWxlY3RvciwgZ290ICR7aW5uZXJDYWxsZGF0YS5zbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgMTBcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbm5lckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzXSwgJzB4JyArIGlubmVyQ2FsbGRhdGEuc2xpY2UoMTApKTtcbiAgY29uc3QgcGFyZW50QWRkcmVzczogc3RyaW5nID0gaW5uZXJEZWNvZGVkWzBdO1xuICBjb25zdCBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZyA9IGJ1ZmZlclRvSGV4KHRvQnVmZmVyKGlubmVyRGVjb2RlZFsxXSkpO1xuXG4gIHJldHVybiB7XG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgcGFyZW50QWRkcmVzcyxcbiAgICBlbmNyeXB0ZWRIYW5kbGUsXG4gIH07XG59XG4iXX0=
|
|
527
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUZBLGdFQXNCQztBQWlCRCxvREFxQkM7QUFTRCxzREFjQztBQWtCRCw4Q0E2QkM7QUFRRCxnREFVQztBQW1CRCxrREEyQkM7QUFPRCxvREFpQkM7QUFpQkQsa0VBa0NDO0FBT0Qsb0VBb0JDO0FBYUQsMERBV0M7QUFlRCw0RUE2QkM7QUFnQkQsb0RBV0M7QUFhRCxnR0F5Q0M7QUFXRCw4RkFLQztBQVlELDBGQU9DO0FBVUQsNEZBa0NDO0FBcm1CRCxxREFBc0U7QUFDdEUsb0VBQXlDO0FBQ3pDLG1DQUFnQztBQUNoQyw2Q0FBcUc7QUFFckcsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsNEJBQTRCO0FBQ2YsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDM0UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFDO0FBQ3pDLFFBQUEsWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBQy9DLFFBQUEsU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBQzVDLFFBQUEsV0FBVyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDbEUsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFFM0UseUZBQXlGO0FBQzVFLFFBQUEsVUFBVSxHQUFHLHFCQUFxQixDQUFDO0FBQ2hEOzs7R0FHRztBQUNVLFFBQUEsaUNBQWlDLEdB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RUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsNkNBQWdDLENBQUMsRUFBRSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVHLE1BQU0sYUFBYSxHQUFXLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLGVBQWUsR0FBVyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixhQUFhO1FBQ2IsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFkZEhleFByZWZpeCwgYnVmZmVyVG9IZXgsIHRvQnVmZmVyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzIH0gZnJvbSAnLi93YWxsZXRVdGlsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBBQkkgcGFyYW1ldGVyIHR5cGUgYXJyYXlzXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzID0gWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAndWludDY0J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2JywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsVHlwZXMgPSBbJ2J5dGVzW10nXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBhcHByb3ZlVHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHdyYXBUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdW53cmFwVHlwZXMgPSBbJ2FkZHJlc3MnLCAnYWRkcmVzcycsICdieXRlczMyJywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgZmluYWxpemVVbndyYXBUeXBlcyA9IFsnYnl0ZXMzMicsICd1aW50NjQnLCAnYnl0ZXMnXSBhcyBjb25zdDtcblxuLyoqIE1heCB2YWx1ZSBmb3IgU29saWRpdHkgYHVpbnQ2NGAgLyBFUkMtNzk4NCBjb25maWRlbnRpYWwgYW1vdW50IGRvbWFpbiAoYGV1aW50NjRgKS4gKi9cbmV4cG9ydCBjb25zdCBVSU5UNjRfTUFYID0gMTg0NDY3NDQwNzM3MDk1NTE2MTVuO1xuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NClcbiAqID0ga2VjY2FrMjU2KCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSlcbiAqID0ga2VjY2FrMjU2KCdtdWx0aWNhbGwoYnl0ZXNbXSknKVswOjRdXG4gKiBBQ0wgaW5oZXJpdHMgT3BlblplcHBlbGluIE11bHRpY2FsbFVwZ3JhZGVhYmxlIOKAlCBwcmVzZXJ2ZXMgbXNnLnNlbmRlciB2aWEgZGVsZWdhdGVjYWxsLlxuICovXG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcylcbiAqID0ga2VjY2FrMjU2KCdjYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEVSQy0yMCBhcHByb3ZlKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCdhcHByb3ZlKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBVc2VkIGZvciBleGFjdC1hbW91bnQgKGFuZCBhcHByb3ZlKDApIHJlc2V0KSBhcHByb3ZhbHMgb2YgdGhlIEVSQy03OTg0IHdyYXBwZXIgYXMgc3BlbmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcHJvdmVNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCB3cmFwKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCd3cmFwKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBMb2NrcyB1bmRlcmx5aW5nIEVSQy0yMCBpbiB0aGUgd3JhcHBlciBhbmQgbWludHMgYW4gZW5jcnlwdGVkIGJhbGFuY2UgdG8gYHRvYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHdyYXBNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnd3JhcCcsIFsuLi53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCB1bndyYXAoYWRkcmVzcyxhZGRyZXNzLGJ5dGVzMzIsYnl0ZXMpXG4gKiA9IGtlY2NhazI1NigndW53cmFwKGFkZHJlc3MsYWRkcmVzcyxieXRlczMyLGJ5dGVzKScpWzA6NF1cbiAqIEJ1cm5zIGNvbmZpZGVudGlhbCBiYWxhbmNlIGFuZCByZXF1ZXN0cyByZWxlYXNlIG9mIHVuZGVybHlpbmcgRVJDLTIwIGVzY3Jvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVud3JhcE1ldGhvZElkID0gYWRkSGV4UHJlZml4KEV0aGVyZXVtQWJpLm1ldGhvZElEKCd1bndyYXAnLCBbLi4udW53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCBmaW5hbGl6ZVVud3JhcChieXRlczMyLHVpbnQ2NCxieXRlcylcbiAqID0ga2VjY2FrMjU2KCdmaW5hbGl6ZVVud3JhcChieXRlczMyLHVpbnQ2NCxieXRlcyknKVswOjRdXG4gKiBDb21wbGV0ZXMgdW5zaGllbGQgYWZ0ZXIgb3JhY2xlIGRlY3J5cHRpb24gb2YgdGhlIHBoYXNlLTEgdW53cmFwIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZVVud3JhcE1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmluYWxpemVVbndyYXAnLCBbLi4uZmluYWxpemVVbndyYXBUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGluZyBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgY29uZmlkZW50aWFsIGFtb3VudCBtaW50ZWQgYnkgYHdyYXAodG8sIGFtb3VudClgIGZpdHMgaW4gdWludDY0IChgZXVpbnQ2NGApLlxuICpcbiAqIFRoZSB3cmFwcGVyIG1pbnRzIGBmbG9vcihhbW91bnQgLyByYXRlKCkpYCDigJQgYGFtb3VudGAgaXMgaW4gdW5kZXJseWluZy10b2tlbiBiYXNlIHVuaXRzIGFuZFxuICogYHJhdGUoKWAgaXMgYDEwICoqICh1bmRlcmx5aW5nRGVjaW1hbHMgLSA2KWAgKDEgd2hlbiB0aGUgdW5kZXJseWluZyBoYXMgPD0gNiBkZWNpbWFscykg4oCUIGFuZFxuICogcmV2ZXJ0cyBpZiB0aGF0IHF1b3RpZW50IGRvZXMgbm90IGZpdCB1aW50NjQuIEZvciBhIHJhdGUgPiAxIHRoZSB1bmRlcmx5aW5nIGFtb3VudCBjYW4gdGhlcmVmb3JlXG4gKiBiZSBmYXIgbGFyZ2VyIHRoYW4gdWludDY0IChlLmcuIDEgZnVsbCAxOC1kZWNpbWFsIHRva2VuIGlzIDFlMTggYXQgcmF0ZSAxZTEyLCBtaW50aW5nIDFlNikuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IGlmIGFtb3VudCBvciByYXRlIGlzIGludmFsaWQsIG9yIGBmbG9vcihhbW91bnQgLyByYXRlKWAgZXhjZWVkcyB1aW50NjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0KGFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCByYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiB2b2lkIHtcbiAgbGV0IGFtb3VudEJuOiBiaWdpbnQ7XG4gIGxldCByYXRlQm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByYXRlQm4gPSB0eXBlb2YgcmF0ZSA9PT0gJ2JpZ2ludCcgPyByYXRlIDogQmlnSW50KHJhdGUpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0OiBpbnZhbGlkIHJhdGUgJyR7cmF0ZX0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NDogYW1vdW50IG11c3QgYmUgPiAwJyk7XG4gIH1cbiAgaWYgKHJhdGVCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IHJhdGUgbXVzdCBiZSA+IDAnKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gLyByYXRlQm4gPiBVSU5UNjRfTUFYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NDogYW1vdW50IC8gcmF0ZSBleGNlZWRzIHVpbnQ2NCcpO1xuICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtMjAgYGFwcHJvdmUoc3BlbmRlciwgYW1vdW50KWAgY2FsbGRhdGEgZm9yIEVSQy03OTg0IHNoaWVsZC5cbiAqXG4gKiBUaGUgc3BlbmRlciBpcyB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIgY29udHJhY3Q7IHRoZSByZXN1bHRpbmcgY2FsbGRhdGEgaXNcbiAqIHNlbnQgdG8gdGhlIHVuZGVybHlpbmcgRVJDLTIwLiBFeGFjdC1hbW91bnQgYXBwcm92ZSBpcyB1c2VkIGZvciB0aGUgc2hpZWxkXG4gKiBwYXRoOyBgYW1vdW50ID0gMGAgaXMgdGhlIFVTRFQtc3R5bGUgYWxsb3dhbmNlIHJlc2V0IHVzZWQgd2hlblxuICogYHJlcXVpcmVzQXBwcm92YWxSZXNldGAgaXMgc2V0IG9uIHRoZSB3cmFwcGVyIHBhaXIuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gd3JhcHBlckFkZHJlc3MgIEVSQy03OTg0IHdyYXBwZXIgY29udHJhY3QgKHNwZW5kZXIpXG4gKiBAcGFyYW0gYW1vdW50ICAgICAgICAgIEV4YWN0IGFsbG93YW5jZSB0byBzZXQgKGJhc2UgdW5pdHMpOyBgMGAgZm9yIHJlc2V0XG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd3JhcHBlciBhZGRyZXNzIGlzIGludmFsaWQgb3IgYW1vdW50IGlzIG5lZ2F0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFwcHJvdmVDYWxsZGF0YSh3cmFwcGVyQWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZFdyYXBwZXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZFdyYXBwZXIgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh3cmFwcGVyQWRkcmVzcyk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGludmFsaWQgd3JhcHBlciBhZGRyZXNzICcke3dyYXBwZXJBZGRyZXNzfSdgKTtcbiAgfVxuXG4gIGxldCBhbW91bnRCbjogYmlnaW50O1xuICB0cnkge1xuICAgIGFtb3VudEJuID0gdHlwZW9mIGFtb3VudCA9PT0gJ2JpZ2ludCcgPyBhbW91bnQgOiBCaWdJbnQoYW1vdW50KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZEFwcHJvdmVDYWxsZGF0YTogaW52YWxpZCBhbW91bnQgJyR7YW1vdW50fSdgKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPCAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGFtb3VudCBtdXN0IGJlID49IDAnKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdhcHByb3ZlJywgWy4uLmFwcHJvdmVUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi5hcHByb3ZlVHlwZXNdLCBbY2hlY2tzdW1tZWRXcmFwcGVyLCBhbW91bnRCbi50b1N0cmluZygpXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIEVSQy0yMCBgYXBwcm92ZShzcGVuZGVyLCBhbW91bnQpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCBhcHByb3ZlIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIGB7IHNwZW5kZXIsIGFtb3VudCB9YCB3aXRoIGNoZWNrc3VtbWVkIGBzcGVuZGVyYCBhbmQgZGVjaW1hbC1zdHJpbmcgYGFtb3VudGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2VsZWN0b3IgaXMgbm90IGBhcHByb3ZlYCBvciB0aGUgYXJndW1lbnRzIGNhbm5vdCBiZSBkZWNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVBcHByb3ZlQ2FsbGRhdGEoZGF0YTogc3RyaW5nKTogeyBzcGVuZGVyOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGFwcHJvdmVNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlQXBwcm92ZUNhbGxkYXRhOiBleHBlY3RlZCBhcHByb3ZlIHNlbGVjdG9yICR7YXBwcm92ZU1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgLy8gc2VsZWN0b3IgKDQgYnl0ZXMpICsgdHdvIDMyLWJ5dGUgd29yZHM7IHJlamVjdCB0cmFpbGluZyBieXRlcyBzbyBub3RoaW5nIHVucGFyc2VkIHJpZGVzIGFsb25nXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMiArIDggKyAyICogNjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZUFwcHJvdmVDYWxsZGF0YTogZXhwZWN0ZWQgNjggYnl0ZXMgb2YgY2FsbGRhdGEsIGdvdCAkeyhkYXRhLmxlbmd0aCAtIDIpIC8gMn1gKTtcbiAgfVxuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcbiAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uYXBwcm92ZVR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICBzcGVuZGVyOiBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhkZWNvZGVkWzBdKSxcbiAgICBhbW91bnQ6IGRlY29kZWRbMV0udG9TdHJpbmcoKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIEVSQy03OTg0IGB3cmFwKHRvLCBhbW91bnQpYCBjYWxsZGF0YSBmb3IgdGhlIHNoaWVsZCBwYXRoLlxuICpcbiAqIENhbGxkYXRhIGlzIHNlbnQgdG8gdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyIGNvbnRyYWN0LiBgdG9gIGlzIHRoZSByZWNpcGllbnQgb2ZcbiAqIHRoZSBtaW50ZWQgZW5jcnlwdGVkIGJhbGFuY2UgKHNlbGYtZGlyZWN0ZWQgc2hpZWxkcyB1c2UgdGhlIHdhbGxldCBiYXNlIGFkZHJlc3MpLlxuICogV2hlbiBgcmF0ZWAgaXMgcHJvdmlkZWQsIHZhbGlkYXRlcyB0aGF0IHRoZSBtaW50ZWQgYGZsb29yKGFtb3VudCAvIHJhdGUpYCBmaXRzIHVpbnQ2NCAoYGV1aW50NjRgKS5cbiAqIGByYXRlYCBpcyBub3QgZW5jb2RlZCBpbiBjYWxsZGF0YSAoZGVzZXJpYWxpemUgcm91bmQtdHJpcHMgb21pdCBpdCkuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gdG8gICAgICBSZWNpcGllbnQgb2YgY29uZmlkZW50aWFsIHRva2VucyAoY2hlY2tzdW1tZWQgLyBsb3dlcmNhc2VkIGFjY2VwdGVkKVxuICogQHBhcmFtIGFtb3VudCAgVW5kZXJseWluZyBFUkMtMjAgYW1vdW50IHRvIHdyYXAgKGJhc2UgdW5pdHMpOyBtdXN0IGJlID4gMFxuICogQHBhcmFtIHJhdGUgICAgT3B0aW9uYWwgb24tY2hhaW4gd3JhcHBlciBgcmF0ZSgpYCBmb3IgdWludDY0IHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICogQHRocm93cyB7RXJyb3J9IGlmIGFkZHJlc3MvYW1vdW50L3JhdGUgaXMgaW52YWxpZCBvciBmbG9vcihhbW91bnQgLyByYXRlKSBleGNlZWRzIHVpbnQ2NFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFwQ2FsbGRhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIGFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICByYXRlPzogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4pOiBzdHJpbmcge1xuICBsZXQgY2hlY2tzdW1tZWRUbzogc3RyaW5nO1xuICB0cnkge1xuICAgIGNoZWNrc3VtbWVkVG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh0byk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRXcmFwQ2FsbGRhdGE6IGludmFsaWQgdG8gYWRkcmVzcyAnJHt0b30nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRXcmFwQ2FsbGRhdGE6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZFdyYXBDYWxsZGF0YTogYW1vdW50IG11c3QgYmUgPiAwJyk7XG4gIH1cblxuICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQoYW1vdW50Qm4sIHJhdGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ3dyYXAnLCBbLi4ud3JhcFR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoWy4uLndyYXBUeXBlc10sIFtjaGVja3N1bW1lZFRvLCBhbW91bnRCbi50b1N0cmluZygpXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIEVSQy03OTg0IGB3cmFwKHRvLCBhbW91bnQpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCB3cmFwIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIGB7IHRvLCBhbW91bnQgfWAgd2l0aCBjaGVja3N1bW1lZCBgdG9gIGFuZCBkZWNpbWFsLXN0cmluZyBgYW1vdW50YFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlV3JhcENhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHsgdG86IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfSB7XG4gIGlmICghZGF0YS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgod3JhcE1ldGhvZElkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGVXcmFwQ2FsbGRhdGE6IGV4cGVjdGVkIHdyYXAgc2VsZWN0b3IgJHt3cmFwTWV0aG9kSWR9LCBnb3QgJHtkYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgfVxuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcbiAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4ud3JhcFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICB0bzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZGVjb2RlZFswXSksXG4gICAgYW1vdW50OiBkZWNvZGVkWzFdLnRvU3RyaW5nKCksXG4gIH07XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtNzk4NCBgdW53cmFwKGZyb20sIHRvLCBlbmNyeXB0ZWRBbW91bnQsIGlucHV0UHJvb2YpYCBjYWxsZGF0YSBmb3IgdW5zaGllbGQuXG4gKlxuICogQ2FsbGRhdGEgaXMgc2VudCB0byB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIuIFBoYXNlLTEgdW5zaGllbGQgaXMgc2VsZi1kaXJlY3RlZDpcbiAqIGBmcm9tYCBhbmQgYHRvYCBhcmUgYm90aCB0aGUgd2FsbGV0IGJhc2UgYWRkcmVzcy4gYGVuY3J5cHRlZEFtb3VudGAgaXMgdGhlXG4gKiBGSEUtZW5jcnlwdGVkIGJ1cm4gYW1vdW50IChieXRlczMyIGhhbmRsZSkgYW5kIGBpbnB1dFByb29mYCBpcyB0aGUgWmFtYVxuICogZW5jcnlwdGlvbiBwcm9vZiDigJQgYm90aCBwcm9kdWNlZCBieSBXUCBgWmFtYVJlbGF5ZXJTZXJ2aWNlLmVuY3J5cHRBbW91bnRgLlxuICpcbiAqIERvZXMgbm90IHNldCBnYXNMaW1pdCDigJQgV1Agb3ducyBnYXMuXG4gKlxuICogQHBhcmFtIGZyb20gICAgICAgICAgICAgU291cmNlIG9mIGNvbmZpZGVudGlhbCBiYWxhbmNlIChiYXNlIGFkZHJlc3MpXG4gKiBAcGFyYW0gdG8gICAgICAgICAgICAgICBSZWNpcGllbnQgb2YgcmVsZWFzZWQgRVJDLTIwIChiYXNlIGFkZHJlc3MgaW4gdjEpXG4gKiBAcGFyYW0gZW5jcnlwdGVkQW1vdW50ICBieXRlczMyIGVuY3J5cHRlZCBhbW91bnQgaGFuZGxlICgweC1wcmVmaXhlZClcbiAqIEBwYXJhbSBpbnB1dFByb29mICAgICAgIEVuY3J5cHRpb24gaW5wdXQgcHJvb2YgYnl0ZXMgKDB4LXByZWZpeGVkKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYWRkcmVzc2VzIG9yIGNpcGhlcnRleHQgZmllbGRzIGFyZSBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVud3JhcENhbGxkYXRhKGZyb206IHN0cmluZywgdG86IHN0cmluZywgZW5jcnlwdGVkQW1vdW50OiBzdHJpbmcsIGlucHV0UHJvb2Y6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZEZyb206IHN0cmluZztcbiAgbGV0IGNoZWNrc3VtbWVkVG86IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZEZyb20gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhmcm9tKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFVud3JhcENhbGxkYXRhOiBpbnZhbGlkIGZyb20gYWRkcmVzcyAnJHtmcm9tfSdgKTtcbiAgfVxuICB0cnkge1xuICAgIGNoZWNrc3VtbWVkVG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh0byk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRVbndyYXBDYWxsZGF0YTogaW52YWxpZCB0byBhZGRyZXNzICcke3RvfSdgKTtcbiAgfVxuXG4gIGlmICghZXRoZXJzLnV0aWxzLmlzSGV4U3RyaW5nKGVuY3J5cHRlZEFtb3VudCkgfHwgZXRoZXJzLnV0aWxzLmhleERhdGFMZW5ndGgoZW5jcnlwdGVkQW1vdW50KSAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkVW53cmFwQ2FsbGRhdGE6IGVuY3J5cHRlZEFtb3VudCBtdXN0IGJlIGEgMzItYnl0ZSBoZXggc3RyaW5nLCBnb3QgJyR7ZW5jcnlwdGVkQW1vdW50fSdgKTtcbiAgfVxuICBpZiAoIWV0aGVycy51dGlscy5pc0hleFN0cmluZyhpbnB1dFByb29mKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChpbnB1dFByb29mKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRVbndyYXBDYWxsZGF0YTogaW5wdXRQcm9vZiBtdXN0IGJlIGEgbm9uLWVtcHR5IGhleCBzdHJpbmcsIGdvdCAnJHtpbnB1dFByb29mfSdgKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCd1bndyYXAnLCBbLi4udW53cmFwVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4udW53cmFwVHlwZXNdLFxuICAgIFtjaGVja3N1bW1lZEZyb20sIGNoZWNrc3VtbWVkVG8sIHRvQnVmZmVyKGVuY3J5cHRlZEFtb3VudCksIHRvQnVmZmVyKGlucHV0UHJvb2YpXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBFUkMtNzk4NCBgdW53cmFwKGZyb20sIHRvLCBlbmNyeXB0ZWRBbW91bnQsIGlucHV0UHJvb2YpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCB1bndyYXAgY2FsbGRhdGEgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVW53cmFwQ2FsbGRhdGEoZGF0YTogc3RyaW5nKToge1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGVuY3J5cHRlZEFtb3VudDogc3RyaW5nO1xuICBpbnB1dFByb29mOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh1bndyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlVW53cmFwQ2FsbGRhdGE6IGV4cGVjdGVkIHVud3JhcCBzZWxlY3RvciAke3Vud3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLnVud3JhcFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhkZWNvZGVkWzBdKSxcbiAgICB0bzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZGVjb2RlZFsxXSksXG4gICAgZW5jcnlwdGVkQW1vdW50OiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKSxcbiAgICBpbnB1dFByb29mOiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzNdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIEVSQy03OTg0IGBmaW5hbGl6ZVVud3JhcChyZXF1ZXN0SWQsIGNsZWFydGV4dEFtb3VudCwgZGVjcnlwdGlvblByb29mKWAgY2FsbGRhdGEuXG4gKlxuICogQ2FsbGRhdGEgaXMgc2VudCB0byB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIgdG8gY29tcGxldGUgdW5zaGllbGQgcGhhc2UtMiBhZnRlclxuICogdGhlIFphbWEgb3JhY2xlIHJldHVybnMgYSBjbGVhcnRleHQgYW1vdW50IGFuZCBkZWNyeXB0aW9uIHByb29mIGZvciB0aGUgdW53cmFwXG4gKiByZXF1ZXN0IGNyZWF0ZWQgaW4gcGhhc2UtMS5cbiAqXG4gKiBEb2VzIG5vdCBzZXQgZ2FzTGltaXQg4oCUIFdQIG93bnMgZ2FzLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0SWQgICAgICAgICBieXRlczMyIHVud3JhcCByZXF1ZXN0IGlkICgweC1wcmVmaXhlZClcbiAqIEBwYXJhbSBjbGVhcnRleHRBbW91bnQgICBEZWNyeXB0ZWQgY29uZmlkZW50aWFsIGFtb3VudCAodWludDY0IGRvbWFpbik7IG11c3QgYmUgPiAwXG4gKiBAcGFyYW0gZGVjcnlwdGlvblByb29mICAgT3JhY2xlIGRlY3J5cHRpb24gcHJvb2YgYnl0ZXMgKDB4LXByZWZpeGVkKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcmVxdWVzdElkLCBhbW91bnQsIG9yIHByb29mIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YShcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIGNsZWFydGV4dEFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICBkZWNyeXB0aW9uUHJvb2Y6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKCFldGhlcnMudXRpbHMuaXNIZXhTdHJpbmcocmVxdWVzdElkKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChyZXF1ZXN0SWQpICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiByZXF1ZXN0SWQgbXVzdCBiZSBhIDMyLWJ5dGUgaGV4IHN0cmluZywgZ290ICcke3JlcXVlc3RJZH0nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBjbGVhcnRleHRBbW91bnQgPT09ICdiaWdpbnQnID8gY2xlYXJ0ZXh0QW1vdW50IDogQmlnSW50KGNsZWFydGV4dEFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiBpbnZhbGlkIGNsZWFydGV4dEFtb3VudCAnJHtjbGVhcnRleHRBbW91bnR9J2ApO1xuICB9XG4gIGlmIChhbW91bnRCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiBjbGVhcnRleHRBbW91bnQgbXVzdCBiZSA+IDAnKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPiBVSU5UNjRfTUFYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZEZpbmFsaXplVW53cmFwQ2FsbGRhdGE6IGNsZWFydGV4dEFtb3VudCBleGNlZWRzIHVpbnQ2NCcpO1xuICB9XG5cbiAgaWYgKCFldGhlcnMudXRpbHMuaXNIZXhTdHJpbmcoZGVjcnlwdGlvblByb29mKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChkZWNyeXB0aW9uUHJvb2YpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YTogZGVjcnlwdGlvblByb29mIG11c3QgYmUgYSBub24tZW1wdHkgaGV4IHN0cmluZywgZ290ICcke2RlY3J5cHRpb25Qcm9vZn0nYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmluYWxpemVVbndyYXAnLCBbLi4uZmluYWxpemVVbndyYXBUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5maW5hbGl6ZVVud3JhcFR5cGVzXSxcbiAgICBbdG9CdWZmZXIocmVxdWVzdElkKSwgYW1vdW50Qm4udG9TdHJpbmcoKSwgdG9CdWZmZXIoZGVjcnlwdGlvblByb29mKV1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgRVJDLTc5ODQgYGZpbmFsaXplVW53cmFwKHJlcXVlc3RJZCwgY2xlYXJ0ZXh0QW1vdW50LCBkZWNyeXB0aW9uUHJvb2YpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCBmaW5hbGl6ZVVud3JhcCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGaW5hbGl6ZVVud3JhcENhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHtcbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIGNsZWFydGV4dEFtb3VudDogc3RyaW5nO1xuICBkZWNyeXB0aW9uUHJvb2Y6IHN0cmluZztcbn0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGZpbmFsaXplVW53cmFwTWV0aG9kSWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZGVjb2RlRmluYWxpemVVbndyYXBDYWxsZGF0YTogZXhwZWN0ZWQgZmluYWxpemVVbndyYXAgc2VsZWN0b3IgJHtmaW5hbGl6ZVVud3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgMTBcbiAgICAgICl9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmZpbmFsaXplVW53cmFwVHlwZXNdLCAnMHgnICsgZGF0YS5zbGljZSgxMCkpO1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RJZDogZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFswXSksXG4gICAgY2xlYXJ0ZXh0QW1vdW50OiBkZWNvZGVkWzFdLnRvU3RyaW5nKCksXG4gICAgZGVjcnlwdGlvblByb29mOiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgc2luZ2xlIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKCkgY2FsbC5cbiAqXG4gKiBHcmFudHMgYGRlbGVnYXRlQWRkcmVzc2AgdGhlIHJpZ2h0IHRvIGRlY3J5cHQgRVJDLTc5ODQgdG9rZW4gYmFsYW5jZXMgb25cbiAqIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBhZGRyZXNzIChtc2cuc2VuZGVyKSBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzICBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gZXhwaXJ5VGltZXN0YW1wICAgICAgIFVuaXggc2Vjb25kczsgcmVjb21tZW5kZWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSArIDM2NSo4NjQwMFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbGVnYXRpb25DYWxsZGF0YShcbiAgZGVsZWdhdGVBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICBbZGVsZWdhdGVBZGRyZXNzLCB0b2tlbkNvbnRyYWN0QWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBOIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbHMgYmF0Y2hlZCBpbnNpZGUgQUNMLm11bHRpY2FsbCgpLlxuICpcbiAqIFByb2R1Y2VzIGEgc2luZ2xlIFRYIHRoYXQgZ3JhbnRzIGRlbGVnYXRpb24gZm9yIGFsbCBzcGVjaWZpZWQgdG9rZW4gY29udHJhY3RzLlxuICogUmVxdWlyZXMgdG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPj0gMS5cbiAqIE5vdGU6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBhbHdheXMgdXNlcyB0aGlzIGZ1bmN0aW9uIChldmVuIGZvciBhIHNpbmdsZSB0b2tlbilcbiAqIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIHNoYXBlIGNvbnNpc3RlbnQgcmVnYXJkbGVzcyBvZiB0b2tlbiBjb3VudC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzZXMgICBBcnJheSBvZiBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXNcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgICAgVW5peCBzZWNvbmRzXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3Nlczogc3RyaW5nW10sXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhOiB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzIG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICAvLyBCdWlsZCBlYWNoIGlubmVyIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbCBhcyByYXcgYnl0ZXNcbiAgY29uc3QgaW5uZXJDYWxsczogQnVmZmVyW10gPSB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLm1hcCgodG9rZW5BZGRyZXNzKSA9PiB7XG4gICAgY29uc3QgaW5uZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgICBjb25zdCBpbm5lckFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICAgICk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2lubmVyTWV0aG9kLCBpbm5lckFyZ3NdKTtcbiAgfSk7XG5cbiAgLy8gRW5jb2RlIG91dGVyIG11bHRpY2FsbChieXRlc1tdKVxuICAvLyBldGhlcmV1bWpzLWFiaSB2MC42LnggaGFzIGEgYnVnIHdoZXJlIGl0IG9taXRzIHRoZSBwZXItZWxlbWVudCBvZmZzZXQgdGFibGVcbiAgLy8gZm9yIGJ5dGVzW10sIHByb2R1Y2luZyBtYWxmb3JtZWQgY2FsbGRhdGEgdGhhdCBvbi1jaGFpbiBBQkkgZGVjb2RlcnMgcmVqZWN0LlxuICAvLyBVc2UgZXRoZXJzIEFiaUNvZGVyIHdoaWNoIGNvcnJlY3RseSBlbWl0cyB0aGUgaGVhZCBvZmZzZXQgd29yZHMuXG4gIGNvbnN0IG91dGVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pO1xuICBjb25zdCBvdXRlckFyZ3MgPSBCdWZmZXIuZnJvbShcbiAgICBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCkuZW5jb2RlKFsuLi5hY2xNdWx0aWNhbGxUeXBlc10sIFtpbm5lckNhbGxzXSkuc2xpY2UoMiksXG4gICAgJ2hleCdcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFtvdXRlck1ldGhvZCwgb3V0ZXJBcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjYWxsZGF0YSBpbiBhIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KHRhcmdldCwgMCwgZGF0YSkgY2FsbC5cbiAqXG4gKiBVc2VkIHdoZW4gYSBmb3J3YXJkZXIgY29udHJhY3QgbXVzdCBiZSBtc2cuc2VuZGVyIGZvciBhbiBleHRlcm5hbCBjb250cmFjdFxuICogY2FsbCDigJQgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGZvcndhcmRlciBpdHNlbGYgbmVlZHMgdG8gY2FsbFxuICogQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBzbyB0aGF0IGl0cyBvd24gYmFsYW5jZSBjYW4gYmUgZGVjcnlwdGVkLlxuICpcbiAqIE9ubHkgdGhlIHBhcmVudEFkZHJlc3MgKHJvb3Qgd2FsbGV0KSBpcyBhbGxvd2VkIHRvIGNhbGwgY2FsbEZyb21QYXJlbnRcbiAqIChlbmZvcmNlZCBieSB0aGUgZm9yd2FyZGVyJ3Mgb25seVBhcmVudCBtb2RpZmllcikuXG4gKlxuICogQHBhcmFtIHRhcmdldEFkZHJlc3MgIEFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoZSBmb3J3YXJkZXIgd2lsbCBjYWxsIChlLmcuIEFDTClcbiAqIEBwYXJhbSBjYWxsZGF0YSAgICAgICBBQkktZW5jb2RlZCBpbm5lciBjYWxsZGF0YSAoZS5nLiBmcm9tIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbEZyb21QYXJlbnQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0YXJnZXRBZGRyZXNzOiBzdHJpbmcsIGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSxcbiAgICBbXG4gICAgICB0YXJnZXRBZGRyZXNzLFxuICAgICAgMCwgLy8gdmFsdWU6IG5vIEVUSCB0cmFuc2ZlclxuICAgICAgdG9CdWZmZXIoY2FsbGRhdGEpLCAvLyBpbm5lciBjYWxsZGF0YSBhcyBieXRlc1xuICAgIF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzIGZyb20gZGVsZWdhdGlvbiBjYWxsZGF0YS5cbiAqXG4gKiBIYW5kbGVzIHR3byBzaGFwZXMgb2YgY2FsbGRhdGE6XG4gKiAgIC0gRGlyZWN0IEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSkgKHJvb3Qgd2FsbGV0IHBhdGgpXG4gKiAgIC0gRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcywgdWludDI1NiwgYnl0ZXMpIHdyYXBwaW5nIGEgbXVsdGljYWxsIChmb3J3YXJkZXIgcGF0aClcbiAqXG4gKiBAcGFyYW0gY2FsbGRhdGEgIEFCSS1lbmNvZGVkIGRlbGVnYXRpb24gY2FsbGRhdGEgKDB4LXByZWZpeGVkIG9yIHJhdyBoZXgpXG4gKiBAcmV0dXJucyBBcnJheSBvZiB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgKGxvd2VyY2FzZSkgZm91bmQgaW4gdGhlIGRlbGVnYXRpb24gY2FsbHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgY2FsbGRhdGEgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHJlY29nbmlzZWQgbWV0aG9kIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGF0YSA9IGNhbGxkYXRhLnN0YXJ0c1dpdGgoJzB4JykgPyBjYWxsZGF0YSA6ICcweCcgKyBjYWxsZGF0YTtcbiAgY29uc3QgbWV0aG9kSWQgPSBkYXRhLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG5cbiAgbGV0IG11bHRpY2FsbEhleDogc3RyaW5nO1xuXG4gIGlmIChtZXRob2RJZCA9PT0gY2FsbEZyb21QYXJlbnRNZXRob2RJZCkge1xuICAgIC8vIERlY29kZSBjYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykg4oCUIGlubmVyIGJ5dGVzIGlzIHRoZSBmdWxsIG11bHRpY2FsbCBjYWxsZGF0YS5cbiAgICAvLyBldGhlcnMgdjUgcmV0dXJucyBgYnl0ZXNgIGFzIGEgaGV4IHN0cmluZzsgdXNlIGhleGxpZnkgdG8gbm9ybWFsaXNlIHRvIGEgMHgtcHJlZml4ZWQgaGV4IHN0cmluZ1xuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcnVudGltZSByZXR1cm5zIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheS5cbiAgICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgICBtdWx0aWNhbGxIZXggPSBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKTtcbiAgfSBlbHNlIGlmIChtZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICBtdWx0aWNhbGxIZXggPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YScpO1xuICB9XG5cbiAgaWYgKG11bHRpY2FsbEhleC5zbGljZSgwLCAxMCkgIT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICAvLyBEZWNvZGUgbXVsdGljYWxsKGJ5dGVzW10pIOKAlCBlYWNoIGVsZW1lbnQgaXMgYW4gaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsLlxuICAvLyBldGhlcnMgdjUgcmV0dXJucyBieXRlc1tdIGVsZW1lbnRzIGFzIGhleCBzdHJpbmdzOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgZWFjaCBlbGVtZW50LlxuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsnYnl0ZXNbXSddLCAnMHgnICsgbXVsdGljYWxsSGV4LnNsaWNlKDEwKSk7XG4gIGNvbnN0IGlubmVyQ2FsbHM6IHVua25vd25bXSA9IGRlY29kZWRbMF07XG5cbiAgY29uc3QgdG9rZW5BZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgaW5uZXJDYWxsIG9mIGlubmVyQ2FsbHMpIHtcbiAgICBjb25zdCBpbm5lckhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGlubmVyQ2FsbCBhcyBldGhlcnMudXRpbHMuQnl0ZXNMaWtlKS5zbGljZSgyKTsgLy8gc3RyaXAgMHhcbiAgICBjb25zdCBpbm5lck1ldGhvZElkID0gJzB4JyArIGlubmVySGV4LnNsaWNlKDAsIDgpO1xuICAgIGlmIChpbm5lck1ldGhvZElkICE9PSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzIGRlbGVnYXRlLCBhZGRyZXNzIHRva2VuQWRkcmVzcywgdWludDY0IGV4cGlyeSlcbiAgICBjb25zdCBpbm5lckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sICcweCcgKyBpbm5lckhleC5zbGljZSg4KSk7XG4gICAgdG9rZW5BZGRyZXNzZXMucHVzaCgoaW5uZXJEZWNvZGVkWzFdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5BZGRyZXNzZXM7XG59XG5cbi8qKlxuICogRW5jb2RlcyBjb25maWRlbnRpYWxUcmFuc2ZlcihhZGRyZXNzIHRvLCBieXRlczMyIGVuY3J5cHRlZEhhbmRsZSkgY2FsbGRhdGEuXG4gKiBVc2VzIHRoZSBuby1wcm9vZiB2YXJpYW50IChzZWxlY3RvciAweDViZWJlZDdlKSDigJQgdmFsaWQgd2hlbiB0aGUgY2FsbGVyIChmb3J3YXJkZXIpXG4gKiBpcyBhbHJlYWR5IEFDTC1hbGxvd2VkIG9uIHRoZSBoYW5kbGUgZnJvbSB3aGVuIGl0IHJlY2VpdmVkIHRoZSB0b2tlbnMuXG4gKlxuICogQHBhcmFtIHRvQWRkcmVzcyAgICAgICBBZGRyZXNzIHRoYXQgd2lsbCByZWNlaXZlIHRoZSB0b2tlbnNcbiAqIEBwYXJhbSBlbmNyeXB0ZWRIYW5kbGUgYnl0ZXMzMiBlbmNyeXB0ZWQgYmFsYW5jZSBoYW5kbGUgZnJvbSBjb25maWRlbnRpYWxCYWxhbmNlT2ZcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gQnVmZmVyLmZyb20oY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQuc2xpY2UoMiksICdoZXgnKTtcbiAgY29uc3QgaGFuZGxlQnVmZmVyID0gdG9CdWZmZXIoZW5jcnlwdGVkSGFuZGxlKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCBbdG9BZGRyZXNzLCBoYW5kbGVCdWZmZXJdKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGZ1bGwgZmx1c2ggY2FsbGRhdGEgZm9yIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uOlxuICogICBjYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlKSlcbiAqIFRoZSBmb3J3YXJkZXIgZXhlY3V0ZXMgdGhlIGlubmVyIGNvbmZpZGVudGlhbFRyYW5zZmVyIHdpdGggbXNnLnNlbmRlciA9IGZvcndhcmRlci5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBwYXJlbnRBZGRyZXNzICAgICAgICAgUm9vdCB3YWxsZXQgYWRkcmVzcyAoZGVzdGluYXRpb24gb2YgZmx1c2hlZCB0b2tlbnMpXG4gKiBAcGFyYW0gZW5jcnlwdGVkSGFuZGxlICAgICAgIGJ5dGVzMzIgZW5jcnlwdGVkIGJhbGFuY2UgaGFuZGxlIGZyb20gY29uZmlkZW50aWFsQmFsYW5jZU9mXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgcGFyZW50QWRkcmVzczogc3RyaW5nLFxuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgaW5uZXJDYWxsZGF0YSA9IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhKHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSk7XG4gIHJldHVybiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgaW5uZXJDYWxsZGF0YSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGNhbGxkYXRhLlxuICogU3RyaXBzIHRoZSBvdXRlciBjYWxsRnJvbVBhcmVudCB3cmFwcGVyIGFuZCB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIuXG4gKiBSZXR1cm5zIHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSB9LlxuICpcbiAqIEBwYXJhbSBkYXRhICBBQkktZW5jb2RlZCBmbHVzaCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBEZWNvZGVkIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBjYWxsZGF0YTogZXhwZWN0ZWQgY2FsbEZyb21QYXJlbnQgc2VsZWN0b3IsIGdvdCAke2RhdGEuc2xpY2UoMCwgMTApfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IG91dGVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcgPSBvdXRlckRlY29kZWRbMF07XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGE6IHN0cmluZyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KG91dGVyRGVjb2RlZFsyXSk7XG5cbiAgaWYgKCFpbm5lckNhbGxkYXRhLnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gaW5uZXIgY2FsbGRhdGE6IGV4cGVjdGVkIGNvbmZpZGVudGlhbFRyYW5zZmVyIHNlbGVjdG9yLCBnb3QgJHtpbm5lckNhbGxkYXRhLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAxMFxuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCAnMHgnICsgaW5uZXJDYWxsZGF0YS5zbGljZSgxMCkpO1xuICBjb25zdCBwYXJlbnRBZGRyZXNzOiBzdHJpbmcgPSBpbm5lckRlY29kZWRbMF07XG4gIGNvbnN0IGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nID0gYnVmZmVyVG9IZXgodG9CdWZmZXIoaW5uZXJEZWNvZGVkWzFdKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICBwYXJlbnRBZGRyZXNzLFxuICAgIGVuY3J5cHRlZEhhbmRsZSxcbiAgfTtcbn1cbiJdfQ==
|