@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.361 → 8.2.1-alpha.363

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.
Files changed (99) hide show
  1. package/dist/src/curves/constant.d.ts +2 -0
  2. package/dist/src/curves/constant.d.ts.map +1 -0
  3. package/dist/src/curves/constant.js +6 -0
  4. package/dist/src/curves/ed25519.d.ts +20 -0
  5. package/dist/src/curves/ed25519.d.ts.map +1 -0
  6. package/dist/src/curves/ed25519.js +72 -0
  7. package/dist/src/curves/ed25519Bip32HdTree.d.ts +10 -0
  8. package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +1 -0
  9. package/dist/src/curves/ed25519Bip32HdTree.js +85 -0
  10. package/dist/src/curves/index.d.ts +8 -0
  11. package/dist/src/curves/index.d.ts.map +1 -0
  12. package/dist/src/curves/index.js +24 -0
  13. package/dist/src/curves/secp256k1.d.ts +18 -0
  14. package/dist/src/curves/secp256k1.d.ts.map +1 -0
  15. package/dist/src/curves/secp256k1.js +61 -0
  16. package/dist/src/curves/secp256k1Bip32HdTree.d.ts +8 -0
  17. package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +1 -0
  18. package/dist/src/curves/secp256k1Bip32HdTree.js +54 -0
  19. package/dist/src/curves/types.d.ts +35 -0
  20. package/dist/src/curves/types.d.ts.map +1 -0
  21. package/dist/src/curves/types.js +3 -0
  22. package/dist/src/curves/util.d.ts +4 -0
  23. package/dist/src/curves/util.d.ts.map +1 -0
  24. package/dist/src/curves/util.js +42 -0
  25. package/dist/src/hashCommitment.d.ts +16 -0
  26. package/dist/src/hashCommitment.d.ts.map +1 -0
  27. package/dist/src/hashCommitment.js +44 -0
  28. package/dist/src/index.d.ts +9 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +48 -0
  31. package/dist/src/openssl/index.d.ts +2 -0
  32. package/dist/src/openssl/index.d.ts.map +1 -0
  33. package/dist/src/openssl/index.js +18 -0
  34. package/dist/src/openssl/openssl.d.ts +8 -0
  35. package/dist/src/openssl/openssl.d.ts.map +1 -0
  36. package/dist/src/openssl/openssl.js +37 -0
  37. package/dist/src/safePrime.d.ts +3 -0
  38. package/dist/src/safePrime.d.ts.map +1 -0
  39. package/dist/src/safePrime.js +19 -0
  40. package/dist/src/schnorrProof.d.ts +21 -0
  41. package/dist/src/schnorrProof.d.ts.map +1 -0
  42. package/dist/src/schnorrProof.js +61 -0
  43. package/dist/src/shamir/index.d.ts +3 -0
  44. package/dist/src/shamir/index.d.ts.map +1 -0
  45. package/dist/src/shamir/index.js +19 -0
  46. package/dist/src/shamir/shamir.d.ts +38 -0
  47. package/dist/src/shamir/shamir.d.ts.map +1 -0
  48. package/dist/src/shamir/shamir.js +136 -0
  49. package/dist/src/shamir/types.d.ts +5 -0
  50. package/dist/src/shamir/types.d.ts.map +1 -0
  51. package/dist/src/shamir/types.js +3 -0
  52. package/dist/src/tss/ecdsa/index.d.ts +6 -0
  53. package/dist/src/tss/ecdsa/index.d.ts.map +1 -0
  54. package/dist/src/tss/ecdsa/index.js +42 -0
  55. package/dist/src/tss/ecdsa/paillierproof.d.ts +24 -0
  56. package/dist/src/tss/ecdsa/paillierproof.d.ts.map +1 -0
  57. package/dist/src/tss/ecdsa/paillierproof.js +86 -0
  58. package/dist/src/tss/ecdsa/primes.d.ts +2 -0
  59. package/dist/src/tss/ecdsa/primes.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa/primes.js +1846 -0
  61. package/dist/src/tss/ecdsa/rangeproof.d.ts +79 -0
  62. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa/rangeproof.js +394 -0
  64. package/dist/src/tss/ecdsa/types.d.ts +142 -0
  65. package/dist/src/tss/ecdsa/types.d.ts.map +1 -0
  66. package/dist/src/tss/ecdsa/types.js +130 -0
  67. package/dist/src/tss/ecdsa/zkVProof.d.ts +24 -0
  68. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -0
  69. package/dist/src/tss/ecdsa/zkVProof.js +70 -0
  70. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +42 -0
  71. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  72. package/dist/src/tss/ecdsa-dkls/commsLayer.js +235 -0
  73. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +57 -0
  74. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  75. package/dist/src/tss/ecdsa-dkls/dkg.js +321 -0
  76. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  77. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  78. package/dist/src/tss/ecdsa-dkls/dsg.js +266 -0
  79. package/dist/src/tss/ecdsa-dkls/index.d.ts +6 -0
  80. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  81. package/dist/src/tss/ecdsa-dkls/index.js +42 -0
  82. package/dist/src/tss/ecdsa-dkls/types.d.ts +118 -0
  83. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  84. package/dist/src/tss/ecdsa-dkls/types.js +165 -0
  85. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  86. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  87. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  88. package/dist/src/tss/index.d.ts +3 -0
  89. package/dist/src/tss/index.d.ts.map +1 -0
  90. package/dist/src/tss/index.js +19 -0
  91. package/dist/src/types.d.ts +13 -0
  92. package/dist/src/types.d.ts.map +1 -0
  93. package/dist/src/types.js +3 -0
  94. package/dist/src/util.d.ts +58 -0
  95. package/dist/src/util.d.ts.map +1 -0
  96. package/dist/src/util.js +164 -0
  97. package/package.json +6 -3
  98. package/.eslintignore +0 -5
  99. package/CHANGELOG.md +0 -667
@@ -0,0 +1,79 @@
1
+ import { BaseCurve } from '../../curves';
2
+ import { PublicKey } from 'paillier-bigint';
3
+ import { DeserializedNtilde, DeserializedNtildeProof, RangeProof, RangeProofWithCheck, DeserializedNtildeWithProofs } from './types';
4
+ /**
5
+ * Generate "challenge" values for range proofs.
6
+ * @param {number} bitlength The bit length of the modulus to generate. This should
7
+ * be the same as the bit length of the paillier public keys used for MtA.
8
+ * @returns {DeserializedNtilde} The generated Ntilde values.
9
+ */
10
+ export declare function generateNtilde(openSSLBytes: Uint8Array, bitlength?: number): Promise<DeserializedNtildeWithProofs>;
11
+ /**
12
+ * Generate iterations of Ntilde, h1, h2 discrete log proofs.
13
+ * @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
14
+ * @param {bigint} x Either alpha or beta depending on whether it is a discrete log proof of
15
+ * h1 w.r.t h2 or h2 w.r.t h1.
16
+ * @param {bigint} q1 The Sophie Germain prime associated with the first safe prime p1 used to generate Ntilde.
17
+ * @param {bigint} q2 The Sophie Germain prime associated with the second safe prime p2 used to generate Ntilde.
18
+ * @returns {NtildeProof} The generated Ntilde Proofs.
19
+ */
20
+ export declare function generateNtildeProof(ntilde: DeserializedNtilde, x: bigint, q1: bigint, q2: bigint): Promise<DeserializedNtildeProof>;
21
+ /**
22
+ * Verify discrete log proofs of h1 and h2 mod Ntilde.
23
+ * @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
24
+ * @param {DeserializedNtildeProof} ntildeProof Ntilde Proofs
25
+ * @returns {boolean} true if proof is verified, false otherwise.
26
+ */
27
+ export declare function verifyNtildeProof(ntilde: DeserializedNtilde, ntildeProof: DeserializedNtildeProof): Promise<boolean>;
28
+ /**
29
+ * Generate a zero-knowledge range proof that an encrypted value is "small".
30
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
31
+ * @param {number} modulusBits The bit count of the prover's public key.
32
+ * @param {PublicKey} pk The prover's public key.
33
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
34
+ * @param {bigint} c The ciphertext.
35
+ * @param {bigint} m The plaintext.
36
+ * @param {bigint} r The obfuscation value used to encrypt m.
37
+ * @returns {RangeProof} The generated proof.
38
+ */
39
+ export declare function prove(curve: BaseCurve, modulusBits: number, pk: PublicKey, ntilde: DeserializedNtilde, c: bigint, m: bigint, r: bigint): Promise<RangeProof>;
40
+ /**
41
+ * Verify a zero-knowledge range proof that an encrypted value is "small".
42
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
43
+ * @param {number} modulusBits The bit count of the prover's public key.
44
+ * @param {PublicKey} pk The prover's public key.
45
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
46
+ * @param {RangeProof} proof The range proof.
47
+ * @param {bigint} c The ciphertext.
48
+ * @returns {boolean} True if verification succeeds.
49
+ */
50
+ export declare function verify(curve: BaseCurve, modulusBits: number, pk: PublicKey, ntilde: DeserializedNtilde, proof: RangeProof, c: bigint): boolean;
51
+ /**
52
+ * Generate a zero-knowledge range proof that a homomorphically manipulated value is "small".
53
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
54
+ * @param {number} modulusBits The bit count of the prover's public key.
55
+ * @param {PublicKey} pk The prover's public key.
56
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
57
+ * @param {bigint} c1 The original ciphertext.
58
+ * @param {bigint} c2 The manipulated ciphertext.
59
+ * @param {bigint} x The plaintext value multiplied by the original plaintext.
60
+ * @param {bigint} y The plaintext value that is added to x.
61
+ * @param {bigint} r The obfuscation value used to encrypt x.
62
+ * @param {bigint} X The curve's base point raised to x.
63
+ * @returns {RangeProofWithCheck} The generated proof.
64
+ */
65
+ export declare function proveWithCheck(curve: BaseCurve, modulusBits: number, pk: PublicKey, ntilde: DeserializedNtilde, c1: bigint, c2: bigint, x: bigint, y: bigint, r: bigint, X: bigint): Promise<RangeProofWithCheck>;
66
+ /**
67
+ * Verify a zero-knowledge range proof that a homomorphically manipulated value is "small".
68
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
69
+ * @param {number} modulusBits The bit count of the prover's public key.
70
+ * @param {PublicKey} pk The prover's public key.
71
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
72
+ * @param {RangeProofWithCheck} proof The range proof.
73
+ * @param {bigint} c1 The original ciphertext.
74
+ * @param {bigint} c2 The manipulated ciphertext.
75
+ * @param {bigint} X The curve's base point raised to x.
76
+ * @returns {boolean} True if verification succeeds.
77
+ */
78
+ export declare function verifyWithCheck(curve: BaseCurve, modulusBits: number, pk: PublicKey, ntilde: DeserializedNtilde, proof: RangeProofWithCheck, c1: bigint, c2: bigint, X: bigint): boolean;
79
+ //# sourceMappingURL=rangeproof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeproof.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa/rangeproof.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EAEvB,UAAU,EACV,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAkCjB;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,UAAU,EACxB,SAAS,SAAsB,GAC9B,OAAO,CAAC,4BAA4B,CAAC,CA2CvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,uBAAuB,GACnC,OAAO,CAAC,OAAO,CAAC,CA0ClB;AACD;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,UAAU,EACjB,CAAC,EAAE,MAAM,GACR,OAAO,CAmCT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,mBAAmB,CAAC,CAoD9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,mBAAmB,EAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,GACR,OAAO,CAiET"}
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateNtilde = generateNtilde;
4
+ exports.generateNtildeProof = generateNtildeProof;
5
+ exports.verifyNtildeProof = verifyNtildeProof;
6
+ exports.prove = prove;
7
+ exports.verify = verify;
8
+ exports.proveWithCheck = proveWithCheck;
9
+ exports.verifyWithCheck = verifyWithCheck;
10
+ /**
11
+ * Zero Knowledge Range Proofs as described in (Two-party generation of DSA signatures)[1].
12
+ * [1]: https://reitermk.github.io/papers/2004/IJIS.pdf
13
+ */
14
+ const crypto_1 = require("crypto");
15
+ const bigint_crypto_utils_1 = require("bigint-crypto-utils");
16
+ const bigint_mod_arith_1 = require("bigint-mod-arith");
17
+ const util_1 = require("../../util");
18
+ const index_1 = require("./index");
19
+ const safePrime_1 = require("../../safePrime");
20
+ // 128 as recommend by https://blog.verichains.io/p/vsa-2022-120-multichain-key-extraction.
21
+ const ITERATIONS = 128;
22
+ async function generateModulus(openSSLBytes, bitlength = index_1.minModulusBitLength, retry = 10) {
23
+ if (bitlength < index_1.minModulusBitLength) {
24
+ // https://www.keylength.com/en/6/
25
+ // eslint-disable-next-line no-console
26
+ console.warn('Generating a modulus with less than 3072 is not recommended!');
27
+ }
28
+ const bitlengthP = Math.floor(bitlength / 2);
29
+ const bitlengthQ = bitlength - bitlengthP;
30
+ for (let i = 0; i < retry; i++) {
31
+ const [p, q] = await (0, safePrime_1.generateSafePrimes)([bitlengthP, bitlengthQ], openSSLBytes);
32
+ const n = p * q;
33
+ // For large bit lengths, the probability of generating a modulus with the wrong bit length is very low.
34
+ if ((0, bigint_crypto_utils_1.bitLength)(n) !== bitlength) {
35
+ continue;
36
+ }
37
+ return { n, q1: (p - BigInt(1)) / BigInt(2), q2: (q - BigInt(1)) / BigInt(2) };
38
+ }
39
+ throw new Error(`Unable to generate modulus with bit length of ${bitlength} after ${retry} tries. Please try again or reach out to support@bitgo.com`);
40
+ }
41
+ /**
42
+ * Generate "challenge" values for range proofs.
43
+ * @param {number} bitlength The bit length of the modulus to generate. This should
44
+ * be the same as the bit length of the paillier public keys used for MtA.
45
+ * @returns {DeserializedNtilde} The generated Ntilde values.
46
+ */
47
+ async function generateNtilde(openSSLBytes, bitlength = index_1.minModulusBitLength) {
48
+ const { n: ntilde, q1, q2 } = await generateModulus(openSSLBytes, bitlength);
49
+ const [f1, f2] = await Promise.all([(0, util_1.randomPositiveCoPrimeTo)(ntilde), (0, util_1.randomPositiveCoPrimeTo)(ntilde)]);
50
+ const h1 = (0, bigint_mod_arith_1.modPow)(f1, BigInt(2), ntilde);
51
+ const h2 = (0, bigint_mod_arith_1.modPow)(h1, f2, ntilde);
52
+ const beta = (0, bigint_mod_arith_1.modInv)(f2, q1 * q2);
53
+ const [h1wrtH2Proofs, h2wrtH1Proofs] = await Promise.all([
54
+ generateNtildeProof({
55
+ h1: h1,
56
+ h2: h2,
57
+ ntilde: ntilde,
58
+ }, f2, q1, q2),
59
+ generateNtildeProof({
60
+ h1: h2,
61
+ h2: h1,
62
+ ntilde: ntilde,
63
+ }, beta, q1, q2),
64
+ ]);
65
+ return {
66
+ ntilde,
67
+ h1,
68
+ h2,
69
+ ntildeProof: {
70
+ h1WrtH2: {
71
+ alpha: h1wrtH2Proofs.alpha,
72
+ t: h1wrtH2Proofs.t,
73
+ },
74
+ h2WrtH1: {
75
+ alpha: h2wrtH1Proofs.alpha,
76
+ t: h2wrtH1Proofs.t,
77
+ },
78
+ },
79
+ };
80
+ }
81
+ /**
82
+ * Generate iterations of Ntilde, h1, h2 discrete log proofs.
83
+ * @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
84
+ * @param {bigint} x Either alpha or beta depending on whether it is a discrete log proof of
85
+ * h1 w.r.t h2 or h2 w.r.t h1.
86
+ * @param {bigint} q1 The Sophie Germain prime associated with the first safe prime p1 used to generate Ntilde.
87
+ * @param {bigint} q2 The Sophie Germain prime associated with the second safe prime p2 used to generate Ntilde.
88
+ * @returns {NtildeProof} The generated Ntilde Proofs.
89
+ */
90
+ async function generateNtildeProof(ntilde, x, q1, q2) {
91
+ const q1MulQ2 = q1 * q2;
92
+ const a = [];
93
+ const alpha = [];
94
+ let msgToHash = Buffer.concat([
95
+ (0, util_1.bigIntToBufferBE)(ntilde.h1),
96
+ (0, util_1.bigIntToBufferBE)(ntilde.h2),
97
+ (0, util_1.bigIntToBufferBE)(ntilde.ntilde),
98
+ ]);
99
+ for (let i = 0; i < ITERATIONS; i++) {
100
+ a.push((0, bigint_crypto_utils_1.randBetween)(q1MulQ2));
101
+ alpha.push((0, bigint_mod_arith_1.modPow)(ntilde.h1, a[i], ntilde.ntilde));
102
+ msgToHash = Buffer.concat([msgToHash, (0, util_1.bigIntToBufferBE)(alpha[i], Math.ceil((0, bigint_crypto_utils_1.bitLength)(ntilde.ntilde) / 8))]);
103
+ }
104
+ const simulatedResponse = (0, crypto_1.createHash)('sha256').update(msgToHash).digest();
105
+ const t = [];
106
+ for (let i = 0; i < ITERATIONS; i++) {
107
+ // Get the ith bit from a buffer of bytes.
108
+ const ithBit = (simulatedResponse[Math.floor(i / 8)] >> (7 - (i % 8))) & 1;
109
+ t.push((a[i] + ((BigInt(ithBit) * x) % q1MulQ2)) % q1MulQ2);
110
+ }
111
+ return { alpha, t };
112
+ }
113
+ /**
114
+ * Verify discrete log proofs of h1 and h2 mod Ntilde.
115
+ * @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
116
+ * @param {DeserializedNtildeProof} ntildeProof Ntilde Proofs
117
+ * @returns {boolean} true if proof is verified, false otherwise.
118
+ */
119
+ async function verifyNtildeProof(ntilde, ntildeProof) {
120
+ const h1ModNtilde = ntilde.h1 % ntilde.ntilde;
121
+ const h2ModNtilde = ntilde.h2 % ntilde.ntilde;
122
+ if (h1ModNtilde === BigInt(0) || h2ModNtilde === BigInt(0)) {
123
+ return false;
124
+ }
125
+ if (h1ModNtilde === BigInt(1) || h2ModNtilde === BigInt(1)) {
126
+ return false;
127
+ }
128
+ if (h1ModNtilde === h2ModNtilde) {
129
+ return false;
130
+ }
131
+ if (ntildeProof.alpha.length > 256 ||
132
+ ntildeProof.alpha.length !== ITERATIONS ||
133
+ ntildeProof.t.length !== ITERATIONS) {
134
+ return false;
135
+ }
136
+ let msgToHash = Buffer.concat([
137
+ (0, util_1.bigIntToBufferBE)(ntilde.h1),
138
+ (0, util_1.bigIntToBufferBE)(ntilde.h2),
139
+ (0, util_1.bigIntToBufferBE)(ntilde.ntilde),
140
+ ]);
141
+ for (let i = 0; i < ntildeProof.alpha.length; i++) {
142
+ msgToHash = Buffer.concat([
143
+ msgToHash,
144
+ (0, util_1.bigIntToBufferBE)(ntildeProof.alpha[i], Math.ceil((0, bigint_crypto_utils_1.bitLength)(ntilde.ntilde) / 8)),
145
+ ]);
146
+ }
147
+ const simulatedResponse = (0, crypto_1.createHash)('sha256').update(msgToHash).digest();
148
+ for (let i = 0; i < ntildeProof.alpha.length; i++) {
149
+ // Get the ith bit from a buffer of bytes.
150
+ const ithBit = (simulatedResponse[Math.floor(i / 8)] >> (7 - (i % 8))) & 1;
151
+ const h1PowTi = (0, bigint_mod_arith_1.modPow)(ntilde.h1, ntildeProof.t[i], ntilde.ntilde);
152
+ const h2PowCi = (0, bigint_mod_arith_1.modPow)(ntilde.h2, BigInt(ithBit), ntilde.ntilde);
153
+ const alphaMulh2PowCi = (ntildeProof.alpha[i] * h2PowCi) % ntilde.ntilde;
154
+ if (h1PowTi !== alphaMulh2PowCi) {
155
+ return false;
156
+ }
157
+ }
158
+ return true;
159
+ }
160
+ /**
161
+ * Generate a zero-knowledge range proof that an encrypted value is "small".
162
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
163
+ * @param {number} modulusBits The bit count of the prover's public key.
164
+ * @param {PublicKey} pk The prover's public key.
165
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
166
+ * @param {bigint} c The ciphertext.
167
+ * @param {bigint} m The plaintext.
168
+ * @param {bigint} r The obfuscation value used to encrypt m.
169
+ * @returns {RangeProof} The generated proof.
170
+ */
171
+ async function prove(curve, modulusBits, pk, ntilde, c, m, r) {
172
+ const modulusBytes = Math.floor((modulusBits + 7) / 8);
173
+ const q = curve.order();
174
+ const q3 = q ** BigInt(3);
175
+ const qntilde = q * ntilde.ntilde;
176
+ const q3ntilde = q3 * ntilde.ntilde;
177
+ const alpha = (0, bigint_crypto_utils_1.randBetween)(q3);
178
+ const beta = await (0, util_1.randomPositiveCoPrimeTo)(pk.n);
179
+ const gamma = (0, bigint_crypto_utils_1.randBetween)(q3ntilde);
180
+ const rho = (0, bigint_crypto_utils_1.randBetween)(qntilde);
181
+ const z = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, m, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, rho, ntilde.ntilde)) % ntilde.ntilde;
182
+ const u = ((0, bigint_mod_arith_1.modPow)(pk.g, alpha, pk._n2) * (0, bigint_mod_arith_1.modPow)(beta, pk.n, pk._n2)) % pk._n2;
183
+ const w = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, alpha, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, gamma, ntilde.ntilde)) % ntilde.ntilde;
184
+ const hash = (0, crypto_1.createHash)('sha256');
185
+ hash.update('\x06\x00\x00\x00\x00\x00\x00\x00');
186
+ hash.update((0, util_1.bigIntToBufferBE)(pk.n, modulusBytes));
187
+ hash.update('$');
188
+ hash.update((0, util_1.bigIntToBufferBE)(pk.g, modulusBytes));
189
+ hash.update('$');
190
+ hash.update((0, util_1.bigIntToBufferBE)(c, 2 * modulusBytes));
191
+ hash.update('$');
192
+ hash.update((0, util_1.bigIntToBufferBE)(z, modulusBytes));
193
+ hash.update('$');
194
+ hash.update((0, util_1.bigIntToBufferBE)(u, 2 * modulusBytes));
195
+ hash.update('$');
196
+ hash.update((0, util_1.bigIntToBufferBE)(w, modulusBytes));
197
+ hash.update('$');
198
+ const e = (0, util_1.bigIntFromBufferBE)(hash.digest()) % q;
199
+ const s = ((0, bigint_mod_arith_1.modPow)(r, e, pk.n) * beta) % pk.n;
200
+ const s1 = e * m + alpha;
201
+ const s2 = e * rho + gamma;
202
+ return { z, u, w, s, s1, s2 };
203
+ }
204
+ /**
205
+ * Verify a zero-knowledge range proof that an encrypted value is "small".
206
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
207
+ * @param {number} modulusBits The bit count of the prover's public key.
208
+ * @param {PublicKey} pk The prover's public key.
209
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
210
+ * @param {RangeProof} proof The range proof.
211
+ * @param {bigint} c The ciphertext.
212
+ * @returns {boolean} True if verification succeeds.
213
+ */
214
+ function verify(curve, modulusBits, pk, ntilde, proof, c) {
215
+ if (proof.u === BigInt(0) || proof.s === BigInt(0)) {
216
+ return false;
217
+ }
218
+ const modulusBytes = Math.floor((modulusBits + 7) / 8);
219
+ const q = curve.order();
220
+ const q3 = q ** BigInt(3);
221
+ if (proof.s1 > q3) {
222
+ return false;
223
+ }
224
+ const hash = (0, crypto_1.createHash)('sha256');
225
+ hash.update('\x06\x00\x00\x00\x00\x00\x00\x00');
226
+ hash.update((0, util_1.bigIntToBufferBE)(pk.n, modulusBytes));
227
+ hash.update('$');
228
+ hash.update((0, util_1.bigIntToBufferBE)(pk.g, modulusBytes));
229
+ hash.update('$');
230
+ hash.update((0, util_1.bigIntToBufferBE)(c, 2 * modulusBytes));
231
+ hash.update('$');
232
+ hash.update((0, util_1.bigIntToBufferBE)(proof.z, modulusBytes));
233
+ hash.update('$');
234
+ hash.update((0, util_1.bigIntToBufferBE)(proof.u, 2 * modulusBytes));
235
+ hash.update('$');
236
+ hash.update((0, util_1.bigIntToBufferBE)(proof.w, modulusBytes));
237
+ hash.update('$');
238
+ const e = (0, util_1.bigIntFromBufferBE)(hash.digest()) % q;
239
+ let products;
240
+ products = ((0, bigint_mod_arith_1.modPow)(pk.g, proof.s1, pk._n2) * (0, bigint_mod_arith_1.modPow)(proof.s, pk.n, pk._n2) * (0, bigint_mod_arith_1.modPow)(c, -e, pk._n2)) % pk._n2;
241
+ if (proof.u !== products) {
242
+ return false;
243
+ }
244
+ products =
245
+ ((((0, bigint_mod_arith_1.modPow)(ntilde.h1, proof.s1, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, proof.s2, ntilde.ntilde)) % ntilde.ntilde) *
246
+ (0, bigint_mod_arith_1.modPow)(proof.z, -e, ntilde.ntilde)) %
247
+ ntilde.ntilde;
248
+ return proof.w === products;
249
+ }
250
+ /**
251
+ * Generate a zero-knowledge range proof that a homomorphically manipulated value is "small".
252
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
253
+ * @param {number} modulusBits The bit count of the prover's public key.
254
+ * @param {PublicKey} pk The prover's public key.
255
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
256
+ * @param {bigint} c1 The original ciphertext.
257
+ * @param {bigint} c2 The manipulated ciphertext.
258
+ * @param {bigint} x The plaintext value multiplied by the original plaintext.
259
+ * @param {bigint} y The plaintext value that is added to x.
260
+ * @param {bigint} r The obfuscation value used to encrypt x.
261
+ * @param {bigint} X The curve's base point raised to x.
262
+ * @returns {RangeProofWithCheck} The generated proof.
263
+ */
264
+ async function proveWithCheck(curve, modulusBits, pk, ntilde, c1, c2, x, y, r, X) {
265
+ const modulusBytes = Math.floor((modulusBits + 7) / 8);
266
+ const q = curve.order();
267
+ const q3 = q ** BigInt(3);
268
+ const q7 = q ** BigInt(7);
269
+ const qntilde = q * ntilde.ntilde;
270
+ const q3ntilde = q3 * ntilde.ntilde;
271
+ const alpha = (0, bigint_crypto_utils_1.randBetween)(q3);
272
+ const rho = (0, bigint_crypto_utils_1.randBetween)(qntilde);
273
+ const sigma = (0, bigint_crypto_utils_1.randBetween)(qntilde);
274
+ const tau = (0, bigint_crypto_utils_1.randBetween)(q3ntilde);
275
+ const rhoprm = (0, bigint_crypto_utils_1.randBetween)(q3ntilde);
276
+ const beta = await (0, util_1.randomPositiveCoPrimeTo)(pk.n);
277
+ const gamma = (0, bigint_crypto_utils_1.randBetween)(q7);
278
+ const u = curve.basePointMult(curve.scalarReduce(alpha));
279
+ const z = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, x, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, rho, ntilde.ntilde)) % ntilde.ntilde;
280
+ const zprm = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, alpha, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, rhoprm, ntilde.ntilde)) % ntilde.ntilde;
281
+ const t = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, y, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, sigma, ntilde.ntilde)) % ntilde.ntilde;
282
+ const v = ((((0, bigint_mod_arith_1.modPow)(c1, alpha, pk._n2) * (0, bigint_mod_arith_1.modPow)(pk.g, gamma, pk._n2)) % pk._n2) * (0, bigint_mod_arith_1.modPow)(beta, pk.n, pk._n2)) % pk._n2;
283
+ const w = ((0, bigint_mod_arith_1.modPow)(ntilde.h1, gamma, ntilde.ntilde) * (0, bigint_mod_arith_1.modPow)(ntilde.h2, tau, ntilde.ntilde)) % ntilde.ntilde;
284
+ const hash = (0, crypto_1.createHash)('sha256');
285
+ hash.update('\x0d\x00\x00\x00\x00\x00\x00\x00');
286
+ hash.update((0, util_1.bigIntToBufferBE)(pk.n, modulusBytes));
287
+ hash.update('$');
288
+ hash.update((0, util_1.bigIntToBufferBE)(pk.g, modulusBytes));
289
+ hash.update('$');
290
+ hash.update((0, util_1.bigIntToBufferBE)(X, 33));
291
+ hash.update('$');
292
+ hash.update((0, util_1.bigIntToBufferBE)(c1, 2 * modulusBytes));
293
+ hash.update('$');
294
+ hash.update((0, util_1.bigIntToBufferBE)(c2, 2 * modulusBytes));
295
+ hash.update('$');
296
+ hash.update((0, util_1.bigIntToBufferBE)(u, 33));
297
+ hash.update('$');
298
+ hash.update((0, util_1.bigIntToBufferBE)(z, modulusBytes));
299
+ hash.update('$');
300
+ hash.update((0, util_1.bigIntToBufferBE)(zprm, modulusBytes));
301
+ hash.update('$');
302
+ hash.update((0, util_1.bigIntToBufferBE)(t, modulusBytes));
303
+ hash.update('$');
304
+ hash.update((0, util_1.bigIntToBufferBE)(v, 2 * modulusBytes));
305
+ hash.update('$');
306
+ hash.update((0, util_1.bigIntToBufferBE)(w, modulusBytes));
307
+ hash.update('$');
308
+ const e = (0, util_1.bigIntFromBufferBE)(hash.digest()) % q;
309
+ const s = ((0, bigint_mod_arith_1.modPow)(r, e, pk.n) * beta) % pk.n;
310
+ const s1 = e * x + alpha;
311
+ const s2 = e * rho + rhoprm;
312
+ const t1 = e * y + gamma;
313
+ const t2 = e * sigma + tau;
314
+ return { z, zprm, t, v, w, s, s1, s2, t1, t2, u };
315
+ }
316
+ /**
317
+ * Verify a zero-knowledge range proof that a homomorphically manipulated value is "small".
318
+ * @param {BaseCurve} curve An elliptic curve to use for group operations.
319
+ * @param {number} modulusBits The bit count of the prover's public key.
320
+ * @param {PublicKey} pk The prover's public key.
321
+ * @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
322
+ * @param {RangeProofWithCheck} proof The range proof.
323
+ * @param {bigint} c1 The original ciphertext.
324
+ * @param {bigint} c2 The manipulated ciphertext.
325
+ * @param {bigint} X The curve's base point raised to x.
326
+ * @returns {boolean} True if verification succeeds.
327
+ */
328
+ function verifyWithCheck(curve, modulusBits, pk, ntilde, proof, c1, c2, X) {
329
+ const modulusBytes = Math.floor((modulusBits + 7) / 8);
330
+ const q = curve.order();
331
+ const q3 = q ** BigInt(3);
332
+ const q7 = q ** BigInt(7);
333
+ if (proof.s1 > q3) {
334
+ return false;
335
+ }
336
+ if (proof.t1 > q7) {
337
+ return false;
338
+ }
339
+ const hash = (0, crypto_1.createHash)('sha256');
340
+ hash.update('\x0d\x00\x00\x00\x00\x00\x00\x00');
341
+ hash.update((0, util_1.bigIntToBufferBE)(pk.n, modulusBytes));
342
+ hash.update('$');
343
+ hash.update((0, util_1.bigIntToBufferBE)(pk.g, modulusBytes));
344
+ hash.update('$');
345
+ hash.update((0, util_1.bigIntToBufferBE)(X, 33));
346
+ hash.update('$');
347
+ hash.update((0, util_1.bigIntToBufferBE)(c1, 2 * modulusBytes));
348
+ hash.update('$');
349
+ hash.update((0, util_1.bigIntToBufferBE)(c2, 2 * modulusBytes));
350
+ hash.update('$');
351
+ hash.update((0, util_1.bigIntToBufferBE)(proof.u, 33));
352
+ hash.update('$');
353
+ hash.update((0, util_1.bigIntToBufferBE)(proof.z, modulusBytes));
354
+ hash.update('$');
355
+ hash.update((0, util_1.bigIntToBufferBE)(proof.zprm, modulusBytes));
356
+ hash.update('$');
357
+ hash.update((0, util_1.bigIntToBufferBE)(proof.t, modulusBytes));
358
+ hash.update('$');
359
+ hash.update((0, util_1.bigIntToBufferBE)(proof.v, 2 * modulusBytes));
360
+ hash.update('$');
361
+ hash.update((0, util_1.bigIntToBufferBE)(proof.w, modulusBytes));
362
+ hash.update('$');
363
+ const e = (0, util_1.bigIntFromBufferBE)(hash.digest()) % q;
364
+ const gS1 = curve.basePointMult(curve.scalarReduce(proof.s1));
365
+ const xEU = curve.pointAdd(curve.pointMultiply(X, e), proof.u);
366
+ if (gS1 !== xEU) {
367
+ return false;
368
+ }
369
+ let left, right;
370
+ const h1ExpS1 = (0, bigint_mod_arith_1.modPow)(ntilde.h1, proof.s1, ntilde.ntilde);
371
+ const h2ExpS2 = (0, bigint_mod_arith_1.modPow)(ntilde.h2, proof.s2, ntilde.ntilde);
372
+ left = (h1ExpS1 * h2ExpS2) % ntilde.ntilde;
373
+ const zExpE = (0, bigint_mod_arith_1.modPow)(proof.z, e, ntilde.ntilde);
374
+ right = (zExpE * proof.zprm) % ntilde.ntilde;
375
+ if (left !== right) {
376
+ return false;
377
+ }
378
+ const h1ExpT1 = (0, bigint_mod_arith_1.modPow)(ntilde.h1, proof.t1, ntilde.ntilde);
379
+ const h2ExpT2 = (0, bigint_mod_arith_1.modPow)(ntilde.h2, proof.t2, ntilde.ntilde);
380
+ left = (h1ExpT1 * h2ExpT2) % ntilde.ntilde;
381
+ const tExpE = (0, bigint_mod_arith_1.modPow)(proof.t, e, ntilde.ntilde);
382
+ right = (tExpE * proof.w) % ntilde.ntilde;
383
+ if (left !== right) {
384
+ return false;
385
+ }
386
+ const c1ExpS1 = (0, bigint_mod_arith_1.modPow)(c1, proof.s1, pk._n2);
387
+ const sExpN = (0, bigint_mod_arith_1.modPow)(proof.s, pk.n, pk._n2);
388
+ const gammaExpT1 = (0, bigint_mod_arith_1.modPow)(pk.g, proof.t1, pk._n2);
389
+ left = (((c1ExpS1 * sExpN) % pk._n2) * gammaExpT1) % pk._n2;
390
+ const c2ExpE = (0, bigint_mod_arith_1.modPow)(c2, e, pk._n2);
391
+ right = (c2ExpE * proof.v) % pk._n2;
392
+ return left === right;
393
+ }
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Vwcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EvcmFuZ2Vwcm9vZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdEQSx3Q0E4Q0M7QUFXRCxrREEyQkM7QUFRRCw4Q0E2Q0M7QUFZRCxzQkF3Q0M7QUFZRCx3QkEwQ0M7QUFnQkQsd0NBK0RDO0FBY0QsMENBMEVDO0FBbGREOzs7R0FHRztBQUNILG1DQUFvQztBQUdwQyw2REFBNkQ7QUFDN0QsdURBQWtEO0FBU2xELHFDQUEyRjtBQUMzRixtQ0FBOEM7QUFDOUMsK0NBQXFEO0FBRXJELDJGQUEyRjtBQUMzRixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFFdkIsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsWUFBd0IsRUFDeEIsU0FBUyxHQUFHLDJCQUFtQixFQUMvQixLQUFLLEdBQUcsRUFBRTtJQUVWLElBQUksU0FBUyxHQUFHLDJCQUFtQixFQUFFLENBQUM7UUFDcEMsa0NBQWtDO1FBQ2xDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLFNBQVMsR0FBRyxVQUFVLENBQUM7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFBLDhCQUFrQixFQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsd0dBQXdHO1FBQ3hHLElBQUks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TyxHQUFHLElBQUEseUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzFDLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ25CLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBQSx5QkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFBLHlCQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBaZXJvIEtub3dsZWRnZSBSYW5nZSBQcm9vZnMgYXMgZGVzY3JpYmVkIGluIChUd28tcGFydHkgZ2VuZXJhdGlvbiBvZiBEU0Egc2lnbmF0dXJlcylbMV0uXG4gKiBbMV06IGh0dHBzOi8vcmVpdGVybWsuZ2l0aHViLmlvL3BhcGVycy8yMDA0L0lKSVMucGRmXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQmFzZUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCB7IFB1YmxpY0tleSB9IGZyb20gJ3BhaWxsaWVyLWJpZ2ludCc7XG5pbXBvcnQgeyBiaXRMZW5ndGgsIHJhbmRCZXR3ZWVuIH0gZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgeyBtb2RJbnYsIG1vZFBvdyB9IGZyb20gJ2JpZ2ludC1tb2QtYXJpdGgnO1xuaW1wb3J0IHtcbiAgRGVzZXJpYWxpemVkTnRpbGRlLFxuICBEZXNlcmlhbGl6ZWROdGlsZGVQcm9vZixcbiAgUlNBTW9kdWx1cyxcbiAgUmFuZ2VQcm9vZixcbiAgUmFuZ2VQcm9vZldpdGhDaGVjayxcbiAgRGVzZXJpYWxpemVkTnRpbGRlV2l0aFByb29mcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBiaWdJbnRGcm9tQnVmZmVyQkUsIGJpZ0ludFRvQnVmZmVyQkUsIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBtaW5Nb2R1bHVzQml0TGVuZ3RoIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNhZmVQcmltZXMgfSBmcm9tICcuLi8uLi9zYWZlUHJpbWUnO1xuXG4vLyAxMjggYXMgcmVjb21tZW5kIGJ5IGh0dHBzOi8vYmxvZy52ZXJpY2hhaW5zLmlvL3AvdnNhLTIwMjItMTIwLW11bHRpY2hhaW4ta2V5LWV4dHJhY3Rpb24uXG5jb25zdCBJVEVSQVRJT05TID0gMTI4O1xuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1vZHVsdXMoXG4gIG9wZW5TU0xCeXRlczogVWludDhBcnJheSxcbiAgYml0bGVuZ3RoID0gbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgcmV0cnkgPSAxMFxuKTogUHJvbWlzZTxSU0FNb2R1bHVzPiB7XG4gIGlmIChiaXRsZW5ndGggPCBtaW5Nb2R1bHVzQml0TGVuZ3RoKSB7XG4gICAgLy8gaHR0cHM6Ly93d3cua2V5bGVuZ3RoLmNvbS9lbi82L1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKCdHZW5lcmF0aW5nIGEgbW9kdWx1cyB3aXRoIGxlc3MgdGhhbiAzMDcyIGlzIG5vdCByZWNvbW1lbmRlZCEnKTtcbiAgfVxuICBjb25zdCBiaXRsZW5ndGhQID0gTWF0aC5mbG9vcihiaXRsZW5ndGggLyAyKTtcbiAgY29uc3QgYml0bGVuZ3RoUSA9IGJpdGxlbmd0aCAtIGJpdGxlbmd0aFA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0cnk7IGkrKykge1xuICAgIGNvbnN0IFtwLCBxXSA9IGF3YWl0IGdlbmVyYXRlU2FmZVByaW1lcyhbYml0bGVuZ3RoUCwgYml0bGVuZ3RoUV0sIG9wZW5TU0xCeXRlcyk7XG4gICAgY29uc3QgbiA9IHAgKiBxO1xuICAgIC8vIEZvciBsYXJnZSBiaXQgbGVuZ3RocywgdGhlIHByb2JhYmlsaXR5IG9mIGdlbmVyYXRpbmcgYSBtb2R1bHVzIHdpdGggdGhlIHdyb25nIGJpdCBsZW5ndGggaXMgdmVyeSBsb3cuXG4gICAgaWYgKGJpdExlbmd0aChuKSAhPT0gYml0bGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbiwgcTE6IChwIC0gQmlnSW50KDEpKSAvIEJpZ0ludCgyKSwgcTI6IChxIC0gQmlnSW50KDEpKSAvIEJpZ0ludCgyKSB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5hYmxlIHRvIGdlbmVyYXRlIG1vZHVsdXMgd2l0aCBiaXQgbGVuZ3RoIG9mICR7Yml0bGVuZ3RofSBhZnRlciAke3JldHJ5fSB0cmllcy4gUGxlYXNlIHRyeSBhZ2FpbiBvciByZWFjaCBvdXQgdG8gc3VwcG9ydEBiaXRnby5jb21gXG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgXCJjaGFsbGVuZ2VcIiB2YWx1ZXMgZm9yIHJhbmdlIHByb29mcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRsZW5ndGggVGhlIGJpdCBsZW5ndGggb2YgdGhlIG1vZHVsdXMgdG8gZ2VuZXJhdGUuIFRoaXMgc2hvdWxkXG4gKiBiZSB0aGUgc2FtZSBhcyB0aGUgYml0IGxlbmd0aCBvZiB0aGUgcGFpbGxpZXIgcHVibGljIGtleXMgdXNlZCBmb3IgTXRBLlxuICogQHJldHVybnMge0Rlc2VyaWFsaXplZE50aWxkZX0gVGhlIGdlbmVyYXRlZCBOdGlsZGUgdmFsdWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOdGlsZGUoXG4gIG9wZW5TU0xCeXRlczogVWludDhBcnJheSxcbiAgYml0bGVuZ3RoID0gbWluTW9kdWx1c0JpdExlbmd0aFxuKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzPiB7XG4gIGNvbnN0IHsgbjogbnRpbGRlLCBxMSwgcTIgfSA9IGF3YWl0IGdlbmVyYXRlTW9kdWx1cyhvcGVuU1NMQnl0ZXMsIGJpdGxlbmd0aCk7XG4gIGNvbnN0IFtmMSwgZjJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JhbmRvbVBvc2l0aXZlQ29QcmltZVRvKG50aWxkZSksIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKG50aWxkZSldKTtcbiAgY29uc3QgaDEgPSBtb2RQb3coZjEsIEJpZ0ludCgyKSwgbnRpbGRlKTtcbiAgY29uc3QgaDIgPSBtb2RQb3coaDEsIGYyLCBudGlsZGUpO1xuICBjb25zdCBiZXRhID0gbW9kSW52KGYyLCBxMSAqIHEyKTtcbiAgY29uc3QgW2gxd3J0SDJQcm9vZnMsIGgyd3J0SDFQcm9vZnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGdlbmVyYXRlTnRpbGRlUHJvb2YoXG4gICAgICB7XG4gICAgICAgIGgxOiBoMSxcbiAgICAgICAgaDI6IGgyLFxuICAgICAgICBudGlsZGU6IG50aWxkZSxcbiAgICAgIH0sXG4gICAgICBmMixcbiAgICAgIHExLFxuICAgICAgcTJcbiAgICApLFxuICAgIGdlbmVyYXRlTnRpbGRlUHJvb2YoXG4gICAgICB7XG4gICAgICAgIGgxOiBoMixcbiAgICAgICAgaDI6IGgxLFxuICAgICAgICBudGlsZGU6IG50aWxkZSxcbiAgICAgIH0sXG4gICAgICBiZXRhLFxuICAgICAgcTEsXG4gICAgICBxMlxuICAgICksXG4gIF0pO1xuICByZXR1cm4ge1xuICAgIG50aWxkZSxcbiAgICBoMSxcbiAgICBoMixcbiAgICBudGlsZGVQcm9vZjoge1xuICAgICAgaDFXcnRIMjoge1xuICAgICAgICBhbHBoYTogaDF3cnRIMlByb29mcy5hbHBoYSxcbiAgICAgICAgdDogaDF3cnRIMlByb29mcy50LFxuICAgICAgfSxcbiAgICAgIGgyV3J0SDE6IHtcbiAgICAgICAgYWxwaGE6IGgyd3J0SDFQcm9vZnMuYWxwaGEsXG4gICAgICAgIHQ6IGgyd3J0SDFQcm9vZnMudCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBpdGVyYXRpb25zIG9mIE50aWxkZSwgaDEsIGgyIGRpc2NyZXRlIGxvZyBwcm9vZnMuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZE50aWxkZX0gbnRpbGRlIE50aWxkZSwgaDEsIGgyIHRvIGdlbmVyYXRlIHRoZSBwcm9vZnMgZm9yLlxuICogQHBhcmFtIHtiaWdpbnR9IHggRWl0aGVyIGFscGhhIG9yIGJldGEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaXMgYSBkaXNjcmV0ZSBsb2cgcHJvb2Ygb2ZcbiAqIGgxIHcuci50IGgyIG9yIGgyIHcuci50IGgxLlxuICogQHBhcmFtIHtiaWdpbnR9IHExIFRoZSBTb3BoaWUgR2VybWFpbiBwcmltZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IHNhZmUgcHJpbWUgcDEgdXNlZCB0byBnZW5lcmF0ZSBOdGlsZGUuXG4gKiBAcGFyYW0ge2JpZ2ludH0gcTIgVGhlIFNvcGhpZSBHZXJtYWluIHByaW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vjb25kIHNhZmUgcHJpbWUgcDIgdXNlZCB0byBnZW5lcmF0ZSBOdGlsZGUuXG4gKiBAcmV0dXJucyB7TnRpbGRlUHJvb2Z9IFRoZSBnZW5lcmF0ZWQgTnRpbGRlIFByb29mcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTnRpbGRlUHJvb2YoXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICB4OiBiaWdpbnQsXG4gIHExOiBiaWdpbnQsXG4gIHEyOiBiaWdpbnRcbik6IFByb21pc2U8RGVzZXJpYWxpemVkTnRpbGRlUHJvb2Y+IHtcbiAgY29uc3QgcTFNdWxRMiA9IHExICogcTI7XG4gIGNvbnN0IGE6IGJpZ2ludFtdID0gW107XG4gIGNvbnN0IGFscGhhOiBiaWdpbnRbXSA9IFtdO1xuICBsZXQgbXNnVG9IYXNoOiBCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZS5oMSksXG4gICAgYmlnSW50VG9CdWZmZXJCRShudGlsZGUuaDIpLFxuICAgIGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlLm50aWxkZSksXG4gIF0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykge1xuICAgIGEucHVzaChyYW5kQmV0d2VlbihxMU11bFEyKSk7XG4gICAgYWxwaGEucHVzaChtb2RQb3cobnRpbGRlLmgxLCBhW2ldLCBudGlsZGUubnRpbGRlKSk7XG4gICAgbXNnVG9IYXNoID0gQnVmZmVyLmNvbmNhdChbbXNnVG9IYXNoLCBiaWdJbnRUb0J1ZmZlckJFKGFscGhhW2ldLCBNYXRoLmNlaWwoYml0TGVuZ3RoKG50aWxkZS5udGlsZGUpIC8gOCkpXSk7XG4gIH1cbiAgY29uc3Qgc2ltdWxhdGVkUmVzcG9uc2UgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobXNnVG9IYXNoKS5kaWdlc3QoKTtcbiAgY29uc3QgdDogYmlnaW50W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHtcbiAgICAvLyBHZXQgdGhlIGl0aCBiaXQgZnJvbSBhIGJ1ZmZlciBvZiBieXRlcy5cbiAgICBjb25zdCBpdGhCaXQgPSAoc2ltdWxhdGVkUmVzcG9uc2VbTWF0aC5mbG9vcihpIC8gOCldID4+ICg3IC0gKGkgJSA4KSkpICYgMTtcbiAgICB0LnB1c2goKGFbaV0gKyAoKEJpZ0ludChpdGhCaXQpICogeCkgJSBxMU11bFEyKSkgJSBxMU11bFEyKTtcbiAgfVxuICByZXR1cm4geyBhbHBoYSwgdCB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSBkaXNjcmV0ZSBsb2cgcHJvb2ZzIG9mIGgxIGFuZCBoMiBtb2QgTnRpbGRlLlxuICogQHBhcmFtIHtEZXNlcmlhbGl6ZWROdGlsZGV9IG50aWxkZSBOdGlsZGUsIGgxLCBoMiB0byBnZW5lcmF0ZSB0aGUgcHJvb2ZzIGZvci5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkTnRpbGRlUHJvb2Z9IG50aWxkZVByb29mIE50aWxkZSBQcm9vZnNcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHByb29mIGlzIHZlcmlmaWVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlOdGlsZGVQcm9vZihcbiAgbnRpbGRlOiBEZXNlcmlhbGl6ZWROdGlsZGUsXG4gIG50aWxkZVByb29mOiBEZXNlcmlhbGl6ZWROdGlsZGVQcm9vZlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGgxTW9kTnRpbGRlID0gbnRpbGRlLmgxICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgaDJNb2ROdGlsZGUgPSBudGlsZGUuaDIgJSBudGlsZGUubnRpbGRlO1xuICBpZiAoaDFNb2ROdGlsZGUgPT09IEJpZ0ludCgwKSB8fCBoMk1vZE50aWxkZSA9PT0gQmlnSW50KDApKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChoMU1vZE50aWxkZSA9PT0gQmlnSW50KDEpIHx8IGgyTW9kTnRpbGRlID09PSBCaWdJbnQoMSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGgxTW9kTnRpbGRlID09PSBoMk1vZE50aWxkZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgbnRpbGRlUHJvb2YuYWxwaGEubGVuZ3RoID4gMjU2IHx8XG4gICAgbnRpbGRlUHJvb2YuYWxwaGEubGVuZ3RoICE9PSBJVEVSQVRJT05TIHx8XG4gICAgbnRpbGRlUHJvb2YudC5sZW5ndGggIT09IElURVJBVElPTlNcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBtc2dUb0hhc2g6IEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW1xuICAgIGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlLmgxKSxcbiAgICBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZS5oMiksXG4gICAgYmlnSW50VG9CdWZmZXJCRShudGlsZGUubnRpbGRlKSxcbiAgXSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnRpbGRlUHJvb2YuYWxwaGEubGVuZ3RoOyBpKyspIHtcbiAgICBtc2dUb0hhc2ggPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIG1zZ1RvSGFzaCxcbiAgICAgIGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlUHJvb2YuYWxwaGFbaV0sIE1hdGguY2VpbChiaXRMZW5ndGgobnRpbGRlLm50aWxkZSkgLyA4KSksXG4gICAgXSk7XG4gIH1cbiAgY29uc3Qgc2ltdWxhdGVkUmVzcG9uc2UgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUobXNnVG9IYXNoKS5kaWdlc3QoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudGlsZGVQcm9vZi5hbHBoYS5sZW5ndGg7IGkrKykge1xuICAgIC8vIEdldCB0aGUgaXRoIGJpdCBmcm9tIGEgYnVmZmVyIG9mIGJ5dGVzLlxuICAgIGNvbnN0IGl0aEJpdCA9IChzaW11bGF0ZWRSZXNwb25zZVtNYXRoLmZsb29yKGkgLyA4KV0gPj4gKDcgLSAoaSAlIDgpKSkgJiAxO1xuICAgIGNvbnN0IGgxUG93VGkgPSBtb2RQb3cobnRpbGRlLmgxLCBudGlsZGVQcm9vZi50W2ldLCBudGlsZGUubnRpbGRlKTtcbiAgICBjb25zdCBoMlBvd0NpID0gbW9kUG93KG50aWxkZS5oMiwgQmlnSW50KGl0aEJpdCksIG50aWxkZS5udGlsZGUpO1xuICAgIGNvbnN0IGFscGhhTXVsaDJQb3dDaSA9IChudGlsZGVQcm9vZi5hbHBoYVtpXSAqIGgyUG93Q2kpICUgbnRpbGRlLm50aWxkZTtcbiAgICBpZiAoaDFQb3dUaSAhPT0gYWxwaGFNdWxoMlBvd0NpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIHplcm8ta25vd2xlZGdlIHJhbmdlIHByb29mIHRoYXQgYW4gZW5jcnlwdGVkIHZhbHVlIGlzIFwic21hbGxcIi5cbiAqIEBwYXJhbSB7QmFzZUN1cnZlfSBjdXJ2ZSBBbiBlbGxpcHRpYyBjdXJ2ZSB0byB1c2UgZm9yIGdyb3VwIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kdWx1c0JpdHMgVGhlIGJpdCBjb3VudCBvZiB0aGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7UHVibGljS2V5fSBwayBUaGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkTnRpbGRlfSBudGlsZGUgVGhlIHZlcmlmaWVyJ3MgTnRpbGRlIHZhbHVlcy5cbiAqIEBwYXJhbSB7YmlnaW50fSBjIFRoZSBjaXBoZXJ0ZXh0LlxuICogQHBhcmFtIHtiaWdpbnR9IG0gVGhlIHBsYWludGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSByIFRoZSBvYmZ1c2NhdGlvbiB2YWx1ZSB1c2VkIHRvIGVuY3J5cHQgbS5cbiAqIEByZXR1cm5zIHtSYW5nZVByb29mfSBUaGUgZ2VuZXJhdGVkIHByb29mLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmUoXG4gIGN1cnZlOiBCYXNlQ3VydmUsXG4gIG1vZHVsdXNCaXRzOiBudW1iZXIsXG4gIHBrOiBQdWJsaWNLZXksXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICBjOiBiaWdpbnQsXG4gIG06IGJpZ2ludCxcbiAgcjogYmlnaW50XG4pOiBQcm9taXNlPFJhbmdlUHJvb2Y+IHtcbiAgY29uc3QgbW9kdWx1c0J5dGVzID0gTWF0aC5mbG9vcigobW9kdWx1c0JpdHMgKyA3KSAvIDgpO1xuICBjb25zdCBxID0gY3VydmUub3JkZXIoKTtcbiAgY29uc3QgcTMgPSBxICoqIEJpZ0ludCgzKTtcbiAgY29uc3QgcW50aWxkZSA9IHEgKiBudGlsZGUubnRpbGRlO1xuICBjb25zdCBxM250aWxkZSA9IHEzICogbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgYWxwaGEgPSByYW5kQmV0d2VlbihxMyk7XG4gIGNvbnN0IGJldGEgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgY29uc3QgZ2FtbWEgPSByYW5kQmV0d2VlbihxM250aWxkZSk7XG4gIGNvbnN0IHJobyA9IHJhbmRCZXR3ZWVuKHFudGlsZGUpO1xuICBjb25zdCB6ID0gKG1vZFBvdyhudGlsZGUuaDEsIG0sIG50aWxkZS5udGlsZGUpICogbW9kUG93KG50aWxkZS5oMiwgcmhvLCBudGlsZGUubnRpbGRlKSkgJSBudGlsZGUubnRpbGRlO1xuICBjb25zdCB1ID0gKG1vZFBvdyhway5nLCBhbHBoYSwgcGsuX24yKSAqIG1vZFBvdyhiZXRhLCBway5uLCBway5fbjIpKSAlIHBrLl9uMjtcbiAgY29uc3QgdyA9IChtb2RQb3cobnRpbGRlLmgxLCBhbHBoYSwgbnRpbGRlLm50aWxkZSkgKiBtb2RQb3cobnRpbGRlLmgyLCBnYW1tYSwgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZSgnXFx4MDZcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLm4sIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLmcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKGMsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh6LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh1LCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodywgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGNvbnN0IGUgPSBiaWdJbnRGcm9tQnVmZmVyQkUoaGFzaC5kaWdlc3QoKSkgJSBxO1xuICBjb25zdCBzID0gKG1vZFBvdyhyLCBlLCBway5uKSAqIGJldGEpICUgcGsubjtcbiAgY29uc3QgczEgPSBlICogbSArIGFscGhhO1xuICBjb25zdCBzMiA9IGUgKiByaG8gKyBnYW1tYTtcbiAgcmV0dXJuIHsgeiwgdSwgdywgcywgczEsIHMyIH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgemVyby1rbm93bGVkZ2UgcmFuZ2UgcHJvb2YgdGhhdCBhbiBlbmNyeXB0ZWQgdmFsdWUgaXMgXCJzbWFsbFwiLlxuICogQHBhcmFtIHtCYXNlQ3VydmV9IGN1cnZlIEFuIGVsbGlwdGljIGN1cnZlIHRvIHVzZSBmb3IgZ3JvdXAgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtb2R1bHVzQml0cyBUaGUgYml0IGNvdW50IG9mIHRoZSBwcm92ZXIncyBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtQdWJsaWNLZXl9IHBrIFRoZSBwcm92ZXIncyBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtEZXNlcmlhbGl6ZWROdGlsZGV9IG50aWxkZSBUaGUgdmVyaWZpZXIncyBOdGlsZGUgdmFsdWVzLlxuICogQHBhcmFtIHtSYW5nZVByb29mfSBwcm9vZiBUaGUgcmFuZ2UgcHJvb2YuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYyBUaGUgY2lwaGVydGV4dC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeShcbiAgY3VydmU6IEJhc2VDdXJ2ZSxcbiAgbW9kdWx1c0JpdHM6IG51bWJlcixcbiAgcGs6IFB1YmxpY0tleSxcbiAgbnRpbGRlOiBEZXNlcmlhbGl6ZWROdGlsZGUsXG4gIHByb29mOiBSYW5nZVByb29mLFxuICBjOiBiaWdpbnRcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvb2YudSA9PT0gQmlnSW50KDApIHx8IHByb29mLnMgPT09IEJpZ0ludCgwKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBtb2R1bHVzQnl0ZXMgPSBNYXRoLmZsb29yKChtb2R1bHVzQml0cyArIDcpIC8gOCk7XG4gIGNvbnN0IHEgPSBjdXJ2ZS5vcmRlcigpO1xuICBjb25zdCBxMyA9IHEgKiogQmlnSW50KDMpO1xuICBpZiAocHJvb2YuczEgPiBxMykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gIGhhc2gudXBkYXRlKCdcXHgwNlxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocGsubiwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocGsuZywgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoYywgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgY29uc3QgZSA9IGJpZ0ludEZyb21CdWZmZXJCRShoYXNoLmRpZ2VzdCgpKSAlIHE7XG4gIGxldCBwcm9kdWN0czogYmlnaW50O1xuICBwcm9kdWN0cyA9IChtb2RQb3cocGsuZywgcHJvb2YuczEsIHBrLl9uMikgKiBtb2RQb3cocHJvb2YucywgcGsubiwgcGsuX24yKSAqIG1vZFBvdyhjLCAtZSwgcGsuX24yKSkgJSBway5fbjI7XG4gIGlmIChwcm9vZi51ICE9PSBwcm9kdWN0cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm9kdWN0cyA9XG4gICAgKCgobW9kUG93KG50aWxkZS5oMSwgcHJvb2YuczEsIG50aWxkZS5udGlsZGUpICogbW9kUG93KG50aWxkZS5oMiwgcHJvb2YuczIsIG50aWxkZS5udGlsZGUpKSAlIG50aWxkZS5udGlsZGUpICpcbiAgICAgIG1vZFBvdyhwcm9vZi56LCAtZSwgbnRpbGRlLm50aWxkZSkpICVcbiAgICBudGlsZGUubnRpbGRlO1xuICByZXR1cm4gcHJvb2YudyA9PT0gcHJvZHVjdHM7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSB6ZXJvLWtub3dsZWRnZSByYW5nZSBwcm9vZiB0aGF0IGEgaG9tb21vcnBoaWNhbGx5IG1hbmlwdWxhdGVkIHZhbHVlIGlzIFwic21hbGxcIi5cbiAqIEBwYXJhbSB7QmFzZUN1cnZlfSBjdXJ2ZSBBbiBlbGxpcHRpYyBjdXJ2ZSB0byB1c2UgZm9yIGdyb3VwIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kdWx1c0JpdHMgVGhlIGJpdCBjb3VudCBvZiB0aGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7UHVibGljS2V5fSBwayBUaGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkTnRpbGRlfSBudGlsZGUgVGhlIHZlcmlmaWVyJ3MgTnRpbGRlIHZhbHVlcy5cbiAqIEBwYXJhbSB7YmlnaW50fSBjMSBUaGUgb3JpZ2luYWwgY2lwaGVydGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSBjMiBUaGUgbWFuaXB1bGF0ZWQgY2lwaGVydGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSB4IFRoZSBwbGFpbnRleHQgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgb3JpZ2luYWwgcGxhaW50ZXh0LlxuICogQHBhcmFtIHtiaWdpbnR9IHkgVGhlIHBsYWludGV4dCB2YWx1ZSB0aGF0IGlzIGFkZGVkIHRvIHguXG4gKiBAcGFyYW0ge2JpZ2ludH0gciBUaGUgb2JmdXNjYXRpb24gdmFsdWUgdXNlZCB0byBlbmNyeXB0IHguXG4gKiBAcGFyYW0ge2JpZ2ludH0gWCBUaGUgY3VydmUncyBiYXNlIHBvaW50IHJhaXNlZCB0byB4LlxuICogQHJldHVybnMge1JhbmdlUHJvb2ZXaXRoQ2hlY2t9IFRoZSBnZW5lcmF0ZWQgcHJvb2YuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92ZVdpdGhDaGVjayhcbiAgY3VydmU6IEJhc2VDdXJ2ZSxcbiAgbW9kdWx1c0JpdHM6IG51bWJlcixcbiAgcGs6IFB1YmxpY0tleSxcbiAgbnRpbGRlOiBEZXNlcmlhbGl6ZWROdGlsZGUsXG4gIGMxOiBiaWdpbnQsXG4gIGMyOiBiaWdpbnQsXG4gIHg6IGJpZ2ludCxcbiAgeTogYmlnaW50LFxuICByOiBiaWdpbnQsXG4gIFg6IGJpZ2ludFxuKTogUHJvbWlzZTxSYW5nZVByb29mV2l0aENoZWNrPiB7XG4gIGNvbnN0IG1vZHVsdXNCeXRlcyA9IE1hdGguZmxvb3IoKG1vZHVsdXNCaXRzICsgNykgLyA4KTtcbiAgY29uc3QgcSA9IGN1cnZlLm9yZGVyKCk7XG4gIGNvbnN0IHEzID0gcSAqKiBCaWdJbnQoMyk7XG4gIGNvbnN0IHE3ID0gcSAqKiBCaWdJbnQoNyk7XG4gIGNvbnN0IHFudGlsZGUgPSBxICogbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgcTNudGlsZGUgPSBxMyAqIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IGFscGhhID0gcmFuZEJldHdlZW4ocTMpO1xuICBjb25zdCByaG8gPSByYW5kQmV0d2VlbihxbnRpbGRlKTtcbiAgY29uc3Qgc2lnbWEgPSByYW5kQmV0d2VlbihxbnRpbGRlKTtcbiAgY29uc3QgdGF1ID0gcmFuZEJldHdlZW4ocTNudGlsZGUpO1xuICBjb25zdCByaG9wcm0gPSByYW5kQmV0d2VlbihxM250aWxkZSk7XG4gIGNvbnN0IGJldGEgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgY29uc3QgZ2FtbWEgPSByYW5kQmV0d2VlbihxNyk7XG4gIGNvbnN0IHUgPSBjdXJ2ZS5iYXNlUG9pbnRNdWx0KGN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSkpO1xuICBjb25zdCB6ID0gKG1vZFBvdyhudGlsZGUuaDEsIHgsIG50aWxkZS5udGlsZGUpICogbW9kUG93KG50aWxkZS5oMiwgcmhvLCBudGlsZGUubnRpbGRlKSkgJSBudGlsZGUubnRpbGRlO1xuICBjb25zdCB6cHJtID0gKG1vZFBvdyhudGlsZGUuaDEsIGFscGhhLCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHJob3BybSwgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgdCA9IChtb2RQb3cobnRpbGRlLmgxLCB5LCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHNpZ21hLCBudGlsZGUubnRpbGRlKSkgJSBudGlsZGUubnRpbGRlO1xuICBjb25zdCB2ID1cbiAgICAoKChtb2RQb3coYzEsIGFscGhhLCBway5fbjIpICogbW9kUG93KHBrLmcsIGdhbW1hLCBway5fbjIpKSAlIHBrLl9uMikgKiBtb2RQb3coYmV0YSwgcGsubiwgcGsuX24yKSkgJSBway5fbjI7XG4gIGNvbnN0IHcgPSAobW9kUG93KG50aWxkZS5oMSwgZ2FtbWEsIG50aWxkZS5udGlsZGUpICogbW9kUG93KG50aWxkZS5oMiwgdGF1LCBudGlsZGUubnRpbGRlKSkgJSBudGlsZGUubnRpbGRlO1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gIGhhc2gudXBkYXRlKCdcXHgwZFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocGsubiwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocGsuZywgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoWCwgMzMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShjMSwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKGMyLCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodSwgMzMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh6LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh6cHJtLCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh0LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh2LCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodywgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGNvbnN0IGUgPSBiaWdJbnRGcm9tQnVmZmVyQkUoaGFzaC5kaWdlc3QoKSkgJSBxO1xuICBjb25zdCBzID0gKG1vZFBvdyhyLCBlLCBway5uKSAqIGJldGEpICUgcGsubjtcbiAgY29uc3QgczEgPSBlICogeCArIGFscGhhO1xuICBjb25zdCBzMiA9IGUgKiByaG8gKyByaG9wcm07XG4gIGNvbnN0IHQxID0gZSAqIHkgKyBnYW1tYTtcbiAgY29uc3QgdDIgPSBlICogc2lnbWEgKyB0YXU7XG4gIHJldHVybiB7IHosIHpwcm0sIHQsIHYsIHcsIHMsIHMxLCBzMiwgdDEsIHQyLCB1IH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgemVyby1rbm93bGVkZ2UgcmFuZ2UgcHJvb2YgdGhhdCBhIGhvbW9tb3JwaGljYWxseSBtYW5pcHVsYXRlZCB2YWx1ZSBpcyBcInNtYWxsXCIuXG4gKiBAcGFyYW0ge0Jhc2VDdXJ2ZX0gY3VydmUgQW4gZWxsaXB0aWMgY3VydmUgdG8gdXNlIGZvciBncm91cCBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtudW1iZXJ9IG1vZHVsdXNCaXRzIFRoZSBiaXQgY291bnQgb2YgdGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge1B1YmxpY0tleX0gcGsgVGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZE50aWxkZX0gbnRpbGRlIFRoZSB2ZXJpZmllcidzIE50aWxkZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge1JhbmdlUHJvb2ZXaXRoQ2hlY2t9IHByb29mIFRoZSByYW5nZSBwcm9vZi5cbiAqIEBwYXJhbSB7YmlnaW50fSBjMSBUaGUgb3JpZ2luYWwgY2lwaGVydGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSBjMiBUaGUgbWFuaXB1bGF0ZWQgY2lwaGVydGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSBYIFRoZSBjdXJ2ZSdzIGJhc2UgcG9pbnQgcmFpc2VkIHRvIHguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2ZXJpZmljYXRpb24gc3VjY2VlZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlXaXRoQ2hlY2soXG4gIGN1cnZlOiBCYXNlQ3VydmUsXG4gIG1vZHVsdXNCaXRzOiBudW1iZXIsXG4gIHBrOiBQdWJsaWNLZXksXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICBwcm9vZjogUmFuZ2VQcm9vZldpdGhDaGVjayxcbiAgYzE6IGJpZ2ludCxcbiAgYzI6IGJpZ2ludCxcbiAgWDogYmlnaW50XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbW9kdWx1c0J5dGVzID0gTWF0aC5mbG9vcigobW9kdWx1c0JpdHMgKyA3KSAvIDgpO1xuICBjb25zdCBxID0gY3VydmUub3JkZXIoKTtcbiAgY29uc3QgcTMgPSBxICoqIEJpZ0ludCgzKTtcbiAgY29uc3QgcTcgPSBxICoqIEJpZ0ludCg3KTtcbiAgaWYgKHByb29mLnMxID4gcTMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHByb29mLnQxID4gcTcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZSgnXFx4MGRcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLm4sIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLmcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKFgsIDMzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoYzEsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShjMiwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBjb25zdCBlID0gYmlnSW50RnJvbUJ1ZmZlckJFKGhhc2guZGlnZXN0KCkpICUgcTtcbiAgY29uc3QgZ1MxID0gY3VydmUuYmFzZVBvaW50TXVsdChjdXJ2ZS5zY2FsYXJSZWR1Y2UocHJvb2YuczEpKTtcbiAgY29uc3QgeEVVID0gY3VydmUucG9pbnRBZGQoY3VydmUucG9pbnRNdWx0aXBseShYLCBlKSwgcHJvb2YudSk7XG4gIGlmIChnUzEgIT09IHhFVSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgbGVmdCwgcmlnaHQ7XG4gIGNvbnN0IGgxRXhwUzEgPSBtb2RQb3cobnRpbGRlLmgxLCBwcm9vZi5zMSwgbnRpbGRlLm50aWxkZSk7XG4gIGNvbnN0IGgyRXhwUzIgPSBtb2RQb3cobnRpbGRlLmgyLCBwcm9vZi5zMiwgbnRpbGRlLm50aWxkZSk7XG4gIGxlZnQgPSAoaDFFeHBTMSAqIGgyRXhwUzIpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgekV4cEUgPSBtb2RQb3cocHJvb2YueiwgZSwgbnRpbGRlLm50aWxkZSk7XG4gIHJpZ2h0ID0gKHpFeHBFICogcHJvb2YuenBybSkgJSBudGlsZGUubnRpbGRlO1xuICBpZiAobGVmdCAhPT0gcmlnaHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaDFFeHBUMSA9IG1vZFBvdyhudGlsZGUuaDEsIHByb29mLnQxLCBudGlsZGUubnRpbGRlKTtcbiAgY29uc3QgaDJFeHBUMiA9IG1vZFBvdyhudGlsZGUuaDIsIHByb29mLnQyLCBudGlsZGUubnRpbGRlKTtcbiAgbGVmdCA9IChoMUV4cFQxICogaDJFeHBUMikgJSBudGlsZGUubnRpbGRlO1xuICBjb25zdCB0RXhwRSA9IG1vZFBvdyhwcm9vZi50LCBlLCBudGlsZGUubnRpbGRlKTtcbiAgcmlnaHQgPSAodEV4cEUgKiBwcm9vZi53KSAlIG50aWxkZS5udGlsZGU7XG4gIGlmIChsZWZ0ICE9PSByaWdodCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjMUV4cFMxID0gbW9kUG93KGMxLCBwcm9vZi5zMSwgcGsuX24yKTtcbiAgY29uc3Qgc0V4cE4gPSBtb2RQb3cocHJvb2YucywgcGsubiwgcGsuX24yKTtcbiAgY29uc3QgZ2FtbWFFeHBUMSA9IG1vZFBvdyhway5nLCBwcm9vZi50MSwgcGsuX24yKTtcbiAgbGVmdCA9ICgoKGMxRXhwUzEgKiBzRXhwTikgJSBway5fbjIpICogZ2FtbWFFeHBUMSkgJSBway5fbjI7XG4gIGNvbnN0IGMyRXhwRSA9IG1vZFBvdyhjMiwgZSwgcGsuX24yKTtcbiAgcmlnaHQgPSAoYzJFeHBFICogcHJvb2YudikgJSBway5fbjI7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cbiJdfQ==