@bitgo/sdk-lib-safes 1.4.0 → 1.6.0

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.
@@ -26,9 +26,20 @@ export declare function decodeDerivableEd25519Pub(composite: string): {
26
26
  };
27
27
  /** Generate a fresh raw 32-byte chain code for root composition. */
28
28
  export declare function generateEd25519ChainCode(): Buffer;
29
+ /** Encode a raw 32-byte chain code as canonical unpadded RFC 4648 base32 (52 characters). */
30
+ export declare function encodeEd25519ChainCode(chainCode: Buffer): string;
31
+ /** Decode a canonical base32 chain code into its raw 32-byte buffer. */
32
+ export declare function decodeEd25519ChainCode(chainCode: string): Buffer;
29
33
  export declare function decodeEd25519StrKeyPublicKey(pub: string): Buffer;
30
34
  export declare function isValidEd25519StrKeyPublicKey(pub: string): boolean;
31
35
  export declare function decodeEd25519StrKeySecretSeed(seed: string): Buffer;
32
36
  export declare function encodeEd25519StrKeyPublicKey(rawPub: Buffer): string;
37
+ export declare function encodeEd25519StrKeySecretSeed(rawSeed: Buffer): string;
33
38
  export declare function isChecksumValidStrKeyEd25519Pub(pub: string): boolean;
39
+ /** Encode a raw 32-byte key (secret seed or public key) as an Algorand 58-character base32 value. */
40
+ export declare function encodeAlgoKey(bytes: Buffer): string;
41
+ /** Encode a raw 32-byte public key as a DER-prefixed Hedera public key (88 hex chars). */
42
+ export declare function encodeHbarPublicKeyDer(pub: Buffer): string;
43
+ /** Encode a raw 32-byte secret seed as a DER-prefixed Hedera private key (96 hex chars). */
44
+ export declare function encodeHbarPrivateKeyDer(seed: Buffer): string;
34
45
  //# sourceMappingURL=ed25519Pub.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ed25519Pub.d.ts","sourceRoot":"","sources":["../../src/ed25519Pub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,eAAO,MAAM,kCAAkC,KAAK,CAAC;AACrD,eAAO,MAAM,kCAAkC,KAAK,CAAC;AACrD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAoEhD,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAO/F;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOpE"}
1
+ {"version":3,"file":"ed25519Pub.d.ts","sourceRoot":"","sources":["../../src/ed25519Pub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,eAAO,MAAM,kCAAkC,KAAK,CAAC;AACrD,eAAO,MAAM,kCAAkC,KAAK,CAAC;AACrD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAwEhD,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAO/F;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOpE;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D"}
@@ -11,6 +11,9 @@
11
11
  * The WASM soft-derivation (`softDeriveChildPubEd25519`) stays in sdk-core's
12
12
  * bitgo/safe/derivableEd25519Pub — it needs Ed25519BIP32/Eddsa and is not part of this leaf.
13
13
  */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
14
17
  Object.defineProperty(exports, "__esModule", { value: true });
15
18
  exports.DERIVABLE_ED25519_PUB_LENGTH = exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES = void 0;
16
19
  exports.isDerivableEd25519Pub = isDerivableEd25519Pub;
@@ -18,22 +21,33 @@ exports.assertDerivableEd25519Pub = assertDerivableEd25519Pub;
18
21
  exports.encodeDerivableEd25519Pub = encodeDerivableEd25519Pub;
19
22
  exports.decodeDerivableEd25519Pub = decodeDerivableEd25519Pub;
20
23
  exports.generateEd25519ChainCode = generateEd25519ChainCode;
24
+ exports.encodeEd25519ChainCode = encodeEd25519ChainCode;
25
+ exports.decodeEd25519ChainCode = decodeEd25519ChainCode;
21
26
  exports.decodeEd25519StrKeyPublicKey = decodeEd25519StrKeyPublicKey;
22
27
  exports.isValidEd25519StrKeyPublicKey = isValidEd25519StrKeyPublicKey;
23
28
  exports.decodeEd25519StrKeySecretSeed = decodeEd25519StrKeySecretSeed;
24
29
  exports.encodeEd25519StrKeyPublicKey = encodeEd25519StrKeyPublicKey;
30
+ exports.encodeEd25519StrKeySecretSeed = encodeEd25519StrKeySecretSeed;
25
31
  exports.isChecksumValidStrKeyEd25519Pub = isChecksumValidStrKeyEd25519Pub;
32
+ exports.encodeAlgoKey = encodeAlgoKey;
33
+ exports.encodeHbarPublicKeyDer = encodeHbarPublicKeyDer;
34
+ exports.encodeHbarPrivateKeyDer = encodeHbarPrivateKeyDer;
26
35
  const crypto_1 = require("crypto");
36
+ const js_sha512_1 = __importDefault(require("js-sha512"));
27
37
  exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES = 32;
28
38
  exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES = 32;
29
39
  exports.DERIVABLE_ED25519_PUB_LENGTH = 103;
30
40
  const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
31
41
  const BASE32_ROOT_REGEX = /^[A-Z2-7]{103}$/;
42
+ const CHAIN_CODE_REGEX = /^[A-Z2-7]{52}$/;
32
43
  const STRKEY_PUBLIC_KEY_REGEX = /^G[A-Z2-7]{55}$/;
33
44
  const STRKEY_SECRET_SEED_REGEX = /^S[A-Z2-7]{55}$/;
34
45
  const STRKEY_VERSION_PUBLIC_KEY = 6 << 3;
35
46
  const STRKEY_VERSION_SECRET_SEED = 18 << 3;
36
47
  const STRKEY_DECODED_BYTES = 35;
48
+ const ALGORAND_CHECKSUM_BYTES = 4;
49
+ const HBAR_PUBLIC_KEY_PREFIX = '302a300506032b6570032100';
50
+ const HBAR_PRIVATE_KEY_PREFIX = '302e020100300506032b657004220420';
37
51
  function base32Decode(input) {
38
52
  const output = Buffer.alloc(Math.floor((input.length * 5) / 8));
39
53
  let bits = 0;
@@ -116,6 +130,20 @@ function decodeDerivableEd25519Pub(composite) {
116
130
  function generateEd25519ChainCode() {
117
131
  return (0, crypto_1.randomBytes)(exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES);
118
132
  }
133
+ /** Encode a raw 32-byte chain code as canonical unpadded RFC 4648 base32 (52 characters). */
134
+ function encodeEd25519ChainCode(chainCode) {
135
+ if (chainCode.length !== exports.DERIVABLE_ED25519_CHAIN_CODE_BYTES) {
136
+ throw new Error('Invalid ed25519 chain code: expected 32 bytes');
137
+ }
138
+ return base32Encode(chainCode);
139
+ }
140
+ /** Decode a canonical base32 chain code into its raw 32-byte buffer. */
141
+ function decodeEd25519ChainCode(chainCode) {
142
+ if (!CHAIN_CODE_REGEX.test(chainCode) || base32Encode(base32Decode(chainCode)) !== chainCode) {
143
+ throw new Error('Invalid ed25519 chain code: expected canonical 52-character base32');
144
+ }
145
+ return base32Decode(chainCode);
146
+ }
119
147
  function decodeEd25519StrKeyPublicKey(pub) {
120
148
  if (!STRKEY_PUBLIC_KEY_REGEX.test(pub)) {
121
149
  throw new Error('Invalid ed25519 StrKey public key');
@@ -146,6 +174,15 @@ function encodeEd25519StrKeyPublicKey(rawPub) {
146
174
  checksum.writeUInt16LE(crc16Xmodem(payload), 0);
147
175
  return base32Encode(Buffer.concat([payload, checksum]));
148
176
  }
177
+ function encodeEd25519StrKeySecretSeed(rawSeed) {
178
+ if (rawSeed.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
179
+ throw new Error('ed25519 secret seed must be 32 bytes');
180
+ }
181
+ const payload = Buffer.concat([Buffer.from([STRKEY_VERSION_SECRET_SEED]), rawSeed]);
182
+ const checksum = Buffer.alloc(2);
183
+ checksum.writeUInt16LE(crc16Xmodem(payload), 0);
184
+ return base32Encode(Buffer.concat([payload, checksum]));
185
+ }
149
186
  function isChecksumValidStrKeyEd25519Pub(pub) {
150
187
  try {
151
188
  decodeEd25519StrKeyPublicKey(pub);
@@ -155,4 +192,26 @@ function isChecksumValidStrKeyEd25519Pub(pub) {
155
192
  return false;
156
193
  }
157
194
  }
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZDI1NTE5UHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBMkVILHNEQUVDO0FBR0QsOERBSUM7QUFHRCw4REFLQztBQUdELDhEQU9DO0FBR0QsNERBRUM7QUFFRCxvRUFLQztBQUVELHNFQU9DO0FBRUQsc0VBS0M7QUFFRCxvRUFRQztBQUVELDBFQU9DO0FBbkpELG1DQUFxQztBQUV4QixRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQztBQUN4QyxRQUFBLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQUVoRCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFDbEQsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNuRCxNQUFNLHlCQUF5QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRWhDLFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIs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QUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQWdCLCtCQUErQixDQUFDLEdBQVc7SUFDekQsSUFBSSxDQUFDO1FBQ0gsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogRWQyNTUxOSBzYWZlLXJvb3QgcHVibGljIGRlcml2YXRpb24gbWF0ZXJpYWwgYW5kIFN0ZWxsYXIgdXNlci1rZXkgY29kZWNzLlxuICpcbiAqIFNhZmUgYmFja3VwIGFuZCBCaXRHbyByb290cyBzdG9yZSByYXcgcHVibGljIGtleSAoMzIgYnl0ZXMpIHx8IHJhdyBjaGFpbiBjb2RlICgzMiBieXRlcyksXG4gKiBlbmNvZGVkIHRvZ2V0aGVyIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIuIENvaW4tc3BlY2lmaWMgcHVibGljLWtleSBlbmNvZGluZ3MgYXJlXG4gKiBhcHBsaWVkIG9ubHkgdG8gZGVyaXZlZCB3YWxsZXQgY2hpbGRyZW4uXG4gKlxuICogVGhlIFdBU00gc29mdC1kZXJpdmF0aW9uIChgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOWApIHN0YXlzIGluIHNkay1jb3JlJ3NcbiAqIGJpdGdvL3NhZmUvZGVyaXZhYmxlRWQyNTUxOVB1YiDigJQgaXQgbmVlZHMgRWQyNTUxOUJJUDMyL0VkZHNhIGFuZCBpcyBub3QgcGFydCBvZiB0aGlzIGxlYWYuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5leHBvcnQgY29uc3QgREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUyA9IDMyO1xuZXhwb3J0IGNvbnN0IERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMgPSAzMjtcbmV4cG9ydCBjb25zdCBERVJJVkFCTEVfRUQyNTUxOV9QVUJfTEVOR1RIID0gMTAzO1xuXG5jb25zdCBCQVNFMzJfQUxQSEFCRVQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjcnO1xuY29uc3QgQkFTRTMyX1JPT1RfUkVHRVggPSAvXltBLVoyLTddezEwM30kLztcbmNvbnN0IFNUUktFWV9QVUJMSUNfS0VZX1JFR0VYID0gL15HW0EtWjItN117NTV9JC87XG5jb25zdCBTVFJLRVlfU0VDUkVUX1NFRURfUkVHRVggPSAvXlNbQS1aMi03XXs1NX0kLztcbmNvbnN0IFNUUktFWV9WRVJTSU9OX1BVQkxJQ19LRVkgPSA2IDw8IDM7XG5jb25zdCBTVFJLRVlfVkVSU0lPTl9TRUNSRVRfU0VFRCA9IDE4IDw8IDM7XG5jb25zdCBTVFJLRVlfREVDT0RFRF9CWVRFUyA9IDM1O1xuXG5mdW5jdGlvbiBiYXNlMzJEZWNvZGUoaW5wdXQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IG91dHB1dCA9IEJ1ZmZlci5hbGxvYyhNYXRoLmZsb29yKChpbnB1dC5sZW5ndGggKiA1KSAvIDgpKTtcbiAgbGV0IGJpdHMgPSAwO1xuICBsZXQgdmFsdWUgPSAwO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaGFyIG9mIGlucHV0KSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgNSkgfCBCQVNFMzJfQUxQSEFCRVQuaW5kZXhPZihjaGFyKTtcbiAgICBiaXRzICs9IDU7XG4gICAgaWYgKGJpdHMgPj0gOCkge1xuICAgICAgYml0cyAtPSA4O1xuICAgICAgb3V0cHV0W29mZnNldCsrXSA9ICh2YWx1ZSA+Pj4gYml0cykgJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBiYXNlMzJFbmNvZGUoZGF0YTogQnVmZmVyKTogc3RyaW5nIHtcbiAgbGV0IGJpdHMgPSAwO1xuICBsZXQgdmFsdWUgPSAwO1xuICBsZXQgb3V0cHV0ID0gJyc7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBieXRlO1xuICAgIGJpdHMgKz0gODtcbiAgICB3aGlsZSAoYml0cyA+PSA1KSB7XG4gICAgICBiaXRzIC09IDU7XG4gICAgICBvdXRwdXQgKz0gQkFTRTMyX0FMUEhBQkVUWyh2YWx1ZSA+Pj4gYml0cykgJiAweDFmXTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpdHMgPiAwKSB7XG4gICAgb3V0cHV0ICs9IEJBU0UzMl9BTFBIQUJFVFsodmFsdWUgPDwgKDUgLSBiaXRzKSkgJiAweDFmXTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBjcmMxNlhtb2RlbShkYXRhOiBCdWZmZXIpOiBudW1iZXIge1xuICBsZXQgY3JjID0gMDtcbiAgZm9yIChjb25zdCBieXRlIG9mIGRhdGEpIHtcbiAgICBjcmMgXj0gYnl0ZSA8PCA4O1xuICAgIGZvciAobGV0IGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7XG4gICAgICBjcmMgPSBjcmMgJiAweDgwMDAgPyAoKGNyYyA8PCAxKSBeIDB4MTAyMSkgJiAweGZmZmYgOiAoY3JjIDw8IDEpICYgMHhmZmZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3JjO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVTdHJLZXkodmFsdWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyLCBsYWJlbDogc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMkRlY29kZSh2YWx1ZSk7XG4gIGlmIChcbiAgICBkZWNvZGVkLmxlbmd0aCAhPT0gU1RSS0VZX0RFQ09ERURfQllURVMgfHxcbiAgICBkZWNvZGVkWzBdICE9PSB2ZXJzaW9uIHx8XG4gICAgYmFzZTMyRW5jb2RlKGRlY29kZWQpICE9PSB2YWx1ZSB8fFxuICAgIGNyYzE2WG1vZGVtKGRlY29kZWQuc3ViYXJyYXkoMCwgU1RSS0VZX0RFQ09ERURfQllURVMgLSAyKSkgIT09IGRlY29kZWQucmVhZFVJbnQxNkxFKFNUUktFWV9ERUNPREVEX0JZVEVTIC0gMilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVkMjU1MTkgU3RyS2V5ICR7bGFiZWx9YCk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWQuc3ViYXJyYXkoMSwgMzMpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGZvciBjYW5vbmljYWwgYmFzZTMyLWVuY29kZWQgNjQtYnl0ZSBwdWJsaWMgZGVyaXZhdGlvbiBtYXRlcmlhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rlcml2YWJsZUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJBU0UzMl9ST09UX1JFR0VYLnRlc3QocHViKSAmJiBiYXNlMzJFbmNvZGUoYmFzZTMyRGVjb2RlKHB1YikpID09PSBwdWI7XG59XG5cbi8qKiBUaHJvd3MgdW5sZXNzIHRoZSB2YWx1ZSBpcyBjYW5vbmljYWwgYmFzZTMyLWVuY29kZWQgNjQtYnl0ZSByb290IG1hdGVyaWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlcml2YWJsZUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFpc0Rlcml2YWJsZUVkMjU1MTlQdWIocHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWI6IGV4cGVjdGVkIDY0IGJ5dGVzIG9mIGNhbm9uaWNhbCBiYXNlMzInKTtcbiAgfVxufVxuXG4vKiogQ29tcG9zZSByYXcgcHVibGljLWtleSBhbmQgY2hhaW4tY29kZSBieXRlcyBpbnRvIG9uZSBiYXNlMzIgcm9vdCB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHB1YjogQnVmZmVyLCBjaGFpbkNvZGU6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmIChwdWIubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTIHx8IGNoYWluQ29kZS5sZW5ndGggIT09IERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViOiBleHBlY3RlZCAzMi1ieXRlIHB1YmxpYyBrZXkgYW5kIGNoYWluIGNvZGUgYnVmZmVycycpO1xuICB9XG4gIHJldHVybiBiYXNlMzJFbmNvZGUoQnVmZmVyLmNvbmNhdChbcHViLCBjaGFpbkNvZGVdKSk7XG59XG5cbi8qKiBEZWNvZGUgYSBiYXNlMzIgcm9vdCBpbnRvIHJhdyBwdWJsaWMta2V5IGFuZCBjaGFpbi1jb2RlIGJ1ZmZlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yihjb21wb3NpdGU6IHN0cmluZyk6IHsgcHViOiBCdWZmZXI7IGNoYWluQ29kZTogQnVmZmVyIH0ge1xuICBhc3NlcnREZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZSk7XG4gIGNvbnN0IGRlY29kZWQgPSBiYXNlMzJEZWNvZGUoY29tcG9zaXRlKTtcbiAgcmV0dXJuIHtcbiAgICBwdWI6IGRlY29kZWQuc3ViYXJyYXkoMCwgREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUyksXG4gICAgY2hhaW5Db2RlOiBkZWNvZGVkLnN1YmFycmF5KERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpLFxuICB9O1xufVxuXG4vKiogR2VuZXJhdGUgYSBmcmVzaCByYXcgMzItYnl0ZSBjaGFpbiBjb2RlIGZvciByb290IGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSgpOiBCdWZmZXIge1xuICByZXR1cm4gcmFuZG9tQnl0ZXMoREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yjogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFTVFJLRVlfUFVCTElDX0tFWV9SRUdFWC50ZXN0KHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWQyNTUxOSBTdHJLZXkgcHVibGljIGtleScpO1xuICB9XG4gIHJldHVybiBkZWNvZGVTdHJLZXkocHViLCBTVFJLRVlfVkVSU0lPTl9QVUJMSUNfS0VZLCAncHVibGljIGtleScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHB1Yik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQoc2VlZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFTVFJLRVlfU0VDUkVUX1NFRURfUkVHRVgudGVzdChzZWVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlZDI1NTE5IFN0cktleSBzZWNyZXQgc2VlZCcpO1xuICB9XG4gIHJldHVybiBkZWNvZGVTdHJLZXkoc2VlZCwgU1RSS0VZX1ZFUlNJT05fU0VDUkVUX1NFRUQsICdzZWNyZXQgc2VlZCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShyYXdQdWI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmIChyYXdQdWIubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlZDI1NTE5IHB1YmxpYyBrZXkgbXVzdCBiZSAzMiBieXRlcycpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbU1RSS0VZX1ZFUlNJT05fUFVCTElDX0tFWV0pLCByYXdQdWJdKTtcbiAgY29uc3QgY2hlY2tzdW0gPSBCdWZmZXIuYWxsb2MoMik7XG4gIGNoZWNrc3VtLndyaXRlVUludDE2TEUoY3JjMTZYbW9kZW0ocGF5bG9hZCksIDApO1xuICByZXR1cm4gYmFzZTMyRW5jb2RlKEJ1ZmZlci5jb25jYXQoW3BheWxvYWQsIGNoZWNrc3VtXSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDaGVja3N1bVZhbGlkU3RyS2V5RWQyNTUxOVB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocHViKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
195
+ /** Encode a raw 32-byte key (secret seed or public key) as an Algorand 58-character base32 value. */
196
+ function encodeAlgoKey(bytes) {
197
+ if (bytes.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
198
+ throw new Error('ed25519 key must be 32 bytes');
199
+ }
200
+ const checksum = Buffer.from(js_sha512_1.default.sha512_256.array(bytes).slice(28, 28 + ALGORAND_CHECKSUM_BYTES));
201
+ return base32Encode(Buffer.concat([bytes, checksum]));
202
+ }
203
+ /** Encode a raw 32-byte public key as a DER-prefixed Hedera public key (88 hex chars). */
204
+ function encodeHbarPublicKeyDer(pub) {
205
+ if (pub.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
206
+ throw new Error('ed25519 public key must be 32 bytes');
207
+ }
208
+ return HBAR_PUBLIC_KEY_PREFIX + pub.toString('hex');
209
+ }
210
+ /** Encode a raw 32-byte secret seed as a DER-prefixed Hedera private key (96 hex chars). */
211
+ function encodeHbarPrivateKeyDer(seed) {
212
+ if (seed.length !== exports.DERIVABLE_ED25519_PUBLIC_KEY_BYTES) {
213
+ throw new Error('ed25519 secret seed must be 32 bytes');
214
+ }
215
+ return HBAR_PRIVATE_KEY_PREFIX + seed.toString('hex');
216
+ }
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZDI1NTE5UHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7Ozs7O0FBZ0ZILHNEQUVDO0FBR0QsOERBSUM7QUFHRCw4REFLQztBQUdELDhEQU9DO0FBR0QsNERBRUM7QUFHRCx3REFLQztBQUdELHdEQUtDO0FBRUQsb0VBS0M7QUFFRCxzRUFPQztBQUVELHNFQUtDO0FBRUQsb0VBUUM7QUFFRCxzRUFRQztBQUVELDBFQU9DO0FBR0Qsc0NBTUM7QUFHRCx3REFLQztBQUdELDBEQUtDO0FBM01ELG1DQUFxQztBQUNyQywwREFBK0I7QUFFbEIsUUFBQSxrQ0FBa0MsR0FBRyxFQUFFLENBQUM7QUFDeEMsUUFBQSxrQ0FBa0MsR0FBRyxFQUFFLENBQUM7QUFDeEMsUUFBQSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFFaEQsTUFBTSxlQUFlLEdBQUcsa0NBQWtDLENBQUM7QUFDM0QsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztBQUM1QyxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0FBQzFDLE1BQU0sdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7QUFDbEQsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNuRCxNQUFNLHlCQUF5QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsMEJBQTBCLENBQUM7QUFDMUQsTUFBTSx1QkFBdUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUVuRSxTQUFTLFlBQVksQ0FBQyxLQUFhO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLENBQUM7UUFDVixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNkLElBQUksSUFBSSxDQUFDLENBQUM7WUFDVixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLENBQUM7UUFDVixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQixJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ1YsTUFBTSxJQUFJLGVBQWUsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLGVBQWUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBWTtJQUMvQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWEsRUFBRSxPQUFlLEVBQUUsS0FBYTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsSUFDRSxPQUFPLENBQUMsTUFBTSxLQUFLLG9CQUFvQjtRQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTztRQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSztRQUMvQixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsWUFBWSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUM3RyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLFNBQWdCLHFCQUFxQixDQUFDLEdBQVc7SUFDL0MsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztBQUNoRixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLFNBQWdCLHlCQUF5QixDQUFDLEdBQVc7SUFDbkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQzFGLENBQUM7QUFDSCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQWdCLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxTQUFpQjtJQUN0RSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssMENBQWtDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSywwQ0FBa0MsRUFBRSxDQUFDO1FBQ2pILE1BQU0sSUFBSSxLQUFLLENBQUMsbUZBQW1GLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxTQUFnQix5QkFBeUIsQ0FBQyxTQUFpQjtJQUN6RCx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsT0FBTztRQUNMLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSwwQ0FBa0MsQ0FBQztRQUM1RCxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQywwQ0FBa0MsQ0FBQztLQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxTQUFnQix3QkFBd0I7SUFDdEMsT0FBTyxJQUFBLG9CQUFXLEVBQUMsMENBQWtDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLFNBQWdCLHNCQUFzQixDQUFDLFNBQWlCO0lBQ3RELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSywwQ0FBa0MsRUFBRSxDQUFDO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFnQixzQkFBc0IsQ0FBQyxTQUFpQjtJQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3RixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFnQiw0QkFBNEIsQ0FBQyxHQUFXO0lBQ3RELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsR0FBVztJQUN2RCxJQUFJLENBQUM7UUFDSCw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQUMsSUFBWTtJQUN4RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELFNBQWdCLDRCQUE0QixDQUFDLE1BQWM7SUFDekQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLDBDQUFrQyxFQUFFLENBQUM7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUFDLE9BQWU7SUFDM0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLDBDQUFrQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQWdCLCtCQUErQixDQUFDLEdBQVc7SUFDekQsSUFBSSxDQUFDO1FBQ0gsNEJBQTRCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELHFHQUFxRztBQUNyRyxTQUFnQixhQUFhLENBQUMsS0FBYTtJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssMENBQWtDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUNyRyxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQWdCLHNCQUFzQixDQUFDLEdBQVc7SUFDaEQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLDBDQUFrQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxPQUFPLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixTQUFnQix1QkFBdUIsQ0FBQyxJQUFZO0lBQ2xELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSywwQ0FBa0MsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsT0FBTyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEVkMjU1MTkgc2FmZS1yb290IHB1YmxpYyBkZXJpdmF0aW9uIG1hdGVyaWFsIGFuZCBTdGVsbGFyIHVzZXIta2V5IGNvZGVjcy5cbiAqXG4gKiBTYWZlIGJhY2t1cCBhbmQgQml0R28gcm9vdHMgc3RvcmUgcmF3IHB1YmxpYyBrZXkgKDMyIGJ5dGVzKSB8fCByYXcgY2hhaW4gY29kZSAoMzIgYnl0ZXMpLFxuICogZW5jb2RlZCB0b2dldGhlciBhcyBjYW5vbmljYWwgdW5wYWRkZWQgUkZDIDQ2NDggYmFzZTMyLiBDb2luLXNwZWNpZmljIHB1YmxpYy1rZXkgZW5jb2RpbmdzIGFyZVxuICogYXBwbGllZCBvbmx5IHRvIGRlcml2ZWQgd2FsbGV0IGNoaWxkcmVuLlxuICpcbiAqIFRoZSBXQVNNIHNvZnQtZGVyaXZhdGlvbiAoYHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTlgKSBzdGF5cyBpbiBzZGstY29yZSdzXG4gKiBiaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIg4oCUIGl0IG5lZWRzIEVkMjU1MTlCSVAzMi9FZGRzYSBhbmQgaXMgbm90IHBhcnQgb2YgdGhpcyBsZWFmLlxuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBzaGE1MTIgZnJvbSAnanMtc2hhNTEyJztcblxuZXhwb3J0IGNvbnN0IERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMgPSAzMjtcbmV4cG9ydCBjb25zdCBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTID0gMzI7XG5leHBvcnQgY29uc3QgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCA9IDEwMztcblxuY29uc3QgQkFTRTMyX0FMUEhBQkVUID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3JztcbmNvbnN0IEJBU0UzMl9ST09UX1JFR0VYID0gL15bQS1aMi03XXsxMDN9JC87XG5jb25zdCBDSEFJTl9DT0RFX1JFR0VYID0gL15bQS1aMi03XXs1Mn0kLztcbmNvbnN0IFNUUktFWV9QVUJMSUNfS0VZX1JFR0VYID0gL15HW0EtWjItN117NTV9JC87XG5jb25zdCBTVFJLRVlfU0VDUkVUX1NFRURfUkVHRVggPSAvXlNbQS1aMi03XXs1NX0kLztcbmNvbnN0IFNUUktFWV9WRVJTSU9OX1BVQkxJQ19LRVkgPSA2IDw8IDM7XG5jb25zdCBTVFJLRVlfVkVSU0lPTl9TRUNSRVRfU0VFRCA9IDE4IDw8IDM7XG5jb25zdCBTVFJLRVlfREVDT0RFRF9CWVRFUyA9IDM1O1xuY29uc3QgQUxHT1JBTkRfQ0hFQ0tTVU1fQllURVMgPSA0O1xuY29uc3QgSEJBUl9QVUJMSUNfS0VZX1BSRUZJWCA9ICczMDJhMzAwNTA2MDMyYjY1NzAwMzIxMDAnO1xuY29uc3QgSEJBUl9QUklWQVRFX0tFWV9QUkVGSVggPSAnMzAyZTAyMDEwMDMwMDUwNjAzMmI2NTcwMDQyMjA0MjAnO1xuXG5mdW5jdGlvbiBiYXNlMzJEZWNvZGUoaW5wdXQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIGNvbnN0IG91dHB1dCA9IEJ1ZmZlci5hbGxvYyhNYXRoLmZsb29yKChpbnB1dC5sZW5ndGggKiA1KSAvIDgpKTtcbiAgbGV0IGJpdHMgPSAwO1xuICBsZXQgdmFsdWUgPSAwO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaGFyIG9mIGlucHV0KSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgNSkgfCBCQVNFMzJfQUxQSEFCRVQuaW5kZXhPZihjaGFyKTtcbiAgICBiaXRzICs9IDU7XG4gICAgaWYgKGJpdHMgPj0gOCkge1xuICAgICAgYml0cyAtPSA4O1xuICAgICAgb3V0cHV0W29mZnNldCsrXSA9ICh2YWx1ZSA+Pj4gYml0cykgJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBiYXNlMzJFbmNvZGUoZGF0YTogQnVmZmVyKTogc3RyaW5nIHtcbiAgbGV0IGJpdHMgPSAwO1xuICBsZXQgdmFsdWUgPSAwO1xuICBsZXQgb3V0cHV0ID0gJyc7XG4gIGZvciAoY29uc3QgYnl0ZSBvZiBkYXRhKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBieXRlO1xuICAgIGJpdHMgKz0gODtcbiAgICB3aGlsZSAoYml0cyA+PSA1KSB7XG4gICAgICBiaXRzIC09IDU7XG4gICAgICBvdXRwdXQgKz0gQkFTRTMyX0FMUEhBQkVUWyh2YWx1ZSA+Pj4gYml0cykgJiAweDFmXTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpdHMgPiAwKSB7XG4gICAgb3V0cHV0ICs9IEJBU0UzMl9BTFBIQUJFVFsodmFsdWUgPDwgKDUgLSBiaXRzKSkgJiAweDFmXTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBjcmMxNlhtb2RlbShkYXRhOiBCdWZmZXIpOiBudW1iZXIge1xuICBsZXQgY3JjID0gMDtcbiAgZm9yIChjb25zdCBieXRlIG9mIGRhdGEpIHtcbiAgICBjcmMgXj0gYnl0ZSA8PCA4O1xuICAgIGZvciAobGV0IGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7XG4gICAgICBjcmMgPSBjcmMgJiAweDgwMDAgPyAoKGNyYyA8PCAxKSBeIDB4MTAyMSkgJiAweGZmZmYgOiAoY3JjIDw8IDEpICYgMHhmZmZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3JjO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVTdHJLZXkodmFsdWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyLCBsYWJlbDogc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMkRlY29kZSh2YWx1ZSk7XG4gIGlmIChcbiAgICBkZWNvZGVkLmxlbmd0aCAhPT0gU1RSS0VZX0RFQ09ERURfQllURVMgfHxcbiAgICBkZWNvZGVkWzBdICE9PSB2ZXJzaW9uIHx8XG4gICAgYmFzZTMyRW5jb2RlKGRlY29kZWQpICE9PSB2YWx1ZSB8fFxuICAgIGNyYzE2WG1vZGVtKGRlY29kZWQuc3ViYXJyYXkoMCwgU1RSS0VZX0RFQ09ERURfQllURVMgLSAyKSkgIT09IGRlY29kZWQucmVhZFVJbnQxNkxFKFNUUktFWV9ERUNPREVEX0JZVEVTIC0gMilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVkMjU1MTkgU3RyS2V5ICR7bGFiZWx9YCk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWQuc3ViYXJyYXkoMSwgMzMpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGZvciBjYW5vbmljYWwgYmFzZTMyLWVuY29kZWQgNjQtYnl0ZSBwdWJsaWMgZGVyaXZhdGlvbiBtYXRlcmlhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rlcml2YWJsZUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJBU0UzMl9ST09UX1JFR0VYLnRlc3QocHViKSAmJiBiYXNlMzJFbmNvZGUoYmFzZTMyRGVjb2RlKHB1YikpID09PSBwdWI7XG59XG5cbi8qKiBUaHJvd3MgdW5sZXNzIHRoZSB2YWx1ZSBpcyBjYW5vbmljYWwgYmFzZTMyLWVuY29kZWQgNjQtYnl0ZSByb290IG1hdGVyaWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydERlcml2YWJsZUVkMjU1MTlQdWIocHViOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFpc0Rlcml2YWJsZUVkMjU1MTlQdWIocHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWI6IGV4cGVjdGVkIDY0IGJ5dGVzIG9mIGNhbm9uaWNhbCBiYXNlMzInKTtcbiAgfVxufVxuXG4vKiogQ29tcG9zZSByYXcgcHVibGljLWtleSBhbmQgY2hhaW4tY29kZSBieXRlcyBpbnRvIG9uZSBiYXNlMzIgcm9vdCB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHB1YjogQnVmZmVyLCBjaGFpbkNvZGU6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIGlmIChwdWIubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTIHx8IGNoYWluQ29kZS5sZW5ndGggIT09IERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViOiBleHBlY3RlZCAzMi1ieXRlIHB1YmxpYyBrZXkgYW5kIGNoYWluIGNvZGUgYnVmZmVycycpO1xuICB9XG4gIHJldHVybiBiYXNlMzJFbmNvZGUoQnVmZmVyLmNvbmNhdChbcHViLCBjaGFpbkNvZGVdKSk7XG59XG5cbi8qKiBEZWNvZGUgYSBiYXNlMzIgcm9vdCBpbnRvIHJhdyBwdWJsaWMta2V5IGFuZCBjaGFpbi1jb2RlIGJ1ZmZlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yihjb21wb3NpdGU6IHN0cmluZyk6IHsgcHViOiBCdWZmZXI7IGNoYWluQ29kZTogQnVmZmVyIH0ge1xuICBhc3NlcnREZXJpdmFibGVFZDI1NTE5UHViKGNvbXBvc2l0ZSk7XG4gIGNvbnN0IGRlY29kZWQgPSBiYXNlMzJEZWNvZGUoY29tcG9zaXRlKTtcbiAgcmV0dXJuIHtcbiAgICBwdWI6IGRlY29kZWQuc3ViYXJyYXkoMCwgREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUyksXG4gICAgY2hhaW5Db2RlOiBkZWNvZGVkLnN1YmFycmF5KERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpLFxuICB9O1xufVxuXG4vKiogR2VuZXJhdGUgYSBmcmVzaCByYXcgMzItYnl0ZSBjaGFpbiBjb2RlIGZvciByb290IGNvbXBvc2l0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSgpOiBCdWZmZXIge1xuICByZXR1cm4gcmFuZG9tQnl0ZXMoREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUyk7XG59XG5cbi8qKiBFbmNvZGUgYSByYXcgMzItYnl0ZSBjaGFpbiBjb2RlIGFzIGNhbm9uaWNhbCB1bnBhZGRlZCBSRkMgNDY0OCBiYXNlMzIgKDUyIGNoYXJhY3RlcnMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUVkMjU1MTlDaGFpbkNvZGUoY2hhaW5Db2RlOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAoY2hhaW5Db2RlLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlZDI1NTE5IGNoYWluIGNvZGU6IGV4cGVjdGVkIDMyIGJ5dGVzJyk7XG4gIH1cbiAgcmV0dXJuIGJhc2UzMkVuY29kZShjaGFpbkNvZGUpO1xufVxuXG4vKiogRGVjb2RlIGEgY2Fub25pY2FsIGJhc2UzMiBjaGFpbiBjb2RlIGludG8gaXRzIHJhdyAzMi1ieXRlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZTogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDSEFJTl9DT0RFX1JFR0VYLnRlc3QoY2hhaW5Db2RlKSB8fCBiYXNlMzJFbmNvZGUoYmFzZTMyRGVjb2RlKGNoYWluQ29kZSkpICE9PSBjaGFpbkNvZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWQyNTUxOSBjaGFpbiBjb2RlOiBleHBlY3RlZCBjYW5vbmljYWwgNTItY2hhcmFjdGVyIGJhc2UzMicpO1xuICB9XG4gIHJldHVybiBiYXNlMzJEZWNvZGUoY2hhaW5Db2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoIVNUUktFWV9QVUJMSUNfS0VZX1JFR0VYLnRlc3QocHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlZDI1NTE5IFN0cktleSBwdWJsaWMga2V5Jyk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZVN0cktleShwdWIsIFNUUktFWV9WRVJTSU9OX1BVQkxJQ19LRVksICdwdWJsaWMga2V5Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGRlY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkocHViKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChzZWVkOiBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoIVNUUktFWV9TRUNSRVRfU0VFRF9SRUdFWC50ZXN0KHNlZWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVkMjU1MTkgU3RyS2V5IHNlY3JldCBzZWVkJyk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZVN0cktleShzZWVkLCBTVFJLRVlfVkVSU0lPTl9TRUNSRVRfU0VFRCwgJ3NlY3JldCBzZWVkJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KHJhd1B1YjogQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHJhd1B1Yi5sZW5ndGggIT09IERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VkMjU1MTkgcHVibGljIGtleSBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFtTVFJLRVlfVkVSU0lPTl9QVUJMSUNfS0VZXSksIHJhd1B1Yl0pO1xuICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgY2hlY2tzdW0ud3JpdGVVSW50MTZMRShjcmMxNlhtb2RlbShwYXlsb2FkKSwgMCk7XG4gIHJldHVybiBiYXNlMzJFbmNvZGUoQnVmZmVyLmNvbmNhdChbcGF5bG9hZCwgY2hlY2tzdW1dKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZChyYXdTZWVkOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocmF3U2VlZC5sZW5ndGggIT09IERFUklWQUJMRV9FRDI1NTE5X1BVQkxJQ19LRVlfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VkMjU1MTkgc2VjcmV0IHNlZWQgbXVzdCBiZSAzMiBieXRlcycpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbU1RSS0VZX1ZFUlNJT05fU0VDUkVUX1NFRURdKSwgcmF3U2VlZF0pO1xuICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgY2hlY2tzdW0ud3JpdGVVSW50MTZMRShjcmMxNlhtb2RlbShwYXlsb2FkKSwgMCk7XG4gIHJldHVybiBiYXNlMzJFbmNvZGUoQnVmZmVyLmNvbmNhdChbcGF5bG9hZCwgY2hlY2tzdW1dKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrc3VtVmFsaWRTdHJLZXlFZDI1NTE5UHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShwdWIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEVuY29kZSBhIHJhdyAzMi1ieXRlIGtleSAoc2VjcmV0IHNlZWQgb3IgcHVibGljIGtleSkgYXMgYW4gQWxnb3JhbmQgNTgtY2hhcmFjdGVyIGJhc2UzMiB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVBbGdvS2V5KGJ5dGVzOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAoYnl0ZXMubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlZDI1NTE5IGtleSBtdXN0IGJlIDMyIGJ5dGVzJyk7XG4gIH1cbiAgY29uc3QgY2hlY2tzdW0gPSBCdWZmZXIuZnJvbShzaGE1MTIuc2hhNTEyXzI1Ni5hcnJheShieXRlcykuc2xpY2UoMjgsIDI4ICsgQUxHT1JBTkRfQ0hFQ0tTVU1fQllURVMpKTtcbiAgcmV0dXJuIGJhc2UzMkVuY29kZShCdWZmZXIuY29uY2F0KFtieXRlcywgY2hlY2tzdW1dKSk7XG59XG5cbi8qKiBFbmNvZGUgYSByYXcgMzItYnl0ZSBwdWJsaWMga2V5IGFzIGEgREVSLXByZWZpeGVkIEhlZGVyYSBwdWJsaWMga2V5ICg4OCBoZXggY2hhcnMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUhiYXJQdWJsaWNLZXlEZXIocHViOiBCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAocHViLmxlbmd0aCAhPT0gREVSSVZBQkxFX0VEMjU1MTlfUFVCTElDX0tFWV9CWVRFUykge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBwdWJsaWMga2V5IG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICByZXR1cm4gSEJBUl9QVUJMSUNfS0VZX1BSRUZJWCArIHB1Yi50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKiBFbmNvZGUgYSByYXcgMzItYnl0ZSBzZWNyZXQgc2VlZCBhcyBhIERFUi1wcmVmaXhlZCBIZWRlcmEgcHJpdmF0ZSBrZXkgKDk2IGhleCBjaGFycykuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlSGJhclByaXZhdGVLZXlEZXIoc2VlZDogQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHNlZWQubGVuZ3RoICE9PSBERVJJVkFCTEVfRUQyNTUxOV9QVUJMSUNfS0VZX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdlZDI1NTE5IHNlY3JldCBzZWVkIG11c3QgYmUgMzIgYnl0ZXMnKTtcbiAgfVxuICByZXR1cm4gSEJBUl9QUklWQVRFX0tFWV9QUkVGSVggKyBzZWVkLnRvU3RyaW5nKCdoZXgnKTtcbn1cbiJdfQ==
@@ -1,3 +1,13 @@
1
+ /**
2
+ * @prettier
3
+ *
4
+ * @experimental Safe keycard box codec.
5
+ *
6
+ * Each of Boxes A/B/C on a Safe keycard is a JSON object mapping a root slot name to that slot's key
7
+ * string. It lives in this leaf so sdk-core and WRW can parse a box without depending on key-card,
8
+ * which pulls in PDF/QR libraries and itself depends on sdk-core.
9
+ */
10
+ import * as t from 'io-ts';
1
11
  import type { RootKeyType } from '@bitgo/public-types';
2
12
  /**
3
13
  * Identifier for one of a safe's four roots (one per signing scheme). Each value is the
@@ -9,13 +19,21 @@ export type SafeRootKeyType = RootKeyType;
9
19
  * {@link SafeRootKeyType}. Values are per-root ciphertext for A/B (encryptedPrv or
10
20
  * reducedEncryptedPrv; safe MPC ciphertext decrypts to a versioned signing+VRF envelope) or
11
21
  * public keys for C. The root-key-type keys are self-identifying, so a
12
- * consumer parses by key rather than by size/offset.
22
+ * consumer parses by key rather than by size/offset. Box B's `ed25519Multisig` entry carries a
23
+ * `{ prv, chainCode }` object (the chain code is independent randomness not recomputable from the
24
+ * seed); every other entry is a bare string.
13
25
  */
14
- export type SafeKeycardRoots = Record<SafeRootKeyType, string>;
26
+ export declare const Ed25519ChainCodeEntryCodec: t.TypeC<{
27
+ prv: t.StringC;
28
+ chainCode: t.StringC;
29
+ }>;
30
+ export type Ed25519ChainCodeEntry = t.TypeOf<typeof Ed25519ChainCodeEntryCodec>;
31
+ export type SafeKeycardRootEntry = string | Ed25519ChainCodeEntry;
32
+ export type SafeKeycardRoots = Record<SafeRootKeyType, SafeKeycardRootEntry>;
15
33
  /**
16
34
  * Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
17
35
  * `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
18
- * not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
36
+ * not valid JSON or any root is not a bare string or a `{ prv, chainCode }` entry. Recovery tooling calls this on the A/B/C
19
37
  * box value, then decrypts each root value with the safe password. An MPC root value is an
20
38
  * opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
21
39
  * of treating the decrypted bytes as a bare share.
@@ -1 +1 @@
1
- {"version":3,"file":"keycardCodec.d.ts","sourceRoot":"","sources":["../../src/keycardCodec.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAa/D;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAOlE"}
1
+ {"version":3,"file":"keycardCodec.d.ts","sourceRoot":"","sources":["../../src/keycardCodec.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAI3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B;;;EAAiD,CAAC;AACzF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,qBAAqB,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;AAe7E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAOlE"}
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Ed25519ChainCodeEntryCodec = void 0;
36
37
  exports.parseSafeKeycardBox = parseSafeKeycardBox;
37
38
  /**
38
39
  * @prettier
@@ -47,19 +48,30 @@ const t = __importStar(require("io-ts"));
47
48
  const E = __importStar(require("fp-ts/Either"));
48
49
  const PathReporter_1 = require("io-ts/lib/PathReporter");
49
50
  const io_ts_types_1 = require("io-ts-types");
51
+ /**
52
+ * The JSON object encoded in a safe keycard box (A/B/C): the four roots keyed by
53
+ * {@link SafeRootKeyType}. Values are per-root ciphertext for A/B (encryptedPrv or
54
+ * reducedEncryptedPrv; safe MPC ciphertext decrypts to a versioned signing+VRF envelope) or
55
+ * public keys for C. The root-key-type keys are self-identifying, so a
56
+ * consumer parses by key rather than by size/offset. Box B's `ed25519Multisig` entry carries a
57
+ * `{ prv, chainCode }` object (the chain code is independent randomness not recomputable from the
58
+ * seed); every other entry is a bare string.
59
+ */
60
+ exports.Ed25519ChainCodeEntryCodec = t.type({ prv: t.string, chainCode: t.string });
61
+ const SafeKeycardRootEntryCodec = t.union([t.string, exports.Ed25519ChainCodeEntryCodec]);
50
62
  // Annotating with SafeKeycardRoots makes the compiler reject a key added to or removed from one side only.
51
63
  const SafeKeycardRootsCodec = t.type({
52
- secp256k1Multisig: t.string,
53
- ecdsaMpc: t.string,
54
- eddsaMpc: t.string,
55
- ed25519Multisig: t.string,
64
+ secp256k1Multisig: SafeKeycardRootEntryCodec,
65
+ ecdsaMpc: SafeKeycardRootEntryCodec,
66
+ eddsaMpc: SafeKeycardRootEntryCodec,
67
+ ed25519Multisig: SafeKeycardRootEntryCodec,
56
68
  });
57
69
  // Decodes a box's JSON string straight into the validated roots record.
58
70
  const SafeKeycardBoxFromString = io_ts_types_1.JsonFromString.pipe(SafeKeycardRootsCodec);
59
71
  /**
60
72
  * Parses a safe keycard box value — the JSON packed by key-card's `generateSafeQrData`, e.g.
61
73
  * `{"secp256k1Multisig":"…","ecdsaMpc":"…",…}` — into its four roots. Throws if the value is
62
- * not valid JSON or any root is missing/non-string. Recovery tooling calls this on the A/B/C
74
+ * not valid JSON or any root is not a bare string or a `{ prv, chainCode }` entry. Recovery tooling calls this on the A/B/C
63
75
  * box value, then decrypts each root value with the safe password. An MPC root value is an
64
76
  * opaque versioned envelope; recovery must unwrap its `prvKeyShare` and `vrf` fields instead
65
77
  * of treating the decrypted bytes as a bare share.
@@ -72,4 +84,4 @@ function parseSafeKeycardBox(data) {
72
84
  }
73
85
  return decoded.right;
74
86
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2FyZENvZGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleWNhcmRDb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlEQSxrREFPQztBQXhERDs7Ozs7Ozs7R0FRRztBQUNILHlDQUEyQjtBQUMzQixnREFBa0M7QUFDbEMseURBQXNEO0FBQ3RELDZDQUE2QztBQWtCN0MsMkdBQTJHO0FBQzNHLE1BQU0scUJBQXFCLEdBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDM0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ2xCLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNsQixlQUFlLEVBQUUsQ0FBQyxDQUFDLE1BQU07Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsd0VBQXdFO0FBQ3hFLE1BQU0sd0JBQXdCLEdBQUcsNEJBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUU1RTs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsSUFBWTtJQUM5QyxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEIsb0hBQW9IO1FBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLDJCQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNhZmUga2V5Y2FyZCBib3ggY29kZWMuXG4gKlxuICogRWFjaCBvZiBCb3hlcyBBL0IvQyBvbiBhIFNhZmUga2V5Y2FyZCBpcyBhIEpTT04gb2JqZWN0IG1hcHBpbmcgYSByb290IHNsb3QgbmFtZSB0byB0aGF0IHNsb3QncyBrZXlcbiAqIHN0cmluZy4gSXQgbGl2ZXMgaW4gdGhpcyBsZWFmIHNvIHNkay1jb3JlIGFuZCBXUlcgY2FuIHBhcnNlIGEgYm94IHdpdGhvdXQgZGVwZW5kaW5nIG9uIGtleS1jYXJkLFxuICogd2hpY2ggcHVsbHMgaW4gUERGL1FSIGxpYnJhcmllcyBhbmQgaXRzZWxmIGRlcGVuZHMgb24gc2RrLWNvcmUuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0ICogYXMgRSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0IHsgUGF0aFJlcG9ydGVyIH0gZnJvbSAnaW8tdHMvbGliL1BhdGhSZXBvcnRlcic7XG5pbXBvcnQgeyBKc29uRnJvbVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciBvbmUgb2YgYSBzYWZlJ3MgZm91ciByb290cyAob25lIHBlciBzaWduaW5nIHNjaGVtZSkuIEVhY2ggdmFsdWUgaXMgdGhlXG4gKiByb290J3MgYHJvb3RLZXlUeXBlYCwgd2hpY2ggaXMgYWxzbyB0aGUga2V5IHVzZWQgaW4gdGhlIGtleWNhcmQncyBwZXItYm94IEpTT04uXG4gKi9cbmV4cG9ydCB0eXBlIFNhZmVSb290S2V5VHlwZSA9IFJvb3RLZXlUeXBlO1xuXG4vKipcbiAqIFRoZSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc2FmZSBrZXljYXJkIGJveCAoQS9CL0MpOiB0aGUgZm91ciByb290cyBrZXllZCBieVxuICoge0BsaW5rIFNhZmVSb290S2V5VHlwZX0uIFZhbHVlcyBhcmUgcGVyLXJvb3QgY2lwaGVydGV4dCBmb3IgQS9CIChlbmNyeXB0ZWRQcnYgb3JcbiAqIHJlZHVjZWRFbmNyeXB0ZWRQcnY7IHNhZmUgTVBDIGNpcGhlcnRleHQgZGVjcnlwdHMgdG8gYSB2ZXJzaW9uZWQgc2lnbmluZytWUkYgZW52ZWxvcGUpIG9yXG4gKiBwdWJsaWMga2V5cyBmb3IgQy4gVGhlIHJvb3Qta2V5LXR5cGUga2V5cyBhcmUgc2VsZi1pZGVudGlmeWluZywgc28gYVxuICogY29uc3VtZXIgcGFyc2VzIGJ5IGtleSByYXRoZXIgdGhhbiBieSBzaXplL29mZnNldC5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZUtleWNhcmRSb290cyA9IFJlY29yZDxTYWZlUm9vdEtleVR5cGUsIHN0cmluZz47XG5cbi8vIEFubm90YXRpbmcgd2l0aCBTYWZlS2V5Y2FyZFJvb3RzIG1ha2VzIHRoZSBjb21waWxlciByZWplY3QgYSBrZXkgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIG9uZSBzaWRlIG9ubHkuXG5jb25zdCBTYWZlS2V5Y2FyZFJvb3RzQ29kZWM6IHQuVHlwZTxTYWZlS2V5Y2FyZFJvb3RzPiA9IHQudHlwZSh7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiB0LnN0cmluZyxcbiAgZWNkc2FNcGM6IHQuc3RyaW5nLFxuICBlZGRzYU1wYzogdC5zdHJpbmcsXG4gIGVkMjU1MTlNdWx0aXNpZzogdC5zdHJpbmcsXG59KTtcblxuLy8gRGVjb2RlcyBhIGJveCdzIEpTT04gc3RyaW5nIHN0cmFpZ2h0IGludG8gdGhlIHZhbGlkYXRlZCByb290cyByZWNvcmQuXG5jb25zdCBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcgPSBKc29uRnJvbVN0cmluZy5waXBlKFNhZmVLZXljYXJkUm9vdHNDb2RlYyk7XG5cbi8qKlxuICogUGFyc2VzIGEgc2FmZSBrZXljYXJkIGJveCB2YWx1ZSDigJQgdGhlIEpTT04gcGFja2VkIGJ5IGtleS1jYXJkJ3MgYGdlbmVyYXRlU2FmZVFyRGF0YWAsIGUuZy5cbiAqIGB7XCJzZWNwMjU2azFNdWx0aXNpZ1wiOlwi4oCmXCIsXCJlY2RzYU1wY1wiOlwi4oCmXCIs4oCmfWAg4oCUIGludG8gaXRzIGZvdXIgcm9vdHMuIFRocm93cyBpZiB0aGUgdmFsdWUgaXNcbiAqIG5vdCB2YWxpZCBKU09OIG9yIGFueSByb290IGlzIG1pc3Npbmcvbm9uLXN0cmluZy4gUmVjb3ZlcnkgdG9vbGluZyBjYWxscyB0aGlzIG9uIHRoZSBBL0IvQ1xuICogYm94IHZhbHVlLCB0aGVuIGRlY3J5cHRzIGVhY2ggcm9vdCB2YWx1ZSB3aXRoIHRoZSBzYWZlIHBhc3N3b3JkLiBBbiBNUEMgcm9vdCB2YWx1ZSBpcyBhblxuICogb3BhcXVlIHZlcnNpb25lZCBlbnZlbG9wZTsgcmVjb3ZlcnkgbXVzdCB1bndyYXAgaXRzIGBwcnZLZXlTaGFyZWAgYW5kIGB2cmZgIGZpZWxkcyBpbnN0ZWFkXG4gKiBvZiB0cmVhdGluZyB0aGUgZGVjcnlwdGVkIGJ5dGVzIGFzIGEgYmFyZSBzaGFyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUtleWNhcmRCb3goZGF0YTogc3RyaW5nKTogU2FmZUtleWNhcmRSb290cyB7XG4gIGNvbnN0IGRlY29kZWQgPSBTYWZlS2V5Y2FyZEJveEZyb21TdHJpbmcuZGVjb2RlKGRhdGEpO1xuICBpZiAoRS5pc0xlZnQoZGVjb2RlZCkpIHtcbiAgICAvLyBQYXRoUmVwb3J0ZXIsIG5vdCBkZWNvZGVXaXRoQ29kZWM6IGlvLXRzIGVycm9ycyBjYXJyeSBubyBtZXNzYWdlLCBzbyBkZWNvZGVXaXRoQ29kZWMgd291bGQgcmVwb3J0IG9ubHkgXCJ1bmtub3duXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBwYXJzZVNhZmVLZXljYXJkQm94OiAke1BhdGhSZXBvcnRlci5yZXBvcnQoZGVjb2RlZCkuam9pbignOyAnKX1gKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlZC5yaWdodDtcbn1cbiJdfQ==
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2FyZENvZGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleWNhcmRDb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwREEsa0RBT0M7QUFqRUQ7Ozs7Ozs7O0dBUUc7QUFDSCx5Q0FBMkI7QUFDM0IsZ0RBQWtDO0FBQ2xDLHlEQUFzRDtBQUN0RCw2Q0FBNkM7QUFTN0M7Ozs7Ozs7O0dBUUc7QUFDVSxRQUFBLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFPekYsTUFBTSx5QkFBeUIsR0FBaUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsa0NBQTBCLENBQUMsQ0FBQyxDQUFDO0FBRWhILDJHQUEyRztBQUMzRyxNQUFNLHFCQUFxQixHQUE2QixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdELGlCQUFpQixFQUFFLHlCQUF5QjtJQUM1QyxRQUFRLEVBQUUseUJBQXlCO0lBQ25DLFFBQVEsRUFBRSx5QkFBeUI7SUFDbkMsZUFBZSxFQUFFLHlCQUF5QjtDQUMzQyxDQUFDLENBQUM7QUFFSCx3RUFBd0U7QUFDeEUsTUFBTSx3QkFBd0IsR0FBRyw0QkFBYyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN0QixvSEFBb0g7UUFDcEgsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsMkJBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgU2FmZSBrZXljYXJkIGJveCBjb2RlYy5cbiAqXG4gKiBFYWNoIG9mIEJveGVzIEEvQi9DIG9uIGEgU2FmZSBrZXljYXJkIGlzIGEgSlNPTiBvYmplY3QgbWFwcGluZyBhIHJvb3Qgc2xvdCBuYW1lIHRvIHRoYXQgc2xvdCdzIGtleVxuICogc3RyaW5nLiBJdCBsaXZlcyBpbiB0aGlzIGxlYWYgc28gc2RrLWNvcmUgYW5kIFdSVyBjYW4gcGFyc2UgYSBib3ggd2l0aG91dCBkZXBlbmRpbmcgb24ga2V5LWNhcmQsXG4gKiB3aGljaCBwdWxscyBpbiBQREYvUVIgbGlicmFyaWVzIGFuZCBpdHNlbGYgZGVwZW5kcyBvbiBzZGstY29yZS5cbiAqL1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgKiBhcyBFIGZyb20gJ2ZwLXRzL0VpdGhlcic7XG5pbXBvcnQgeyBQYXRoUmVwb3J0ZXIgfSBmcm9tICdpby10cy9saWIvUGF0aFJlcG9ydGVyJztcbmltcG9ydCB7IEpzb25Gcm9tU3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuXG4vKipcbiAqIElkZW50aWZpZXIgZm9yIG9uZSBvZiBhIHNhZmUncyBmb3VyIHJvb3RzIChvbmUgcGVyIHNpZ25pbmcgc2NoZW1lKS4gRWFjaCB2YWx1ZSBpcyB0aGVcbiAqIHJvb3QncyBgcm9vdEtleVR5cGVgLCB3aGljaCBpcyBhbHNvIHRoZSBrZXkgdXNlZCBpbiB0aGUga2V5Y2FyZCdzIHBlci1ib3ggSlNPTi5cbiAqL1xuZXhwb3J0IHR5cGUgU2FmZVJvb3RLZXlUeXBlID0gUm9vdEtleVR5cGU7XG5cbi8qKlxuICogVGhlIEpTT04gb2JqZWN0IGVuY29kZWQgaW4gYSBzYWZlIGtleWNhcmQgYm94IChBL0IvQyk6IHRoZSBmb3VyIHJvb3RzIGtleWVkIGJ5XG4gKiB7QGxpbmsgU2FmZVJvb3RLZXlUeXBlfS4gVmFsdWVzIGFyZSBwZXItcm9vdCBjaXBoZXJ0ZXh0IGZvciBBL0IgKGVuY3J5cHRlZFBydiBvclxuICogcmVkdWNlZEVuY3J5cHRlZFBydjsgc2FmZSBNUEMgY2lwaGVydGV4dCBkZWNyeXB0cyB0byBhIHZlcnNpb25lZCBzaWduaW5nK1ZSRiBlbnZlbG9wZSkgb3JcbiAqIHB1YmxpYyBrZXlzIGZvciBDLiBUaGUgcm9vdC1rZXktdHlwZSBrZXlzIGFyZSBzZWxmLWlkZW50aWZ5aW5nLCBzbyBhXG4gKiBjb25zdW1lciBwYXJzZXMgYnkga2V5IHJhdGhlciB0aGFuIGJ5IHNpemUvb2Zmc2V0LiBCb3ggQidzIGBlZDI1NTE5TXVsdGlzaWdgIGVudHJ5IGNhcnJpZXMgYVxuICogYHsgcHJ2LCBjaGFpbkNvZGUgfWAgb2JqZWN0ICh0aGUgY2hhaW4gY29kZSBpcyBpbmRlcGVuZGVudCByYW5kb21uZXNzIG5vdCByZWNvbXB1dGFibGUgZnJvbSB0aGVcbiAqIHNlZWQpOyBldmVyeSBvdGhlciBlbnRyeSBpcyBhIGJhcmUgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgRWQyNTUxOUNoYWluQ29kZUVudHJ5Q29kZWMgPSB0LnR5cGUoeyBwcnY6IHQuc3RyaW5nLCBjaGFpbkNvZGU6IHQuc3RyaW5nIH0pO1xuZXhwb3J0IHR5cGUgRWQyNTUxOUNoYWluQ29kZUVudHJ5ID0gdC5UeXBlT2Y8dHlwZW9mIEVkMjU1MTlDaGFpbkNvZGVFbnRyeUNvZGVjPjtcblxuZXhwb3J0IHR5cGUgU2FmZUtleWNhcmRSb290RW50cnkgPSBzdHJpbmcgfCBFZDI1NTE5Q2hhaW5Db2RlRW50cnk7XG5cbmV4cG9ydCB0eXBlIFNhZmVLZXljYXJkUm9vdHMgPSBSZWNvcmQ8U2FmZVJvb3RLZXlUeXBlLCBTYWZlS2V5Y2FyZFJvb3RFbnRyeT47XG5cbmNvbnN0IFNhZmVLZXljYXJkUm9vdEVudHJ5Q29kZWM6IHQuVHlwZTxTYWZlS2V5Y2FyZFJvb3RFbnRyeT4gPSB0LnVuaW9uKFt0LnN0cmluZywgRWQyNTUxOUNoYWluQ29kZUVudHJ5Q29kZWNdKTtcblxuLy8gQW5ub3RhdGluZyB3aXRoIFNhZmVLZXljYXJkUm9vdHMgbWFrZXMgdGhlIGNvbXBpbGVyIHJlamVjdCBhIGtleSBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gb25lIHNpZGUgb25seS5cbmNvbnN0IFNhZmVLZXljYXJkUm9vdHNDb2RlYzogdC5UeXBlPFNhZmVLZXljYXJkUm9vdHM+ID0gdC50eXBlKHtcbiAgc2VjcDI1NmsxTXVsdGlzaWc6IFNhZmVLZXljYXJkUm9vdEVudHJ5Q29kZWMsXG4gIGVjZHNhTXBjOiBTYWZlS2V5Y2FyZFJvb3RFbnRyeUNvZGVjLFxuICBlZGRzYU1wYzogU2FmZUtleWNhcmRSb290RW50cnlDb2RlYyxcbiAgZWQyNTUxOU11bHRpc2lnOiBTYWZlS2V5Y2FyZFJvb3RFbnRyeUNvZGVjLFxufSk7XG5cbi8vIERlY29kZXMgYSBib3gncyBKU09OIHN0cmluZyBzdHJhaWdodCBpbnRvIHRoZSB2YWxpZGF0ZWQgcm9vdHMgcmVjb3JkLlxuY29uc3QgU2FmZUtleWNhcmRCb3hGcm9tU3RyaW5nID0gSnNvbkZyb21TdHJpbmcucGlwZShTYWZlS2V5Y2FyZFJvb3RzQ29kZWMpO1xuXG4vKipcbiAqIFBhcnNlcyBhIHNhZmUga2V5Y2FyZCBib3ggdmFsdWUg4oCUIHRoZSBKU09OIHBhY2tlZCBieSBrZXktY2FyZCdzIGBnZW5lcmF0ZVNhZmVRckRhdGFgLCBlLmcuXG4gKiBge1wic2VjcDI1NmsxTXVsdGlzaWdcIjpcIuKAplwiLFwiZWNkc2FNcGNcIjpcIuKAplwiLOKApn1gIOKAlCBpbnRvIGl0cyBmb3VyIHJvb3RzLiBUaHJvd3MgaWYgdGhlIHZhbHVlIGlzXG4gKiBub3QgdmFsaWQgSlNPTiBvciBhbnkgcm9vdCBpcyBub3QgYSBiYXJlIHN0cmluZyBvciBhIGB7IHBydiwgY2hhaW5Db2RlIH1gIGVudHJ5LiBSZWNvdmVyeSB0b29saW5nIGNhbGxzIHRoaXMgb24gdGhlIEEvQi9DXG4gKiBib3ggdmFsdWUsIHRoZW4gZGVjcnlwdHMgZWFjaCByb290IHZhbHVlIHdpdGggdGhlIHNhZmUgcGFzc3dvcmQuIEFuIE1QQyByb290IHZhbHVlIGlzIGFuXG4gKiBvcGFxdWUgdmVyc2lvbmVkIGVudmVsb3BlOyByZWNvdmVyeSBtdXN0IHVud3JhcCBpdHMgYHBydktleVNoYXJlYCBhbmQgYHZyZmAgZmllbGRzIGluc3RlYWRcbiAqIG9mIHRyZWF0aW5nIHRoZSBkZWNyeXB0ZWQgYnl0ZXMgYXMgYSBiYXJlIHNoYXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTYWZlS2V5Y2FyZEJveChkYXRhOiBzdHJpbmcpOiBTYWZlS2V5Y2FyZFJvb3RzIHtcbiAgY29uc3QgZGVjb2RlZCA9IFNhZmVLZXljYXJkQm94RnJvbVN0cmluZy5kZWNvZGUoZGF0YSk7XG4gIGlmIChFLmlzTGVmdChkZWNvZGVkKSkge1xuICAgIC8vIFBhdGhSZXBvcnRlciwgbm90IGRlY29kZVdpdGhDb2RlYzogaW8tdHMgZXJyb3JzIGNhcnJ5IG5vIG1lc3NhZ2UsIHNvIGRlY29kZVdpdGhDb2RlYyB3b3VsZCByZXBvcnQgb25seSBcInVua25vd25cIi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnNlU2FmZUtleWNhcmRCb3g6ICR7UGF0aFJlcG9ydGVyLnJlcG9ydChkZWNvZGVkKS5qb2luKCc7ICcpfWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnJpZ2h0O1xufVxuIl19
@@ -3,34 +3,69 @@
3
3
  *
4
4
  * @experimental Shared safe child derivation for mint, sign, and recovery.
5
5
  *
6
- * User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
7
- * Backup / BitGo children are soft-derived at `m/<index>` client-side for recovery.
6
+ * User child (every slot): hardened `m/44'/<coinType>'/<slot>'/<account>'`.
7
+ * Multisig co-signers (backup / BitGo): the soft twin `m/44/<coinType>/<slot>/<account>`.
8
+ * `<coinType>` is statics `bip44CoinType`, `<slot>` is statics `SAFE_ROOT_SLOT_ORDINALS[slot]`,
9
+ * and `<account>` is the safe's per-(slot, coinType) counter.
8
10
  *
9
11
  * Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
10
12
  * that is the custody hashed path and cannot reproduce a safe child.
11
13
  */
12
14
  import * as t from 'io-ts';
13
- export declare const DERIVED_FROM_PARENT_WITH_HARDENED_PATH: RegExp;
14
- export declare function parseSafeDerivationIndex(index: string | number): number;
15
- export declare function getSafeHardenedDerivationPath(index: string | number): string;
15
+ import type { RootKeyType } from '@bitgo/public-types';
16
+ export interface SafeBip44PathSegments {
17
+ coinType: number;
18
+ slotOrdinal: number;
19
+ account: number;
20
+ }
21
+ /**
22
+ * Assert `path` is a valid BIP32 path for the given derivation kind. Hardened paths require every
23
+ * segment to carry the `'` marker; soft paths reject it. Every segment must be a non-negative
24
+ * integer at or below {@link MAX_BIP32_INDEX}.
25
+ */
26
+ export declare function assertBip32Path(path: string, opts: {
27
+ hardened: boolean;
28
+ }): void;
16
29
  export interface DerivedFromParentWithHardenedPathBrand {
17
30
  readonly DerivedFromParentWithHardenedPath: unique symbol;
18
31
  }
32
+ export interface DerivedFromParentWithSoftPathBrand {
33
+ readonly DerivedFromParentWithSoftPath: unique symbol;
34
+ }
35
+ /** Safe user-child path `m/44'/<coinType>'/<slot>'/<account>'`; also every MPC child. */
19
36
  export type DerivedFromParentWithHardenedPath = t.Branded<string, DerivedFromParentWithHardenedPathBrand>;
37
+ /** Multisig co-signer path `m/44/<coinType>/<slot>/<account>`, the soft twin of a user-child path. */
38
+ export type DerivedFromParentWithSoftPath = t.Branded<string, DerivedFromParentWithSoftPathBrand>;
39
+ export declare function isDerivedFromParentWithHardenedPath(s: string): s is DerivedFromParentWithHardenedPath;
40
+ export declare function isDerivedFromParentWithSoftPath(s: string): s is DerivedFromParentWithSoftPath;
20
41
  export declare const DerivedFromParentWithHardenedPath: t.BrandC<t.StringC, DerivedFromParentWithHardenedPathBrand>;
21
- export declare function parseDerivedFromParentWithHardenedPath(path: string): number;
42
+ export declare const DerivedFromParentWithSoftPath: t.BrandC<t.StringC, DerivedFromParentWithSoftPathBrand>;
43
+ /**
44
+ * Reads the numeric segments out of a user/MPC child path. Rejects anything else, including a
45
+ * cast soft path: a hardened derive ceremony must never run at, or register, a soft path.
46
+ */
47
+ export declare function parseSafeBip44Path(path: DerivedFromParentWithHardenedPath): SafeBip44PathSegments;
48
+ /** The `<coinType>` segment for a coin. OFC and fiat coins have none and cannot mint a safe child. */
49
+ export declare function getSafeBip44CoinType(coin: string): number;
50
+ /**
51
+ * Builds the user-child path `m/44'/<coinType>'/<slot>'/<account>'`. `coinType` comes from statics
52
+ * (or the derivation-index response) and `account` from the safe's per-(slot, coinType) counter.
53
+ */
54
+ export declare function buildSafeBip44Path(coinType: number, slot: RootKeyType, account: number): DerivedFromParentWithHardenedPath;
55
+ /** Strips hardening from every level: the co-signer path paired with a user-child path. */
56
+ export declare function toSoftTwinPath(path: DerivedFromParentWithHardenedPath): DerivedFromParentWithSoftPath;
22
57
  export interface SafeHardenedChildKey {
23
58
  prv: string;
24
59
  pub: string;
25
- derivationPath: string;
60
+ derivationPath: DerivedFromParentWithHardenedPath;
26
61
  }
27
- export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
62
+ export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, path: DerivedFromParentWithHardenedPath): SafeHardenedChildKey;
28
63
  /** Re-derive and assert both results match before the child is registered. */
29
- export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
64
+ export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, path: DerivedFromParentWithHardenedPath): SafeHardenedChildKey;
30
65
  /**
31
66
  * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
32
67
  *
33
- * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-④ `ed25519Multisig` user roots store).
68
+ * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-② `ed25519Multisig` user roots store).
34
69
  * The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
35
70
  * (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
36
71
  * child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
@@ -39,5 +74,27 @@ export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, in
39
74
  * Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
40
75
  * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
41
76
  */
42
- export declare function deriveSafeChildEd25519Hardened(rootPrv: string, index: string | number): SafeHardenedChildKey;
77
+ export declare function deriveSafeChildEd25519Hardened(rootPrv: string, path: DerivedFromParentWithHardenedPath): SafeHardenedChildKey;
78
+ export interface SafeSecp256k1ChildTriplet {
79
+ user: {
80
+ prv: string;
81
+ pub: string;
82
+ };
83
+ backup: {
84
+ prv: string;
85
+ pub: string;
86
+ };
87
+ bitgo: {
88
+ pub: string;
89
+ };
90
+ }
91
+ /**
92
+ * Derives the slot-① (secp256k1Multisig) child triplet from the keycard roots: the user child at
93
+ * the hardened `path`, the backup and BitGo children at its soft twin.
94
+ */
95
+ export declare function deriveSafeChildTriplet(roots: {
96
+ user: string;
97
+ backup: string;
98
+ bitgo: string;
99
+ }, path: DerivedFromParentWithHardenedPath): SafeSecp256k1ChildTriplet;
43
100
  //# sourceMappingURL=safeDerivation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../src/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAQ3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAY5G"}
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../src/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAI3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAa/E;AA2BD,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,6BAA6B,EAAE,OAAO,MAAM,CAAC;CACvD;AAED,yFAAyF;AACzF,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,sGAAsG;AACtG,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;AAElG,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,iCAAiC,CAErG;AAED,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,6BAA6B,CAE7F;AAED,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,yDAIzC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iCAAiC,GAAG,qBAAqB,CAMjG;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GACd,iCAAiC,CAMnC;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,IAAI,EAAE,iCAAiC,GAAG,6BAA6B,CAMrG;AAYD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,iCAAiC,CAAC;CACnD;AAaD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iCAAiC,GACtC,oBAAoB,CAGtB;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iCAAiC,GACtC,oBAAoB,CAOtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,iCAAiC,GACtC,oBAAoB,CAWtB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACtD,IAAI,EAAE,iCAAiC,GACtC,yBAAyB,CAmB3B"}