@bitgo/sdk-coin-lnbtc 1.7.1 → 1.8.1

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.
@@ -1,17 +1,55 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  require("should");
37
+ const assert = __importStar(require("assert"));
38
+ const nock = require("nock");
4
39
  const sdk_test_1 = require("@bitgo/sdk-test");
5
40
  const sdk_api_1 = require("@bitgo/sdk-api");
41
+ const sdk_core_1 = require("@bitgo/sdk-core");
6
42
  const index_1 = require("../../src/index");
7
43
  describe('Lightning Bitcoin', function () {
8
44
  let bitgo;
9
45
  let basecoin;
46
+ let bgUrl;
10
47
  before(function () {
11
48
  bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
12
49
  bitgo.safeRegister('tlnbtc', index_1.Tlnbtc.createInstance);
13
50
  bitgo.initializeTestVars();
14
51
  basecoin = bitgo.coin('tlnbtc');
52
+ bgUrl = sdk_core_1.common.Environments[bitgo.getEnv()].uri;
15
53
  });
16
54
  it('should instantiate the coin', function () {
17
55
  basecoin.should.be.an.instanceof(index_1.Tlnbtc);
@@ -19,5 +57,71 @@ describe('Lightning Bitcoin', function () {
19
57
  it('should return full name', function () {
20
58
  basecoin.getFullName().should.equal('Testnet Lightning Bitcoin');
21
59
  });
60
+ describe('isValidPub', function () {
61
+ it('should return true for valid xpub', function () {
62
+ assert.strictEqual(basecoin.isValidPub('xpub661MyMwAqRbcGaE8M1N5i3fdBskDrwgU77TejReywexvb1sqCK1LhC2SETWp8XpPS2WDqyNywdgWo5kUTwkDv7qSe12xp4En7mcogZy95rQ'), true);
63
+ });
64
+ it('should return false for private key', function () {
65
+ assert.strictEqual(basecoin.isValidPub('xprv9s21ZrQH143K469fEyq5LuitdqujTUxcjtY3w3FNPKRwiDYgemh69PhxPBrgBc2s9vn8yfR1YKitAyUEXRTinrjyxxH5Xe38McnJ5rXkeXn'), false);
66
+ });
67
+ it('should return false for invalid string', function () {
68
+ assert.strictEqual(basecoin.isValidPub('not-a-pub'), false);
69
+ });
70
+ });
71
+ describe('isValidAddress', function () {
72
+ it('should accept valid compressed node pubkeys', function () {
73
+ assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619'), true);
74
+ assert.strictEqual(basecoin.isValidAddress('03e7156ae33b0a208d0744199163177e909e80176e55d97a2f221ede0f934dd9ad'), true);
75
+ });
76
+ it('should reject invalid node pubkeys', function () {
77
+ // wrong prefix
78
+ assert.strictEqual(basecoin.isValidAddress('04eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619'), false);
79
+ // too short
80
+ assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f28368'), false);
81
+ // too long
82
+ assert.strictEqual(basecoin.isValidAddress('02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f28368661900'), false);
83
+ });
84
+ it('should accept valid testnet bitcoin addresses', function () {
85
+ // p2sh
86
+ assert.strictEqual(basecoin.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X'), true);
87
+ // bech32
88
+ assert.strictEqual(basecoin.isValidAddress('tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx'), true);
89
+ });
90
+ it('should reject invalid addresses', function () {
91
+ assert.strictEqual(basecoin.isValidAddress('not-an-address'), false);
92
+ assert.strictEqual(basecoin.isValidAddress(''), false);
93
+ });
94
+ });
95
+ describe('isWalletAddress', function () {
96
+ const walletId = 'wallet123';
97
+ const validBitcoinAddress = '2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X';
98
+ const nodePubkey = '02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619';
99
+ afterEach(function () {
100
+ nock.cleanAll();
101
+ });
102
+ it('should return true when address exists on wallet', async function () {
103
+ nock(bgUrl)
104
+ .get(`/api/v2/tlnbtc/wallet/${walletId}/address/${encodeURIComponent(validBitcoinAddress)}`)
105
+ .reply(200, { address: validBitcoinAddress });
106
+ const result = await basecoin.isWalletAddress({ address: validBitcoinAddress, walletId });
107
+ assert.strictEqual(result, true);
108
+ });
109
+ it('should return false when address does not exist on wallet', async function () {
110
+ nock(bgUrl)
111
+ .get(`/api/v2/tlnbtc/wallet/${walletId}/address/${encodeURIComponent(validBitcoinAddress)}`)
112
+ .reply(404);
113
+ const result = await basecoin.isWalletAddress({ address: validBitcoinAddress, walletId });
114
+ assert.strictEqual(result, false);
115
+ });
116
+ it('should return false for node pubkeys without querying API', async function () {
117
+ const result = await basecoin.isWalletAddress({ address: nodePubkey, walletId });
118
+ assert.strictEqual(result, false);
119
+ });
120
+ it('should throw InvalidAddressError for invalid addresses', async function () {
121
+ await assert.rejects(() => basecoin.isWalletAddress({ address: 'invalid', walletId }), {
122
+ name: 'InvalidAddressError',
123
+ });
124
+ });
125
+ });
22
126
  });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFFaEIsOENBQTBEO0FBQzFELDRDQUEwQztBQUUxQywyQ0FBeUM7QUFFekMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWdCLENBQUM7SUFFckIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtRQUM1QixRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBUbG5idGMgfSBmcm9tICcuLi8uLi9zcmMvaW5kZXgnO1xuXG5kZXNjcmliZSgnTGlnaHRuaW5nIEJpdGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW46IFRsbmJ0YztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGxuYnRjJywgVGxuYnRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RsbmJ0YycpIGFzIFRsbmJ0YztcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUbG5idGMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBmdWxsIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgTGlnaHRuaW5nIEJpdGNvaW4nKTtcbiAgfSk7XG59KTtcbiJdfQ==
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsK0NBQWlDO0FBQ2pDLDZCQUE4QjtBQUU5Qiw4Q0FBMEQ7QUFDMUQsNENBQTBDO0FBQzFDLDhDQUF5QztBQUV6QywyQ0FBeUM7QUFFekMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWdCLENBQUM7SUFDckIsSUFBSSxLQUFhLENBQUM7SUFFbEIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFXLENBQUM7UUFDMUMsS0FBSyxHQUFHLGlCQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNoQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1FBQzVCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFD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QUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuXG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IGNvbW1vbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IFRsbmJ0YyB9IGZyb20gJy4uLy4uL3NyYy9pbmRleCc7XG5cbmRlc2NyaWJlKCdMaWdodG5pbmcgQml0Y29pbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGxuYnRjO1xuICBsZXQgYmdVcmw6IHN0cmluZztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndGxuYnRjJywgVGxuYnRjLmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3RsbmJ0YycpIGFzIFRsbmJ0YztcbiAgICBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLnVyaTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSB0aGUgY29pbicsIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihUbG5idGMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBmdWxsIG5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmFzZWNvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgTGlnaHRuaW5nIEJpdGNvaW4nKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdmFsaWQgeHB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYmFzZWNvaW4uaXNWYWxpZFB1YihcbiAgICAgICAgICAneHB1YjY2MU15TXdBcVJiY0dhRThNMU41aTNmZEJza0Ryd2dVNzdUZWpSZXl3ZXh2YjFzcUNLMUxoQzJTRVRXcDhYcFBTMldEcXlOeXdkZ1dvNWtVVHdrRHY3cVNlMTJ4cDRFbjdtY29nWnk5NXJRJ1xuICAgICAgICApLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIHByaXZhdGUga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkUHViKFxuICAgICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLNDY5ZkV5cTVMdWl0ZHF1alRVeGNqdFkzdzNGTlBLUndpRFlnZW1oNjlQaHhQQnJnQmMyczl2bjh5ZlIxWUtpdEF5VUVYUlRpbnJqeXh4SDVYZTM4TWNuSjVyWGtlWG4nXG4gICAgICAgICksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGludmFsaWQgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2Vjb2luLmlzVmFsaWRQdWIoJ25vdC1hLXB1YicpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBjb21wcmVzc2VkIG5vZGUgcHVia2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzAyZWVjNzI0NWQ2YjdkMmNjYjMwMzgwYmZiZTJhMzY0OGNkN2E5NDI2NTNmNWFhMzQwZWRjZWExZjI4MzY4NjYxOScpLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMDNlNzE1NmFlMzNiMGEyMDhkMDc0NDE5OTE2MzE3N2U5MDllODAxNzZlNTVkOTdhMmYyMjFlZGUwZjkzNGRkOWFkJyksXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIG5vZGUgcHVia2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHdyb25nIHByZWZpeFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcygnMDRlZWM3MjQ1ZDZiN2QyY2NiMzAzODBiZmJlMmEzNjQ4Y2Q3YTk0MjY1M2Y1YWEzNDBlZGNlYTFmMjgzNjg2NjE5JyksXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgLy8gdG9vIHNob3J0XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcwMmVlYzcyNDVkNmI3ZDJjY2IzMDM4MGJmYmUyYTM2NDhjZDdhOTQyNjUzZjVhYTM0MGVkY2VhMWYyODM2OCcpLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICAgIC8vIHRvbyBsb25nXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCcwMmVlYzcyNDVkNmI3ZDJjY2IzMDM4MGJmYmUyYTM2NDhjZDdhOTQyNjUzZjVhYTM0MGVkY2VhMWYyODM2ODY2MTkwMCcpLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHRlc3RuZXQgYml0Y29pbiBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBwMnNoXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJyksIHRydWUpO1xuICAgICAgLy8gYmVjaDMyXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJ3RiMXF3NTA4ZDZxZWp4dGRnNHk1cjN6YXJ2YXJ5MGM1eHc3a3hwanpzeCcpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKCdub3QtYW4tYWRkcmVzcycpLCBmYWxzZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2FsbGV0SWQgPSAnd2FsbGV0MTIzJztcbiAgICBjb25zdCB2YWxpZEJpdGNvaW5BZGRyZXNzID0gJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJztcbiAgICBjb25zdCBub2RlUHVia2V5ID0gJzAyZWVjNzI0NWQ2YjdkMmNjYjMwMzgwYmZiZTJhMzY0OGNkN2E5NDI2NTNmNWFhMzQwZWRjZWExZjI4MzY4NjYxOSc7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIGFkZHJlc3MgZXhpc3RzIG9uIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2soYmdVcmwpXG4gICAgICAgIC5nZXQoYC9hcGkvdjIvdGxuYnRjL3dhbGxldC8ke3dhbGxldElkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbGlkQml0Y29pbkFkZHJlc3MpfWApXG4gICAgICAgIC5yZXBseSgyMDAsIHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcywgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gYWRkcmVzcyBkb2VzIG5vdCBleGlzdCBvbiB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrKGJnVXJsKVxuICAgICAgICAuZ2V0KGAvYXBpL3YyL3RsbmJ0Yy93YWxsZXQvJHt3YWxsZXRJZH0vYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudCh2YWxpZEJpdGNvaW5BZGRyZXNzKX1gKVxuICAgICAgICAucmVwbHkoNDA0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRCaXRjb2luQWRkcmVzcywgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igbm9kZSBwdWJrZXlzIHdpdGhvdXQgcXVlcnlpbmcgQVBJJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogbm9kZVB1YmtleSwgd2FsbGV0SWQgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IEludmFsaWRBZGRyZXNzRXJyb3IgZm9yIGludmFsaWQgYWRkcmVzc2VzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogJ2ludmFsaWQnLCB3YWxsZXRJZCB9KSwge1xuICAgICAgICBuYW1lOiAnSW52YWxpZEFkZHJlc3NFcnJvcicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==