@bitgo/sdk-core 36.44.0 → 37.0.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.
Files changed (100) hide show
  1. package/dist/src/account-lib/baseCoin/enum.d.ts +19 -15
  2. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/enum.js +24 -16
  4. package/dist/src/api/types.d.ts +12 -0
  5. package/dist/src/api/types.d.ts.map +1 -1
  6. package/dist/src/api/types.js +1 -1
  7. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -0
  8. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  9. package/dist/src/bitgo/baseCoin/baseCoin.js +4 -1
  10. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
  11. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  12. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  13. package/dist/src/bitgo/bitgoBase.d.ts +3 -1
  14. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  15. package/dist/src/bitgo/bitgoBase.js +1 -1
  16. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +12 -1
  17. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  18. package/dist/src/bitgo/keychain/decryptKeychain.js +34 -2
  19. package/dist/src/bitgo/keychain/iKeychains.d.ts +6 -1
  20. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  21. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  22. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  23. package/dist/src/bitgo/keychain/keychains.js +10 -2
  24. package/dist/src/bitgo/trading/iTradingAccount.d.ts +12 -1
  25. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  26. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  27. package/dist/src/bitgo/trading/network/network.d.ts +1 -1
  28. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  29. package/dist/src/bitgo/trading/network/network.js +3 -5
  30. package/dist/src/bitgo/trading/network/types.d.ts +1 -1
  31. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  32. package/dist/src/bitgo/trading/network/types.js +1 -1
  33. package/dist/src/bitgo/trading/tradingAccount.d.ts +14 -1
  34. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  35. package/dist/src/bitgo/trading/tradingAccount.js +53 -7
  36. package/dist/src/bitgo/tss/common.d.ts +2 -1
  37. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  38. package/dist/src/bitgo/tss/common.js +10 -1
  39. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  40. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  41. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  42. package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -1
  43. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/mpcUtils.js +8 -1
  45. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +7 -4
  46. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +7 -1
  48. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +95 -17
  49. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/baseTypes.js +26 -2
  51. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +8 -5
  52. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  53. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +25 -4
  54. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +14 -4
  55. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  56. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +123 -46
  57. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -6
  58. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  59. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +96 -38
  60. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +32 -2
  61. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  62. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +141 -6
  63. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -1
  64. package/dist/src/bitgo/utils/txRequest.js +6 -4
  65. package/dist/src/bitgo/wallet/BuildParams.d.ts +20 -0
  66. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  67. package/dist/src/bitgo/wallet/BuildParams.js +12 -2
  68. package/dist/src/bitgo/wallet/iWallet.d.ts +60 -2
  69. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  70. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  71. package/dist/src/bitgo/wallet/iWallets.d.ts +20 -19
  72. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  73. package/dist/src/bitgo/wallet/iWallets.js +16 -8
  74. package/dist/src/bitgo/wallet/wallet.d.ts +77 -2
  75. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  76. package/dist/src/bitgo/wallet/wallet.js +281 -13
  77. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  78. package/dist/src/bitgo/wallet/wallets.js +49 -23
  79. package/dist/src/index.d.ts +2 -0
  80. package/dist/src/index.d.ts.map +1 -1
  81. package/dist/src/index.js +4 -2
  82. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  83. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  84. package/dist/test/unit/bitgo/trading/tradingAccount.js +183 -0
  85. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  86. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  87. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
  88. package/dist/test/unit/bitgo/utils/txRequest.js +75 -1
  89. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  90. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  91. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
  92. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  93. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  94. package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
  95. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  96. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  97. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  98. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +5 -2
  99. package/dist/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +5 -5
@@ -0,0 +1,326 @@
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
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert = __importStar(require("assert"));
40
+ const sinon_1 = __importDefault(require("sinon"));
41
+ require("should");
42
+ require("should-sinon");
43
+ const src_1 = require("../../../../src");
44
+ describe('Wallet - resource management', function () {
45
+ let wallet;
46
+ let mockBitGo;
47
+ let mockBaseCoin;
48
+ let mockWalletData;
49
+ const delegations = [
50
+ { receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' },
51
+ { receiverAddress: 'TRecv2', amount: '2000', resource: 'BANDWIDTH' },
52
+ ];
53
+ const undelegations = [{ receiverAddress: 'TRecv1', amount: '1000', resource: 'ENERGY' }];
54
+ function stubPost(response) {
55
+ const resultStub = sinon_1.default.stub().resolves(response);
56
+ const sendStub = sinon_1.default.stub().returns({ result: resultStub });
57
+ mockBitGo.post.returns({ send: sendStub });
58
+ return { sendStub };
59
+ }
60
+ beforeEach(function () {
61
+ mockBitGo = {
62
+ post: sinon_1.default.stub(),
63
+ setRequestTracer: sinon_1.default.stub(),
64
+ };
65
+ mockBaseCoin = {
66
+ url: sinon_1.default.stub().callsFake((path) => `/ttrx${path}`),
67
+ supportsResourceDelegation: sinon_1.default.stub().returns(true),
68
+ supportsTss: sinon_1.default.stub().returns(false),
69
+ getMPCAlgorithm: sinon_1.default.stub().returns('ecdsa'),
70
+ getFullName: sinon_1.default.stub().returns('Tron'),
71
+ postProcessPrebuild: sinon_1.default.stub().callsFake((prebuild) => Promise.resolve(prebuild)),
72
+ };
73
+ mockWalletData = {
74
+ id: 'test-wallet-id',
75
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
76
+ type: 'hot',
77
+ multisigType: 'hot',
78
+ };
79
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
80
+ });
81
+ afterEach(function () {
82
+ sinon_1.default.restore();
83
+ });
84
+ // ---------------------------------------------------------------------------
85
+ // buildResourceDelegations
86
+ // ---------------------------------------------------------------------------
87
+ describe('buildResourceDelegations', function () {
88
+ it('should throw if coin does not support resource delegation', async function () {
89
+ mockBaseCoin.supportsResourceDelegation.returns(false);
90
+ await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
91
+ });
92
+ it('should throw if delegations array is empty', async function () {
93
+ await wallet.buildResourceDelegations({ delegations: [] }).should.be.rejectedWith('delegations must be a non-empty array.');
94
+ });
95
+ it('should POST to /delegateResources/build and return prebuilds with walletId', async function () {
96
+ stubPost({ transactions: [{ txHex: 'aaa' }, { txHex: 'bbb' }], errors: [] });
97
+ const result = await wallet.buildResourceDelegations({ delegations });
98
+ result.prebuilds.should.have.length(2);
99
+ result.buildFailures.should.have.length(0);
100
+ result.prebuilds[0].walletId.should.equal('test-wallet-id');
101
+ result.prebuilds[1].walletId.should.equal('test-wallet-id');
102
+ sinon_1.default.assert.calledOnce(mockBitGo.post);
103
+ mockBitGo.post.firstCall.args[0].should.containEql('/delegateResources/build');
104
+ });
105
+ it('should return buildFailures when API returns errors', async function () {
106
+ stubPost({
107
+ transactions: [{ txHex: 'aaa' }],
108
+ errors: [{ error: 'insufficient balance', receiverAddress: 'TRecv2' }],
109
+ });
110
+ const result = await wallet.buildResourceDelegations({ delegations });
111
+ result.prebuilds.should.have.length(1);
112
+ result.buildFailures.should.have.length(1);
113
+ result.buildFailures[0].should.deepEqual({ message: 'insufficient balance', receiverAddress: 'TRecv2' });
114
+ });
115
+ it('should throw if API response is missing transactions array', async function () {
116
+ stubPost({ errors: [] });
117
+ await wallet.buildResourceDelegations({ delegations }).should.be.rejectedWith('Unexpected response from /delegateResources/build: missing transactions array');
118
+ });
119
+ it('should only send whitelisted params (delegations, apiVersion) to the API', async function () {
120
+ const { sendStub } = stubPost({ transactions: [{ txHex: 'aaa' }], errors: [] });
121
+ await wallet.buildResourceDelegations({ delegations, walletPassphrase: 'secret' });
122
+ const bodyArg = sendStub.firstCall.args[0];
123
+ bodyArg.should.have.property('delegations');
124
+ bodyArg.should.not.have.property('walletPassphrase');
125
+ });
126
+ });
127
+ // ---------------------------------------------------------------------------
128
+ // buildResourceUndelegations
129
+ // ---------------------------------------------------------------------------
130
+ describe('buildResourceUndelegations', function () {
131
+ it('should throw if undelegations array is empty', async function () {
132
+ await wallet.buildResourceUndelegations({ undelegations: [] }).should.be.rejectedWith('undelegations must be a non-empty array.');
133
+ });
134
+ it('should POST to /undelegateResources/build and return prebuilds', async function () {
135
+ stubPost({ transactions: [{ txHex: 'ccc' }], errors: [] });
136
+ const result = await wallet.buildResourceUndelegations({ undelegations });
137
+ result.prebuilds.should.have.length(1);
138
+ result.buildFailures.should.have.length(0);
139
+ sinon_1.default.assert.calledOnce(mockBitGo.post);
140
+ mockBitGo.post.firstCall.args[0].should.containEql('/undelegateResources/build');
141
+ });
142
+ it('should return buildFailures when API returns errors for undelegations', async function () {
143
+ stubPost({
144
+ transactions: [],
145
+ errors: [{ error: 'lock period active', receiverAddress: 'TRecv1' }],
146
+ });
147
+ const result = await wallet.buildResourceUndelegations({ undelegations });
148
+ result.prebuilds.should.have.length(0);
149
+ result.buildFailures.should.have.length(1);
150
+ result.buildFailures[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
151
+ });
152
+ });
153
+ // ---------------------------------------------------------------------------
154
+ // sendResourceDelegation (single)
155
+ // ---------------------------------------------------------------------------
156
+ describe('sendResourceDelegation', function () {
157
+ it('should throw if coin does not support resource delegation', async function () {
158
+ mockBaseCoin.supportsResourceDelegation.returns(false);
159
+ await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
160
+ });
161
+ it('should throw if prebuildTx is undefined for a non-custodial wallet', async function () {
162
+ await wallet.sendResourceDelegation({}).should.be.rejectedWith('Invalid prebuild for resource management transaction.');
163
+ });
164
+ it('should call sendManyTxRequests for a TSS wallet', async function () {
165
+ mockWalletData.multisigType = 'tss';
166
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
167
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-tx-1' });
168
+ const result = await wallet.sendResourceDelegation({ prebuildTx: { txRequestId: 'req-1' } });
169
+ result.should.deepEqual({ txid: 'tss-tx-1' });
170
+ sendManyStub.should.be.calledOnce();
171
+ });
172
+ it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
173
+ const signedPrebuild = { txHex: 'signed-aaa', wallet };
174
+ sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
175
+ const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-tx-1' });
176
+ const result = await wallet.sendResourceDelegation({ prebuildTx: { txHex: 'aaa' } });
177
+ result.should.deepEqual({ txid: 'hot-tx-1' });
178
+ submitStub.should.be.calledOnce();
179
+ });
180
+ it('should call initiateTransaction for a custodial non-TSS wallet with stakingParams and recipients promoted from prebuildTx', async function () {
181
+ mockWalletData.type = 'custodial';
182
+ mockWalletData.multisigType = 'multisig';
183
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
184
+ const initiateStub = sinon_1.default.stub(wallet, 'initiateTransaction').resolves({ txid: 'custodial-tx-1' });
185
+ const stakingParams = {
186
+ actionType: 'delegateResource',
187
+ owner_address: 'TOwner',
188
+ receiver_address: 'TReceiver',
189
+ receiverAddress: 'TReceiver',
190
+ amount: '1000000000',
191
+ resource: 'ENERGY',
192
+ };
193
+ const recipients = [{ address: 'TReceiver', amount: '0' }];
194
+ const result = await wallet.sendResourceDelegation({
195
+ prebuildTx: { txHex: 'aaa', stakingParams, recipients },
196
+ });
197
+ result.should.deepEqual({ txid: 'custodial-tx-1' });
198
+ initiateStub.should.be.calledOnce();
199
+ const calledWith = initiateStub.firstCall.args[0];
200
+ calledWith.should.containEql({ type: 'delegateResource', stakingParams, recipients });
201
+ });
202
+ });
203
+ // ---------------------------------------------------------------------------
204
+ // sendResourceDelegations (bulk)
205
+ // ---------------------------------------------------------------------------
206
+ describe('sendResourceDelegations', function () {
207
+ beforeEach(function () {
208
+ sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
209
+ });
210
+ it('should throw if coin does not support resource delegation', async function () {
211
+ mockBaseCoin.supportsResourceDelegation.returns(false);
212
+ await wallet.sendResourceDelegations({ delegations }).should.be.rejectedWith('Tron does not support resource delegation.');
213
+ });
214
+ it('should propagate build failures with receiverAddress into the failure array', async function () {
215
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
216
+ prebuilds: [],
217
+ buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
218
+ });
219
+ const result = await wallet.sendResourceDelegations({ delegations });
220
+ result.success.should.have.length(0);
221
+ result.failure.should.have.length(1);
222
+ result.failure[0].should.deepEqual({ message: 'build error', receiverAddress: 'TRecv2' });
223
+ });
224
+ it('should return all successes when no failures', async function () {
225
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
226
+ prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
227
+ buildFailures: [],
228
+ });
229
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'tx-ok' });
230
+ const result = await wallet.sendResourceDelegations({ delegations });
231
+ result.success.should.have.length(2);
232
+ result.failure.should.have.length(0);
233
+ });
234
+ it('should capture send failures with the correct receiverAddress from input entries', async function () {
235
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
236
+ prebuilds: [{ txHex: 'aaa' }, { txHex: 'bbb' }],
237
+ buildFailures: [],
238
+ });
239
+ const sendStub = sinon_1.default.stub(wallet, 'sendResourceManagementTransaction');
240
+ sendStub.onFirstCall().resolves({ txid: 'tx-1' });
241
+ sendStub.onSecondCall().rejects(new Error('send failed'));
242
+ const result = await wallet.sendResourceDelegations({ delegations });
243
+ result.success.should.have.length(1);
244
+ result.failure.should.have.length(1);
245
+ result.failure[0].message.should.equal('send failed');
246
+ result.failure[0].should.have.property('receiverAddress', 'TRecv2');
247
+ });
248
+ it('should combine build failures and send failures in the failure array', async function () {
249
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
250
+ prebuilds: [{ txHex: 'aaa' }],
251
+ buildFailures: [{ message: 'build error', receiverAddress: 'TRecv2' }],
252
+ });
253
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('send failed'));
254
+ const result = await wallet.sendResourceDelegations({ delegations });
255
+ result.success.should.have.length(0);
256
+ result.failure.should.have.length(2);
257
+ assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv2' && f.message === 'build error'));
258
+ assert.ok(result.failure.find((f) => f.receiverAddress === 'TRecv1' && f.message === 'send failed'));
259
+ });
260
+ });
261
+ // ---------------------------------------------------------------------------
262
+ // sendResourceUndelegation (single)
263
+ // ---------------------------------------------------------------------------
264
+ describe('sendResourceUndelegation', function () {
265
+ it('should throw if coin does not support resource delegation', async function () {
266
+ mockBaseCoin.supportsResourceDelegation.returns(false);
267
+ await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'aaa' } }).should.be.rejectedWith('Tron does not support resource delegation.');
268
+ });
269
+ it('should call sendManyTxRequests for a TSS wallet', async function () {
270
+ mockWalletData.multisigType = 'tss';
271
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
272
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendManyTxRequests').resolves({ txid: 'tss-undel-1' });
273
+ const result = await wallet.sendResourceUndelegation({ prebuildTx: { txRequestId: 'req-2' } });
274
+ result.should.deepEqual({ txid: 'tss-undel-1' });
275
+ sendManyStub.should.be.calledOnce();
276
+ });
277
+ it('should call prebuildAndSignTransaction + submitTransaction for a hot wallet', async function () {
278
+ const signedPrebuild = { txHex: 'signed-ccc', wallet };
279
+ sinon_1.default.stub(wallet, 'prebuildAndSignTransaction').resolves(signedPrebuild);
280
+ const submitStub = sinon_1.default.stub(wallet, 'submitTransaction').resolves({ txid: 'hot-undel-1' });
281
+ const result = await wallet.sendResourceUndelegation({ prebuildTx: { txHex: 'ccc' } });
282
+ result.should.deepEqual({ txid: 'hot-undel-1' });
283
+ submitStub.should.be.calledOnce();
284
+ });
285
+ });
286
+ // ---------------------------------------------------------------------------
287
+ // sendResourceUndelegations (bulk)
288
+ // ---------------------------------------------------------------------------
289
+ describe('sendResourceUndelegations', function () {
290
+ beforeEach(function () {
291
+ sinon_1.default.stub(wallet, 'getKeychainsAndValidatePassphrase').resolves();
292
+ });
293
+ it('should return all successes for undelegations', async function () {
294
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
295
+ prebuilds: [{ txHex: 'ccc' }],
296
+ buildFailures: [],
297
+ });
298
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').resolves({ txid: 'undel-tx-1' });
299
+ const result = await wallet.sendResourceUndelegations({ undelegations });
300
+ result.success.should.have.length(1);
301
+ result.failure.should.have.length(0);
302
+ });
303
+ it('should capture send failures with correct receiverAddress for undelegations', async function () {
304
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
305
+ prebuilds: [{ txHex: 'ccc' }],
306
+ buildFailures: [],
307
+ });
308
+ sinon_1.default.stub(wallet, 'sendResourceManagementTransaction').rejects(new Error('undel send failed'));
309
+ const result = await wallet.sendResourceUndelegations({ undelegations });
310
+ result.failure.should.have.length(1);
311
+ result.failure[0].message.should.equal('undel send failed');
312
+ result.failure[0].should.have.property('receiverAddress', 'TRecv1');
313
+ });
314
+ it('should propagate undelegation build failures into the failure array', async function () {
315
+ sinon_1.default.stub(wallet, 'buildResourceManagementTransactions').resolves({
316
+ prebuilds: [],
317
+ buildFailures: [{ message: 'lock period active', receiverAddress: 'TRecv1' }],
318
+ });
319
+ const result = await wallet.sendResourceUndelegations({ undelegations });
320
+ result.success.should.have.length(0);
321
+ result.failure.should.have.length(1);
322
+ result.failure[0].should.deepEqual({ message: 'lock period active', receiverAddress: 'TRecv1' });
323
+ });
324
+ });
325
+ });
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VNYW5hZ2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC9yZXNvdXJjZU1hbmFnZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsa0RBQTBCO0FBQzFCLGtCQUFnQjtBQUNoQix3QkFBc0I7QUFDdEIseUNBQXlDO0FBRXpDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRTtJQUN2QyxJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxjQUFtQixDQUFDO0lBRXhCLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDakUsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtLQUNyRSxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUUxRixTQUFTLFFBQVEsQ0FBQyxRQUFhO1FBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzlELFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFD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QU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgJ3Nob3VsZC1zaW5vbic7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnV2FsbGV0IC0gcmVzb3VyY2UgbWFuYWdlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG4gIGxldCBtb2NrQmFzZUNvaW46IGFueTtcbiAgbGV0IG1vY2tXYWxsZXREYXRhOiBhbnk7XG5cbiAgY29uc3QgZGVsZWdhdGlvbnMgPSBbXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnLCBhbW91bnQ6ICcxMDAwJywgcmVzb3VyY2U6ICdFTkVSR1knIH0sXG4gICAgeyByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInLCBhbW91bnQ6ICcyMDAwJywgcmVzb3VyY2U6ICdCQU5EV0lEVEgnIH0sXG4gIF07XG5cbiAgY29uc3QgdW5kZWxlZ2F0aW9ucyA9IFt7IHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScsIGFtb3VudDogJzEwMDAnLCByZXNvdXJjZTogJ0VORVJHWScgfV07XG5cbiAgZnVuY3Rpb24gc3R1YlBvc3QocmVzcG9uc2U6IGFueSkge1xuICAgIGNvbnN0IHJlc3VsdFN0dWIgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzcG9uc2UpO1xuICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHJlc3VsdFN0dWIgfSk7XG4gICAgbW9ja0JpdEdvLnBvc3QucmV0dXJucyh7IHNlbmQ6IHNlbmRTdHViIH0pO1xuICAgIHJldHVybiB7IHNlbmRTdHViIH07XG4gIH1cblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBgL3R0cngke3BhdGh9YCksXG4gICAgICBzdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbjogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICAgIGdldEZ1bGxOYW1lOiBzaW5vbi5zdHViKCkucmV0dXJucygnVHJvbicpLFxuICAgICAgcG9zdFByb2Nlc3NQcmVidWlsZDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocHJlYnVpbGQ6IGFueSkgPT4gUHJvbWlzZS5yZXNvbHZlKHByZWJ1aWxkKSksXG4gICAgfTtcblxuICAgIG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZTogJ2hvdCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBidWlsZFJlc291cmNlRGVsZWdhdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCdidWlsZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSkgYXMgYW55KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnVHJvbiBkb2VzIG5vdCBzdXBwb3J0IHJlc291cmNlIGRlbGVnYXRpb24uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZGVsZWdhdGlvbnMgYXJyYXkgaXMgZW1wdHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zOiBbXSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdkZWxlZ2F0aW9ucyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5LidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIFBPU1QgdG8gL2RlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzIHdpdGggd2FsbGV0SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH0sIHsgdHhIZXg6ICdiYmInIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LnByZWJ1aWxkc1swXS53YWxsZXRJZC5zaG91bGQuZXF1YWwoJ3Rlc3Qtd2FsbGV0LWlkJyk7XG4gICAgICByZXN1bHQucHJlYnVpbGRzWzFdLndhbGxldElkLnNob3VsZC5lcXVhbCgndGVzdC13YWxsZXQtaWQnKTtcbiAgICAgIHNpbm9uLmFzc2VydC5jYWxsZWRPbmNlKG1vY2tCaXRHby5wb3N0KTtcbiAgICAgIChtb2NrQml0R28ucG9zdC5maXJzdENhbGwuYXJnc1swXSBhcyBzdHJpbmcpLnNob3VsZC5jb250YWluRXFsKCcvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBlcnJvcnM6IFt7IGVycm9yOiAnaW5zdWZmaWNpZW50IGJhbGFuY2UnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlc1swXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2luc3VmZmljaWVudCBiYWxhbmNlJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgQVBJIHJlc3BvbnNlIGlzIG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCAod2FsbGV0LmJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSAvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQ6IG1pc3NpbmcgdHJhbnNhY3Rpb25zIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb25seSBzZW5kIHdoaXRlbGlzdGVkIHBhcmFtcyAoZGVsZWdhdGlvbnMsIGFwaVZlcnNpb24pIHRvIHRoZSBBUEknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IHNlbmRTdHViIH0gPSBzdHViUG9zdCh7IHRyYW5zYWN0aW9uczogW3sgdHhIZXg6ICdhYWEnIH1dLCBlcnJvcnM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMsIHdhbGxldFBhc3NwaHJhc2U6ICdzZWNyZXQnIH0pO1xuXG4gICAgICBjb25zdCBib2R5QXJnID0gc2VuZFN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBib2R5QXJnLnNob3VsZC5oYXZlLnByb3BlcnR5KCdkZWxlZ2F0aW9ucycpO1xuICAgICAgYm9keUFyZy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dhbGxldFBhc3NwaHJhc2UnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIGJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnYnVpbGRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB1bmRlbGVnYXRpb25zIGFycmF5IGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnM6IFtdIH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ3VuZGVsZWdhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBQT1NUIHRvIC91bmRlbGVnYXRlUmVzb3VyY2VzL2J1aWxkIGFuZCByZXR1cm4gcHJlYnVpbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc3R1YlBvc3QoeyB0cmFuc2FjdGlvbnM6IFt7IHR4SGV4OiAnY2NjJyB9XSwgZXJyb3JzOiBbXSB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnByZWJ1aWxkcy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuYnVpbGRGYWlsdXJlcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkT25jZShtb2NrQml0R28ucG9zdCk7XG4gICAgICAobW9ja0JpdEdvLnBvc3QuZmlyc3RDYWxsLmFyZ3NbMF0gYXMgc3RyaW5nKS5zaG91bGQuY29udGFpbkVxbCgnL3VuZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGJ1aWxkRmFpbHVyZXMgd2hlbiBBUEkgcmV0dXJucyBlcnJvcnMgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViUG9zdCh7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICAgIGVycm9yczogW3sgZXJyb3I6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5idWlsZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5wcmVidWlsZHMuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmJ1aWxkRmFpbHVyZXNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7IG1lc3NhZ2U6ICdsb2NrIHBlcmlvZCBhY3RpdmUnLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjEnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZURlbGVnYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdhYWEnIH0gYXMgYW55IH0pIGFzIGFueSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ1Ryb24gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHByZWJ1aWxkVHggaXMgdW5kZWZpbmVkIGZvciBhIG5vbi1jdXN0b2RpYWwgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9uKHt9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHByZWJ1aWxkIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uLidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgc2VuZE1hbnlUeFJlcXVlc3RzIGZvciBhIFRTUyB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAndHNzJztcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRNYW55VHhSZXF1ZXN0cycpLnJlc29sdmVzKHsgdHhpZDogJ3Rzcy10eC0xJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTEnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdHgtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtYWFhJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXR4LTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyB0eGlkOiAnaG90LXR4LTEnIH0pO1xuICAgICAgc3VibWl0U3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIGluaXRpYXRlVHJhbnNhY3Rpb24gZm9yIGEgY3VzdG9kaWFsIG5vbi1UU1Mgd2FsbGV0IHdpdGggc3Rha2luZ1BhcmFtcyBhbmQgcmVjaXBpZW50cyBwcm9tb3RlZCBmcm9tIHByZWJ1aWxkVHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrV2FsbGV0RGF0YS50eXBlID0gJ2N1c3RvZGlhbCc7XG4gICAgICBtb2NrV2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGUgPSAnbXVsdGlzaWcnO1xuICAgICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICAgICAgY29uc3QgaW5pdGlhdGVTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnaW5pdGlhdGVUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ2N1c3RvZGlhbC10eC0xJyB9KTtcblxuICAgICAgY29uc3Qgc3Rha2luZ1BhcmFtcyA9IHtcbiAgICAgICAgYWN0aW9uVHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLFxuICAgICAgICBvd25lcl9hZGRyZXNzOiAnVE93bmVyJyxcbiAgICAgICAgcmVjZWl2ZXJfYWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIHJlY2VpdmVyQWRkcmVzczogJ1RSZWNlaXZlcicsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAnLFxuICAgICAgICByZXNvdXJjZTogJ0VORVJHWScsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6ICdUUmVjZWl2ZXInLCBhbW91bnQ6ICcwJyB9XTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb24oe1xuICAgICAgICBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJywgc3Rha2luZ1BhcmFtcywgcmVjaXBpZW50cyB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdjdXN0b2RpYWwtdHgtMScgfSk7XG4gICAgICBpbml0aWF0ZVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICAgIGNvbnN0IGNhbGxlZFdpdGggPSBpbml0aWF0ZVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjYWxsZWRXaXRoLnNob3VsZC5jb250YWluRXFsKHsgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnLCBzdGFraW5nUGFyYW1zLCByZWNpcGllbnRzIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc2VuZFJlc291cmNlRGVsZWdhdGlvbnMgKGJ1bGspXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnc2VuZFJlc291cmNlRGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbi5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIGF3YWl0ICh3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgYnVpbGQgZmFpbHVyZXMgd2l0aCByZWNlaXZlckFkZHJlc3MgaW50byB0aGUgZmFpbHVyZSBhcnJheScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFtdLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2J1aWxkIGVycm9yJywgcmVjZWl2ZXJBZGRyZXNzOiAnVFJlY3YyJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBzdWNjZXNzZXMgd2hlbiBubyBmYWlsdXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3R4LW9rJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZURlbGVnYXRpb25zKHsgZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggdGhlIGNvcnJlY3QgcmVjZWl2ZXJBZGRyZXNzIGZyb20gaW5wdXQgZW50cmllcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnYWFhJyB9LCB7IHR4SGV4OiAnYmJiJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRTdHViID0gc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnc2VuZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uJyk7XG4gICAgICBzZW5kU3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHsgdHhpZDogJ3R4LTEnIH0pO1xuICAgICAgc2VuZFN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ3NlbmQgZmFpbGVkJykpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlRGVsZWdhdGlvbnMoeyBkZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LnN1Y2Nlc3Muc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3NlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb21iaW5lIGJ1aWxkIGZhaWx1cmVzIGFuZCBzZW5kIGZhaWx1cmVzIGluIHRoZSBmYWlsdXJlIGFycmF5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQgYXMgYW55LCAnYnVpbGRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMnKS5yZXNvbHZlcyh7XG4gICAgICAgIHByZWJ1aWxkczogW3sgdHhIZXg6ICdhYWEnIH1dLFxuICAgICAgICBidWlsZEZhaWx1cmVzOiBbeyBtZXNzYWdlOiAnYnVpbGQgZXJyb3InLCByZWNlaXZlckFkZHJlc3M6ICdUUmVjdjInIH1dLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcignc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VEZWxlZ2F0aW9ucyh7IGRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LmZhaWx1cmUuZmluZCgoZikgPT4gZi5yZWNlaXZlckFkZHJlc3MgPT09ICdUUmVjdjInICYmIGYubWVzc2FnZSA9PT0gJ2J1aWxkIGVycm9yJykpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5mYWlsdXJlLmZpbmQoKGYpID0+IGYucmVjZWl2ZXJBZGRyZXNzID09PSAnVFJlY3YxJyAmJiBmLm1lc3NhZ2UgPT09ICdzZW5kIGZhaWxlZCcpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbiAoc2luZ2xlKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGNvaW4gZG9lcyBub3Qgc3VwcG9ydCByZXNvdXJjZSBkZWxlZ2F0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uLnJldHVybnMoZmFsc2UpO1xuICAgICAgYXdhaXQgKHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4SGV4OiAnYWFhJyB9IGFzIGFueSB9KSBhcyBhbnkpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdUcm9uIGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi4nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55VHhSZXF1ZXN0cyBmb3IgYSBUU1Mgd2FsbGV0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja1dhbGxldERhdGEubXVsdGlzaWdUeXBlID0gJ3Rzcyc7XG4gICAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luLCBtb2NrV2FsbGV0RGF0YSk7XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kTWFueVR4UmVxdWVzdHMnKS5yZXNvbHZlcyh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb24oeyBwcmVidWlsZFR4OiB7IHR4UmVxdWVzdElkOiAncmVxLTInIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICd0c3MtdW5kZWwtMScgfSk7XG4gICAgICBzZW5kTWFueVN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FsbCBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiArIHN1Ym1pdFRyYW5zYWN0aW9uIGZvciBhIGhvdCB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IHsgdHhIZXg6ICdzaWduZWQtY2NjJywgd2FsbGV0IH07XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoc2lnbmVkUHJlYnVpbGQgYXMgYW55KTtcbiAgICAgIGNvbnN0IHN1Ym1pdFN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3N1Ym1pdFRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eGlkOiAnaG90LXVuZGVsLTEnIH0gYXMgYW55KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbih7IHByZWJ1aWxkVHg6IHsgdHhIZXg6ICdjY2MnIH0gYXMgYW55IH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IHR4aWQ6ICdob3QtdW5kZWwtMScgfSk7XG4gICAgICBzdWJtaXRTdHViLnNob3VsZC5iZS5jYWxsZWRPbmNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBzZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zIChidWxrKVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3NlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2UnKS5yZXNvbHZlcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYWxsIHN1Y2Nlc3NlcyBmb3IgdW5kZWxlZ2F0aW9ucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2J1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zJykucmVzb2x2ZXMoe1xuICAgICAgICBwcmVidWlsZHM6IFt7IHR4SGV4OiAnY2NjJyB9XSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW10sXG4gICAgICB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ3NlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbicpLnJlc29sdmVzKHsgdHhpZDogJ3VuZGVsLXR4LTEnIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuc2VuZFJlc291cmNlVW5kZWxlZ2F0aW9ucyh7IHVuZGVsZWdhdGlvbnMgfSk7XG5cbiAgICAgIHJlc3VsdC5zdWNjZXNzLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIHJlc3VsdC5mYWlsdXJlLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2FwdHVyZSBzZW5kIGZhaWx1cmVzIHdpdGggY29ycmVjdCByZWNlaXZlckFkZHJlc3MgZm9yIHVuZGVsZWdhdGlvbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbeyB0eEhleDogJ2NjYycgfV0sXG4gICAgICAgIGJ1aWxkRmFpbHVyZXM6IFtdLFxuICAgICAgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24nKS5yZWplY3RzKG5ldyBFcnJvcigndW5kZWwgc2VuZCBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5zZW5kUmVzb3VyY2VVbmRlbGVnYXRpb25zKHsgdW5kZWxlZ2F0aW9ucyB9KTtcblxuICAgICAgcmVzdWx0LmZhaWx1cmUuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0LmZhaWx1cmVbMF0ubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3VuZGVsIHNlbmQgZmFpbGVkJyk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncmVjZWl2ZXJBZGRyZXNzJywgJ1RSZWN2MScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wYWdhdGUgdW5kZWxlZ2F0aW9uIGJ1aWxkIGZhaWx1cmVzIGludG8gdGhlIGZhaWx1cmUgYXJyYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdidWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucycpLnJlc29sdmVzKHtcbiAgICAgICAgcHJlYnVpbGRzOiBbXSxcbiAgICAgICAgYnVpbGRGYWlsdXJlczogW3sgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfV0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LnNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMoeyB1bmRlbGVnYXRpb25zIH0pO1xuXG4gICAgICByZXN1bHQuc3VjY2Vzcy5zaG91bGQuaGF2ZS5sZW5ndGgoMCk7XG4gICAgICByZXN1bHQuZmFpbHVyZS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICByZXN1bHQuZmFpbHVyZVswXS5zaG91bGQuZGVlcEVxdWFsKHsgbWVzc2FnZTogJ2xvY2sgcGVyaW9kIGFjdGl2ZScsIHJlY2VpdmVyQWRkcmVzczogJ1RSZWN2MScgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=walletOptionsCodecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletOptionsCodecs.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/wallet/walletOptionsCodecs.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const Either_1 = require("fp-ts/Either");
8
+ const iWallets_1 = require("../../../../src/bitgo/wallet/iWallets");
9
+ describe('wallet options codecs with encryptionVersion', () => {
10
+ const lightningBase = {
11
+ label: 'test',
12
+ passphrase: 'pass',
13
+ enterprise: 'ent',
14
+ passcodeEncryptionCode: 'code',
15
+ subType: 'lightningCustody',
16
+ };
17
+ const goAccountBase = {
18
+ label: 'test',
19
+ passphrase: 'pass',
20
+ enterprise: 'ent',
21
+ passcodeEncryptionCode: 'code',
22
+ type: 'trading',
23
+ };
24
+ it('GenerateLightningWalletOptionsCodec accepts encryptionVersion: 2', () => {
25
+ assert_1.default.ok((0, Either_1.isRight)(iWallets_1.GenerateLightningWalletOptionsCodec.decode({ ...lightningBase, encryptionVersion: 2 })));
26
+ });
27
+ it('GenerateLightningWalletOptionsCodec rejects encryptionVersion: 3', () => {
28
+ assert_1.default.ok((0, Either_1.isLeft)(iWallets_1.GenerateLightningWalletOptionsCodec.decode({ ...lightningBase, encryptionVersion: 3 })));
29
+ });
30
+ it('GenerateLightningWalletOptionsCodec works without encryptionVersion', () => {
31
+ assert_1.default.ok((0, Either_1.isRight)(iWallets_1.GenerateLightningWalletOptionsCodec.decode(lightningBase)));
32
+ });
33
+ it('GenerateGoAccountWalletOptionsCodec accepts encryptionVersion: 2', () => {
34
+ assert_1.default.ok((0, Either_1.isRight)(iWallets_1.GenerateGoAccountWalletOptionsCodec.decode({ ...goAccountBase, encryptionVersion: 2 })));
35
+ });
36
+ it('GenerateGoAccountWalletOptionsCodec rejects encryptionVersion: 3', () => {
37
+ assert_1.default.ok((0, Either_1.isLeft)(iWallets_1.GenerateGoAccountWalletOptionsCodec.decode({ ...goAccountBase, encryptionVersion: 3 })));
38
+ });
39
+ it('GenerateGoAccountWalletOptionsCodec works without encryptionVersion', () => {
40
+ assert_1.default.ok((0, Either_1.isRight)(iWallets_1.GenerateGoAccountWalletOptionsCodec.decode(goAccountBase)));
41
+ });
42
+ });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0T3B0aW9uc0NvZGVjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby93YWxsZXQvd2FsbGV0T3B0aW9uc0NvZGVjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1Qix5Q0FBK0M7QUFFL0Msb0VBRytDO0FBRS9DLFFBQVEsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7SUFDNUQsTUFBTSxhQUFhLEdBQUc7UUFDcEIsS0FBSyxFQUFFLE1BQU07UUFDYixVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsS0FBSztRQUNqQixzQkFBc0IsRUFBRSxNQUFNO1FBQzlCLE9BQU8sRUFBRSxrQkFBMkI7S0FDckMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLEtBQUssRUFBRSxNQUFNO1FBQ2IsVUFBVSxFQUFFLE1BQU07UUFDbEIsVUFBVSxFQUFFLEtBQUs7UUFDakIsc0JBQXNCLEVBQUUsTUFBTTtRQUM5QixJQUFJLEVBQUUsU0FBa0I7S0FDekIsQ0FBQztJQUVGLEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7UUFDMUUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSxnQkFBTyxFQUFDLDhDQUFtQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtRQUMxRSxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFBLGVBQU0sRUFBQyw4Q0FBbUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxHQUFHLEVBQUU7UUFDN0UsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSxnQkFBTyxFQUFDLDhDQUFtQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxFQUFFO1FBQzFFLGdCQUFNLENBQUMsRUFBRSxDQUFDLElBQUEsZ0JBQU8sRUFBQyw4Q0FBbUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxHQUFHLEVBQUU7UUFDMUUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSxlQUFNLEVBQUMsOENBQW1DLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsR0FBRyxFQUFFO1FBQzdFLGdCQUFNLENBQUMsRUFBRSxDQUFDLElBQUEsZ0JBQU8sRUFBQyw4Q0FBbUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBpc1JpZ2h0LCBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuXG5pbXBvcnQge1xuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYyxcbiAgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMsXG59IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvaVdhbGxldHMnO1xuXG5kZXNjcmliZSgnd2FsbGV0IG9wdGlvbnMgY29kZWNzIHdpdGggZW5jcnlwdGlvblZlcnNpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGxpZ2h0bmluZ0Jhc2UgPSB7XG4gICAgbGFiZWw6ICd0ZXN0JyxcbiAgICBwYXNzcGhyYXNlOiAncGFzcycsXG4gICAgZW50ZXJwcmlzZTogJ2VudCcsXG4gICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogJ2NvZGUnLFxuICAgIHN1YlR5cGU6ICdsaWdodG5pbmdDdXN0b2R5JyBhcyBjb25zdCxcbiAgfTtcblxuICBjb25zdCBnb0FjY291bnRCYXNlID0ge1xuICAgIGxhYmVsOiAndGVzdCcsXG4gICAgcGFzc3BocmFzZTogJ3Bhc3MnLFxuICAgIGVudGVycHJpc2U6ICdlbnQnLFxuICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICdjb2RlJyxcbiAgICB0eXBlOiAndHJhZGluZycgYXMgY29uc3QsXG4gIH07XG5cbiAgaXQoJ0dlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjIGFjY2VwdHMgZW5jcnlwdGlvblZlcnNpb246IDInLCAoKSA9PiB7XG4gICAgYXNzZXJ0Lm9rKGlzUmlnaHQoR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMuZGVjb2RlKHsgLi4ubGlnaHRuaW5nQmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDIgfSkpKTtcbiAgfSk7XG5cbiAgaXQoJ0dlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjIHJlamVjdHMgZW5jcnlwdGlvblZlcnNpb246IDMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0Lm9rKGlzTGVmdChHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYy5kZWNvZGUoeyAuLi5saWdodG5pbmdCYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMyB9KSkpO1xuICB9KTtcblxuICBpdCgnR2VuZXJhdGVMaWdodG5pbmdXYWxsZXRPcHRpb25zQ29kZWMgd29ya3Mgd2l0aG91dCBlbmNyeXB0aW9uVmVyc2lvbicsICgpID0+IHtcbiAgICBhc3NlcnQub2soaXNSaWdodChHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnNDb2RlYy5kZWNvZGUobGlnaHRuaW5nQmFzZSkpKTtcbiAgfSk7XG5cbiAgaXQoJ0dlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjIGFjY2VwdHMgZW5jcnlwdGlvblZlcnNpb246IDInLCAoKSA9PiB7XG4gICAgYXNzZXJ0Lm9rKGlzUmlnaHQoR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMuZGVjb2RlKHsgLi4uZ29BY2NvdW50QmFzZSwgZW5jcnlwdGlvblZlcnNpb246IDIgfSkpKTtcbiAgfSk7XG5cbiAgaXQoJ0dlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjIHJlamVjdHMgZW5jcnlwdGlvblZlcnNpb246IDMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0Lm9rKGlzTGVmdChHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYy5kZWNvZGUoeyAuLi5nb0FjY291bnRCYXNlLCBlbmNyeXB0aW9uVmVyc2lvbjogMyB9KSkpO1xuICB9KTtcblxuICBpdCgnR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zQ29kZWMgd29ya3Mgd2l0aG91dCBlbmNyeXB0aW9uVmVyc2lvbicsICgpID0+IHtcbiAgICBhc3NlcnQub2soaXNSaWdodChHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYy5kZWNvZGUoZ29BY2NvdW50QmFzZSkpKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -63,6 +63,9 @@ describe('Wallets - WebAuthn wallet creation', function () {
63
63
  encrypt: sinon
64
64
  .stub()
65
65
  .callsFake(({ password, input }) => `encrypted:${password}:${input}`),
66
+ encryptAsync: sinon
67
+ .stub()
68
+ .callsFake(async ({ password, input }) => `encrypted:${password}:${input}`),
66
69
  setRequestTracer: sinon.stub(),
67
70
  };
68
71
  mockBaseCoin = {
@@ -144,7 +147,7 @@ describe('Wallets - WebAuthn wallet creation', function () {
144
147
  passphrase: webauthnPassphrase,
145
148
  },
146
149
  });
147
- const encryptCalls = mockBitGo.encrypt.getCalls();
150
+ const encryptCalls = mockBitGo.encryptAsync.getCalls();
148
151
  const passwordsUsed = encryptCalls.map((call) => call.args[0].password);
149
152
  passwordsUsed.should.containEql(walletPassphrase);
150
153
  passwordsUsed.should.containEql(webauthnPassphrase);
@@ -194,4 +197,4 @@ describe('Wallets - WebAuthn wallet creation', function () {
194
197
  });
195
198
  });
196
199
  });
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c1dlYmF1dGhuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzV2ViYXV0aG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFFL0QsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO0lBQzdDLElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBRXZCLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sUUFBUSxHQUNaLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULGFBQWEsR0FBRztZQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQzlGLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDNUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVB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QyxRQUFRLEVBQUUsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDekYsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUVBQW1FLEVBQUUsS0FBSztZQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxhQUFhO2dCQUNwQixVQUFVLEVBQUUsbUJBQW1CO2dCQUMvQixZQUFZLEVBQUU7b0JBQ1osV0FBVyxFQUFFLFlBQVk7b0JBQ3pCLE9BQU8sRUFBRSxVQUFVO29CQUNuQixVQUFVLEVBQUUsd0JBQXdCO2lCQUNyQzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cyc7XG5cbmRlc2NyaWJlKCdXYWxsZXRzIC0gV2ViQXV0aG4gd2FsbGV0IGNyZWF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgd2FsbGV0czogV2FsbGV0cztcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrS2V5Y2hhaW5zOiBhbnk7XG5cbiAgY29uc3QgdXNlclBydiA9ICd4cHJ2U29tZVVzZXJQcml2YXRlS2V5JztcbiAgY29uc3QgdXNlclB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG4gIGNvbnN0IGJhY2t1cFB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNHY3pqdU1vUm02ZFhhTERFaFcxdTM0Z0tlbmJlWXFBaXgyMW1kVUtKeXV5dTVGMXJ6WUdWeHlMNnRtZ0JVQUVQckV6OTJtQlhqQnlNUmlKZGJhOXdwbk4zN1JMTEFYYSc7XG4gIGNvbnN0IGJpdGdvUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0VZUzh3N1hMU1ZlRXNCWHk3OXpTekgxSjh2Q2R4QVpuaW5nV0xkTjN6Z3RVNkxCcEI4NWIzRDJ5YzhzZnZaVTUyMUFBd2RaYWZFejdtbnpCQnN6NHdLWTVmVHRUUUJtJztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgY3JlYXRlOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YjogdXNlclB1YiwgcHJ2OiB1c2VyUHJ2IH0pLFxuICAgICAgYWRkOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9KSxcbiAgICAgIGNyZWF0ZUJhY2t1cDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiYWNrdXAta2V5LWlkJywgcHViOiBiYWNrdXBQdWIgfSksXG4gICAgICBjcmVhdGVCaXRHbzogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrV2FsbGV0RGF0YSA9IHsgaWQ6ICd3YWxsZXQtaWQnLCBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10gfTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tXYWxsZXREYXRhKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgIC5zdHViKClcbiAgICAgICAgLmNhbGxzRmFrZSgoeyBwYXNzd29yZCwgaW5wdXQgfTogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IGBlbmNyeXB0ZWQ6JHtwYXNzd29yZH06JHtpbnB1dH1gKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgaXNFVk06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvbmNoYWluJyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgICBpc1ZhbGlkTW9mTlNldHVwOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgIGdldENvbmZpZzogc2lub24uc3R1YigpLnJldHVybnMoeyBmZWF0dXJlczogW10gfSksXG4gICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICBzaWduTWVzc2FnZTogc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKCdhYWJiY2MnLCAnaGV4JykpLFxuICAgIH07XG5cbiAgICB3YWxsZXRzID0gbmV3IFdhbGxldHMobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4pO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlV2FsbGV0IHdpdGggd2ViYXV0aG5JbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIHdlYmF1dGhuRGV2aWNlcyB0byBrZXljaGFpbiBwYXJhbXMgd2hlbiB3ZWJhdXRobkluZm8gaXMgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgIHBhc3NwaHJhc2U6ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dhbGxldC1wYXNzcGhyYXNlJyxcbiAgICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmFkZC5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkUGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3RwRGV2aWNlSWQnLCB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJmU2FsdCcsIHdlYmF1dGhuSW5mby5wcmZTYWx0KTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2ViYXV0aG4gcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYgPSBgZW5jcnlwdGVkOiR7d2ViYXV0aG5QYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicsIGV4cGVjdGVkRW5jcnlwdGVkUHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxzbyBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB3YWxsZXQgcGFzc3BocmFzZSB3aGVuIHdlYmF1dGhuSW5mbyBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAnd2FsbGV0LXBhc3NwaHJhc2UnO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHdlYmF1dGhuSW5mbzoge1xuICAgICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgICAgcHJmU2FsdDogJ3NhbHQtYWJjJyxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncHJmLWRlcml2ZWQtcGFzc3BocmFzZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWRkUGFyYW1zID0gbW9ja0tleWNoYWlucy5hZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjb25zdCBleHBlY3RlZEVuY3J5cHRlZFBydiA9IGBlbmNyeXB0ZWQ6JHt3YWxsZXRQYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZW5jcnlwdGVkUHJ2JywgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc2VwYXJhdGUgZW5jcnlwdCBjYWxscyBmb3Igd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHdlYmF1dGhuIHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3dhbGxldC1wYXNzcGhyYXNlJztcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY3J5cHRDYWxscyA9IG1vY2tCaXRHby5lbmNyeXB0LmdldENhbGxzKCk7XG4gICAgICBjb25zdCBwYXNzd29yZHNVc2VkID0gZW5jcnlwdENhbGxzLm1hcCgoY2FsbDogc2lub24uU2lub25TcHlDYWxsKSA9PiBjYWxsLmFyZ3NbMF0ucGFzc3dvcmQpO1xuICAgICAgcGFzc3dvcmRzVXNlZC5zaG91bGQuY29udGFpbkVxbCh3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHBhc3N3b3Jkc1VzZWQuc2hvdWxkLmNvbnRhaW5FcWwod2ViYXV0aG5QYXNzcGhyYXNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFkZCB3ZWJhdXRobkRldmljZXMgd2hlbiB3ZWJhdXRobkluZm8gaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmFkZC5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkUGFyYW1zLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2ViYXV0aG5EZXZpY2VzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBhZGQgd2ViYXV0aG5EZXZpY2VzIHdoZW4gdXNlcktleSBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIChubyBwcnYgYXZhaWxhYmxlKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gYSB1c2VyLXByb3ZpZGVkIHB1YmxpYyBrZXkgaXMgdXNlZCwgdGhlcmUgaXMgbm8gcHJpdmF0ZSBrZXkgdG8gZW5jcnlwdCwgc28gd2ViYXV0aG5EZXZpY2VzIGlzIHNraXBwZWRcbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgdXNlcktleTogdXNlclB1YixcbiAgICAgICAgYmFja3VwWHB1YjogYmFja3VwUHViLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3ByZi1kZXJpdmVkLXBhc3NwaHJhc2UnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIGFkZCBpcyBjYWxsZWQgZm9yIGJvdGggdXNlciBrZXljaGFpbiAocHViLW9ubHkpIGFuZCBiYWNrdXAga2V5Y2hhaW4gLSBuZWl0aGVyIHNob3VsZCBoYXZlIHdlYmF1dGhuRGV2aWNlc1xuICAgICAgY29uc3QgYWxsQWRkQ2FsbHMgPSBtb2NrS2V5Y2hhaW5zLmFkZC5nZXRDYWxscygpO1xuICAgICAgYXNzZXJ0Lm9rKGFsbEFkZENhbGxzLmxlbmd0aCA+IDAsICdleHBlY3RlZCBrZXljaGFpbnMoKS5hZGQgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UnKTtcbiAgICAgIGZvciAoY29uc3QgY2FsbCBvZiBhbGxBZGRDYWxscykge1xuICAgICAgICBjYWxsLmFyZ3NbMF0uc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHdhbGxldCB3aXRoIGtleWNoYWlucyB3aGVuIHdlYmF1dGhuSW5mbyBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dhbGxldC1wYXNzcGhyYXNlJyxcbiAgICAgICAgd2ViYXV0aG5JbmZvOiB7XG4gICAgICAgICAgb3RwRGV2aWNlSWQ6ICdkZXZpY2UtMTIzJyxcbiAgICAgICAgICBwcmZTYWx0OiAnc2FsdC1hYmMnLFxuICAgICAgICAgIHBhc3NwaHJhc2U6ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3dhbGxldCcpO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCd1c2VyS2V5Y2hhaW4nKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYmFja3VwS2V5Y2hhaW4nKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYml0Z29LZXljaGFpbicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c1dlYmF1dGhuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzV2ViYXV0aG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFFL0QsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO0lBQzdDLElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBRXZCLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sU0FBUyxHQUNiLGlIQUFpSCxDQUFDO0lBQ3BILE1BQU0sUUFBUSxHQUNaLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULGFBQWEsR0FBRztZQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQzlGLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDNUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVB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QyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cyc7XG5cbmRlc2NyaWJlKCdXYWxsZXRzIC0gV2ViQXV0aG4gd2FsbGV0IGNyZWF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBsZXQgd2FsbGV0czogV2FsbGV0cztcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG4gIGxldCBtb2NrS2V5Y2hhaW5zOiBhbnk7XG5cbiAgY29uc3QgdXNlclBydiA9ICd4cHJ2U29tZVVzZXJQcml2YXRlS2V5JztcbiAgY29uc3QgdXNlclB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG4gIGNvbnN0IGJhY2t1cFB1YiA9XG4gICAgJ3hwdWI2NjFNeU13QXFSYmNHY3pqdU1vUm02ZFhhTERFaFcxdTM0Z0tlbmJlWXFBaXgyMW1kVUtKeXV5dTVGMXJ6WUdWeHlMNnRtZ0JVQUVQckV6OTJtQlhqQnlNUmlKZGJhOXdwbk4zN1JMTEFYYSc7XG4gIGNvbnN0IGJpdGdvUHViID1cbiAgICAneHB1YjY2MU15TXdBcVJiY0VZUzh3N1hMU1ZlRXNCWHk3OXpTekgxSjh2Q2R4QVpuaW5nV0xkTjN6Z3RVNkxCcEI4NWIzRDJ5YzhzZnZaVTUyMUFBd2RaYWZFejdtbnpCQnN6NHdLWTVmVHRUUUJtJztcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrS2V5Y2hhaW5zID0ge1xuICAgICAgY3JlYXRlOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YjogdXNlclB1YiwgcHJ2OiB1c2VyUHJ2IH0pLFxuICAgICAgYWRkOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ3VzZXIta2V5LWlkJywgcHViOiB1c2VyUHViLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtcHJ2JyB9KSxcbiAgICAgIGNyZWF0ZUJhY2t1cDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiYWNrdXAta2V5LWlkJywgcHViOiBiYWNrdXBQdWIgfSksXG4gICAgICBjcmVhdGVCaXRHbzogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiaXRnby1rZXktaWQnLCBwdWI6IGJpdGdvUHViIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2NrV2FsbGV0RGF0YSA9IHsgaWQ6ICd3YWxsZXQtaWQnLCBrZXlzOiBbJ3VzZXIta2V5LWlkJywgJ2JhY2t1cC1rZXktaWQnLCAnYml0Z28ta2V5LWlkJ10gfTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKG1vY2tXYWxsZXREYXRhKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgIC5zdHViKClcbiAgICAgICAgLmNhbGxzRmFrZSgoeyBwYXNzd29yZCwgaW5wdXQgfTogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IGBlbmNyeXB0ZWQ6JHtwYXNzd29yZH06JHtpbnB1dH1gKSxcbiAgICAgIGVuY3J5cHRBc3luYzogc2lub25cbiAgICAgICAgLnN0dWIoKVxuICAgICAgICAuY2FsbHNGYWtlKFxuICAgICAgICAgIGFzeW5jICh7IHBhc3N3b3JkLCBpbnB1dCB9OiB7IHBhc3N3b3JkOiBzdHJpbmc7IGlucHV0OiBzdHJpbmcgfSkgPT4gYGVuY3J5cHRlZDoke3Bhc3N3b3JkfToke2lucHV0fWBcbiAgICAgICAgKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgaXNFVk06IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKSxcbiAgICAgIHN1cHBvcnRzVHNzOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldERlZmF1bHRNdWx0aXNpZ1R5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdvbmNoYWluJyksXG4gICAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tLZXljaGFpbnMpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgICBpc1ZhbGlkTW9mTlNldHVwOiBzaW5vbi5zdHViKCkucmV0dXJucyh0cnVlKSxcbiAgICAgIGdldENvbmZpZzogc2lub24uc3R1YigpLnJldHVybnMoeyBmZWF0dXJlczogW10gfSksXG4gICAgICBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhcmFtczogYW55KSA9PiBQcm9taXNlLnJlc29sdmUocGFyYW1zKSksXG4gICAgICBzaWduTWVzc2FnZTogc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKCdhYWJiY2MnLCAnaGV4JykpLFxuICAgIH07XG5cbiAgICB3YWxsZXRzID0gbmV3IFdhbGxldHMobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4pO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlV2FsbGV0IHdpdGggd2ViYXV0aG5JbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWRkIHdlYmF1dGhuRGV2aWNlcyB0byBrZXljaGFpbiBwYXJhbXMgd2hlbiB3ZWJhdXRobkluZm8gaXMgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgIHBhc3NwaHJhc2U6ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJyxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQoe1xuICAgICAgICBsYWJlbDogJ1Rlc3QgV2FsbGV0JyxcbiAgICAgICAgcGFzc3BocmFzZTogJ3dhbGxldC1wYXNzcGhyYXNlJyxcbiAgICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrS2V5Y2hhaW5zLmFkZC5jYWxsZWRPbmNlLCB0cnVlKTtcbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYWRkUGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3RwRGV2aWNlSWQnLCB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQpO1xuICAgICAgYWRkUGFyYW1zLndlYmF1dGhuRGV2aWNlc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJmU2FsdCcsIHdlYmF1dGhuSW5mby5wcmZTYWx0KTtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB0aGUgd2ViYXV0aG4gcGFzc3BocmFzZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFkZFBhcmFtcyA9IG1vY2tLZXljaGFpbnMuYWRkLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYgPSBgZW5jcnlwdGVkOiR7d2ViYXV0aG5QYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy53ZWJhdXRobkRldmljZXNbMF0uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2VuY3J5cHRlZFBydicsIGV4cGVjdGVkRW5jcnlwdGVkUHJ2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxzbyBlbmNyeXB0IHVzZXIgcHJpdmF0ZSBrZXkgd2l0aCB3YWxsZXQgcGFzc3BocmFzZSB3aGVuIHdlYmF1dGhuSW5mbyBpcyBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldFBhc3NwaHJhc2UgPSAnd2FsbGV0LXBhc3NwaHJhc2UnO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHdlYmF1dGhuSW5mbzoge1xuICAgICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgICAgcHJmU2FsdDogJ3NhbHQtYWJjJyxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncHJmLWRlcml2ZWQtcGFzc3BocmFzZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWRkUGFyYW1zID0gbW9ja0tleWNoYWlucy5hZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBjb25zdCBleHBlY3RlZEVuY3J5cHRlZFBydiA9IGBlbmNyeXB0ZWQ6JHt3YWxsZXRQYXNzcGhyYXNlfToke3VzZXJQcnZ9YDtcbiAgICAgIGFkZFBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZW5jcnlwdGVkUHJ2JywgZXhwZWN0ZWRFbmNyeXB0ZWRQcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc2VwYXJhdGUgZW5jcnlwdCBjYWxscyBmb3Igd2FsbGV0IHBhc3NwaHJhc2UgYW5kIHdlYmF1dGhuIHBhc3NwaHJhc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ3dhbGxldC1wYXNzcGhyYXNlJztcbiAgICAgIGNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwcmYtZGVyaXZlZC1wYXNzcGhyYXNlJztcblxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogd2ViYXV0aG5QYXNzcGhyYXNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY3J5cHRDYWxscyA9IG1vY2tCaXRHby5lbmNyeXB0QXN5bmMuZ2V0Q2FsbHMoKTtcbiAgICAgIGNvbnN0IHBhc3N3b3Jkc1VzZWQgPSBlbmNyeXB0Q2FsbHMubWFwKChjYWxsOiBzaW5vbi5TaW5vblNweUNhbGwpID0+IGNhbGwuYXJnc1swXS5wYXNzd29yZCk7XG4gICAgICBwYXNzd29yZHNVc2VkLnNob3VsZC5jb250YWluRXFsKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgcGFzc3dvcmRzVXNlZC5zaG91bGQuY29udGFpbkVxbCh3ZWJhdXRoblBhc3NwaHJhc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgYWRkIHdlYmF1dGhuRGV2aWNlcyB3aGVuIHdlYmF1dGhuSW5mbyBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6ICd3YWxsZXQtcGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tLZXljaGFpbnMuYWRkLmNhbGxlZE9uY2UsIHRydWUpO1xuICAgICAgY29uc3QgYWRkUGFyYW1zID0gbW9ja0tleWNoYWlucy5hZGQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBhZGRQYXJhbXMuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCd3ZWJhdXRobkRldmljZXMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGFkZCB3ZWJhdXRobkRldmljZXMgd2hlbiB1c2VyS2V5IGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQgKG5vIHBydiBhdmFpbGFibGUpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gV2hlbiBhIHVzZXItcHJvdmlkZWQgcHVibGljIGtleSBpcyB1c2VkLCB0aGVyZSBpcyBubyBwcml2YXRlIGtleSB0byBlbmNyeXB0LCBzbyB3ZWJhdXRobkRldmljZXMgaXMgc2tpcHBlZFxuICAgICAgYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICB1c2VyS2V5OiB1c2VyUHViLFxuICAgICAgICBiYWNrdXBYcHViOiBiYWNrdXBQdWIsXG4gICAgICAgIHdlYmF1dGhuSW5mbzoge1xuICAgICAgICAgIG90cERldmljZUlkOiAnZGV2aWNlLTEyMycsXG4gICAgICAgICAgcHJmU2FsdDogJ3NhbHQtYWJjJyxcbiAgICAgICAgICBwYXNzcGhyYXNlOiAncHJmLWRlcml2ZWQtcGFzc3BocmFzZScsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gYWRkIGlzIGNhbGxlZCBmb3IgYm90aCB1c2VyIGtleWNoYWluIChwdWItb25seSkgYW5kIGJhY2t1cCBrZXljaGFpbiAtIG5laXRoZXIgc2hvdWxkIGhhdmUgd2ViYXV0aG5EZXZpY2VzXG4gICAgICBjb25zdCBhbGxBZGRDYWxscyA9IG1vY2tLZXljaGFpbnMuYWRkLmdldENhbGxzKCk7XG4gICAgICBhc3NlcnQub2soYWxsQWRkQ2FsbHMubGVuZ3RoID4gMCwgJ2V4cGVjdGVkIGtleWNoYWlucygpLmFkZCB0byBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZScpO1xuICAgICAgZm9yIChjb25zdCBjYWxsIG9mIGFsbEFkZENhbGxzKSB7XG4gICAgICAgIGNhbGwuYXJnc1swXS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dlYmF1dGhuRGV2aWNlcycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gd2FsbGV0IHdpdGgga2V5Y2hhaW5zIHdoZW4gd2ViYXV0aG5JbmZvIGlzIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0cy5nZW5lcmF0ZVdhbGxldCh7XG4gICAgICAgIGxhYmVsOiAnVGVzdCBXYWxsZXQnLFxuICAgICAgICBwYXNzcGhyYXNlOiAnd2FsbGV0LXBhc3NwaHJhc2UnLFxuICAgICAgICB3ZWJhdXRobkluZm86IHtcbiAgICAgICAgICBvdHBEZXZpY2VJZDogJ2RldmljZS0xMjMnLFxuICAgICAgICAgIHByZlNhbHQ6ICdzYWx0LWFiYycsXG4gICAgICAgICAgcGFzc3BocmFzZTogJ3ByZi1kZXJpdmVkLXBhc3NwaHJhc2UnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnd2FsbGV0Jyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3VzZXJLZXljaGFpbicpO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdiYWNrdXBLZXljaGFpbicpO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdiaXRnb0tleWNoYWluJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=