@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.36 → 8.2.1-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 +519 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -6
- package/dist/src/curves/constant.d.ts +0 -2
- package/dist/src/curves/constant.d.ts.map +0 -1
- package/dist/src/curves/constant.js +0 -6
- package/dist/src/curves/ed25519.d.ts +0 -21
- package/dist/src/curves/ed25519.d.ts.map +0 -1
- package/dist/src/curves/ed25519.js +0 -72
- package/dist/src/curves/ed25519Bip32HdTree.d.ts +0 -10
- package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +0 -1
- package/dist/src/curves/ed25519Bip32HdTree.js +0 -85
- package/dist/src/curves/index.d.ts +0 -8
- package/dist/src/curves/index.d.ts.map +0 -1
- package/dist/src/curves/index.js +0 -20
- package/dist/src/curves/secp256k1.d.ts +0 -19
- package/dist/src/curves/secp256k1.d.ts.map +0 -1
- package/dist/src/curves/secp256k1.js +0 -77
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts +0 -8
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +0 -1
- package/dist/src/curves/secp256k1Bip32HdTree.js +0 -54
- package/dist/src/curves/types.d.ts +0 -36
- package/dist/src/curves/types.d.ts.map +0 -1
- package/dist/src/curves/types.js +0 -3
- package/dist/src/curves/util.d.ts +0 -2
- package/dist/src/curves/util.d.ts.map +0 -1
- package/dist/src/curves/util.js +0 -11
- package/dist/src/hashCommitment.d.ts +0 -17
- package/dist/src/hashCommitment.d.ts.map +0 -1
- package/dist/src/hashCommitment.js +0 -45
- package/dist/src/index.d.ts +0 -9
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -34
- package/dist/src/openssl/index.d.ts +0 -2
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -14
- package/dist/src/openssl/openssl.d.ts +0 -9
- package/dist/src/openssl/openssl.d.ts.map +0 -1
- package/dist/src/openssl/openssl.js +0 -45
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
- package/dist/src/schnorrProof.d.ts +0 -22
- package/dist/src/schnorrProof.d.ts.map +0 -1
- package/dist/src/schnorrProof.js +0 -62
- package/dist/src/shamir/index.d.ts +0 -3
- package/dist/src/shamir/index.d.ts.map +0 -1
- package/dist/src/shamir/index.js +0 -15
- package/dist/src/shamir/shamir.d.ts +0 -38
- package/dist/src/shamir/shamir.d.ts.map +0 -1
- package/dist/src/shamir/shamir.js +0 -136
- package/dist/src/shamir/types.d.ts +0 -5
- package/dist/src/shamir/types.d.ts.map +0 -1
- package/dist/src/shamir/types.js +0 -3
- package/dist/src/tss/ecdsa/generatePaillierKey.d.ts +0 -6
- package/dist/src/tss/ecdsa/generatePaillierKey.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/generatePaillierKey.js +0 -52
- package/dist/src/tss/ecdsa/index.d.ts +0 -8
- package/dist/src/tss/ecdsa/index.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/index.js +0 -33
- package/dist/src/tss/ecdsa/noSmallFactorsProof.d.ts +0 -24
- package/dist/src/tss/ecdsa/noSmallFactorsProof.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/noSmallFactorsProof.js +0 -157
- package/dist/src/tss/ecdsa/paillierBlumProof.d.ts +0 -16
- package/dist/src/tss/ecdsa/paillierBlumProof.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/paillierBlumProof.js +0 -148
- package/dist/src/tss/ecdsa/paillierProof.d.ts +0 -24
- package/dist/src/tss/ecdsa/paillierProof.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/paillierProof.js +0 -86
- package/dist/src/tss/ecdsa/primes.d.ts +0 -2
- package/dist/src/tss/ecdsa/primes.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/primes.js +0 -1846
- package/dist/src/tss/ecdsa/rangeProof.d.ts +0 -80
- package/dist/src/tss/ecdsa/rangeProof.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/rangeProof.js +0 -404
- package/dist/src/tss/ecdsa/types.d.ts +0 -182
- package/dist/src/tss/ecdsa/types.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/types.js +0 -197
- package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -25
- package/dist/src/tss/ecdsa/zkVProof.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/zkVProof.js +0 -71
- package/dist/src/tss/index.d.ts +0 -2
- package/dist/src/tss/index.d.ts.map +0 -1
- package/dist/src/tss/index.js +0 -14
- package/dist/src/types.d.ts +0 -14
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -3
- package/dist/src/util.d.ts +0 -61
- package/dist/src/util.d.ts.map +0 -1
- package/dist/src/util.js +0 -208
package/dist/src/util.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAInE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB5E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU9E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,MAAM,CAQvE"}
|
package/dist/src/util.js
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getDerivationPath = exports.randomBigInt = exports.randomPositiveCoPrimeLessThan = exports.randomPositiveCoPrimeTo = exports.getPaillierPublicKey = exports.clamp = exports.bigIntFromU8ABE = exports.bigIntFromBufferBE = exports.bigIntToBufferBE = exports.bigIntFromBufferLE = exports.bigIntToBufferLE = exports.signedBigIntToHex = exports.bigIntToHex = exports.hexToSignedBigInt = exports.hexToBigInt = exports.convertBigIntArrToHexArr = exports.convertHexArrToBigIntArr = void 0;
|
|
7
|
-
const paillier_bigint_1 = require("paillier-bigint");
|
|
8
|
-
const bigint_crypto_utils_1 = require("bigint-crypto-utils");
|
|
9
|
-
const bigint_mod_arith_1 = require("bigint-mod-arith");
|
|
10
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
-
/**
|
|
12
|
-
* Returns a bigint array from a hex string array
|
|
13
|
-
* @param values
|
|
14
|
-
*/
|
|
15
|
-
function convertHexArrToBigIntArr(values) {
|
|
16
|
-
return values.map((value) => {
|
|
17
|
-
return hexToBigInt(value);
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
exports.convertHexArrToBigIntArr = convertHexArrToBigIntArr;
|
|
21
|
-
/**
|
|
22
|
-
* Returns a hex string array from a bigint array
|
|
23
|
-
* @param values
|
|
24
|
-
* @param hexLength - length to pad each big int number too
|
|
25
|
-
*/
|
|
26
|
-
function convertBigIntArrToHexArr(values, hexLength) {
|
|
27
|
-
return values.map((value) => {
|
|
28
|
-
return bigIntToHex(value, hexLength);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
exports.convertBigIntArrToHexArr = convertBigIntArrToHexArr;
|
|
32
|
-
function hexToBigInt(hex) {
|
|
33
|
-
// Strangely bigint.toString(16) gives a hex string without 0x,
|
|
34
|
-
// but it won't accept the same string without 0x to convert
|
|
35
|
-
// to a bigint (BigInt(hex string)). So have to introduce this
|
|
36
|
-
// check to convert to add 0x in case if hex string
|
|
37
|
-
// doesn't have it.
|
|
38
|
-
if (hex.slice(0, 2) === '0x') {
|
|
39
|
-
return BigInt(hex);
|
|
40
|
-
}
|
|
41
|
-
return BigInt('0x' + hex);
|
|
42
|
-
}
|
|
43
|
-
exports.hexToBigInt = hexToBigInt;
|
|
44
|
-
function hexToSignedBigInt(hex) {
|
|
45
|
-
// Trim leading '0x' from string.
|
|
46
|
-
if (hex.slice(0, 2) === '0x') {
|
|
47
|
-
hex = hex.slice(2);
|
|
48
|
-
}
|
|
49
|
-
// Assume a number without a sign byte is always positive, or an unsigned number (ie zero).
|
|
50
|
-
if (hex.length <= 2) {
|
|
51
|
-
return BigInt('0x' + hex);
|
|
52
|
-
}
|
|
53
|
-
// Parse the number part of the string.
|
|
54
|
-
const num = BigInt('0x' + hex.slice(2));
|
|
55
|
-
// Interpret the first byte of the string as a sign byte.
|
|
56
|
-
// If it's non-zero, the number is negative.
|
|
57
|
-
if (parseInt(hex.slice(0, 2), 16)) {
|
|
58
|
-
return -num;
|
|
59
|
-
}
|
|
60
|
-
return num;
|
|
61
|
-
}
|
|
62
|
-
exports.hexToSignedBigInt = hexToSignedBigInt;
|
|
63
|
-
/**
|
|
64
|
-
* Returns an hex string of the given bigint
|
|
65
|
-
*
|
|
66
|
-
* @param {bigint} bigint - the bigint to be converted to hex
|
|
67
|
-
* @param hexLength
|
|
68
|
-
* @returns {string} - the hex value
|
|
69
|
-
*/
|
|
70
|
-
function bigIntToHex(bigint, hexLength) {
|
|
71
|
-
let hex = bigint.toString(16);
|
|
72
|
-
hex = '0'.slice(0, hex.length % 2) + hex;
|
|
73
|
-
if (hexLength) {
|
|
74
|
-
hex = hex.padStart(hexLength, '0');
|
|
75
|
-
}
|
|
76
|
-
return hex;
|
|
77
|
-
}
|
|
78
|
-
exports.bigIntToHex = bigIntToHex;
|
|
79
|
-
function signedBigIntToHex(bigint, hexLength) {
|
|
80
|
-
// Return zero as an unsigned string.
|
|
81
|
-
if (bigint === BigInt(0)) {
|
|
82
|
-
return '00';
|
|
83
|
-
}
|
|
84
|
-
// Store the number's sign.
|
|
85
|
-
let neg;
|
|
86
|
-
if (bigint < BigInt(0)) {
|
|
87
|
-
bigint = -bigint;
|
|
88
|
-
neg = true;
|
|
89
|
-
}
|
|
90
|
-
// Convert number to unsigned hex.
|
|
91
|
-
let hex = bigint.toString(16);
|
|
92
|
-
hex = '0'.slice(0, hex.length % 2) + hex;
|
|
93
|
-
if (hexLength) {
|
|
94
|
-
hex = hex.padStart(hexLength - 2, '0');
|
|
95
|
-
}
|
|
96
|
-
// Prefix sign byte if necessary.
|
|
97
|
-
if (neg) {
|
|
98
|
-
return '01' + hex;
|
|
99
|
-
}
|
|
100
|
-
return '00' + hex;
|
|
101
|
-
}
|
|
102
|
-
exports.signedBigIntToHex = signedBigIntToHex;
|
|
103
|
-
function bigIntToBufferLE(n, minBytes) {
|
|
104
|
-
let v = n.toString(16);
|
|
105
|
-
v = '0'.slice(0, v.length % 2) + v;
|
|
106
|
-
const buf = Buffer.from(v, 'hex').reverse();
|
|
107
|
-
if (minBytes && buf.length < minBytes) {
|
|
108
|
-
return Buffer.concat([buf, Buffer.alloc(minBytes - buf.length)]);
|
|
109
|
-
}
|
|
110
|
-
return buf;
|
|
111
|
-
}
|
|
112
|
-
exports.bigIntToBufferLE = bigIntToBufferLE;
|
|
113
|
-
function bigIntFromBufferLE(buf) {
|
|
114
|
-
return BigInt('0x' + Buffer.from(buf).reverse().toString('hex'));
|
|
115
|
-
}
|
|
116
|
-
exports.bigIntFromBufferLE = bigIntFromBufferLE;
|
|
117
|
-
function bigIntToBufferBE(n, minBytes) {
|
|
118
|
-
let v = n.toString(16);
|
|
119
|
-
v = '0'.slice(0, v.length % 2) + v;
|
|
120
|
-
const buf = Buffer.from(v, 'hex');
|
|
121
|
-
if (minBytes && buf.length < minBytes) {
|
|
122
|
-
return Buffer.concat([Buffer.alloc(minBytes - buf.length), buf]);
|
|
123
|
-
}
|
|
124
|
-
return buf;
|
|
125
|
-
}
|
|
126
|
-
exports.bigIntToBufferBE = bigIntToBufferBE;
|
|
127
|
-
function bigIntFromBufferBE(buf) {
|
|
128
|
-
return BigInt('0x' + buf.toString('hex'));
|
|
129
|
-
}
|
|
130
|
-
exports.bigIntFromBufferBE = bigIntFromBufferBE;
|
|
131
|
-
function bigIntFromU8ABE(buf) {
|
|
132
|
-
return bigIntFromBufferBE(Buffer.from(buf));
|
|
133
|
-
}
|
|
134
|
-
exports.bigIntFromU8ABE = bigIntFromU8ABE;
|
|
135
|
-
function clamp(u) {
|
|
136
|
-
u &= BigInt('0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8');
|
|
137
|
-
u |= BigInt('0x4000000000000000000000000000000000000000000000000000000000000000');
|
|
138
|
-
return u;
|
|
139
|
-
}
|
|
140
|
-
exports.clamp = clamp;
|
|
141
|
-
/**
|
|
142
|
-
* Function get paillier public key simple varient
|
|
143
|
-
* @param {bigint} n
|
|
144
|
-
* @returns {bigint}
|
|
145
|
-
*/
|
|
146
|
-
function getPaillierPublicKey(n) {
|
|
147
|
-
return new paillier_bigint_1.PublicKey(n, n + BigInt(1));
|
|
148
|
-
}
|
|
149
|
-
exports.getPaillierPublicKey = getPaillierPublicKey;
|
|
150
|
-
/**
|
|
151
|
-
* Generate a random positive integer co-prime to x
|
|
152
|
-
* @param x
|
|
153
|
-
* @returns {Promise<bigint>}
|
|
154
|
-
*/
|
|
155
|
-
async function randomPositiveCoPrimeTo(x) {
|
|
156
|
-
while (true) {
|
|
157
|
-
const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
|
|
158
|
-
if (y > BigInt(0) && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
|
|
159
|
-
return y;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
exports.randomPositiveCoPrimeTo = randomPositiveCoPrimeTo;
|
|
164
|
-
/**
|
|
165
|
-
* Generate a random positive integer coprime less than x with the same bit depth.
|
|
166
|
-
* @param x
|
|
167
|
-
* @returns {Promise<bigint>}
|
|
168
|
-
*/
|
|
169
|
-
async function randomPositiveCoPrimeLessThan(x) {
|
|
170
|
-
if (x <= BigInt(2)) {
|
|
171
|
-
throw new Error('x must be larger than 2');
|
|
172
|
-
}
|
|
173
|
-
while (true) {
|
|
174
|
-
const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
|
|
175
|
-
if (y > BigInt(0) && y < x && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
|
|
176
|
-
return y;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
exports.randomPositiveCoPrimeLessThan = randomPositiveCoPrimeLessThan;
|
|
181
|
-
/**
|
|
182
|
-
* Generate a random number of a given bitlength
|
|
183
|
-
* @param bitlength
|
|
184
|
-
* @returns {Promise<bigint>}
|
|
185
|
-
*/
|
|
186
|
-
async function randomBigInt(bitlength) {
|
|
187
|
-
return bigIntFromBufferBE(Buffer.from(await bigint_crypto_utils_1.randBits(bitlength, true)));
|
|
188
|
-
}
|
|
189
|
-
exports.randomBigInt = randomBigInt;
|
|
190
|
-
/**
|
|
191
|
-
* @param seed - used to construct derivation path deterministically
|
|
192
|
-
* @param isMaster - if set, path starts with prefix `m/`
|
|
193
|
-
* @return path `(m/)/999999/a/b` where `a` and `b` are 7-byte pseudorandom numbers based on seed
|
|
194
|
-
*/
|
|
195
|
-
function getDerivationPath(seed, isMaster = true) {
|
|
196
|
-
const derivationPathInput = sha256(sha256(`${seed}`)).toString('hex');
|
|
197
|
-
const derivationPathParts = [
|
|
198
|
-
parseInt(derivationPathInput.slice(0, 7), 16),
|
|
199
|
-
parseInt(derivationPathInput.slice(7, 14), 16),
|
|
200
|
-
];
|
|
201
|
-
const prefix = isMaster ? 'm/' : '';
|
|
202
|
-
return prefix + '999999/' + derivationPathParts.join('/');
|
|
203
|
-
}
|
|
204
|
-
exports.getDerivationPath = getDerivationPath;
|
|
205
|
-
function sha256(input) {
|
|
206
|
-
return crypto_1.default.createHash('sha256').update(input).digest();
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUE0QztBQUM1Qyw2REFBMEQ7QUFDMUQsdURBQXVDO0FBQ3ZDLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMxQixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQixFQUFFLFNBQWtCO0lBQzNFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzFCLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLCtEQUErRDtJQUMvRCw0REFBNEQ7SUFDNUQsOERBQThEO0lBQzlELG1EQUFtRDtJQUNuRCxtQkFBbUI7SUFDbkIsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQVZELGtDQVVDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxpQ0FBaUM7SUFDakMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUIs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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0IHsgYml0TGVuZ3RoLCByYW5kQml0cyB9IGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgZ2NkIH0gZnJvbSAnYmlnaW50LW1vZC1hcml0aCc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbi8qKlxuICogUmV0dXJucyBhIGJpZ2ludCBhcnJheSBmcm9tIGEgaGV4IHN0cmluZyBhcnJheVxuICogQHBhcmFtIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEhleEFyclRvQmlnSW50QXJyKHZhbHVlczogc3RyaW5nW10pOiBiaWdpbnRbXSB7XG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiBoZXhUb0JpZ0ludCh2YWx1ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBoZXggc3RyaW5nIGFycmF5IGZyb20gYSBiaWdpbnQgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqIEBwYXJhbSBoZXhMZW5ndGggLSBsZW5ndGggdG8gcGFkIGVhY2ggYmlnIGludCBudW1iZXIgdG9vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIodmFsdWVzOiBiaWdpbnRbXSwgaGV4TGVuZ3RoPzogbnVtYmVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gYmlnSW50VG9IZXgodmFsdWUsIGhleExlbmd0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9CaWdJbnQoaGV4OiBzdHJpbmcpOiBiaWdpbnQge1xuICAvLyBTdHJhbmdlbHkgYmlnaW50LnRvU3RyaW5nKDE2KSBnaXZlcyBhIGhleCBzdHJpbmcgd2l0aG91dCAweCxcbiAgLy8gYnV0IGl0IHdvbid0IGFjY2VwdCB0aGUgc2FtZSBzdHJpbmcgd2l0aG91dCAweCB0byBjb252ZXJ0XG4gIC8vIHRvIGEgYmlnaW50IChCaWdJbnQoaGV4IHN0cmluZykpLiBTbyBoYXZlIHRvIGludHJvZHVjZSB0aGlzXG4gIC8vIGNoZWNrIHRvIGNvbnZlcnQgdG8gYWRkIDB4IGluIGNhc2UgaWYgaGV4IHN0cmluZ1xuICAvLyBkb2Vzbid0IGhhdmUgaXQuXG4gIGlmIChoZXguc2xpY2UoMCwgMikgPT09ICcweCcpIHtcbiAgICByZXR1cm4gQmlnSW50KGhleCk7XG4gIH1cbiAgcmV0dXJuIEJpZ0ludCgnMHgnICsgaGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvU2lnbmVkQmlnSW50KGhleDogc3RyaW5nKTogYmlnaW50IHtcbiAgLy8gVHJpbSBsZWFkaW5nICcweCcgZnJvbSBzdHJpbmcuXG4gIGlmIChoZXguc2xpY2UoMCwgMikgPT09ICcweCcpIHtcbiAgICBoZXggPSBoZXguc2xpY2UoMik7XG4gIH1cbiAgLy8gQXNzdW1lIGEgbnVtYmVyIHdpdGhvdXQgYSBzaWduIGJ5dGUgaXMgYWx3YXlzIHBvc2l0aXZlLCBvciBhbiB1bnNpZ25lZCBudW1iZXIgKGllIHplcm8pLlxuICBpZiAoaGV4Lmxlbmd0aCA8PSAyKSB7XG4gICAgcmV0dXJuIEJpZ0ludCgnMHgnICsgaGV4KTtcbiAgfVxuICAvLyBQYXJzZSB0aGUgbnVtYmVyIHBhcnQgb2YgdGhlIHN0cmluZy5cbiAgY29uc3QgbnVtID0gQmlnSW50KCcweCcgKyBoZXguc2xpY2UoMikpO1xuICAvLyBJbnRlcnByZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmluZyBhcyBhIHNpZ24gYnl0ZS5cbiAgLy8gSWYgaXQncyBub24temVybywgdGhlIG51bWJlciBpcyBuZWdhdGl2ZS5cbiAgaWYgKHBhcnNlSW50KGhleC5zbGljZSgwLCAyKSwgMTYpKSB7XG4gICAgcmV0dXJuIC1udW07XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGhleCBzdHJpbmcgb2YgdGhlIGdpdmVuIGJpZ2ludFxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBiaWdpbnQgLSB0aGUgYmlnaW50IHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAqIEBwYXJhbSBoZXhMZW5ndGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50VG9IZXgoYmlnaW50OiBiaWdpbnQsIGhleExlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCBoZXggPSBiaWdpbnQudG9TdHJpbmcoMTYpO1xuICBoZXggPSAnMCcuc2xpY2UoMCwgaGV4Lmxlbmd0aCAlIDIpICsgaGV4O1xuICBpZiAoaGV4TGVuZ3RoKSB7XG4gICAgaGV4ID0gaGV4LnBhZFN0YXJ0KGhleExlbmd0aCwgJzAnKTtcbiAgfVxuICByZXR1cm4gaGV4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkQmlnSW50VG9IZXgoYmlnaW50OiBiaWdpbnQsIGhleExlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIC8vIFJldHVybiB6ZXJvIGFzIGFuIHVuc2lnbmVkIHN0cmluZy5cbiAgaWYgKGJpZ2ludCA9PT0gQmlnSW50KDApKSB7XG4gICAgcmV0dXJuICcwMCc7XG4gIH1cbiAgLy8gU3RvcmUgdGhlIG51bWJlcidzIHNpZ24uXG4gIGxldCBuZWc7XG4gIGlmIChiaWdpbnQgPCBCaWdJbnQoMCkpIHtcbiAgICBiaWdpbnQgPSAtYmlnaW50O1xuICAgIG5lZyA9IHRydWU7XG4gIH1cbiAgLy8gQ29udmVydCBudW1iZXIgdG8gdW5zaWduZWQgaGV4LlxuICBsZXQgaGV4ID0gYmlnaW50LnRvU3RyaW5nKDE2KTtcbiAgaGV4ID0gJzAnLnNsaWNlKDAsIGhleC5sZW5ndGggJSAyKSArIGhleDtcbiAgaWYgKGhleExlbmd0aCkge1xuICAgIGhleCA9IGhleC5wYWRTdGFydChoZXhMZW5ndGggLSAyLCAnMCcpO1xuICB9XG4gIC8vIFByZWZpeCBzaWduIGJ5dGUgaWYgbmVjZXNzYXJ5LlxuICBpZiAobmVnKSB7XG4gICAgcmV0dXJuICcwMScgKyBoZXg7XG4gIH1cbiAgcmV0dXJuICcwMCcgKyBoZXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaWdJbnRUb0J1ZmZlckxFKG46IGJpZ2ludCwgbWluQnl0ZXM/OiBudW1iZXIpOiBCdWZmZXIge1xuICBsZXQgdiA9IG4udG9TdHJpbmcoMTYpO1xuICB2ID0gJzAnLnNsaWNlKDAsIHYubGVuZ3RoICUgMikgKyB2O1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbSh2LCAnaGV4JykucmV2ZXJzZSgpO1xuICBpZiAobWluQnl0ZXMgJiYgYnVmLmxlbmd0aCA8IG1pbkJ5dGVzKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZiwgQnVmZmVyLmFsbG9jKG1pbkJ5dGVzIC0gYnVmLmxlbmd0aCldKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50RnJvbUJ1ZmZlckxFKGJ1ZjogQnVmZmVyKTogYmlnaW50IHtcbiAgcmV0dXJuIEJpZ0ludCgnMHgnICsgQnVmZmVyLmZyb20oYnVmKS5yZXZlcnNlKCkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludFRvQnVmZmVyQkUobjogYmlnaW50LCBtaW5CeXRlcz86IG51bWJlcik6IEJ1ZmZlciB7XG4gIGxldCB2ID0gbi50b1N0cmluZygxNik7XG4gIHYgPSAnMCcuc2xpY2UoMCwgdi5sZW5ndGggJSAyKSArIHY7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHYsICdoZXgnKTtcbiAgaWYgKG1pbkJ5dGVzICYmIGJ1Zi5sZW5ndGggPCBtaW5CeXRlcykge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIuYWxsb2MobWluQnl0ZXMgLSBidWYubGVuZ3RoKSwgYnVmXSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludEZyb21CdWZmZXJCRShidWY6IEJ1ZmZlcik6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoJzB4JyArIGJ1Zi50b1N0cmluZygnaGV4JykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50RnJvbVU4QUJFKGJ1ZjogVWludDhBcnJheSk6IGJpZ2ludCB7XG4gIHJldHVybiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oYnVmKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh1OiBiaWdpbnQpOiBiaWdpbnQge1xuICB1ICY9IEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4Jyk7XG4gIHUgfD0gQmlnSW50KCcweDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgcmV0dXJuIHU7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gZ2V0IHBhaWxsaWVyIHB1YmxpYyBrZXkgc2ltcGxlIHZhcmllbnRcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFpbGxpZXJQdWJsaWNLZXkobjogYmlnaW50KTogUHVibGljS2V5IHtcbiAgcmV0dXJuIG5ldyBQdWJsaWNLZXkobiwgbiArIEJpZ0ludCgxKSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gcG9zaXRpdmUgaW50ZWdlciBjby1wcmltZSB0byB4XG4gKiBAcGFyYW0geFxuICogQHJldHVybnMge1Byb21pc2U8YmlnaW50Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHg6IGJpZ2ludCk6IFByb21pc2U8YmlnaW50PiB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeSA9IGF3YWl0IHJhbmRvbUJpZ0ludChiaXRMZW5ndGgoeCkpO1xuICAgIGlmICh5ID4gQmlnSW50KDApICYmIGdjZCh4LCB5KSA9PT0gQmlnSW50KDEpKSB7XG4gICAgICByZXR1cm4geTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBwb3NpdGl2ZSBpbnRlZ2VyIGNvcHJpbWUgbGVzcyB0aGFuIHggd2l0aCB0aGUgc2FtZSBiaXQgZGVwdGguXG4gKiBAcGFyYW0geFxuICogQHJldHVybnMge1Byb21pc2U8YmlnaW50Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmRvbVBvc2l0aXZlQ29QcmltZUxlc3NUaGFuKHg6IGJpZ2ludCk6IFByb21pc2U8YmlnaW50PiB7XG4gIGlmICh4IDw9IEJpZ0ludCgyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigneCBtdXN0IGJlIGxhcmdlciB0aGFuIDInKTtcbiAgfVxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHkgPSBhd2FpdCByYW5kb21CaWdJbnQoYml0TGVuZ3RoKHgpKTtcbiAgICBpZiAoeSA+IEJpZ0ludCgwKSAmJiB5IDwgeCAmJiBnY2QoeCwgeSkgPT09IEJpZ0ludCgxKSkge1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIG9mIGEgZ2l2ZW4gYml0bGVuZ3RoXG4gKiBAcGFyYW0gYml0bGVuZ3RoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxiaWdpbnQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFuZG9tQmlnSW50KGJpdGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgcmV0dXJuIGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShhd2FpdCByYW5kQml0cyhiaXRsZW5ndGgsIHRydWUpKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHNlZWQgLSB1c2VkIHRvIGNvbnN0cnVjdCBkZXJpdmF0aW9uIHBhdGggZGV0ZXJtaW5pc3RpY2FsbHlcbiAqIEBwYXJhbSBpc01hc3RlciAtIGlmIHNldCwgcGF0aCBzdGFydHMgd2l0aCBwcmVmaXggYG0vYFxuICogQHJldHVybiBwYXRoIGAobS8pLzk5OTk5OS9hL2JgIHdoZXJlIGBhYCBhbmQgYGJgIGFyZSA3LWJ5dGUgcHNldWRvcmFuZG9tIG51bWJlcnMgYmFzZWQgb24gc2VlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVyaXZhdGlvblBhdGgoc2VlZDogc3RyaW5nLCBpc01hc3RlciA9IHRydWUpOiBzdHJpbmcge1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aElucHV0ID0gc2hhMjU2KHNoYTI1NihgJHtzZWVkfWApKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoUGFydHMgPSBbXG4gICAgcGFyc2VJbnQoZGVyaXZhdGlvblBhdGhJbnB1dC5zbGljZSgwLCA3KSwgMTYpLFxuICAgIHBhcnNlSW50KGRlcml2YXRpb25QYXRoSW5wdXQuc2xpY2UoNywgMTQpLCAxNiksXG4gIF07XG4gIGNvbnN0IHByZWZpeCA9IGlzTWFzdGVyID8gJ20vJyA6ICcnO1xuICByZXR1cm4gcHJlZml4ICsgJzk5OTk5OS8nICsgZGVyaXZhdGlvblBhdGhQYXJ0cy5qb2luKCcvJyk7XG59XG5cbmZ1bmN0aW9uIHNoYTI1NihpbnB1dDogY3J5cHRvLkJpbmFyeUxpa2UpOiBCdWZmZXIge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShpbnB1dCkuZGlnZXN0KCk7XG59XG4iXX0=
|