@bitgo-beta/abstract-utxo 1.1.1-beta.2258 → 1.1.1-beta.2259
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/dist/cjs/src/impl/zec/address.d.ts +45 -0
- package/dist/cjs/src/impl/zec/address.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/address.js +66 -1
- package/dist/cjs/src/impl/zec/zec.d.ts +2 -0
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/zec.js +6 -4
- package/dist/cjs/test/unit/impl/zec/unit/address.js +140 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/impl/zec/address.d.ts +45 -0
- package/dist/esm/impl/zec/address.d.ts.map +1 -1
- package/dist/esm/impl/zec/address.js +65 -2
- package/dist/esm/impl/zec/zec.d.ts +2 -0
- package/dist/esm/impl/zec/zec.d.ts.map +1 -1
- package/dist/esm/impl/zec/zec.js +6 -4
- package/package.json +10 -10
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
import { fixedScriptWallet } from '@bitgo/wasm-utxo';
|
|
2
|
+
import type { UnifiedRecipientPreference } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { AddressCodec } from '../../transaction/recipient';
|
|
4
|
+
import { UtxoCoinName, WasmUtxoCoinName } from '../../names';
|
|
2
5
|
export type ZcashAddressKind = 'transparent' | 'shielded';
|
|
6
|
+
/**
|
|
7
|
+
* Address codec for Zcash coins ('zec'/'tzec') that understands ZIP-316
|
|
8
|
+
* Unified Addresses in addition to ordinary transparent addresses.
|
|
9
|
+
*
|
|
10
|
+
* - `decode` resolves the bytes a recipient pays to (see its doc): by default
|
|
11
|
+
* the transparent scriptPubKey; with `unifiedRecipientPreference: 'shielded'`
|
|
12
|
+
* the raw Orchard/Ironwood receiver of a Unified Address.
|
|
13
|
+
* - `encode`/`toExtendedAddressFormat` are unchanged: scripts can only be
|
|
14
|
+
* written back out as transparent addresses.
|
|
15
|
+
* - `isValidAddress` accepts transparent addresses and Unified Addresses with
|
|
16
|
+
* a transparent or Orchard receiver.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ZecAddressCodec extends AddressCodec {
|
|
19
|
+
/** The Zcash network name for wasm calls — 'zec' or 'tzec'. */
|
|
20
|
+
private readonly zcashNetworkName;
|
|
21
|
+
/** How Unified Address recipients resolve when this codec decodes them. */
|
|
22
|
+
private readonly unifiedRecipientPreference;
|
|
23
|
+
constructor(coinName: UtxoCoinName, wasmName: WasmUtxoCoinName, unifiedRecipientPreference?: UnifiedRecipientPreference);
|
|
24
|
+
/**
|
|
25
|
+
* Whether `address` is a valid Zcash address for this coin's network.
|
|
26
|
+
*
|
|
27
|
+
* Mirrors the pre-codec `Zec.isValidAddress` logic exactly: the address is
|
|
28
|
+
* valid iff it has a usable transparent receiver (an ordinary transparent
|
|
29
|
+
* address, or a UA carrying a transparent receiver) or an Orchard receiver
|
|
30
|
+
* (a UA carrying one).
|
|
31
|
+
*/
|
|
32
|
+
isValidAddress(address: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve `address` to the bytes this codec's unified-recipient preference pays to.
|
|
35
|
+
*
|
|
36
|
+
* - `'transparent'` (default) resolves the scriptPubKey: an ordinary
|
|
37
|
+
* transparent address decodes to its own script, and a UA with a
|
|
38
|
+
* transparent receiver decodes to that receiver's script. A UA without a
|
|
39
|
+
* transparent receiver (e.g. Orchard-only) throws, since a shielded
|
|
40
|
+
* output has no script.
|
|
41
|
+
* - `'shielded'` resolves the raw Orchard (Ironwood) receiver — the
|
|
42
|
+
* 43-byte diversifier + `pk_d` — of a UA carrying one. Any other address
|
|
43
|
+
* (plain transparent, transparent-only UA, malformed, wrong network)
|
|
44
|
+
* throws, since it has no Orchard receiver to resolve.
|
|
45
|
+
*/
|
|
46
|
+
decode(address: string): Uint8Array;
|
|
47
|
+
}
|
|
3
48
|
/**
|
|
4
49
|
* Whether `address` is a well-formed ZIP-316 Unified Address for `network`
|
|
5
50
|
* with an Orchard receiver. BitGo only supports Orchard, so a UA without one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../../src/impl/zec/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../../src/impl/zec/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,iBAAiB,EAA4B,MAAM,kBAAkB,CAAC;AACvG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,UAAU,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqC;IACtE,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAA6B;gBAGtE,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,0BAA0B,GAAE,0BAA0C;IAOxE;;;;;;;OAOG;IACM,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOjD;;;;;;;;;;;;OAYG;IACM,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;CAiB7C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,GAAG,OAAO,CAM5G;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,GAC1C,gBAAgB,GAAG,SAAS,CAa9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,gBAAgB,GAAG,OAAO,CAEzG"}
|
|
@@ -1,9 +1,74 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZecAddressCodec = void 0;
|
|
3
4
|
exports.isShieldedZcashAddress = isShieldedZcashAddress;
|
|
4
5
|
exports.getZcashAddressKind = getZcashAddressKind;
|
|
5
6
|
exports.isValidZcashAddress = isValidZcashAddress;
|
|
6
7
|
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
8
|
+
const recipient_1 = require("../../transaction/recipient");
|
|
9
|
+
/**
|
|
10
|
+
* Address codec for Zcash coins ('zec'/'tzec') that understands ZIP-316
|
|
11
|
+
* Unified Addresses in addition to ordinary transparent addresses.
|
|
12
|
+
*
|
|
13
|
+
* - `decode` resolves the bytes a recipient pays to (see its doc): by default
|
|
14
|
+
* the transparent scriptPubKey; with `unifiedRecipientPreference: 'shielded'`
|
|
15
|
+
* the raw Orchard/Ironwood receiver of a Unified Address.
|
|
16
|
+
* - `encode`/`toExtendedAddressFormat` are unchanged: scripts can only be
|
|
17
|
+
* written back out as transparent addresses.
|
|
18
|
+
* - `isValidAddress` accepts transparent addresses and Unified Addresses with
|
|
19
|
+
* a transparent or Orchard receiver.
|
|
20
|
+
*/
|
|
21
|
+
class ZecAddressCodec extends recipient_1.AddressCodec {
|
|
22
|
+
constructor(coinName, wasmName, unifiedRecipientPreference = 'transparent') {
|
|
23
|
+
super(coinName, wasmName);
|
|
24
|
+
this.zcashNetworkName = wasmName;
|
|
25
|
+
this.unifiedRecipientPreference = unifiedRecipientPreference;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether `address` is a valid Zcash address for this coin's network.
|
|
29
|
+
*
|
|
30
|
+
* Mirrors the pre-codec `Zec.isValidAddress` logic exactly: the address is
|
|
31
|
+
* valid iff it has a usable transparent receiver (an ordinary transparent
|
|
32
|
+
* address, or a UA carrying a transparent receiver) or an Orchard receiver
|
|
33
|
+
* (a UA carrying one).
|
|
34
|
+
*/
|
|
35
|
+
isValidAddress(address) {
|
|
36
|
+
return (wasm_utxo_1.zcashAddress.hasTransparentReceiver(address, this.wasmName) ||
|
|
37
|
+
wasm_utxo_1.zcashAddress.hasOrchardReceiver(address, this.wasmName));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve `address` to the bytes this codec's unified-recipient preference pays to.
|
|
41
|
+
*
|
|
42
|
+
* - `'transparent'` (default) resolves the scriptPubKey: an ordinary
|
|
43
|
+
* transparent address decodes to its own script, and a UA with a
|
|
44
|
+
* transparent receiver decodes to that receiver's script. A UA without a
|
|
45
|
+
* transparent receiver (e.g. Orchard-only) throws, since a shielded
|
|
46
|
+
* output has no script.
|
|
47
|
+
* - `'shielded'` resolves the raw Orchard (Ironwood) receiver — the
|
|
48
|
+
* 43-byte diversifier + `pk_d` — of a UA carrying one. Any other address
|
|
49
|
+
* (plain transparent, transparent-only UA, malformed, wrong network)
|
|
50
|
+
* throws, since it has no Orchard receiver to resolve.
|
|
51
|
+
*/
|
|
52
|
+
decode(address) {
|
|
53
|
+
if (this.unifiedRecipientPreference !== 'shielded') {
|
|
54
|
+
return wasm_utxo_1.zcashAddress.toTransparentReceiverWithCoin(address, this.wasmName);
|
|
55
|
+
}
|
|
56
|
+
// The raw Orchard receiver exists only for a Unified Address carrying one; anything else
|
|
57
|
+
// (plain transparent address, transparent-only UA, malformed, wrong network) throws.
|
|
58
|
+
let unified;
|
|
59
|
+
try {
|
|
60
|
+
unified = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.parse(address, this.zcashNetworkName);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
throw new Error(`address ${address} is not a valid address for network ${this.zcashNetworkName}`);
|
|
64
|
+
}
|
|
65
|
+
if (!unified?.hasOrchardReceiver) {
|
|
66
|
+
throw new Error(`address ${address} has no Orchard receiver to resolve as shielded`);
|
|
67
|
+
}
|
|
68
|
+
return wasm_utxo_1.zcashAddress.toShieldedReceiverWithCoin(address, this.wasmName);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.ZecAddressCodec = ZecAddressCodec;
|
|
7
72
|
/**
|
|
8
73
|
* Whether `address` is a well-formed ZIP-316 Unified Address for `network`
|
|
9
74
|
* with an Orchard receiver. BitGo only supports Orchard, so a UA without one
|
|
@@ -52,4 +117,4 @@ function getZcashAddressKind(address, network) {
|
|
|
52
117
|
function isValidZcashAddress(address, network) {
|
|
53
118
|
return getZcashAddressKind(address, network) !== undefined;
|
|
54
119
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pbXBsL3plYy9hZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esd0RBTUM7QUFPRCxrREFnQkM7QUFjRCxrREFFQztBQXRERCxnREFBeUY7QUFJekY7Ozs7R0FJRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLE9BQWUsRUFBRSxPQUEyQztJQUNqRyxJQUFJLENBQUM7UUFDSCxPQUFPLDZCQUFpQixDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUM7SUFDMUYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLE9BQWUsRUFDZixPQUEyQztJQUUzQyxrRkFBa0Y7SUFDbEYsZ0ZBQWdGO0lBQ2hGLGlGQUFpRjtJQUNqRixJQUFJLElBQUEsc0JBQVUsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILG1CQUFXLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxrRUFBa0U7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0UsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsT0FBZSxFQUFFLE9BQTJDO0lBQzlGLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgZml4ZWRTY3JpcHRXYWxsZXQsIGlzQ29pbk5hbWUgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuZXhwb3J0IHR5cGUgWmNhc2hBZGRyZXNzS2luZCA9ICd0cmFuc3BhcmVudCcgfCAnc2hpZWxkZWQnO1xuXG4vKipcbiAqIFdoZXRoZXIgYGFkZHJlc3NgIGlzIGEgd2VsbC1mb3JtZWQgWklQLTMxNiBVbmlmaWVkIEFkZHJlc3MgZm9yIGBuZXR3b3JrYFxuICogd2l0aCBhbiBPcmNoYXJkIHJlY2VpdmVyLiBCaXRHbyBvbmx5IHN1cHBvcnRzIE9yY2hhcmQsIHNvIGEgVUEgd2l0aG91dCBvbmVcbiAqIChlLmcuIFNhcGxpbmctIG9yIHRyYW5zcGFyZW50LW9ubHkpIGlzIG5vdCBjb25zaWRlcmVkIHZhbGlkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hOZXR3b3JrTmFtZSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLnBhcnNlKGFkZHJlc3MsIG5ldHdvcmspLmhhc09yY2hhcmRSZWNlaXZlcjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3NpZnkgYSBaY2FzaCBhZGRyZXNzIHN0cmluZyBhcyB0cmFuc3BhcmVudCBvciBzaGllbGRlZCwgdmFsaWRhdGluZyBpdCBpblxuICogdGhlIHByb2Nlc3MuIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBhZGRyZXNzIGlzIG5laXRoZXIgYSB2YWxpZCB0cmFuc3BhcmVudFxuICogYWRkcmVzcyBub3IgYSB3ZWxsLWZvcm1lZCBaSVAtMzE2IFVuaWZpZWQgQWRkcmVzcyBmb3IgYG5ldHdvcmtgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0WmNhc2hBZGRyZXNzS2luZChcbiAgYWRkcmVzczogc3RyaW5nLFxuICBuZXR3b3JrOiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaE5ldHdvcmtOYW1lXG4pOiBaY2FzaEFkZHJlc3NLaW5kIHwgdW5kZWZpbmVkIHtcbiAgLy8gWmNhc2hOZXR3b3JrTmFtZSBhbHNvIHBlcm1pdHMgJ3pjYXNoJy8nemNhc2hUZXN0Jywgd2hpY2ggdG9PdXRwdXRTY3JpcHRXaXRoQ29pblxuICAvLyBkb2Vzbid0IGFjY2VwdCAoaXQgdGFrZXMgYSBDb2luTmFtZSwgaS5lLiAnemVjJy8ndHplYycpLiBTa2lwIHN0cmFpZ2h0IHRvIHRoZVxuICAvLyBzaGllbGRlZCBjaGVjayBmb3IgdGhvc2UgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBhbiB1bnNhZmUgY2FzdCArIGNhdWdodCB0aHJvdy5cbiAgaWYgKGlzQ29pbk5hbWUobmV0d29yaykpIHtcbiAgICB0cnkge1xuICAgICAgd2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbihhZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgIHJldHVybiAndHJhbnNwYXJlbnQnO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm90IGEgdmFsaWQgdHJhbnNwYXJlbnQgYWRkcmVzczsgZmFsbCB0aHJvdWdoIHRvIHNoaWVsZGVkIGNoZWNrXG4gICAgfVxuICB9XG4gIHJldHVybiBpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKGFkZHJlc3MsIG5ldHdvcmspID8gJ3NoaWVsZGVkJyA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFuZGFsb25lIGNvdW50ZXJwYXJ0IHRvIGBaZWMuaXNWYWxpZEFkZHJlc3NgLCBwYXJhbWV0ZXJpemVkIGJ5IGBuZXR3b3JrYFxuICogaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBjb2luIGluc3RhbmNlLiBBY2NlcHRzIHRyYW5zcGFyZW50IGFkZHJlc3NlcyBhbmRcbiAqIHNoaWVsZGVkIFpJUC0zMTYgVW5pZmllZCBBZGRyZXNzZXMuXG4gKlxuICogTm90IHN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYFplYy5pc1ZhbGlkQWRkcmVzc2A6IHRoZSBiYXNlIGNsYXNzIGFsc29cbiAqIHJvdW5kLXRyaXBzIHRoZSBwYXJzZWQgc2NyaXB0IHRocm91Z2ggZWFjaCBrbm93biBlbmNvZGluZyBmb3JtYXQgKHNlZVxuICogYEFic3RyYWN0VXR4b0NvaW4uaXNWYWxpZEFkZHJlc3NgKSwgd2hlcmVhcyB0aGlzIG9ubHkgY2FsbHNcbiAqIGB0b091dHB1dFNjcmlwdFdpdGhDb2luYCBvbmNlIHZpYSBgZ2V0WmNhc2hBZGRyZXNzS2luZGAuIFRoZXkgYWdyZWUgaW5cbiAqIHByYWN0aWNlIHNpbmNlIHplYy90emVjIGhhdmUgbm8gYWx0ZXJuYXRlIHRyYW5zcGFyZW50LWFkZHJlc3MgZW5jb2RpbmcgdG9cbiAqIHJvdW5kLXRyaXAgYWdhaW5zdCwgYnV0IHRoYXQncyBub3QgZ3VhcmFudGVlZCB0byByZW1haW4gdHJ1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRaY2FzaEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaE5ldHdvcmtOYW1lKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRaY2FzaEFkZHJlc3NLaW5kKGFkZHJlc3MsIG5ldHdvcmspICE9PSB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pbXBsL3plYy9hZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdGQSx3REFNQztBQU9ELGtEQWdCQztBQWNELGtEQUVDO0FBcklELGdEQUF1RztBQUd2RywyREFBMkQ7QUFLM0Q7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGVBQWdCLFNBQVEsd0JBQVk7SUFNL0MsWUFDRSxRQUFzQixFQUN0QixRQUEwQixFQUMxQiw2QkFBeUQsYUFBYTtRQUV0RSxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUE4QyxDQUFDO1FBQ3ZFLElBQUksQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNNLGNBQWMsQ0FBQyxPQUFlO1FBQ3JDLE9BQU8sQ0FDTCx3QkFBWSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzNELHdCQUFZLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDTSxNQUFNLENBQUMsT0FBZTtRQUM3QixJQUFJLElBQUksQ0FBQywwQkFBMEIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuRCxPQUFPLHdCQUFZLENBQUMsNkJBQTZCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QseUZBQXlGO1FBQ3pGLHFGQUFxRjtRQUNyRixJQUFJLE9BQTBELENBQUM7UUFDL0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLDZCQUFpQixDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxPQUFPLHVDQUF1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLE9BQU8saURBQWlELENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsT0FBTyx3QkFBWSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGO0FBN0RELDBDQTZEQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxPQUFlLEVBQUUsT0FBMkM7SUFDakcsSUFBSSxDQUFDO1FBQ0gsT0FBTyw2QkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0lBQzFGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUNqQyxPQUFlLEVBQ2YsT0FBMkM7SUFFM0Msa0ZBQWtGO0lBQ2xGLGdGQUFnRjtJQUNoRixpRkFBaUY7SUFDakYsSUFBSSxJQUFBLHNCQUFVLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUM7WUFDSCxtQkFBVyxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asa0VBQWtFO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxPQUEyQztJQUM5RixPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MsIGZpeGVkU2NyaXB0V2FsbGV0LCBpc0NvaW5OYW1lLCB6Y2FzaEFkZHJlc3MgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB0eXBlIHsgVW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFkZHJlc3NDb2RlYyB9IGZyb20gJy4uLy4uL3RyYW5zYWN0aW9uL3JlY2lwaWVudCc7XG5pbXBvcnQgeyBVdHhvQ29pbk5hbWUsIFdhc21VdHhvQ29pbk5hbWUgfSBmcm9tICcuLi8uLi9uYW1lcyc7XG5cbmV4cG9ydCB0eXBlIFpjYXNoQWRkcmVzc0tpbmQgPSAndHJhbnNwYXJlbnQnIHwgJ3NoaWVsZGVkJztcblxuLyoqXG4gKiBBZGRyZXNzIGNvZGVjIGZvciBaY2FzaCBjb2lucyAoJ3plYycvJ3R6ZWMnKSB0aGF0IHVuZGVyc3RhbmRzIFpJUC0zMTZcbiAqIFVuaWZpZWQgQWRkcmVzc2VzIGluIGFkZGl0aW9uIHRvIG9yZGluYXJ5IHRyYW5zcGFyZW50IGFkZHJlc3Nlcy5cbiAqXG4gKiAtIGBkZWNvZGVgIHJlc29sdmVzIHRoZSBieXRlcyBhIHJlY2lwaWVudCBwYXlzIHRvIChzZWUgaXRzIGRvYyk6IGJ5IGRlZmF1bHRcbiAqICAgdGhlIHRyYW5zcGFyZW50IHNjcmlwdFB1YktleTsgd2l0aCBgdW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2U6ICdzaGllbGRlZCdgXG4gKiAgIHRoZSByYXcgT3JjaGFyZC9Jcm9ud29vZCByZWNlaXZlciBvZiBhIFVuaWZpZWQgQWRkcmVzcy5cbiAqIC0gYGVuY29kZWAvYHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0YCBhcmUgdW5jaGFuZ2VkOiBzY3JpcHRzIGNhbiBvbmx5IGJlXG4gKiAgIHdyaXR0ZW4gYmFjayBvdXQgYXMgdHJhbnNwYXJlbnQgYWRkcmVzc2VzLlxuICogLSBgaXNWYWxpZEFkZHJlc3NgIGFjY2VwdHMgdHJhbnNwYXJlbnQgYWRkcmVzc2VzIGFuZCBVbmlmaWVkIEFkZHJlc3NlcyB3aXRoXG4gKiAgIGEgdHJhbnNwYXJlbnQgb3IgT3JjaGFyZCByZWNlaXZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFplY0FkZHJlc3NDb2RlYyBleHRlbmRzIEFkZHJlc3NDb2RlYyB7XG4gIC8qKiBUaGUgWmNhc2ggbmV0d29yayBuYW1lIGZvciB3YXNtIGNhbGxzIOKAlCAnemVjJyBvciAndHplYycuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgemNhc2hOZXR3b3JrTmFtZTogZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hOZXR3b3JrTmFtZTtcbiAgLyoqIEhvdyBVbmlmaWVkIEFkZHJlc3MgcmVjaXBpZW50cyByZXNvbHZlIHdoZW4gdGhpcyBjb2RlYyBkZWNvZGVzIHRoZW0uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2U6IFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvaW5OYW1lOiBVdHhvQ29pbk5hbWUsXG4gICAgd2FzbU5hbWU6IFdhc21VdHhvQ29pbk5hbWUsXG4gICAgdW5pZmllZFJlY2lwaWVudFByZWZlcmVuY2U6IFVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlID0gJ3RyYW5zcGFyZW50J1xuICApIHtcbiAgICBzdXBlcihjb2luTmFtZSwgd2FzbU5hbWUpO1xuICAgIHRoaXMuemNhc2hOZXR3b3JrTmFtZSA9IHdhc21OYW1lIGFzIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoTmV0d29ya05hbWU7XG4gICAgdGhpcy51bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSA9IHVuaWZpZWRSZWNpcGllbnRQcmVmZXJlbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYGFkZHJlc3NgIGlzIGEgdmFsaWQgWmNhc2ggYWRkcmVzcyBmb3IgdGhpcyBjb2luJ3MgbmV0d29yay5cbiAgICpcbiAgICogTWlycm9ycyB0aGUgcHJlLWNvZGVjIGBaZWMuaXNWYWxpZEFkZHJlc3NgIGxvZ2ljIGV4YWN0bHk6IHRoZSBhZGRyZXNzIGlzXG4gICAqIHZhbGlkIGlmZiBpdCBoYXMgYSB1c2FibGUgdHJhbnNwYXJlbnQgcmVjZWl2ZXIgKGFuIG9yZGluYXJ5IHRyYW5zcGFyZW50XG4gICAqIGFkZHJlc3MsIG9yIGEgVUEgY2FycnlpbmcgYSB0cmFuc3BhcmVudCByZWNlaXZlcikgb3IgYW4gT3JjaGFyZCByZWNlaXZlclxuICAgKiAoYSBVQSBjYXJyeWluZyBvbmUpLlxuICAgKi9cbiAgb3ZlcnJpZGUgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHpjYXNoQWRkcmVzcy5oYXNUcmFuc3BhcmVudFJlY2VpdmVyKGFkZHJlc3MsIHRoaXMud2FzbU5hbWUpIHx8XG4gICAgICB6Y2FzaEFkZHJlc3MuaGFzT3JjaGFyZFJlY2VpdmVyKGFkZHJlc3MsIHRoaXMud2FzbU5hbWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGBhZGRyZXNzYCB0byB0aGUgYnl0ZXMgdGhpcyBjb2RlYydzIHVuaWZpZWQtcmVjaXBpZW50IHByZWZlcmVuY2UgcGF5cyB0by5cbiAgICpcbiAgICogLSBgJ3RyYW5zcGFyZW50J2AgKGRlZmF1bHQpIHJlc29sdmVzIHRoZSBzY3JpcHRQdWJLZXk6IGFuIG9yZGluYXJ5XG4gICAqICAgdHJhbnNwYXJlbnQgYWRkcmVzcyBkZWNvZGVzIHRvIGl0cyBvd24gc2NyaXB0LCBhbmQgYSBVQSB3aXRoIGFcbiAgICogICB0cmFuc3BhcmVudCByZWNlaXZlciBkZWNvZGVzIHRvIHRoYXQgcmVjZWl2ZXIncyBzY3JpcHQuIEEgVUEgd2l0aG91dCBhXG4gICAqICAgdHJhbnNwYXJlbnQgcmVjZWl2ZXIgKGUuZy4gT3JjaGFyZC1vbmx5KSB0aHJvd3MsIHNpbmNlIGEgc2hpZWxkZWRcbiAgICogICBvdXRwdXQgaGFzIG5vIHNjcmlwdC5cbiAgICogLSBgJ3NoaWVsZGVkJ2AgcmVzb2x2ZXMgdGhlIHJhdyBPcmNoYXJkIChJcm9ud29vZCkgcmVjZWl2ZXIg4oCUIHRoZVxuICAgKiAgIDQzLWJ5dGUgZGl2ZXJzaWZpZXIgKyBgcGtfZGAg4oCUIG9mIGEgVUEgY2Fycnlpbmcgb25lLiBBbnkgb3RoZXIgYWRkcmVzc1xuICAgKiAgIChwbGFpbiB0cmFuc3BhcmVudCwgdHJhbnNwYXJlbnQtb25seSBVQSwgbWFsZm9ybWVkLCB3cm9uZyBuZXR3b3JrKVxuICAgKiAgIHRocm93cywgc2luY2UgaXQgaGFzIG5vIE9yY2hhcmQgcmVjZWl2ZXIgdG8gcmVzb2x2ZS5cbiAgICovXG4gIG92ZXJyaWRlIGRlY29kZShhZGRyZXNzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICBpZiAodGhpcy51bmlmaWVkUmVjaXBpZW50UHJlZmVyZW5jZSAhPT0gJ3NoaWVsZGVkJykge1xuICAgICAgcmV0dXJuIHpjYXNoQWRkcmVzcy50b1RyYW5zcGFyZW50UmVjZWl2ZXJXaXRoQ29pbihhZGRyZXNzLCB0aGlzLndhc21OYW1lKTtcbiAgICB9XG4gICAgLy8gVGhlIHJhdyBPcmNoYXJkIHJlY2VpdmVyIGV4aXN0cyBvbmx5IGZvciBhIFVuaWZpZWQgQWRkcmVzcyBjYXJyeWluZyBvbmU7IGFueXRoaW5nIGVsc2VcbiAgICAvLyAocGxhaW4gdHJhbnNwYXJlbnQgYWRkcmVzcywgdHJhbnNwYXJlbnQtb25seSBVQSwgbWFsZm9ybWVkLCB3cm9uZyBuZXR3b3JrKSB0aHJvd3MuXG4gICAgbGV0IHVuaWZpZWQ6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHVuaWZpZWQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLnBhcnNlKGFkZHJlc3MsIHRoaXMuemNhc2hOZXR3b3JrTmFtZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgJHthZGRyZXNzfSBpcyBub3QgYSB2YWxpZCBhZGRyZXNzIGZvciBuZXR3b3JrICR7dGhpcy56Y2FzaE5ldHdvcmtOYW1lfWApO1xuICAgIH1cbiAgICBpZiAoIXVuaWZpZWQ/Lmhhc09yY2hhcmRSZWNlaXZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzICR7YWRkcmVzc30gaGFzIG5vIE9yY2hhcmQgcmVjZWl2ZXIgdG8gcmVzb2x2ZSBhcyBzaGllbGRlZGApO1xuICAgIH1cbiAgICByZXR1cm4gemNhc2hBZGRyZXNzLnRvU2hpZWxkZWRSZWNlaXZlcldpdGhDb2luKGFkZHJlc3MsIHRoaXMud2FzbU5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBgYWRkcmVzc2AgaXMgYSB3ZWxsLWZvcm1lZCBaSVAtMzE2IFVuaWZpZWQgQWRkcmVzcyBmb3IgYG5ldHdvcmtgXG4gKiB3aXRoIGFuIE9yY2hhcmQgcmVjZWl2ZXIuIEJpdEdvIG9ubHkgc3VwcG9ydHMgT3JjaGFyZCwgc28gYSBVQSB3aXRob3V0IG9uZVxuICogKGUuZy4gU2FwbGluZy0gb3IgdHJhbnNwYXJlbnQtb25seSkgaXMgbm90IGNvbnNpZGVyZWQgdmFsaWQgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2hpZWxkZWRaY2FzaEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaE5ldHdvcmtOYW1lKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UoYWRkcmVzcywgbmV0d29yaykuaGFzT3JjaGFyZFJlY2VpdmVyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzc2lmeSBhIFpjYXNoIGFkZHJlc3Mgc3RyaW5nIGFzIHRyYW5zcGFyZW50IG9yIHNoaWVsZGVkLCB2YWxpZGF0aW5nIGl0IGluXG4gKiB0aGUgcHJvY2Vzcy4gUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGFkZHJlc3MgaXMgbmVpdGhlciBhIHZhbGlkIHRyYW5zcGFyZW50XG4gKiBhZGRyZXNzIG5vciBhIHdlbGwtZm9ybWVkIFpJUC0zMTYgVW5pZmllZCBBZGRyZXNzIGZvciBgbmV0d29ya2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRaY2FzaEFkZHJlc3NLaW5kKFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIG5ldHdvcms6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoTmV0d29ya05hbWVcbik6IFpjYXNoQWRkcmVzc0tpbmQgfCB1bmRlZmluZWQge1xuICAvLyBaY2FzaE5ldHdvcmtOYW1lIGFsc28gcGVybWl0cyAnemNhc2gnLyd6Y2FzaFRlc3QnLCB3aGljaCB0b091dHB1dFNjcmlwdFdpdGhDb2luXG4gIC8vIGRvZXNuJ3QgYWNjZXB0IChpdCB0YWtlcyBhIENvaW5OYW1lLCBpLmUuICd6ZWMnLyd0emVjJykuIFNraXAgc3RyYWlnaHQgdG8gdGhlXG4gIC8vIHNoaWVsZGVkIGNoZWNrIGZvciB0aG9zZSByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGFuIHVuc2FmZSBjYXN0ICsgY2F1Z2h0IHRocm93LlxuICBpZiAoaXNDb2luTmFtZShuZXR3b3JrKSkge1xuICAgIHRyeSB7XG4gICAgICB3YXNtQWRkcmVzcy50b091dHB1dFNjcmlwdFdpdGhDb2luKGFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBub3QgYSB2YWxpZCB0cmFuc3BhcmVudCBhZGRyZXNzOyBmYWxsIHRocm91Z2ggdG8gc2hpZWxkZWQgY2hlY2tcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGlzU2hpZWxkZWRaY2FzaEFkZHJlc3MoYWRkcmVzcywgbmV0d29yaykgPyAnc2hpZWxkZWQnIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW5kYWxvbmUgY291bnRlcnBhcnQgdG8gYFplYy5pc1ZhbGlkQWRkcmVzc2AsIHBhcmFtZXRlcml6ZWQgYnkgYG5ldHdvcmtgXG4gKiBpbnN0ZWFkIG9mIHJlcXVpcmluZyBhIGNvaW4gaW5zdGFuY2UuIEFjY2VwdHMgdHJhbnNwYXJlbnQgYWRkcmVzc2VzIGFuZFxuICogc2hpZWxkZWQgWklQLTMxNiBVbmlmaWVkIEFkZHJlc3Nlcy5cbiAqXG4gKiBOb3Qgc3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byBgWmVjLmlzVmFsaWRBZGRyZXNzYDogdGhlIGJhc2UgY2xhc3MgYWxzb1xuICogcm91bmQtdHJpcHMgdGhlIHBhcnNlZCBzY3JpcHQgdGhyb3VnaCBlYWNoIGtub3duIGVuY29kaW5nIGZvcm1hdCAoc2VlXG4gKiBgQWJzdHJhY3RVdHhvQ29pbi5pc1ZhbGlkQWRkcmVzc2ApLCB3aGVyZWFzIHRoaXMgb25seSBjYWxsc1xuICogYHRvT3V0cHV0U2NyaXB0V2l0aENvaW5gIG9uY2UgdmlhIGBnZXRaY2FzaEFkZHJlc3NLaW5kYC4gVGhleSBhZ3JlZSBpblxuICogcHJhY3RpY2Ugc2luY2UgemVjL3R6ZWMgaGF2ZSBubyBhbHRlcm5hdGUgdHJhbnNwYXJlbnQtYWRkcmVzcyBlbmNvZGluZyB0b1xuICogcm91bmQtdHJpcCBhZ2FpbnN0LCBidXQgdGhhdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJlbWFpbiB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFpjYXNoQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoTmV0d29ya05hbWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFpjYXNoQWRkcmVzc0tpbmQoYWRkcmVzcywgbmV0d29yaykgIT09IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { BitGoBase, MPCAlgorithm } from '@bitgo-beta/sdk-core';
|
|
5
5
|
import { AbstractUtxoCoin } from '../../abstractUtxoCoin';
|
|
6
6
|
import { UtxoCoinName } from '../../names';
|
|
7
|
+
import { ZecAddressCodec } from './address';
|
|
7
8
|
export declare class Zec extends AbstractUtxoCoin {
|
|
8
9
|
readonly name: UtxoCoinName;
|
|
9
10
|
constructor(bitgo: BitGoBase);
|
|
@@ -15,6 +16,7 @@ export declare class Zec extends AbstractUtxoCoin {
|
|
|
15
16
|
*/
|
|
16
17
|
getMPCAlgorithm(): MPCAlgorithm;
|
|
17
18
|
static createInstance(bitgo: BitGoBase): Zec;
|
|
19
|
+
get addressCodec(): ZecAddressCodec;
|
|
18
20
|
isValidAddress(address: string, param?: {
|
|
19
21
|
anyFormat?: boolean;
|
|
20
22
|
allowLightning?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zec.d.ts","sourceRoot":"","sources":["../../../../../src/impl/zec/zec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"zec.d.ts","sourceRoot":"","sources":["../../../../../src/impl/zec/zec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,qBAAa,GAAI,SAAQ,gBAAgB;IACvC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAS;gBAExB,KAAK,EAAE,SAAS;IAI5B;;;;;OAKG;IACH,eAAe,IAAI,YAAY;IAI/B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG;IAI5C,IAAa,YAAY,IAAI,eAAe,CAE3C;IAED,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,GAAG,OAAO;CAG9G"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Zec = void 0;
|
|
4
|
-
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
5
4
|
const abstractUtxoCoin_1 = require("../../abstractUtxoCoin");
|
|
5
|
+
const address_1 = require("./address");
|
|
6
6
|
class Zec extends abstractUtxoCoin_1.AbstractUtxoCoin {
|
|
7
7
|
constructor(bitgo) {
|
|
8
8
|
super(bitgo);
|
|
@@ -20,10 +20,12 @@ class Zec extends abstractUtxoCoin_1.AbstractUtxoCoin {
|
|
|
20
20
|
static createInstance(bitgo) {
|
|
21
21
|
return new Zec(bitgo);
|
|
22
22
|
}
|
|
23
|
+
get addressCodec() {
|
|
24
|
+
return new address_1.ZecAddressCodec(this.name, this.wasmName);
|
|
25
|
+
}
|
|
23
26
|
isValidAddress(address, param) {
|
|
24
|
-
return
|
|
25
|
-
wasm_utxo_1.zcashAddress.hasOrchardReceiver(address, this.wasmName));
|
|
27
|
+
return this.addressCodec.isValidAddress(address);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
exports.Zec = Zec;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjL3plYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSw2REFBMEQ7QUFHMUQsdUNBQTRDO0FBRTVDLE1BQWEsR0FBSSxTQUFRLG1DQUFnQjtJQUd2QyxZQUFZLEtBQWdCO1FBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUhOLFNBQUksR0FBaUIsS0FBSyxDQUFDO0lBSXBDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWU7UUFDYixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQjtRQUNwQyxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFhLFlBQVk7UUFDdkIsT0FBTyxJQUFJLHlCQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFlLEVBQUUsS0FBbUU7UUFDakcsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUE1QkQsa0JBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQml0R29CYXNlLCBNUENBbGdvcml0aG0gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IFV0eG9Db2luTmFtZSB9IGZyb20gJy4uLy4uL25hbWVzJztcblxuaW1wb3J0IHsgWmVjQWRkcmVzc0NvZGVjIH0gZnJvbSAnLi9hZGRyZXNzJztcblxuZXhwb3J0IGNsYXNzIFplYyBleHRlbmRzIEFic3RyYWN0VXR4b0NvaW4ge1xuICByZWFkb25seSBuYW1lOiBVdHhvQ29pbk5hbWUgPSAnemVjJztcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIFpFQyBzaGllbGRlZCAoT3JjaGFyZC9Jcm9ud29vZCkgY3VzdG9kaWFsIHdhbGxldHMgdXNlIFJlZFBhbGxhcyB0aHJlc2hvbGQga2V5cy5cbiAgICogVHJhbnNwYXJlbnQgKHNlY3AyNTZrMSBtdWx0aXNpZykgZmxvd3MgYXJlIHVuYWZmZWN0ZWQ6IE1QQ0FsZ29yaXRobSBpcyBvbmx5XG4gICAqIGNvbnN1bHRlZCBvbiB0aGUgVFNTIGN1c3RvZGlhbCB3YWxsZXQtY3JlYXRpb24gcGF0aC5cbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAncmVkcGFsbGFzJztcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlKTogWmVjIHtcbiAgICByZXR1cm4gbmV3IFplYyhiaXRnbyk7XG4gIH1cblxuICBvdmVycmlkZSBnZXQgYWRkcmVzc0NvZGVjKCk6IFplY0FkZHJlc3NDb2RlYyB7XG4gICAgcmV0dXJuIG5ldyBaZWNBZGRyZXNzQ29kZWModGhpcy5uYW1lLCB0aGlzLndhc21OYW1lKTtcbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgcGFyYW0/OiB7IGFueUZvcm1hdD86IGJvb2xlYW47IGFsbG93TGlnaHRuaW5nPzogYm9vbGVhbiB9IHwgYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NDb2RlYy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxufVxuIl19
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
7
7
|
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
8
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
8
9
|
const zec_1 = require("../../../../../src/impl/zec");
|
|
9
10
|
// ZIP-316 unified-address test vectors, copied from
|
|
10
11
|
// BitGoWASM/packages/wasm-utxo/test/fixtures/zcash/unified_address.json so
|
|
@@ -63,4 +64,142 @@ describe('Zcash address validation', function () {
|
|
|
63
64
|
strict_1.default.strictEqual((0, zec_1.isValidZcashAddress)(zip316Mainnet.unified, 'tzec'), false);
|
|
64
65
|
});
|
|
65
66
|
});
|
|
66
|
-
|
|
67
|
+
describe('ZecAddressCodec', function () {
|
|
68
|
+
// -- instantiation ----------------------------------------------------------
|
|
69
|
+
let bitgo;
|
|
70
|
+
let zec;
|
|
71
|
+
let tzec;
|
|
72
|
+
before(function () {
|
|
73
|
+
bitgo = new sdk_api_1.BitGoAPI({ env: 'mock' });
|
|
74
|
+
bitgo.register('zec', zec_1.Zec.createInstance);
|
|
75
|
+
bitgo.register('tzec', zec_1.Tzec.createInstance);
|
|
76
|
+
zec = bitgo.coin('zec');
|
|
77
|
+
tzec = bitgo.coin('tzec');
|
|
78
|
+
});
|
|
79
|
+
it('constructs for zec and tzec', function () {
|
|
80
|
+
const mainnet = new zec_1.ZecAddressCodec('zec', 'zec');
|
|
81
|
+
const testnet = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
82
|
+
strict_1.default.strictEqual(mainnet.coinName, 'zec');
|
|
83
|
+
strict_1.default.strictEqual(testnet.coinName, 'tzec');
|
|
84
|
+
});
|
|
85
|
+
// -- isValidAddress --------------------------------------------------------
|
|
86
|
+
it('isValidAddress: accepts mainnet UA', function () {
|
|
87
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('zec', 'zec').isValidAddress(zip316Mainnet.unified), true);
|
|
88
|
+
});
|
|
89
|
+
it('isValidAddress: accepts testnet UA', function () {
|
|
90
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('tzec', 'tzec').isValidAddress(testnetWallet.unified), true);
|
|
91
|
+
});
|
|
92
|
+
it('isValidAddress: accepts mainnet P2PKH', function () {
|
|
93
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('zec', 'zec').isValidAddress('t1cN2ZVWzWcVRrnfeQzmkpLhzQ4dYRv8yRY'), true);
|
|
94
|
+
});
|
|
95
|
+
it('isValidAddress: accepts testnet transparent address', function () {
|
|
96
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('tzec', 'tzec').isValidAddress(testnetWallet.transparentAddress), true);
|
|
97
|
+
});
|
|
98
|
+
it('isValidAddress: rejects wrong-network UA', function () {
|
|
99
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('tzec', 'tzec').isValidAddress(zip316Mainnet.unified), false);
|
|
100
|
+
});
|
|
101
|
+
it('isValidAddress: rejects garbage', function () {
|
|
102
|
+
strict_1.default.strictEqual(new zec_1.ZecAddressCodec('tzec', 'tzec').isValidAddress('not-a-real-address'), false);
|
|
103
|
+
});
|
|
104
|
+
// -- decode ----------------------------------------------------------------
|
|
105
|
+
it('decode: plain transparent address decodes to P2PKH script', function () {
|
|
106
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
107
|
+
const script = Buffer.from(codec.decode(testnetWallet.transparentAddress));
|
|
108
|
+
// P2PKH: OP_DUP OP_HASH160 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG
|
|
109
|
+
strict_1.default.strictEqual(script[0], 0x76); // OP_DUP
|
|
110
|
+
strict_1.default.strictEqual(script[1], 0xa9); // OP_HASH160
|
|
111
|
+
strict_1.default.strictEqual(script[2], 0x14); // push 20 bytes
|
|
112
|
+
strict_1.default.strictEqual(script.length, 25); // total P2PKH length
|
|
113
|
+
});
|
|
114
|
+
it('decode: UA with transparent receiver decodes to the same transparent script', function () {
|
|
115
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
116
|
+
// The testnet UA carries a transparent receiver; it should decode to the
|
|
117
|
+
// same scriptPubKey as the standalone transparent address.
|
|
118
|
+
const uaScript = Buffer.from(codec.decode(testnetWallet.unified));
|
|
119
|
+
const tAddrScript = Buffer.from(codec.decode(testnetWallet.transparentAddress));
|
|
120
|
+
strict_1.default.deepStrictEqual(uaScript, tAddrScript);
|
|
121
|
+
});
|
|
122
|
+
it('decode: UA with transparent receiver decodes on mainnet', function () {
|
|
123
|
+
const codec = new zec_1.ZecAddressCodec('zec', 'zec');
|
|
124
|
+
const script = Buffer.from(codec.decode(zip316Mainnet.unified));
|
|
125
|
+
// P2PKH structure test
|
|
126
|
+
strict_1.default.strictEqual(script[0], 0x76);
|
|
127
|
+
strict_1.default.strictEqual(script[1], 0xa9);
|
|
128
|
+
strict_1.default.strictEqual(script[2], 0x14);
|
|
129
|
+
});
|
|
130
|
+
it('decode: throws for a UA without a transparent receiver (orchard-only)', function () {
|
|
131
|
+
// Construct an Orchard-only UA by encoding a dummy receiver
|
|
132
|
+
const orchardOnly = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(43).fill(0x42), 'tzec');
|
|
133
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
134
|
+
strict_1.default.throws(() => codec.decode(orchardOnly));
|
|
135
|
+
});
|
|
136
|
+
it('decode: explicit transparent-bound codec returns the transparent script', function () {
|
|
137
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'transparent');
|
|
138
|
+
const script = Buffer.from(codec.decode(testnetWallet.unified));
|
|
139
|
+
const tAddrScript = Buffer.from(codec.decode(testnetWallet.transparentAddress));
|
|
140
|
+
strict_1.default.deepStrictEqual(script, tAddrScript);
|
|
141
|
+
});
|
|
142
|
+
it('decode: shielded-bound codec returns the raw 43-byte Orchard receiver', function () {
|
|
143
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'shielded');
|
|
144
|
+
const receiver = Buffer.from(codec.decode(testnetWallet.unified));
|
|
145
|
+
strict_1.default.strictEqual(receiver.length, 43);
|
|
146
|
+
const parsed = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.parse(testnetWallet.unified, 'tzec');
|
|
147
|
+
strict_1.default.deepStrictEqual(receiver, Buffer.from(parsed.orchardReceiver));
|
|
148
|
+
});
|
|
149
|
+
it('decode: shielded-bound codec on mainnet returns the raw 43-byte Orchard receiver', function () {
|
|
150
|
+
const codec = new zec_1.ZecAddressCodec('zec', 'zec', 'shielded');
|
|
151
|
+
const receiver = Buffer.from(codec.decode(zip316Mainnet.unified));
|
|
152
|
+
strict_1.default.strictEqual(receiver.length, 43);
|
|
153
|
+
const parsed = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.parse(zip316Mainnet.unified, 'zec');
|
|
154
|
+
strict_1.default.deepStrictEqual(receiver, Buffer.from(parsed.orchardReceiver));
|
|
155
|
+
});
|
|
156
|
+
it('decode: shielded-bound codec resolves an Orchard-only UA to its receiver', function () {
|
|
157
|
+
const orchardOnly = wasm_utxo_1.fixedScriptWallet.ZcashUnifiedAddress.encodeOrchardReceiver(new Uint8Array(43).fill(0x42), 'tzec');
|
|
158
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'shielded');
|
|
159
|
+
const receiver = Buffer.from(codec.decode(orchardOnly));
|
|
160
|
+
strict_1.default.strictEqual(receiver.length, 43);
|
|
161
|
+
strict_1.default.deepStrictEqual(receiver, Buffer.from(new Uint8Array(43).fill(0x42)));
|
|
162
|
+
});
|
|
163
|
+
it('decode: shielded-bound codec throws invalid-address error for a plain transparent address', function () {
|
|
164
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'shielded');
|
|
165
|
+
strict_1.default.throws(() => codec.decode(testnetWallet.transparentAddress), /is not a valid address for network/);
|
|
166
|
+
});
|
|
167
|
+
it('decode: shielded-bound codec throws invalid-address error for a wrong-network UA', function () {
|
|
168
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'shielded');
|
|
169
|
+
strict_1.default.throws(() => codec.decode(zip316Mainnet.unified), /is not a valid address for network/);
|
|
170
|
+
});
|
|
171
|
+
it('decode: shielded-bound codec throws invalid-address error for garbage', function () {
|
|
172
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec', 'shielded');
|
|
173
|
+
strict_1.default.throws(() => codec.decode('not-a-real-address'), /is not a valid address for network/);
|
|
174
|
+
});
|
|
175
|
+
it('decode: throws for garbage', function () {
|
|
176
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
177
|
+
strict_1.default.throws(() => codec.decode('not-a-real-address'));
|
|
178
|
+
});
|
|
179
|
+
// -- encode (inherited) ----------------------------------------------------
|
|
180
|
+
it('encode: round-trips a transparent script to address', function () {
|
|
181
|
+
const codec = new zec_1.ZecAddressCodec('tzec', 'tzec');
|
|
182
|
+
const script = codec.decode(testnetWallet.transparentAddress);
|
|
183
|
+
const address = codec.encode(script);
|
|
184
|
+
strict_1.default.strictEqual(address, testnetWallet.transparentAddress);
|
|
185
|
+
});
|
|
186
|
+
it('encode: round-trips on mainnet', function () {
|
|
187
|
+
const codec = new zec_1.ZecAddressCodec('zec', 'zec');
|
|
188
|
+
const address = 't1cN2ZVWzWcVRrnfeQzmkpLhzQ4dYRv8yRY';
|
|
189
|
+
const script = codec.decode(address);
|
|
190
|
+
strict_1.default.strictEqual(codec.encode(script), address);
|
|
191
|
+
});
|
|
192
|
+
// -- integration: coin.addressCodec ----------------------------------------
|
|
193
|
+
it('coin.addressCodec: zec returns ZecAddressCodec', function () {
|
|
194
|
+
strict_1.default.ok(zec.addressCodec instanceof zec_1.ZecAddressCodec);
|
|
195
|
+
});
|
|
196
|
+
it('coin.addressCodec: tzec returns ZecAddressCodec', function () {
|
|
197
|
+
strict_1.default.ok(tzec.addressCodec instanceof zec_1.ZecAddressCodec);
|
|
198
|
+
});
|
|
199
|
+
it('coin.addressCodec.isValidAddress matches Zec.isValidAddress', function () {
|
|
200
|
+
strict_1.default.strictEqual(zec.addressCodec.isValidAddress(zip316Mainnet.unified), zec.isValidAddress(zip316Mainnet.unified));
|
|
201
|
+
strict_1.default.strictEqual(zec.addressCodec.isValidAddress('t1cN2ZVWzWcVRrnfeQzmkpLhzQ4dYRv8yRY'), zec.isValidAddress('t1cN2ZVWzWcVRrnfeQzmkpLhzQ4dYRv8yRY'));
|
|
202
|
+
strict_1.default.strictEqual(zec.addressCodec.isValidAddress('not-a-real-address'), zec.isValidAddress('not-a-real-address'));
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9pbXBsL3plYy91bml0L2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMsaURBQStDO0FBQy9DLGdEQUFxRDtBQUVyRCxxREFPcUM7QUFFckMsb0RBQW9EO0FBQ3BELDJFQUEyRTtBQUMzRSxvREFBb0Q7QUFDcEQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLHVOQUF1TjtDQUMxTixDQUFDO0FBQ0YsTUFBTSxhQUFhLEdBQUc7SUFDcEIsT0FBTyxFQUNMLDJOQUEyTjtJQUM3TixrQkFBa0IsRUFBRSxxQ0FBcUM7Q0FDMUQsQ0FBQztBQUVGLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtJQUNuQyxJQUFJLEtBQWUsQ0FBQztJQUNwQixJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksSUFBSSxDQUFDO0lBRVQsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLElBQUksa0JBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7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QkFBTSxDQUFDLFdBQVcsQ0FDaEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUN0RCxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FDMUMsQ0FBQztRQUNGLGdCQUFNLENBQUMsV0FBVyxDQUNoQixHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUN0RSxHQUFHLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxDQUFDLENBQzFELENBQUM7UUFDRixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQge1xuICBaZWMsXG4gIFR6ZWMsXG4gIFplY0FkZHJlc3NDb2RlYyxcbiAgZ2V0WmNhc2hBZGRyZXNzS2luZCxcbiAgaXNTaGllbGRlZFpjYXNoQWRkcmVzcyxcbiAgaXNWYWxpZFpjYXNoQWRkcmVzcyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2ltcGwvemVjJztcblxuLy8gWklQLTMxNiB1bmlmaWVkLWFkZHJlc3MgdGVzdCB2ZWN0b3JzLCBjb3BpZWQgZnJvbVxuLy8gQml0R29XQVNNL3BhY2thZ2VzL3dhc20tdXR4by90ZXN0L2ZpeHR1cmVzL3pjYXNoL3VuaWZpZWRfYWRkcmVzcy5qc29uIHNvXG4vLyBib3RoIHJlcG9zIHRlc3QgYWdhaW5zdCB0aGUgc2FtZSBrbm93bi1nb29kIGRhdGEuXG5jb25zdCB6aXAzMTZNYWlubmV0ID0ge1xuICB1bmlmaWVkOlxuICAgICd1MXBnMmFhcGg3anA4cnBmNnloc3phMjU3MjJzZzVmY24zdmFjYTZ6ZTI3aHFqdzdqdnZoaHV4a3BjZzBnZTl4aDZkcnNnZGtkYThxanE1Y2hwZWhrY3B4Zjg3cm5qcnlqcXd5bWRoZXB0cHZubGpxcXJqcXpqd2tjMm1hNmhjcTY2Nmtnd2Z5dHh3YWM4ZXlleDZuZGdyNmV6dGU2NjcwNmUzdmFxcmQyNWR6dnprYzY5a3cwamd5d3RkMGNtcTUycTVsa3c2dWg3aHl2empzZThrc3gnLFxufTtcbmNvbnN0IHRlc3RuZXRXYWxsZXQgPSB7XG4gIHVuaWZpZWQ6XG4gICAgJ3V0ZXN0MXc1bTBxY25wOGVnbDhxYTI5Nm43MG44bnZqMHRxbnprOTBwN2Y0OHY3bWpoaGRyZHFzOHZncXlkc2xnNXBsbXplZmF3ZWZucG1nbWxtNmhjeTM4bTk3MmVyd3hzMDRzMDJjcTJwcmhndXo4a3FseTc1bTZ6ank1Nm0wOGQ1am55Y2d0cHF0amVwcnRlNTc2Z2ttcnh5c3plcGd4NzZ5enV3aGg3bTRsZno5amFxN3VuamsweDVhbnQ0Nmp1eHo3M2hzYzZxNHYzZHF0end3MDB2cHMnLFxuICB0cmFuc3BhcmVudEFkZHJlc3M6ICd0bU00RHZMVkpLWFp0NXlkbjF0cVlUSHZhaHBLU3dnanVSaycsXG59O1xuXG5kZXNjcmliZSgnWmNhc2ggYWRkcmVzcyB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgemVjO1xuICBsZXQgdHplYztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3plYycsIFplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3R6ZWMnLCBUemVjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICB6ZWMgPSBiaXRnby5jb2luKCd6ZWMnKTtcbiAgICB0emVjID0gYml0Z28uY29pbigndHplYycpO1xuICB9KTtcblxuICBpdCgncmVjb2duaXplcyBhIG1haW5uZXQgdW5pZmllZCBhZGRyZXNzIGFzIHNoaWVsZGVkJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuaXNWYWxpZEFkZHJlc3MoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyksICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3plYycpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFpjYXNoQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQsICd6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgdGVzdG5ldCB1bmlmaWVkIGFkZHJlc3MgYXMgc2hpZWxkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR6ZWMuaXNWYWxpZEFkZHJlc3ModGVzdG5ldFdhbGxldC51bmlmaWVkKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQodGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpLCAnc2hpZWxkZWQnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNTaGllbGRlZFpjYXNoQWRkcmVzcyh0ZXN0bmV0V2FsbGV0LnVuaWZpZWQsICd0emVjJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCwgJ3R6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWNvZ25pemVzIGEgdGVzdG5ldCB0cmFuc3BhcmVudCBhZGRyZXNzIGFzIHRyYW5zcGFyZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0emVjLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MsICd0emVjJyksICd0cmFuc3BhcmVudCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzLCAndHplYycpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlY29nbml6ZXMgYSBtYWlubmV0IHRyYW5zcGFyZW50IChQMlBLSCkgYWRkcmVzcyBhcyB0cmFuc3BhcmVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gJ3QxY04yWlZXeldjVlJybmZlUXpta3BMaHpRNGRZUnY4eVJZJztcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoemVjLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCB0cnVlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZChhZGRyZXNzLCAnemVjJyksICd0cmFuc3BhcmVudCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKGFkZHJlc3MsICd6ZWMnKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgZ2FyYmFnZSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZ2FyYmFnZSA9ICdub3QtYS1yZWFsLWFkZHJlc3MnO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuaXNWYWxpZEFkZHJlc3MoZ2FyYmFnZSksIGZhbHNlKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0WmNhc2hBZGRyZXNzS2luZChnYXJiYWdlLCAnemVjJyksIHVuZGVmaW5lZCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRaY2FzaEFkZHJlc3MoZ2FyYmFnZSwgJ3plYycpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGEgdW5pZmllZCBhZGRyZXNzIGNoZWNrZWQgYWdhaW5zdCB0aGUgd3JvbmcgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHplYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCBmYWxzZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldFpjYXNoQWRkcmVzc0tpbmQoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAndHplYycpLCB1bmRlZmluZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1NoaWVsZGVkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3R6ZWMnKSwgZmFsc2UpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkWmNhc2hBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCwgJ3R6ZWMnKSwgZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnWmVjQWRkcmVzc0NvZGVjJywgZnVuY3Rpb24gKCkge1xuICAvLyAtLSBpbnN0YW50aWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgYml0Z286IEJpdEdvQVBJO1xuICBsZXQgemVjO1xuICBsZXQgdHplYztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3plYycsIFplYy5jcmVhdGVJbnN0YW5jZSk7XG4gICAgYml0Z28ucmVnaXN0ZXIoJ3R6ZWMnLCBUemVjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICB6ZWMgPSBiaXRnby5jb2luKCd6ZWMnKTtcbiAgICB0emVjID0gYml0Z28uY29pbigndHplYycpO1xuICB9KTtcblxuICBpdCgnY29uc3RydWN0cyBmb3IgemVjIGFuZCB0emVjJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1haW5uZXQgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJyk7XG4gICAgY29uc3QgdGVzdG5ldCA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYWlubmV0LmNvaW5OYW1lLCAnemVjJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRlc3RuZXQuY29pbk5hbWUsICd0emVjJyk7XG4gIH0pO1xuXG4gIC8vIC0tIGlzVmFsaWRBZGRyZXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIG1haW5uZXQgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3plYycsICd6ZWMnKS5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIHRlc3RuZXQgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKHRlc3RuZXRXYWxsZXQudW5pZmllZCksIHRydWUpO1xuICB9KTtcblxuICBpdCgnaXNWYWxpZEFkZHJlc3M6IGFjY2VwdHMgbWFpbm5ldCBQMlBLSCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycpLmlzVmFsaWRBZGRyZXNzKCd0MWNOMlpWV3pXY1ZScm5mZVF6bWtwTGh6UTRkWVJ2OHlSWScpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiBhY2NlcHRzIHRlc3RuZXQgdHJhbnNwYXJlbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwobmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJykuaXNWYWxpZEFkZHJlc3ModGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpLCB0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiByZWplY3RzIHdyb25nLW5ldHdvcmsgVUEnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZCksIGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ2lzVmFsaWRBZGRyZXNzOiByZWplY3RzIGdhcmJhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycpLmlzVmFsaWRBZGRyZXNzKCdub3QtYS1yZWFsLWFkZHJlc3MnKSwgZmFsc2UpO1xuICB9KTtcblxuICAvLyAtLSBkZWNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGl0KCdkZWNvZGU6IHBsYWluIHRyYW5zcGFyZW50IGFkZHJlc3MgZGVjb2RlcyB0byBQMlBLSCBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKTtcbiAgICBjb25zdCBzY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICAvLyBQMlBLSDogT1BfRFVQIE9QX0hBU0gxNjAgPDIwLWJ5dGUgaGFzaD4gT1BfRVFVQUxWRVJJRlkgT1BfQ0hFQ0tTSUdcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzBdLCAweDc2KTsgLy8gT1BfRFVQXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjcmlwdFsxXSwgMHhhOSk7IC8vIE9QX0hBU0gxNjBcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0WzJdLCAweDE0KTsgLy8gcHVzaCAyMCBieXRlc1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHQubGVuZ3RoLCAyNSk7IC8vIHRvdGFsIFAyUEtIIGxlbmd0aFxuICB9KTtcblxuICBpdCgnZGVjb2RlOiBVQSB3aXRoIHRyYW5zcGFyZW50IHJlY2VpdmVyIGRlY29kZXMgdG8gdGhlIHNhbWUgdHJhbnNwYXJlbnQgc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgLy8gVGhlIHRlc3RuZXQgVUEgY2FycmllcyBhIHRyYW5zcGFyZW50IHJlY2VpdmVyOyBpdCBzaG91bGQgZGVjb2RlIHRvIHRoZVxuICAgIC8vIHNhbWUgc2NyaXB0UHViS2V5IGFzIHRoZSBzdGFuZGFsb25lIHRyYW5zcGFyZW50IGFkZHJlc3MuXG4gICAgY29uc3QgdWFTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgY29uc3QgdEFkZHJTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHVhU2NyaXB0LCB0QWRkclNjcmlwdCk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IFVBIHdpdGggdHJhbnNwYXJlbnQgcmVjZWl2ZXIgZGVjb2RlcyBvbiBtYWlubmV0JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygnemVjJywgJ3plYycpO1xuICAgIGNvbnN0IHNjcmlwdCA9IEJ1ZmZlci5mcm9tKGNvZGVjLmRlY29kZSh6aXAzMTZNYWlubmV0LnVuaWZpZWQpKTtcbiAgICAvLyBQMlBLSCBzdHJ1Y3R1cmUgdGVzdFxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMF0sIDB4NzYpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMV0sIDB4YTkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRbMl0sIDB4MTQpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiB0aHJvd3MgZm9yIGEgVUEgd2l0aG91dCBhIHRyYW5zcGFyZW50IHJlY2VpdmVyIChvcmNoYXJkLW9ubHkpJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIENvbnN0cnVjdCBhbiBPcmNoYXJkLW9ubHkgVUEgYnkgZW5jb2RpbmcgYSBkdW1teSByZWNlaXZlclxuICAgIGNvbnN0IG9yY2hhcmRPbmx5ID0gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hVbmlmaWVkQWRkcmVzcy5lbmNvZGVPcmNoYXJkUmVjZWl2ZXIoXG4gICAgICBuZXcgVWludDhBcnJheSg0MykuZmlsbCgweDQyKSxcbiAgICAgICd0emVjJ1xuICAgICk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNvZGVjLmRlY29kZShvcmNoYXJkT25seSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBleHBsaWNpdCB0cmFuc3BhcmVudC1ib3VuZCBjb2RlYyByZXR1cm5zIHRoZSB0cmFuc3BhcmVudCBzY3JpcHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd0emVjJywgJ3R6ZWMnLCAndHJhbnNwYXJlbnQnKTtcbiAgICBjb25zdCBzY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgY29uc3QgdEFkZHJTY3JpcHQgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC50cmFuc3BhcmVudEFkZHJlc3MpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNjcmlwdCwgdEFkZHJTY3JpcHQpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyByZXR1cm5zIHRoZSByYXcgNDMtYnl0ZSBPcmNoYXJkIHJlY2VpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJywgJ3NoaWVsZGVkJyk7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUodGVzdG5ldFdhbGxldC51bmlmaWVkKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGNvbnN0IHBhcnNlZCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UodGVzdG5ldFdhbGxldC51bmlmaWVkLCAndHplYycpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjZWl2ZXIsIEJ1ZmZlci5mcm9tKHBhcnNlZC5vcmNoYXJkUmVjZWl2ZXIgYXMgVWludDhBcnJheSkpO1xuICB9KTtcblxuICBpdCgnZGVjb2RlOiBzaGllbGRlZC1ib3VuZCBjb2RlYyBvbiBtYWlubmV0IHJldHVybnMgdGhlIHJhdyA0My1ieXRlIE9yY2hhcmQgcmVjZWl2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgWmVjQWRkcmVzc0NvZGVjKCd6ZWMnLCAnemVjJywgJ3NoaWVsZGVkJyk7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBCdWZmZXIuZnJvbShjb2RlYy5kZWNvZGUoemlwMzE2TWFpbm5ldC51bmlmaWVkKSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGNvbnN0IHBhcnNlZCA9IGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoVW5pZmllZEFkZHJlc3MucGFyc2UoemlwMzE2TWFpbm5ldC51bmlmaWVkLCAnemVjJyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWNlaXZlciwgQnVmZmVyLmZyb20ocGFyc2VkLm9yY2hhcmRSZWNlaXZlciBhcyBVaW50OEFycmF5KSk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHJlc29sdmVzIGFuIE9yY2hhcmQtb25seSBVQSB0byBpdHMgcmVjZWl2ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgb3JjaGFyZE9ubHkgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaFVuaWZpZWRBZGRyZXNzLmVuY29kZU9yY2hhcmRSZWNlaXZlcihcbiAgICAgIG5ldyBVaW50OEFycmF5KDQzKS5maWxsKDB4NDIpLFxuICAgICAgJ3R6ZWMnXG4gICAgKTtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGNvbnN0IHJlY2VpdmVyID0gQnVmZmVyLmZyb20oY29kZWMuZGVjb2RlKG9yY2hhcmRPbmx5KSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlY2VpdmVyLmxlbmd0aCwgNDMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVjZWl2ZXIsIEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KDQzKS5maWxsKDB4NDIpKSk7XG4gIH0pO1xuXG4gIGl0KCdkZWNvZGU6IHNoaWVsZGVkLWJvdW5kIGNvZGVjIHRocm93cyBpbnZhbGlkLWFkZHJlc3MgZXJyb3IgZm9yIGEgcGxhaW4gdHJhbnNwYXJlbnQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgdGhyb3dzIGludmFsaWQtYWRkcmVzcyBlcnJvciBmb3IgYSB3cm9uZy1uZXR3b3JrIFVBJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJywgJ3NoaWVsZGVkJyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy5kZWNvZGUoemlwMzE2TWFpbm5ldC51bmlmaWVkKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogc2hpZWxkZWQtYm91bmQgY29kZWMgdGhyb3dzIGludmFsaWQtYWRkcmVzcyBlcnJvciBmb3IgZ2FyYmFnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3R6ZWMnLCAndHplYycsICdzaGllbGRlZCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY29kZWMuZGVjb2RlKCdub3QtYS1yZWFsLWFkZHJlc3MnKSwgL2lzIG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yIG5ldHdvcmsvKTtcbiAgfSk7XG5cbiAgaXQoJ2RlY29kZTogdGhyb3dzIGZvciBnYXJiYWdlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBjb2RlYy5kZWNvZGUoJ25vdC1hLXJlYWwtYWRkcmVzcycpKTtcbiAgfSk7XG5cbiAgLy8gLS0gZW5jb2RlIChpbmhlcml0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBpdCgnZW5jb2RlOiByb3VuZC10cmlwcyBhIHRyYW5zcGFyZW50IHNjcmlwdCB0byBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNvZGVjID0gbmV3IFplY0FkZHJlc3NDb2RlYygndHplYycsICd0emVjJyk7XG4gICAgY29uc3Qgc2NyaXB0ID0gY29kZWMuZGVjb2RlKHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKTtcbiAgICBjb25zdCBhZGRyZXNzID0gY29kZWMuZW5jb2RlKHNjcmlwdCk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZHJlc3MsIHRlc3RuZXRXYWxsZXQudHJhbnNwYXJlbnRBZGRyZXNzKTtcbiAgfSk7XG5cbiAgaXQoJ2VuY29kZTogcm91bmQtdHJpcHMgb24gbWFpbm5ldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2RlYyA9IG5ldyBaZWNBZGRyZXNzQ29kZWMoJ3plYycsICd6ZWMnKTtcbiAgICBjb25zdCBhZGRyZXNzID0gJ3QxY04yWlZXeldjVlJybmZlUXpta3BMaHpRNGRZUnY4eVJZJztcbiAgICBjb25zdCBzY3JpcHQgPSBjb2RlYy5kZWNvZGUoYWRkcmVzcyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvZGVjLmVuY29kZShzY3JpcHQpLCBhZGRyZXNzKTtcbiAgfSk7XG5cbiAgLy8gLS0gaW50ZWdyYXRpb246IGNvaW4uYWRkcmVzc0NvZGVjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBpdCgnY29pbi5hZGRyZXNzQ29kZWM6IHplYyByZXR1cm5zIFplY0FkZHJlc3NDb2RlYycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQub2soemVjLmFkZHJlc3NDb2RlYyBpbnN0YW5jZW9mIFplY0FkZHJlc3NDb2RlYyk7XG4gIH0pO1xuXG4gIGl0KCdjb2luLmFkZHJlc3NDb2RlYzogdHplYyByZXR1cm5zIFplY0FkZHJlc3NDb2RlYycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQub2sodHplYy5hZGRyZXNzQ29kZWMgaW5zdGFuY2VvZiBaZWNBZGRyZXNzQ29kZWMpO1xuICB9KTtcblxuICBpdCgnY29pbi5hZGRyZXNzQ29kZWMuaXNWYWxpZEFkZHJlc3MgbWF0Y2hlcyBaZWMuaXNWYWxpZEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgemVjLmFkZHJlc3NDb2RlYy5pc1ZhbGlkQWRkcmVzcyh6aXAzMTZNYWlubmV0LnVuaWZpZWQpLFxuICAgICAgemVjLmlzVmFsaWRBZGRyZXNzKHppcDMxNk1haW5uZXQudW5pZmllZClcbiAgICApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIHplYy5hZGRyZXNzQ29kZWMuaXNWYWxpZEFkZHJlc3MoJ3QxY04yWlZXeldjVlJybmZlUXpta3BMaHpRNGRZUnY4eVJZJyksXG4gICAgICB6ZWMuaXNWYWxpZEFkZHJlc3MoJ3QxY04yWlZXeldjVlJybmZlUXpta3BMaHpRNGRZUnY4eVJZJylcbiAgICApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh6ZWMuYWRkcmVzc0NvZGVjLmlzVmFsaWRBZGRyZXNzKCdub3QtYS1yZWFsLWFkZHJlc3MnKSwgemVjLmlzVmFsaWRBZGRyZXNzKCdub3QtYS1yZWFsLWFkZHJlc3MnKSk7XG4gIH0pO1xufSk7XG4iXX0=
|