@bitgo-beta/sdk-coin-sui 0.0.0-semantic-release-managed
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/.eslintignore +6 -0
- package/.mocharc.yml +7 -0
- package/CHANGELOG.md +1152 -0
- package/LICENSE +191 -0
- package/README.md +30 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/lib/compareTransactionBlocks.d.ts +8 -0
- package/dist/src/lib/compareTransactionBlocks.d.ts.map +1 -0
- package/dist/src/lib/compareTransactionBlocks.js +12 -0
- package/dist/src/lib/constants.d.ts +17 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +30 -0
- package/dist/src/lib/customTransaction.d.ts +57 -0
- package/dist/src/lib/customTransaction.d.ts.map +1 -0
- package/dist/src/lib/customTransaction.js +159 -0
- package/dist/src/lib/customTransactionBuilder.d.ts +46 -0
- package/dist/src/lib/customTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customTransactionBuilder.js +117 -0
- package/dist/src/lib/iface.d.ts +131 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +63 -0
- package/dist/src/lib/index.d.ts +22 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +77 -0
- package/dist/src/lib/keyPair.d.ts +29 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +97 -0
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts +66 -0
- package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/Inputs.js +55 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +302 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/TransactionBlock.js +255 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +566 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +168 -0
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts +937 -0
- package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/Transactions.js +118 -0
- package/dist/src/lib/mystenlab/builder/bcs.d.ts +25 -0
- package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/bcs.js +141 -0
- package/dist/src/lib/mystenlab/builder/index.d.ts +5 -0
- package/dist/src/lib/mystenlab/builder/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/index.js +21 -0
- package/dist/src/lib/mystenlab/builder/serializer.d.ts +4 -0
- package/dist/src/lib/mystenlab/builder/serializer.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/serializer.js +99 -0
- package/dist/src/lib/mystenlab/builder/utils.d.ts +10 -0
- package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/builder/utils.js +10 -0
- package/dist/src/lib/mystenlab/cryptography/hash.d.ts +8 -0
- package/dist/src/lib/mystenlab/cryptography/hash.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/cryptography/hash.js +21 -0
- package/dist/src/lib/mystenlab/framework/framework.d.ts +93 -0
- package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/framework.js +135 -0
- package/dist/src/lib/mystenlab/framework/index.d.ts +3 -0
- package/dist/src/lib/mystenlab/framework/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/index.js +19 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts +14 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/framework/sui-system-state.js +22 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts +7 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +119 -0
- package/dist/src/lib/mystenlab/types/coin.d.ts +89 -0
- package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/coin.js +32 -0
- package/dist/src/lib/mystenlab/types/common.d.ts +45 -0
- package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/common.js +84 -0
- package/dist/src/lib/mystenlab/types/events.d.ts +198 -0
- package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/events.js +46 -0
- package/dist/src/lib/mystenlab/types/index.d.ts +9 -0
- package/dist/src/lib/mystenlab/types/index.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/index.js +25 -0
- package/dist/src/lib/mystenlab/types/normalized.d.ts +254 -0
- package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/normalized.js +111 -0
- package/dist/src/lib/mystenlab/types/objects.d.ts +806 -0
- package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/objects.js +292 -0
- package/dist/src/lib/mystenlab/types/option.d.ts +8 -0
- package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/option.js +13 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +111 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/sui-bcs.js +107 -0
- package/dist/src/lib/mystenlab/types/transactions.d.ts +6703 -0
- package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/transactions.js +389 -0
- package/dist/src/lib/mystenlab/types/validator.d.ts +641 -0
- package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -0
- package/dist/src/lib/mystenlab/types/validator.js +156 -0
- package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
- package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
- package/dist/src/lib/resources/walrusConfig.js +37 -0
- package/dist/src/lib/rpcClient.d.ts +5 -0
- package/dist/src/lib/rpcClient.d.ts.map +1 -0
- package/dist/src/lib/rpcClient.js +74 -0
- package/dist/src/lib/stakingBuilder.d.ts +62 -0
- package/dist/src/lib/stakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/stakingBuilder.js +206 -0
- package/dist/src/lib/stakingTransaction.d.ts +51 -0
- package/dist/src/lib/stakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/stakingTransaction.js +219 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +38 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +132 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts +57 -0
- package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferTransaction.js +250 -0
- package/dist/src/lib/transaction.d.ts +82 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +283 -0
- package/dist/src/lib/transactionBuilder.d.ts +60 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +140 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +48 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +127 -0
- package/dist/src/lib/transferBuilder.d.ts +37 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +132 -0
- package/dist/src/lib/transferTransaction.d.ts +54 -0
- package/dist/src/lib/transferTransaction.d.ts.map +1 -0
- package/dist/src/lib/transferTransaction.js +203 -0
- package/dist/src/lib/unstakingBuilder.d.ts +62 -0
- package/dist/src/lib/unstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/unstakingBuilder.js +227 -0
- package/dist/src/lib/unstakingTransaction.d.ts +75 -0
- package/dist/src/lib/unstakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/unstakingTransaction.js +345 -0
- package/dist/src/lib/utils.d.ts +127 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +539 -0
- package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
- package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingBuilder.js +200 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
- package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusStakingTransaction.js +269 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
- package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +15 -0
- package/dist/src/sui.d.ts +92 -0
- package/dist/src/sui.d.ts.map +1 -0
- package/dist/src/sui.js +665 -0
- package/dist/src/suiToken.d.ts +22 -0
- package/dist/src/suiToken.d.ts.map +1 -0
- package/dist/src/suiToken.js +61 -0
- package/dist/src/tsui.d.ts +22 -0
- package/dist/src/tsui.d.ts.map +1 -0
- package/dist/src/tsui.js +30 -0
- package/package.json +63 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBlockDataBuilder = exports.TRANSACTION_DATA_MAX_SIZE = exports.SerializedTransactionDataBuilder = exports.TransactionExpiration = void 0;
|
|
4
|
+
const bcs_1 = require("@mysten/bcs");
|
|
5
|
+
const superstruct_1 = require("superstruct");
|
|
6
|
+
const hash_1 = require("../cryptography/hash");
|
|
7
|
+
const types_1 = require("../types");
|
|
8
|
+
const bcs_2 = require("./bcs");
|
|
9
|
+
const Transactions_1 = require("./Transactions");
|
|
10
|
+
const Inputs_1 = require("./Inputs");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
exports.TransactionExpiration = (0, superstruct_1.optional)((0, superstruct_1.nullable)((0, superstruct_1.union)([(0, superstruct_1.object)({ Epoch: (0, superstruct_1.integer)() }), (0, superstruct_1.object)({ None: (0, superstruct_1.union)([(0, superstruct_1.literal)(true), (0, superstruct_1.literal)(null)]) })])));
|
|
13
|
+
const SuiAddress = (0, superstruct_1.string)();
|
|
14
|
+
const StringEncodedBigint = (0, superstruct_1.define)('StringEncodedBigint', (val) => {
|
|
15
|
+
if (!['string', 'number', 'bigint'].includes(typeof val))
|
|
16
|
+
return false;
|
|
17
|
+
try {
|
|
18
|
+
BigInt(val);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const GasConfig = (0, superstruct_1.object)({
|
|
26
|
+
budget: (0, superstruct_1.optional)(StringEncodedBigint),
|
|
27
|
+
price: (0, superstruct_1.optional)(StringEncodedBigint),
|
|
28
|
+
payment: (0, superstruct_1.optional)((0, superstruct_1.array)(types_1.SuiObjectRef)),
|
|
29
|
+
owner: (0, superstruct_1.optional)(SuiAddress),
|
|
30
|
+
});
|
|
31
|
+
exports.SerializedTransactionDataBuilder = (0, superstruct_1.object)({
|
|
32
|
+
version: (0, superstruct_1.literal)(1),
|
|
33
|
+
sender: (0, superstruct_1.optional)(SuiAddress),
|
|
34
|
+
expiration: exports.TransactionExpiration,
|
|
35
|
+
gasConfig: GasConfig,
|
|
36
|
+
inputs: (0, superstruct_1.array)(Transactions_1.TransactionBlockInput),
|
|
37
|
+
transactions: (0, superstruct_1.array)(Transactions_1.TransactionType),
|
|
38
|
+
});
|
|
39
|
+
function prepareSuiAddress(address) {
|
|
40
|
+
return (0, types_1.normalizeSuiAddress)(address).replace('0x', '');
|
|
41
|
+
}
|
|
42
|
+
// NOTE: This value should be kept in sync with the corresponding value in
|
|
43
|
+
// crates/sui-protocol-config/src/lib.rs
|
|
44
|
+
exports.TRANSACTION_DATA_MAX_SIZE = 128 * 1024;
|
|
45
|
+
class TransactionBlockDataBuilder {
|
|
46
|
+
static fromKindBytes(bytes) {
|
|
47
|
+
const kind = bcs_2.builder.de('TransactionKind', bytes);
|
|
48
|
+
const programmableTx = kind?.ProgrammableTransaction;
|
|
49
|
+
if (!programmableTx) {
|
|
50
|
+
throw new Error('Unable to deserialize from bytes.');
|
|
51
|
+
}
|
|
52
|
+
const serialized = (0, utils_1.create)({
|
|
53
|
+
version: 1,
|
|
54
|
+
gasConfig: {},
|
|
55
|
+
inputs: programmableTx.inputs.map((value, index) => (0, utils_1.create)({
|
|
56
|
+
kind: 'Input',
|
|
57
|
+
value,
|
|
58
|
+
index,
|
|
59
|
+
type: (0, superstruct_1.is)(value, Inputs_1.PureCallArg) ? 'pure' : 'object',
|
|
60
|
+
}, Transactions_1.TransactionBlockInput)),
|
|
61
|
+
transactions: programmableTx.transactions,
|
|
62
|
+
}, exports.SerializedTransactionDataBuilder);
|
|
63
|
+
return TransactionBlockDataBuilder.restore(serialized);
|
|
64
|
+
}
|
|
65
|
+
static fromBytes(bytes) {
|
|
66
|
+
const rawData = bcs_2.builder.de('TransactionData', bytes);
|
|
67
|
+
const data = rawData?.V1;
|
|
68
|
+
const programmableTx = data?.kind?.ProgrammableTransaction;
|
|
69
|
+
if (!data || !programmableTx) {
|
|
70
|
+
throw new Error('Unable to deserialize from bytes.');
|
|
71
|
+
}
|
|
72
|
+
const serialized = (0, utils_1.create)({
|
|
73
|
+
version: 1,
|
|
74
|
+
sender: data.sender,
|
|
75
|
+
expiration: data.expiration,
|
|
76
|
+
gasConfig: data.gasData,
|
|
77
|
+
inputs: programmableTx.inputs.map((value, index) => (0, utils_1.create)({
|
|
78
|
+
kind: 'Input',
|
|
79
|
+
value,
|
|
80
|
+
index,
|
|
81
|
+
type: (0, superstruct_1.is)(value, Inputs_1.PureCallArg) ? 'pure' : 'object',
|
|
82
|
+
}, Transactions_1.TransactionBlockInput)),
|
|
83
|
+
transactions: programmableTx.transactions,
|
|
84
|
+
}, exports.SerializedTransactionDataBuilder);
|
|
85
|
+
return TransactionBlockDataBuilder.restore(serialized);
|
|
86
|
+
}
|
|
87
|
+
static restore(data) {
|
|
88
|
+
(0, superstruct_1.assert)(data, exports.SerializedTransactionDataBuilder);
|
|
89
|
+
const transactionData = new TransactionBlockDataBuilder();
|
|
90
|
+
Object.assign(transactionData, data);
|
|
91
|
+
return transactionData;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Generate transaction digest.
|
|
95
|
+
*
|
|
96
|
+
* @param bytes BCS serialized transaction data
|
|
97
|
+
* @returns transaction digest.
|
|
98
|
+
*/
|
|
99
|
+
static getDigestFromBytes(bytes) {
|
|
100
|
+
const hash = (0, hash_1.hashTypedData)('TransactionData', bytes);
|
|
101
|
+
return (0, bcs_1.toB58)(hash);
|
|
102
|
+
}
|
|
103
|
+
constructor(clone) {
|
|
104
|
+
this.version = 1;
|
|
105
|
+
this.sender = clone?.sender;
|
|
106
|
+
this.expiration = clone?.expiration;
|
|
107
|
+
this.gasConfig = clone?.gasConfig ?? {};
|
|
108
|
+
this.inputs = clone?.inputs ?? [];
|
|
109
|
+
this.transactions = clone?.transactions ?? [];
|
|
110
|
+
}
|
|
111
|
+
build({ overrides, onlyTransactionKind, } = {}) {
|
|
112
|
+
// Resolve inputs down to values:
|
|
113
|
+
const inputs = this.inputs.map((input) => {
|
|
114
|
+
(0, superstruct_1.assert)(input.value, Inputs_1.BuilderCallArg);
|
|
115
|
+
return input.value;
|
|
116
|
+
});
|
|
117
|
+
const kind = {
|
|
118
|
+
ProgrammableTransaction: {
|
|
119
|
+
inputs,
|
|
120
|
+
transactions: this.transactions,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
if (onlyTransactionKind) {
|
|
124
|
+
return bcs_2.builder.ser('TransactionKind', kind, { maxSize: exports.TRANSACTION_DATA_MAX_SIZE }).toBytes();
|
|
125
|
+
}
|
|
126
|
+
const expiration = overrides?.expiration ?? this.expiration;
|
|
127
|
+
const sender = overrides?.sender ?? this.sender;
|
|
128
|
+
const gasConfig = { ...this.gasConfig, ...overrides?.gasConfig };
|
|
129
|
+
if (!sender) {
|
|
130
|
+
throw new Error('Missing transaction sender');
|
|
131
|
+
}
|
|
132
|
+
if (!gasConfig.budget) {
|
|
133
|
+
throw new Error('Missing gas budget');
|
|
134
|
+
}
|
|
135
|
+
if (!gasConfig.payment) {
|
|
136
|
+
throw new Error('Missing gas payment');
|
|
137
|
+
}
|
|
138
|
+
if (!gasConfig.price) {
|
|
139
|
+
throw new Error('Missing gas price');
|
|
140
|
+
}
|
|
141
|
+
const transactionData = {
|
|
142
|
+
sender: prepareSuiAddress(sender),
|
|
143
|
+
expiration: expiration ? expiration : { None: true },
|
|
144
|
+
gasData: {
|
|
145
|
+
payment: gasConfig.payment,
|
|
146
|
+
owner: prepareSuiAddress(this.gasConfig.owner ?? sender),
|
|
147
|
+
price: BigInt(gasConfig.price),
|
|
148
|
+
budget: BigInt(gasConfig.budget),
|
|
149
|
+
},
|
|
150
|
+
kind: {
|
|
151
|
+
ProgrammableTransaction: {
|
|
152
|
+
inputs,
|
|
153
|
+
transactions: this.transactions,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
return bcs_2.builder.ser('TransactionData', { V1: transactionData }, { maxSize: exports.TRANSACTION_DATA_MAX_SIZE }).toBytes();
|
|
158
|
+
}
|
|
159
|
+
getDigest() {
|
|
160
|
+
const bytes = this.build({ onlyTransactionKind: false });
|
|
161
|
+
return TransactionBlockDataBuilder.getDigestFromBytes(bytes);
|
|
162
|
+
}
|
|
163
|
+
snapshot() {
|
|
164
|
+
return (0, utils_1.create)(this, exports.SerializedTransactionDataBuilder);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.TransactionBlockDataBuilder = TransactionBlockDataBuilder;
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25EYXRhQmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL215c3RlbmxhYi9idWlsZGVyL1RyYW5zYWN0aW9uRGF0YUJsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFvQztBQUNwQyw2Q0FhcUI7QUFDckIsK0NBQXFEO0FBQ3JELG9DQUE2RDtBQUM3RCwrQkFBZ0M7QUFDaEMsaURBQXdFO0FBQ3hFLHFDQUF1RDtBQUN2RCxtQ0FBaUM7QUFFcEIsUUFBQSxxQkFBcUIsR0FBRyxJQUFBLHNCQUFRLEVBQzNDLElBQUEsc0JBQVEsRUFBQyxJQUFBLG1CQUFLLEVBQUMsQ0FBQyxJQUFBLG9CQUFNLEVBQUMsRUFBRSxLQUFLLEVBQUUsSUFBQSxxQkFBTyxHQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUEsb0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxJQUFBLG1CQUFLLEVBQUMsQ0FBQyxJQUFBLHFCQUFPLEVBQUMsSUFBSSxDQUFDLEVBQUUsSUFBQSxxQkFBTyxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pHLENBQUM7QUFHRixNQUFNLFVBQVUsR0FBRyxJQUFBLG9CQUFNLEdBQUUsQ0FBQztBQUU1QixNQUFNLG1CQUFtQixHQUFHLElBQUEsb0JBQU0sRUFBUyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQ3hFLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFdkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztB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QU8sRUFBRSxpQ0FBeUIsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkgsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFBLGNBQU0sRUFBQyxJQUFJLEVBQUUsd0NBQWdDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0Y7QUF6S0Qsa0VBeUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9CNTggfSBmcm9tICdAbXlzdGVuL2Jjcyc7XG5pbXBvcnQge1xuICBhcnJheSxcbiAgYXNzZXJ0LFxuICBkZWZpbmUsXG4gIEluZmVyLFxuICBpbnRlZ2VyLFxuICBpcyxcbiAgbGl0ZXJhbCxcbiAgbnVsbGFibGUsXG4gIG9iamVjdCxcbiAgb3B0aW9uYWwsXG4gIHN0cmluZyxcbiAgdW5pb24sXG59IGZyb20gJ3N1cGVyc3RydWN0JztcbmltcG9ydCB7IGhhc2hUeXBlZERhdGEgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvaGFzaCc7XG5pbXBvcnQgeyBub3JtYWxpemVTdWlBZGRyZXNzLCBTdWlPYmplY3RSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZGVyIH0gZnJvbSAnLi9iY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBUcmFuc2FjdGlvbkJsb2NrSW5wdXQgfSBmcm9tICcuL1RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBCdWlsZGVyQ2FsbEFyZywgUHVyZUNhbGxBcmcgfSBmcm9tICcuL0lucHV0cyc7XG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFRyYW5zYWN0aW9uRXhwaXJhdGlvbiA9IG9wdGlvbmFsKFxuICBudWxsYWJsZSh1bmlvbihbb2JqZWN0KHsgRXBvY2g6IGludGVnZXIoKSB9KSwgb2JqZWN0KHsgTm9uZTogdW5pb24oW2xpdGVyYWwodHJ1ZSksIGxpdGVyYWwobnVsbCldKSB9KV0pKVxuKTtcbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uRXhwaXJhdGlvbiA9IEluZmVyPHR5cGVvZiBUcmFuc2FjdGlvbkV4cGlyYXRpb24+O1xuXG5jb25zdCBTdWlBZGRyZXNzID0gc3RyaW5nKCk7XG5cbmNvbnN0IFN0cmluZ0VuY29kZWRCaWdpbnQgPSBkZWZpbmU8c3RyaW5nPignU3RyaW5nRW5jb2RlZEJpZ2ludCcsICh2YWwpID0+IHtcbiAgaWYgKCFbJ3N0cmluZycsICdudW1iZXInLCAnYmlnaW50J10uaW5jbHVkZXModHlwZW9mIHZhbCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIEJpZ0ludCh2YWwgYXMgc3RyaW5nKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KTtcblxuY29uc3QgR2FzQ29uZmlnID0gb2JqZWN0KHtcbiAgYnVkZ2V0OiBvcHRpb25hbChTdHJpbmdFbmNvZGVkQmlnaW50KSxcbiAgcHJpY2U6IG9wdGlvbmFsKFN0cmluZ0VuY29kZWRCaWdpbnQpLFxuICBwYXltZW50OiBvcHRpb25hbChhcnJheShTdWlPYmplY3RSZWYpKSxcbiAgb3duZXI6IG9wdGlvbmFsKFN1aUFkZHJlc3MpLFxufSk7XG50eXBlIEdhc0NvbmZpZyA9IEluZmVyPHR5cGVvZiBHYXNDb25maWc+O1xuXG5leHBvcnQgY29uc3QgU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXIgPSBvYmplY3Qoe1xuICB2ZXJzaW9uOiBsaXRlcmFsKDEpLFxuICBzZW5kZXI6IG9wdGlvbmFsKFN1aUFkZHJlc3MpLFxuICBleHBpcmF0aW9uOiBUcmFuc2FjdGlvbkV4cGlyYXRpb24sXG4gIGdhc0NvbmZpZzogR2FzQ29uZmlnLFxuICBpbnB1dHM6IGFycmF5KFRyYW5zYWN0aW9uQmxvY2tJbnB1dCksXG4gIHRyYW5zYWN0aW9uczogYXJyYXkoVHJhbnNhY3Rpb25UeXBlKSxcbn0pO1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXIgPSBJbmZlcjx0eXBlb2YgU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXI+O1xuXG5mdW5jdGlvbiBwcmVwYXJlU3VpQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVN1aUFkZHJlc3MoYWRkcmVzcykucmVwbGFjZSgnMHgnLCAnJyk7XG59XG5cbi8vIE5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4vLyBjcmF0ZXMvc3VpLXByb3RvY29sLWNvbmZpZy9zcmMvbGliLnJzXG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05fREFUQV9NQVhfU0laRSA9IDEyOCAqIDEwMjQ7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIge1xuICBzdGF0aWMgZnJvbUtpbmRCeXRlcyhieXRlczogVWludDhBcnJheSkge1xuICAgIGNvbnN0IGtpbmQgPSBidWlsZGVyLmRlKCdUcmFuc2FjdGlvbktpbmQnLCBieXRlcyk7XG4gICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSBraW5kPy5Qcm9ncmFtbWFibGVUcmFuc2FjdGlvbjtcbiAgICBpZiAoIXByb2dyYW1tYWJsZVR4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBjcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGdhc0NvbmZpZzoge30sXG4gICAgICAgIGlucHV0czogcHJvZ3JhbW1hYmxlVHguaW5wdXRzLm1hcCgodmFsdWU6IHVua25vd24sIGluZGV4OiBudW1iZXIpID0+XG4gICAgICAgICAgY3JlYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAnSW5wdXQnLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHR5cGU6IGlzKHZhbHVlLCBQdXJlQ2FsbEFyZykgPyAncHVyZScgOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUcmFuc2FjdGlvbkJsb2NrSW5wdXRcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRyYW5zYWN0aW9uczogcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zLFxuICAgICAgfSxcbiAgICAgIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyXG4gICAgKTtcblxuICAgIHJldHVybiBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIucmVzdG9yZShzZXJpYWxpemVkKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCByYXdEYXRhID0gYnVpbGRlci5kZSgnVHJhbnNhY3Rpb25EYXRhJywgYnl0ZXMpO1xuICAgIGNvbnN0IGRhdGEgPSByYXdEYXRhPy5WMTtcbiAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IGRhdGE/LmtpbmQ/LlByb2dyYW1tYWJsZVRyYW5zYWN0aW9uO1xuICAgIGlmICghZGF0YSB8fCAhcHJvZ3JhbW1hYmxlVHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlc2VyaWFsaXplIGZyb20gYnl0ZXMuJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgc2VuZGVyOiBkYXRhLnNlbmRlcixcbiAgICAgICAgZXhwaXJhdGlvbjogZGF0YS5leHBpcmF0aW9uLFxuICAgICAgICBnYXNDb25maWc6IGRhdGEuZ2FzRGF0YSxcbiAgICAgICAgaW5wdXRzOiBwcm9ncmFtbWFibGVUeC5pbnB1dHMubWFwKCh2YWx1ZTogdW5rbm93biwgaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICBjcmVhdGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtpbmQ6ICdJbnB1dCcsXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgdHlwZTogaXModmFsdWUsIFB1cmVDYWxsQXJnKSA/ICdwdXJlJyA6ICdvYmplY3QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFRyYW5zYWN0aW9uQmxvY2tJbnB1dFxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnMsXG4gICAgICB9LFxuICAgICAgU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXJcbiAgICApO1xuXG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlci5yZXN0b3JlKHNlcmlhbGl6ZWQpO1xuICB9XG5cbiAgc3RhdGljIHJlc3RvcmUoZGF0YTogU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXIpIHtcbiAgICBhc3NlcnQoZGF0YSwgU2VyaWFsaXplZFRyYW5zYWN0aW9uRGF0YUJ1aWxkZXIpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uRGF0YSA9IG5ldyBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIoKTtcbiAgICBPYmplY3QuYXNzaWduKHRyYW5zYWN0aW9uRGF0YSwgZGF0YSk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0cmFuc2FjdGlvbiBkaWdlc3QuXG4gICAqXG4gICAqIEBwYXJhbSBieXRlcyBCQ1Mgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIGRpZ2VzdC5cbiAgICovXG4gIHN0YXRpYyBnZXREaWdlc3RGcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCBoYXNoID0gaGFzaFR5cGVkRGF0YSgnVHJhbnNhY3Rpb25EYXRhJywgYnl0ZXMpO1xuICAgIHJldHVybiB0b0I1OChoYXNoKTtcbiAgfVxuXG4gIHZlcnNpb24gPSAxIGFzIGNvbnN0O1xuICBzZW5kZXI/OiBzdHJpbmc7XG4gIGV4cGlyYXRpb24/OiBUcmFuc2FjdGlvbkV4cGlyYXRpb247XG4gIGdhc0NvbmZpZzogR2FzQ29uZmlnO1xuICBpbnB1dHM6IFRyYW5zYWN0aW9uQmxvY2tJbnB1dFtdO1xuICB0cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uVHlwZVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNsb25lPzogVHJhbnNhY3Rpb25CbG9ja0RhdGFCdWlsZGVyKSB7XG4gICAgdGhpcy5zZW5kZXIgPSBjbG9uZT8uc2VuZGVyO1xuICAgIHRoaXMuZXhwaXJhdGlvbiA9IGNsb25lPy5leHBpcmF0aW9uO1xuICAgIHRoaXMuZ2FzQ29uZmlnID0gY2xvbmU/Lmdhc0NvbmZpZyA/PyB7fTtcbiAgICB0aGlzLmlucHV0cyA9IGNsb25lPy5pbnB1dHMgPz8gW107XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBjbG9uZT8udHJhbnNhY3Rpb25zID8/IFtdO1xuICB9XG5cbiAgYnVpbGQoe1xuICAgIG92ZXJyaWRlcyxcbiAgICBvbmx5VHJhbnNhY3Rpb25LaW5kLFxuICB9OiB7XG4gICAgb3ZlcnJpZGVzPzogUGljazxQYXJ0aWFsPFRyYW5zYWN0aW9uQmxvY2tEYXRhQnVpbGRlcj4sICdzZW5kZXInIHwgJ2dhc0NvbmZpZycgfCAnZXhwaXJhdGlvbic+O1xuICAgIG9ubHlUcmFuc2FjdGlvbktpbmQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICAvLyBSZXNvbHZlIGlucHV0cyBkb3duIHRvIHZhbHVlczpcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBhc3NlcnQoaW5wdXQudmFsdWUsIEJ1aWxkZXJDYWxsQXJnKTtcbiAgICAgIHJldHVybiBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGtpbmQgPSB7XG4gICAgICBQcm9ncmFtbWFibGVUcmFuc2FjdGlvbjoge1xuICAgICAgICBpbnB1dHMsXG4gICAgICAgIHRyYW5zYWN0aW9uczogdGhpcy50cmFuc2FjdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAob25seVRyYW5zYWN0aW9uS2luZCkge1xuICAgICAgcmV0dXJuIGJ1aWxkZXIuc2VyKCdUcmFuc2FjdGlvbktpbmQnLCBraW5kLCB7IG1heFNpemU6IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgfSkudG9CeXRlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGlyYXRpb24gPSBvdmVycmlkZXM/LmV4cGlyYXRpb24gPz8gdGhpcy5leHBpcmF0aW9uO1xuICAgIGNvbnN0IHNlbmRlciA9IG92ZXJyaWRlcz8uc2VuZGVyID8/IHRoaXMuc2VuZGVyO1xuICAgIGNvbnN0IGdhc0NvbmZpZyA9IHsgLi4udGhpcy5nYXNDb25maWcsIC4uLm92ZXJyaWRlcz8uZ2FzQ29uZmlnIH07XG5cbiAgICBpZiAoIXNlbmRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHRyYW5zYWN0aW9uIHNlbmRlcicpO1xuICAgIH1cblxuICAgIGlmICghZ2FzQ29uZmlnLmJ1ZGdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdhcyBidWRnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWdhc0NvbmZpZy5wYXltZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2FzIHBheW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWdhc0NvbmZpZy5wcmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdhcyBwcmljZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uRGF0YSA9IHtcbiAgICAgIHNlbmRlcjogcHJlcGFyZVN1aUFkZHJlc3Moc2VuZGVyKSxcbiAgICAgIGV4cGlyYXRpb246IGV4cGlyYXRpb24gPyBleHBpcmF0aW9uIDogeyBOb25lOiB0cnVlIH0sXG4gICAgICBnYXNEYXRhOiB7XG4gICAgICAgIHBheW1lbnQ6IGdhc0NvbmZpZy5wYXltZW50LFxuICAgICAgICBvd25lcjogcHJlcGFyZVN1aUFkZHJlc3ModGhpcy5nYXNDb25maWcub3duZXIgPz8gc2VuZGVyKSxcbiAgICAgICAgcHJpY2U6IEJpZ0ludChnYXNDb25maWcucHJpY2UpLFxuICAgICAgICBidWRnZXQ6IEJpZ0ludChnYXNDb25maWcuYnVkZ2V0KSxcbiAgICAgIH0sXG4gICAgICBraW5kOiB7XG4gICAgICAgIFByb2dyYW1tYWJsZVRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgIHRyYW5zYWN0aW9uczogdGhpcy50cmFuc2FjdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYnVpbGRlci5zZXIoJ1RyYW5zYWN0aW9uRGF0YScsIHsgVjE6IHRyYW5zYWN0aW9uRGF0YSB9LCB7IG1heFNpemU6IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgfSkudG9CeXRlcygpO1xuICB9XG5cbiAgZ2V0RGlnZXN0KCkge1xuICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5idWlsZCh7IG9ubHlUcmFuc2FjdGlvbktpbmQ6IGZhbHNlIH0pO1xuICAgIHJldHVybiBUcmFuc2FjdGlvbkJsb2NrRGF0YUJ1aWxkZXIuZ2V0RGlnZXN0RnJvbUJ5dGVzKGJ5dGVzKTtcbiAgfVxuXG4gIHNuYXBzaG90KCk6IFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyIHtcbiAgICByZXR1cm4gY3JlYXRlKHRoaXMsIFNlcmlhbGl6ZWRUcmFuc2FjdGlvbkRhdGFCdWlsZGVyKTtcbiAgfVxufVxuIl19
|