@bitgo-beta/abstract-eth 1.0.2-beta.2094 → 1.0.2-beta.2096

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.
@@ -179,6 +179,22 @@ export interface ConfidentialTransferData {
179
179
  * @returns parsed confidential transfer fields
180
180
  */
181
181
  export declare function decodeConfidentialTransferData(data: string): ConfidentialTransferData;
182
+ export interface DirectConfidentialTransferData {
183
+ toAddress: string;
184
+ encryptedHandle: string;
185
+ inputProof: string;
186
+ }
187
+ /**
188
+ * Decode a direct confidentialTransfer(address, bytes32, bytes) calldata.
189
+ *
190
+ * Used for hot/TSS wallets where the signing address calls the token contract directly,
191
+ * without a sendMultiSig wrapper. In this path the `to` field of the EIP-1559 transaction
192
+ * is the token contract address and the calldata carries only the three transfer parameters.
193
+ *
194
+ * @param data 0x-prefixed calldata starting with confidentialTransferWithProofMethodId (0x2fb74e62)
195
+ * @returns toAddress, encryptedHandle, inputProof
196
+ */
197
+ export declare function decodeDirectConfidentialTransferCalldata(data: string): DirectConfidentialTransferData;
182
198
  /**
183
199
  * Decode a FlushERC7984ForwarderToken transaction's calldata into its component parts.
184
200
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ exports.decodeERC1155TransferData = decodeERC1155TransferData;
25
25
  exports.decodeNativeTransferData = decodeNativeTransferData;
26
26
  exports.decodeFlushTokensData = decodeFlushTokensData;
27
27
  exports.decodeConfidentialTransferData = decodeConfidentialTransferData;
28
+ exports.decodeDirectConfidentialTransferCalldata = decodeDirectConfidentialTransferCalldata;
28
29
  exports.decodeFlushERC7984ForwarderTokenData = decodeFlushERC7984ForwarderTokenData;
29
30
  exports.classifyTransaction = classifyTransaction;
30
31
  exports.numberToHexString = numberToHexString;
@@ -550,6 +551,28 @@ function decodeConfidentialTransferData(data) {
550
551
  signature: (0, ethereumjs_util_1.bufferToHex)(signature),
551
552
  };
552
553
  }
554
+ /**
555
+ * Decode a direct confidentialTransfer(address, bytes32, bytes) calldata.
556
+ *
557
+ * Used for hot/TSS wallets where the signing address calls the token contract directly,
558
+ * without a sendMultiSig wrapper. In this path the `to` field of the EIP-1559 transaction
559
+ * is the token contract address and the calldata carries only the three transfer parameters.
560
+ *
561
+ * @param data 0x-prefixed calldata starting with confidentialTransferWithProofMethodId (0x2fb74e62)
562
+ * @returns toAddress, encryptedHandle, inputProof
563
+ */
564
+ function decodeDirectConfidentialTransferCalldata(data) {
565
+ if (!data.startsWith(walletUtil_1.confidentialTransferWithProofMethodId)) {
566
+ // Include only the 4-byte method ID in the error to avoid leaking encrypted payloads into logs.
567
+ throw new sdk_core_1.BuildTransactionError(`Invalid direct confidential transfer calldata: unexpected method ID ${data.slice(0, 10)}`);
568
+ }
569
+ const [toAddress, encryptedHandle, inputProof] = getRawDecoded(walletUtil_1.confidentialTransferWithProofTypes, getBufferedByteCode(walletUtil_1.confidentialTransferWithProofMethodId, data));
570
+ return {
571
+ toAddress: (0, ethereumjs_util_1.addHexPrefix)(toAddress),
572
+ encryptedHandle: (0, ethereumjs_util_1.bufferToHex)(encryptedHandle),
573
+ inputProof: (0, ethereumjs_util_1.bufferToHex)(inputProof),
574
+ };
575
+ }
553
576
  /**
554
577
  * Decode a FlushERC7984ForwarderToken transaction's calldata into its component parts.
555
578
  *
@@ -920,4 +943,4 @@ async function recoveryBlockchainExplorerQuery(query, explorerUrl, token) {
920
943
  function getDefaultExpireTime() {
921
944
  return Math.floor(new Date().getTime() / 1000) + 60 * 60 * 24 * 7;
922
945
  }
923
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBcUdBLDhCQVdDO0FBV0Qsb0NBV0M7QUFTRCxvQkFFQztBQWFELDRDQVlDO0FBYUQsc0RBYUM7QUFRRCwwQ0FlQztBQUtELHdDQUtDO0FBU0Qsc0RBb0JDO0FBUUQsa0VBbUNDO0FBU0Qsd0RBb0JDO0FBUUQsb0VBbUNDO0FBT0Qsb0VBRUM7QUFRRCw4Q0FFQztBQVFELHNDQUdDO0FBUUQsNERBeUNDO0FBU0QsZ0RBUUM7QUFTRCwwREFnQ0M7QUFFRCw0REFtREM7QUFFRCw4REFrREM7QUFTRCw0REFpQ0M7QUFTRCxzREF1QkM7QUFrQkQsd0VBbUNDO0FBU0Qsb0ZBUUM7QUFTRCxrREE0Q0M7QUF5Q0QsOENBR0M7QUFPRCw4Q0FFQztBQVNELDhEQU1DO0FBVUQsa0VBT0M7QUFPRCw0Q0FNQztBQVFELGtDQVFDO0FBUUQsb0NBU0M7QUFXRCxzQ0FjQztBQVNELGtEQVNDO0FBVUQsNEJBMkJDO0FBU0Qsc0VBTUM7QUFVRCx3RUFXQztBQVlELHdGQVdDO0FBVUQsNEVBWUM7QUFRRCxrRUF3Q0M7QUFTRCwwRUFrQkM7QUFNRCxvREFFQztBQW5xQ0QsbUNBQWdDO0FBQ2hDLDREQUFpQztBQUNqQyxvREFBNEI7QUFDNUIscURBV3lCO0FBQ3pCLGlEQUFpSDtBQUNqSCxvRUFBeUM7QUFDekMsZ0VBQWdEO0FBQ2hELGtEQUF1QjtBQUN2QixnRUFBcUM7QUFDckMsbURBVThCO0FBZ0I5Qiw2Q0EyQ3NCO0FBQ3RCLG1DQUE2QztBQUM3QywyQ0FLcUI7QUFFckI7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQUMsT0FBd0I7SUFDaEQsT0FBTyxnQkFBYyxDQUFDLGNBQWM7SUFDbEMsd0VBQXdFO0lBQ3hFLFNBQVMsRUFDVDtRQUNFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixTQUFTLEVBQUUsT0FB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QUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gIGFkZEhleFByZWZpeCxcbiAgYnVmZmVyVG9IZXgsXG4gIGJ1ZmZlclRvSW50LFxuICBnZW5lcmF0ZUFkZHJlc3MsXG4gIGlzVmFsaWRBZGRyZXNzLFxuICBzZXRMZW5ndGhMZWZ0LFxuICBzdHJpcEhleFByZWZpeCxcbiAgdG9CdWZmZXIsXG4gIGdlbmVyYXRlQWRkcmVzczIsXG4gIHBhZFRvRXZlbixcbn0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgY29pbnMsIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiwgRXRoZXJldW1OZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IEV0aGVyZXVtQ29tbW9uIGZyb20gJ0BldGhlcmV1bWpzL2NvbW1vbic7XG5pbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVNZXRob2RJZCxcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBMb2NrTWV0aG9kSWQsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVbmxvY2tNZXRob2RJZCxcbiAgVW52b3RlTWV0aG9kSWQsXG4gIFZvdGVNZXRob2RJZCxcbiAgV2l0aGRyYXdNZXRob2RJZCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBFUkMxMTU1VHJhbnNmZXJEYXRhLFxuICBFUkM3MjFUcmFuc2ZlckRhdGEsXG4gIEZsdXNoVG9rZW5zRGF0YSxcbiAgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5EYXRhLFxuICBOYXRpdmVUcmFuc2ZlckRhdGEsXG4gIFNpZ25hdHVyZVBhcnRzLFxuICBUb2tlblRyYW5zZmVyRGF0YSxcbiAgVHJhbnNmZXJEYXRhLFxuICBUeERhdGEsXG4gIFdhbGxldEluaXRpYWxpemF0aW9uRGF0YSxcbiAgRm9yd2FyZGVySW5pdGlhbGl6YXRpb25EYXRhLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHtcbiAgY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsXG4gIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVzLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gIEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCxcbiAgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZXMsXG4gIEVSQzcyMVRyYW5zZmVyRnJvbU1ldGhvZElkLFxuICBFUkM3MjFUcmFuc2ZlckZyb21UeXBlcyxcbiAgZmx1c2hDb2luc01ldGhvZElkLFxuICBmbHVzaENvaW5zVHlwZXMsXG4gIGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsXG4gIGZsdXNoVG9rZW5zVHlwZXMsXG4gIGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsXG4gIGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyxcbiAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlc3Y0LFxuICBmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCxcbiAgZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXMsXG4gIGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzdjQsXG4gIHNlbmRNdWx0aXNpZ01ldGhvZElkLFxuICBzZW5kTXVsdGlzaWdUb2tlbk1ldGhvZElkLFxuICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzLFxuICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgd2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzLFxuICB2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICB3YWxsZXRTaW1wbGVDb25zdHJ1Y3RvcixcbiAgY3JlYXRlVjFXYWxsZXRUeXBlcyxcbiAgdjFDcmVhdGVXYWxsZXRNZXRob2RJZCxcbiAgY3JlYXRlVjFGb3J3YXJkZXJUeXBlcyxcbiAgcmVjb3ZlcnlXYWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMsXG4gIGRlZmF1bHRGb3J3YXJkZXJWZXJzaW9uLFxuICBjcmVhdGVWNEZvcndhcmRlclR5cGVzLFxuICB2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICBmbHVzaFRva2Vuc1R5cGVzdjQsXG4gIGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgc2VuZE11bHRpU2lnVG9rZW5UeXBlc0ZpcnN0U2lnbmVyLFxuICBzZW5kTXVsdGlTaWdUeXBlc0ZpcnN0U2lnbmVyLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZlR5cGVzLFxuICBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZNZXRob2RJZCxcbn0gZnJvbSAnLi93YWxsZXRVdGlsJztcbmltcG9ydCB7IEV0aFRyYW5zYWN0aW9uRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCxcbiAgY2FsbEZyb21QYXJlbnRUeXBlcyxcbiAgZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbiAgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkLFxufSBmcm9tICcuL3phbWFVdGlscyc7XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbihuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmspOiBFdGhlcmV1bUNvbW1vbiB7XG4gIHJldHVybiBFdGhlcmV1bUNvbW1vbi5mb3JDdXN0b21DaGFpbihcbiAgICAvLyB1c2UgdGhlIG1haW5uZXQgY29uZmlnIGFzIGEgYmFzZSwgb3ZlcnJpZGUgY2hhaW4gaWRzIGFuZCBuZXR3b3JrIG5hbWVcbiAgICAnbWFpbm5ldCcsXG4gICAge1xuICAgICAgbmFtZTogbmV0d29yay50eXBlLFxuICAgICAgbmV0d29ya0lkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgICBjaGFpbklkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgfSxcbiAgICAnbG9uZG9uJ1xuICApO1xufVxuXG4vKipcbiAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgYXBwcm9wcmlhdGUgYWxnb3JpdGhtXG4gKiBhbmQgdGhlIHByb3ZpZGVkIGNvbW1vbiBmb3IgdGhlIGJsb2NrY2hhaW5cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHBhcmFtIHtFdGhlcmV1bUNvbW1vbn0gY3VzdG9tQ29tbW9uIHRoZSBuZXR3b3JrJ3MgY3VzdG9tIGNvbW1vblxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkludGVybmFsKFxuICB0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSxcbiAga2V5UGFpcjogS2V5UGFpcixcbiAgY3VzdG9tQ29tbW9uOiBFdGhlcmV1bUNvbW1vblxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gIH1cbiAgY29uc3QgZXRoVHggPSBFdGhUcmFuc2FjdGlvbkRhdGEuZnJvbUpzb24odHJhbnNhY3Rpb25EYXRhLCBjdXN0b21Db21tb24pO1xuICBldGhUeC5zaWduKGtleVBhaXIpO1xuICByZXR1cm4gZXRoVHgudG9TZXJpYWxpemVkKCk7XG59XG5cbi8qKlxuICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbih0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSwga2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBzaWduSW50ZXJuYWwodHJhbnNhY3Rpb25EYXRhLCBrZXlQYWlyLCBnZXRDb21tb24oY29pbnMuZ2V0KCd0ZXRoJykubmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgYWRpdGlvbmFsIG1ldGhvZCBjYWxsIGRhdGFcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBpcmVUaW1lIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNlY29uZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZUlkIHNlcXVlbmNlIGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIHNpZ25hdHVyZSBvZiB0aGUgY2FsbFxuICogQHJldHVybnMge3N0cmluZ30gLS0gdGhlIGNvbnRyYWN0IG1ldGhvZCBlbmNvZGVkIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRNdWx0aVNpZ0RhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyxcbiAgZXhwaXJlVGltZTogbnVtYmVyLFxuICBzZXF1ZW5jZUlkOiBudW1iZXIsXG4gIHNpZ25hdHVyZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSBbdG8sIHZhbHVlLCB0b0J1ZmZlcihkYXRhKSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgdG9CdWZmZXIoc2lnbmF0dXJlKV07XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdzZW5kTXVsdGlTaWcnLCBzZW5kTXVsdGlTaWdUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoc2VuZE11bHRpU2lnVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBlcmMyMCB0b2tlbiBjb250cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IGV4cGlyZVRpbWUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2Vjb25kc1xuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlSWQgc2VxdWVuY2UgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBjYWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtLSB0aGUgY29udHJhY3QgbWV0aG9kIGVuY29kZWQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZE11bHRpU2lnVG9rZW5EYXRhKFxuICB0bzogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBleHBpcmVUaW1lOiBudW1iZXIsXG4gIHNlcXVlbmNlSWQ6IG51bWJlcixcbiAgc2lnbmF0dXJlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0bywgdmFsdWUsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCB0b0J1ZmZlcihzaWduYXR1cmUpXTtcblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnc2VuZE11bHRpU2lnVG9rZW4nLCBzZW5kTXVsdGlTaWdUb2tlblR5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShzZW5kTXVsdGlTaWdUb2tlblR5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCB0b2tlbnMgY29udHJhY3QgY2FsbFxuICpcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIFRoZSBmb3J3YXJkZXIgYWRkcmVzcyB0byBmbHVzaFxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBmbHVzaCBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaFRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nLCB0b2tlbkFkZHJlc3M6IHN0cmluZywgZm9yd2FyZGVyVmVyc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHBhcmFtczogc3RyaW5nW107XG4gIGxldCBtZXRob2Q6IFVpbnQ4QXJyYXk7XG4gIGxldCBhcmdzOiBVaW50OEFycmF5O1xuXG4gIGlmIChmb3J3YXJkZXJWZXJzaW9uID49IDQpIHtcbiAgICBwYXJhbXMgPSBbdG9rZW5BZGRyZXNzXTtcbiAgICBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmx1c2hUb2tlbnMnLCBmbHVzaFRva2Vuc1R5cGVzdjQpO1xuICAgIGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hUb2tlbnNUeXBlc3Y0LCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIHBhcmFtcyA9IFtmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3NdO1xuICAgIG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaEZvcndhcmRlclRva2VucycsIGZsdXNoVG9rZW5zVHlwZXMpO1xuICAgIGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hUb2tlbnNUeXBlcywgcGFyYW1zKTtcbiAgfVxuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCBuYXRpdmUgY29pbnMgY29udHJhY3QgY2FsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hDb2luc0RhdGEoKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW107XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaCcsIGZsdXNoQ29pbnNUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hDb2luc1R5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCBFUkM3MjEgdG9rZW5zIGNvbnRyYWN0IGNhbGxcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIC0gVGhlIGZvcndhcmRlciBhZGRyZXNzIChmb3IgdjAtdjMpXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gVGhlIEVSQzcyMSB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5JZCAtIFRoZSB0b2tlbiBJRCB0byBmbHVzaFxuICogQHBhcmFtIGZvcndhcmRlclZlcnNpb24gLSBUaGUgZm9yd2FyZGVyIHZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoRVJDNzIxVG9rZW5zRGF0YShcbiAgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5JZDogc3RyaW5nLFxuICBmb3J3YXJkZXJWZXJzaW9uOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGxldCBwYXJhbXM6IChzdHJpbmcgfCBCdWZmZXIpW107XG4gIGxldCBtZXRob2Q6IFVpbnQ4QXJyYXk7XG4gIGxldCBhcmdzOiBVaW50OEFycmF5O1xuXG4gIGlmIChmb3J3YXJkZXJWZXJzaW9uID49IDQpIHtcbiAgICBwYXJhbXMgPSBbdG9rZW5BZGRyZXNzLCB0b2tlbklkXTtcbiAgICBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmx1c2hFUkM3MjFUb2tlbicsIGZsdXNoRVJDNzIxVG9rZW5zVHlwZXN2NCk7XG4gICAgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaEVSQzcyMVRva2Vuc1R5cGVzdjQsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zID0gW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF07XG4gICAgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zJywgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyk7XG4gICAgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaEVSQzcyMVRva2Vuc1R5cGVzLCBwYXJhbXMpO1xuICB9XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIGZsdXNoIEVSQzcyMSB0b2tlbnMgZGF0YVxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gdG8gVGhlIHRvIGFkZHJlc3MgKGNvbnRyYWN0IGFkZHJlc3MgZm9yIHY0KylcbiAqIEByZXR1cm5zIHBhcnNlZCBmbHVzaCBkYXRhIHdpdGggZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkIGFuZCBmb3J3YXJkZXJWZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoXG4gIGRhdGE6IHN0cmluZyxcbiAgdG8/OiBzdHJpbmdcbik6IHtcbiAgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nO1xuICB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgdG9rZW5JZDogc3RyaW5nO1xuICBmb3J3YXJkZXJWZXJzaW9uPzogbnVtYmVyO1xufSB7XG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGlmICghdG8pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYE1pc3NpbmcgdG8gYWRkcmVzczogJHt0b31gKTtcbiAgICB9XG4gICAgY29uc3QgW3Rva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlc3Y0LFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShmbHVzaEVSQzcyMUZvcndhcmRlclRva2Vuc01ldGhvZElkVjQsIGRhdGEpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yd2FyZGVyQWRkcmVzczogdG8sXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBmb3J3YXJkZXJWZXJzaW9uOiA0LFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZGF0YS5zdGFydHNXaXRoKGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICB0b2tlbklkOiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRva2VuSWQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBmbHVzaCBFUkM3MjEgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGEgcmVxdWlyZWQgdG8gbWFrZSBhIGZsdXNoIEVSQzExNTUgdG9rZW5zIGNvbnRyYWN0IGNhbGxcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIC0gVGhlIGZvcndhcmRlciBhZGRyZXNzIChmb3IgdjAtdjMpXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gVGhlIEVSQzExNTUgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuSWQgLSBUaGUgdG9rZW4gSUQgdG8gZmx1c2hcbiAqIEBwYXJhbSBmb3J3YXJkZXJWZXJzaW9uIC0gVGhlIGZvcndhcmRlciB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKFxuICBmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbklkOiBzdHJpbmcsXG4gIGZvcndhcmRlclZlcnNpb246IG51bWJlclxuKTogc3RyaW5nIHtcbiAgbGV0IHBhcmFtczogKHN0cmluZyB8IEJ1ZmZlcilbXTtcbiAgbGV0IG1ldGhvZDogVWludDhBcnJheTtcbiAgbGV0IGFyZ3M6IFVpbnQ4QXJyYXk7XG5cbiAgaWYgKGZvcndhcmRlclZlcnNpb24gPj0gNCkge1xuICAgIHBhcmFtcyA9IFt0b2tlbkFkZHJlc3MsIHRva2VuSWRdO1xuICAgIG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaEVSQzExNTVUb2tlbnMnLCBmbHVzaEVSQzExNTVUb2tlbnNUeXBlc3Y0KTtcbiAgICBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzdjQsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zID0gW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF07XG4gICAgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZsdXNoRVJDMTE1NUZvcndhcmRlclRva2VucycsIGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzKTtcbiAgICBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzLCBwYXJhbXMpO1xuICB9XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIGZsdXNoIEVSQzExNTUgdG9rZW5zIGRhdGFcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHBhcmFtIHRvIFRoZSB0byBhZGRyZXNzIChjb250cmFjdCBhZGRyZXNzIGZvciB2NCspXG4gKiBAcmV0dXJucyBwYXJzZWQgZmx1c2ggZGF0YSB3aXRoIGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCBhbmQgZm9yd2FyZGVyVmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShcbiAgZGF0YTogc3RyaW5nLFxuICB0bz86IHN0cmluZ1xuKToge1xuICBmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmc7XG4gIHRva2VuQWRkcmVzczogc3RyaW5nO1xuICB0b2tlbklkOiBzdHJpbmc7XG4gIGZvcndhcmRlclZlcnNpb24/OiBudW1iZXI7XG59IHtcbiAgaWYgKGRhdGEuc3RhcnRzV2l0aChmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGlmICghdG8pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYE1pc3NpbmcgdG8gYWRkcmVzczogJHt0b31gKTtcbiAgICB9XG4gICAgY29uc3QgW3Rva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXN2NCxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiB0byxcbiAgICAgIHRva2VuQWRkcmVzczogYWRkSGV4UHJlZml4KHRva2VuQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5JZDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b2tlbklkIGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDQsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKGZsdXNoRVJDMTE1NUZvcndhcmRlclRva2Vuc01ldGhvZElkLCBkYXRhKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcndhcmRlckFkZHJlc3M6IGFkZEhleFByZWZpeChmb3J3YXJkZXJBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGZsdXNoIEVSQzExNTUgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgZm9yd2FyZGVyIG1ldGhvZCBjYWxsaW5nIGRhdGFcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUZvcndhcmRlck1ldGhvZElkO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEV0aCBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSB0aGUgdHggaGFzaCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRXRoQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgd2FsbGV0IGNyZWF0aW9uIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGhlIGxpc3Qgb2Ygc2lnbmVyIGFkZHJlc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlV2FsbGV0Q3JlYXRpb25EYXRhKGRhdGE6IHN0cmluZyk6IFdhbGxldEluaXRpYWxpemF0aW9uRGF0YSB7XG4gIGlmICghKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpIHx8IGRhdGEuc3RhcnRzV2l0aCh2MUNyZWF0ZVdhbGxldE1ldGhvZElkKSkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHdhbGxldCBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpKSB7XG4gICAgY29uc3QgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEuc2xpY2UoMiksICdoZXgnKTtcblxuICAgIC8vIHRoZSBsYXN0IDE2MCBieXRlcyBjb250YWluIHRoZSBzZXJpYWxpemVkIGFkZHJlc3MgYXJyYXlcbiAgICBjb25zdCBzZXJpYWxpemVkU2lnbmVycyA9IGRhdGFCdWZmZXIuc2xpY2UoLTE2MCk7XG5cbiAgICBjb25zdCByZXN1bHRFbmNvZGVkUGFyYW1ldGVycyA9IEV0aGVyZXVtQWJpLnJhd0RlY29kZSh3YWxsZXRTaW1wbGVDb25zdHJ1Y3Rvciwgc2VyaWFsaXplZFNpZ25lcnMpO1xuICAgIGlmIChyZXN1bHRFbmNvZGVkUGFyYW1ldGVycy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYENvdWxkIG5vdCBkZWNvZGUgd2FsbGV0IGNvbnN0cnVjdG9yIGJ5dGVjb2RlOiAke3Jlc3VsdEVuY29kZWRQYXJhbWV0ZXJzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogQk5bXSA9IHJlc3VsdEVuY29kZWRQYXJhbWV0ZXJzWzBdO1xuICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gcGFyc2VkIGNvbnN0cnVjdG9yOiAke2FkZHJlc3Nlc31gKTtcbiAgICB9XG5cbiAgICAvLyBzb21ldGltZXMgZXRoZXJldW1qcy1hYmkgcmVtb3ZlcyAwIHBhZGRpbmcgYXQgdGhlIHN0YXJ0IG9mIGFkZHJlc3NlcyxcbiAgICAvLyBzbyB3ZSBzaG91bGQgcGFkIHVudGlsIHRoZXkgYXJlIHRoZSBzdGFuZGFyZCAyMCBieXRlc1xuICAgIGNvbnN0IHBhZGRlZEFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHN0cmlwSGV4UHJlZml4KGFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG5cbiAgICByZXR1cm4geyBvd25lcnM6IHBhZGRlZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IGFkZEhleFByZWZpeChhZGRyZXNzKSkgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVYxV2FsbGV0VHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHYxQ3JlYXRlV2FsbGV0TWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzBdIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHNhbHRCdWZmZXIgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzFdO1xuICAgIGNvbnN0IHNhbHQgPSBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlcik7XG4gICAgY29uc3QgcGFkZGVkQWRkcmVzc2VzID0gYWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gc3RyaXBIZXhQcmVmaXgoYWRkcmVzcy50b1N0cmluZygpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG4gICAgY29uc3Qgb3duZXJzID0gcGFkZGVkQWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gYWRkSGV4UHJlZml4KGFkZHJlc3MpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJzLFxuICAgICAgc2FsdCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCB0cmFuc2ZlciBkYXRhIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHBhcmFtIGlzRmlyc3RTaWduZXIgd2hldGhlciB0cmFuc2FjdGlvbiBpcyBiZWluZyBidWlsdCBmb3IgYSBmaXJzdCBzaWduZXJcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nLCBpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IFRyYW5zZmVyRGF0YSB7XG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgcmV0dXJuIGRlY29kZU5hdGl2ZVRyYW5zZmVyRGF0YShkYXRhLCBpc0ZpcnN0U2lnbmVyKTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCkpIHtcbiAgICByZXR1cm4gZGVjb2RlVG9rZW5UcmFuc2ZlckRhdGEoZGF0YSwgaXNGaXJzdFNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCB0cmFuc2ZlciBkYXRhIGZvciB0aGUgc2VuZE11bHRpc2lnVG9rZW4gZnVuY3Rpb24gYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gaXNGaXJzdFNpZ25lciB3aGV0aGVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGJ1aWx0IGZvciBhIGZpcnN0IHNpZ25lclxuICogQHJldHVybnMgcGFyc2VkIHRva2VuIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRva2VuVHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZywgaXNGaXJzdFNpZ25lcj86IGJvb2xlYW4pOiBUb2tlblRyYW5zZmVyRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG4gIGxldCB0bzogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBhbW91bnQ6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdG9rZW5Db250cmFjdEFkZHJlc3M6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwaXJlVGltZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzZXF1ZW5jZUlkOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNpZ25hdHVyZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwcmVmaXg6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoIWlzRmlyc3RTaWduZXIpIHtcbiAgICBbdG8sIGFtb3VudCwgdG9rZW5Db250cmFjdEFkZHJlc3MsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgc2VuZE11bHRpU2lnVG9rZW5UeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIFtwcmVmaXgsIHRvLCBhbW91bnQsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzRmlyc3RTaWduZXIsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uSGFzaFByZWZpeDogaXNGaXJzdFNpZ25lciA/IChwcmVmaXggYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCxcbiAgICB0bzogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5Db250cmFjdEFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVSQzcyMVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcpOiBFUkM3MjFUcmFuc2ZlckRhdGEge1xuICBpZiAoIWRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBjb25zdCBbdG8sIGFtb3VudCwgaW50ZXJuYWxEYXRhLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ01ldGhvZElkLCBkYXRhKVxuICApO1xuXG4gIGNvbnN0IGludGVybmFsRGF0YUhleCA9IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpO1xuXG4gIGlmIChpbnRlcm5hbERhdGFIZXguc3RhcnRzV2l0aChFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIgYXMgc3RyaW5nKSxcbiAgICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tIGFzIHN0cmluZyksXG4gICAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgICAgdXNlckRhdGE6IGJ1ZmZlclRvSGV4KHVzZXJTZW50RGF0YSBhcyBCdWZmZXIpLFxuICAgIH07XG4gIH1cblxuICBpZiAoaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoRVJDNzIxVHJhbnNmZXJGcm9tTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBFUkM3MjFUcmFuc2ZlckZyb21UeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoRVJDNzIxVHJhbnNmZXJGcm9tTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIgYXMgc3RyaW5nKSxcbiAgICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tIGFzIHN0cmluZyksXG4gICAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgICAgdXNlckRhdGE6ICcnLFxuICAgIH07XG4gIH1cblxuICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFUkMxMTU1VHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IEVSQzExNTVUcmFuc2ZlckRhdGEge1xuICBsZXQgZnJvbSwgcmVjZWl2ZXIsIHVzZXJTZW50RGF0YTtcbiAgbGV0IHRva2VuSWRzOiBzdHJpbmdbXTtcbiAgbGV0IHZhbHVlczogc3RyaW5nW107XG5cbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgc2lnbmF0dXJlXSA9IGdldFJhd0RlY29kZWQoXG4gICAgc2VuZE11bHRpU2lnVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbERhdGFIZXggPSBidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKTtcbiAgaWYgKGludGVybmFsRGF0YUhleC5zdGFydHNXaXRoKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgbGV0IHRva2VuSWQ7XG4gICAgbGV0IHZhbHVlO1xuXG4gICAgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB2YWx1ZSwgdXNlclNlbnREYXRhXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgdG9rZW5JZHMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b2tlbklkKSkudG9GaXhlZCgpXTtcbiAgICB2YWx1ZXMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh2YWx1ZSkpLnRvRml4ZWQoKV07XG4gIH0gZWxzZSBpZiAoYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcikuc3RhcnRzV2l0aChFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVNZXRob2RJZCkpIHtcbiAgICBsZXQgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzO1xuICAgIFtmcm9tLCByZWNlaXZlciwgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLCBpbnRlcm5hbERhdGFIZXgpXG4gICAgKTtcbiAgICB0b2tlbklkcyA9IHRlbXBUb2tlbklkcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gICAgdmFsdWVzID0gdGVtcFZhbHVlcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0bzogYWRkSGV4UHJlZml4KHJlY2VpdmVyKSxcbiAgICBmcm9tOiBhZGRIZXhQcmVmaXgoZnJvbSksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleChhbW91bnQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIHRva2VuSWRzLFxuICAgIHZhbHVlcyxcbiAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgc2lnbmF0dXJlOiBidWZmZXJUb0hleChzaWduYXR1cmUgYXMgQnVmZmVyKSxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgdXNlckRhdGE6IHVzZXJTZW50RGF0YSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIHRyYW5zZmVyIGRhdGEgZm9yIHRoZSBzZW5kTXVsdGlzaWcgZnVuY3Rpb24gYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gaXNGaXJzdFNpZ25lciB3aGV0aGVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGJ1aWx0IGZvciBhIGZpcnN0IHNpZ25lclxuICogQHJldHVybnMgcGFyc2VkIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5hdGl2ZVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogTmF0aXZlVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgbGV0IHRvOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGFtb3VudDogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnRlcm5hbERhdGE6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwaXJlVGltZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzZXF1ZW5jZUlkOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNpZ25hdHVyZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwcmVmaXg6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoIWlzRmlyc3RTaWduZXIpIHtcbiAgICBbdG8sIGFtb3VudCwgaW50ZXJuYWxEYXRhLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIFtwcmVmaXgsIHRvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgc2VuZE11bHRpU2lnVHlwZXNGaXJzdFNpZ25lcixcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uSGFzaFByZWZpeDogaXNGaXJzdFNpZ25lciA/IChwcmVmaXggYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCxcbiAgICB0bzogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIGRhdGE6IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpLFxuICB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgZmx1c2ggdG9rZW5zIGRhdGEgYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gdG8gT3B0aW9uYWwgdG8gcGFyYW1ldGVyIG9mIHR4XG4gKiBAcmV0dXJucyBwYXJzZWQgdHJhbnNmZXIgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hUb2tlbnNEYXRhKGRhdGE6IHN0cmluZywgdG8/OiBzdHJpbmcpOiBGbHVzaFRva2Vuc0RhdGEge1xuICBpZiAoZGF0YS5zdGFydHNXaXRoKGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzc10gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hUb2tlbnNUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGNvbnN0IFt0b2tlbkFkZHJlc3NdID0gZ2V0UmF3RGVjb2RlZChmbHVzaFRva2Vuc1R5cGVzdjQsIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0LCBkYXRhKSk7XG4gICAgaWYgKCF0bykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgTWlzc2luZyB0byBhZGRyZXNzOiAke3RvfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm9yd2FyZGVyQWRkcmVzczogdG8sXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEge1xuICB0b0FkZHJlc3M6IHN0cmluZztcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gIGlucHV0UHJvb2Y6IHN0cmluZztcbiAgZXhwaXJlVGltZTogc3RyaW5nO1xuICBzZXF1ZW5jZUlkOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY29kZSBBQkktZW5jb2RlZCBjb25maWRlbnRpYWwgdHJhbnNmZXIgZGF0YSAoc2VuZE11bHRpU2lnIHdyYXBwaW5nIGNvbmZpZGVudGlhbFRyYW5zZmVyKVxuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBmdWxsIGNhbGxkYXRhIGhleCBzdHJpbmdcbiAqIEByZXR1cm5zIHBhcnNlZCBjb25maWRlbnRpYWwgdHJhbnNmZXIgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgLy8gSW5jbHVkZSBvbmx5IHRoZSA0LWJ5dGUgbWV0aG9kIElEIGluIHRoZSBlcnJvciB0byBhdm9pZCBsZWFraW5nIGVuY3J5cHRlZCBwYXlsb2FkcyBpbnRvIGxvZ3MuXG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBieXRlY29kZTogdW5leHBlY3RlZCBtZXRob2QgSUQgJHtkYXRhLnNsaWNlKDAsIDEwKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFt0b2tlbkNvbnRyYWN0QWRkcmVzcywgLCBpbnRlcm5hbERhdGEsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICk7XG5cbiAgY29uc3QgaW50ZXJuYWxEYXRhSGV4ID0gYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcik7XG4gIGlmICghaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCkpIHtcbiAgICAvLyBJbmNsdWRlIG9ubHkgdGhlIDQtYnl0ZSBtZXRob2QgSUQgaW4gdGhlIGVycm9yIHRvIGF2b2lkIGxlYWtpbmcgZW5jcnlwdGVkIHBheWxvYWRzIGludG8gbG9ncy5cbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgYEludmFsaWQgY29uZmlkZW50aWFsIHRyYW5zZmVyIGlubmVyIGNhbGxkYXRhOiB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke2ludGVybmFsRGF0YUhleC5zbGljZSgwLCAxMCl9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbdG9BZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUsIGlucHV0UHJvb2ZdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZlR5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCwgaW50ZXJuYWxEYXRhSGV4KVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdG9BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkNvbnRyYWN0QWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIGVuY3J5cHRlZEhhbmRsZTogYnVmZmVyVG9IZXgoZW5jcnlwdGVkSGFuZGxlIGFzIEJ1ZmZlciksXG4gICAgaW5wdXRQcm9vZjogYnVmZmVyVG9IZXgoaW5wdXRQcm9vZiBhcyBCdWZmZXIpLFxuICAgIGV4cGlyZVRpbWU6IGJ1ZmZlclRvSW50KGV4cGlyZVRpbWUgYXMgQnVmZmVyKS50b1N0cmluZygpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKS50b1N0cmluZygpLFxuICAgIHNpZ25hdHVyZTogYnVmZmVyVG9IZXgoc2lnbmF0dXJlIGFzIEJ1ZmZlciksXG4gIH07XG59XG5cbi8qKlxuICogRGVjb2RlIGEgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gdHJhbnNhY3Rpb24ncyBjYWxsZGF0YSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGZ1bGwgY2FsbGRhdGEgaGV4IHN0cmluZyAoY2FsbEZyb21QYXJlbnQgd3JhcHBpbmcgY29uZmlkZW50aWFsVHJhbnNmZXIpXG4gKiBAcGFyYW0gdG8gICBUaGUgYHRvYCBmaWVsZCBvZiB0aGUgdHJhbnNhY3Rpb24gKGVxdWFscyB0aGUgZm9yd2FyZGVyIGFkZHJlc3MgZm9yIFY0KVxuICogQHJldHVybnMgRGVjb2RlZCBmaWVsZHMgaW5jbHVkaW5nIGZvcndhcmRlckFkZHJlc3MsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBwYXJlbnRBZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuRGF0YShkYXRhOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkRhdGEge1xuICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCBwYXJlbnRBZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUgfSA9IGRlY29kZUZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuQ2FsbGRhdGEoZGF0YSk7XG4gIHJldHVybiB7XG4gICAgZm9yd2FyZGVyQWRkcmVzczogdG8sXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgcGFyZW50QWRkcmVzcyxcbiAgICBlbmNyeXB0ZWRIYW5kbGUsXG4gIH07XG59XG5cbi8qKlxuICogQ2xhc3NpZnkgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGRhdGEgYmFzZWQgYXMgYSB0cmFuc2FjdGlvbiB0eXBlLlxuICogRVRIIHRyYW5zYWN0aW9ucyBhcmUgZGVmaW5lZCBieSB0aGUgZmlyc3QgOCBieXRlcyBvZiB0aGUgdHJhbnNhY3Rpb24gZGF0YSwgYWxzbyBrbm93biBhcyB0aGUgbWV0aG9kIGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gY2xhc3NpZnkgdGhlIHRyYW5zYWN0aW9uIHdpdGhcbiAqIEByZXR1cm5zIHtUcmFuc2FjdGlvblR5cGV9IFRoZSBjbGFzc2lmaWVkIHRyYW5zYWN0aW9uIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5VHJhbnNhY3Rpb24oZGF0YTogc3RyaW5nKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgaWYgKGRhdGEubGVuZ3RoIDwgMTApIHtcbiAgICAvLyBjb250cmFjdCBjYWxscyBtdXN0IGhhdmUgYXQgbGVhc3QgNCBieXRlcyAobWV0aG9kIGlkKSBhbmQgJzB4J1xuICAgIC8vIGlmIGl0IGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB0byBiZSBhIGNvbnRyYWN0IGNhbGwgaXQgbXVzdCBiZSBhIHNpbmdsZSBzaWcgc2VuZFxuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2luZ2xlU2lnU2VuZDtcbiAgfVxuXG4gIC8vIFRPRE8oU1RMWC0xOTcwKTogdmFsaWRhdGUgaWYgd2UgYXJlIGdvaW5nIHRvIGNvbnN0cmFpbnQgdG8gc29tZSBtZXRob2RzIGFsbG93ZWRcbiAgbGV0IHRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZXNNYXBbZGF0YS5zbGljZSgwLCAxMCkudG9Mb3dlckNhc2UoKV07XG5cbiAgLy8gRm9yIHNlbmRNdWx0aVNpZyB0cmFuc2FjdGlvbnMsIHBlZWsgYXQgdGhlIGlubmVyIGNhbGxkYXRhIHRvIGRldGVjdCBTZW5kRVJDNzk4NFxuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCAmJiBkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssICwgaW50ZXJuYWxEYXRhXSA9IGdldFJhd0RlY29kZWQoc2VuZE11bHRpU2lnVHlwZXMsIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpKTtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YUhleCA9IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpO1xuICAgICAgaWYgKGludGVybmFsRGF0YUhleC5zdGFydHNXaXRoKGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mTWV0aG9kSWQpKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzc5ODQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgYSBjb25maWRlbnRpYWwgdHJhbnNmZXI7IGZhbGwgdGhyb3VnaCB0byBub3JtYWwgY2xhc3NpZmljYXRpb25cbiAgICB9XG4gIH1cblxuICAvLyBQZWVrIGluc2lkZSBjYWxsRnJvbVBhcmVudCB0byBkZXRlY3QgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5cbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gdW5kZWZpbmVkICYmIGRhdGEuc3RhcnRzV2l0aChjYWxsRnJvbVBhcmVudE1ldGhvZElkKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCAsIGlubmVyRGF0YV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgICBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sXG4gICAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoY2FsbEZyb21QYXJlbnRNZXRob2RJZCwgZGF0YSlcbiAgICAgICk7XG4gICAgICBjb25zdCBpbm5lckhleCA9IGJ1ZmZlclRvSGV4KGlubmVyRGF0YSBhcyBCdWZmZXIpO1xuICAgICAgaWYgKGlubmVySGV4LnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQpKSB7XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgYSBjb25maWRlbnRpYWwgZmx1c2g7IGZhbGwgdGhyb3VnaCB0byBDb250cmFjdENhbGxcbiAgICB9XG4gIH1cblxuICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHR5cGVzIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHN0YXJ0aW5nIHBhcnQgb2YgdGhlIGVuY29kZWQgZGF0YVxuICovXG5jb25zdCB0cmFuc2FjdGlvblR5cGVzTWFwID0ge1xuICBbd2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzXTogVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uLFxuICBbcmVjb3ZlcnlXYWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXNdOiBUcmFuc2FjdGlvblR5cGUuUmVjb3ZlcnlXYWxsZXREZXBsb3ltZW50LFxuICBbdjFDcmVhdGVXYWxsZXRNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgW2NyZWF0ZUZvcndhcmRlck1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgW3YxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uLFxuICBbdjRDcmVhdGVGb3J3YXJkZXJNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24sXG4gIFtzZW5kTXVsdGlzaWdNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICBbZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaFRva2VucyxcbiAgW2ZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaFRva2VucyxcbiAgW2ZsdXNoQ29pbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaENvaW5zLFxuICBbZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSxcbiAgW2ZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzcyMSxcbiAgW2ZsdXNoRVJDMTE1NUZvcndhcmRlclRva2Vuc01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSxcbiAgW2ZsdXNoRVJDMTE1NUZvcndhcmRlclRva2Vuc01ldGhvZElkVjRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkMxMTU1LFxuICBbc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICBbTG9ja01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdMb2NrLFxuICBbVm90ZU1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdWb3RlLFxuICBbQWN0aXZhdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUsXG4gIFtVbnZvdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW52b3RlLFxuICBbVW5sb2NrTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayxcbiAgW1dpdGhkcmF3TWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3LFxuICAvLyBhY2xNdWx0aWNhbGxNZXRob2RJZCAobXVsdGljYWxsKGJ5dGVzW10pKSBpcyBpbnRlbnRpb25hbGx5IE5PVCBtYXBwZWQgaGVyZS5cbiAgLy8gY2xhc3NpZnlUcmFuc2FjdGlvbigpIG9ubHkgc2VlcyBjYWxsZGF0YSwgbm90IGB0b2AsIHNvIDB4YWM5NjUwZDggd291bGQgbWlzbGFiZWxcbiAgLy8gYW55IE9wZW5aZXBwZWxpbiBNdWx0aWNhbGxVcGdyYWRlYWJsZSBjYWxsIChyb3V0ZXJzLCBhZ2dyZWdhdG9ycywgdW5yZWxhdGVkIGNvbnRyYWN0cylcbiAgLy8gYXMgRGVjcnlwdGlvbkRlbGVnYXRpb24uIEJ1aWxkZXIgb3V0cHV0ICh3aGljaCBhbHdheXMgdXNlcyBtdWx0aWNhbGwpIHRoZXJlZm9yZVxuICAvLyBjbGFzc2lmaWVzIGFzIENvbnRyYWN0Q2FsbDsgY2FsbGVycyBzaG91bGQgc2V0IFRyYW5zYWN0aW9uVHlwZS5EZWNyeXB0aW9uRGVsZWdhdGlvblxuICAvLyBleHBsaWNpdGx5IHdoZW4gYnVpbGRpbmcgZnJvbSBhIGtub3duIGRlbGVnYXRpb24gdGVtcGxhdGUuXG4gIFtkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRGVjcnlwdGlvbkRlbGVnYXRpb24sXG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtIG51bWJlciB0byBiZSBjb252ZXJ0ZWQgdG8gaGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgaGV4IG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9IZXhTdHJpbmcobnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBoZXggPSBudW0udG9TdHJpbmcoMTYpO1xuICByZXR1cm4gaGV4Lmxlbmd0aCAlIDIgPT09IDAgPyAnMHgnICsgaGV4IDogJzB4MCcgKyBoZXg7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZXggVGhlIGhleCBzdHJpbmcgdG8gYmUgY29udmVydGVkXG4gKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgcmVzdWx0aW5nIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gaGV4U3RyaW5nVG9OdW1iZXIoaGV4OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gcGFyc2VJbnQoaGV4LnNsaWNlKDIpLCAxNik7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGFkZHJlc3Mgb2YgdGhlIGZvcndhcmRlciBhZGRyZXNzIHRvIGJlIGRlcGxveWVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyB0aGUgYWRkcmVzcyB3aGljaCBpcyBjcmVhdGluZyB0aGlzIG5ldyBhZGRyZXNzXG4gKiBAcGFyYW0ge251bWJlcn0gY29udHJhY3RDb3VudGVyIHRoZSBub25jZSBvZiB0aGUgY29udHJhY3QgYWRkcmVzc1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIGNhbGN1bGF0ZWQgZm9yd2FyZGVyIGNvbnRyYWN0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUZvcndhcmRlckFkZHJlc3MoY29udHJhY3RBZGRyZXNzOiBzdHJpbmcsIGNvbnRyYWN0Q291bnRlcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZm9yd2FyZGVyQWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzcyhcbiAgICBCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChjb250cmFjdEFkZHJlc3MpLCAnaGV4JyksXG4gICAgQnVmZmVyLmZyb20ocGFkVG9FdmVuKHN0cmlwSGV4UHJlZml4KG51bWJlclRvSGV4U3RyaW5nKGNvbnRyYWN0Q291bnRlcikpKSwgJ2hleCcpXG4gICk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcy50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZm9yd2FyZGVyIHYxIGFkZHJlc3MgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBpZiBgY3JlYXRvckFkZHJlc3NgIGNyZWF0ZXMgaXQgd2l0aCBzYWx0IGBzYWx0YFxuICogYW5kIGluaXRjb2RlIGBpbmljb2RlIHVzaW5nIHRoZSBjcmVhdGUyIG9wY29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGNyZWF0b3JBZGRyZXNzIFRoZSBhZGRyZXNzIHRoYXQgaXMgc2VuZGluZyB0aGUgdHggdG8gY3JlYXRlIGEgbmV3IGFkZHJlc3MsIGhleCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0IFRoZSBzYWx0IHRvIGNyZWF0ZSB0aGUgYWRkcmVzcyB3aXRoIHVzaW5nIGNyZWF0ZTIsIGhleCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbml0Y29kZSBUaGUgaW5pdGNvZGUgdGhhdCB3aWxsIGJlIGRlcGxveWVkIHRvIHRoZSBhZGRyZXNzLCBoZXggc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjYWxjdWxhdGVkIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUZvcndhcmRlclYxQWRkcmVzcyhjcmVhdG9yQWRkcmVzczogc3RyaW5nLCBzYWx0OiBzdHJpbmcsIGluaXRjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmb3J3YXJkZXJWMUFkZHJlc3MgPSBnZW5lcmF0ZUFkZHJlc3MyKFxuICAgIEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KGNyZWF0b3JBZGRyZXNzKSwgJ2hleCcpLFxuICAgIEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KHNhbHQpLCAnaGV4JyksXG4gICAgQnVmZmVyLmZyb20ocGFkVG9FdmVuKHN0cmlwSGV4UHJlZml4KGluaXRjb2RlKSksICdoZXgnKVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KGZvcndhcmRlclYxQWRkcmVzcy50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIFRha2UgdGhlIGltcGxlbWVudGF0aW9uIGFkZHJlc3MgZm9yIHRoZSBwcm94eSBjb250cmFjdCwgYW5kIGdldCB0aGUgYmluYXJ5IGluaXRjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBwcm94eVxuICogQHBhcmFtIHtzdHJpbmd9IGltcGxlbWVudGF0aW9uQWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gY29udHJhY3QgZm9yIHRoZSBwcm94eVxuICogQHJldHVybiB7c3RyaW5nfSBCaW5hcnkgaGV4IHN0cmluZyBvZiB0aGUgcHJveHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3h5SW5pdGNvZGUoaW1wbGVtZW50YXRpb25BZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXQgPSBzdHJpcEhleFByZWZpeChpbXBsZW1lbnRhdGlvbkFkZHJlc3MudG9Mb3dlckNhc2UoKSkucGFkU3RhcnQoNDAsICcwJyk7XG5cbiAgLy8gYnl0ZWNvZGUgb2YgdGhlIHByb3h5LCBmcm9tOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vQml0R28vZXRoLW11bHRpc2lnLXY0L2Jsb2IvZDU0NmE5MzdmOTBmOTNlODNiMzQyM2E1YmY5MzNkMWQ3N2M2NzdjMy9jb250cmFjdHMvQ2xvbmVGYWN0b3J5LnNvbCNMNDItTDU2XG4gIHJldHVybiBgMHgzZDYwMmQ4MDYwMGEzZDM5ODFmMzM2M2QzZDM3M2QzZDNkMzYzZDczJHt0YXJnZXR9NWFmNDNkODI4MDNlOTAzZDkxNjAyYjU3ZmQ1YmYzYDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBzaWduYXR1cmUgcGFydHMgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVBhcnRzfSBzaWcgVGhlIHNpZ25hdHVyZSB0byBjb252ZXJ0IHRvIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzaWduYXR1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nU2lnKHNpZzogU2lnbmF0dXJlUGFydHMpOiBzdHJpbmcge1xuICByZXR1cm4gYnVmZmVyVG9IZXgoXG4gICAgQnVmZmVyLmNvbmNhdChbXG4gICAgICBzZXRMZW5ndGhMZWZ0KEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KHNpZy5yKSwgJ2hleCcpLCAzMiksXG4gICAgICBzZXRMZW5ndGhMZWZ0KEJ1ZmZlci5mcm9tKHN0cmlwSGV4UHJlZml4KHNpZy5zKSwgJ2hleCcpLCAzMiksXG4gICAgICB0b0J1ZmZlcihzaWcudiksXG4gICAgXSlcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHR4IGRhdGEgaGFzIGEgc2lnbmF0dXJlXG4gKlxuICogQHBhcmFtIHtUeERhdGF9IHR4RGF0YSBUaGUgdHJhbnNhY3Rpb24gZGF0YSB0byBjaGVjayBmb3Igc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgdHggaGFzIGEgc2lnbmF0dXJlLCBlbHNlIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTaWduYXR1cmUodHhEYXRhOiBUeERhdGEpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eERhdGEudiAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHhEYXRhLnIgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR4RGF0YS5zICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eERhdGEudi5sZW5ndGggPiAwICYmXG4gICAgdHhEYXRhLnIubGVuZ3RoID4gMCAmJlxuICAgIHR4RGF0YS5zLmxlbmd0aCA+IDBcbiAgKTtcbn1cblxudHlwZSBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyA9IHN0cmluZyB8IEJ1ZmZlciB8IEJOIHwgUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmdbXTtcblxuLyoqXG4gKiBHZXQgdGhlIHJhdyBkYXRhIGRlY29kZWQgZm9yIHNvbWUgdHlwZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0eXBlcyBBQkkgdHlwZXMgZGVmaW5pdGlvblxuICogQHBhcmFtIHtCdWZmZXJ9IHNlcmlhbGl6ZWRBcmdzIGVuY29kZWQgYXJnc1xuICogQHJldHVybnMge0J1ZmZlcltdfSB0aGUgZGVjb2RlZCByYXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJhd0RlY29kZWQodHlwZXM6IHN0cmluZ1tdLCBzZXJpYWxpemVkQXJnczogQnVmZmVyKTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmdbXSB7XG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZSh2OiB1bmtub3duLCBpOiBudW1iZXIpOiB1bmtub3duIHtcbiAgICBpZiAoQk4uaXNCTih2KSkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgQnVmZmVyLmlzQnVmZmVyKHYpKSB7XG4gICAgICByZXR1cm4gdjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgIHJldHVybiB2Lm1hcChub3JtYWxpemUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciAke3R5cGVzfVske2l9XSBnb3QgJHt0eXBlb2Ygdn1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRXRoZXJldW1BYmkucmF3RGVjb2RlKHR5cGVzLCBzZXJpYWxpemVkQXJncykubWFwKG5vcm1hbGl6ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBidWZmZXJlZCBieXRlY29kZSBmcm9tIHJhd0RhdGEgdXNpbmcgYSBtZXRob2RJZCBhcyBkZWxpbWl0ZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kSWQgdGhlIGhleCBlbmNvZGVkIG1ldGhvZCBJZFxuICogQHBhcmFtIHtzdHJpbmd9IHJhd0RhdGEgdGhlIGhleCBlbmNvZGVkIHJhdyBkYXRhXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBkYXRhIGJ1ZmZlcmVkIGJ5dGVjb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWZmZXJlZEJ5dGVDb2RlKG1ldGhvZElkOiBzdHJpbmcsIHJhd0RhdGE6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IHNwbGl0Qnl0ZWNvZGUgPSByYXdEYXRhLnNwbGl0KG1ldGhvZElkKTtcbiAgaWYgKHNwbGl0Qnl0ZWNvZGUubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBzZW5kIGJ5dGVjb2RlOiAke3Jhd0RhdGF9YCk7XG4gIH1cbiAgaWYgKHNwbGl0Qnl0ZWNvZGVbMV0ubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgc2VuZCBieXRlY29kZTogJHtyYXdEYXRhfSAod3JvbmcgbGVuZ2h0KWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShzcGxpdEJ5dGVjb2RlWzFdLCAnaGV4Jyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0aWNzIGNvaW4gb2JqZWN0IG1hdGNoaW5nIGEgZ2l2ZW4gY29udHJhY3QgYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgVGhlIGNvbnRyYWN0IGFkZHJlc3MgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHBhcmFtIG5ldHdvcmsgLSB0aGUgY29pbiBuZXR3b3JrXG4gKiBAcGFyYW0gZmFtaWx5IC0gdGhlIGNvaW4gZmFtaWx5XG4gKiBAcmV0dXJucyBzdGF0aWNzIEJhc2VDb2luIG9iamVjdCBmb3IgdGhlIG1hdGNoaW5nIHRva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbihcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgbmV0d29yazogQmFzZU5ldHdvcmssXG4gIGZhbWlseTogc3RyaW5nXG4pOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICAvLyBmaWx0ZXIgdGhlIGNvaW5zIGFycmF5IHRvIGZpbmQgdGhlIHRva2VuIHdpdGggdGhlIG1hdGNoaW5nIGNvbnRyYWN0IGFkZHJlc3MsIG5ldHdvcmsgYW5kIGNvaW4gZmFtaWx5XG4gIC8vIGNvaW4gZmFtaWx5IGlzIG5lZWRlZCB0byBhdm9pZCBjYXVzaW5nIGlzc3VlcyB3aGVuIGEgdG9rZW4gaGFzIHNhbWUgY29udHJhY3QgYWRkcmVzcyBvbiB0d28gZGlmZmVyZW50IGNoYWluc1xuICBjb25zdCB0b2tlbnMgPSBjb2lucy5maWx0ZXIoKGNvaW4pID0+IHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJlxuICAgICAgICBjb2luLmZhbWlseSA9PT0gZmFtaWx5ICYmXG4gICAgICAgIGNvaW4uY29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gaWYgbGVuZ3RoIG9mIHRva2VucyBpcyAxLCByZXR1cm4gdGhlIGZpcnN0LCBlbHNlIHJldHVybiB1bmRlZmluZWRcbiAgLy8gQ2FuJ3QgZGlyZWN0bHkgaW5kZXggaW50byB0b2tlbnMsIG9yIGNhbGwgYGxlbmd0aGAsIHNvIHdlIHVzZSBtYXAgdG8gZ2V0IGFuIGFycmF5XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlIHdhbGxldCBtZXRob2QgY2FsbGluZyBkYXRhIGZvciB2MSB3YWxsZXRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gd2FsbGV0T3duZXJzIC0gd2FsbGV0IG93bmVyIGFkZHJlc3NlcyBmb3Igd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgLSBUaGUgc2FsdCBmb3Igd2FsbGV0IGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlV2FsbGV0IG1ldGhvZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWMVdhbGxldEluaXRpYWxpemF0aW9uRGF0YSh3YWxsZXRPd25lcnM6IHN0cmluZ1tdLCBzYWx0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzYWx0QnVmZmVyID0gc2V0TGVuZ3RoTGVmdCh0b0J1ZmZlcihzYWx0KSwgMzIpO1xuICBjb25zdCBwYXJhbXMgPSBbd2FsbGV0T3duZXJzLCBzYWx0QnVmZmVyXTtcbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NyZWF0ZVdhbGxldCcsIGNyZWF0ZVYxV2FsbGV0VHlwZXMpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGNyZWF0ZVYxV2FsbGV0VHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgYWRkcmVzcyBtZXRob2QgY2FsbGluZyBkYXRhIGZvciB2MSwgdjIsIHY0IGZvcndhcmRlcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZUFkZHJlc3MgLSBUaGUgYWRkcmVzcyBvZiB0aGUgd2FsbGV0IGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCAtIFRoZSBzYWx0IGZvciBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGZlZUFkZHJlc3MgLSBUaGUgZmVlIGFkZHJlc3MgZm9yIHRoZSBlbnRlcnByaXNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFYxQWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YShiYXNlQWRkcmVzczogc3RyaW5nLCBzYWx0OiBzdHJpbmcsIGZlZUFkZHJlc3M/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzYWx0QnVmZmVyID0gc2V0TGVuZ3RoTGVmdCh0b0J1ZmZlcihzYWx0KSwgMzIpO1xuICBjb25zdCB7IGNyZWF0ZUZvcndhcmRlclBhcmFtcywgY3JlYXRlRm9yd2FyZGVyVHlwZXMgfSA9IGdldENyZWF0ZUZvcndhcmRlclBhcmFtc0FuZFR5cGVzKFxuICAgIGJhc2VBZGRyZXNzLFxuICAgIHNhbHRCdWZmZXIsXG4gICAgZmVlQWRkcmVzc1xuICApO1xuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjcmVhdGVGb3J3YXJkZXInLCBjcmVhdGVGb3J3YXJkZXJUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoY3JlYXRlRm9yd2FyZGVyVHlwZXMsIGNyZWF0ZUZvcndhcmRlclBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgYWRkcmVzcyBtZXRob2QgY2FsbGluZyBkYXRhIGZvciBhbGwgZm9yd2FyZGVyIHZlcnNpb25zXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZvcndhcmRlclZlcnNpb24gLSBUaGUgdmVyc2lvbiBvZiB0aGUgZm9yd2FyZGVyIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VBZGRyZXNzIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldCBjb250cmFjdFxuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgLSBUaGUgc2FsdCBmb3IgYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWVBZGRyZXNzIC0gVGhlIGZlZSBhZGRyZXNzIGZvciB0aGUgZW50ZXJwcmlzZVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlRm9yd2FyZGVyIG1ldGhvZCBlbmNvZGVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkcmVzc0luaXREYXRhQWxsRm9yd2FyZGVyVmVyc2lvbnMoXG4gIGZvcndhcmRlclZlcnNpb246IG51bWJlcixcbiAgYmFzZUFkZHJlc3M6IHN0cmluZyxcbiAgc2FsdDogc3RyaW5nLFxuICBmZWVBZGRyZXNzPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoZm9yd2FyZGVyVmVyc2lvbiA9PT0gZGVmYXVsdEZvcndhcmRlclZlcnNpb24pIHtcbiAgICByZXR1cm4gZ2V0QWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YSgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRWMUFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoYmFzZUFkZHJlc3MsIHNhbHQsIGZlZUFkZHJlc3MpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlRm9yd2FyZGVyVHlwZXMgYW5kIGNyZWF0ZUZvcndhcmRlclBhcmFtcyBmb3IgYWxsIGZvcndhcmRlciB2ZXJzaW9uc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlQWRkcmVzcyAtIFRoZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAqIEBwYXJhbSB7QnVmZmVyfSBzYWx0QnVmZmVyIC0gVGhlIHNhbHQgZm9yIGFkZHJlc3MgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWVBZGRyZXNzIC0gVGhlIGZlZSBhZGRyZXNzIGZvciB0aGUgZW50ZXJwcmlzZVxuICogQHJldHVybnMge2NyZWF0ZUZvcndhcmRlclBhcmFtczogKHN0cmluZyB8IEJ1ZmZlcilbXSwgY3JlYXRlRm9yd2FyZGVyVHlwZXM6IHN0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3JlYXRlRm9yd2FyZGVyUGFyYW1zQW5kVHlwZXMoXG4gIGJhc2VBZGRyZXNzOiBzdHJpbmcsXG4gIHNhbHRCdWZmZXI6IEJ1ZmZlcixcbiAgZmVlQWRkcmVzcz86IHN0cmluZ1xuKTogeyBjcmVhdGVGb3J3YXJkZXJQYXJhbXM6IChzdHJpbmcgfCBCdWZmZXIpW107IGNyZWF0ZUZvcndhcmRlclR5cGVzOiBzdHJpbmdbXSB9IHtcbiAgbGV0IGNyZWF0ZUZvcndhcmRlclBhcmFtcyA9IFtiYXNlQWRkcmVzcywgc2FsdEJ1ZmZlcl07XG4gIGxldCBjcmVhdGVGb3J3YXJkZXJUeXBlcyA9IGNyZWF0ZVYxRm9yd2FyZGVyVHlwZXM7XG4gIGlmIChmZWVBZGRyZXNzKSB7XG4gICAgY3JlYXRlRm9yd2FyZGVyUGFyYW1zID0gW2Jhc2VBZGRyZXNzLCBmZWVBZGRyZXNzLCBzYWx0QnVmZmVyXTtcbiAgICBjcmVhdGVGb3J3YXJkZXJUeXBlcyA9IGNyZWF0ZVY0Rm9yd2FyZGVyVHlwZXM7XG4gIH1cbiAgcmV0dXJuIHsgY3JlYXRlRm9yd2FyZGVyUGFyYW1zLCBjcmVhdGVGb3J3YXJkZXJUeXBlcyB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgY3JlYXRlIGZvcndhcmRlciBkYXRhIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHJldHVybnMgcGFyc2VkIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZvcndhcmRlckNyZWF0aW9uRGF0YShkYXRhOiBzdHJpbmcpOiBGb3J3YXJkZXJJbml0aWFsaXphdGlvbkRhdGEge1xuICBpZiAoXG4gICAgIShcbiAgICAgIGRhdGEuc3RhcnRzV2l0aCh2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkKSB8fFxuICAgICAgZGF0YS5zdGFydHNXaXRoKHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpIHx8XG4gICAgICBkYXRhLnN0YXJ0c1dpdGgoY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpXG4gICAgKVxuICApIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGFkZHJlc3MgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbiAgfVxuXG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiB1bmRlZmluZWQsXG4gICAgICBmZWVBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgodjFDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCkpIHtcbiAgICBjb25zdCBbYmFzZUFkZHJlc3MsIHNhbHRCdWZmZXJdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVYxRm9yd2FyZGVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlQWRkcmVzczogYWRkSGV4UHJlZml4KGJhc2VBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlciksXG4gICAgICBmZWVBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgfSBhcyBjb25zdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbYmFzZUFkZHJlc3MsIGZlZUFkZHJlc3MsIHNhbHRCdWZmZXJdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVY0Rm9yd2FyZGVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHY0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlQWRkcmVzczogYWRkSGV4UHJlZml4KGJhc2VBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICBhZGRyZXNzQ3JlYXRpb25TYWx0OiBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlciksXG4gICAgICBmZWVBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZmVlQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIH0gYXMgY29uc3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIGEgcXVlcnkgdG8gZXhwbG9yZXIgZm9yIGluZm9ybWF0aW9uIHN1Y2ggYXMgYmFsYW5jZSwgdG9rZW4gYmFsYW5jZSwgc29saWRpdHkgY2FsbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBxdWVyeSBrZXktdmFsdWUgcGFpcnMgb2YgcGFyYW1ldGVycyB0byBhcHBlbmQgYWZ0ZXIgL2FwaVxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuIHRoZSBBUEkgdG9rZW4gdG8gdXNlIGZvciB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGxvcmVyVXJsIHRoZSBVUkwgb2YgdGhlIGV4cGxvcmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSByZXNwb25zZSBmcm9tIGV4cGxvcmVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KFxuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgZXhwbG9yZXJVcmw6IHN0cmluZyxcbiAgdG9rZW4/OiBzdHJpbmdcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgaWYgKHRva2VuKSB7XG4gICAgcXVlcnkuYXBpa2V5ID0gdG9rZW47XG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LmdldChgJHtleHBsb3JlclVybH0vYXBpYCkucXVlcnkocXVlcnkpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFjaCBleHBsb3JlcicpO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmJvZHkuc3RhdHVzID09PSAnMCcgJiYgcmVzcG9uc2UuYm9keS5tZXNzYWdlID09PSAnTk9UT0snKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsb3JlciByYXRlIGxpbWl0IHJlYWNoZWQnKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UuYm9keTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGV4cGlyZSB0aW1lIGZvciBhIGNvbnRyYWN0IGNhbGwgKDEgd2VlaylcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRpbWUgaW4gc2Vjb25kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cGlyZVRpbWUoKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKSArIDYwICogNjAgKiAyNCAqIDc7XG59XG4iXX0=
946
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBcUdBLDhCQVdDO0FBV0Qsb0NBV0M7QUFTRCxvQkFFQztBQWFELDRDQVlDO0FBYUQsc0RBYUM7QUFRRCwwQ0FlQztBQUtELHdDQUtDO0FBU0Qsc0RBb0JDO0FBUUQsa0VBbUNDO0FBU0Qsd0RBb0JDO0FBUUQsb0VBbUNDO0FBT0Qsb0VBRUM7QUFRRCw4Q0FFQztBQVFELHNDQUdDO0FBUUQsNERBeUNDO0FBU0QsZ0RBUUM7QUFTRCwwREFnQ0M7QUFFRCw0REFtREM7QUFFRCw4REFrREM7QUFTRCw0REFpQ0M7QUFTRCxzREF1QkM7QUFrQkQsd0VBbUNDO0FBa0JELDRGQWdCQztBQVNELG9GQVFDO0FBU0Qsa0RBNENDO0FBeUNELDhDQUdDO0FBT0QsOENBRUM7QUFTRCw4REFNQztBQVVELGtFQU9DO0FBT0QsNENBTUM7QUFRRCxrQ0FRQztBQVFELG9DQVNDO0FBV0Qsc0NBY0M7QUFTRCxrREFTQztBQVVELDRCQTJCQztBQVNELHNFQU1DO0FBVUQsd0VBV0M7QUFZRCx3RkFXQztBQVVELDRFQVlDO0FBUUQsa0VBd0NDO0FBU0QsMEVBa0JDO0FBTUQsb0RBRUM7QUFyc0NELG1DQUFnQztBQUNoQyw0REFBaUM7QUFDakMsb0RBQTRCO0FBQzVCLHFEQVd5QjtBQUN6QixpREFBaUg7QUFDakgsb0VBQXlDO0FBQ3pDLGdFQUFnRDtBQUNoRCxrREFBdUI7QUFDdkIsZ0VBQXFDO0FBQ3JDLG1EQVU4QjtBQWdCOUIsNkNBMkNzQjtBQUN0QixtQ0FBNkM7QUFDN0MsMkNBS3FCO0FBRXJCOztHQUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE9BQXdCO0lBQ2hELE9BQU8sZ0JBQWMsQ0FBQyxjQUFjO0lBQ2xDLHdFQUF3RTtJQUN4RSxTQUFTLEVBQ1Q7UUFDRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIs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QW1CLEVBQ25CLEtBQWM7SUFFZCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sb0JBQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQjtJQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gIGFkZEhleFByZWZpeCxcbiAgYnVmZmVyVG9IZXgsXG4gIGJ1ZmZlclRvSW50LFxuICBnZW5lcmF0ZUFkZHJlc3MsXG4gIGlzVmFsaWRBZGRyZXNzLFxuICBzZXRMZW5ndGhMZWZ0LFxuICBzdHJpcEhleFByZWZpeCxcbiAgdG9CdWZmZXIsXG4gIGdlbmVyYXRlQWRkcmVzczIsXG4gIHBhZFRvRXZlbixcbn0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCB7IEJhc2VDb2luLCBCYXNlTmV0d29yaywgY29pbnMsIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiwgRXRoZXJldW1OZXR3b3JrIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuaW1wb3J0IEV0aGVyZXVtQ29tbW9uIGZyb20gJ0BldGhlcmV1bWpzL2NvbW1vbic7XG5pbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVNZXRob2RJZCxcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBMb2NrTWV0aG9kSWQsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBVbmxvY2tNZXRob2RJZCxcbiAgVW52b3RlTWV0aG9kSWQsXG4gIFZvdGVNZXRob2RJZCxcbiAgV2l0aGRyYXdNZXRob2RJZCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBFUkMxMTU1VHJhbnNmZXJEYXRhLFxuICBFUkM3MjFUcmFuc2ZlckRhdGEsXG4gIEZsdXNoVG9rZW5zRGF0YSxcbiAgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5EYXRhLFxuICBOYXRpdmVUcmFuc2ZlckRhdGEsXG4gIFNpZ25hdHVyZVBhcnRzLFxuICBUb2tlblRyYW5zZmVyRGF0YSxcbiAgVHJhbnNmZXJEYXRhLFxuICBUeERhdGEsXG4gIFdhbGxldEluaXRpYWxpemF0aW9uRGF0YSxcbiAgRm9yd2FyZGVySW5pdGlhbGl6YXRpb25EYXRhLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHtcbiAgY3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQsXG4gIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVzLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZU1ldGhvZElkLFxuICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gIEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVNZXRob2RJZCxcbiAgRVJDNzIxU2FmZVRyYW5zZmVyVHlwZXMsXG4gIEVSQzcyMVRyYW5zZmVyRnJvbU1ldGhvZElkLFxuICBFUkM3MjFUcmFuc2ZlckZyb21UeXBlcyxcbiAgZmx1c2hDb2luc01ldGhvZElkLFxuICBmbHVzaENvaW5zVHlwZXMsXG4gIGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsXG4gIGZsdXNoVG9rZW5zVHlwZXMsXG4gIGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQsXG4gIGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyxcbiAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlc3Y0LFxuICBmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCxcbiAgZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXMsXG4gIGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzdjQsXG4gIHNlbmRNdWx0aXNpZ01ldGhvZElkLFxuICBzZW5kTXVsdGlzaWdUb2tlbk1ldGhvZElkLFxuICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzLFxuICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgd2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzLFxuICB2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICB3YWxsZXRTaW1wbGVDb25zdHJ1Y3RvcixcbiAgY3JlYXRlVjFXYWxsZXRUeXBlcyxcbiAgdjFDcmVhdGVXYWxsZXRNZXRob2RJZCxcbiAgY3JlYXRlVjFGb3J3YXJkZXJUeXBlcyxcbiAgcmVjb3ZlcnlXYWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMsXG4gIGRlZmF1bHRGb3J3YXJkZXJWZXJzaW9uLFxuICBjcmVhdGVWNEZvcndhcmRlclR5cGVzLFxuICB2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxuICBmbHVzaFRva2Vuc1R5cGVzdjQsXG4gIGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCxcbiAgc2VuZE11bHRpU2lnVG9rZW5UeXBlc0ZpcnN0U2lnbmVyLFxuICBzZW5kTXVsdGlTaWdUeXBlc0ZpcnN0U2lnbmVyLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkLFxuICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZlR5cGVzLFxuICBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2ZNZXRob2RJZCxcbn0gZnJvbSAnLi93YWxsZXRVdGlsJztcbmltcG9ydCB7IEV0aFRyYW5zYWN0aW9uRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgY2FsbEZyb21QYXJlbnRNZXRob2RJZCxcbiAgY2FsbEZyb21QYXJlbnRUeXBlcyxcbiAgZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YSxcbiAgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkLFxufSBmcm9tICcuL3phbWFVdGlscyc7XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbihuZXR3b3JrOiBFdGhlcmV1bU5ldHdvcmspOiBFdGhlcmV1bUNvbW1vbiB7XG4gIHJldHVybiBFdGhlcmV1bUNvbW1vbi5mb3JDdXN0b21DaGFpbihcbiAgICAvLyB1c2UgdGhlIG1haW5uZXQgY29uZmlnIGFzIGEgYmFzZSwgb3ZlcnJpZGUgY2hhaW4gaWRzIGFuZCBuZXR3b3JrIG5hbWVcbiAgICAnbWFpbm5ldCcsXG4gICAge1xuICAgICAgbmFtZTogbmV0d29yay50eXBlLFxuICAgICAgbmV0d29ya0lkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgICBjaGFpbklkOiBuZXR3b3JrLmNoYWluSWQsXG4gICAgfSxcbiAgICAnbG9uZG9uJ1xuICApO1xufVxuXG4vKipcbiAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgYXBwcm9wcmlhdGUgYWxnb3JpdGhtXG4gKiBhbmQgdGhlIHByb3ZpZGVkIGNvbW1vbiBmb3IgdGhlIGJsb2NrY2hhaW5cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHBhcmFtIHtFdGhlcmV1bUNvbW1vbn0gY3VzdG9tQ29tbW9uIHRoZSBuZXR3b3JrJ3MgY3VzdG9tIGNvbW1vblxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkludGVybmFsKFxuICB0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSxcbiAga2V5UGFpcjogS2V5UGFpcixcbiAgY3VzdG9tQ29tbW9uOiBFdGhlcmV1bUNvbW1vblxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gIH1cbiAgY29uc3QgZXRoVHggPSBFdGhUcmFuc2FjdGlvbkRhdGEuZnJvbUpzb24odHJhbnNhY3Rpb25EYXRhLCBjdXN0b21Db21tb24pO1xuICBldGhUeC5zaWduKGtleVBhaXIpO1xuICByZXR1cm4gZXRoVHgudG9TZXJpYWxpemVkKCk7XG59XG5cbi8qKlxuICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBhbGdvcml0aG1cbiAqXG4gKiBAcGFyYW0ge1R4RGF0YX0gdHJhbnNhY3Rpb25EYXRhIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHNpZ25cbiAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciB0aGUgc2lnbmVyJ3Mga2V5cGFpclxuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zYWN0aW9uIHNpZ25lZCBhbmQgZW5jb2RlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbih0cmFuc2FjdGlvbkRhdGE6IFR4RGF0YSwga2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBzaWduSW50ZXJuYWwodHJhbnNhY3Rpb25EYXRhLCBrZXlQYWlyLCBnZXRDb21tb24oY29pbnMuZ2V0KCd0ZXRoJykubmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgYWRpdGlvbmFsIG1ldGhvZCBjYWxsIGRhdGFcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHBpcmVUaW1lIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNlY29uZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZUlkIHNlcXVlbmNlIGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIHNpZ25hdHVyZSBvZiB0aGUgY2FsbFxuICogQHJldHVybnMge3N0cmluZ30gLS0gdGhlIGNvbnRyYWN0IG1ldGhvZCBlbmNvZGVkIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRNdWx0aVNpZ0RhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyxcbiAgZXhwaXJlVGltZTogbnVtYmVyLFxuICBzZXF1ZW5jZUlkOiBudW1iZXIsXG4gIHNpZ25hdHVyZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSBbdG8sIHZhbHVlLCB0b0J1ZmZlcihkYXRhKSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgdG9CdWZmZXIoc2lnbmF0dXJlKV07XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdzZW5kTXVsdGlTaWcnLCBzZW5kTXVsdGlTaWdUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoc2VuZE11bHRpU2lnVHlwZXMsIHBhcmFtcyk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb250cmFjdCBtZXRob2QgZW5jb2RlZCBkYXRhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBBbW91bnQgdG8gdHJhbmZlclxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBlcmMyMCB0b2tlbiBjb250cmFjdFxuICogQHBhcmFtIHtudW1iZXJ9IGV4cGlyZVRpbWUgZXhwaXJhdGlvbiB0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2Vjb25kc1xuICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlSWQgc2VxdWVuY2UgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgc2lnbmF0dXJlIG9mIHRoZSBjYWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtLSB0aGUgY29udHJhY3QgbWV0aG9kIGVuY29kZWQgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZE11bHRpU2lnVG9rZW5EYXRhKFxuICB0bzogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICB0b2tlbkNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBleHBpcmVUaW1lOiBudW1iZXIsXG4gIHNlcXVlbmNlSWQ6IG51bWJlcixcbiAgc2lnbmF0dXJlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFt0bywgdmFsdWUsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCB0b0J1ZmZlcihzaWduYXR1cmUpXTtcblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnc2VuZE11bHRpU2lnVG9rZW4nLCBzZW5kTXVsdGlTaWdUb2tlblR5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShzZW5kTXVsdGlTaWdUb2tlblR5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCB0b2tlbnMgY29udHJhY3QgY2FsbFxuICpcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIFRoZSBmb3J3YXJkZXIgYWRkcmVzcyB0byBmbHVzaFxuICogQHBhcmFtIHRva2VuQWRkcmVzcyBUaGUgdG9rZW4gYWRkcmVzcyB0byBmbHVzaCBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaFRva2Vuc0RhdGEoZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nLCB0b2tlbkFkZHJlc3M6IHN0cmluZywgZm9yd2FyZGVyVmVyc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IHBhcmFtczogc3RyaW5nW107XG4gIGxldCBtZXRob2Q6IFVpbnQ4QXJyYXk7XG4gIGxldCBhcmdzOiBVaW50OEFycmF5O1xuXG4gIGlmIChmb3J3YXJkZXJWZXJzaW9uID49IDQpIHtcbiAgICBwYXJhbXMgPSBbdG9rZW5BZGRyZXNzXTtcbiAgICBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmx1c2hUb2tlbnMnLCBmbHVzaFRva2Vuc1R5cGVzdjQpO1xuICAgIGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hUb2tlbnNUeXBlc3Y0LCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIHBhcmFtcyA9IFtmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkFkZHJlc3NdO1xuICAgIG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaEZvcndhcmRlclRva2VucycsIGZsdXNoVG9rZW5zVHlwZXMpO1xuICAgIGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hUb2tlbnNUeXBlcywgcGFyYW1zKTtcbiAgfVxuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCBuYXRpdmUgY29pbnMgY29udHJhY3QgY2FsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hDb2luc0RhdGEoKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW107XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaCcsIGZsdXNoQ29pbnNUeXBlcyk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoZmx1c2hDb2luc1R5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhIHJlcXVpcmVkIHRvIG1ha2UgYSBmbHVzaCBFUkM3MjEgdG9rZW5zIGNvbnRyYWN0IGNhbGxcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIC0gVGhlIGZvcndhcmRlciBhZGRyZXNzIChmb3IgdjAtdjMpXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gVGhlIEVSQzcyMSB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gdG9rZW5JZCAtIFRoZSB0b2tlbiBJRCB0byBmbHVzaFxuICogQHBhcmFtIGZvcndhcmRlclZlcnNpb24gLSBUaGUgZm9yd2FyZGVyIHZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoRVJDNzIxVG9rZW5zRGF0YShcbiAgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5JZDogc3RyaW5nLFxuICBmb3J3YXJkZXJWZXJzaW9uOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGxldCBwYXJhbXM6IChzdHJpbmcgfCBCdWZmZXIpW107XG4gIGxldCBtZXRob2Q6IFVpbnQ4QXJyYXk7XG4gIGxldCBhcmdzOiBVaW50OEFycmF5O1xuXG4gIGlmIChmb3J3YXJkZXJWZXJzaW9uID49IDQpIHtcbiAgICBwYXJhbXMgPSBbdG9rZW5BZGRyZXNzLCB0b2tlbklkXTtcbiAgICBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmx1c2hFUkM3MjFUb2tlbicsIGZsdXNoRVJDNzIxVG9rZW5zVHlwZXN2NCk7XG4gICAgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaEVSQzcyMVRva2Vuc1R5cGVzdjQsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zID0gW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF07XG4gICAgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zJywgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyk7XG4gICAgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShmbHVzaEVSQzcyMVRva2Vuc1R5cGVzLCBwYXJhbXMpO1xuICB9XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIGZsdXNoIEVSQzcyMSB0b2tlbnMgZGF0YVxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gdG8gVGhlIHRvIGFkZHJlc3MgKGNvbnRyYWN0IGFkZHJlc3MgZm9yIHY0KylcbiAqIEByZXR1cm5zIHBhcnNlZCBmbHVzaCBkYXRhIHdpdGggZm9yd2FyZGVyQWRkcmVzcywgdG9rZW5BZGRyZXNzLCB0b2tlbklkIGFuZCBmb3J3YXJkZXJWZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbHVzaEVSQzcyMVRva2Vuc0RhdGEoXG4gIGRhdGE6IHN0cmluZyxcbiAgdG8/OiBzdHJpbmdcbik6IHtcbiAgZm9yd2FyZGVyQWRkcmVzczogc3RyaW5nO1xuICB0b2tlbkFkZHJlc3M6IHN0cmluZztcbiAgdG9rZW5JZDogc3RyaW5nO1xuICBmb3J3YXJkZXJWZXJzaW9uPzogbnVtYmVyO1xufSB7XG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGlmICghdG8pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYE1pc3NpbmcgdG8gYWRkcmVzczogJHt0b31gKTtcbiAgICB9XG4gICAgY29uc3QgW3Rva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlc3Y0LFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShmbHVzaEVSQzcyMUZvcndhcmRlclRva2Vuc01ldGhvZElkVjQsIGRhdGEpXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yd2FyZGVyQWRkcmVzczogdG8sXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBmb3J3YXJkZXJWZXJzaW9uOiA0LFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZGF0YS5zdGFydHNXaXRoKGZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkM3MjFUb2tlbnNUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hFUkM3MjFGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICB0b2tlbklkOiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRva2VuSWQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBmbHVzaCBFUkM3MjEgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGEgcmVxdWlyZWQgdG8gbWFrZSBhIGZsdXNoIEVSQzExNTUgdG9rZW5zIGNvbnRyYWN0IGNhbGxcbiAqIEBwYXJhbSBmb3J3YXJkZXJBZGRyZXNzIC0gVGhlIGZvcndhcmRlciBhZGRyZXNzIChmb3IgdjAtdjMpXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gVGhlIEVSQzExNTUgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuSWQgLSBUaGUgdG9rZW4gSUQgdG8gZmx1c2hcbiAqIEBwYXJhbSBmb3J3YXJkZXJWZXJzaW9uIC0gVGhlIGZvcndhcmRlciB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaEVSQzExNTVUb2tlbnNEYXRhKFxuICBmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbklkOiBzdHJpbmcsXG4gIGZvcndhcmRlclZlcnNpb246IG51bWJlclxuKTogc3RyaW5nIHtcbiAgbGV0IHBhcmFtczogKHN0cmluZyB8IEJ1ZmZlcilbXTtcbiAgbGV0IG1ldGhvZDogVWludDhBcnJheTtcbiAgbGV0IGFyZ3M6IFVpbnQ4QXJyYXk7XG5cbiAgaWYgKGZvcndhcmRlclZlcnNpb24gPj0gNCkge1xuICAgIHBhcmFtcyA9IFt0b2tlbkFkZHJlc3MsIHRva2VuSWRdO1xuICAgIG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdmbHVzaEVSQzExNTVUb2tlbnMnLCBmbHVzaEVSQzExNTVUb2tlbnNUeXBlc3Y0KTtcbiAgICBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzdjQsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zID0gW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF07XG4gICAgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ2ZsdXNoRVJDMTE1NUZvcndhcmRlclRva2VucycsIGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzKTtcbiAgICBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGZsdXNoRVJDMTE1NVRva2Vuc1R5cGVzLCBwYXJhbXMpO1xuICB9XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIGZsdXNoIEVSQzExNTUgdG9rZW5zIGRhdGFcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHBhcmFtIHRvIFRoZSB0byBhZGRyZXNzIChjb250cmFjdCBhZGRyZXNzIGZvciB2NCspXG4gKiBAcmV0dXJucyBwYXJzZWQgZmx1c2ggZGF0YSB3aXRoIGZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZCBhbmQgZm9yd2FyZGVyVmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkMxMTU1VG9rZW5zRGF0YShcbiAgZGF0YTogc3RyaW5nLFxuICB0bz86IHN0cmluZ1xuKToge1xuICBmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmc7XG4gIHRva2VuQWRkcmVzczogc3RyaW5nO1xuICB0b2tlbklkOiBzdHJpbmc7XG4gIGZvcndhcmRlclZlcnNpb24/OiBudW1iZXI7XG59IHtcbiAgaWYgKGRhdGEuc3RhcnRzV2l0aChmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGlmICghdG8pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYE1pc3NpbmcgdG8gYWRkcmVzczogJHt0b31gKTtcbiAgICB9XG4gICAgY29uc3QgW3Rva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXN2NCxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRWNCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiB0byxcbiAgICAgIHRva2VuQWRkcmVzczogYWRkSGV4UHJlZml4KHRva2VuQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5JZDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b2tlbklkIGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDQsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hFUkMxMTU1Rm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzcywgdG9rZW5JZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hFUkMxMTU1VG9rZW5zVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKGZsdXNoRVJDMTE1NUZvcndhcmRlclRva2Vuc01ldGhvZElkLCBkYXRhKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcndhcmRlckFkZHJlc3M6IGFkZEhleFByZWZpeChmb3J3YXJkZXJBZGRyZXNzIGFzIHN0cmluZyksXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGZsdXNoIEVSQzExNTUgYnl0ZWNvZGU6ICR7ZGF0YX1gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjcmVhdGUgZm9yd2FyZGVyIG1ldGhvZCBjYWxsaW5nIGRhdGFcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjcmVhdGVGb3J3YXJkZXIgbWV0aG9kIGVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUZvcndhcmRlck1ldGhvZElkO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEV0aCBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSB0aGUgdHggaGFzaCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRXRoQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzbWFydCBjb250cmFjdCBlbmNvZGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgd2FsbGV0IGNyZWF0aW9uIGRhdGEgdG8gZGVjb2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVGhlIGxpc3Qgb2Ygc2lnbmVyIGFkZHJlc3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlV2FsbGV0Q3JlYXRpb25EYXRhKGRhdGE6IHN0cmluZyk6IFdhbGxldEluaXRpYWxpemF0aW9uRGF0YSB7XG4gIGlmICghKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpIHx8IGRhdGEuc3RhcnRzV2l0aCh2MUNyZWF0ZVdhbGxldE1ldGhvZElkKSkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHdhbGxldCBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgaWYgKGRhdGEuc3RhcnRzV2l0aCh3YWxsZXRJbml0aWFsaXphdGlvbkZpcnN0Qnl0ZXMpKSB7XG4gICAgY29uc3QgZGF0YUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEuc2xpY2UoMiksICdoZXgnKTtcblxuICAgIC8vIHRoZSBsYXN0IDE2MCBieXRlcyBjb250YWluIHRoZSBzZXJpYWxpemVkIGFkZHJlc3MgYXJyYXlcbiAgICBjb25zdCBzZXJpYWxpemVkU2lnbmVycyA9IGRhdGFCdWZmZXIuc2xpY2UoLTE2MCk7XG5cbiAgICBjb25zdCByZXN1bHRFbmNvZGVkUGFyYW1ldGVycyA9IEV0aGVyZXVtQWJpLnJhd0RlY29kZSh3YWxsZXRTaW1wbGVDb25zdHJ1Y3Rvciwgc2VyaWFsaXplZFNpZ25lcnMpO1xuICAgIGlmIChyZXN1bHRFbmNvZGVkUGFyYW1ldGVycy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYENvdWxkIG5vdCBkZWNvZGUgd2FsbGV0IGNvbnN0cnVjdG9yIGJ5dGVjb2RlOiAke3Jlc3VsdEVuY29kZWRQYXJhbWV0ZXJzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NlczogQk5bXSA9IHJlc3VsdEVuY29kZWRQYXJhbWV0ZXJzWzBdO1xuICAgIGlmIChhZGRyZXNzZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBhZGRyZXNzZXMgaW4gcGFyc2VkIGNvbnN0cnVjdG9yOiAke2FkZHJlc3Nlc31gKTtcbiAgICB9XG5cbiAgICAvLyBzb21ldGltZXMgZXRoZXJldW1qcy1hYmkgcmVtb3ZlcyAwIHBhZGRpbmcgYXQgdGhlIHN0YXJ0IG9mIGFkZHJlc3NlcyxcbiAgICAvLyBzbyB3ZSBzaG91bGQgcGFkIHVudGlsIHRoZXkgYXJlIHRoZSBzdGFuZGFyZCAyMCBieXRlc1xuICAgIGNvbnN0IHBhZGRlZEFkZHJlc3NlcyA9IGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHN0cmlwSGV4UHJlZml4KGFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG5cbiAgICByZXR1cm4geyBvd25lcnM6IHBhZGRlZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IGFkZEhleFByZWZpeChhZGRyZXNzKSkgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIGNyZWF0ZVYxV2FsbGV0VHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHYxQ3JlYXRlV2FsbGV0TWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzBdIGFzIHN0cmluZ1tdO1xuICAgIGNvbnN0IHNhbHRCdWZmZXIgPSBkZWNvZGVkRGF0YUZvcldhbGxldENyZWF0aW9uWzFdO1xuICAgIGNvbnN0IHNhbHQgPSBidWZmZXJUb0hleChzYWx0QnVmZmVyIGFzIEJ1ZmZlcik7XG4gICAgY29uc3QgcGFkZGVkQWRkcmVzc2VzID0gYWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gc3RyaXBIZXhQcmVmaXgoYWRkcmVzcy50b1N0cmluZygpKS5wYWRTdGFydCg0MCwgJzAnKSk7XG4gICAgY29uc3Qgb3duZXJzID0gcGFkZGVkQWRkcmVzc2VzLm1hcCgoYWRkcmVzcykgPT4gYWRkSGV4UHJlZml4KGFkZHJlc3MpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJzLFxuICAgICAgc2FsdCxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCB0cmFuc2ZlciBkYXRhIGFuZCByZXR1cm4gcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGRlY29kZVxuICogQHBhcmFtIGlzRmlyc3RTaWduZXIgd2hldGhlciB0cmFuc2FjdGlvbiBpcyBiZWluZyBidWlsdCBmb3IgYSBmaXJzdCBzaWduZXJcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nLCBpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IFRyYW5zZmVyRGF0YSB7XG4gIGlmIChkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgcmV0dXJuIGRlY29kZU5hdGl2ZVRyYW5zZmVyRGF0YShkYXRhLCBpc0ZpcnN0U2lnbmVyKTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCkpIHtcbiAgICByZXR1cm4gZGVjb2RlVG9rZW5UcmFuc2ZlckRhdGEoZGF0YSwgaXNGaXJzdFNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBnaXZlbiBBQkktZW5jb2RlZCB0cmFuc2ZlciBkYXRhIGZvciB0aGUgc2VuZE11bHRpc2lnVG9rZW4gZnVuY3Rpb24gYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gaXNGaXJzdFNpZ25lciB3aGV0aGVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGJ1aWx0IGZvciBhIGZpcnN0IHNpZ25lclxuICogQHJldHVybnMgcGFyc2VkIHRva2VuIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRva2VuVHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZywgaXNGaXJzdFNpZ25lcj86IGJvb2xlYW4pOiBUb2tlblRyYW5zZmVyRGF0YSB7XG4gIGlmICghZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG4gIGxldCB0bzogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBhbW91bnQ6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgdG9rZW5Db250cmFjdEFkZHJlc3M6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwaXJlVGltZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzZXF1ZW5jZUlkOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNpZ25hdHVyZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwcmVmaXg6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoIWlzRmlyc3RTaWduZXIpIHtcbiAgICBbdG8sIGFtb3VudCwgdG9rZW5Db250cmFjdEFkZHJlc3MsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgc2VuZE11bHRpU2lnVG9rZW5UeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnVG9rZW5NZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIFtwcmVmaXgsIHRvLCBhbW91bnQsIHRva2VuQ29udHJhY3RBZGRyZXNzLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBzZW5kTXVsdGlTaWdUb2tlblR5cGVzRmlyc3RTaWduZXIsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uSGFzaFByZWZpeDogaXNGaXJzdFNpZ25lciA/IChwcmVmaXggYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCxcbiAgICB0bzogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5Db250cmFjdEFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVSQzcyMVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcpOiBFUkM3MjFUcmFuc2ZlckRhdGEge1xuICBpZiAoIWRhdGEuc3RhcnRzV2l0aChzZW5kTXVsdGlzaWdNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBjb25zdCBbdG8sIGFtb3VudCwgaW50ZXJuYWxEYXRhLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBzZW5kTXVsdGlTaWdUeXBlcyxcbiAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ01ldGhvZElkLCBkYXRhKVxuICApO1xuXG4gIGNvbnN0IGludGVybmFsRGF0YUhleCA9IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpO1xuXG4gIGlmIChpbnRlcm5hbERhdGFIZXguc3RhcnRzV2l0aChFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzcyMVNhZmVUcmFuc2ZlclR5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShFUkM3MjFTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIgYXMgc3RyaW5nKSxcbiAgICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tIGFzIHN0cmluZyksXG4gICAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgICAgdXNlckRhdGE6IGJ1ZmZlclRvSGV4KHVzZXJTZW50RGF0YSBhcyBCdWZmZXIpLFxuICAgIH07XG4gIH1cblxuICBpZiAoaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoRVJDNzIxVHJhbnNmZXJGcm9tTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBFUkM3MjFUcmFuc2ZlckZyb21UeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoRVJDNzIxVHJhbnNmZXJGcm9tTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBhZGRIZXhQcmVmaXgocmVjZWl2ZXIgYXMgc3RyaW5nKSxcbiAgICAgIGZyb206IGFkZEhleFByZWZpeChmcm9tIGFzIHN0cmluZyksXG4gICAgICBleHBpcmVUaW1lOiBidWZmZXJUb0ludChleHBpcmVUaW1lIGFzIEJ1ZmZlciksXG4gICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoYW1vdW50IGFzIEJ1ZmZlcikpLnRvRml4ZWQoKSxcbiAgICAgIHRva2VuSWQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodG9rZW5JZCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0byBhcyBzdHJpbmcpLFxuICAgICAgdXNlckRhdGE6ICcnLFxuICAgIH07XG4gIH1cblxuICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFUkMxMTU1VHJhbnNmZXJEYXRhKGRhdGE6IHN0cmluZyk6IEVSQzExNTVUcmFuc2ZlckRhdGEge1xuICBsZXQgZnJvbSwgcmVjZWl2ZXIsIHVzZXJTZW50RGF0YTtcbiAgbGV0IHRva2VuSWRzOiBzdHJpbmdbXTtcbiAgbGV0IHZhbHVlczogc3RyaW5nW107XG5cbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgY29uc3QgW3RvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZCwgc2lnbmF0dXJlXSA9IGdldFJhd0RlY29kZWQoXG4gICAgc2VuZE11bHRpU2lnVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbERhdGFIZXggPSBidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKTtcbiAgaWYgKGludGVybmFsRGF0YUhleC5zdGFydHNXaXRoKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQpKSB7XG4gICAgbGV0IHRva2VuSWQ7XG4gICAgbGV0IHZhbHVlO1xuXG4gICAgW2Zyb20sIHJlY2VpdmVyLCB0b2tlbklkLCB2YWx1ZSwgdXNlclNlbnREYXRhXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBFUkMxMTU1U2FmZVRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVTYWZlVHJhbnNmZXJUeXBlTWV0aG9kSWQsIGludGVybmFsRGF0YUhleClcbiAgICApO1xuXG4gICAgdG9rZW5JZHMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0b2tlbklkKSkudG9GaXhlZCgpXTtcbiAgICB2YWx1ZXMgPSBbbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh2YWx1ZSkpLnRvRml4ZWQoKV07XG4gIH0gZWxzZSBpZiAoYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcikuc3RhcnRzV2l0aChFUkMxMTU1QmF0Y2hUcmFuc2ZlclR5cGVNZXRob2RJZCkpIHtcbiAgICBsZXQgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzO1xuICAgIFtmcm9tLCByZWNlaXZlciwgdGVtcFRva2VuSWRzLCB0ZW1wVmFsdWVzLCB1c2VyU2VudERhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZXMsXG4gICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKEVSQzExNTVCYXRjaFRyYW5zZmVyVHlwZU1ldGhvZElkLCBpbnRlcm5hbERhdGFIZXgpXG4gICAgKTtcbiAgICB0b2tlbklkcyA9IHRlbXBUb2tlbklkcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gICAgdmFsdWVzID0gdGVtcFZhbHVlcy5tYXAoKHgpID0+IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgoeCkpLnRvRml4ZWQoKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0bzogYWRkSGV4UHJlZml4KHJlY2VpdmVyKSxcbiAgICBmcm9tOiBhZGRIZXhQcmVmaXgoZnJvbSksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleChhbW91bnQgYXMgQnVmZmVyKSkudG9GaXhlZCgpLFxuICAgIHRva2VuSWRzLFxuICAgIHZhbHVlcyxcbiAgICBzZXF1ZW5jZUlkOiBidWZmZXJUb0ludChzZXF1ZW5jZUlkIGFzIEJ1ZmZlciksXG4gICAgc2lnbmF0dXJlOiBidWZmZXJUb0hleChzaWduYXR1cmUgYXMgQnVmZmVyKSxcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgdXNlckRhdGE6IHVzZXJTZW50RGF0YSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIHRyYW5zZmVyIGRhdGEgZm9yIHRoZSBzZW5kTXVsdGlzaWcgZnVuY3Rpb24gYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gaXNGaXJzdFNpZ25lciB3aGV0aGVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGJ1aWx0IGZvciBhIGZpcnN0IHNpZ25lclxuICogQHJldHVybnMgcGFyc2VkIHRyYW5zZmVyIGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZU5hdGl2ZVRyYW5zZmVyRGF0YShkYXRhOiBzdHJpbmcsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogTmF0aXZlVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2ZlciBieXRlY29kZTogJHtkYXRhfWApO1xuICB9XG5cbiAgbGV0IHRvOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGFtb3VudDogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnRlcm5hbERhdGE6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwaXJlVGltZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzZXF1ZW5jZUlkOiBSZWN1cnNpdmVCdWZmZXJPclN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNpZ25hdHVyZTogUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwcmVmaXg6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoIWlzRmlyc3RTaWduZXIpIHtcbiAgICBbdG8sIGFtb3VudCwgaW50ZXJuYWxEYXRhLCBleHBpcmVUaW1lLCBzZXF1ZW5jZUlkLCBzaWduYXR1cmVdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShzZW5kTXVsdGlzaWdNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIFtwcmVmaXgsIHRvLCBhbW91bnQsIGludGVybmFsRGF0YSwgZXhwaXJlVGltZSwgc2VxdWVuY2VJZF0gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgc2VuZE11bHRpU2lnVHlwZXNGaXJzdFNpZ25lcixcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3BlcmF0aW9uSGFzaFByZWZpeDogaXNGaXJzdFNpZ25lciA/IChwcmVmaXggYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCxcbiAgICB0bzogYWRkSGV4UHJlZml4KHRvIGFzIHN0cmluZyksXG4gICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KGFtb3VudCBhcyBCdWZmZXIpKS50b0ZpeGVkKCksXG4gICAgZXhwaXJlVGltZTogYnVmZmVyVG9JbnQoZXhwaXJlVGltZSBhcyBCdWZmZXIpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKSxcbiAgICBzaWduYXR1cmU6IGJ1ZmZlclRvSGV4KHNpZ25hdHVyZSBhcyBCdWZmZXIpLFxuICAgIGRhdGE6IGJ1ZmZlclRvSGV4KGludGVybmFsRGF0YSBhcyBCdWZmZXIpLFxuICB9O1xufVxuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gQUJJLWVuY29kZWQgZmx1c2ggdG9rZW5zIGRhdGEgYW5kIHJldHVybiBwYXJzZWQgZmllbGRzXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gZGVjb2RlXG4gKiBAcGFyYW0gdG8gT3B0aW9uYWwgdG8gcGFyYW1ldGVyIG9mIHR4XG4gKiBAcmV0dXJucyBwYXJzZWQgdHJhbnNmZXIgZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hUb2tlbnNEYXRhKGRhdGE6IHN0cmluZywgdG8/OiBzdHJpbmcpOiBGbHVzaFRva2Vuc0RhdGEge1xuICBpZiAoZGF0YS5zdGFydHNXaXRoKGZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2ZvcndhcmRlckFkZHJlc3MsIHRva2VuQWRkcmVzc10gPSBnZXRSYXdEZWNvZGVkKFxuICAgICAgZmx1c2hUb2tlbnNUeXBlcyxcbiAgICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZCwgZGF0YSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBmb3J3YXJkZXJBZGRyZXNzOiBhZGRIZXhQcmVmaXgoZm9yd2FyZGVyQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgdG9rZW5BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9rZW5BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYXRhLnN0YXJ0c1dpdGgoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0KSkge1xuICAgIGNvbnN0IFt0b2tlbkFkZHJlc3NdID0gZ2V0UmF3RGVjb2RlZChmbHVzaFRva2Vuc1R5cGVzdjQsIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoZmx1c2hGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0LCBkYXRhKSk7XG4gICAgaWYgKCF0bykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgTWlzc2luZyB0byBhZGRyZXNzOiAke3RvfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm9yd2FyZGVyQWRkcmVzczogdG8sXG4gICAgICB0b2tlbkFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRyYW5zZmVyIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEge1xuICB0b0FkZHJlc3M6IHN0cmluZztcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gIGlucHV0UHJvb2Y6IHN0cmluZztcbiAgZXhwaXJlVGltZTogc3RyaW5nO1xuICBzZXF1ZW5jZUlkOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY29kZSBBQkktZW5jb2RlZCBjb25maWRlbnRpYWwgdHJhbnNmZXIgZGF0YSAoc2VuZE11bHRpU2lnIHdyYXBwaW5nIGNvbmZpZGVudGlhbFRyYW5zZmVyKVxuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBmdWxsIGNhbGxkYXRhIGhleCBzdHJpbmdcbiAqIEByZXR1cm5zIHBhcnNlZCBjb25maWRlbnRpYWwgdHJhbnNmZXIgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEoZGF0YTogc3RyaW5nKTogQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhIHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoc2VuZE11bHRpc2lnTWV0aG9kSWQpKSB7XG4gICAgLy8gSW5jbHVkZSBvbmx5IHRoZSA0LWJ5dGUgbWV0aG9kIElEIGluIHRoZSBlcnJvciB0byBhdm9pZCBsZWFraW5nIGVuY3J5cHRlZCBwYXlsb2FkcyBpbnRvIGxvZ3MuXG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBieXRlY29kZTogdW5leHBlY3RlZCBtZXRob2QgSUQgJHtkYXRhLnNsaWNlKDAsIDEwKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFt0b2tlbkNvbnRyYWN0QWRkcmVzcywgLCBpbnRlcm5hbERhdGEsIGV4cGlyZVRpbWUsIHNlcXVlbmNlSWQsIHNpZ25hdHVyZV0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIHNlbmRNdWx0aVNpZ1R5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoc2VuZE11bHRpc2lnTWV0aG9kSWQsIGRhdGEpXG4gICk7XG5cbiAgY29uc3QgaW50ZXJuYWxEYXRhSGV4ID0gYnVmZmVyVG9IZXgoaW50ZXJuYWxEYXRhIGFzIEJ1ZmZlcik7XG4gIGlmICghaW50ZXJuYWxEYXRhSGV4LnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCkpIHtcbiAgICAvLyBJbmNsdWRlIG9ubHkgdGhlIDQtYnl0ZSBtZXRob2QgSUQgaW4gdGhlIGVycm9yIHRvIGF2b2lkIGxlYWtpbmcgZW5jcnlwdGVkIHBheWxvYWRzIGludG8gbG9ncy5cbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgYEludmFsaWQgY29uZmlkZW50aWFsIHRyYW5zZmVyIGlubmVyIGNhbGxkYXRhOiB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke2ludGVybmFsRGF0YUhleC5zbGljZSgwLCAxMCl9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBbdG9BZGRyZXNzLCBlbmNyeXB0ZWRIYW5kbGUsIGlucHV0UHJvb2ZdID0gZ2V0UmF3RGVjb2RlZChcbiAgICBjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZlR5cGVzLFxuICAgIGdldEJ1ZmZlcmVkQnl0ZUNvZGUoY29uZmlkZW50aWFsVHJhbnNmZXJXaXRoUHJvb2ZNZXRob2RJZCwgaW50ZXJuYWxEYXRhSGV4KVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdG9BZGRyZXNzOiBhZGRIZXhQcmVmaXgodG9BZGRyZXNzIGFzIHN0cmluZyksXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IGFkZEhleFByZWZpeCh0b2tlbkNvbnRyYWN0QWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIGVuY3J5cHRlZEhhbmRsZTogYnVmZmVyVG9IZXgoZW5jcnlwdGVkSGFuZGxlIGFzIEJ1ZmZlciksXG4gICAgaW5wdXRQcm9vZjogYnVmZmVyVG9IZXgoaW5wdXRQcm9vZiBhcyBCdWZmZXIpLFxuICAgIGV4cGlyZVRpbWU6IGJ1ZmZlclRvSW50KGV4cGlyZVRpbWUgYXMgQnVmZmVyKS50b1N0cmluZygpLFxuICAgIHNlcXVlbmNlSWQ6IGJ1ZmZlclRvSW50KHNlcXVlbmNlSWQgYXMgQnVmZmVyKS50b1N0cmluZygpLFxuICAgIHNpZ25hdHVyZTogYnVmZmVyVG9IZXgoc2lnbmF0dXJlIGFzIEJ1ZmZlciksXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJEYXRhIHtcbiAgdG9BZGRyZXNzOiBzdHJpbmc7XG4gIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nO1xuICBpbnB1dFByb29mOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyKGFkZHJlc3MsIGJ5dGVzMzIsIGJ5dGVzKSBjYWxsZGF0YS5cbiAqXG4gKiBVc2VkIGZvciBob3QvVFNTIHdhbGxldHMgd2hlcmUgdGhlIHNpZ25pbmcgYWRkcmVzcyBjYWxscyB0aGUgdG9rZW4gY29udHJhY3QgZGlyZWN0bHksXG4gKiB3aXRob3V0IGEgc2VuZE11bHRpU2lnIHdyYXBwZXIuIEluIHRoaXMgcGF0aCB0aGUgYHRvYCBmaWVsZCBvZiB0aGUgRUlQLTE1NTkgdHJhbnNhY3Rpb25cbiAqIGlzIHRoZSB0b2tlbiBjb250cmFjdCBhZGRyZXNzIGFuZCB0aGUgY2FsbGRhdGEgY2FycmllcyBvbmx5IHRoZSB0aHJlZSB0cmFuc2ZlciBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBkYXRhICAweC1wcmVmaXhlZCBjYWxsZGF0YSBzdGFydGluZyB3aXRoIGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mTWV0aG9kSWQgKDB4MmZiNzRlNjIpXG4gKiBAcmV0dXJucyB0b0FkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSwgaW5wdXRQcm9vZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJDYWxsZGF0YShkYXRhOiBzdHJpbmcpOiBEaXJlY3RDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEge1xuICBpZiAoIWRhdGEuc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkKSkge1xuICAgIC8vIEluY2x1ZGUgb25seSB0aGUgNC1ieXRlIG1ldGhvZCBJRCBpbiB0aGUgZXJyb3IgdG8gYXZvaWQgbGVha2luZyBlbmNyeXB0ZWQgcGF5bG9hZHMgaW50byBsb2dzLlxuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgSW52YWxpZCBkaXJlY3QgY29uZmlkZW50aWFsIHRyYW5zZmVyIGNhbGxkYXRhOiB1bmV4cGVjdGVkIG1ldGhvZCBJRCAke2RhdGEuc2xpY2UoMCwgMTApfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IFt0b0FkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSwgaW5wdXRQcm9vZl0gPSBnZXRSYXdEZWNvZGVkKFxuICAgIGNvbmZpZGVudGlhbFRyYW5zZmVyV2l0aFByb29mVHlwZXMsXG4gICAgZ2V0QnVmZmVyZWRCeXRlQ29kZShjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkLCBkYXRhKVxuICApO1xuICByZXR1cm4ge1xuICAgIHRvQWRkcmVzczogYWRkSGV4UHJlZml4KHRvQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgIGVuY3J5cHRlZEhhbmRsZTogYnVmZmVyVG9IZXgoZW5jcnlwdGVkSGFuZGxlIGFzIEJ1ZmZlciksXG4gICAgaW5wdXRQcm9vZjogYnVmZmVyVG9IZXgoaW5wdXRQcm9vZiBhcyBCdWZmZXIpLFxuICB9O1xufVxuXG4vKipcbiAqIERlY29kZSBhIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIHRyYW5zYWN0aW9uJ3MgY2FsbGRhdGEgaW50byBpdHMgY29tcG9uZW50IHBhcnRzLlxuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBmdWxsIGNhbGxkYXRhIGhleCBzdHJpbmcgKGNhbGxGcm9tUGFyZW50IHdyYXBwaW5nIGNvbmZpZGVudGlhbFRyYW5zZmVyKVxuICogQHBhcmFtIHRvICAgVGhlIGB0b2AgZmllbGQgb2YgdGhlIHRyYW5zYWN0aW9uIChlcXVhbHMgdGhlIGZvcndhcmRlciBhZGRyZXNzIGZvciBWNClcbiAqIEByZXR1cm5zIERlY29kZWQgZmllbGRzIGluY2x1ZGluZyBmb3J3YXJkZXJBZGRyZXNzLCB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkRhdGEoZGF0YTogc3RyaW5nLCB0bzogc3RyaW5nKTogRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5EYXRhIHtcbiAgY29uc3QgeyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgcGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlIH0gPSBkZWNvZGVGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKGRhdGEpO1xuICByZXR1cm4ge1xuICAgIGZvcndhcmRlckFkZHJlc3M6IHRvLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgIHBhcmVudEFkZHJlc3MsXG4gICAgZW5jcnlwdGVkSGFuZGxlLFxuICB9O1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBkYXRhIGJhc2VkIGFzIGEgdHJhbnNhY3Rpb24gdHlwZS5cbiAqIEVUSCB0cmFuc2FjdGlvbnMgYXJlIGRlZmluZWQgYnkgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHRyYW5zYWN0aW9uIGRhdGEsIGFsc28ga25vd24gYXMgdGhlIG1ldGhvZCBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGNsYXNzaWZ5IHRoZSB0cmFuc2FjdGlvbiB3aXRoXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSBUaGUgY2xhc3NpZmllZCB0cmFuc2FjdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVRyYW5zYWN0aW9uKGRhdGE6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgLy8gY29udHJhY3QgY2FsbHMgbXVzdCBoYXZlIGF0IGxlYXN0IDQgYnl0ZXMgKG1ldGhvZCBpZCkgYW5kICcweCdcbiAgICAvLyBpZiBpdCBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgdG8gYmUgYSBjb250cmFjdCBjYWxsIGl0IG11c3QgYmUgYSBzaW5nbGUgc2lnIHNlbmRcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNpbmdsZVNpZ1NlbmQ7XG4gIH1cblxuICAvLyBUT0RPKFNUTFgtMTk3MCk6IHZhbGlkYXRlIGlmIHdlIGFyZSBnb2luZyB0byBjb25zdHJhaW50IHRvIHNvbWUgbWV0aG9kcyBhbGxvd2VkXG4gIGxldCB0cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGVzTWFwW2RhdGEuc2xpY2UoMCwgMTApLnRvTG93ZXJDYXNlKCldO1xuXG4gIC8vIEZvciBzZW5kTXVsdGlTaWcgdHJhbnNhY3Rpb25zLCBwZWVrIGF0IHRoZSBpbm5lciBjYWxsZGF0YSB0byBkZXRlY3QgU2VuZEVSQzc5ODRcbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQgJiYgZGF0YS5zdGFydHNXaXRoKHNlbmRNdWx0aXNpZ01ldGhvZElkKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCAsIGludGVybmFsRGF0YV0gPSBnZXRSYXdEZWNvZGVkKHNlbmRNdWx0aVNpZ1R5cGVzLCBnZXRCdWZmZXJlZEJ5dGVDb2RlKHNlbmRNdWx0aXNpZ01ldGhvZElkLCBkYXRhKSk7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGFIZXggPSBidWZmZXJUb0hleChpbnRlcm5hbERhdGEgYXMgQnVmZmVyKTtcbiAgICAgIGlmIChpbnRlcm5hbERhdGFIZXguc3RhcnRzV2l0aChjb25maWRlbnRpYWxUcmFuc2ZlcldpdGhQcm9vZk1ldGhvZElkKSkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkM3OTg0O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90IGEgY29uZmlkZW50aWFsIHRyYW5zZmVyOyBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGNsYXNzaWZpY2F0aW9uXG4gICAgfVxuICB9XG5cbiAgLy8gUGVlayBpbnNpZGUgY2FsbEZyb21QYXJlbnQgdG8gZGV0ZWN0IEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuXG4gIGlmICh0cmFuc2FjdGlvblR5cGUgPT09IHVuZGVmaW5lZCAmJiBkYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgLCBpbm5lckRhdGFdID0gZ2V0UmF3RGVjb2RlZChcbiAgICAgICAgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdLFxuICAgICAgICBnZXRCdWZmZXJlZEJ5dGVDb2RlKGNhbGxGcm9tUGFyZW50TWV0aG9kSWQsIGRhdGEpXG4gICAgICApO1xuICAgICAgY29uc3QgaW5uZXJIZXggPSBidWZmZXJUb0hleChpbm5lckRhdGEgYXMgQnVmZmVyKTtcbiAgICAgIGlmIChpbm5lckhleC5zdGFydHNXaXRoKGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZk1ldGhvZElkKSkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90IGEgY29uZmlkZW50aWFsIGZsdXNoOyBmYWxsIHRocm91Z2ggdG8gQ29udHJhY3RDYWxsXG4gICAgfVxuICB9XG5cbiAgaWYgKHRyYW5zYWN0aW9uVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2FjdGlvblR5cGU7XG59XG5cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB0eXBlcyBtYXAgYWNjb3JkaW5nIHRvIHRoZSBzdGFydGluZyBwYXJ0IG9mIHRoZSBlbmNvZGVkIGRhdGFcbiAqL1xuY29uc3QgdHJhbnNhY3Rpb25UeXBlc01hcCA9IHtcbiAgW3dhbGxldEluaXRpYWxpemF0aW9uRmlyc3RCeXRlc106IFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbixcbiAgW3JlY292ZXJ5V2FsbGV0SW5pdGlhbGl6YXRpb25GaXJzdEJ5dGVzXTogVHJhbnNhY3Rpb25UeXBlLlJlY292ZXJ5V2FsbGV0RGVwbG95bWVudCxcbiAgW3YxQ3JlYXRlV2FsbGV0TWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24sXG4gIFtjcmVhdGVGb3J3YXJkZXJNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24sXG4gIFt2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgW3Y0Q3JlYXRlRm9yd2FyZGVyTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuQWRkcmVzc0luaXRpYWxpemF0aW9uLFxuICBbc2VuZE11bHRpc2lnTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgW2ZsdXNoRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hUb2tlbnMsXG4gIFtmbHVzaEZvcndhcmRlclRva2Vuc01ldGhvZElkVjRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hUb2tlbnMsXG4gIFtmbHVzaENvaW5zTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hDb2lucyxcbiAgW2ZsdXNoRVJDNzIxRm9yd2FyZGVyVG9rZW5zTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEsXG4gIFtmbHVzaEVSQzcyMUZvcndhcmRlclRva2Vuc01ldGhvZElkVjRdOiBUcmFuc2FjdGlvblR5cGUuRmx1c2hFUkM3MjEsXG4gIFtmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzExNTUsXG4gIFtmbHVzaEVSQzExNTVGb3J3YXJkZXJUb2tlbnNNZXRob2RJZFY0XTogVHJhbnNhY3Rpb25UeXBlLkZsdXNoRVJDMTE1NSxcbiAgW3NlbmRNdWx0aXNpZ1Rva2VuTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU2VuZCxcbiAgW0xvY2tNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nTG9jayxcbiAgW1ZvdGVNZXRob2RJZF06IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVm90ZSxcbiAgW0FjdGl2YXRlTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlLFxuICBbVW52b3RlTWV0aG9kSWRdOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1Vudm90ZSxcbiAgW1VubG9ja01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2ssXG4gIFtXaXRoZHJhd01ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyxcbiAgLy8gYWNsTXVsdGljYWxsTWV0aG9kSWQgKG11bHRpY2FsbChieXRlc1tdKSkgaXMgaW50ZW50aW9uYWxseSBOT1QgbWFwcGVkIGhlcmUuXG4gIC8vIGNsYXNzaWZ5VHJhbnNhY3Rpb24oKSBvbmx5IHNlZXMgY2FsbGRhdGEsIG5vdCBgdG9gLCBzbyAweGFjOTY1MGQ4IHdvdWxkIG1pc2xhYmVsXG4gIC8vIGFueSBPcGVuWmVwcGVsaW4gTXVsdGljYWxsVXBncmFkZWFibGUgY2FsbCAocm91dGVycywgYWdncmVnYXRvcnMsIHVucmVsYXRlZCBjb250cmFjdHMpXG4gIC8vIGFzIERlY3J5cHRpb25EZWxlZ2F0aW9uLiBCdWlsZGVyIG91dHB1dCAod2hpY2ggYWx3YXlzIHVzZXMgbXVsdGljYWxsKSB0aGVyZWZvcmVcbiAgLy8gY2xhc3NpZmllcyBhcyBDb250cmFjdENhbGw7IGNhbGxlcnMgc2hvdWxkIHNldCBUcmFuc2FjdGlvblR5cGUuRGVjcnlwdGlvbkRlbGVnYXRpb25cbiAgLy8gZXhwbGljaXRseSB3aGVuIGJ1aWxkaW5nIGZyb20gYSBrbm93biBkZWxlZ2F0aW9uIHRlbXBsYXRlLlxuICBbZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkXTogVHJhbnNhY3Rpb25UeXBlLkRlY3J5cHRpb25EZWxlZ2F0aW9uLFxufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG51bSBudW1iZXIgdG8gYmUgY29udmVydGVkIHRvIGhleFxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGhleCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvSGV4U3RyaW5nKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaGV4ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGhleC5sZW5ndGggJSAyID09PSAwID8gJzB4JyArIGhleCA6ICcweDAnICsgaGV4O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGV4IFRoZSBoZXggc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHJldHVybnMge251bWJlcn0gdGhlIHJlc3VsdGluZyBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhleFN0cmluZ1RvTnVtYmVyKGhleDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBhcnNlSW50KGhleC5zbGljZSgyKSwgMTYpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBhZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgYWRkcmVzcyB0byBiZSBkZXBsb3llZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250cmFjdEFkZHJlc3MgdGhlIGFkZHJlc3Mgd2hpY2ggaXMgY3JlYXRpbmcgdGhpcyBuZXcgYWRkcmVzc1xuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRyYWN0Q291bnRlciB0aGUgbm9uY2Ugb2YgdGhlIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBjYWxjdWxhdGVkIGZvcndhcmRlciBjb250cmFjdCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVGb3J3YXJkZXJBZGRyZXNzKGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLCBjb250cmFjdENvdW50ZXI6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSBnZW5lcmF0ZUFkZHJlc3MoXG4gICAgQnVmZmVyLmZyb20oc3RyaXBIZXhQcmVmaXgoY29udHJhY3RBZGRyZXNzKSwgJ2hleCcpLFxuICAgIEJ1ZmZlci5mcm9tKHBhZFRvRXZlbihzdHJpcEhleFByZWZpeChudW1iZXJUb0hleFN0cmluZyhjb250cmFjdENvdW50ZXIpKSksICdoZXgnKVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KGZvcndhcmRlckFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGZvcndhcmRlciB2MSBhZGRyZXNzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYGNyZWF0b3JBZGRyZXNzYCBjcmVhdGVzIGl0IHdpdGggc2FsdCBgc2FsdGBcbiAqIGFuZCBpbml0Y29kZSBgaW5pY29kZSB1c2luZyB0aGUgY3JlYXRlMiBvcGNvZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjcmVhdG9yQWRkcmVzcyBUaGUgYWRkcmVzcyB0aGF0IGlzIHNlbmRpbmcgdGhlIHR4IHRvIGNyZWF0ZSBhIG5ldyBhZGRyZXNzLCBoZXggc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2FsdCBUaGUgc2FsdCB0byBjcmVhdGUgdGhlIGFkZHJlc3Mgd2l0aCB1c2luZyBjcmVhdGUyLCBoZXggc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5pdGNvZGUgVGhlIGluaXRjb2RlIHRoYXQgd2lsbCBiZSBkZXBsb3llZCB0byB0aGUgYWRkcmVzcywgaGV4IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FsY3VsYXRlZCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVGb3J3YXJkZXJWMUFkZHJlc3MoY3JlYXRvckFkZHJlc3M6IHN0cmluZywgc2FsdDogc3RyaW5nLCBpbml0Y29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm9yd2FyZGVyVjFBZGRyZXNzID0gZ2VuZXJhdGVBZGRyZXNzMihcbiAgICBCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChjcmVhdG9yQWRkcmVzcyksICdoZXgnKSxcbiAgICBCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzYWx0KSwgJ2hleCcpLFxuICAgIEJ1ZmZlci5mcm9tKHBhZFRvRXZlbihzdHJpcEhleFByZWZpeChpbml0Y29kZSkpLCAnaGV4JylcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChmb3J3YXJkZXJWMUFkZHJlc3MudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBUYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBhZGRyZXNzIGZvciB0aGUgcHJveHkgY29udHJhY3QsIGFuZCBnZXQgdGhlIGJpbmFyeSBpbml0Y29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgcHJveHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbXBsZW1lbnRhdGlvbkFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNvbnRyYWN0IGZvciB0aGUgcHJveHlcbiAqIEByZXR1cm4ge3N0cmluZ30gQmluYXJ5IGhleCBzdHJpbmcgb2YgdGhlIHByb3h5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm94eUluaXRjb2RlKGltcGxlbWVudGF0aW9uQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0ID0gc3RyaXBIZXhQcmVmaXgoaW1wbGVtZW50YXRpb25BZGRyZXNzLnRvTG93ZXJDYXNlKCkpLnBhZFN0YXJ0KDQwLCAnMCcpO1xuXG4gIC8vIGJ5dGVjb2RlIG9mIHRoZSBwcm94eSwgZnJvbTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0JpdEdvL2V0aC1tdWx0aXNpZy12NC9ibG9iL2Q1NDZhOTM3ZjkwZjkzZTgzYjM0MjNhNWJmOTMzZDFkNzdjNjc3YzMvY29udHJhY3RzL0Nsb25lRmFjdG9yeS5zb2wjTDQyLUw1NlxuICByZXR1cm4gYDB4M2Q2MDJkODA2MDBhM2QzOTgxZjMzNjNkM2QzNzNkM2QzZDM2M2Q3MyR7dGFyZ2V0fTVhZjQzZDgyODAzZTkwM2Q5MTYwMmI1N2ZkNWJmM2A7XG59XG5cbi8qKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gc2lnbmF0dXJlIHBhcnRzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQYXJ0c30gc2lnIFRoZSBzaWduYXR1cmUgdG8gY29udmVydCB0byBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2lnbmF0dXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZ1NpZyhzaWc6IFNpZ25hdHVyZVBhcnRzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1ZmZlclRvSGV4KFxuICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgc2V0TGVuZ3RoTGVmdChCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzaWcuciksICdoZXgnKSwgMzIpLFxuICAgICAgc2V0TGVuZ3RoTGVmdChCdWZmZXIuZnJvbShzdHJpcEhleFByZWZpeChzaWcucyksICdoZXgnKSwgMzIpLFxuICAgICAgdG9CdWZmZXIoc2lnLnYpLFxuICAgIF0pXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB0eCBkYXRhIGhhcyBhIHNpZ25hdHVyZVxuICpcbiAqIEBwYXJhbSB7VHhEYXRhfSB0eERhdGEgVGhlIHRyYW5zYWN0aW9uIGRhdGEgdG8gY2hlY2sgZm9yIHNpZ25hdHVyZVxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHR4IGhhcyBhIHNpZ25hdHVyZSwgZWxzZSBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzU2lnbmF0dXJlKHR4RGF0YTogVHhEYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHhEYXRhLnYgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR4RGF0YS5yICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eERhdGEucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHhEYXRhLnYubGVuZ3RoID4gMCAmJlxuICAgIHR4RGF0YS5yLmxlbmd0aCA+IDAgJiZcbiAgICB0eERhdGEucy5sZW5ndGggPiAwXG4gICk7XG59XG5cbnR5cGUgUmVjdXJzaXZlQnVmZmVyT3JTdHJpbmcgPSBzdHJpbmcgfCBCdWZmZXIgfCBCTiB8IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nW107XG5cbi8qKlxuICogR2V0IHRoZSByYXcgZGF0YSBkZWNvZGVkIGZvciBzb21lIHR5cGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdHlwZXMgQUJJIHR5cGVzIGRlZmluaXRpb25cbiAqIEBwYXJhbSB7QnVmZmVyfSBzZXJpYWxpemVkQXJncyBlbmNvZGVkIGFyZ3NcbiAqIEByZXR1cm5zIHtCdWZmZXJbXX0gdGhlIGRlY29kZWQgcmF3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYXdEZWNvZGVkKHR5cGVzOiBzdHJpbmdbXSwgc2VyaWFsaXplZEFyZ3M6IEJ1ZmZlcik6IFJlY3Vyc2l2ZUJ1ZmZlck9yU3RyaW5nW10ge1xuICBmdW5jdGlvbiBub3JtYWxpemUodjogdW5rbm93biwgaTogbnVtYmVyKTogdW5rbm93biB7XG4gICAgaWYgKEJOLmlzQk4odikpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnIHx8IEJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICByZXR1cm4gdi5tYXAobm9ybWFsaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgJHt0eXBlc31bJHtpfV0gZ290ICR7dHlwZW9mIHZ9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEV0aGVyZXVtQWJpLnJhd0RlY29kZSh0eXBlcywgc2VyaWFsaXplZEFyZ3MpLm1hcChub3JtYWxpemUpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYnVmZmVyZWQgYnl0ZWNvZGUgZnJvbSByYXdEYXRhIHVzaW5nIGEgbWV0aG9kSWQgYXMgZGVsaW1pdGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZElkIHRoZSBoZXggZW5jb2RlZCBtZXRob2QgSWRcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdEYXRhIHRoZSBoZXggZW5jb2RlZCByYXcgZGF0YVxuICogQHJldHVybnMge0J1ZmZlcn0gZGF0YSBidWZmZXJlZCBieXRlY29kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVmZmVyZWRCeXRlQ29kZShtZXRob2RJZDogc3RyaW5nLCByYXdEYXRhOiBzdHJpbmcpOiBCdWZmZXIge1xuICBjb25zdCBzcGxpdEJ5dGVjb2RlID0gcmF3RGF0YS5zcGxpdChtZXRob2RJZCk7XG4gIGlmIChzcGxpdEJ5dGVjb2RlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgc2VuZCBieXRlY29kZTogJHtyYXdEYXRhfWApO1xuICB9XG4gIGlmIChzcGxpdEJ5dGVjb2RlWzFdLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHNlbmQgYnl0ZWNvZGU6ICR7cmF3RGF0YX0gKHdyb25nIGxlbmdodClgKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oc3BsaXRCeXRlY29kZVsxXSwgJ2hleCcpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdGljcyBjb2luIG9iamVjdCBtYXRjaGluZyBhIGdpdmVuIGNvbnRyYWN0IGFkZHJlc3MgaWYgaXQgZXhpc3RzXG4gKlxuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzIFRoZSBjb250cmFjdCBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIC0gdGhlIGNvaW4gbmV0d29ya1xuICogQHBhcmFtIGZhbWlseSAtIHRoZSBjb2luIGZhbWlseVxuICogQHJldHVybnMgc3RhdGljcyBCYXNlQ29pbiBvYmplY3QgZm9yIHRoZSBtYXRjaGluZyB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW4oXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIG5ldHdvcms6IEJhc2VOZXR3b3JrLFxuICBmYW1pbHk6IHN0cmluZ1xuKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgLy8gZmlsdGVyIHRoZSBjb2lucyBhcnJheSB0byBmaW5kIHRoZSB0b2tlbiB3aXRoIHRoZSBtYXRjaGluZyBjb250cmFjdCBhZGRyZXNzLCBuZXR3b3JrIGFuZCBjb2luIGZhbWlseVxuICAvLyBjb2luIGZhbWlseSBpcyBuZWVkZWQgdG8gYXZvaWQgY2F1c2luZyBpc3N1ZXMgd2hlbiBhIHRva2VuIGhhcyBzYW1lIGNvbnRyYWN0IGFkZHJlc3Mgb24gdHdvIGRpZmZlcmVudCBjaGFpbnNcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvaW4ubmV0d29yay50eXBlID09PSBuZXR3b3JrLnR5cGUgJiZcbiAgICAgICAgY29pbi5mYW1pbHkgPT09IGZhbWlseSAmJlxuICAgICAgICBjb2luLmNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIGlmIGxlbmd0aCBvZiB0b2tlbnMgaXMgMSwgcmV0dXJuIHRoZSBmaXJzdCwgZWxzZSByZXR1cm4gdW5kZWZpbmVkXG4gIC8vIENhbid0IGRpcmVjdGx5IGluZGV4IGludG8gdG9rZW5zLCBvciBjYWxsIGBsZW5ndGhgLCBzbyB3ZSB1c2UgbWFwIHRvIGdldCBhbiBhcnJheVxuICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gIGlmICh0b2tlbnNBcnJheS5sZW5ndGggPj0gMSkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBuZXZlciBiZSB0d28gdG9rZW5zIHdpdGggdGhlIHNhbWUgY29udHJhY3QgYWRkcmVzcywgc28gd2UgYXNzZXJ0IHRoYXQgaGVyZVxuICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgIHJldHVybiB0b2tlbnNBcnJheVswXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNyZWF0ZSB3YWxsZXQgbWV0aG9kIGNhbGxpbmcgZGF0YSBmb3IgdjEgd2FsbGV0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHdhbGxldE93bmVycyAtIHdhbGxldCBvd25lciBhZGRyZXNzZXMgZm9yIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0IC0gVGhlIHNhbHQgZm9yIHdhbGxldCBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNyZWF0ZVdhbGxldCBtZXRob2QgZW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VjFXYWxsZXRJbml0aWFsaXphdGlvbkRhdGEod2FsbGV0T3duZXJzOiBzdHJpbmdbXSwgc2FsdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdEJ1ZmZlciA9IHNldExlbmd0aExlZnQodG9CdWZmZXIoc2FsdCksIDMyKTtcbiAgY29uc3QgcGFyYW1zID0gW3dhbGxldE93bmVycywgc2FsdEJ1ZmZlcl07XG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdjcmVhdGVXYWxsZXQnLCBjcmVhdGVWMVdhbGxldFR5cGVzKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShjcmVhdGVWMVdhbGxldFR5cGVzLCBwYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlIGFkZHJlc3MgbWV0aG9kIGNhbGxpbmcgZGF0YSBmb3IgdjEsIHYyLCB2NCBmb3J3YXJkZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VBZGRyZXNzIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldCBjb250cmFjdFxuICogQHBhcmFtIHtzdHJpbmd9IHNhbHQgLSBUaGUgc2FsdCBmb3IgYWRkcmVzcyBpbml0aWFsaXphdGlvbiB0cmFuc2FjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWVBZGRyZXNzIC0gVGhlIGZlZSBhZGRyZXNzIGZvciB0aGUgZW50ZXJwcmlzZVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY3JlYXRlRm9yd2FyZGVyIG1ldGhvZCBlbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWMUFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoYmFzZUFkZHJlc3M6IHN0cmluZywgc2FsdDogc3RyaW5nLCBmZWVBZGRyZXNzPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdEJ1ZmZlciA9IHNldExlbmd0aExlZnQodG9CdWZmZXIoc2FsdCksIDMyKTtcbiAgY29uc3QgeyBjcmVhdGVGb3J3YXJkZXJQYXJhbXMsIGNyZWF0ZUZvcndhcmRlclR5cGVzIH0gPSBnZXRDcmVhdGVGb3J3YXJkZXJQYXJhbXNBbmRUeXBlcyhcbiAgICBiYXNlQWRkcmVzcyxcbiAgICBzYWx0QnVmZmVyLFxuICAgIGZlZUFkZHJlc3NcbiAgKTtcblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY3JlYXRlRm9yd2FyZGVyJywgY3JlYXRlRm9yd2FyZGVyVHlwZXMpO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKGNyZWF0ZUZvcndhcmRlclR5cGVzLCBjcmVhdGVGb3J3YXJkZXJQYXJhbXMpO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3JlYXRlIGFkZHJlc3MgbWV0aG9kIGNhbGxpbmcgZGF0YSBmb3IgYWxsIGZvcndhcmRlciB2ZXJzaW9uc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3J3YXJkZXJWZXJzaW9uIC0gVGhlIHZlcnNpb24gb2YgdGhlIGZvcndhcmRlciB0byBjcmVhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlQWRkcmVzcyAtIFRoZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzYWx0IC0gVGhlIHNhbHQgZm9yIGFkZHJlc3MgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlQWRkcmVzcyAtIFRoZSBmZWUgYWRkcmVzcyBmb3IgdGhlIGVudGVycHJpc2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNyZWF0ZUZvcndhcmRlciBtZXRob2QgZW5jb2RlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3NJbml0RGF0YUFsbEZvcndhcmRlclZlcnNpb25zKFxuICBmb3J3YXJkZXJWZXJzaW9uOiBudW1iZXIsXG4gIGJhc2VBZGRyZXNzOiBzdHJpbmcsXG4gIHNhbHQ6IHN0cmluZyxcbiAgZmVlQWRkcmVzcz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKGZvcndhcmRlclZlcnNpb24gPT09IGRlZmF1bHRGb3J3YXJkZXJWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGdldEFkZHJlc3NJbml0aWFsaXphdGlvbkRhdGEoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0VjFBZGRyZXNzSW5pdGlhbGl6YXRpb25EYXRhKGJhc2VBZGRyZXNzLCBzYWx0LCBmZWVBZGRyZXNzKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNyZWF0ZUZvcndhcmRlclR5cGVzIGFuZCBjcmVhdGVGb3J3YXJkZXJQYXJhbXMgZm9yIGFsbCBmb3J3YXJkZXIgdmVyc2lvbnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZUFkZHJlc3MgLSBUaGUgYWRkcmVzcyBvZiB0aGUgd2FsbGV0IGNvbnRyYWN0XG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2FsdEJ1ZmZlciAtIFRoZSBzYWx0IGZvciBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlQWRkcmVzcyAtIFRoZSBmZWUgYWRkcmVzcyBmb3IgdGhlIGVudGVycHJpc2VcbiAqIEByZXR1cm5zIHtjcmVhdGVGb3J3YXJkZXJQYXJhbXM6IChzdHJpbmcgfCBCdWZmZXIpW10sIGNyZWF0ZUZvcndhcmRlclR5cGVzOiBzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUZvcndhcmRlclBhcmFtc0FuZFR5cGVzKFxuICBiYXNlQWRkcmVzczogc3RyaW5nLFxuICBzYWx0QnVmZmVyOiBCdWZmZXIsXG4gIGZlZUFkZHJlc3M/OiBzdHJpbmdcbik6IHsgY3JlYXRlRm9yd2FyZGVyUGFyYW1zOiAoc3RyaW5nIHwgQnVmZmVyKVtdOyBjcmVhdGVGb3J3YXJkZXJUeXBlczogc3RyaW5nW10gfSB7XG4gIGxldCBjcmVhdGVGb3J3YXJkZXJQYXJhbXMgPSBbYmFzZUFkZHJlc3MsIHNhbHRCdWZmZXJdO1xuICBsZXQgY3JlYXRlRm9yd2FyZGVyVHlwZXMgPSBjcmVhdGVWMUZvcndhcmRlclR5cGVzO1xuICBpZiAoZmVlQWRkcmVzcykge1xuICAgIGNyZWF0ZUZvcndhcmRlclBhcmFtcyA9IFtiYXNlQWRkcmVzcywgZmVlQWRkcmVzcywgc2FsdEJ1ZmZlcl07XG4gICAgY3JlYXRlRm9yd2FyZGVyVHlwZXMgPSBjcmVhdGVWNEZvcndhcmRlclR5cGVzO1xuICB9XG4gIHJldHVybiB7IGNyZWF0ZUZvcndhcmRlclBhcmFtcywgY3JlYXRlRm9yd2FyZGVyVHlwZXMgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgdGhlIGdpdmVuIEFCSS1lbmNvZGVkIGNyZWF0ZSBmb3J3YXJkZXIgZGF0YSBhbmQgcmV0dXJuIHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBkZWNvZGVcbiAqIEByZXR1cm5zIHBhcnNlZCB0cmFuc2ZlciBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGb3J3YXJkZXJDcmVhdGlvbkRhdGEoZGF0YTogc3RyaW5nKTogRm9yd2FyZGVySW5pdGlhbGl6YXRpb25EYXRhIHtcbiAgaWYgKFxuICAgICEoXG4gICAgICBkYXRhLnN0YXJ0c1dpdGgodjRDcmVhdGVGb3J3YXJkZXJNZXRob2RJZCkgfHxcbiAgICAgIGRhdGEuc3RhcnRzV2l0aCh2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkKSB8fFxuICAgICAgZGF0YS5zdGFydHNXaXRoKGNyZWF0ZUZvcndhcmRlck1ldGhvZElkKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBhZGRyZXNzIGJ5dGVjb2RlOiAke2RhdGF9YCk7XG4gIH1cblxuICBpZiAoZGF0YS5zdGFydHNXaXRoKGNyZWF0ZUZvcndhcmRlck1ldGhvZElkKSkge1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlQWRkcmVzczogdW5kZWZpbmVkLFxuICAgICAgYWRkcmVzc0NyZWF0aW9uU2FsdDogdW5kZWZpbmVkLFxuICAgICAgZmVlQWRkcmVzczogdW5kZWZpbmVkLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZGF0YS5zdGFydHNXaXRoKHYxQ3JlYXRlRm9yd2FyZGVyTWV0aG9kSWQpKSB7XG4gICAgY29uc3QgW2Jhc2VBZGRyZXNzLCBzYWx0QnVmZmVyXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBjcmVhdGVWMUZvcndhcmRlclR5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZSh2MUNyZWF0ZUZvcndhcmRlck1ldGhvZElkLCBkYXRhKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmFzZUFkZHJlc3M6IGFkZEhleFByZWZpeChiYXNlQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgYWRkcmVzc0NyZWF0aW9uU2FsdDogYnVmZmVyVG9IZXgoc2FsdEJ1ZmZlciBhcyBCdWZmZXIpLFxuICAgICAgZmVlQWRkcmVzczogdW5kZWZpbmVkLFxuICAgIH0gYXMgY29uc3Q7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW2Jhc2VBZGRyZXNzLCBmZWVBZGRyZXNzLCBzYWx0QnVmZmVyXSA9IGdldFJhd0RlY29kZWQoXG4gICAgICBjcmVhdGVWNEZvcndhcmRlclR5cGVzLFxuICAgICAgZ2V0QnVmZmVyZWRCeXRlQ29kZSh2NENyZWF0ZUZvcndhcmRlck1ldGhvZElkLCBkYXRhKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmFzZUFkZHJlc3M6IGFkZEhleFByZWZpeChiYXNlQWRkcmVzcyBhcyBzdHJpbmcpLFxuICAgICAgYWRkcmVzc0NyZWF0aW9uU2FsdDogYnVmZmVyVG9IZXgoc2FsdEJ1ZmZlciBhcyBCdWZmZXIpLFxuICAgICAgZmVlQWRkcmVzczogYWRkSGV4UHJlZml4KGZlZUFkZHJlc3MgYXMgc3RyaW5nKSxcbiAgICB9IGFzIGNvbnN0O1xuICB9XG59XG5cbi8qKlxuICogTWFrZSBhIHF1ZXJ5IHRvIGV4cGxvcmVyIGZvciBpbmZvcm1hdGlvbiBzdWNoIGFzIGJhbGFuY2UsIHRva2VuIGJhbGFuY2UsIHNvbGlkaXR5IGNhbGxzXG4gKiBAcGFyYW0ge09iamVjdH0gcXVlcnkga2V5LXZhbHVlIHBhaXJzIG9mIHBhcmFtZXRlcnMgdG8gYXBwZW5kIGFmdGVyIC9hcGlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbiB0aGUgQVBJIHRva2VuIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBsb3JlclVybCB0aGUgVVJMIG9mIHRoZSBleHBsb3JlclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gcmVzcG9uc2UgZnJvbSBleHBsb3JlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeShcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGV4cGxvcmVyVXJsOiBzdHJpbmcsXG4gIHRva2VuPzogc3RyaW5nXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICh0b2tlbikge1xuICAgIHF1ZXJ5LmFwaWtleSA9IHRva2VuO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5nZXQoYCR7ZXhwbG9yZXJVcmx9L2FwaWApLnF1ZXJ5KHF1ZXJ5KTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhY2ggZXhwbG9yZXInKTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5ib2R5LnN0YXR1cyA9PT0gJzAnICYmIHJlc3BvbnNlLmJvZHkubWVzc2FnZSA9PT0gJ05PVE9LJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwbG9yZXIgcmF0ZSBsaW1pdCByZWFjaGVkJyk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBleHBpcmUgdGltZSBmb3IgYSBjb250cmFjdCBjYWxsICgxIHdlZWspXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaW1lIGluIHNlY29uZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRFeHBpcmVUaW1lKCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgKyA2MCAqIDYwICogMjQgKiA3O1xufVxuIl19