@bitgo-beta/sdk-lib-mpc 8.2.0-beta.1 → 8.2.0-beta.100
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 +83 -0
- package/dist/src/curves/constant.d.ts +2 -0
- package/dist/src/curves/constant.d.ts.map +1 -0
- package/dist/src/curves/constant.js +6 -0
- package/dist/src/curves/{baseCurve.d.ts → ed25519.d.ts} +7 -7
- package/dist/src/curves/ed25519.d.ts.map +1 -0
- package/dist/src/curves/ed25519.js +66 -0
- package/dist/src/curves/ed25519Bip32HdTree.d.ts +10 -0
- package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +1 -0
- package/dist/src/curves/ed25519Bip32HdTree.js +85 -0
- package/dist/src/curves/index.d.ts +6 -1
- package/dist/src/curves/index.d.ts.map +1 -1
- package/dist/src/curves/index.js +7 -2
- package/dist/src/curves/secp256k1.d.ts +1 -1
- package/dist/src/curves/secp256k1.d.ts.map +1 -1
- package/dist/src/curves/secp256k1.js +1 -1
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts +8 -0
- package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +1 -0
- package/dist/src/curves/secp256k1Bip32HdTree.js +54 -0
- package/dist/src/curves/types.d.ts +34 -0
- package/dist/src/curves/types.d.ts.map +1 -0
- package/dist/src/curves/types.js +3 -0
- package/dist/src/curves/util.d.ts +2 -0
- package/dist/src/curves/util.d.ts.map +1 -0
- package/dist/src/curves/util.js +11 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/shamir/index.d.ts +3 -0
- package/dist/src/shamir/index.d.ts.map +1 -0
- package/dist/src/shamir/index.js +15 -0
- package/dist/src/shamir/shamir.d.ts +38 -0
- package/dist/src/shamir/shamir.d.ts.map +1 -0
- package/dist/src/shamir/shamir.js +136 -0
- package/dist/src/shamir/types.d.ts +5 -0
- package/dist/src/shamir/types.d.ts.map +1 -0
- package/dist/src/shamir/types.js +3 -0
- package/dist/src/tss/ecdsa/index.d.ts +2 -0
- package/dist/src/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/index.js +4 -2
- package/dist/src/tss/ecdsa/paillierproof.d.ts +24 -0
- package/dist/src/tss/ecdsa/paillierproof.d.ts.map +1 -0
- package/dist/src/tss/ecdsa/paillierproof.js +86 -0
- package/dist/src/tss/ecdsa/primes.d.ts +2 -0
- package/dist/src/tss/ecdsa/primes.d.ts.map +1 -0
- package/dist/src/tss/ecdsa/primes.js +1846 -0
- package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -1
- package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/rangeproof.js +24 -23
- package/dist/src/tss/ecdsa/types.d.ts +66 -13
- package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/types.js +76 -14
- package/dist/src/util.d.ts +19 -4
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +50 -8
- package/dist/tsconfig.tsbuildinfo +1 -3621
- package/package.json +4 -4
- package/dist/src/curves/baseCurve.d.ts.map +0 -1
- package/dist/src/curves/baseCurve.js +0 -6
package/dist/src/util.d.ts
CHANGED
|
@@ -8,8 +8,9 @@ export declare function convertHexArrToBigIntArr(values: string[]): bigint[];
|
|
|
8
8
|
/**
|
|
9
9
|
* Returns a hex string array from a bigint array
|
|
10
10
|
* @param values
|
|
11
|
+
* @param hexLength - length to pad each big int number too
|
|
11
12
|
*/
|
|
12
|
-
export declare function convertBigIntArrToHexArr(values: bigint[]): string[];
|
|
13
|
+
export declare function convertBigIntArrToHexArr(values: bigint[], hexLength?: number): string[];
|
|
13
14
|
export declare function hexToBigInt(hex: string): bigint;
|
|
14
15
|
/**
|
|
15
16
|
* Returns an hex string of the given bigint
|
|
@@ -26,19 +27,33 @@ export declare function bigIntFromBufferBE(buf: Buffer): bigint;
|
|
|
26
27
|
export declare function bigIntFromU8ABE(buf: Uint8Array): bigint;
|
|
27
28
|
export declare function clamp(u: bigint): bigint;
|
|
28
29
|
/**
|
|
29
|
-
* Function get
|
|
30
|
+
* Function get paillier public key simple varient
|
|
30
31
|
* @param {bigint} n
|
|
31
32
|
* @returns {bigint}
|
|
32
33
|
*/
|
|
33
34
|
export declare function getPaillierPublicKey(n: bigint): PublicKey;
|
|
34
35
|
/**
|
|
35
|
-
* Generate a random
|
|
36
|
+
* Generate a random positive integer co-prime to x
|
|
36
37
|
* @param x
|
|
38
|
+
* @returns {Promise<bigint>}
|
|
37
39
|
*/
|
|
38
|
-
export declare function
|
|
40
|
+
export declare function randomPositiveCoPrimeTo(x: bigint): Promise<bigint>;
|
|
41
|
+
/**
|
|
42
|
+
* Generate a random positive integer coprime less than x with the same bit depth.
|
|
43
|
+
* @param x
|
|
44
|
+
* @returns {Promise<bigint>}
|
|
45
|
+
*/
|
|
46
|
+
export declare function randomPositiveCoPrimeLessThan(x: bigint): Promise<bigint>;
|
|
39
47
|
/**
|
|
40
48
|
* Generate a random number of a given bitlength
|
|
41
49
|
* @param bitlength
|
|
50
|
+
* @returns {Promise<bigint>}
|
|
42
51
|
*/
|
|
43
52
|
export declare function randomBigInt(bitlength: number): Promise<bigint>;
|
|
53
|
+
/**
|
|
54
|
+
* @param seed - used to construct derivation path deterministically
|
|
55
|
+
* @param isMaster - if set, path starts with prefix `m/`
|
|
56
|
+
* @return path `(m/)/999999/a/b` where `a` and `b` are 7-byte pseudorandom numbers based on seed
|
|
57
|
+
*/
|
|
58
|
+
export declare function getDerivationPath(seed: string, isMaster?: boolean): string;
|
|
44
59
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/src/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
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;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlE;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
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.randomBigInt = exports.
|
|
6
|
+
exports.getDerivationPath = exports.randomBigInt = exports.randomPositiveCoPrimeLessThan = exports.randomPositiveCoPrimeTo = exports.getPaillierPublicKey = exports.clamp = exports.bigIntFromU8ABE = exports.bigIntFromBufferBE = exports.bigIntToBufferBE = exports.bigIntFromBufferLE = exports.bigIntToBufferLE = exports.bigIntToHex = exports.hexToBigInt = exports.convertBigIntArrToHexArr = exports.convertHexArrToBigIntArr = void 0;
|
|
4
7
|
const paillier_bigint_1 = require("paillier-bigint");
|
|
5
8
|
const bigint_crypto_utils_1 = require("bigint-crypto-utils");
|
|
6
9
|
const bigint_mod_arith_1 = require("bigint-mod-arith");
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
7
11
|
/**
|
|
8
12
|
* Returns a bigint array from a hex string array
|
|
9
13
|
* @param values
|
|
@@ -17,10 +21,11 @@ exports.convertHexArrToBigIntArr = convertHexArrToBigIntArr;
|
|
|
17
21
|
/**
|
|
18
22
|
* Returns a hex string array from a bigint array
|
|
19
23
|
* @param values
|
|
24
|
+
* @param hexLength - length to pad each big int number too
|
|
20
25
|
*/
|
|
21
|
-
function convertBigIntArrToHexArr(values) {
|
|
26
|
+
function convertBigIntArrToHexArr(values, hexLength) {
|
|
22
27
|
return values.map((value) => {
|
|
23
|
-
return bigIntToHex(value);
|
|
28
|
+
return bigIntToHex(value, hexLength);
|
|
24
29
|
});
|
|
25
30
|
}
|
|
26
31
|
exports.convertBigIntArrToHexArr = convertBigIntArrToHexArr;
|
|
@@ -91,7 +96,7 @@ function clamp(u) {
|
|
|
91
96
|
}
|
|
92
97
|
exports.clamp = clamp;
|
|
93
98
|
/**
|
|
94
|
-
* Function get
|
|
99
|
+
* Function get paillier public key simple varient
|
|
95
100
|
* @param {bigint} n
|
|
96
101
|
* @returns {bigint}
|
|
97
102
|
*/
|
|
@@ -100,10 +105,11 @@ function getPaillierPublicKey(n) {
|
|
|
100
105
|
}
|
|
101
106
|
exports.getPaillierPublicKey = getPaillierPublicKey;
|
|
102
107
|
/**
|
|
103
|
-
* Generate a random
|
|
108
|
+
* Generate a random positive integer co-prime to x
|
|
104
109
|
* @param x
|
|
110
|
+
* @returns {Promise<bigint>}
|
|
105
111
|
*/
|
|
106
|
-
async function
|
|
112
|
+
async function randomPositiveCoPrimeTo(x) {
|
|
107
113
|
while (true) {
|
|
108
114
|
const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
|
|
109
115
|
if (y > BigInt(0) && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
|
|
@@ -111,13 +117,49 @@ async function randomCoPrimeTo(x) {
|
|
|
111
117
|
}
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
|
-
exports.
|
|
120
|
+
exports.randomPositiveCoPrimeTo = randomPositiveCoPrimeTo;
|
|
121
|
+
/**
|
|
122
|
+
* Generate a random positive integer coprime less than x with the same bit depth.
|
|
123
|
+
* @param x
|
|
124
|
+
* @returns {Promise<bigint>}
|
|
125
|
+
*/
|
|
126
|
+
async function randomPositiveCoPrimeLessThan(x) {
|
|
127
|
+
if (x <= BigInt(2)) {
|
|
128
|
+
throw new Error('x must be larger than 2');
|
|
129
|
+
}
|
|
130
|
+
while (true) {
|
|
131
|
+
const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
|
|
132
|
+
if (y > BigInt(0) && y < x && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
|
|
133
|
+
return y;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.randomPositiveCoPrimeLessThan = randomPositiveCoPrimeLessThan;
|
|
115
138
|
/**
|
|
116
139
|
* Generate a random number of a given bitlength
|
|
117
140
|
* @param bitlength
|
|
141
|
+
* @returns {Promise<bigint>}
|
|
118
142
|
*/
|
|
119
143
|
async function randomBigInt(bitlength) {
|
|
120
144
|
return bigIntFromBufferBE(Buffer.from(await bigint_crypto_utils_1.randBits(bitlength, true)));
|
|
121
145
|
}
|
|
122
146
|
exports.randomBigInt = randomBigInt;
|
|
123
|
-
|
|
147
|
+
/**
|
|
148
|
+
* @param seed - used to construct derivation path deterministically
|
|
149
|
+
* @param isMaster - if set, path starts with prefix `m/`
|
|
150
|
+
* @return path `(m/)/999999/a/b` where `a` and `b` are 7-byte pseudorandom numbers based on seed
|
|
151
|
+
*/
|
|
152
|
+
function getDerivationPath(seed, isMaster = true) {
|
|
153
|
+
const derivationPathInput = sha256(sha256(`${seed}`)).toString('hex');
|
|
154
|
+
const derivationPathParts = [
|
|
155
|
+
parseInt(derivationPathInput.slice(0, 7), 16),
|
|
156
|
+
parseInt(derivationPathInput.slice(7, 14), 16),
|
|
157
|
+
];
|
|
158
|
+
const prefix = isMaster ? 'm/' : '';
|
|
159
|
+
return prefix + '999999/' + derivationPathParts.join('/');
|
|
160
|
+
}
|
|
161
|
+
exports.getDerivationPath = getDerivationPath;
|
|
162
|
+
function sha256(input) {
|
|
163
|
+
return crypto_1.default.createHash('sha256').update(input).digest();
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUE0QztBQUM1Qyw2REFBMEQ7QUFDMUQsdURBQXVDO0FBQ3ZDLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMxQixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQixFQUFFLFNBQWtCO0lBQzNFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzFCLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLCtEQUErRDtJQUMvRCw0REFBNEQ7SUFDNUQsOERBQThEO0lBQzlELG1EQUFtRDtJQUNuRCxtQkFBbUI7SUFDbkIsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQVZELGtDQVVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLE1BQWMsRUFBRSxTQUFrQjtJQUM1RCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlC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R0FJRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLElBQVksRUFBRSxRQUFRLEdBQUcsSUFBSTtJQUM3RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQUc7UUFDMUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUMvQyxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwQyxPQUFPLE1BQU0sR0FBRyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFSRCw4Q0FRQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQXdCO0lBQ3RDLE9BQU8sZ0JBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0IHsgYml0TGVuZ3RoLCByYW5kQml0cyB9IGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgZ2NkIH0gZnJvbSAnYmlnaW50LW1vZC1hcml0aCc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbi8qKlxuICogUmV0dXJucyBhIGJpZ2ludCBhcnJheSBmcm9tIGEgaGV4IHN0cmluZyBhcnJheVxuICogQHBhcmFtIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEhleEFyclRvQmlnSW50QXJyKHZhbHVlczogc3RyaW5nW10pOiBiaWdpbnRbXSB7XG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiBoZXhUb0JpZ0ludCh2YWx1ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBoZXggc3RyaW5nIGFycmF5IGZyb20gYSBiaWdpbnQgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqIEBwYXJhbSBoZXhMZW5ndGggLSBsZW5ndGggdG8gcGFkIGVhY2ggYmlnIGludCBudW1iZXIgdG9vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIodmFsdWVzOiBiaWdpbnRbXSwgaGV4TGVuZ3RoPzogbnVtYmVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gYmlnSW50VG9IZXgodmFsdWUsIGhleExlbmd0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9CaWdJbnQoaGV4OiBzdHJpbmcpOiBiaWdpbnQge1xuICAvLyBTdHJhbmdlbHkgYmlnaW50LnRvU3RyaW5nKDE2KSBnaXZlcyBhIGhleCBzdHJpbmcgd2l0aG91dCAweCxcbiAgLy8gYnV0IGl0IHdvbid0IGFjY2VwdCB0aGUgc2FtZSBzdHJpbmcgd2l0aG91dCAweCB0byBjb252ZXJ0XG4gIC8vIHRvIGEgYmlnaW50IChCaWdJbnQoaGV4IHN0cmluZykpLiBTbyBoYXZlIHRvIGludHJvZHVjZSB0aGlzXG4gIC8vIGNoZWNrIHRvIGNvbnZlcnQgdG8gYWRkIDB4IGluIGNhc2UgaWYgaGV4IHN0cmluZ1xuICAvLyBkb2Vzbid0IGhhdmUgaXQuXG4gIGlmIChoZXguc2xpY2UoMCwgMikgPT09ICcweCcpIHtcbiAgICByZXR1cm4gQmlnSW50KGhleCk7XG4gIH1cbiAgcmV0dXJuIEJpZ0ludCgnMHgnICsgaGV4KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGhleCBzdHJpbmcgb2YgdGhlIGdpdmVuIGJpZ2ludFxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBiaWdpbnQgLSB0aGUgYmlnaW50IHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAqIEBwYXJhbSBoZXhMZW5ndGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50VG9IZXgoYmlnaW50OiBiaWdpbnQsIGhleExlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCBoZXggPSBiaWdpbnQudG9TdHJpbmcoMTYpO1xuICBoZXggPSAnMCcuc2xpY2UoMCwgaGV4Lmxlbmd0aCAlIDIpICsgaGV4O1xuICBpZiAoaGV4TGVuZ3RoKSB7XG4gICAgaGV4ID0gaGV4LnBhZFN0YXJ0KGhleExlbmd0aCwgJzAnKTtcbiAgfVxuICByZXR1cm4gaGV4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50VG9CdWZmZXJMRShuOiBiaWdpbnQsIGJ5dGVzPzogbnVtYmVyKTogQnVmZmVyIHtcbiAgbGV0IHYgPSBuLnRvU3RyaW5nKDE2KTtcbiAgdiA9ICcwJy5zbGljZSgwLCB2Lmxlbmd0aCAlIDIpICsgdjtcbiAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20odiwgJ2hleCcpLnJldmVyc2UoKTtcbiAgaWYgKGJ5dGVzICYmIGJ1Zi5sZW5ndGggPCBieXRlcykge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtidWYsIEJ1ZmZlci5hbGxvYyhieXRlcyAtIGJ1Zi5sZW5ndGgpXSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludEZyb21CdWZmZXJMRShidWY6IEJ1ZmZlcik6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoJzB4JyArIEJ1ZmZlci5mcm9tKGJ1ZikucmV2ZXJzZSgpLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaWdJbnRUb0J1ZmZlckJFKG46IGJpZ2ludCwgYnl0ZXM/OiBudW1iZXIpOiBCdWZmZXIge1xuICBsZXQgdiA9IG4udG9TdHJpbmcoMTYpO1xuICB2ID0gJzAnLnNsaWNlKDAsIHYubGVuZ3RoICUgMikgKyB2O1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbSh2LCAnaGV4Jyk7XG4gIGlmIChieXRlcyAmJiBidWYubGVuZ3RoIDwgYnl0ZXMpIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmFsbG9jKGJ5dGVzIC0gYnVmLmxlbmd0aCksIGJ1Zl0pO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaWdJbnRGcm9tQnVmZmVyQkUoYnVmOiBCdWZmZXIpOiBiaWdpbnQge1xuICByZXR1cm4gQmlnSW50KCcweCcgKyBidWYudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludEZyb21VOEFCRShidWY6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICByZXR1cm4gYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGJ1ZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodTogYmlnaW50KTogYmlnaW50IHtcbiAgdSAmPSBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmOCcpO1xuICB1IHw9IEJpZ0ludCgnMHg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gIHJldHVybiB1O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGdldCBwYWlsbGllciBwdWJsaWMga2V5IHNpbXBsZSB2YXJpZW50XG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhaWxsaWVyUHVibGljS2V5KG46IGJpZ2ludCk6IFB1YmxpY0tleSB7XG4gIHJldHVybiBuZXcgUHVibGljS2V5KG4sIG4gKyBCaWdJbnQoMSkpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHBvc2l0aXZlIGludGVnZXIgY28tcHJpbWUgdG8geFxuICogQHBhcmFtIHhcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJpZ2ludD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyh4OiBiaWdpbnQpOiBQcm9taXNlPGJpZ2ludD4ge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHkgPSBhd2FpdCByYW5kb21CaWdJbnQoYml0TGVuZ3RoKHgpKTtcbiAgICBpZiAoeSA+IEJpZ0ludCgwKSAmJiBnY2QoeCwgeSkgPT09IEJpZ0ludCgxKSkge1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gcG9zaXRpdmUgaW50ZWdlciBjb3ByaW1lIGxlc3MgdGhhbiB4IHdpdGggdGhlIHNhbWUgYml0IGRlcHRoLlxuICogQHBhcmFtIHhcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJpZ2ludD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5kb21Qb3NpdGl2ZUNvUHJpbWVMZXNzVGhhbih4OiBiaWdpbnQpOiBQcm9taXNlPGJpZ2ludD4ge1xuICBpZiAoeCA8PSBCaWdJbnQoMikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3ggbXVzdCBiZSBsYXJnZXIgdGhhbiAyJyk7XG4gIH1cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB5ID0gYXdhaXQgcmFuZG9tQmlnSW50KGJpdExlbmd0aCh4KSk7XG4gICAgaWYgKHkgPiBCaWdJbnQoMCkgJiYgeSA8IHggJiYgZ2NkKHgsIHkpID09PSBCaWdJbnQoMSkpIHtcbiAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBvZiBhIGdpdmVuIGJpdGxlbmd0aFxuICogQHBhcmFtIGJpdGxlbmd0aFxuICogQHJldHVybnMge1Byb21pc2U8YmlnaW50Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmRvbUJpZ0ludChiaXRsZW5ndGg6IG51bWJlcik6IFByb21pc2U8YmlnaW50PiB7XG4gIHJldHVybiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oYXdhaXQgcmFuZEJpdHMoYml0bGVuZ3RoLCB0cnVlKSkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBzZWVkIC0gdXNlZCB0byBjb25zdHJ1Y3QgZGVyaXZhdGlvbiBwYXRoIGRldGVybWluaXN0aWNhbGx5XG4gKiBAcGFyYW0gaXNNYXN0ZXIgLSBpZiBzZXQsIHBhdGggc3RhcnRzIHdpdGggcHJlZml4IGBtL2BcbiAqIEByZXR1cm4gcGF0aCBgKG0vKS85OTk5OTkvYS9iYCB3aGVyZSBgYWAgYW5kIGBiYCBhcmUgNy1ieXRlIHBzZXVkb3JhbmRvbSBudW1iZXJzIGJhc2VkIG9uIHNlZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcml2YXRpb25QYXRoKHNlZWQ6IHN0cmluZywgaXNNYXN0ZXIgPSB0cnVlKTogc3RyaW5nIHtcbiAgY29uc3QgZGVyaXZhdGlvblBhdGhJbnB1dCA9IHNoYTI1NihzaGEyNTYoYCR7c2VlZH1gKSkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aFBhcnRzID0gW1xuICAgIHBhcnNlSW50KGRlcml2YXRpb25QYXRoSW5wdXQuc2xpY2UoMCwgNyksIDE2KSxcbiAgICBwYXJzZUludChkZXJpdmF0aW9uUGF0aElucHV0LnNsaWNlKDcsIDE0KSwgMTYpLFxuICBdO1xuICBjb25zdCBwcmVmaXggPSBpc01hc3RlciA/ICdtLycgOiAnJztcbiAgcmV0dXJuIHByZWZpeCArICc5OTk5OTkvJyArIGRlcml2YXRpb25QYXRoUGFydHMuam9pbignLycpO1xufVxuXG5mdW5jdGlvbiBzaGEyNTYoaW5wdXQ6IGNyeXB0by5CaW5hcnlMaWtlKTogQnVmZmVyIHtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaW5wdXQpLmRpZ2VzdCgpO1xufVxuIl19
|