@bitgo/sdk-core 36.6.0 → 36.7.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.
- package/CHANGELOG.md +14 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +1 -0
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/environments.js +2 -2
- package/dist/src/bitgo/index.d.ts +1 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +3 -2
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +12 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +1 -0
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +59 -1
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +23 -2
- package/dist/src/bitgo/walletUtil/index.d.ts +2 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +18 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +44 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +130 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/walletUtil/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./utxoMessageProof"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0VXRpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi91dHhvTWVzc2FnZVByb29mJztcbiJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
2
|
+
import { IWallet } from '../wallet/iWallet';
|
|
3
|
+
export declare const MIDNIGHT_TNC_HASH = "31a6bab50a84b8439adcfb786bb2020f6807e6e8fda629b424110fc7bb1c6b8b";
|
|
4
|
+
type MessageInfo = {
|
|
5
|
+
message: string;
|
|
6
|
+
address: string;
|
|
7
|
+
};
|
|
8
|
+
type BulkMessageResponse = {
|
|
9
|
+
success: boolean;
|
|
10
|
+
numMessages: number;
|
|
11
|
+
transactions: Record<string, unknown>[];
|
|
12
|
+
};
|
|
13
|
+
export interface IMessageProvider {
|
|
14
|
+
/**
|
|
15
|
+
* Returns the messages and addresses that we want to sign. We call this function multiple times until there are no more
|
|
16
|
+
* messages. If there are no more messages, an empty array is returned. Note that we only return messages in sets of 200.
|
|
17
|
+
*/
|
|
18
|
+
getMessagesAndAddressesToSign(): Promise<MessageInfo[]>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The Midnight drop service can return up to 1000 messages per request. However, UTXO coins
|
|
22
|
+
* can only have a maximum of 200 messages per transaction. We make this wrapper function that
|
|
23
|
+
* handles the pagination and batching of messages, keeping a local cache of the unprocessed messages.
|
|
24
|
+
*/
|
|
25
|
+
export declare class MidnightMessageProvider implements IMessageProvider {
|
|
26
|
+
private wallet;
|
|
27
|
+
private destinationAddress;
|
|
28
|
+
protected unprocessedMessagesCache: MessageInfo[];
|
|
29
|
+
protected network: utxolib.Network;
|
|
30
|
+
protected midnightClaimUrl: string;
|
|
31
|
+
protected prevId: string | undefined;
|
|
32
|
+
protected ranOnce: boolean;
|
|
33
|
+
constructor(wallet: IWallet, destinationAddress: string);
|
|
34
|
+
getMessagesAndAddressesToSign(): Promise<MessageInfo[]>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Bulk signs BIP322 messages for the Midnight airdrop.
|
|
38
|
+
* @param wallet The wallet to sign the messages with.
|
|
39
|
+
* @param destinationAddress The ADA address the rewards will get sent to
|
|
40
|
+
* @param walletPassphrase (Optional) The wallet passphrase of the wallet
|
|
41
|
+
*/
|
|
42
|
+
export declare function bulkSignBip322MidnightMessages(wallet: IWallet, destinationAddress: string, walletPassphrase?: string): Promise<BulkMessageResponse>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=utxoMessageProof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxoMessageProof.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/walletUtil/utxoMessageProof.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK5C,eAAO,MAAM,iBAAiB,qEAAqE,CAAC;AAEpG,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AASF,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,6BAA6B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACzD;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAMlD,OAAO,CAAC,MAAM;IAAW,OAAO,CAAC,kBAAkB;IAL/D,SAAS,CAAC,wBAAwB,EAAE,WAAW,EAAE,CAAC;IAClD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACnC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,OAAO,UAAS;gBACN,MAAM,EAAE,OAAO,EAAU,kBAAkB,EAAE,MAAM;IAQjE,6BAA6B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAsC9D;AAED;;;;;GAKG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,OAAO,EACf,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAG9B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
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.MidnightMessageProvider = exports.MIDNIGHT_TNC_HASH = void 0;
|
|
37
|
+
exports.bulkSignBip322MidnightMessages = bulkSignBip322MidnightMessages;
|
|
38
|
+
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
39
|
+
const environments_1 = require("../environments");
|
|
40
|
+
const NUM_MESSAGES_PER_TRANSACTION = 2;
|
|
41
|
+
const NUM_MESSAGES_PER_QUERY = 1000;
|
|
42
|
+
exports.MIDNIGHT_TNC_HASH = '31a6bab50a84b8439adcfb786bb2020f6807e6e8fda629b424110fc7bb1c6b8b';
|
|
43
|
+
/**
|
|
44
|
+
* The Midnight drop service can return up to 1000 messages per request. However, UTXO coins
|
|
45
|
+
* can only have a maximum of 200 messages per transaction. We make this wrapper function that
|
|
46
|
+
* handles the pagination and batching of messages, keeping a local cache of the unprocessed messages.
|
|
47
|
+
*/
|
|
48
|
+
class MidnightMessageProvider {
|
|
49
|
+
constructor(wallet, destinationAddress) {
|
|
50
|
+
this.wallet = wallet;
|
|
51
|
+
this.destinationAddress = destinationAddress;
|
|
52
|
+
this.ranOnce = false;
|
|
53
|
+
this.unprocessedMessagesCache = [];
|
|
54
|
+
this.network = utxolib.networks[wallet.coin()];
|
|
55
|
+
this.midnightClaimUrl = `${environments_1.Environments[wallet.bitgo.env].uri}/api/airdrop-claim/v1/midnight/claims/${wallet.coin()}/${wallet.id()}`;
|
|
56
|
+
}
|
|
57
|
+
async getMessagesAndAddressesToSign() {
|
|
58
|
+
if (this.unprocessedMessagesCache.length > 0) {
|
|
59
|
+
return this.unprocessedMessagesCache.splice(0, NUM_MESSAGES_PER_TRANSACTION);
|
|
60
|
+
}
|
|
61
|
+
else if (this.unprocessedMessagesCache.length === 0 && this.ranOnce && this.prevId === undefined) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
this.ranOnce = true;
|
|
65
|
+
const query = {
|
|
66
|
+
status: 'UNINITIALIZED',
|
|
67
|
+
limit: NUM_MESSAGES_PER_QUERY,
|
|
68
|
+
};
|
|
69
|
+
if (this.prevId !== undefined) {
|
|
70
|
+
query.prevId = this.prevId;
|
|
71
|
+
}
|
|
72
|
+
const response = await this.wallet.bitgo.get(this.midnightClaimUrl).query(query).result();
|
|
73
|
+
if (response.status !== 'success') {
|
|
74
|
+
throw new Error(`Unexpected status code ${response.status} from ${this.midnightClaimUrl}`);
|
|
75
|
+
}
|
|
76
|
+
if (response?.pagination?.hasNext) {
|
|
77
|
+
this.prevId = response?.pagination?.nextPrevId;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.prevId = undefined;
|
|
81
|
+
}
|
|
82
|
+
this.unprocessedMessagesCache = response.claims.map((claim) => {
|
|
83
|
+
if (!claim.originAddress) {
|
|
84
|
+
throw new Error(`Claim ${JSON.stringify(claim)} is missing originAddress`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
// Midnight claim message format
|
|
88
|
+
message: `STAR ${claim.allocationAmount} to ${this.destinationAddress} ${exports.MIDNIGHT_TNC_HASH}`,
|
|
89
|
+
address: claim.originAddress,
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
const toReturn = this.unprocessedMessagesCache.splice(0, NUM_MESSAGES_PER_TRANSACTION);
|
|
93
|
+
return toReturn;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.MidnightMessageProvider = MidnightMessageProvider;
|
|
97
|
+
/**
|
|
98
|
+
* Bulk signs BIP322 messages for the Midnight airdrop.
|
|
99
|
+
* @param wallet The wallet to sign the messages with.
|
|
100
|
+
* @param destinationAddress The ADA address the rewards will get sent to
|
|
101
|
+
* @param walletPassphrase (Optional) The wallet passphrase of the wallet
|
|
102
|
+
*/
|
|
103
|
+
async function bulkSignBip322MidnightMessages(wallet, destinationAddress, walletPassphrase) {
|
|
104
|
+
const provider = new MidnightMessageProvider(wallet, destinationAddress);
|
|
105
|
+
return bulkSignBip322MessagesWithProvider(provider, wallet, walletPassphrase);
|
|
106
|
+
}
|
|
107
|
+
async function bulkSignBip322MessagesWithProvider(provider, wallet, walletPassphrase) {
|
|
108
|
+
let numMessages = 0;
|
|
109
|
+
let messages = await provider.getMessagesAndAddressesToSign();
|
|
110
|
+
const sendingFunction = wallet.type() === 'cold' ? wallet.prebuildTransaction : wallet.sendMany;
|
|
111
|
+
const transactions = [];
|
|
112
|
+
while (messages.length > 0) {
|
|
113
|
+
// Sign the messages with the wallet
|
|
114
|
+
const result = await sendingFunction.call(wallet, {
|
|
115
|
+
messages,
|
|
116
|
+
// Recipients must be empty
|
|
117
|
+
recipients: [],
|
|
118
|
+
// txFormat must be psbt
|
|
119
|
+
txFormat: 'psbt',
|
|
120
|
+
// Pass in the optional wallet passphrase
|
|
121
|
+
walletPassphrase,
|
|
122
|
+
offlineVerification: wallet.type() === 'cold',
|
|
123
|
+
});
|
|
124
|
+
transactions.push(result);
|
|
125
|
+
numMessages += messages.length;
|
|
126
|
+
messages = await provider.getMessagesAndAddressesToSign();
|
|
127
|
+
}
|
|
128
|
+
return { success: true, numMessages, transactions };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXR4b01lc3NhZ2VQcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXRVdGlsL3V0eG9NZXNzYWdlUHJvb2YudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0dBLHdFQU9DO0FBM0dELHlEQUEyQztBQUczQyxrREFBK0M7QUFFL0MsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLENBQUM7QUFDdkMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFDdkIsUUFBQSxpQkFBaUIsR0FBRyxrRUFBa0UsQ0FBQztBQTRCcEc7Ozs7R0FJRztBQUNILE1BQWEsdUJBQXVCO0lBTWxDLFlBQW9CLE1BQWUsRUFBVSxrQkFBMEI7UUFBbkQsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUFVLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBUTtRQUQ3RCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXhCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUN0QiwyQkFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDakMseUNBQXlDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRUQsS0FBSyxDQUFDLDZCQUE2QjtRQUNqQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQy9FLENBQUM7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LE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQixvQ0FBb0M7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoRCxRQUFRO1lBQ1IsMkJBQTJCO1lBQzNCLFVBQVUsRUFBRSxFQUFFO1lBQ2Qsd0JBQXdCO1lBQ3hCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLHlDQUF5QztZQUN6QyxnQkFBZ0I7WUFDaEIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU07U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixXQUFXLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQixRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IElXYWxsZXQgfSBmcm9tICcuLi93YWxsZXQvaVdhbGxldCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudHMgfSBmcm9tICcuLi9lbnZpcm9ubWVudHMnO1xuXG5jb25zdCBOVU1fTUVTU0FHRVNfUEVSX1RSQU5TQUNUSU9OID0gMjtcbmNvbnN0IE5VTV9NRVNTQUdFU19QRVJfUVVFUlkgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IE1JRE5JR0hUX1ROQ19IQVNIID0gJzMxYTZiYWI1MGE4NGI4NDM5YWRjZmI3ODZiYjIwMjBmNjgwN2U2ZThmZGE2MjliNDI0MTEwZmM3YmIxYzZiOGInO1xuXG50eXBlIE1lc3NhZ2VJbmZvID0ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbn07XG5cbnR5cGUgQ2xhaW0gPSB7XG4gIG9yaWdpbldhbGxldElkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBvcmlnaW5BZGRyZXNzPzogc3RyaW5nO1xuICBhbGxvY2F0aW9uQW1vdW50OiBzdHJpbmc7XG59O1xuXG50eXBlIEJ1bGtNZXNzYWdlUmVzcG9uc2UgPSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG51bU1lc3NhZ2VzOiBudW1iZXI7XG4gIHRyYW5zYWN0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlcyBhbmQgYWRkcmVzc2VzIHRoYXQgd2Ugd2FudCB0byBzaWduLiBXZSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmVcbiAgICogbWVzc2FnZXMuIElmIHRoZXJlIGFyZSBubyBtb3JlIG1lc3NhZ2VzLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHdlIG9ubHkgcmV0dXJuIG1lc3NhZ2VzIGluIHNldHMgb2YgMjAwLlxuICAgKi9cbiAgZ2V0TWVzc2FnZXNBbmRBZGRyZXNzZXNUb1NpZ24oKTogUHJvbWlzZTxNZXNzYWdlSW5mb1tdPjtcbn1cblxuLyoqXG4gKiBUaGUgTWlkbmlnaHQgZHJvcCBzZXJ2aWNlIGNhbiByZXR1cm4gdXAgdG8gMTAwMCBtZXNzYWdlcyBwZXIgcmVxdWVzdC4gSG93ZXZlciwgVVRYTyBjb2luc1xuICogY2FuIG9ubHkgaGF2ZSBhIG1heGltdW0gb2YgMjAwIG1lc3NhZ2VzIHBlciB0cmFuc2FjdGlvbi4gV2UgbWFrZSB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdGhhdFxuICogaGFuZGxlcyB0aGUgcGFnaW5hdGlvbiBhbmQgYmF0Y2hpbmcgb2YgbWVzc2FnZXMsIGtlZXBpbmcgYSBsb2NhbCBjYWNoZSBvZiB0aGUgdW5wcm9jZXNzZWQgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaWRuaWdodE1lc3NhZ2VQcm92aWRlciBpbXBsZW1lbnRzIElNZXNzYWdlUHJvdmlkZXIge1xuICBwcm90ZWN0ZWQgdW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlOiBNZXNzYWdlSW5mb1tdO1xuICBwcm90ZWN0ZWQgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuICBwcm90ZWN0ZWQgbWlkbmlnaHRDbGFpbVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcHJldklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByYW5PbmNlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgd2FsbGV0OiBJV2FsbGV0LCBwcml2YXRlIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nKSB7XG4gICAgdGhpcy51bnByb2Nlc3NlZE1lc3NhZ2VzQ2FjaGUgPSBbXTtcbiAgICB0aGlzLm5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW3dhbGxldC5jb2luKCldO1xuICAgIHRoaXMubWlkbmlnaHRDbGFpbVVybCA9IGAke1xuICAgICAgRW52aXJvbm1lbnRzW3dhbGxldC5iaXRnby5lbnZdLnVyaVxuICAgIH0vYXBpL2FpcmRyb3AtY2xhaW0vdjEvbWlkbmlnaHQvY2xhaW1zLyR7d2FsbGV0LmNvaW4oKX0vJHt3YWxsZXQuaWQoKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWVzc2FnZXNBbmRBZGRyZXNzZXNUb1NpZ24oKTogUHJvbWlzZTxNZXNzYWdlSW5mb1tdPiB7XG4gICAgaWYgKHRoaXMudW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnVucHJvY2Vzc2VkTWVzc2FnZXNDYWNoZS5zcGxpY2UoMCwgTlVNX01FU1NBR0VTX1BFUl9UUkFOU0FDVElPTik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnVucHJvY2Vzc2VkTWVzc2FnZXNDYWNoZS5sZW5ndGggPT09IDAgJiYgdGhpcy5yYW5PbmNlICYmIHRoaXMucHJldklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aGlzLnJhbk9uY2UgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHN0YXR1czogJ1VOSU5JVElBTElaRUQnLFxuICAgICAgbGltaXQ6IE5VTV9NRVNTQUdFU19QRVJfUVVFUlksXG4gICAgfTtcbiAgICBpZiAodGhpcy5wcmV2SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnkucHJldklkID0gdGhpcy5wcmV2SWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z28uZ2V0KHRoaXMubWlkbmlnaHRDbGFpbVVybCkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHN0YXR1cyBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzfSBmcm9tICR7dGhpcy5taWRuaWdodENsYWltVXJsfWApO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2U/LnBhZ2luYXRpb24/Lmhhc05leHQpIHtcbiAgICAgIHRoaXMucHJldklkID0gcmVzcG9uc2U/LnBhZ2luYXRpb24/Lm5leHRQcmV2SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJldklkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMudW5wcm9jZXNzZWRNZXNzYWdlc0NhY2hlID0gcmVzcG9uc2UuY2xhaW1zLm1hcCgoY2xhaW06IENsYWltKSA9PiB7XG4gICAgICBpZiAoIWNsYWltLm9yaWdpbkFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGFpbSAke0pTT04uc3RyaW5naWZ5KGNsYWltKX0gaXMgbWlzc2luZyBvcmlnaW5BZGRyZXNzYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBNaWRuaWdodCBjbGFpbSBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBgU1RBUiAke2NsYWltLmFsbG9jYXRpb25BbW91bnR9IHRvICR7dGhpcy5kZXN0aW5hdGlvbkFkZHJlc3N9ICR7TUlETklHSFRfVE5DX0hBU0h9YCxcbiAgICAgICAgYWRkcmVzczogY2xhaW0ub3JpZ2luQWRkcmVzcyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgdG9SZXR1cm4gPSB0aGlzLnVucHJvY2Vzc2VkTWVzc2FnZXNDYWNoZS5zcGxpY2UoMCwgTlVNX01FU1NBR0VTX1BFUl9UUkFOU0FDVElPTik7XG4gICAgcmV0dXJuIHRvUmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogQnVsayBzaWducyBCSVAzMjIgbWVzc2FnZXMgZm9yIHRoZSBNaWRuaWdodCBhaXJkcm9wLlxuICogQHBhcmFtIHdhbGxldCBUaGUgd2FsbGV0IHRvIHNpZ24gdGhlIG1lc3NhZ2VzIHdpdGguXG4gKiBAcGFyYW0gZGVzdGluYXRpb25BZGRyZXNzIFRoZSBBREEgYWRkcmVzcyB0aGUgcmV3YXJkcyB3aWxsIGdldCBzZW50IHRvXG4gKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSAoT3B0aW9uYWwpIFRoZSB3YWxsZXQgcGFzc3BocmFzZSBvZiB0aGUgd2FsbGV0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWxrU2lnbkJpcDMyMk1pZG5pZ2h0TWVzc2FnZXMoXG4gIHdhbGxldDogSVdhbGxldCxcbiAgZGVzdGluYXRpb25BZGRyZXNzOiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmdcbik6IFByb21pc2U8QnVsa01lc3NhZ2VSZXNwb25zZT4ge1xuICBjb25zdCBwcm92aWRlciA9IG5ldyBNaWRuaWdodE1lc3NhZ2VQcm92aWRlcih3YWxsZXQsIGRlc3RpbmF0aW9uQWRkcmVzcyk7XG4gIHJldHVybiBidWxrU2lnbkJpcDMyMk1lc3NhZ2VzV2l0aFByb3ZpZGVyKHByb3ZpZGVyLCB3YWxsZXQsIHdhbGxldFBhc3NwaHJhc2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWxrU2lnbkJpcDMyMk1lc3NhZ2VzV2l0aFByb3ZpZGVyKFxuICBwcm92aWRlcjogSU1lc3NhZ2VQcm92aWRlcixcbiAgd2FsbGV0OiBJV2FsbGV0LFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nXG4pOiBQcm9taXNlPEJ1bGtNZXNzYWdlUmVzcG9uc2U+IHtcbiAgbGV0IG51bU1lc3NhZ2VzID0gMDtcbiAgbGV0IG1lc3NhZ2VzOiBNZXNzYWdlSW5mb1tdID0gYXdhaXQgcHJvdmlkZXIuZ2V0TWVzc2FnZXNBbmRBZGRyZXNzZXNUb1NpZ24oKTtcbiAgY29uc3Qgc2VuZGluZ0Z1bmN0aW9uID0gd2FsbGV0LnR5cGUoKSA9PT0gJ2NvbGQnID8gd2FsbGV0LnByZWJ1aWxkVHJhbnNhY3Rpb24gOiB3YWxsZXQuc2VuZE1hbnk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICB3aGlsZSAobWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgIC8vIFNpZ24gdGhlIG1lc3NhZ2VzIHdpdGggdGhlIHdhbGxldFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlbmRpbmdGdW5jdGlvbi5jYWxsKHdhbGxldCwge1xuICAgICAgbWVzc2FnZXMsXG4gICAgICAvLyBSZWNpcGllbnRzIG11c3QgYmUgZW1wdHlcbiAgICAgIHJlY2lwaWVudHM6IFtdLFxuICAgICAgLy8gdHhGb3JtYXQgbXVzdCBiZSBwc2J0XG4gICAgICB0eEZvcm1hdDogJ3BzYnQnLFxuICAgICAgLy8gUGFzcyBpbiB0aGUgb3B0aW9uYWwgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBvZmZsaW5lVmVyaWZpY2F0aW9uOiB3YWxsZXQudHlwZSgpID09PSAnY29sZCcsXG4gICAgfSk7XG4gICAgdHJhbnNhY3Rpb25zLnB1c2gocmVzdWx0KTtcbiAgICBudW1NZXNzYWdlcyArPSBtZXNzYWdlcy5sZW5ndGg7XG4gICAgbWVzc2FnZXMgPSBhd2FpdCBwcm92aWRlci5nZXRNZXNzYWdlc0FuZEFkZHJlc3Nlc1RvU2lnbigpO1xuICB9XG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG51bU1lc3NhZ2VzLCB0cmFuc2FjdGlvbnMgfTtcbn1cbiJdfQ==
|