@bitgo-beta/abstract-lightning 1.0.1-beta.98 → 1.0.1-beta.980

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 (89) hide show
  1. package/dist/src/abstractLightningCoin.d.ts +3 -2
  2. package/dist/src/abstractLightningCoin.d.ts.map +1 -1
  3. package/dist/src/abstractLightningCoin.js +7 -2
  4. package/dist/src/codecs/api/backup.d.ts +15 -0
  5. package/dist/src/codecs/api/backup.d.ts.map +1 -0
  6. package/dist/src/codecs/api/backup.js +47 -0
  7. package/dist/src/codecs/api/balance.d.ts +132 -0
  8. package/dist/src/codecs/api/balance.d.ts.map +1 -0
  9. package/dist/src/codecs/api/balance.js +101 -0
  10. package/dist/src/codecs/api/index.d.ts +8 -0
  11. package/dist/src/codecs/api/index.d.ts.map +1 -0
  12. package/dist/src/codecs/api/index.js +24 -0
  13. package/dist/src/codecs/api/invoice.d.ts +66 -0
  14. package/dist/src/codecs/api/invoice.d.ts.map +1 -0
  15. package/dist/src/codecs/api/invoice.js +102 -0
  16. package/dist/src/codecs/api/payment.d.ts +107 -0
  17. package/dist/src/codecs/api/payment.d.ts.map +1 -0
  18. package/dist/src/codecs/api/payment.js +153 -0
  19. package/dist/src/codecs/api/transaction.d.ts +138 -0
  20. package/dist/src/codecs/api/transaction.d.ts.map +1 -0
  21. package/dist/src/codecs/api/transaction.js +122 -0
  22. package/dist/src/codecs/api/wallet.d.ts +99 -0
  23. package/dist/src/codecs/api/wallet.d.ts.map +1 -0
  24. package/dist/src/codecs/api/wallet.js +103 -0
  25. package/dist/src/codecs/api/withdraw.d.ts +92 -0
  26. package/dist/src/codecs/api/withdraw.d.ts.map +1 -0
  27. package/dist/src/codecs/api/withdraw.js +92 -0
  28. package/dist/src/codecs/index.d.ts +3 -0
  29. package/dist/src/codecs/index.d.ts.map +1 -0
  30. package/dist/src/codecs/index.js +19 -0
  31. package/dist/src/codecs/shared.d.ts +7 -0
  32. package/dist/src/codecs/shared.d.ts.map +1 -0
  33. package/dist/src/codecs/shared.js +42 -0
  34. package/dist/src/index.d.ts +3 -0
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/index.js +4 -1
  37. package/dist/src/lightning/index.d.ts +5 -0
  38. package/dist/src/lightning/index.d.ts.map +1 -0
  39. package/dist/src/lightning/index.js +21 -0
  40. package/dist/src/lightning/lightningUtils.d.ts +90 -0
  41. package/dist/src/lightning/lightningUtils.d.ts.map +1 -0
  42. package/dist/src/lightning/lightningUtils.js +290 -0
  43. package/dist/src/lightning/parseWithdrawPsbt.d.ts +8 -0
  44. package/dist/src/lightning/parseWithdrawPsbt.d.ts.map +1 -0
  45. package/dist/src/lightning/parseWithdrawPsbt.js +155 -0
  46. package/dist/src/lightning/signableJson.d.ts +17 -0
  47. package/dist/src/lightning/signableJson.d.ts.map +1 -0
  48. package/dist/src/lightning/signableJson.js +29 -0
  49. package/dist/src/lightning/signature.d.ts +22 -0
  50. package/dist/src/lightning/signature.d.ts.map +1 -0
  51. package/dist/src/lightning/signature.js +69 -0
  52. package/dist/src/wallet/custodialLightning.d.ts +7 -0
  53. package/dist/src/wallet/custodialLightning.d.ts.map +1 -0
  54. package/dist/src/wallet/custodialLightning.js +14 -0
  55. package/dist/src/wallet/index.d.ts +5 -0
  56. package/dist/src/wallet/index.d.ts.map +1 -0
  57. package/dist/src/wallet/index.js +21 -0
  58. package/dist/src/wallet/lightning.d.ts +141 -0
  59. package/dist/src/wallet/lightning.d.ts.map +1 -0
  60. package/dist/src/wallet/lightning.js +288 -0
  61. package/dist/src/wallet/selfCustodialLightning.d.ts +32 -0
  62. package/dist/src/wallet/selfCustodialLightning.d.ts.map +1 -0
  63. package/dist/src/wallet/selfCustodialLightning.js +131 -0
  64. package/dist/src/wallet/wallet.d.ts +7 -0
  65. package/dist/src/wallet/wallet.d.ts.map +1 -0
  66. package/dist/src/wallet/wallet.js +22 -0
  67. package/dist/test/unit/lightning/codecs.d.ts +2 -0
  68. package/dist/test/unit/lightning/codecs.d.ts.map +1 -0
  69. package/dist/test/unit/lightning/codecs.js +151 -0
  70. package/dist/test/unit/lightning/createWatchOnlyFixture.d.ts +4 -0
  71. package/dist/test/unit/lightning/createWatchOnlyFixture.d.ts.map +1 -0
  72. package/dist/test/unit/lightning/createWatchOnlyFixture.js +1561 -0
  73. package/dist/test/unit/lightning/lightningUtils.d.ts +2 -0
  74. package/dist/test/unit/lightning/lightningUtils.d.ts.map +1 -0
  75. package/dist/test/unit/lightning/lightningUtils.js +123 -0
  76. package/dist/test/unit/lightning/parseWithdrawPsbt.d.ts +2 -0
  77. package/dist/test/unit/lightning/parseWithdrawPsbt.d.ts.map +1 -0
  78. package/dist/test/unit/lightning/parseWithdrawPsbt.js +125 -0
  79. package/dist/test/unit/lightning/signableJson.d.ts +2 -0
  80. package/dist/test/unit/lightning/signableJson.d.ts.map +1 -0
  81. package/dist/test/unit/lightning/signableJson.js +52 -0
  82. package/dist/test/unit/lightning/signature.d.ts +2 -0
  83. package/dist/test/unit/lightning/signature.d.ts.map +1 -0
  84. package/dist/test/unit/lightning/signature.js +91 -0
  85. package/dist/tsconfig.tsbuildinfo +1 -0
  86. package/package.json +19 -6
  87. package/.eslintignore +0 -5
  88. package/.mocharc.yml +0 -8
  89. package/CHANGELOG.md +0 -76
@@ -0,0 +1,288 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LightningWallet = void 0;
37
+ exports.getLightningKeychain = getLightningKeychain;
38
+ exports.getLightningAuthKeychains = getLightningAuthKeychains;
39
+ const sdkcore = __importStar(require("@bitgo-beta/sdk-core"));
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const t = __importStar(require("io-ts"));
42
+ const lightning_1 = require("../lightning");
43
+ const codecs_1 = require("../codecs");
44
+ const public_types_1 = require("@bitgo/public-types");
45
+ /**
46
+ * Get the lightning keychain for the given wallet.
47
+ */
48
+ async function getLightningKeychain(wallet) {
49
+ const coin = wallet.baseCoin;
50
+ if (coin.getFamily() !== 'lnbtc') {
51
+ throw new Error(`Invalid coin to get lightning wallet key: ${coin.getFamily()}`);
52
+ }
53
+ const keyIds = wallet.keyIds();
54
+ if (keyIds.length !== 1) {
55
+ throw new Error(`Invalid number of key in lightning wallet: ${keyIds.length}`);
56
+ }
57
+ const keychain = await coin.keychains().get({ id: keyIds[0] });
58
+ return sdkcore.decodeOrElse(codecs_1.LightningKeychain.name, codecs_1.LightningKeychain, keychain, (_) => {
59
+ throw new Error(`Invalid user key`);
60
+ });
61
+ }
62
+ /**
63
+ * Get the lightning auth keychains for the given wallet.
64
+ */
65
+ async function getLightningAuthKeychains(wallet) {
66
+ const coin = wallet.baseCoin;
67
+ if (coin.getFamily() !== 'lnbtc') {
68
+ throw new Error(`Invalid coin to get lightning wallet auth keys: ${coin.getFamily()}`);
69
+ }
70
+ const authKeyIds = wallet.coinSpecific()?.keys;
71
+ if (authKeyIds?.length !== 2) {
72
+ throw new Error(`Invalid number of auth keys in lightning wallet: ${authKeyIds?.length}`);
73
+ }
74
+ const keychains = await Promise.all(authKeyIds.map((id) => coin.keychains().get({ id })));
75
+ const authKeychains = keychains.map((keychain) => {
76
+ return sdkcore.decodeOrElse(codecs_1.LightningAuthKeychain.name, codecs_1.LightningAuthKeychain, keychain, (_) => {
77
+ // DON'T throw errors from decodeOrElse. It could leak sensitive information.
78
+ throw new Error(`Invalid lightning auth key: ${keychain?.id}`);
79
+ });
80
+ });
81
+ const [userAuthKey, nodeAuthKey] = ['userAuth', 'nodeAuth'].map((purpose) => {
82
+ const keychain = authKeychains.find((k) => (0, lightning_1.unwrapLightningCoinSpecific)(k.coinSpecific, coin.getChain()).purpose === purpose);
83
+ if (!keychain) {
84
+ throw new Error(`Missing ${purpose} key`);
85
+ }
86
+ return keychain;
87
+ });
88
+ return { userAuthKey, nodeAuthKey };
89
+ }
90
+ class LightningWallet {
91
+ constructor(wallet) {
92
+ const coin = wallet.baseCoin;
93
+ if (coin.getFamily() !== 'lnbtc') {
94
+ throw new Error(`Invalid coin for lightning wallet: ${coin.getFamily()}`);
95
+ }
96
+ this.wallet = wallet;
97
+ }
98
+ async createInvoice(params) {
99
+ const createInvoiceResponse = await this.wallet.bitgo
100
+ .post(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice`, 2))
101
+ .send(t.exact(codecs_1.CreateInvoiceBody).encode(params))
102
+ .result();
103
+ return sdkcore.decodeOrElse(codecs_1.Invoice.name, codecs_1.Invoice, createInvoiceResponse, (error) => {
104
+ // DON'T throw errors from decodeOrElse. It could leak sensitive information.
105
+ throw new Error(`Invalid create invoice response ${error}`);
106
+ });
107
+ }
108
+ async getInvoice(paymentHash) {
109
+ const response = await this.wallet.bitgo
110
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice/${paymentHash}`, 2))
111
+ .result();
112
+ return (0, sdk_core_1.decodeOrElse)(codecs_1.Invoice.name, codecs_1.Invoice, response, (error) => {
113
+ throw new Error(`Invalid get invoice response ${error}`);
114
+ });
115
+ }
116
+ async listInvoices(params) {
117
+ const returnCodec = codecs_1.ListInvoicesResponse;
118
+ const createInvoiceResponse = await this.wallet.bitgo
119
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice`, 2))
120
+ .query(codecs_1.InvoiceQuery.encode(params))
121
+ .result();
122
+ return sdkcore.decodeOrElse(returnCodec.name, returnCodec, createInvoiceResponse, (error) => {
123
+ throw new Error(`Invalid list invoices response ${error}`);
124
+ });
125
+ }
126
+ async payInvoice(params) {
127
+ const reqId = new sdk_core_1.RequestTracer();
128
+ this.wallet.bitgo.setRequestTracer(reqId);
129
+ const { userAuthKey } = await getLightningAuthKeychains(this.wallet);
130
+ const userAuthKeyEncryptedPrv = userAuthKey.encryptedPrv;
131
+ if (!userAuthKeyEncryptedPrv) {
132
+ throw new Error(`user auth key is missing encrypted private key`);
133
+ }
134
+ const signature = (0, lightning_1.createMessageSignature)(t.exact(public_types_1.LightningPaymentRequest).encode(params), this.wallet.bitgo.decrypt({ password: params.passphrase, input: userAuthKeyEncryptedPrv }));
135
+ const paymentIntent = {
136
+ intent: {
137
+ comment: params.comment,
138
+ sequenceId: params.sequenceId,
139
+ intentType: 'payment',
140
+ signedRequest: {
141
+ invoice: params.invoice,
142
+ amountMsat: params.amountMsat,
143
+ feeLimitMsat: params.feeLimitMsat,
144
+ feeLimitRatio: params.feeLimitRatio,
145
+ },
146
+ signature,
147
+ },
148
+ };
149
+ const transactionRequestCreate = (await this.wallet.bitgo
150
+ .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests', 2))
151
+ .send(t.type({ intent: public_types_1.LightningPaymentIntent }).encode(paymentIntent))
152
+ .result());
153
+ if (transactionRequestCreate.state === 'pendingApproval') {
154
+ const pendingApprovals = new sdk_core_1.PendingApprovals(this.wallet.bitgo, this.wallet.baseCoin);
155
+ const pendingApproval = await pendingApprovals.get({ id: transactionRequestCreate.pendingApprovalId });
156
+ return {
157
+ pendingApproval: pendingApproval.toJSON(),
158
+ txRequestId: transactionRequestCreate.txRequestId,
159
+ txRequestState: transactionRequestCreate.state,
160
+ };
161
+ }
162
+ await this.wallet.bitgo
163
+ .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests/' + transactionRequestCreate.txRequestId + '/transfers', 2))
164
+ .send()
165
+ .result();
166
+ const transactionRequestSend = await sdk_core_1.commonTssMethods.sendTxRequest(this.wallet.bitgo, this.wallet.id(), transactionRequestCreate.txRequestId, sdk_core_1.RequestType.tx, reqId);
167
+ const coinSpecific = transactionRequestSend.transactions?.[0]?.unsignedTx?.coinSpecific;
168
+ return {
169
+ txRequestId: transactionRequestCreate.txRequestId,
170
+ txRequestState: transactionRequestSend.state,
171
+ paymentStatus: coinSpecific
172
+ ? t.exact(codecs_1.LndCreatePaymentResponse).encode(coinSpecific)
173
+ : undefined,
174
+ };
175
+ }
176
+ async withdrawOnchain(params) {
177
+ const reqId = new sdk_core_1.RequestTracer();
178
+ this.wallet.bitgo.setRequestTracer(reqId);
179
+ const paymentIntent = {
180
+ intent: {
181
+ comment: params.comment,
182
+ sequenceId: params.sequenceId,
183
+ onchainRequest: {
184
+ recipients: params.recipients,
185
+ satsPerVbyte: params.satsPerVbyte,
186
+ numBlocks: params.numBlocks,
187
+ },
188
+ intentType: 'payment',
189
+ },
190
+ };
191
+ const transactionRequestCreate = (await this.wallet.bitgo
192
+ .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests', 2))
193
+ .send(t.type({ intent: public_types_1.LightningPaymentIntent }).encode(paymentIntent))
194
+ .result());
195
+ if (!transactionRequestCreate.transactions ||
196
+ transactionRequestCreate.transactions.length === 0 ||
197
+ !transactionRequestCreate.transactions[0].unsignedTx.serializedTxHex) {
198
+ throw new Error(`serialized txHex is missing`);
199
+ }
200
+ const walletData = this.wallet.toJSON();
201
+ if (!walletData.coinSpecific.watchOnlyAccounts) {
202
+ throw new Error(`wallet is missing watch only accounts`);
203
+ }
204
+ const watchOnlyAccountDetails = (0, sdk_core_1.decodeOrElse)(codecs_1.WatchOnly.name, codecs_1.WatchOnly, walletData.coinSpecific.watchOnlyAccounts, (errors) => {
205
+ throw new Error(`invalid watch only accounts, error: ${errors}`);
206
+ });
207
+ const network = (0, lightning_1.getUtxolibNetwork)(this.wallet.coin());
208
+ try {
209
+ (0, lightning_1.validatePsbtForWithdraw)(transactionRequestCreate.transactions[0].unsignedTx.serializedTxHex, network, params.recipients, watchOnlyAccountDetails.accounts);
210
+ }
211
+ catch (err) {
212
+ throw new Error(`error validating withdraw psbt: ${err}`);
213
+ }
214
+ const { userAuthKey } = await getLightningAuthKeychains(this.wallet);
215
+ const userAuthKeyEncryptedPrv = userAuthKey.encryptedPrv;
216
+ if (!userAuthKeyEncryptedPrv) {
217
+ throw new Error(`user auth key is missing encrypted private key`);
218
+ }
219
+ const signature = (0, lightning_1.createMessageSignature)(transactionRequestCreate.transactions[0].unsignedTx.serializedTxHex, this.wallet.bitgo.decrypt({ password: params.passphrase, input: userAuthKeyEncryptedPrv }));
220
+ const transactionRequestWithSignature = (await this.wallet.bitgo
221
+ .put(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests/' + transactionRequestCreate.txRequestId + '/coinSpecific', 2))
222
+ .send({
223
+ unsignedCoinSpecific: {
224
+ coin: this.wallet.baseCoin.getChain(),
225
+ data: { signature },
226
+ },
227
+ })
228
+ .result());
229
+ if (transactionRequestWithSignature.state === 'pendingApproval') {
230
+ const pendingApprovals = new sdk_core_1.PendingApprovals(this.wallet.bitgo, this.wallet.baseCoin);
231
+ const pendingApproval = await pendingApprovals.get({ id: transactionRequestWithSignature.pendingApprovalId });
232
+ return {
233
+ pendingApproval: pendingApproval.toJSON(),
234
+ txRequestId: transactionRequestWithSignature.txRequestId,
235
+ txRequestState: transactionRequestWithSignature.state,
236
+ };
237
+ }
238
+ await this.wallet.bitgo
239
+ .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests/' + transactionRequestWithSignature.txRequestId + '/transfers', 2))
240
+ .send()
241
+ .result();
242
+ const transactionRequestSend = await sdk_core_1.commonTssMethods.sendTxRequest(this.wallet.bitgo, this.wallet.id(), transactionRequestWithSignature.txRequestId, sdk_core_1.RequestType.tx, reqId);
243
+ const coinSpecific = transactionRequestSend.transactions?.[0]?.unsignedTx?.coinSpecific;
244
+ return {
245
+ txRequestId: transactionRequestWithSignature.txRequestId,
246
+ txRequestState: transactionRequestSend.state,
247
+ withdrawStatus: coinSpecific && 'status' in coinSpecific
248
+ ? t.exact(codecs_1.LndCreateWithdrawResponse).encode(coinSpecific)
249
+ : undefined,
250
+ };
251
+ }
252
+ async getPayment(paymentId) {
253
+ const response = await this.wallet.bitgo
254
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/payment/${paymentId}`, 2))
255
+ .result();
256
+ return (0, sdk_core_1.decodeOrElse)(codecs_1.PaymentInfo.name, codecs_1.PaymentInfo, response, (error) => {
257
+ throw new Error(`Invalid payment response: ${error}`);
258
+ });
259
+ }
260
+ async listPayments(params) {
261
+ const response = await this.wallet.bitgo
262
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/payment`, 2))
263
+ .query(codecs_1.PaymentQuery.encode(params))
264
+ .result();
265
+ return (0, sdk_core_1.decodeOrElse)(codecs_1.ListPaymentsResponse.name, codecs_1.ListPaymentsResponse, response, (error) => {
266
+ throw new Error(`Invalid payment list response: ${error}`);
267
+ });
268
+ }
269
+ async getTransaction(txId) {
270
+ const response = await this.wallet.bitgo
271
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/transaction/${txId}`, 2))
272
+ .result();
273
+ return (0, sdk_core_1.decodeOrElse)(codecs_1.Transaction.name, codecs_1.Transaction, response, (error) => {
274
+ throw new Error(`Invalid transaction response: ${error}`);
275
+ });
276
+ }
277
+ async listTransactions(params) {
278
+ const response = await this.wallet.bitgo
279
+ .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/transaction`, 2))
280
+ .query(codecs_1.TransactionQuery.encode(params))
281
+ .result();
282
+ return (0, sdk_core_1.decodeOrElse)(codecs_1.ListTransactionsResponse.name, codecs_1.ListTransactionsResponse, response, (error) => {
283
+ throw new Error(`Invalid transaction list response: ${error}`);
284
+ });
285
+ }
286
+ }
287
+ exports.LightningWallet = LightningWallet;
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dhbGxldC9saWdodG5pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0VBLG9EQWFDO0FBS0QsOERBOEJDO0FBeEhELDhEQUFnRDtBQUNoRCxtREFTOEI7QUFDOUIseUNBQTJCO0FBQzNCLDRDQUtzQjtBQUN0QixzQ0FtQm1CO0FBQ25CLHNEQUFzRjtBQStCdEY7O0dBRUc7QUFDSSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsTUFBdUI7SUFDaEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRCxPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsMEJBQWlCLENBQUMsSUFBSSxFQUFFLDBCQUFpQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN0QyxDQUFD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QztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBd0I7UUFDN0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7YUFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2xGLEtBQUssQ0FBQyx5QkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLElBQUEsdUJBQVksRUFBQyxpQ0FBd0IsQ0FBQyxJQUFJLEVBQUUsaUNBQXdCLEVBQUUsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDL0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpSRCwwQ0FpUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzZGtjb3JlIGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIFBlbmRpbmdBcHByb3ZhbERhdGEsXG4gIFBlbmRpbmdBcHByb3ZhbHMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFJlcXVlc3RUeXBlLFxuICBUeFJlcXVlc3QsXG4gIGNvbW1vblRzc01ldGhvZHMsXG4gIFR4UmVxdWVzdFN0YXRlLFxuICBkZWNvZGVPckVsc2UsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlTWVzc2FnZVNpZ25hdHVyZSxcbiAgZ2V0VXR4b2xpYk5ldHdvcmssXG4gIHVud3JhcExpZ2h0bmluZ0NvaW5TcGVjaWZpYyxcbiAgdmFsaWRhdGVQc2J0Rm9yV2l0aGRyYXcsXG59IGZyb20gJy4uL2xpZ2h0bmluZyc7XG5pbXBvcnQge1xuICBDcmVhdGVJbnZvaWNlQm9keSxcbiAgSW52b2ljZSxcbiAgSW52b2ljZVF1ZXJ5LFxuICBMaWdodG5pbmdBdXRoS2V5Y2hhaW4sXG4gIExpZ2h0bmluZ0tleWNoYWluLFxuICBMbmRDcmVhdGVQYXltZW50UmVzcG9uc2UsXG4gIFN1Ym1pdFBheW1lbnRQYXJhbXMsXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblF1ZXJ5LFxuICBMaXN0VHJhbnNhY3Rpb25zUmVzcG9uc2UsXG4gIFBheW1lbnRJbmZvLFxuICBQYXltZW50UXVlcnksXG4gIExpZ2h0bmluZ09uY2hhaW5XaXRoZHJhd1BhcmFtcyxcbiAgTGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UmVzcG9uc2UsXG4gIExpc3RJbnZvaWNlc1Jlc3BvbnNlLFxuICBMaXN0UGF5bWVudHNSZXNwb25zZSxcbiAgTG5kQ3JlYXRlV2l0aGRyYXdSZXNwb25zZSxcbiAgV2F0Y2hPbmx5LFxufSBmcm9tICcuLi9jb2RlY3MnO1xuaW1wb3J0IHsgTGlnaHRuaW5nUGF5bWVudEludGVudCwgTGlnaHRuaW5nUGF5bWVudFJlcXVlc3QgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuZXhwb3J0IHR5cGUgUGF5SW52b2ljZVJlc3BvbnNlID0ge1xuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBwYXltZW50IHJlcXVlc3Qgc3VibWl0dGVkIHRvIEJpdEdvLlxuICAgKi9cbiAgdHhSZXF1ZXN0SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU3RhdHVzIG9mIHRoZSBwYXltZW50IHJlcXVlc3Qgc3VibWlzc2lvbiB0byBCaXRHby5cbiAgICogLSBgJ2RlbGl2ZXJlZCdgOiBTdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYnkgQml0R28sIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gc2VudCB0byB0aGUgTGlnaHRuaW5nIE5ldHdvcmsgeWV0LlxuICAgKiAtIEZvciB0aGUgYWN0dWFsIHBheW1lbnQgc3RhdHVzLCByZWZlciB0byBgcGF5bWVudFN0YXR1c2AgYW5kIHRyYWNrIGB0cmFuc2ZlcmAuXG4gICAqL1xuICB0eFJlcXVlc3RTdGF0ZTogVHhSZXF1ZXN0U3RhdGU7XG5cbiAgLyoqXG4gICAqIFBlbmRpbmcgYXBwcm92YWwgZGV0YWlscywgaWYgYXBwbGljYWJsZS5cbiAgICogLSBJZiBwcmVzZW50LCB0aGUgcGF5bWVudCBoYXMgbm90IGJlZW4gaW5pdGlhdGVkIHlldC5cbiAgICovXG4gIHBlbmRpbmdBcHByb3ZhbD86IFBlbmRpbmdBcHByb3ZhbERhdGE7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgc25hcHNob3Qgb2YgcGF5bWVudCBzdGF0dXMgKGlmIGF2YWlsYWJsZSkuXG4gICAqIC0gKipgJ2luX2ZsaWdodCdgKio6IFBheW1lbnQgaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIC0gKipgJ3NldHRsZWQnYCoqOiBQYXltZW50IHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLlxuICAgKiAtICoqYCdmYWlsZWQnYCoqOiBQYXltZW50IGZhaWxlZC5cbiAgICogVGhpcyBmaWVsZCBpcyBhYnNlbnQgaWYgYXBwcm92YWwgaXMgcmVxdWlyZWQgYmVmb3JlIHByb2Nlc3NpbmcuXG4gICAqL1xuICBwYXltZW50U3RhdHVzPzogTG5kQ3JlYXRlUGF5bWVudFJlc3BvbnNlO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpZ2h0bmluZyBrZXljaGFpbiBmb3IgdGhlIGdpdmVuIHdhbGxldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpZ2h0bmluZ0tleWNoYWluKHdhbGxldDogc2RrY29yZS5JV2FsbGV0KTogUHJvbWlzZTxMaWdodG5pbmdLZXljaGFpbj4ge1xuICBjb25zdCBjb2luID0gd2FsbGV0LmJhc2VDb2luO1xuICBpZiAoY29pbi5nZXRGYW1pbHkoKSAhPT0gJ2xuYnRjJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb2luIHRvIGdldCBsaWdodG5pbmcgd2FsbGV0IGtleTogJHtjb2luLmdldEZhbWlseSgpfWApO1xuICB9XG4gIGNvbnN0IGtleUlkcyA9IHdhbGxldC5rZXlJZHMoKTtcbiAgaWYgKGtleUlkcy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGtleSBpbiBsaWdodG5pbmcgd2FsbGV0OiAke2tleUlkcy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCBjb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrZXlJZHNbMF0gfSk7XG4gIHJldHVybiBzZGtjb3JlLmRlY29kZU9yRWxzZShMaWdodG5pbmdLZXljaGFpbi5uYW1lLCBMaWdodG5pbmdLZXljaGFpbiwga2V5Y2hhaW4sIChfKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVzZXIga2V5YCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbGlnaHRuaW5nIGF1dGgga2V5Y2hhaW5zIGZvciB0aGUgZ2l2ZW4gd2FsbGV0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGlnaHRuaW5nQXV0aEtleWNoYWlucyh3YWxsZXQ6IHNka2NvcmUuSVdhbGxldCk6IFByb21pc2U8e1xuICB1c2VyQXV0aEtleTogTGlnaHRuaW5nQXV0aEtleWNoYWluO1xuICBub2RlQXV0aEtleTogTGlnaHRuaW5nQXV0aEtleWNoYWluO1xufT4ge1xuICBjb25zdCBjb2luID0gd2FsbGV0LmJhc2VDb2luO1xuICBpZiAoY29pbi5nZXRGYW1pbHkoKSAhPT0gJ2xuYnRjJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb2luIHRvIGdldCBsaWdodG5pbmcgd2FsbGV0IGF1dGgga2V5czogJHtjb2luLmdldEZhbWlseSgpfWApO1xuICB9XG4gIGNvbnN0IGF1dGhLZXlJZHMgPSB3YWxsZXQuY29pblNwZWNpZmljKCk/LmtleXM7XG4gIGlmIChhdXRoS2V5SWRzPy5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIG9mIGF1dGgga2V5cyBpbiBsaWdodG5pbmcgd2FsbGV0OiAke2F1dGhLZXlJZHM/Lmxlbmd0aH1gKTtcbiAgfVxuICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbChhdXRoS2V5SWRzLm1hcCgoaWQpID0+IGNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQgfSkpKTtcbiAgY29uc3QgYXV0aEtleWNoYWlucyA9IGtleWNoYWlucy5tYXAoKGtleWNoYWluKSA9PiB7XG4gICAgcmV0dXJuIHNka2NvcmUuZGVjb2RlT3JFbHNlKExpZ2h0bmluZ0F1dGhLZXljaGFpbi5uYW1lLCBMaWdodG5pbmdBdXRoS2V5Y2hhaW4sIGtleWNoYWluLCAoXykgPT4ge1xuICAgICAgLy8gRE9OJ1QgdGhyb3cgZXJyb3JzIGZyb20gZGVjb2RlT3JFbHNlLiBJdCBjb3VsZCBsZWFrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsaWdodG5pbmcgYXV0aCBrZXk6ICR7a2V5Y2hhaW4/LmlkfWApO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgW3VzZXJBdXRoS2V5LCBub2RlQXV0aEtleV0gPSAoWyd1c2VyQXV0aCcsICdub2RlQXV0aCddIGFzIGNvbnN0KS5tYXAoKHB1cnBvc2UpID0+IHtcbiAgICBjb25zdCBrZXljaGFpbiA9IGF1dGhLZXljaGFpbnMuZmluZChcbiAgICAgIChrKSA9PiB1bndyYXBMaWdodG5pbmdDb2luU3BlY2lmaWMoay5jb2luU3BlY2lmaWMsIGNvaW4uZ2V0Q2hhaW4oKSkucHVycG9zZSA9PT0gcHVycG9zZVxuICAgICk7XG4gICAgaWYgKCFrZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICR7cHVycG9zZX0ga2V5YCk7XG4gICAgfVxuICAgIHJldHVybiBrZXljaGFpbjtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgdXNlckF1dGhLZXksIG5vZGVBdXRoS2V5IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxpZ2h0bmluZ1dhbGxldCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbGlnaHRuaW5nIGludm9pY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyBJbnZvaWNlIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtiaWdpbnR9IHBhcmFtcy52YWx1ZU1zYXQgVGhlIHZhbHVlIG9mIHRoZSBpbnZvaWNlIGluIG1pbGxpc2F0b3NoaXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMubWVtb10gQSBtZW1vIG9yIGRlc2NyaXB0aW9uIGZvciB0aGUgaW52b2ljZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhcmFtcy5leHBpcnldIFRoZSBleHBpcnkgdGltZSBvZiB0aGUgaW52b2ljZSBpbiBzZWNvbmRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEludm9pY2U+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCBpbnZvaWNlXG4gICAqL1xuICBjcmVhdGVJbnZvaWNlKHBhcmFtczogQ3JlYXRlSW52b2ljZUJvZHkpOiBQcm9taXNlPEludm9pY2U+O1xuICAvKipcbiAgICogR2V0IGludm9pY2UgZGV0YWlscyBieSBwYXltZW50IGhhc2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBheW1lbnRIYXNoIC0gUGF5bWVudCBoYXNoIHRvIGxvb2t1cFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZvaWNlPn0gSW52b2ljZSBkZXRhaWxzXG4gICAqIEB0aHJvd3Mge0ludmFsaWRQYXltZW50SGFzaH0gV2hlbiBwYXltZW50IGhhc2ggaXMgbm90IHZhbGlkXG4gICAqL1xuICBnZXRJbnZvaWNlKHBheW1lbnRIYXNoOiBzdHJpbmcpOiBQcm9taXNlPEludm9pY2U+O1xuICAvKipcbiAgICogTGlzdHMgY3VycmVudCBsaWdodG5pbmcgaW52b2ljZXNcbiAgICogQHBhcmFtIHtJbnZvaWNlUXVlcnl9IHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmcgaW52b2ljZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc3RhdHVzXSBUaGUgc3RhdHVzIG9mIHRoZSBpbnZvaWNlIChvcGVuLCBzZXR0bGVkLCBjYW5jZWxlZClcbiAgICogQHBhcmFtIHtiaWdpbnR9IFtwYXJhbXMubGltaXRdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnZvaWNlcyB0byByZXR1cm5cbiAgICogQHBhcmFtIHtEYXRlfSBbcGFyYW1zLnN0YXJ0RGF0ZV0gVGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuZW5kRGF0ZV0gVGhlIGVuZCBkYXRlIGZvciB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMucHJldklkXSBDb250aW51ZSBpdGVyYXRpbmcgKHByb3ZpZGVkIGJ5IG5leHRCYXRjaFByZXZJZCBpbiB0aGUgcHJldmlvdXMgbGlzdClcbiAgICogQHJldHVybnMge1Byb21pc2U8TGlzdEludm9pY2VzUmVzcG9uc2U+fSBMaXN0IG9mIGludm9pY2VzIGFuZCBuZXh0QmF0Y2hQcmV2SWRcbiAgICovXG4gIGxpc3RJbnZvaWNlcyhwYXJhbXM6IEludm9pY2VRdWVyeSk6IFByb21pc2U8TGlzdEludm9pY2VzUmVzcG9uc2U+O1xuXG4gIC8qKlxuICAgKiBQYXkgYSBsaWdodG5pbmcgaW52b2ljZVxuICAgKiBAcGFyYW0ge1N1Ym1pdFBheW1lbnRQYXJhbXN9IHBhcmFtcyAtIFBheW1lbnQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmludm9pY2UgLSBUaGUgaW52b2ljZSB0byBwYXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hbW91bnRNc2F0IC0gVGhlIGFtb3VudCB0byBwYXkgaW4gbWlsbGlzYXRvc2hpc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBhc3NwaHJhc2UgLSBUaGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc2VxdWVuY2VJZF0gLSBPcHRpb25hbCBzZXF1ZW5jZSBJRCBmb3IgdGhlIHJlc3BlY3RpdmUgcGF5bWVudCB0cmFuc2ZlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5jb21tZW50XSAtIE9wdGlvbmFsIGNvbW1lbnQgZm9yIHRoZSByZXNwZWN0aXZlIHBheW1lbnQgdHJhbnNmZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8UGF5SW52b2ljZVJlc3BvbnNlPn0gUGF5bWVudCByZXN1bHQgY29udGFpbmluZyB0cmFuc2FjdGlvbiByZXF1ZXN0IGRldGFpbHMgYW5kIHBheW1lbnQgc3RhdHVzXG4gICAqL1xuICBwYXlJbnZvaWNlKHBhcmFtczogU3VibWl0UGF5bWVudFBhcmFtcyk6IFByb21pc2U8UGF5SW52b2ljZVJlc3BvbnNlPjtcblxuICAvKipcbiAgICogT24gY2hhaW4gd2l0aGRyYXdhbFxuICAgKiBAcGFyYW0ge0xpZ2h0bmluZ09uY2hhaW5XaXRoZHJhd1BhcmFtc30gcGFyYW1zIC0gV2l0aGRyYXcgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge0xpZ2h0bmluZ09uY2hhaW5SZWNpcGllbnRbXX0gcGFyYW1zLnJlY2lwaWVudHMgLSBUaGUgcmVjaXBpZW50cyB0byBwYXlcbiAgICogQHBhcmFtIHtiaWdpbnR9IFtwYXJhbXMuc2F0c1BlclZieXRlXSAtIE9wdGlvbmFsIHZhbHVlIGZvciBzYXRzIHBlciB2aXJ0dWFsIGJ5dGUuIElmIG5vdCBwcmVzZW50LCBpdCB3aWxsIGJlIGVzdGltYXRlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMubnVtQmxvY2tzXSAtIFRhcmdldCBibG9ja3MgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb25maXJtZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wYXNzcGhyYXNlIC0gVGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNlcXVlbmNlSWRdIC0gT3B0aW9uYWwgc2VxdWVuY2UgSUQgZm9yIHRoZSByZXNwZWN0aXZlIHdpdGhkcmF3IHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLmNvbW1lbnRdIC0gT3B0aW9uYWwgY29tbWVudCBmb3IgdGhlIHJlc3BlY3RpdmUgd2l0aGRyYXcgdHJhbnNmZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8TGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UmVzcG9uc2U+fSBXaXRoZHJhdyByZXN1bHQgY29udGFpbmluZyB0cmFuc2FjdGlvbiByZXF1ZXN0IGRldGFpbHMgYW5kIHN0YXR1c1xuICAgKi9cbiAgd2l0aGRyYXdPbmNoYWluKHBhcmFtczogTGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UGFyYW1zKTogUHJvbWlzZTxMaWdodG5pbmdPbmNoYWluV2l0aGRyYXdSZXNwb25zZT47XG4gIC8qKlxuICAgKiBHZXQgcGF5bWVudCBkZXRhaWxzIGJ5IHBheW1lbnQgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBheW1lbnRJZCAtIFBheW1lbnQgaWQgdG8gbG9va3VwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRJbmZvPn0gUGF5bWVudCBkZXRhaWxzXG4gICAqIEB0aHJvd3Mge0ludmFsaWRQYXltZW50SWR9IFdoZW4gcGF5bWVudCBpZCBpcyBub3QgdmFsaWRcbiAgICovXG4gIGdldFBheW1lbnQocGF5bWVudElkOiBzdHJpbmcpOiBQcm9taXNlPFBheW1lbnRJbmZvPjtcbiAgLyoqXG4gICAqIExpc3QgcGF5bWVudHMgZm9yIGEgd2FsbGV0IHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nXG4gICAqIEBwYXJhbSB7UGF5bWVudFF1ZXJ5fSBwYXJhbXMgUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIHBheW1lbnRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnN0YXR1c10gVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge2JpZ2ludH0gW3BhcmFtcy5saW1pdF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVyblxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuc3RhcnREYXRlXSBUaGUgc3RhcnQgZGF0ZSBmb3IgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7RGF0ZX0gW3BhcmFtcy5lbmREYXRlXSBUaGUgZW5kIGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5wYXltZW50SGFzaF0gVGhlIHBheW1lbnQgaGFzaCBvZiB0aGUgcGF5bWVudHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMucHJldklkXSBDb250aW51ZSBpdGVyYXRpbmcgKHByb3ZpZGVkIGJ5IG5leHRCYXRjaFByZXZJZCBpbiB0aGUgcHJldmlvdXMgbGlzdClcbiAgICogQHJldHVybnMge1Byb21pc2U8TGlzdFBheW1lbnRzUmVzcG9uc2U+fSBMaXN0IG9mIHBheW1lbnRzIGFuZCBuZXh0QmF0Y2hQcmV2SWRcbiAgICovXG4gIGxpc3RQYXltZW50cyhwYXJhbXM6IFBheW1lbnRRdWVyeSk6IFByb21pc2U8TGlzdFBheW1lbnRzUmVzcG9uc2U+O1xuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIGRldGFpbHMgYnkgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR4SWQgLSBUcmFuc2FjdGlvbiBJRCB0byBsb29rdXBcbiAgICogQHJldHVybnMge1Byb21pc2U8VHJhbnNhY3Rpb24+fSBUcmFuc2FjdGlvbiBkZXRhaWxzXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUeElkfSBXaGVuIHRyYW5zYWN0aW9uIElEIGlzIG5vdCB2YWxpZFxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb24odHhJZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj47XG5cbiAgLyoqXG4gICAqIExpc3QgdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldCB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBhbmQgY3Vyc29yLWJhc2VkIHBhZ2luYXRpb25cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblF1ZXJ5fSBwYXJhbXMgUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge2JpZ2ludH0gW3BhcmFtcy5saW1pdF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byByZXR1cm5cbiAgICogQHBhcmFtIHtEYXRlfSBbcGFyYW1zLnN0YXJ0RGF0ZV0gVGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuZW5kRGF0ZV0gVGhlIGVuZCBkYXRlIGZvciB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMucHJldklkXSBUcmFuc2FjdGlvbiBJRCBmb3IgY3Vyc29yLWJhc2VkIHBhZ2luYXRpb24gKGZyb20gbmV4dEJhdGNoUHJldklkKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMaXN0VHJhbnNhY3Rpb25zUmVzcG9uc2U+fSBMaXN0IG9mIHRyYW5zYWN0aW9ucyB3aXRoIHBhZ2luYXRpb24gaW5mb1xuICAgKi9cbiAgbGlzdFRyYW5zYWN0aW9ucyhwYXJhbXM6IFRyYW5zYWN0aW9uUXVlcnkpOiBQcm9taXNlPExpc3RUcmFuc2FjdGlvbnNSZXNwb25zZT47XG59XG5cbmV4cG9ydCBjbGFzcyBMaWdodG5pbmdXYWxsZXQgaW1wbGVtZW50cyBJTGlnaHRuaW5nV2FsbGV0IHtcbiAgcHVibGljIHdhbGxldDogc2RrY29yZS5JV2FsbGV0O1xuXG4gIGNvbnN0cnVjdG9yKHdhbGxldDogc2RrY29yZS5JV2FsbGV0KSB7XG4gICAgY29uc3QgY29pbiA9IHdhbGxldC5iYXNlQ29pbjtcbiAgICBpZiAoY29pbi5nZXRGYW1pbHkoKSAhPT0gJ2xuYnRjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvaW4gZm9yIGxpZ2h0bmluZyB3YWxsZXQ6ICR7Y29pbi5nZXRGYW1pbHkoKX1gKTtcbiAgICB9XG4gICAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVJbnZvaWNlKHBhcmFtczogQ3JlYXRlSW52b2ljZUJvZHkpOiBQcm9taXNlPEludm9pY2U+IHtcbiAgICBjb25zdCBjcmVhdGVJbnZvaWNlUmVzcG9uc2UgPSBhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnBvc3QodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL2ludm9pY2VgLCAyKSlcbiAgICAgIC5zZW5kKHQuZXhhY3QoQ3JlYXRlSW52b2ljZUJvZHkpLmVuY29kZShwYXJhbXMpKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBzZGtjb3JlLmRlY29kZU9yRWxzZShJbnZvaWNlLm5hbWUsIEludm9pY2UsIGNyZWF0ZUludm9pY2VSZXNwb25zZSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBET04nVCB0aHJvdyBlcnJvcnMgZnJvbSBkZWNvZGVPckVsc2UuIEl0IGNvdWxkIGxlYWsgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNyZWF0ZSBpbnZvaWNlIHJlc3BvbnNlICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRJbnZvaWNlKHBheW1lbnRIYXNoOiBzdHJpbmcpOiBQcm9taXNlPEludm9pY2U+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy9pbnZvaWNlLyR7cGF5bWVudEhhc2h9YCwgMikpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZShJbnZvaWNlLm5hbWUsIEludm9pY2UsIHJlc3BvbnNlLCAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnZXQgaW52b2ljZSByZXNwb25zZSAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdEludm9pY2VzKHBhcmFtczogSW52b2ljZVF1ZXJ5KTogUHJvbWlzZTxMaXN0SW52b2ljZXNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJldHVybkNvZGVjID0gTGlzdEludm9pY2VzUmVzcG9uc2U7XG4gICAgY29uc3QgY3JlYXRlSW52b2ljZVJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5nZXQodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL2ludm9pY2VgLCAyKSlcbiAgICAgIC5xdWVyeShJbnZvaWNlUXVlcnkuZW5jb2RlKHBhcmFtcykpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIHNka2NvcmUuZGVjb2RlT3JFbHNlKHJldHVybkNvZGVjLm5hbWUsIHJldHVybkNvZGVjLCBjcmVhdGVJbnZvaWNlUmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxpc3QgaW52b2ljZXMgcmVzcG9uc2UgJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHBheUludm9pY2UocGFyYW1zOiBTdWJtaXRQYXltZW50UGFyYW1zKTogUHJvbWlzZTxQYXlJbnZvaWNlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy53YWxsZXQuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCB7IHVzZXJBdXRoS2V5IH0gPSBhd2FpdCBnZXRMaWdodG5pbmdBdXRoS2V5Y2hhaW5zKHRoaXMud2FsbGV0KTtcbiAgICBjb25zdCB1c2VyQXV0aEtleUVuY3J5cHRlZFBydiA9IHVzZXJBdXRoS2V5LmVuY3J5cHRlZFBydjtcbiAgICBpZiAoIXVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXIgYXV0aCBrZXkgaXMgbWlzc2luZyBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gY3JlYXRlTWVzc2FnZVNpZ25hdHVyZShcbiAgICAgIHQuZXhhY3QoTGlnaHRuaW5nUGF5bWVudFJlcXVlc3QpLmVuY29kZShwYXJhbXMpLFxuICAgICAgdGhpcy53YWxsZXQuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSwgaW5wdXQ6IHVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2IH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHBheW1lbnRJbnRlbnQ6IHsgaW50ZW50OiBMaWdodG5pbmdQYXltZW50SW50ZW50IH0gPSB7XG4gICAgICBpbnRlbnQ6IHtcbiAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgIHNpZ25lZFJlcXVlc3Q6IHtcbiAgICAgICAgICBpbnZvaWNlOiBwYXJhbXMuaW52b2ljZSxcbiAgICAgICAgICBhbW91bnRNc2F0OiBwYXJhbXMuYW1vdW50TXNhdCxcbiAgICAgICAgICBmZWVMaW1pdE1zYXQ6IHBhcmFtcy5mZWVMaW1pdE1zYXQsXG4gICAgICAgICAgZmVlTGltaXRSYXRpbzogcGFyYW1zLmZlZUxpbWl0UmF0aW8sXG4gICAgICAgIH0sXG4gICAgICAgIHNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZSA9IChhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnBvc3QodGhpcy53YWxsZXQuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLndhbGxldC5pZCgpICsgJy90eHJlcXVlc3RzJywgMikpXG4gICAgICAuc2VuZCh0LnR5cGUoeyBpbnRlbnQ6IExpZ2h0bmluZ1BheW1lbnRJbnRlbnQgfSkuZW5jb2RlKHBheW1lbnRJbnRlbnQpKVxuICAgICAgLnJlc3VsdCgpKSBhcyBUeFJlcXVlc3Q7XG5cbiAgICBpZiAodHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnN0YXRlID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMud2FsbGV0LmJpdGdvLCB0aGlzLndhbGxldC5iYXNlQ29pbik7XG4gICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWwgPSBhd2FpdCBwZW5kaW5nQXBwcm92YWxzLmdldCh7IGlkOiB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUucGVuZGluZ0FwcHJvdmFsSWQgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50eFJlcXVlc3RJZCxcbiAgICAgICAgdHhSZXF1ZXN0U3RhdGU6IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5wb3N0KFxuICAgICAgICB0aGlzLndhbGxldC5iaXRnby51cmwoXG4gICAgICAgICAgJy93YWxsZXQvJyArIHRoaXMud2FsbGV0LmlkKCkgKyAnL3R4cmVxdWVzdHMvJyArIHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUmVxdWVzdFNlbmQgPSBhd2FpdCBjb21tb25Uc3NNZXRob2RzLnNlbmRUeFJlcXVlc3QoXG4gICAgICB0aGlzLndhbGxldC5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHhSZXF1ZXN0SWQsXG4gICAgICBSZXF1ZXN0VHlwZS50eCxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHRyYW5zYWN0aW9uUmVxdWVzdFNlbmQudHJhbnNhY3Rpb25zPy5bMF0/LnVuc2lnbmVkVHg/LmNvaW5TcGVjaWZpYztcblxuICAgIHJldHVybiB7XG4gICAgICB0eFJlcXVlc3RJZDogdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnR4UmVxdWVzdElkLFxuICAgICAgdHhSZXF1ZXN0U3RhdGU6IHRyYW5zYWN0aW9uUmVxdWVzdFNlbmQuc3RhdGUsXG4gICAgICBwYXltZW50U3RhdHVzOiBjb2luU3BlY2lmaWNcbiAgICAgICAgPyB0LmV4YWN0KExuZENyZWF0ZVBheW1lbnRSZXNwb25zZSkuZW5jb2RlKGNvaW5TcGVjaWZpYyBhcyBMbmRDcmVhdGVQYXltZW50UmVzcG9uc2UpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyB3aXRoZHJhd09uY2hhaW4ocGFyYW1zOiBMaWdodG5pbmdPbmNoYWluV2l0aGRyYXdQYXJhbXMpOiBQcm9taXNlPExpZ2h0bmluZ09uY2hhaW5XaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMud2FsbGV0LmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3QgcGF5bWVudEludGVudDogeyBpbnRlbnQ6IExpZ2h0bmluZ1BheW1lbnRJbnRlbnQgfSA9IHtcbiAgICAgIGludGVudDoge1xuICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgIG9uY2hhaW5SZXF1ZXN0OiB7XG4gICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMsXG4gICAgICAgICAgc2F0c1BlclZieXRlOiBwYXJhbXMuc2F0c1BlclZieXRlLFxuICAgICAgICAgIG51bUJsb2NrczogcGFyYW1zLm51bUJsb2NrcyxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlID0gKGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAucG9zdCh0aGlzLndhbGxldC5iaXRnby51cmwoJy93YWxsZXQvJyArIHRoaXMud2FsbGV0LmlkKCkgKyAnL3R4cmVxdWVzdHMnLCAyKSlcbiAgICAgIC5zZW5kKHQudHlwZSh7IGludGVudDogTGlnaHRuaW5nUGF5bWVudEludGVudCB9KS5lbmNvZGUocGF5bWVudEludGVudCkpXG4gICAgICAucmVzdWx0KCkpIGFzIFR4UmVxdWVzdDtcblxuICAgIGlmIChcbiAgICAgICF0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHJhbnNhY3Rpb25zIHx8XG4gICAgICB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIXRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VyaWFsaXplZCB0eEhleCBpcyBtaXNzaW5nYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0RGF0YSA9IHRoaXMud2FsbGV0LnRvSlNPTigpO1xuICAgIGlmICghd2FsbGV0RGF0YS5jb2luU3BlY2lmaWMud2F0Y2hPbmx5QWNjb3VudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgd2FsbGV0IGlzIG1pc3Npbmcgd2F0Y2ggb25seSBhY2NvdW50c2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHdhdGNoT25seUFjY291bnREZXRhaWxzID0gZGVjb2RlT3JFbHNlKFxuICAgICAgV2F0Y2hPbmx5Lm5hbWUsXG4gICAgICBXYXRjaE9ubHksXG4gICAgICB3YWxsZXREYXRhLmNvaW5TcGVjaWZpYy53YXRjaE9ubHlBY2NvdW50cyxcbiAgICAgIChlcnJvcnMpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdhdGNoIG9ubHkgYWNjb3VudHMsIGVycm9yOiAke2Vycm9yc31gKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IG5ldHdvcmsgPSBnZXRVdHhvbGliTmV0d29yayh0aGlzLndhbGxldC5jb2luKCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUHNidEZvcldpdGhkcmF3KFxuICAgICAgICB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgICBuZXR3b3JrLFxuICAgICAgICBwYXJhbXMucmVjaXBpZW50cyxcbiAgICAgICAgd2F0Y2hPbmx5QWNjb3VudERldGFpbHMuYWNjb3VudHNcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgdmFsaWRhdGluZyB3aXRoZHJhdyBwc2J0OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHVzZXJBdXRoS2V5IH0gPSBhd2FpdCBnZXRMaWdodG5pbmdBdXRoS2V5Y2hhaW5zKHRoaXMud2FsbGV0KTtcbiAgICBjb25zdCB1c2VyQXV0aEtleUVuY3J5cHRlZFBydiA9IHVzZXJBdXRoS2V5LmVuY3J5cHRlZFBydjtcbiAgICBpZiAoIXVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXIgYXV0aCBrZXkgaXMgbWlzc2luZyBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gY3JlYXRlTWVzc2FnZVNpZ25hdHVyZShcbiAgICAgIHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsXG4gICAgICB0aGlzLndhbGxldC5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlLCBpbnB1dDogdXNlckF1dGhLZXlFbmNyeXB0ZWRQcnYgfSlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25SZXF1ZXN0V2l0aFNpZ25hdHVyZSA9IChhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnB1dChcbiAgICAgICAgdGhpcy53YWxsZXQuYml0Z28udXJsKFxuICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLndhbGxldC5pZCgpICsgJy90eHJlcXVlc3RzLycgKyB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHhSZXF1ZXN0SWQgKyAnL2NvaW5TcGVjaWZpYycsXG4gICAgICAgICAgMlxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHVuc2lnbmVkQ29pblNwZWNpZmljOiB7XG4gICAgICAgICAgY29pbjogdGhpcy53YWxsZXQuYmFzZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICBkYXRhOiB7IHNpZ25hdHVyZSB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKSkgYXMgVHhSZXF1ZXN0O1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uUmVxdWVzdFdpdGhTaWduYXR1cmUuc3RhdGUgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcy53YWxsZXQuYml0Z28sIHRoaXMud2FsbGV0LmJhc2VDb2luKTtcbiAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbHMuZ2V0KHsgaWQ6IHRyYW5zYWN0aW9uUmVxdWVzdFdpdGhTaWduYXR1cmUucGVuZGluZ0FwcHJvdmFsSWQgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHRyYW5zYWN0aW9uUmVxdWVzdFdpdGhTaWduYXR1cmUudHhSZXF1ZXN0SWQsXG4gICAgICAgIHR4UmVxdWVzdFN0YXRlOiB0cmFuc2FjdGlvblJlcXVlc3RXaXRoU2lnbmF0dXJlLnN0YXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMud2FsbGV0LmJpdGdvLnVybChcbiAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy53YWxsZXQuaWQoKSArICcvdHhyZXF1ZXN0cy8nICsgdHJhbnNhY3Rpb25SZXF1ZXN0V2l0aFNpZ25hdHVyZS50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAyXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUmVxdWVzdFNlbmQgPSBhd2FpdCBjb21tb25Uc3NNZXRob2RzLnNlbmRUeFJlcXVlc3QoXG4gICAgICB0aGlzLndhbGxldC5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0cmFuc2FjdGlvblJlcXVlc3RXaXRoU2lnbmF0dXJlLnR4UmVxdWVzdElkLFxuICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB0cmFuc2FjdGlvblJlcXVlc3RTZW5kLnRyYW5zYWN0aW9ucz8uWzBdPy51bnNpZ25lZFR4Py5jb2luU3BlY2lmaWM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhSZXF1ZXN0SWQ6IHRyYW5zYWN0aW9uUmVxdWVzdFdpdGhTaWduYXR1cmUudHhSZXF1ZXN0SWQsXG4gICAgICB0eFJlcXVlc3RTdGF0ZTogdHJhbnNhY3Rpb25SZXF1ZXN0U2VuZC5zdGF0ZSxcbiAgICAgIHdpdGhkcmF3U3RhdHVzOlxuICAgICAgICBjb2luU3BlY2lmaWMgJiYgJ3N0YXR1cycgaW4gY29pblNwZWNpZmljXG4gICAgICAgICAgPyB0LmV4YWN0KExuZENyZWF0ZVdpdGhkcmF3UmVzcG9uc2UpLmVuY29kZShjb2luU3BlY2lmaWMgYXMgTG5kQ3JlYXRlV2l0aGRyYXdSZXNwb25zZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0UGF5bWVudChwYXltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8UGF5bWVudEluZm8+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy9wYXltZW50LyR7cGF5bWVudElkfWAsIDIpKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVPckVsc2UoUGF5bWVudEluZm8ubmFtZSwgUGF5bWVudEluZm8sIHJlc3BvbnNlLCAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXltZW50IHJlc3BvbnNlOiAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdFBheW1lbnRzKHBhcmFtczogUGF5bWVudFF1ZXJ5KTogUHJvbWlzZTxMaXN0UGF5bWVudHNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5nZXQodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL3BheW1lbnRgLCAyKSlcbiAgICAgIC5xdWVyeShQYXltZW50UXVlcnkuZW5jb2RlKHBhcmFtcykpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZShMaXN0UGF5bWVudHNSZXNwb25zZS5uYW1lLCBMaXN0UGF5bWVudHNSZXNwb25zZSwgcmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBheW1lbnQgbGlzdCByZXNwb25zZTogJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy90cmFuc2FjdGlvbi8ke3R4SWR9YCwgMikpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZShUcmFuc2FjdGlvbi5uYW1lLCBUcmFuc2FjdGlvbiwgcmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zYWN0aW9uIHJlc3BvbnNlOiAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhwYXJhbXM6IFRyYW5zYWN0aW9uUXVlcnkpOiBQcm9taXNlPExpc3RUcmFuc2FjdGlvbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5nZXQodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL3RyYW5zYWN0aW9uYCwgMikpXG4gICAgICAucXVlcnkoVHJhbnNhY3Rpb25RdWVyeS5lbmNvZGUocGFyYW1zKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKExpc3RUcmFuc2FjdGlvbnNSZXNwb25zZS5uYW1lLCBMaXN0VHJhbnNhY3Rpb25zUmVzcG9uc2UsIHJlc3BvbnNlLCAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbiBsaXN0IHJlc3BvbnNlOiAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,32 @@
1
+ import * as sdkcore from '@bitgo-beta/sdk-core';
2
+ import { BackupResponse, UpdateLightningWalletClientRequest } from '../codecs';
3
+ import { ILightningWallet, LightningWallet } from './lightning';
4
+ /**
5
+ * Updates the coin-specific configuration for a Lightning Wallet.
6
+ *
7
+ * @param {Wallet} wallet - Wallet.
8
+ * @param {UpdateLightningWalletClientRequest} params - The parameters containing the updated wallet-specific details.
9
+ * - `encryptedSignerMacaroon` (optional): This macaroon is used by the watch-only node to ask the signer node to sign transactions.
10
+ * Encrypted with ECDH secret key from private key of wallet's user auth key and public key of lightning service.
11
+ * - `encryptedSignerAdminMacaroon` (optional): Generated when initializing the wallet of the signer node.
12
+ * Encrypted with client's wallet passphrase.
13
+ * - `signerHost` (optional): The host address of the Lightning signer node.
14
+ * - `encryptedSignerTlsKey` (optional): The wallet passphrase encrypted TLS key of the signer.
15
+ * - `passphrase` (required): The wallet passphrase.
16
+ * - `signerTlsCert` (optional): The TLS certificate of the signer.
17
+ * - `watchOnlyAccounts` (optional): These are the accounts used to initialize the watch-only wallet.
18
+ * @returns {Promise<unknown>} A promise resolving to the updated wallet response or throwing an error if the update fails.
19
+ */
20
+ export declare function updateWalletCoinSpecific(wallet: sdkcore.IWallet, params: UpdateLightningWalletClientRequest): Promise<unknown>;
21
+ export interface ISelfCustodialLightningWallet extends ILightningWallet {
22
+ /**
23
+ * Get the channel backup for the given wallet.
24
+ * @returns {Promise<BackupResponse>} A promise resolving to the channel backup
25
+ */
26
+ getChannelBackup(): Promise<BackupResponse>;
27
+ }
28
+ export declare class SelfCustodialLightningWallet extends LightningWallet implements ISelfCustodialLightningWallet {
29
+ constructor(wallet: sdkcore.IWallet);
30
+ getChannelBackup(): Promise<BackupResponse>;
31
+ }
32
+ //# sourceMappingURL=selfCustodialLightning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfCustodialLightning.d.ts","sourceRoot":"","sources":["../../../src/wallet/selfCustodialLightning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,kCAAkC,EAAyC,MAAM,WAAW,CAAC;AACtH,OAAO,EAA6B,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA4C3F;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,OAAO,CAAC,OAAO,EACvB,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,OAAO,CAAC,CAmClB;AAED,MAAM,WAAW,6BAA8B,SAAQ,gBAAgB;IACrE;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CAC7C;AAED,qBAAa,4BAA6B,SAAQ,eAAgB,YAAW,6BAA6B;gBAC5F,MAAM,EAAE,OAAO,CAAC,OAAO;IAO7B,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;CAQlD"}
@@ -0,0 +1,131 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SelfCustodialLightningWallet = void 0;
37
+ exports.updateWalletCoinSpecific = updateWalletCoinSpecific;
38
+ const sdkcore = __importStar(require("@bitgo-beta/sdk-core"));
39
+ const codecs_1 = require("../codecs");
40
+ const lightning_1 = require("./lightning");
41
+ const lightning_2 = require("../lightning");
42
+ const t = __importStar(require("io-ts"));
43
+ function encryptWalletUpdateRequest(wallet, params, userAuthKeyEncryptedPrv) {
44
+ const coinName = wallet.coin();
45
+ const requestWithEncryption = {
46
+ ...params,
47
+ };
48
+ const userAuthXprv = wallet.bitgo.decrypt({
49
+ password: params.passphrase,
50
+ input: userAuthKeyEncryptedPrv,
51
+ });
52
+ if (params.signerTlsKey) {
53
+ requestWithEncryption.encryptedSignerTlsKey = wallet.bitgo.encrypt({
54
+ password: params.passphrase,
55
+ input: params.signerTlsKey,
56
+ });
57
+ }
58
+ if (params.signerAdminMacaroon) {
59
+ requestWithEncryption.encryptedSignerAdminMacaroon = wallet.bitgo.encrypt({
60
+ password: params.passphrase,
61
+ input: params.signerAdminMacaroon,
62
+ });
63
+ }
64
+ if (params.signerMacaroon) {
65
+ requestWithEncryption.encryptedSignerMacaroon = wallet.bitgo.encrypt({
66
+ password: (0, lightning_2.deriveLightningServiceSharedSecret)(coinName, userAuthXprv).toString('hex'),
67
+ input: params.signerMacaroon,
68
+ });
69
+ }
70
+ return t.exact(codecs_1.UpdateLightningWalletEncryptedRequest).encode(requestWithEncryption);
71
+ }
72
+ /**
73
+ * Updates the coin-specific configuration for a Lightning Wallet.
74
+ *
75
+ * @param {Wallet} wallet - Wallet.
76
+ * @param {UpdateLightningWalletClientRequest} params - The parameters containing the updated wallet-specific details.
77
+ * - `encryptedSignerMacaroon` (optional): This macaroon is used by the watch-only node to ask the signer node to sign transactions.
78
+ * Encrypted with ECDH secret key from private key of wallet's user auth key and public key of lightning service.
79
+ * - `encryptedSignerAdminMacaroon` (optional): Generated when initializing the wallet of the signer node.
80
+ * Encrypted with client's wallet passphrase.
81
+ * - `signerHost` (optional): The host address of the Lightning signer node.
82
+ * - `encryptedSignerTlsKey` (optional): The wallet passphrase encrypted TLS key of the signer.
83
+ * - `passphrase` (required): The wallet passphrase.
84
+ * - `signerTlsCert` (optional): The TLS certificate of the signer.
85
+ * - `watchOnlyAccounts` (optional): These are the accounts used to initialize the watch-only wallet.
86
+ * @returns {Promise<unknown>} A promise resolving to the updated wallet response or throwing an error if the update fails.
87
+ */
88
+ async function updateWalletCoinSpecific(wallet, params) {
89
+ if (!(0, lightning_2.isLightningCoinName)(wallet.coin())) {
90
+ throw new Error(`cant update lightning wallet coin specific for coin ${wallet.subType()}`);
91
+ }
92
+ if (wallet.subType() !== 'lightningSelfCustody') {
93
+ throw new Error(`cant update lightning wallet coin specific for wallet type ${wallet.subType()}`);
94
+ }
95
+ sdkcore.decodeOrElse(codecs_1.UpdateLightningWalletClientRequest.name, codecs_1.UpdateLightningWalletClientRequest, params, (errors) => {
96
+ // DON'T throw errors from decodeOrElse. It could leak sensitive information.
97
+ throw new Error(`Invalid params for lightning specific update wallet`);
98
+ });
99
+ const { userAuthKey } = await (0, lightning_1.getLightningAuthKeychains)(wallet);
100
+ const userAuthKeyEncryptedPrv = userAuthKey.encryptedPrv;
101
+ if (!userAuthKeyEncryptedPrv) {
102
+ throw new Error(`user auth key is missing encrypted private key`);
103
+ }
104
+ const updateRequestWithEncryption = encryptWalletUpdateRequest(wallet, params, userAuthKeyEncryptedPrv);
105
+ const signature = (0, lightning_2.createMessageSignature)(updateRequestWithEncryption, wallet.bitgo.decrypt({ password: params.passphrase, input: userAuthKeyEncryptedPrv }));
106
+ const coinSpecific = {
107
+ [wallet.coin()]: {
108
+ signedRequest: updateRequestWithEncryption,
109
+ signature,
110
+ },
111
+ };
112
+ return await wallet.bitgo.put(wallet.url()).send({ coinSpecific }).result();
113
+ }
114
+ class SelfCustodialLightningWallet extends lightning_1.LightningWallet {
115
+ constructor(wallet) {
116
+ super(wallet);
117
+ if (wallet.subType() !== 'lightningSelfCustody') {
118
+ throw new Error(`Invalid lightning wallet type for self custodial lightning: ${wallet.subType()}`);
119
+ }
120
+ }
121
+ async getChannelBackup() {
122
+ const backupResponse = await this.wallet.bitgo
123
+ .get(this.wallet.baseCoin.url(`/wallet/${this.wallet.id()}/lightning/backup`))
124
+ .result();
125
+ return sdkcore.decodeOrElse(codecs_1.BackupResponse.name, codecs_1.BackupResponse, backupResponse, (error) => {
126
+ throw new Error(`Invalid backup response: ${error}`);
127
+ });
128
+ }
129
+ }
130
+ exports.SelfCustodialLightningWallet = SelfCustodialLightningWallet;
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZkN1c3RvZGlhbExpZ2h0bmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93YWxsZXQvc2VsZkN1c3RvZGlhbExpZ2h0bmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4REEsNERBc0NDO0FBcEdELDhEQUFnRDtBQUNoRCxzQ0FBc0g7QUFDdEgsMkNBQTJGO0FBQzNGLDRDQUErRztBQUMvRyx5Q0FBMkI7QUFFM0IsU0FBUywwQkFBMEIsQ0FDakMsTUFBdUIsRUFDdkIsTUFBMEMsRUFDMUMsdUJBQStCO0lBRS9CLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQXdCLENBQUM7SUFFckQsTUFBTSxxQkFBcUIsR0FBd0Y7UUFDakgsR0FBRyxNQUFNO0tBQ1YsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hDLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVTtRQUMzQixLQUFLLEVBQUUsdUJBQXVCO0tBQy9CLENBQUMsQ0FBQztJQUVILElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLHFCQUFxQixDQUFDLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2pFLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUMzQixLQUFLLEVBQUUsTUFBTSxDQUFDLFlBQVk7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDL0IscUJBQXFCLENBQUMsNEJBQTRCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDeEUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsbUJBQW1CO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENB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QUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2FBQzdFLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLHVCQUFjLENBQUMsSUFBSSxFQUFFLHVCQUFjLEVBQUUsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxvRUFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzZGtjb3JlIGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhY2t1cFJlc3BvbnNlLCBVcGRhdGVMaWdodG5pbmdXYWxsZXRDbGllbnRSZXF1ZXN0LCBVcGRhdGVMaWdodG5pbmdXYWxsZXRFbmNyeXB0ZWRSZXF1ZXN0IH0gZnJvbSAnLi4vY29kZWNzJztcbmltcG9ydCB7IGdldExpZ2h0bmluZ0F1dGhLZXljaGFpbnMsIElMaWdodG5pbmdXYWxsZXQsIExpZ2h0bmluZ1dhbGxldCB9IGZyb20gJy4vbGlnaHRuaW5nJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VTaWduYXR1cmUsIGRlcml2ZUxpZ2h0bmluZ1NlcnZpY2VTaGFyZWRTZWNyZXQsIGlzTGlnaHRuaW5nQ29pbk5hbWUgfSBmcm9tICcuLi9saWdodG5pbmcnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmZ1bmN0aW9uIGVuY3J5cHRXYWxsZXRVcGRhdGVSZXF1ZXN0KFxuICB3YWxsZXQ6IHNka2NvcmUuSVdhbGxldCxcbiAgcGFyYW1zOiBVcGRhdGVMaWdodG5pbmdXYWxsZXRDbGllbnRSZXF1ZXN0LFxuICB1c2VyQXV0aEtleUVuY3J5cHRlZFBydjogc3RyaW5nXG4pOiBVcGRhdGVMaWdodG5pbmdXYWxsZXRFbmNyeXB0ZWRSZXF1ZXN0IHtcbiAgY29uc3QgY29pbk5hbWUgPSB3YWxsZXQuY29pbigpIGFzICd0bG5idGMnIHwgJ2xuYnRjJztcblxuICBjb25zdCByZXF1ZXN0V2l0aEVuY3J5cHRpb246IFBhcnRpYWw8VXBkYXRlTGlnaHRuaW5nV2FsbGV0Q2xpZW50UmVxdWVzdCAmIFVwZGF0ZUxpZ2h0bmluZ1dhbGxldEVuY3J5cHRlZFJlcXVlc3Q+ID0ge1xuICAgIC4uLnBhcmFtcyxcbiAgfTtcblxuICBjb25zdCB1c2VyQXV0aFhwcnYgPSB3YWxsZXQuYml0Z28uZGVjcnlwdCh7XG4gICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgIGlucHV0OiB1c2VyQXV0aEtleUVuY3J5cHRlZFBydixcbiAgfSk7XG5cbiAgaWYgKHBhcmFtcy5zaWduZXJUbHNLZXkpIHtcbiAgICByZXF1ZXN0V2l0aEVuY3J5cHRpb24uZW5jcnlwdGVkU2lnbmVyVGxzS2V5ID0gd2FsbGV0LmJpdGdvLmVuY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgaW5wdXQ6IHBhcmFtcy5zaWduZXJUbHNLZXksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNpZ25lckFkbWluTWFjYXJvb24pIHtcbiAgICByZXF1ZXN0V2l0aEVuY3J5cHRpb24uZW5jcnlwdGVkU2lnbmVyQWRtaW5NYWNhcm9vbiA9IHdhbGxldC5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGlucHV0OiBwYXJhbXMuc2lnbmVyQWRtaW5NYWNhcm9vbixcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2lnbmVyTWFjYXJvb24pIHtcbiAgICByZXF1ZXN0V2l0aEVuY3J5cHRpb24uZW5jcnlwdGVkU2lnbmVyTWFjYXJvb24gPSB3YWxsZXQuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogZGVyaXZlTGlnaHRuaW5nU2VydmljZVNoYXJlZFNlY3JldChjb2luTmFtZSwgdXNlckF1dGhYcHJ2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBpbnB1dDogcGFyYW1zLnNpZ25lck1hY2Fyb29uLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHQuZXhhY3QoVXBkYXRlTGlnaHRuaW5nV2FsbGV0RW5jcnlwdGVkUmVxdWVzdCkuZW5jb2RlKHJlcXVlc3RXaXRoRW5jcnlwdGlvbik7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgY29pbi1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciBhIExpZ2h0bmluZyBXYWxsZXQuXG4gKlxuICogQHBhcmFtIHtXYWxsZXR9IHdhbGxldCAtIFdhbGxldC5cbiAqIEBwYXJhbSB7VXBkYXRlTGlnaHRuaW5nV2FsbGV0Q2xpZW50UmVxdWVzdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgY29udGFpbmluZyB0aGUgdXBkYXRlZCB3YWxsZXQtc3BlY2lmaWMgZGV0YWlscy5cbiAqICAgLSBgZW5jcnlwdGVkU2lnbmVyTWFjYXJvb25gIChvcHRpb25hbCk6IFRoaXMgbWFjYXJvb24gaXMgdXNlZCBieSB0aGUgd2F0Y2gtb25seSBub2RlIHRvIGFzayB0aGUgc2lnbmVyIG5vZGUgdG8gc2lnbiB0cmFuc2FjdGlvbnMuXG4gKiAgICAgRW5jcnlwdGVkIHdpdGggRUNESCBzZWNyZXQga2V5IGZyb20gcHJpdmF0ZSBrZXkgb2Ygd2FsbGV0J3MgdXNlciBhdXRoIGtleSBhbmQgcHVibGljIGtleSBvZiBsaWdodG5pbmcgc2VydmljZS5cbiAqICAgLSBgZW5jcnlwdGVkU2lnbmVyQWRtaW5NYWNhcm9vbmAgKG9wdGlvbmFsKTogR2VuZXJhdGVkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSB3YWxsZXQgb2YgdGhlIHNpZ25lciBub2RlLlxuICogICAgIEVuY3J5cHRlZCB3aXRoIGNsaWVudCdzIHdhbGxldCBwYXNzcGhyYXNlLlxuICogICAtIGBzaWduZXJIb3N0YCAob3B0aW9uYWwpOiBUaGUgaG9zdCBhZGRyZXNzIG9mIHRoZSBMaWdodG5pbmcgc2lnbmVyIG5vZGUuXG4gKiAgIC0gYGVuY3J5cHRlZFNpZ25lclRsc0tleWAgKG9wdGlvbmFsKTogVGhlIHdhbGxldCBwYXNzcGhyYXNlIGVuY3J5cHRlZCBUTFMga2V5IG9mIHRoZSBzaWduZXIuXG4gKiAgIC0gYHBhc3NwaHJhc2VgIChyZXF1aXJlZCk6IFRoZSB3YWxsZXQgcGFzc3BocmFzZS5cbiAqICAgLSBgc2lnbmVyVGxzQ2VydGAgKG9wdGlvbmFsKTogVGhlIFRMUyBjZXJ0aWZpY2F0ZSBvZiB0aGUgc2lnbmVyLlxuICogICAtIGB3YXRjaE9ubHlBY2NvdW50c2AgKG9wdGlvbmFsKTogVGhlc2UgYXJlIHRoZSBhY2NvdW50cyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHdhdGNoLW9ubHkgd2FsbGV0LlxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgd2FsbGV0IHJlc3BvbnNlIG9yIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZSB1cGRhdGUgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVXYWxsZXRDb2luU3BlY2lmaWMoXG4gIHdhbGxldDogc2RrY29yZS5JV2FsbGV0LFxuICBwYXJhbXM6IFVwZGF0ZUxpZ2h0bmluZ1dhbGxldENsaWVudFJlcXVlc3Rcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBpZiAoIWlzTGlnaHRuaW5nQ29pbk5hbWUod2FsbGV0LmNvaW4oKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbnQgdXBkYXRlIGxpZ2h0bmluZyB3YWxsZXQgY29pbiBzcGVjaWZpYyBmb3IgY29pbiAke3dhbGxldC5zdWJUeXBlKCl9YCk7XG4gIH1cbiAgaWYgKHdhbGxldC5zdWJUeXBlKCkgIT09ICdsaWdodG5pbmdTZWxmQ3VzdG9keScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbnQgdXBkYXRlIGxpZ2h0bmluZyB3YWxsZXQgY29pbiBzcGVjaWZpYyBmb3Igd2FsbGV0IHR5cGUgJHt3YWxsZXQuc3ViVHlwZSgpfWApO1xuICB9XG5cbiAgc2RrY29yZS5kZWNvZGVPckVsc2UoXG4gICAgVXBkYXRlTGlnaHRuaW5nV2FsbGV0Q2xpZW50UmVxdWVzdC5uYW1lLFxuICAgIFVwZGF0ZUxpZ2h0bmluZ1dhbGxldENsaWVudFJlcXVlc3QsXG4gICAgcGFyYW1zLFxuICAgIChlcnJvcnMpID0+IHtcbiAgICAgIC8vIERPTidUIHRocm93IGVycm9ycyBmcm9tIGRlY29kZU9yRWxzZS4gSXQgY291bGQgbGVhayBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1zIGZvciBsaWdodG5pbmcgc3BlY2lmaWMgdXBkYXRlIHdhbGxldGApO1xuICAgIH1cbiAgKTtcblxuICBjb25zdCB7IHVzZXJBdXRoS2V5IH0gPSBhd2FpdCBnZXRMaWdodG5pbmdBdXRoS2V5Y2hhaW5zKHdhbGxldCk7XG4gIGNvbnN0IHVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2ID0gdXNlckF1dGhLZXkuZW5jcnlwdGVkUHJ2O1xuICBpZiAoIXVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1c2VyIGF1dGgga2V5IGlzIG1pc3NpbmcgZW5jcnlwdGVkIHByaXZhdGUga2V5YCk7XG4gIH1cbiAgY29uc3QgdXBkYXRlUmVxdWVzdFdpdGhFbmNyeXB0aW9uID0gZW5jcnlwdFdhbGxldFVwZGF0ZVJlcXVlc3Qod2FsbGV0LCBwYXJhbXMsIHVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gY3JlYXRlTWVzc2FnZVNpZ25hdHVyZShcbiAgICB1cGRhdGVSZXF1ZXN0V2l0aEVuY3J5cHRpb24sXG4gICAgd2FsbGV0LmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLnBhc3NwaHJhc2UsIGlucHV0OiB1c2VyQXV0aEtleUVuY3J5cHRlZFBydiB9KVxuICApO1xuICBjb25zdCBjb2luU3BlY2lmaWMgPSB7XG4gICAgW3dhbGxldC5jb2luKCldOiB7XG4gICAgICBzaWduZWRSZXF1ZXN0OiB1cGRhdGVSZXF1ZXN0V2l0aEVuY3J5cHRpb24sXG4gICAgICBzaWduYXR1cmUsXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHdhbGxldC5iaXRnby5wdXQod2FsbGV0LnVybCgpKS5zZW5kKHsgY29pblNwZWNpZmljIH0pLnJlc3VsdCgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWxmQ3VzdG9kaWFsTGlnaHRuaW5nV2FsbGV0IGV4dGVuZHMgSUxpZ2h0bmluZ1dhbGxldCB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNoYW5uZWwgYmFja3VwIGZvciB0aGUgZ2l2ZW4gd2FsbGV0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYWNrdXBSZXNwb25zZT59IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNoYW5uZWwgYmFja3VwXG4gICAqL1xuICBnZXRDaGFubmVsQmFja3VwKCk6IFByb21pc2U8QmFja3VwUmVzcG9uc2U+O1xufVxuXG5leHBvcnQgY2xhc3MgU2VsZkN1c3RvZGlhbExpZ2h0bmluZ1dhbGxldCBleHRlbmRzIExpZ2h0bmluZ1dhbGxldCBpbXBsZW1lbnRzIElTZWxmQ3VzdG9kaWFsTGlnaHRuaW5nV2FsbGV0IHtcbiAgY29uc3RydWN0b3Iod2FsbGV0OiBzZGtjb3JlLklXYWxsZXQpIHtcbiAgICBzdXBlcih3YWxsZXQpO1xuICAgIGlmICh3YWxsZXQuc3ViVHlwZSgpICE9PSAnbGlnaHRuaW5nU2VsZkN1c3RvZHknKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbGlnaHRuaW5nIHdhbGxldCB0eXBlIGZvciBzZWxmIGN1c3RvZGlhbCBsaWdodG5pbmc6ICR7d2FsbGV0LnN1YlR5cGUoKX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaGFubmVsQmFja3VwKCk6IFByb21pc2U8QmFja3VwUmVzcG9uc2U+IHtcbiAgICBjb25zdCBiYWNrdXBSZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy9iYWNrdXBgKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gc2RrY29yZS5kZWNvZGVPckVsc2UoQmFja3VwUmVzcG9uc2UubmFtZSwgQmFja3VwUmVzcG9uc2UsIGJhY2t1cFJlc3BvbnNlLCAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYWNrdXAgcmVzcG9uc2U6ICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import * as sdkcore from '@bitgo-beta/sdk-core';
2
+ import { ILightningWallet } from './lightning';
3
+ /**
4
+ * Returns custodial or self custodial lightning wallet depends on wallet type.
5
+ */
6
+ export declare function getLightningWallet(wallet: sdkcore.IWallet): ILightningWallet;
7
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/wallet/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAa5E"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLightningWallet = getLightningWallet;
4
+ const selfCustodialLightning_1 = require("./selfCustodialLightning");
5
+ const custodialLightning_1 = require("./custodialLightning");
6
+ /**
7
+ * Returns custodial or self custodial lightning wallet depends on wallet type.
8
+ */
9
+ function getLightningWallet(wallet) {
10
+ if (wallet.baseCoin.getFamily() !== 'lnbtc') {
11
+ throw new Error(`invalid coin for lightning wallet: ${wallet.baseCoin.getFamily()}`);
12
+ }
13
+ switch (wallet.subType()) {
14
+ case 'lightningCustody':
15
+ return new custodialLightning_1.CustodialLightningWallet(wallet);
16
+ case 'lightningSelfCustody':
17
+ return new selfCustodialLightning_1.SelfCustodialLightningWallet(wallet);
18
+ default:
19
+ throw new Error(`invalid wallet type ${wallet.subType()} for lightning coin`);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxnREFhQztBQXBCRCxxRUFBd0U7QUFDeEUsNkRBQWdFO0FBR2hFOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBdUI7SUFDeEQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLEtBQUssa0JBQWtCO1lBQ3JCLE9BQU8sSUFBSSw2Q0FBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxLQUFLLHNCQUFzQjtZQUN6QixPQUFPLElBQUkscURBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQ7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixNQUFNLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDbEYsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzZGtjb3JlIGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFNlbGZDdXN0b2RpYWxMaWdodG5pbmdXYWxsZXQgfSBmcm9tICcuL3NlbGZDdXN0b2RpYWxMaWdodG5pbmcnO1xuaW1wb3J0IHsgQ3VzdG9kaWFsTGlnaHRuaW5nV2FsbGV0IH0gZnJvbSAnLi9jdXN0b2RpYWxMaWdodG5pbmcnO1xuaW1wb3J0IHsgSUxpZ2h0bmluZ1dhbGxldCB9IGZyb20gJy4vbGlnaHRuaW5nJztcblxuLyoqXG4gKiBSZXR1cm5zIGN1c3RvZGlhbCBvciBzZWxmIGN1c3RvZGlhbCBsaWdodG5pbmcgd2FsbGV0IGRlcGVuZHMgb24gd2FsbGV0IHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaWdodG5pbmdXYWxsZXQod2FsbGV0OiBzZGtjb3JlLklXYWxsZXQpOiBJTGlnaHRuaW5nV2FsbGV0IHtcbiAgaWYgKHdhbGxldC5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2xuYnRjJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBjb2luIGZvciBsaWdodG5pbmcgd2FsbGV0OiAke3dhbGxldC5iYXNlQ29pbi5nZXRGYW1pbHkoKX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAod2FsbGV0LnN1YlR5cGUoKSkge1xuICAgIGNhc2UgJ2xpZ2h0bmluZ0N1c3RvZHknOlxuICAgICAgcmV0dXJuIG5ldyBDdXN0b2RpYWxMaWdodG5pbmdXYWxsZXQod2FsbGV0KTtcbiAgICBjYXNlICdsaWdodG5pbmdTZWxmQ3VzdG9keSc6XG4gICAgICByZXR1cm4gbmV3IFNlbGZDdXN0b2RpYWxMaWdodG5pbmdXYWxsZXQod2FsbGV0KTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHdhbGxldCB0eXBlICR7d2FsbGV0LnN1YlR5cGUoKX0gZm9yIGxpZ2h0bmluZyBjb2luYCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=codecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../../../../test/unit/lightning/codecs.ts"],"names":[],"mappings":""}