@bitgo-beta/sdk-coin-xrp 1.3.3-alpha.359 → 1.3.3-alpha.360

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.9.11](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-xrp@3.9.10...@bitgo/sdk-coin-xrp@3.9.11) (2025-07-31)
7
+
8
+ **Note:** Version bump only for package @bitgo/sdk-coin-xrp
9
+
10
+ ## [3.9.10](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-xrp@3.9.9...@bitgo/sdk-coin-xrp@3.9.10) (2025-07-30)
11
+
12
+ ### Bug Fixes
13
+
14
+ - **sdk-coin-xrp:** update XRP signers sorting to use numeric comparison ([eef8b0d](https://github.com/BitGo/BitGoJS/commit/eef8b0d1ae911d83327c798b0778a3cebecc69e2))
15
+
6
16
  ## [3.9.9](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-coin-xrp@3.9.7...@bitgo/sdk-coin-xrp@3.9.9) (2025-07-25)
7
17
 
8
18
  **Note:** Version bump only for package @bitgo/sdk-coin-xrp
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/ripple.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;GACG;AACH,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiE7B,kBAAyC"}
1
+ {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/ripple.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;GACG;AACH,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsF7B,kBAAyC"}
@@ -35,12 +35,27 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  return result;
36
36
  };
37
37
  })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
38
41
  /**
39
42
  */
40
43
  const rippleKeypairs = __importStar(require("ripple-keypairs"));
41
44
  const xrpl = __importStar(require("xrpl"));
42
45
  const secp256k1_1 = require("@bitgo-beta/secp256k1");
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
43
47
  const binary = __importStar(require("ripple-binary-codec"));
48
+ /**
49
+ * Convert an XRP address to a BigNumber for numeric comparison.
50
+ * This is needed for proper sorting of signers as required by the XRP protocol.
51
+ *
52
+ * @param address - The XRP address to convert
53
+ * @returns BigNumber representation of the address
54
+ */
55
+ function addressToBigNumber(address) {
56
+ const hex = Buffer.from(xrpl.decodeAccountID(address)).toString('hex');
57
+ return new bignumber_js_1.default(hex, 16);
58
+ }
44
59
  function computeSignature(tx, privateKey, signAs) {
45
60
  const signingData = signAs ? binary.encodeForMultisigning(tx, signAs) : binary.encodeForSigning(tx);
46
61
  return rippleKeypairs.sign(signingData, privateKey);
@@ -82,9 +97,16 @@ const signWithPrivateKey = function (txHex, privateKey, options) {
82
97
  TxnSignature: computeSignature(tx, privateKey, options.signAs),
83
98
  };
84
99
  // Ordering of private key signing matters, or the Ripple fullnode will throw an 'Unsorted Signers array' error.
85
- // Additional signers must be added to the front of the signers array list.
86
- if (tx.TxnSignature || tx.Signers) {
87
- tx.Signers.unshift({ Signer: signer });
100
+ // XRP requires Signers array to be sorted based on numeric value of signer addresses (lowest first)
101
+ if (tx.Signers) {
102
+ // Add the current signer
103
+ tx.Signers.push({ Signer: signer });
104
+ // Sort the Signers array by numeric value of Account (address) to ensure proper ordering
105
+ tx.Signers.sort((a, b) => {
106
+ const addressBN1 = addressToBigNumber(a.Signer.Account);
107
+ const addressBN2 = addressToBigNumber(b.Signer.Account);
108
+ return addressBN1.comparedTo(addressBN2);
109
+ });
88
110
  }
89
111
  else {
90
112
  tx.Signers = [{ Signer: signer }];
@@ -100,4 +122,4 @@ const signWithPrivateKey = function (txHex, privateKey, options) {
100
122
  };
101
123
  };
102
124
  module.exports = { ...xrpl, signWithPrivateKey };
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JpcHBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixxREFBK0M7QUFFL0MsNERBQThDO0FBRTlDLFNBQVMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNO0lBQzlDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU87SUFDN0QsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEUsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsa0JBQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRWxHLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBSSxDQUFDO1FBQ0gsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUM7WUFDSCxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVELEVBQUUsQ0FBQyxhQUFhLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTlELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHO1lBQ2IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3ZCLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDL0QsQ0FBQztRQUNGLGdIQUFnSDtRQUNoSCwyRUFBMkU7UUFDM0UsSUFBSSxFQUFFLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sRUFBRSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxVQUFVO1FBQzdCLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7S0FDekMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLGlCQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG5pbXBvcnQgKiBhcyByaXBwbGVLZXlwYWlycyBmcm9tICdyaXBwbGUta2V5cGFpcnMnO1xuaW1wb3J0ICogYXMgeHJwbCBmcm9tICd4cnBsJztcbmltcG9ydCB7IEVDUGFpciB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5cbmltcG9ydCAqIGFzIGJpbmFyeSBmcm9tICdyaXBwbGUtYmluYXJ5LWNvZGVjJztcblxuZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgc2lnbkFzKSB7XG4gIGNvbnN0IHNpZ25pbmdEYXRhID0gc2lnbkFzID8gYmluYXJ5LmVuY29kZUZvck11bHRpc2lnbmluZyh0eCwgc2lnbkFzKSA6IGJpbmFyeS5lbmNvZGVGb3JTaWduaW5nKHR4KTtcbiAgcmV0dXJuIHJpcHBsZUtleXBhaXJzLnNpZ24oc2lnbmluZ0RhdGEsIHByaXZhdGVLZXkpO1xufVxuXG4vKipcbiAqIFNpZ24gUmlwcGxlIHRyYW5zYWN0aW9uIHdpdGggYSBzZWNwMjU2azEgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSB0eEhleFxuICogQHBhcmFtIHByaXZhdGVLZXlcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7e3NpZ25lZFRyYW5zYWN0aW9uOiAqLCBpZH19XG4gKi9cbmNvbnN0IHNpZ25XaXRoUHJpdmF0ZUtleSA9IGZ1bmN0aW9uICh0eEhleCwgcHJpdmF0ZUtleSwgb3B0aW9ucykge1xuICBsZXQgcHJpdmF0ZUtleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHByaXZhdGVLZXksICdoZXgnKTtcbiAgaWYgKHByaXZhdGVLZXlCdWZmZXIubGVuZ3RoID09PSAzMyAmJiBwcml2YXRlS2V5QnVmZmVyWzBdID09PSAwKSB7XG4gICAgcHJpdmF0ZUtleUJ1ZmZlciA9IHByaXZhdGVLZXlCdWZmZXIuc2xpY2UoMSwgMzMpO1xuICB9XG4gIGNvbnN0IHB1YmxpY0tleSA9IEVDUGFpci5mcm9tUHJpdmF0ZUtleShwcml2YXRlS2V5QnVmZmVyKS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgbGV0IHR4O1xuICB0cnkge1xuICAgIHR4ID0gYmluYXJ5LmRlY29kZSh0eEhleCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgdHggPSBKU09OLnBhcnNlKHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5lZWRzIHRvIGJlIGVpdGhlciBoZXggb3IgSlNPTiBzdHJpbmcgZm9yIFhSUCcpO1xuICAgIH1cbiAgfVxuXG4gIHR4LlNpZ25pbmdQdWJLZXkgPSBvcHRpb25zICYmIG9wdGlvbnMuc2lnbkFzID8gJycgOiBwdWJsaWNLZXk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaWduQXMpIHtcbiAgICBjb25zdCBleHBlY3RlZFNpZ25lciA9IHJpcHBsZUtleXBhaXJzLmRlcml2ZUFkZHJlc3MocHVibGljS2V5KTtcbiAgICBpZiAob3B0aW9ucy5zaWduQXMgIT09IGV4cGVjdGVkU2lnbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25BcyBkb2VzIG5vdCBtYXRjaCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXIgPSB7XG4gICAgICBBY2NvdW50OiBvcHRpb25zLnNpZ25BcyxcbiAgICAgIFNpZ25pbmdQdWJLZXk6IHB1YmxpY0tleSxcbiAgICAgIFR4blNpZ25hdHVyZTogY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgb3B0aW9ucy5zaWduQXMpLFxuICAgIH07XG4gICAgLy8gT3JkZXJpbmcgb2YgcHJpdmF0ZSBrZXkgc2lnbmluZyBtYXR0ZXJzLCBvciB0aGUgUmlwcGxlIGZ1bGxub2RlIHdpbGwgdGhyb3cgYW4gJ1Vuc29ydGVkIFNpZ25lcnMgYXJyYXknIGVycm9yLlxuICAgIC8vIEFkZGl0aW9uYWwgc2lnbmVycyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBmcm9udCBvZiB0aGUgc2lnbmVycyBhcnJheSBsaXN0LlxuICAgIGlmICh0eC5UeG5TaWduYXR1cmUgfHwgdHguU2lnbmVycykge1xuICAgICAgdHguU2lnbmVycy51bnNoaWZ0KHsgU2lnbmVyOiBzaWduZXIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4LlNpZ25lcnMgPSBbeyBTaWduZXI6IHNpZ25lciB9XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdHguVHhuU2lnbmF0dXJlID0gY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBiaW5hcnkuZW5jb2RlKHR4KTtcbiAgcmV0dXJuIHtcbiAgICBzaWduZWRUcmFuc2FjdGlvbjogc2VyaWFsaXplZCxcbiAgICBpZDogeHJwbC5oYXNoZXMuaGFzaFNpZ25lZFR4KHNlcmlhbGl6ZWQpLFxuICB9O1xufTtcblxuZXhwb3J0ID0geyAuLi54cnBsLCBzaWduV2l0aFByaXZhdGVLZXkgfTtcbiJdfQ==
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JpcHBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixxREFBK0M7QUFDL0MsZ0VBQXFDO0FBRXJDLDREQUE4QztBQUU5Qzs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE9BQWU7SUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sSUFBSSxzQkFBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU07SUFDOUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEcsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTztJQUM3RCxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVB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aGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbmltcG9ydCAqIGFzIHJpcHBsZUtleXBhaXJzIGZyb20gJ3JpcHBsZS1rZXlwYWlycyc7XG5pbXBvcnQgKiBhcyB4cnBsIGZyb20gJ3hycGwnO1xuaW1wb3J0IHsgRUNQYWlyIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0ICogYXMgYmluYXJ5IGZyb20gJ3JpcHBsZS1iaW5hcnktY29kZWMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gWFJQIGFkZHJlc3MgdG8gYSBCaWdOdW1iZXIgZm9yIG51bWVyaWMgY29tcGFyaXNvbi5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBwcm9wZXIgc29ydGluZyBvZiBzaWduZXJzIGFzIHJlcXVpcmVkIGJ5IHRoZSBYUlAgcHJvdG9jb2wuXG4gKlxuICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgWFJQIGFkZHJlc3MgdG8gY29udmVydFxuICogQHJldHVybnMgQmlnTnVtYmVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzXG4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NUb0JpZ051bWJlcihhZGRyZXNzOiBzdHJpbmcpOiBCaWdOdW1iZXIge1xuICBjb25zdCBoZXggPSBCdWZmZXIuZnJvbSh4cnBsLmRlY29kZUFjY291bnRJRChhZGRyZXNzKSkudG9TdHJpbmcoJ2hleCcpO1xuICByZXR1cm4gbmV3IEJpZ051bWJlcihoZXgsIDE2KTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgc2lnbkFzKSB7XG4gIGNvbnN0IHNpZ25pbmdEYXRhID0gc2lnbkFzID8gYmluYXJ5LmVuY29kZUZvck11bHRpc2lnbmluZyh0eCwgc2lnbkFzKSA6IGJpbmFyeS5lbmNvZGVGb3JTaWduaW5nKHR4KTtcbiAgcmV0dXJuIHJpcHBsZUtleXBhaXJzLnNpZ24oc2lnbmluZ0RhdGEsIHByaXZhdGVLZXkpO1xufVxuXG4vKipcbiAqIFNpZ24gUmlwcGxlIHRyYW5zYWN0aW9uIHdpdGggYSBzZWNwMjU2azEgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSB0eEhleFxuICogQHBhcmFtIHByaXZhdGVLZXlcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7e3NpZ25lZFRyYW5zYWN0aW9uOiAqLCBpZH19XG4gKi9cbmNvbnN0IHNpZ25XaXRoUHJpdmF0ZUtleSA9IGZ1bmN0aW9uICh0eEhleCwgcHJpdmF0ZUtleSwgb3B0aW9ucykge1xuICBsZXQgcHJpdmF0ZUtleUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHByaXZhdGVLZXksICdoZXgnKTtcbiAgaWYgKHByaXZhdGVLZXlCdWZmZXIubGVuZ3RoID09PSAzMyAmJiBwcml2YXRlS2V5QnVmZmVyWzBdID09PSAwKSB7XG4gICAgcHJpdmF0ZUtleUJ1ZmZlciA9IHByaXZhdGVLZXlCdWZmZXIuc2xpY2UoMSwgMzMpO1xuICB9XG4gIGNvbnN0IHB1YmxpY0tleSA9IEVDUGFpci5mcm9tUHJpdmF0ZUtleShwcml2YXRlS2V5QnVmZmVyKS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgbGV0IHR4O1xuICB0cnkge1xuICAgIHR4ID0gYmluYXJ5LmRlY29kZSh0eEhleCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgdHggPSBKU09OLnBhcnNlKHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5lZWRzIHRvIGJlIGVpdGhlciBoZXggb3IgSlNPTiBzdHJpbmcgZm9yIFhSUCcpO1xuICAgIH1cbiAgfVxuXG4gIHR4LlNpZ25pbmdQdWJLZXkgPSBvcHRpb25zICYmIG9wdGlvbnMuc2lnbkFzID8gJycgOiBwdWJsaWNLZXk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaWduQXMpIHtcbiAgICBjb25zdCBleHBlY3RlZFNpZ25lciA9IHJpcHBsZUtleXBhaXJzLmRlcml2ZUFkZHJlc3MocHVibGljS2V5KTtcbiAgICBpZiAob3B0aW9ucy5zaWduQXMgIT09IGV4cGVjdGVkU2lnbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25BcyBkb2VzIG5vdCBtYXRjaCBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXIgPSB7XG4gICAgICBBY2NvdW50OiBvcHRpb25zLnNpZ25BcyxcbiAgICAgIFNpZ25pbmdQdWJLZXk6IHB1YmxpY0tleSxcbiAgICAgIFR4blNpZ25hdHVyZTogY29tcHV0ZVNpZ25hdHVyZSh0eCwgcHJpdmF0ZUtleSwgb3B0aW9ucy5zaWduQXMpLFxuICAgIH07XG4gICAgLy8gT3JkZXJpbmcgb2YgcHJpdmF0ZSBrZXkgc2lnbmluZyBtYXR0ZXJzLCBvciB0aGUgUmlwcGxlIGZ1bGxub2RlIHdpbGwgdGhyb3cgYW4gJ1Vuc29ydGVkIFNpZ25lcnMgYXJyYXknIGVycm9yLlxuICAgIC8vIFhSUCByZXF1aXJlcyBTaWduZXJzIGFycmF5IHRvIGJlIHNvcnRlZCBiYXNlZCBvbiBudW1lcmljIHZhbHVlIG9mIHNpZ25lciBhZGRyZXNzZXMgKGxvd2VzdCBmaXJzdClcbiAgICBpZiAodHguU2lnbmVycykge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IHNpZ25lclxuICAgICAgdHguU2lnbmVycy5wdXNoKHsgU2lnbmVyOiBzaWduZXIgfSk7XG5cbiAgICAgIC8vIFNvcnQgdGhlIFNpZ25lcnMgYXJyYXkgYnkgbnVtZXJpYyB2YWx1ZSBvZiBBY2NvdW50IChhZGRyZXNzKSB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nXG4gICAgICB0eC5TaWduZXJzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzc0JOMSA9IGFkZHJlc3NUb0JpZ051bWJlcihhLlNpZ25lci5BY2NvdW50KTtcbiAgICAgICAgY29uc3QgYWRkcmVzc0JOMiA9IGFkZHJlc3NUb0JpZ051bWJlcihiLlNpZ25lci5BY2NvdW50KTtcbiAgICAgICAgcmV0dXJuIGFkZHJlc3NCTjEuY29tcGFyZWRUbyhhZGRyZXNzQk4yKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eC5TaWduZXJzID0gW3sgU2lnbmVyOiBzaWduZXIgfV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHR4LlR4blNpZ25hdHVyZSA9IGNvbXB1dGVTaWduYXR1cmUodHgsIHByaXZhdGVLZXksIHVuZGVmaW5lZCk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkID0gYmluYXJ5LmVuY29kZSh0eCk7XG4gIHJldHVybiB7XG4gICAgc2lnbmVkVHJhbnNhY3Rpb246IHNlcmlhbGl6ZWQsXG4gICAgaWQ6IHhycGwuaGFzaGVzLmhhc2hTaWduZWRUeChzZXJpYWxpemVkKSxcbiAgfTtcbn07XG5cbmV4cG9ydCA9IHsgLi4ueHJwbCwgc2lnbldpdGhQcml2YXRlS2V5IH07XG4iXX0=