@bitgo/sdk-coin-flrp 1.3.3 → 1.4.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/dist/src/flrp.d.ts +6 -75
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +13 -298
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +186 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +273 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +215 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +180 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +138 -281
- package/dist/src/lib/iface.d.ts +50 -51
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +22 -10
- package/dist/src/lib/index.d.ts +2 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -6
- package/dist/src/lib/keyPair.d.ts +1 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
- package/dist/src/lib/transaction.d.ts +8 -73
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +159 -210
- package/dist/src/lib/transactionBuilder.d.ts +56 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +113 -70
- package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +133 -74
- package/dist/src/lib/utils.d.ts +73 -151
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +197 -390
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +34 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
- package/dist/test/unit/lib/utils.js +29 -302
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -10
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -199
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -120
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/flrp.d.ts +0 -2
- package/dist/test/unit/flrp.d.ts.map +0 -1
- package/dist/test/unit/flrp.js +0 -118
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -1,318 +1,175 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.AtomicTransactionBuilder = void 0;
|
|
4
|
-
const
|
|
7
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
8
|
+
const transaction_1 = require("./transaction");
|
|
5
9
|
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*/
|
|
13
|
-
class AtomicTransactionBuilder {
|
|
14
|
-
constructor(coinConfig) {
|
|
15
|
-
this._utxos = [];
|
|
16
|
-
this.transaction = {
|
|
17
|
-
_network: {},
|
|
18
|
-
_networkID: constants_1.DEFAULT_NETWORK_ID,
|
|
19
|
-
_blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
20
|
-
_assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
21
|
-
_fromAddresses: [],
|
|
22
|
-
_to: [],
|
|
23
|
-
_locktime: constants_1.DEFAULT_LOCKTIME,
|
|
24
|
-
_threshold: constants_1.DEFAULT_THRESHOLD,
|
|
25
|
-
_fee: { fee: constants_1.AMOUNT_STRING_ZERO },
|
|
26
|
-
hasCredentials: false,
|
|
27
|
-
setTransaction: function (_tx) {
|
|
28
|
-
this._tx = _tx;
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
this._coinConfig = coinConfig;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Get the asset ID for Flare network transactions
|
|
35
|
-
* @returns Buffer containing the asset ID
|
|
36
|
-
*/
|
|
37
|
-
getAssetId() {
|
|
38
|
-
// Use the asset ID from transaction if already set
|
|
39
|
-
if (this.transaction._assetId && this.transaction._assetId.length > 0) {
|
|
40
|
-
return this.transaction._assetId;
|
|
41
|
-
}
|
|
42
|
-
// For native FLR transactions, return zero-filled buffer as placeholder
|
|
43
|
-
// In a real implementation, this would be obtained from the network configuration
|
|
44
|
-
// or FlareJS API to get the actual native asset ID
|
|
45
|
-
return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
|
|
46
|
-
}
|
|
47
|
-
validateAmount(amount) {
|
|
48
|
-
if (amount <= constants_1.ZERO_BIGINT) {
|
|
49
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
|
|
50
|
-
}
|
|
10
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
11
|
+
class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
12
|
+
constructor(_coinConfig) {
|
|
13
|
+
super(_coinConfig);
|
|
14
|
+
this.recoverSigner = false;
|
|
15
|
+
this.transaction = new transaction_1.Transaction(_coinConfig);
|
|
51
16
|
}
|
|
52
17
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @param
|
|
18
|
+
* Create inputs and outputs from UTXOs
|
|
19
|
+
* @param {bigint} amount Amount to transfer
|
|
20
|
+
* @return {
|
|
21
|
+
* inputs: TransferableInput[];
|
|
22
|
+
* outputs: TransferableInput[];
|
|
23
|
+
* credentials: Credential[];
|
|
24
|
+
* }
|
|
25
|
+
* @protected
|
|
55
26
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
27
|
+
createInputOutput(amount) {
|
|
28
|
+
const sender = this.transaction._fromAddresses.slice();
|
|
29
|
+
if (this.recoverSigner) {
|
|
30
|
+
// switch first and last signer
|
|
31
|
+
const tmp = sender.pop();
|
|
32
|
+
sender.push(sender[0]);
|
|
33
|
+
if (tmp) {
|
|
34
|
+
sender[0] = tmp;
|
|
63
35
|
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
|
|
68
|
-
* Based on AVAX P-chain implementation adapted for FlareJS.
|
|
69
|
-
*
|
|
70
|
-
* Note: This is a simplified implementation that creates the core structure.
|
|
71
|
-
* The FlareJS type system integration will be refined in future iterations.
|
|
72
|
-
*
|
|
73
|
-
* @param total - Total amount needed including fees
|
|
74
|
-
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
75
|
-
*/
|
|
76
|
-
createInputOutput(total) {
|
|
77
|
-
if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
|
|
78
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
|
|
79
36
|
}
|
|
37
|
+
let totalAmount = BigInt(0);
|
|
80
38
|
const inputs = [];
|
|
81
39
|
const outputs = [];
|
|
82
40
|
const credentials = [];
|
|
83
|
-
|
|
84
|
-
const addressIndices = {};
|
|
85
|
-
let nextAddressIndex = 0;
|
|
86
|
-
// Sort UTXOs by amount in descending order for optimal coin selection
|
|
87
|
-
const sortedUtxos = [...this._utxos].sort((a, b) => {
|
|
88
|
-
const amountA = BigInt(a.amount);
|
|
89
|
-
const amountB = BigInt(b.amount);
|
|
90
|
-
if (amountA > amountB)
|
|
91
|
-
return -1;
|
|
92
|
-
if (amountA < amountB)
|
|
93
|
-
return 1;
|
|
94
|
-
return 0;
|
|
95
|
-
});
|
|
96
|
-
// Process UTXOs to create inputs and credentials
|
|
97
|
-
for (const utxo of sortedUtxos) {
|
|
41
|
+
this.transaction._utxos.forEach((utxo) => {
|
|
98
42
|
const utxoAmount = BigInt(utxo.amount);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Create TransferableInput for atomic transactions
|
|
115
|
-
const transferableInput = {
|
|
116
|
-
txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
|
|
117
|
-
outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
|
|
118
|
-
assetID: this.getAssetId(),
|
|
119
|
-
input: {
|
|
120
|
-
amount: utxoAmount,
|
|
121
|
-
addressIndices: addressIndexArray,
|
|
122
|
-
threshold: utxo.threshold,
|
|
43
|
+
totalAmount += utxoAmount;
|
|
44
|
+
// Create input
|
|
45
|
+
const input = {
|
|
46
|
+
_type: flarejs_1.TypeSymbols.Input,
|
|
47
|
+
amount: () => utxoAmount,
|
|
48
|
+
sigIndices: sender.map((_, i) => i),
|
|
49
|
+
toBytes: () => new Uint8Array(),
|
|
50
|
+
};
|
|
51
|
+
// Create asset with Amounter interface
|
|
52
|
+
const assetId = {
|
|
53
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
54
|
+
amount: () => utxoAmount,
|
|
55
|
+
toBytes: () => {
|
|
56
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
57
|
+
return bytes;
|
|
123
58
|
},
|
|
124
59
|
};
|
|
125
|
-
//
|
|
60
|
+
// Create TransferableInput
|
|
61
|
+
const transferableInput = new flarejs_1.TransferableInput({
|
|
62
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
63
|
+
txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
|
|
64
|
+
outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
|
|
65
|
+
ID: () => utxo.txid,
|
|
66
|
+
toBytes: () => {
|
|
67
|
+
const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
|
|
68
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
69
|
+
new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
|
|
70
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
71
|
+
},
|
|
72
|
+
}, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
|
|
73
|
+
// Set input properties
|
|
74
|
+
Object.assign(transferableInput, { input });
|
|
126
75
|
inputs.push(transferableInput);
|
|
127
|
-
// Create credential
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
76
|
+
// Create empty credential for each input
|
|
77
|
+
const emptySignatures = sender.map(() => utils_1.default.createNewSig(''));
|
|
78
|
+
credentials.push(new flarejs_1.Credential(emptySignatures));
|
|
79
|
+
});
|
|
80
|
+
// Create output if there is change
|
|
81
|
+
if (totalAmount > amount) {
|
|
82
|
+
const changeAmount = totalAmount - amount;
|
|
83
|
+
const output = {
|
|
84
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
85
|
+
amount: () => changeAmount,
|
|
86
|
+
addresses: sender,
|
|
87
|
+
locktime: this.transaction._locktime,
|
|
88
|
+
threshold: this.transaction._threshold,
|
|
89
|
+
toBytes: () => new Uint8Array(),
|
|
90
|
+
};
|
|
91
|
+
// Create asset with Amounter interface
|
|
92
|
+
const assetId = {
|
|
93
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
94
|
+
amount: () => changeAmount,
|
|
95
|
+
toBytes: () => {
|
|
96
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
97
|
+
return bytes;
|
|
148
98
|
},
|
|
149
99
|
};
|
|
150
|
-
//
|
|
151
|
-
|
|
100
|
+
// Create TransferableOutput
|
|
101
|
+
const transferableOutput = new flarejs_1.TransferableInput({
|
|
102
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
103
|
+
txID: new flarejs_1.Id(new Uint8Array(32)),
|
|
104
|
+
outputIdx: new flarejs_1.Int(0),
|
|
105
|
+
ID: () => '',
|
|
106
|
+
toBytes: () => {
|
|
107
|
+
const txIdBytes = new Uint8Array(32);
|
|
108
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
109
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
110
|
+
},
|
|
111
|
+
}, new flarejs_1.Id(new Uint8Array([0])), assetId);
|
|
112
|
+
// Set output properties
|
|
113
|
+
Object.assign(transferableOutput, { output });
|
|
114
|
+
outputs.push(transferableOutput);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
inputs,
|
|
118
|
+
outputs,
|
|
119
|
+
credentials,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** @inheritdoc */
|
|
123
|
+
async buildImplementation() {
|
|
124
|
+
this.buildFlareTransaction();
|
|
125
|
+
this.setTransactionType(this.transactionType);
|
|
126
|
+
if (this.hasSigner()) {
|
|
127
|
+
// Sign sequentially to ensure proper order
|
|
128
|
+
for (const keyPair of this._signer) {
|
|
129
|
+
await this.transaction.sign(keyPair);
|
|
130
|
+
}
|
|
152
131
|
}
|
|
153
|
-
return
|
|
132
|
+
return this.transaction;
|
|
154
133
|
}
|
|
155
134
|
/**
|
|
156
|
-
*
|
|
135
|
+
* Fee is fix for AVM atomic tx.
|
|
157
136
|
*
|
|
158
|
-
* @
|
|
159
|
-
* @
|
|
137
|
+
* @returns network.txFee
|
|
138
|
+
* @protected
|
|
160
139
|
*/
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
return this;
|
|
140
|
+
get fixedFee() {
|
|
141
|
+
return this.transaction._network.txFee;
|
|
164
142
|
}
|
|
165
143
|
/**
|
|
166
|
-
*
|
|
167
|
-
* Creates a credential with the provided signatures
|
|
144
|
+
* Set the transaction type
|
|
168
145
|
*
|
|
169
|
-
* @param
|
|
170
|
-
* @param signatures - Array of signature hex strings or empty strings for placeholders
|
|
171
|
-
* @returns Credential instance
|
|
146
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
172
147
|
*/
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
|
|
176
|
-
}
|
|
177
|
-
if (signatures.length === constants_1.ZERO_NUMBER) {
|
|
178
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
|
|
179
|
-
}
|
|
180
|
-
const sigs = signatures.map((sig, index) => {
|
|
181
|
-
// Handle empty/placeholder signatures
|
|
182
|
-
if (!sig || sig.length === 0) {
|
|
183
|
-
return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
|
|
184
|
-
}
|
|
185
|
-
// Validate hex string format
|
|
186
|
-
const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
|
|
187
|
-
if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
|
|
188
|
-
throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
|
|
189
|
-
}
|
|
190
|
-
// Convert to buffer and validate length
|
|
191
|
-
const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
|
|
192
|
-
if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
|
|
193
|
-
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
|
|
194
|
-
}
|
|
195
|
-
// Create fixed-length buffer and copy signature data
|
|
196
|
-
const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
|
|
197
|
-
sigBuffer.copy(fixedLengthBuffer);
|
|
198
|
-
try {
|
|
199
|
-
return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
try {
|
|
206
|
-
return new flarejs_1.Credential(sigs);
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
210
|
-
}
|
|
148
|
+
setTransactionType(transactionType) {
|
|
149
|
+
this.transaction._type = transactionType;
|
|
211
150
|
}
|
|
212
151
|
/**
|
|
213
|
-
*
|
|
152
|
+
* The internal chain is the one set for the coin in coinConfig.network. The external chain is the other chain involved.
|
|
153
|
+
* The external chain id is the source on import and the destination on export.
|
|
154
|
+
*
|
|
155
|
+
* @param {string} chainId - id of the external chain
|
|
214
156
|
*/
|
|
215
|
-
|
|
157
|
+
externalChainId(chainId) {
|
|
158
|
+
const newTargetChainId = typeof chainId === 'string' ? utils_1.default.cb58Decode(chainId) : Buffer.from(chainId);
|
|
159
|
+
this.validateChainId(newTargetChainId);
|
|
160
|
+
this._externalChainId = newTargetChainId;
|
|
216
161
|
return this;
|
|
217
162
|
}
|
|
218
163
|
/**
|
|
219
|
-
*
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
// FlareJS signing implementation with atomic transaction support
|
|
223
|
-
try {
|
|
224
|
-
// Validate private key format (placeholder implementation)
|
|
225
|
-
if (!params.key || params.key.length < constants_1.PRIVATE_KEY_HEX_LENGTH) {
|
|
226
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
|
|
227
|
-
}
|
|
228
|
-
// Create signature structure
|
|
229
|
-
const signature = {
|
|
230
|
-
privateKey: params.key,
|
|
231
|
-
signingMethod: constants_1.SIGNING_METHOD,
|
|
232
|
-
};
|
|
233
|
-
// Store signature for FlareJS compatibility
|
|
234
|
-
this.transaction._signature = signature;
|
|
235
|
-
this.transaction.hasCredentials = true;
|
|
236
|
-
return this;
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Build the transaction using FlareJS compatibility
|
|
244
|
-
*/
|
|
245
|
-
async build() {
|
|
246
|
-
// FlareJS UnsignedTx creation with atomic transaction support
|
|
247
|
-
try {
|
|
248
|
-
// Validate transaction requirements
|
|
249
|
-
if (!this._utxos || this._utxos.length === 0) {
|
|
250
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
|
|
251
|
-
}
|
|
252
|
-
// Create FlareJS transaction structure with atomic support
|
|
253
|
-
const transaction = {
|
|
254
|
-
_id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
255
|
-
_inputs: [],
|
|
256
|
-
_outputs: [],
|
|
257
|
-
_type: this.transactionType,
|
|
258
|
-
signature: [],
|
|
259
|
-
fromAddresses: this.transaction._fromAddresses,
|
|
260
|
-
validationErrors: [],
|
|
261
|
-
// FlareJS methods with atomic support
|
|
262
|
-
toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
263
|
-
toJson: () => ({
|
|
264
|
-
type: this.transactionType,
|
|
265
|
-
}),
|
|
266
|
-
explainTransaction: () => ({
|
|
267
|
-
type: this.transactionType,
|
|
268
|
-
inputs: [],
|
|
269
|
-
outputs: [],
|
|
270
|
-
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
271
|
-
rewardAddresses: [],
|
|
272
|
-
id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
273
|
-
changeOutputs: [],
|
|
274
|
-
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
275
|
-
fee: { fee: this.transaction._fee.fee },
|
|
276
|
-
}),
|
|
277
|
-
isTransactionForCChain: false,
|
|
278
|
-
loadInputsAndOutputs: () => {
|
|
279
|
-
/* FlareJS atomic transaction loading */
|
|
280
|
-
},
|
|
281
|
-
inputs: () => [],
|
|
282
|
-
outputs: () => [],
|
|
283
|
-
fee: () => ({ fee: this.transaction._fee.fee }),
|
|
284
|
-
feeRate: () => 0,
|
|
285
|
-
id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
286
|
-
type: this.transactionType,
|
|
287
|
-
};
|
|
288
|
-
return transaction;
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Parse and explain a transaction from hex using FlareJS compatibility
|
|
164
|
+
* Set the transaction fee
|
|
165
|
+
*
|
|
166
|
+
* @param {string | bigint} feeValue - the fee value
|
|
296
167
|
*/
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
type: this.transactionType,
|
|
302
|
-
inputs: [],
|
|
303
|
-
outputs: [],
|
|
304
|
-
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
305
|
-
rewardAddresses: [],
|
|
306
|
-
id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
|
|
307
|
-
changeOutputs: [],
|
|
308
|
-
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
309
|
-
fee: { fee: this.transaction._fee.fee },
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
catch (error) {
|
|
313
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
314
|
-
}
|
|
168
|
+
fee(feeValue) {
|
|
169
|
+
const fee = typeof feeValue === 'string' ? feeValue : feeValue.toString();
|
|
170
|
+
this.transaction._fee.fee = fee;
|
|
171
|
+
return this;
|
|
315
172
|
}
|
|
316
173
|
}
|
|
317
174
|
exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOENBQTBGO0FBQzFGLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUsIEJhc2VUcmFuc2FjdGlvbiB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBDcmVkZW50aWFsLCBTaWduYXR1cmUsIFRyYW5zZmVyYWJsZUlucHV0LCBUcmFuc2ZlcmFibGVPdXRwdXQgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIEFTU0VUX0lEX0xFTkdUSCxcbiAgVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCxcbiAgUFJJVkFURV9LRVlfSEVYX0xFTkdUSCxcbiAgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX1BSRUZJWCxcbiAgREVGQVVMVF9ORVRXT1JLX0lELFxuICBFTVBUWV9CVUZGRVJfU0laRSxcbiAgSEVYX1BSRUZJWCxcbiAgSEVYX1BSRUZJWF9MRU5HVEgsXG4gIERFQ0lNQUxfUkFESVgsXG4gIFNJR05JTkdfTUVUSE9ELFxuICBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gIERFRkFVTFRfTE9DS1RJTUUsXG4gIERFRkFVTFRfVEhSRVNIT0xELFxuICBaRVJPX0JJR0lOVCxcbiAgWkVST19OVU1CRVIsXG4gIEVSUk9SX0FNT1VOVF9QT1NJVElWRSxcbiAgRVJST1JfQ1JFREVOVElBTFNfQVJSQVksXG4gIEVSUk9SX1VUWE9TX1JFUVVJUkVELFxuICBFUlJPUl9TSUdOQVRVUkVTX0FSUkFZLFxuICBFUlJPUl9TSUdOQVRVUkVTX0VNUFRZLFxuICBFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMRCxcbiAgRVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVELFxuICBFUlJPUl9FTkhBTkNFRF9QQVJTRV9GQUlMRUQsXG4gIEVSUk9SX0ZMQVJFSlNfU0lHTklOR19GQUlMRUQsXG4gIEVSUk9SX0NSRUFURV9DUkVERU5USUFMX0ZBSUxFRCxcbiAgRVJST1JfVU5LTk9XTixcbiAgRkxBUkVfQVRPTUlDX1BSRUZJWCxcbiAgRkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVgsXG4gIEhFWF9FTkNPRElORyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY3JlYXRlRmxleGlibGVIZXhSZWdleCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZsYXJlIFAtY2hhaW4gYXRvbWljIHRyYW5zYWN0aW9uIGJ1aWxkZXIgd2l0aCBGbGFyZUpTIGNyZWRlbnRpYWwgc3VwcG9ydC5cbiAqIFRoaXMgcHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIGJ1aWxkaW5nIEZsYXJlIFAtY2hhaW4gdHJhbnNhY3Rpb25zIHdpdGggcHJvcGVyXG4gKiBjcmVkZW50aWFsIGhhbmRsaW5nIHVzaW5nIEZsYXJlSlMgQ3JlZGVudGlhbCBhbmQgU2lnbmF0dXJlIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+O1xuICAvLyBFeHRlcm5hbCBjaGFpbiBpZCAoZGVzdGluYXRpb24pIGZvciBleHBvcnQgdHJhbnNhY3Rpb25zXG4gIHByb3RlY3RlZCBfZXh0ZXJuYWxDaGFpbklkOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCB0cmFuc2FjdGlvbjoge1xuICAgIF9uZXR3b3JrOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBfbmV0d29ya0lEOiBudW1iZXI7XG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyO1xuICAgIF9hc3NldElkOiBCdWZmZXI7XG4gICAgX2Zyb21BZGRyZXNzZXM6IHN0cmluZ1tdO1xuICAgIF90bzogc3RyaW5nW107XG4gICAgX2xvY2t0aW1lOiBiaWdpbnQ7XG4gICAgX3RocmVzaG9sZDogbnVtYmVyO1xuICAgIF9mZWU6IHsgZmVlOiBzdHJpbmc7IGZlZVJhdGU/OiBzdHJpbmc7IHNpemU/OiBudW1iZXIgfTtcbiAgICBoYXNDcmVkZW50aWFsczogYm9vbGVhbjtcbiAgICBfdHg/OiB1bmtub3duO1xuICAgIF9zaWduYXR1cmU/OiB1bmtub3duO1xuICAgIHNldFRyYW5zYWN0aW9uOiAodHg6IHVua25vd24pID0+IHZvaWQ7XG4gIH0gPSB7XG4gICAgX25ldHdvcms6IHt9LFxuICAgIF9uZXR3b3JrSUQ6IERFRkFVTFRfTkVUV09SS19JRCxcbiAgICBfYmxvY2tjaGFpbklEOiBCdWZmZXIuYWxsb2MoRU1QVFlfQlVGRkVSX1NJWkUpLFxuICAgIF9hc3NldElkOiBCdWZmZXIuYWxsb2MoRU1QVFlfQlVGRkVSX1NJWkUpLFxuICAgIF9mcm9tQWRkcmVzc2VzOiBbXSxcbiAgICBfdG86IFtdLFxuICAgIF9sb2NrdGltZTogREVGQVVMVF9MT0NLVElNRSxcbiAgICBfdGhyZXNob2xkOiBERUZBVUxUX1RIUkVTSE9MRCxcbiAgICBfZmVlOiB7IGZlZTogQU1PVU5UX1NUUklOR19aRVJPIH0sXG4gICAgaGFzQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHNldFRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoX3R4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLl90eCA9IF90eDtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXNzZXQgSUQgZm9yIEZsYXJlIG5ldHdvcmsgdHJhbnNhY3Rpb25zXG4gICAqIEByZXR1cm5zIEJ1ZmZlciBjb250YWluaW5nIHRoZSBhc3NldCBJRFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzc2V0SWQoKTogQnVmZmVyIHtcbiAgICAvLyBVc2UgdGhlIGFzc2V0IElEIGZyb20gdHJhbnNhY3Rpb24gaWYgYWxyZWFkeSBzZXRcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCAmJiB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkO1xuICAgIH1cblxuICAgIC8vIEZvciBuYXRpdmUgRkxSIHRyYW5zYWN0aW9ucywgcmV0dXJuIHplcm8tZmlsbGVkIGJ1ZmZlciBhcyBwbGFjZWhvbGRlclxuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBvciBGbGFyZUpTIEFQSSB0byBnZXQgdGhlIGFjdHVhbCBuYXRpdmUgYXNzZXQgSURcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCk7XG4gIH1cblxuICB2YWxpZGF0ZUFtb3VudChhbW91bnQ6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChhbW91bnQgPD0gWkVST19CSUdJTlQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQU1PVU5UX1BPU0lUSVZFKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgY3JlZGVudGlhbHMgYXJyYXkgaXMgcHJvcGVybHkgZm9ybWVkXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyAtIEFycmF5IG9mIGNyZWRlbnRpYWxzIHRvIHZhbGlkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVDcmVkZW50aWFscyhjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdKTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNyZWRlbnRpYWxzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9DUkVERU5USUFMU19BUlJBWSk7XG4gICAgfVxuXG4gICAgY3JlZGVudGlhbHMuZm9yRWFjaCgoY3JlZGVudGlhbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBDcmVkZW50aWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGNyZWRlbnRpYWwgYXQgaW5kZXggJHtpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGlucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzIGZvciBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbnMuXG4gICAqIEJhc2VkIG9uIEFWQVggUC1jaGFpbiBpbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZvciBGbGFyZUpTLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIGNvcmUgc3RydWN0dXJlLlxuICAgKiBUaGUgRmxhcmVKUyB0eXBlIHN5c3RlbSBpbnRlZ3JhdGlvbiB3aWxsIGJlIHJlZmluZWQgaW4gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbCAtIFRvdGFsIGFtb3VudCBuZWVkZWQgaW5jbHVkaW5nIGZlZXNcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgVHJhbnNmZXJhYmxlSW5wdXRbXSwgVHJhbnNmZXJhYmxlT3V0cHV0W10sIGFuZCBDcmVkZW50aWFsW11cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuX3V0eG9zIHx8IHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gWkVST19OVU1CRVIpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRUQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgbGV0IGlucHV0U3VtID0gMG47XG4gICAgY29uc3QgYWRkcmVzc0luZGljZXM6IHsgW2FkZHJlc3M6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgbGV0IG5leHRBZGRyZXNzSW5kZXggPSAwO1xuXG4gICAgLy8gU29ydCBVVFhPcyBieSBhbW91bnQgaW4gZGVzY2VuZGluZyBvcmRlciBmb3Igb3B0aW1hbCBjb2luIHNlbGVjdGlvblxuICAgIGNvbnN0IHNvcnRlZFV0eG9zID0gWy4uLnRoaXMuX3V0eG9zXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhbW91bnRBID0gQmlnSW50KGEuYW1vdW50KTtcbiAgICAgIGNvbnN0IGFtb3VudEIgPSBCaWdJbnQoYi5hbW91bnQpO1xuICAgICAgaWYgKGFtb3VudEEgPiBhbW91bnRCKSByZXR1cm4gLTE7XG4gICAgICBpZiAoYW1vdW50QSA8IGFtb3VudEIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICAvLyBQcm9jZXNzIFVUWE9zIHRvIGNyZWF0ZSBpbnB1dHMgYW5kIGNyZWRlbnRpYWxzXG4gICAgZm9yIChjb25zdCB1dHhvIG9mIHNvcnRlZFV0eG9zKSB7XG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcblxuICAgICAgaWYgKGlucHV0U3VtID49IHRvdGFsKSB7XG4gICAgICAgIGJyZWFrOyAvLyBXZSBoYXZlIGVub3VnaCBpbnB1dHNcbiAgICAgIH1cblxuICAgICAgLy8gVHJhY2sgaW5wdXQgc3VtXG4gICAgICBpbnB1dFN1bSArPSB1dHhvQW1vdW50O1xuXG4gICAgICAvLyBUcmFjayBhZGRyZXNzIGluZGljZXMgZm9yIHNpZ25hdHVyZSBvcmRlcmluZyAobWltaWNzIEFWQVggcGF0dGVybilcbiAgICAgIGNvbnN0IGFkZHJlc3NJbmRleEFycmF5OiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHV0eG8uYWRkcmVzc2VzKSB7XG4gICAgICAgIGlmICghKGFkZHJlc3MgaW4gYWRkcmVzc0luZGljZXMpKSB7XG4gICAgICAgICAgYWRkcmVzc0luZGljZXNbYWRkcmVzc10gPSBuZXh0QWRkcmVzc0luZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzc0luZGV4QXJyYXkucHVzaChhZGRyZXNzSW5kaWNlc1thZGRyZXNzXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIGFkZHJlc3MgaW5kaWNlcyBvbiB0aGUgVVRYTyBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAgdXR4by5hZGRyZXNzZXNJbmRleCA9IGFkZHJlc3NJbmRleEFycmF5O1xuXG4gICAgICAvLyBDcmVhdGUgVHJhbnNmZXJhYmxlSW5wdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0ID0ge1xuICAgICAgICB0eElEOiBCdWZmZXIuZnJvbSh1dHhvLnR4aWQgfHwgQU1PVU5UX1NUUklOR19aRVJPLnJlcGVhdChUUkFOU0FDVElPTl9JRF9IRVhfTEVOR1RIKSwgSEVYX0VOQ09ESU5HKSxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHBhcnNlSW50KHV0eG8ub3V0cHV0aWR4IHx8IEFNT1VOVF9TVFJJTkdfWkVSTywgREVDSU1BTF9SQURJWCksXG4gICAgICAgIGFzc2V0SUQ6IHRoaXMuZ2V0QXNzZXRJZCgpLFxuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGFtb3VudDogdXR4b0Ftb3VudCxcbiAgICAgICAgICBhZGRyZXNzSW5kaWNlczogYWRkcmVzc0luZGV4QXJyYXksXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBpbnB1dCAodHlwZSBhc3NlcnRpb24gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBwbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZXNlIHdvdWxkIGJlIGFjdHVhbCBzaWduYXR1cmVzXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gJycpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHRoaXMuY3JlYXRlRmxhcmVDcmVkZW50aWFsKDAsIHNpZ25hdHVyZXMpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChjcmVkZW50aWFsKTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgd2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgaWYgKGlucHV0U3VtIDwgdG90YWwpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEluc3VmZmljaWVudCBmdW5kczogbmVlZCAke3RvdGFsfSwgaGF2ZSAke2lucHV0U3VtfWApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjaGFuZ2Ugb3V0cHV0IGlmIHdlIGhhdmUgZXhjZXNzIGlucHV0IGFtb3VudFxuICAgIGlmIChpbnB1dFN1bSA+IHRvdGFsKSB7XG4gICAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBpbnB1dFN1bSAtIHRvdGFsO1xuXG4gICAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBmb3IgYXRvbWljIHRyYW5zYWN0aW9uc1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0ge1xuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLFxuICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICBsb2NrdGltZTogMG4sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdGhlIGNoYW5nZSBvdXRwdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgb3V0cHV0cy5wdXNoKGNoYW5nZU91dHB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBjcmVkZW50aWFscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBVVFhPcyBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBjcmVhdGluZyBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAqXG4gICAqIEBwYXJhbSB1dHhvcyAtIEFycmF5IG9mIGRlY29kZWQgVVRYTyBvYmplY3RzXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHV0eG9zKHV0eG9zOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgdGhpcy5fdXR4b3MgPSB1dHhvcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFyZSBlcXVpdmFsZW50IG9mIEF2YWxhbmNoZSdzIFNlbGVjdENyZWRlbnRpYWxDbGFzc1xuICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCB3aXRoIHRoZSBwcm92aWRlZCBzaWduYXR1cmVzXG4gICAqXG4gICAqIEBwYXJhbSBjcmVkZW50aWFsSWQgLSBUaGUgY3JlZGVudGlhbCBJRCAobm90IHVzZWQgaW4gRmxhcmVKUyBidXQga2VwdCBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICogQHBhcmFtIHNpZ25hdHVyZXMgLSBBcnJheSBvZiBzaWduYXR1cmUgaGV4IHN0cmluZ3Mgb3IgZW1wdHkgc3RyaW5ncyBmb3IgcGxhY2Vob2xkZXJzXG4gICAqIEByZXR1cm5zIENyZWRlbnRpYWwgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVGbGFyZUNyZWRlbnRpYWwoX2NyZWRlbnRpYWxJZDogbnVtYmVyLCBzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENyZWRlbnRpYWwge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaWduYXR1cmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0FSUkFZKTtcbiAgICB9XG5cbiAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1NJR05BVFVSRVNfRU1QVFkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ3MgPSBzaWduYXR1cmVzLm1hcCgoc2lnLCBpbmRleCkgPT4ge1xuICAgICAgLy8gSGFuZGxlIGVtcHR5L3BsYWNlaG9sZGVyIHNpZ25hdHVyZXNcbiAgICAgIGlmICghc2lnIHx8IHNpZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgaGV4IHN0cmluZyBmb3JtYXRcbiAgICAgIGNvbnN0IGNsZWFuU2lnID0gc2lnLnN0YXJ0c1dpdGgoSEVYX1BSRUZJWCkgPyBzaWcuc2xpY2UoSEVYX1BSRUZJWF9MRU5HVEgpIDogc2lnO1xuICAgICAgaWYgKCFjcmVhdGVGbGV4aWJsZUhleFJlZ2V4KCkudGVzdChjbGVhblNpZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBoZXggc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiBjb250YWlucyBub24taGV4IGNoYXJhY3RlcnNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCB0byBidWZmZXIgYW5kIHZhbGlkYXRlIGxlbmd0aFxuICAgICAgY29uc3Qgc2lnQnVmZmVyID0gQnVmZmVyLmZyb20oY2xlYW5TaWcsIEhFWF9FTkNPRElORyk7XG4gICAgICBpZiAoc2lnQnVmZmVyLmxlbmd0aCA+IFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYFNpZ25hdHVyZSB0b28gbG9uZyBhdCBpbmRleCAke2luZGV4fTogJHtzaWdCdWZmZXIubGVuZ3RofSBieXRlcyAobWF4ICR7U0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEh9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGZpeGVkLWxlbmd0aCBidWZmZXIgYW5kIGNvcHkgc2lnbmF0dXJlIGRhdGFcbiAgICAgIGNvbnN0IGZpeGVkTGVuZ3RoQnVmZmVyID0gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKTtcbiAgICAgIHNpZ0J1ZmZlci5jb3B5KGZpeGVkTGVuZ3RoQnVmZmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUobmV3IFVpbnQ4QXJyYXkoZml4ZWRMZW5ndGhCdWZmZXIpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgc2lnbmF0dXJlIGF0IGluZGV4ICR7aW5kZXh9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBDcmVkZW50aWFsKHNpZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCYXNlIGluaXRCdWlsZGVyIHVzZWQgYnkgY29uY3JldGUgYnVpbGRlcnMuIEZvciBub3cganVzdCByZXR1cm5zIHRoaXMgc28gZmx1ZW50IEFQSSB3b3Jrcy5cbiAgICovXG4gIGluaXRCdWlsZGVyKF90eDogdW5rbm93bik6IHRoaXMge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdHJhbnNhY3Rpb24gd2l0aCBwcml2YXRlIGtleSB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIHNpZ24ocGFyYW1zOiB7IGtleTogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICAvLyBGbGFyZUpTIHNpZ25pbmcgaW1wbGVtZW50YXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBwcml2YXRlIGtleSBmb3JtYXQgKHBsYWNlaG9sZGVyIGltcGxlbWVudGF0aW9uKVxuICAgICAgaWYgKCFwYXJhbXMua2V5IHx8IHBhcmFtcy5rZXkubGVuZ3RoIDwgUFJJVkFURV9LRVlfSEVYX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0lOVkFMSURfUFJJVkFURV9LRVkpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgc2lnbmF0dXJlIHN0cnVjdHVyZVxuICAgICAgY29uc3Qgc2lnbmF0dXJlID0ge1xuICAgICAgICBwcml2YXRlS2V5OiBwYXJhbXMua2V5LFxuICAgICAgICBzaWduaW5nTWV0aG9kOiBTSUdOSU5HX01FVEhPRCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHNpZ25hdHVyZSBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGAke0VSUk9SX0ZMQVJFSlNfU0lHTklOR19GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBhc3luYyBidWlsZCgpOiBQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj4ge1xuICAgIC8vIEZsYXJlSlMgVW5zaWduZWRUeCBjcmVhdGlvbiB3aXRoIGF0b21pYyB0cmFuc2FjdGlvbiBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRyYW5zYWN0aW9uIHJlcXVpcmVtZW50c1xuICAgICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMRCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBGbGFyZUpTIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSB3aXRoIGF0b21pYyBzdXBwb3J0XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHtcbiAgICAgICAgX2lkOiBgJHtUUkFOU0FDVElPTl9JRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIF9pbnB1dHM6IFtdLFxuICAgICAgICBfb3V0cHV0czogW10sXG4gICAgICAgIF90eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgc2lnbmF0dXJlOiBbXSBhcyBzdHJpbmdbXSxcblxuICAgICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBbXSxcblxuICAgICAgICAvLyBGbGFyZUpTIG1ldGhvZHMgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgICB0b0Jyb2FkY2FzdEZvcm1hdDogKCkgPT4gYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0b0pzb246ICgpID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIGV4cGxhaW5UcmFuc2FjdGlvbjogKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPT4gKHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgICAgaWQ6IGAke0ZMQVJFX0FUT01JQ19QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgICAgY2hhbmdlQW1vdW50OiBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gICAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgICB9KSxcblxuICAgICAgICBpc1RyYW5zYWN0aW9uRm9yQ0NoYWluOiBmYWxzZSxcbiAgICAgICAgbG9hZElucHV0c0FuZE91dHB1dHM6ICgpID0+IHtcbiAgICAgICAgICAvKiBGbGFyZUpTIGF0b21pYyB0cmFuc2FjdGlvbiBsb2FkaW5nICovXG4gICAgICAgIH0sXG4gICAgICAgIGlucHV0czogKCkgPT4gW10sXG4gICAgICAgIG91dHB1dHM6ICgpID0+IFtdLFxuICAgICAgICBmZWU6ICgpID0+ICh7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9KSxcbiAgICAgICAgZmVlUmF0ZTogKCkgPT4gMCxcbiAgICAgICAgaWQ6ICgpID0+IGAke0ZMQVJFX0FUT01JQ19QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIEJhc2VUcmFuc2FjdGlvbjtcblxuICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9FTkhBTkNFRF9CVUlMRF9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbmQgZXhwbGFpbiBhIHRyYW5zYWN0aW9uIGZyb20gaGV4IHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIC8vIEZsYXJlSlMgdHJhbnNhY3Rpb24gcGFyc2luZyB3aXRoIGF0b21pYyBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogW10sXG4gICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUEFSU0VEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICBmZWU6IHsgZmVlOiB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlIH0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9FTkhBTkNFRF9QQVJTRV9GQUlMRUR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogRVJST1JfVU5LTk9XTn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFBNEY7QUFFNUYsb0RBQTRCO0FBUzVCLE1BQXNCLHdCQUF5QixTQUFRLHVDQUFrQjtJQUl2RSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUhYLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxpQkFBaUIsQ0FBQyxNQUFjO1FBS3hDLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxXQUEyQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4RSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QiwrQkFBK0I7WUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFdBQVcsR0FBaUIsRUFBRSxDQUFDO1FBRXBDLElBQUksQ0FBQyxXQUEyQixDQUFDLE1BQU0sQ0FB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QUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsT0FBd0I7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLFFBQXlCO1FBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLFdBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUF6TUQsNERBeU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQsIEludCwgSWQsIFR5cGVTeW1ib2xzLCBDcmVkZW50aWFsIH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8vIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiBwcm92aWRlIGFuIGFtb3VudFxuaW50ZXJmYWNlIEFtb3VudGVyIHtcbiAgX3R5cGU6IFR5cGVTeW1ib2xzO1xuICBhbW91bnQ6ICgpID0+IGJpZ2ludDtcbiAgdG9CeXRlczogKCkgPT4gVWludDhBcnJheTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfZXh0ZXJuYWxDaGFpbklkOiBCdWZmZXI7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgYW5kIG91dHB1dHMgZnJvbSBVVFhPc1xuICAgKiBAcGFyYW0ge2JpZ2ludH0gYW1vdW50IEFtb3VudCB0byB0cmFuc2ZlclxuICAgKiBAcmV0dXJuIHtcbiAgICogICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICogICAgIG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgKiB9XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dChhbW91bnQ6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG5cbiAgICAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX3V0eG9zLmZvckVhY2goKHV0eG86IERlY29kZWRVdHhvT2JqKSA9PiB7XG4gICAgICBjb25zdCB1dHhvQW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsQW1vdW50ICs9IHV0eG9BbW91bnQ7XG5cbiAgICAgIC8vIENyZWF0ZSBpbnB1dFxuICAgICAgY29uc3QgaW5wdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5JbnB1dCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzOiBzZW5kZXIubWFwKChfLCBpKSA9PiBpKSxcbiAgICAgICAgdG9CeXRlczogKCkgPT4gbmV3IFVpbnQ4QXJyYXkoKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBhc3NldCB3aXRoIEFtb3VudGVyIGludGVyZmFjZVxuICAgICAgY29uc3QgYXNzZXRJZDogQW1vdW50ZXIgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gdXR4b0Ftb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVJbnB1dFxuICAgICAgY29uc3QgdHJhbnNmZXJhYmxlSW5wdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1dHhvLnR4aWQsICdoZXgnKSkpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludChOdW1iZXIodXR4by5vdXRwdXRpZHgpKSxcbiAgICAgICAgICBJRDogKCkgPT4gdXR4by50eGlkLFxuICAgICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR4SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dElkeEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICBuZXcgRGF0YVZpZXcob3V0cHV0SWR4Qnl0ZXMuYnVmZmVyKS5zZXRJbnQzMigwLCBOdW1iZXIodXR4by5vdXRwdXRpZHgpLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8ub3V0cHV0aWR4LnRvU3RyaW5nKCkpKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBpbnB1dCBwcm9wZXJ0aWVzXG4gICAgICBPYmplY3QuYXNzaWduKHRyYW5zZmVyYWJsZUlucHV0LCB7IGlucHV0IH0pO1xuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW1wdHkgY3JlZGVudGlhbCBmb3IgZWFjaCBpbnB1dFxuICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2VuZGVyLm1hcCgoKSA9PiB1dGlscy5jcmVhdGVOZXdTaWcoJycpKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2gobmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKSk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgb3V0cHV0IGlmIHRoZXJlIGlzIGNoYW5nZVxuICAgIGlmICh0b3RhbEFtb3VudCA+IGFtb3VudCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdG90YWxBbW91bnQgLSBhbW91bnQ7XG4gICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5CYXNlVHgsXG4gICAgICAgIGFtb3VudDogKCkgPT4gY2hhbmdlQW1vdW50LFxuICAgICAgICBhZGRyZXNzZXM6IHNlbmRlcixcbiAgICAgICAgbG9ja3RpbWU6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fbG9ja3RpbWUsXG4gICAgICAgIHRocmVzaG9sZDogKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl90aHJlc2hvbGQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IG5ldyBVaW50OEFycmF5KCksXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgYXNzZXQgd2l0aCBBbW91bnRlciBpbnRlcmZhY2VcbiAgICAgIGNvbnN0IGFzc2V0SWQ6IEFtb3VudGVyID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9hc3NldElkLCAnaGV4JykpO1xuICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBUcmFuc2ZlcmFibGVPdXRwdXRcbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZU91dHB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KDMyKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KDApLFxuICAgICAgICAgIElEOiAoKSA9PiAnJyxcbiAgICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eElkQnl0ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJZHhCeXRlcyA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoWzBdKSksXG4gICAgICAgIGFzc2V0SWRcbiAgICAgICk7XG5cbiAgICAgIC8vIFNldCBvdXRwdXQgcHJvcGVydGllc1xuICAgICAgT2JqZWN0LmFzc2lnbih0cmFuc2ZlcmFibGVPdXRwdXQsIHsgb3V0cHV0IH0pO1xuICAgICAgb3V0cHV0cy5wdXNoKHRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgLy8gU2lnbiBzZXF1ZW50aWFsbHkgdG8gZW5zdXJlIHByb3BlciBvcmRlclxuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgYXZheCB0cmFuc2FjdGlvbi4gdHJhbnNhY3Rpb24gZmllbGQgaXMgY2hhbmdlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEZlZSBpcyBmaXggZm9yIEFWTSBhdG9taWMgdHguXG4gICAqXG4gICAqIEByZXR1cm5zIG5ldHdvcmsudHhGZWVcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmaXhlZEZlZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLnR4RmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgY2hhaW4gaXMgdGhlIG9uZSBzZXQgZm9yIHRoZSBjb2luIGluIGNvaW5Db25maWcubmV0d29yay4gVGhlIGV4dGVybmFsIGNoYWluIGlzIHRoZSBvdGhlciBjaGFpbiBpbnZvbHZlZC5cbiAgICogVGhlIGV4dGVybmFsIGNoYWluIGlkIGlzIHRoZSBzb3VyY2Ugb24gaW1wb3J0IGFuZCB0aGUgZGVzdGluYXRpb24gb24gZXhwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhaW5JZCAtIGlkIG9mIHRoZSBleHRlcm5hbCBjaGFpblxuICAgKi9cbiAgZXh0ZXJuYWxDaGFpbklkKGNoYWluSWQ6IHN0cmluZyB8IEJ1ZmZlcik6IHRoaXMge1xuICAgIGNvbnN0IG5ld1RhcmdldENoYWluSWQgPSB0eXBlb2YgY2hhaW5JZCA9PT0gJ3N0cmluZycgPyB1dGlscy5jYjU4RGVjb2RlKGNoYWluSWQpIDogQnVmZmVyLmZyb20oY2hhaW5JZCk7XG4gICAgdGhpcy52YWxpZGF0ZUNoYWluSWQobmV3VGFyZ2V0Q2hhaW5JZCk7XG4gICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gbmV3VGFyZ2V0Q2hhaW5JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGZlZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IGJpZ2ludH0gZmVlVmFsdWUgLSB0aGUgZmVlIHZhbHVlXG4gICAqL1xuICBmZWUoZmVlVmFsdWU6IHN0cmluZyB8IGJpZ2ludCk6IHRoaXMge1xuICAgIGNvbnN0IGZlZSA9IHR5cGVvZiBmZWVWYWx1ZSA9PT0gJ3N0cmluZycgPyBmZWVWYWx1ZSA6IGZlZVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb24pLl9mZWUuZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=
|