@bitgo-beta/unspents 0.13.2-beta.9 → 0.13.2-beta.900

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.mocharc.js +1 -1
  2. package/CHANGELOG.md +541 -0
  3. package/bin/generate_tables.ts +94 -0
  4. package/dist/bin/generate_tables.d.ts +2 -0
  5. package/dist/bin/generate_tables.d.ts.map +1 -0
  6. package/dist/bin/generate_tables.js +107 -0
  7. package/dist/{codes.d.ts → src/codes.d.ts} +11 -10
  8. package/dist/src/codes.d.ts.map +1 -0
  9. package/dist/src/codes.js +182 -0
  10. package/dist/{dimensions.d.ts → src/dimensions.d.ts} +10 -11
  11. package/dist/src/dimensions.d.ts.map +1 -0
  12. package/dist/src/dimensions.js +500 -0
  13. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/src/index.js +44 -0
  16. package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
  17. package/dist/src/inputWeights.d.ts.map +1 -0
  18. package/dist/src/inputWeights.js +97 -0
  19. package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
  20. package/dist/src/scriptSizes.d.ts.map +1 -0
  21. package/dist/src/scriptSizes.js +50 -0
  22. package/dist/{types.d.ts → src/types.d.ts} +1 -0
  23. package/dist/src/types.d.ts.map +1 -0
  24. package/dist/src/types.js +39 -0
  25. package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
  26. package/dist/src/virtualSizes.d.ts.map +1 -0
  27. package/dist/src/virtualSizes.js +114 -0
  28. package/dist/src/zcash.d.ts +9 -0
  29. package/dist/src/zcash.d.ts.map +1 -0
  30. package/dist/src/zcash.js +22 -0
  31. package/dist/test/chain.d.ts +2 -0
  32. package/dist/test/chain.d.ts.map +1 -0
  33. package/dist/test/chain.js +92 -0
  34. package/dist/test/dimensions.d.ts +2 -0
  35. package/dist/test/dimensions.d.ts.map +1 -0
  36. package/dist/test/dimensions.js +235 -0
  37. package/dist/test/signedTx/inputWeights.d.ts +2 -0
  38. package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
  39. package/dist/test/signedTx/inputWeights.js +127 -0
  40. package/dist/test/signedTx/txCombinations.d.ts +3 -0
  41. package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
  42. package/dist/test/signedTx/txCombinations.js +130 -0
  43. package/dist/test/signedTx/txGen.d.ts +74 -0
  44. package/dist/test/signedTx/txGen.d.ts.map +1 -0
  45. package/dist/test/signedTx/txGen.js +233 -0
  46. package/dist/test/testutils.d.ts +36 -0
  47. package/dist/test/testutils.d.ts.map +1 -0
  48. package/dist/test/testutils.js +190 -0
  49. package/dist/test/virtualSizes.d.ts +2 -0
  50. package/dist/test/virtualSizes.d.ts.map +1 -0
  51. package/dist/test/virtualSizes.js +18 -0
  52. package/dist/test/zcash.d.ts +2 -0
  53. package/dist/test/zcash.d.ts.map +1 -0
  54. package/dist/test/zcash.js +60 -0
  55. package/dist/tsconfig.build.tsbuildinfo +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/docs/input-costs.md +14 -0
  58. package/package.json +7 -7
  59. package/dist/codes.js +0 -168
  60. package/dist/dimensions.js +0 -490
  61. package/dist/index.js +0 -30
  62. package/dist/inputWeights.js +0 -97
  63. package/dist/scriptSizes.js +0 -51
  64. package/dist/types.js +0 -25
  65. package/dist/virtualSizes.js +0 -114
@@ -0,0 +1,235 @@
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
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
37
+ const should = __importStar(require("should"));
38
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
39
+ const { chainCodes, chainCodesP2sh, chainCodesP2shP2wsh, chainCodesP2tr, chainCodesP2trMusig2, chainCodesP2wsh } = utxo_lib_1.bitgo;
40
+ const src_1 = require("../src");
41
+ const testutils_1 = require("./testutils");
42
+ describe('Dimensions Attributes', function () {
43
+ it('has read-only nInputs and nOutputs', function () {
44
+ should.throws(() => (src_1.Dimensions.ZERO.nInputs = 1), /read-only/);
45
+ should.throws(() => (src_1.Dimensions.ZERO.nOutputs = 1), /read-only/);
46
+ });
47
+ });
48
+ describe('Output Dimensions', function () {
49
+ it('instantiates', function () {
50
+ const dims = new src_1.OutputDimensions({ size: 0, count: 0 });
51
+ should.throws(() => (dims.count += 1));
52
+ });
53
+ });
54
+ describe('Dimensions Arithmetic', function () {
55
+ it('sums correctly', function () {
56
+ src_1.Dimensions.zero()
57
+ .plus({ nP2shInputs: 1 })
58
+ .should.eql(new src_1.Dimensions({
59
+ nP2shInputs: 1,
60
+ nP2shP2wshInputs: 0,
61
+ nP2wshInputs: 0,
62
+ nP2trKeypathInputs: 0,
63
+ nP2trScriptPathLevel1Inputs: 0,
64
+ nP2trScriptPathLevel2Inputs: 0,
65
+ nP2shP2pkInputs: 0,
66
+ outputs: { size: 0, count: 0 },
67
+ }));
68
+ const components = [
69
+ { nP2shInputs: 1 },
70
+ { nP2shP2wshInputs: 2 },
71
+ { nP2wshInputs: 3 },
72
+ { nP2trKeypathInputs: 4 },
73
+ { nP2trScriptPathLevel1Inputs: 5 },
74
+ { nP2trScriptPathLevel2Inputs: 6 },
75
+ { outputs: { size: 23, count: 1 } },
76
+ { outputs: { size: 44, count: 2 } },
77
+ { outputs: { size: 0, count: 0 } },
78
+ ];
79
+ components.forEach((component) => should.doesNotThrow(() => src_1.Dimensions.sum(component)));
80
+ const sum = components.reduce((a, b) => a.plus(b), src_1.Dimensions.zero());
81
+ sum.should.eql(src_1.Dimensions.sum(...components));
82
+ sum.should.eql(new src_1.Dimensions({
83
+ nP2shInputs: 1,
84
+ nP2shP2wshInputs: 2,
85
+ nP2wshInputs: 3,
86
+ nP2trKeypathInputs: 4,
87
+ nP2trScriptPathLevel1Inputs: 5,
88
+ nP2trScriptPathLevel2Inputs: 6,
89
+ nP2shP2pkInputs: 0,
90
+ outputs: { size: 67, count: 3 },
91
+ }));
92
+ sum.nOutputs.should.eql(sum.outputs.count);
93
+ });
94
+ it('provides some typical output sizes', function () {
95
+ [
96
+ [src_1.Dimensions.SingleOutput.p2sh, src_1.VirtualSizes.txP2shOutputSize],
97
+ [src_1.Dimensions.SingleOutput.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
98
+ [src_1.Dimensions.SingleOutput.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
99
+ [src_1.Dimensions.SingleOutput.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
100
+ [src_1.Dimensions.SingleOutput.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
101
+ [src_1.Dimensions.SingleOutput.p2tr, src_1.VirtualSizes.txP2trOutputSize],
102
+ ].forEach(([dims, size]) => {
103
+ dims.getOutputsVSize().should.eql(size);
104
+ });
105
+ });
106
+ it('prevents sum of invalid data', function () {
107
+ should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 0 } }));
108
+ should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }));
109
+ should.throws(() => src_1.Dimensions.sum({ nOutputs: 1 }));
110
+ should.throws(() => src_1.Dimensions.sum({ nOutputs: 1, outputs: { count: 2, size: 1 } }));
111
+ // @ts-ignore
112
+ should.throws(() => src_1.Dimensions.sum({ nP2shInputs: 1 }, { nP2shInputs: 'foo' }));
113
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 0 } }));
114
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 1 } }));
115
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }, { outputs: { count: 1, size: 0 } }));
116
+ });
117
+ it('counts inputs correctly', function () {
118
+ Object.entries(src_1.Dimensions.SingleInput).forEach(([key, value]) => {
119
+ value.nInputs.should.eql(1, key);
120
+ });
121
+ });
122
+ it('multiplies correctly', function () {
123
+ const d = new src_1.Dimensions({
124
+ nP2shInputs: 1,
125
+ nP2shP2wshInputs: 2,
126
+ nP2wshInputs: 3,
127
+ nP2trKeypathInputs: 4,
128
+ nP2trScriptPathLevel1Inputs: 5,
129
+ nP2trScriptPathLevel2Inputs: 6,
130
+ nP2shP2pkInputs: 7,
131
+ outputs: { count: 1, size: 22 },
132
+ }).times(3);
133
+ d.should.eql(new src_1.Dimensions({
134
+ nP2shInputs: 3,
135
+ nP2shP2wshInputs: 6,
136
+ nP2wshInputs: 9,
137
+ nP2trKeypathInputs: 12,
138
+ nP2trScriptPathLevel1Inputs: 15,
139
+ nP2trScriptPathLevel2Inputs: 18,
140
+ nP2shP2pkInputs: 21,
141
+ outputs: { count: 3, size: 66 },
142
+ }));
143
+ d.getNInputs().should.eql(84);
144
+ d.nInputs.should.eql(84);
145
+ });
146
+ });
147
+ describe('Dimensions from unspent types', function () {
148
+ it('determines unspent size according to chain', function () {
149
+ chainCodesP2sh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shInputs: 1 })));
150
+ chainCodesP2shP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: 1 })));
151
+ chainCodesP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: 1 })));
152
+ chainCodesP2tr.forEach((chain) => {
153
+ src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel2Inputs: 1 }));
154
+ src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
155
+ });
156
+ chainCodesP2trMusig2.forEach((chain) => {
157
+ src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
158
+ src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: undefined }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trKeypathInputs: 1 }));
159
+ });
160
+ src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain }))).should.eql(new src_1.Dimensions({
161
+ nP2shP2wshInputs: 2,
162
+ nP2shInputs: 2,
163
+ nP2wshInputs: 2,
164
+ nP2trKeypathInputs: 0,
165
+ nP2trScriptPathLevel1Inputs: 2,
166
+ nP2trScriptPathLevel2Inputs: 2,
167
+ nP2shP2pkInputs: 0,
168
+ outputs: { count: 0, size: 0 },
169
+ }));
170
+ src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain })), { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(new src_1.Dimensions({
171
+ nP2shP2wshInputs: 2,
172
+ nP2shInputs: 2,
173
+ nP2wshInputs: 2,
174
+ nP2trKeypathInputs: 2,
175
+ nP2trScriptPathLevel1Inputs: 2,
176
+ nP2trScriptPathLevel2Inputs: 0,
177
+ nP2shP2pkInputs: 0,
178
+ outputs: { count: 0, size: 0 },
179
+ }));
180
+ });
181
+ it('calculates output dimensions dynamically', function () {
182
+ const expectedSizes = new Map([
183
+ [testutils_1.UnspentTypeScript2of3.p2sh, src_1.VirtualSizes.txP2shOutputSize],
184
+ [testutils_1.UnspentTypeScript2of3.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
185
+ [testutils_1.UnspentTypeScript2of3.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
186
+ [testutils_1.UnspentTypeScript2of3.p2tr, src_1.VirtualSizes.txP2trOutputSize],
187
+ [testutils_1.UnspentTypeScript2of3.p2trMusig2, src_1.VirtualSizes.txP2trOutputSize],
188
+ [testutils_1.UnspentTypeScript2of3.taprootKeyPathSpend, src_1.VirtualSizes.txP2trOutputSize],
189
+ [testutils_1.UnspentTypePubKeyHash.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
190
+ [testutils_1.UnspentTypePubKeyHash.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
191
+ ]);
192
+ [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)].forEach((type) => (0, testutils_1.getOutputDimensionsForUnspentType)(type).outputs.size.should.eql(expectedSizes.get(type)));
193
+ });
194
+ });
195
+ describe('Dimensions estimates', function () {
196
+ it('calculates vsizes', function () {
197
+ function dim(nP2shInputs, nP2shP2wshInputs, nP2wshInputs, nOutputs) {
198
+ return src_1.Dimensions.sum({
199
+ nP2shInputs,
200
+ nP2shP2wshInputs,
201
+ nP2wshInputs,
202
+ }, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
203
+ }
204
+ function dimP2tr(nP2trKeypathInputs, nP2trScriptPathLevel1Inputs, nP2trScriptPathLevel2Inputs, nOutputs) {
205
+ return src_1.Dimensions.sum({
206
+ nP2trKeypathInputs,
207
+ nP2trScriptPathLevel1Inputs,
208
+ nP2trScriptPathLevel2Inputs,
209
+ }, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
210
+ }
211
+ const vectors = [
212
+ [dim(1, 0, 0, 1), [false, 10, 298, 34, 342]],
213
+ [dim(0, 1, 0, 1), [true, 11, 140, 34, 185]],
214
+ [dim(0, 0, 1, 1), [true, 11, 105, 34, 150]],
215
+ [dim(2, 0, 0, 1), [false, 10, 596, 34, 640]],
216
+ [dim(0, 2, 0, 1), [true, 11, 280, 34, 325]],
217
+ [dim(0, 0, 2, 1), [true, 11, 210, 34, 255]],
218
+ [dim(1, 1, 1, 1), [true, 11, 543, 34, 588]],
219
+ [dim(1, 1, 1, 2), [true, 11, 543, 68, 622]],
220
+ [dimP2tr(1, 0, 0, 1), [true, 11, 58, 34, 103]],
221
+ [dimP2tr(0, 1, 0, 1), [true, 11, 108, 34, 153]],
222
+ [dimP2tr(0, 0, 1, 1), [true, 11, 116, 34, 161]],
223
+ ];
224
+ vectors.forEach(([dimensions, props]) => {
225
+ [
226
+ dimensions.isSegwit(),
227
+ dimensions.getOverheadVSize(),
228
+ dimensions.getInputsVSize(),
229
+ dimensions.getOutputsVSize(),
230
+ dimensions.getVSize(),
231
+ ].should.eql(props);
232
+ });
233
+ });
234
+ });
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZGltZW5zaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFzRDtBQUN0RCwrQ0FBaUM7QUFDakMsbURBQTZDO0FBQzdDLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsR0FDOUcsZ0JBQUssQ0FBQztBQUNSLGdDQUFvRTtBQUVwRSwyQ0FBOEc7QUFFOUcsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUUsZ0JBQVUsQ0FBQyxJQUFZLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBRSxnQkFBVSxDQUFDLElBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixFQUFFLENBQUMsY0FBYyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksc0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFB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QUFNLE9BQU8sR0FBOEI7WUFDekMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFM0MsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDaEQsQ0FBQztRQUVGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3RDO2dCQUNFLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDN0IsVUFBVSxDQUFDLGNBQWMsRUFBRTtnQkFDM0IsVUFBVSxDQUFDLGVBQWUsRUFBRTtnQkFDNUIsVUFBVSxDQUFDLFFBQVEsRUFBRTthQUN0QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5pbXBvcnQgKiBhcyBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGJpdGdvIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuY29uc3QgeyBjaGFpbkNvZGVzLCBjaGFpbkNvZGVzUDJzaCwgY2hhaW5Db2Rlc1Ayc2hQMndzaCwgY2hhaW5Db2Rlc1AydHIsIGNoYWluQ29kZXNQMnRyTXVzaWcyLCBjaGFpbkNvZGVzUDJ3c2ggfSA9XG4gIGJpdGdvO1xuaW1wb3J0IHsgRGltZW5zaW9ucywgT3V0cHV0RGltZW5zaW9ucywgVmlydHVhbFNpemVzIH0gZnJvbSAnLi4vc3JjJztcblxuaW1wb3J0IHsgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlLCBVbnNwZW50VHlwZVB1YktleUhhc2gsIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyB9IGZyb20gJy4vdGVzdHV0aWxzJztcblxuZGVzY3JpYmUoJ0RpbWVuc2lvbnMgQXR0cmlidXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2hhcyByZWFkLW9ubHkgbklucHV0cyBhbmQgbk91dHB1dHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiAoKERpbWVuc2lvbnMuWkVSTyBhcyBhbnkpLm5JbnB1dHMgPSAxKSwgL3JlYWQtb25seS8pO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gKChEaW1lbnNpb25zLlpFUk8gYXMgYW55KS5uT3V0cHV0cyA9IDEpLCAvcmVhZC1vbmx5Lyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdPdXRwdXQgRGltZW5zaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2luc3RhbnRpYXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkaW1zID0gbmV3IE91dHB1dERpbWVuc2lvbnMoeyBzaXplOiAwLCBjb3VudDogMCB9KTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IChkaW1zLmNvdW50ICs9IDEpKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0RpbWVuc2lvbnMgQXJpdGhtZXRpYycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3N1bXMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgIERpbWVuc2lvbnMuemVybygpXG4gICAgICAucGx1cyh7IG5QMnNoSW5wdXRzOiAxIH0pXG4gICAgICAuc2hvdWxkLmVxbChcbiAgICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICAgIG5QMnNoSW5wdXRzOiAxLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDAsXG4gICAgICAgICAgblAyd3NoSW5wdXRzOiAwLFxuICAgICAgICAgIG5QMnRyS2V5cGF0aElucHV0czogMCxcbiAgICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDAsXG4gICAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAwLFxuICAgICAgICAgIG5QMnNoUDJwa0lucHV0czogMCxcbiAgICAgICAgICBvdXRwdXRzOiB7IHNpemU6IDAsIGNvdW50OiAwIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IFtcbiAgICAgIHsgblAyc2hJbnB1dHM6IDEgfSxcbiAgICAgIHsgblAyc2hQMndzaElucHV0czogMiB9LFxuICAgICAgeyBuUDJ3c2hJbnB1dHM6IDMgfSxcbiAgICAgIHsgblAydHJLZXlwYXRoSW5wdXRzOiA0IH0sXG4gICAgICB7IG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogNSB9LFxuICAgICAgeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDYgfSxcbiAgICAgIHsgb3V0cHV0czogeyBzaXplOiAyMywgY291bnQ6IDEgfSB9LFxuICAgICAgeyBvdXRwdXRzOiB7IHNpemU6IDQ0LCBjb3VudDogMiB9IH0sXG4gICAgICB7IG91dHB1dHM6IHsgc2l6ZTogMCwgY291bnQ6IDAgfSB9LFxuICAgIF07XG5cbiAgICBjb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudCkgPT4gc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBEaW1lbnNpb25zLnN1bShjb21wb25lbnQpKSk7XG5cbiAgICBjb25zdCBzdW0gPSBjb21wb25lbnRzLnJlZHVjZSgoYSwgYikgPT4gYS5wbHVzKGIpLCBEaW1lbnNpb25zLnplcm8oKSk7XG5cbiAgICBzdW0uc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSguLi5jb21wb25lbnRzKSk7XG5cbiAgICBzdW0uc2hvdWxkLmVxbChcbiAgICAgIG5ldyBEaW1lbnNpb25zKHtcbiAgICAgICAgblAyc2hJbnB1dHM6IDEsXG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMndzaElucHV0czogMyxcbiAgICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiA0LFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDUsXG4gICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0czogNixcbiAgICAgICAgblAyc2hQMnBrSW5wdXRzOiAwLFxuICAgICAgICBvdXRwdXRzOiB7IHNpemU6IDY3LCBjb3VudDogMyB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgc3VtLm5PdXRwdXRzLnNob3VsZC5lcWwoc3VtLm91dHB1dHMuY291bnQpO1xuICB9KTtcblxuICBpdCgncHJvdmlkZXMgc29tZSB0eXBpY2FsIG91dHB1dCBzaXplcycsIGZ1bmN0aW9uICgpIHtcbiAgICAoXG4gICAgICBbXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMnNoLCBWaXJ0dWFsU2l6ZXMudHhQMnNoT3V0cHV0U2l6ZV0sXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMnNoUDJ3c2gsIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaE91dHB1dFNpemVdLFxuICAgICAgICBbRGltZW5zaW9ucy5TaW5nbGVPdXRwdXQucDJ3c2gsIFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMnBraCwgVmlydHVhbFNpemVzLnR4UDJwa2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyd3BraCwgVmlydHVhbFNpemVzLnR4UDJ3cGtoT3V0cHV0U2l6ZV0sXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMnRyLCBWaXJ0dWFsU2l6ZXMudHhQMnRyT3V0cHV0U2l6ZV0sXG4gICAgICBdIGFzIFtEaW1lbnNpb25zLCBudW1iZXJdW11cbiAgICApLmZvckVhY2goKFtkaW1zLCBzaXplXSkgPT4ge1xuICAgICAgZGltcy5nZXRPdXRwdXRzVlNpemUoKS5zaG91bGQuZXFsKHNpemUpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncHJldmVudHMgc3VtIG9mIGludmFsaWQgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMCB9IH0pKTtcbiAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZTogMSB9IH0pKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgbk91dHB1dHM6IDEgfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBuT3V0cHV0czogMSwgb3V0cHV0czogeyBjb3VudDogMiwgc2l6ZTogMSB9IH0pKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLnN1bSh7IG5QMnNoSW5wdXRzOiAxIH0sIHsgblAyc2hJbnB1dHM6ICdmb28nIH0pKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZTogMCB9IH0pKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMSB9IH0pKTtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZTogMSB9IH0sIHsgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZTogMCB9IH0pKTtcbiAgfSk7XG5cbiAgaXQoJ2NvdW50cyBpbnB1dHMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKERpbWVuc2lvbnMuU2luZ2xlSW5wdXQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdmFsdWUubklucHV0cy5zaG91bGQuZXFsKDEsIGtleSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdtdWx0aXBsaWVzIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkID0gbmV3IERpbWVuc2lvbnMoe1xuICAgICAgblAyc2hJbnB1dHM6IDEsXG4gICAgICBuUDJzaFAyd3NoSW5wdXRzOiAyLFxuICAgICAgblAyd3NoSW5wdXRzOiAzLFxuICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiA0LFxuICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiA1LFxuICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiA2LFxuICAgICAgblAyc2hQMnBrSW5wdXRzOiA3LFxuICAgICAgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZTogMjIgfSxcbiAgICB9KS50aW1lcygzKTtcblxuICAgIGQuc2hvdWxkLmVxbChcbiAgICAgIG5ldyBEaW1lbnNpb25zKHtcbiAgICAgICAgblAyc2hJbnB1dHM6IDMsXG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDYsXG4gICAgICAgIG5QMndzaElucHV0czogOSxcbiAgICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiAxMixcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAxNSxcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAxOCxcbiAgICAgICAgblAyc2hQMnBrSW5wdXRzOiAyMSxcbiAgICAgICAgb3V0cHV0czogeyBjb3VudDogMywgc2l6ZTogNjYgfSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGQuZ2V0TklucHV0cygpLnNob3VsZC5lcWwoODQpO1xuICAgIGQubklucHV0cy5zaG91bGQuZXFsKDg0KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0RpbWVuc2lvbnMgZnJvbSB1bnNwZW50IHR5cGVzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnZGV0ZXJtaW5lcyB1bnNwZW50IHNpemUgYWNjb3JkaW5nIHRvIGNoYWluJywgZnVuY3Rpb24gKCkge1xuICAgIGNoYWluQ29kZXNQMnNoLmZvckVhY2goKGNoYWluKSA9PiBEaW1lbnNpb25zLmZyb21VbnNwZW50KHsgY2hhaW4gfSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSh7IG5QMnNoSW5wdXRzOiAxIH0pKSk7XG5cbiAgICBjaGFpbkNvZGVzUDJzaFAyd3NoLmZvckVhY2goKGNoYWluKSA9PlxuICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudCh7IGNoYWluIH0pLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAyd3NoSW5wdXRzOiAxIH0pKVxuICAgICk7XG5cbiAgICBjaGFpbkNvZGVzUDJ3c2guZm9yRWFjaCgoY2hhaW4pID0+XG4gICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50KHsgY2hhaW4gfSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSh7IG5QMndzaElucHV0czogMSB9KSlcbiAgICApO1xuXG4gICAgY2hhaW5Db2Rlc1AydHIuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAxIH0pKTtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoXG4gICAgICAgIHsgY2hhaW4gfSxcbiAgICAgICAgeyBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogMSB9LCBwMnRyTXVzaWcyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0gfVxuICAgICAgKS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAxIH0pKTtcbiAgICB9KTtcblxuICAgIGNoYWluQ29kZXNQMnRyTXVzaWcyLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50KHsgY2hhaW4gfSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSh7IG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMSB9KSk7XG4gICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50KFxuICAgICAgICB7IGNoYWluIH0sXG4gICAgICAgIHsgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IHVuZGVmaW5lZCB9LCBwMnRyTXVzaWcyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0gfVxuICAgICAgKS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAydHJLZXlwYXRoSW5wdXRzOiAxIH0pKTtcbiAgICB9KTtcblxuICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnRzKGNoYWluQ29kZXMubWFwKChjaGFpbikgPT4gKHsgY2hhaW4gfSkpKS5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaFAyd3NoSW5wdXRzOiAyLFxuICAgICAgICBuUDJzaElucHV0czogMixcbiAgICAgICAgblAyd3NoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDAsXG4gICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMixcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAyLFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDAsXG4gICAgICAgIG91dHB1dHM6IHsgY291bnQ6IDAsIHNpemU6IDAgfSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnRzKFxuICAgICAgY2hhaW5Db2Rlcy5tYXAoKGNoYWluKSA9PiAoeyBjaGFpbiB9KSksXG4gICAgICB7IHAydHI6IHsgc2NyaXB0UGF0aExldmVsOiAxIH0sIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSB9XG4gICAgKS5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaFAyd3NoSW5wdXRzOiAyLFxuICAgICAgICBuUDJzaElucHV0czogMixcbiAgICAgICAgblAyd3NoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDIsXG4gICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMixcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAwLFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDAsXG4gICAgICAgIG91dHB1dHM6IHsgY291bnQ6IDAsIHNpemU6IDAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGN1bGF0ZXMgb3V0cHV0IGRpbWVuc2lvbnMgZHluYW1pY2FsbHknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRTaXplcyA9IG5ldyBNYXAoW1xuICAgICAgW1Vuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoLCBWaXJ0dWFsU2l6ZXMudHhQMnNoT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2hQMndzaCwgVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyd3NoLCBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnRyLCBWaXJ0dWFsU2l6ZXMudHhQMnRyT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHJNdXNpZzIsIFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMudGFwcm9vdEtleVBhdGhTcGVuZCwgVmlydHVhbFNpemVzLnR4UDJ0ck91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraCwgVmlydHVhbFNpemVzLnR4UDJwa2hPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVB1YktleUhhc2gucDJ3cGtoLCBWaXJ0dWFsU2l6ZXMudHhQMndwa2hPdXRwdXRTaXplXSxcbiAgICBdKTtcblxuICAgIFsuLi5PYmplY3Qua2V5cyhVbnNwZW50VHlwZVNjcmlwdDJvZjMpLCAuLi5PYmplY3Qua2V5cyhVbnNwZW50VHlwZVB1YktleUhhc2gpXS5mb3JFYWNoKCh0eXBlKSA9PlxuICAgICAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKHR5cGUpLm91dHB1dHMuc2l6ZS5zaG91bGQuZXFsKGV4cGVjdGVkU2l6ZXMuZ2V0KHR5cGUgYXMgYW55KSlcbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBlc3RpbWF0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdjYWxjdWxhdGVzIHZzaXplcycsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBkaW0oblAyc2hJbnB1dHM6IG51bWJlciwgblAyc2hQMndzaElucHV0czogbnVtYmVyLCBuUDJ3c2hJbnB1dHM6IG51bWJlciwgbk91dHB1dHM6IG51bWJlcik6IERpbWVuc2lvbnMge1xuICAgICAgcmV0dXJuIERpbWVuc2lvbnMuc3VtKFxuICAgICAgICB7XG4gICAgICAgICAgblAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0cyxcbiAgICAgICAgICBuUDJ3c2hJbnB1dHMsXG4gICAgICAgIH0sXG4gICAgICAgIGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZShVbnNwZW50VHlwZVB1YktleUhhc2gucDJwa2gpLnRpbWVzKG5PdXRwdXRzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaW1QMnRyKFxuICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiBudW1iZXIsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IG51bWJlcixcbiAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0czogbnVtYmVyLFxuICAgICAgbk91dHB1dHM6IG51bWJlclxuICAgICk6IERpbWVuc2lvbnMge1xuICAgICAgcmV0dXJuIERpbWVuc2lvbnMuc3VtKFxuICAgICAgICB7XG4gICAgICAgICAgblAydHJLZXlwYXRoSW5wdXRzLFxuICAgICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0cyxcbiAgICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHMsXG4gICAgICAgIH0sXG4gICAgICAgIGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZShVbnNwZW50VHlwZVB1YktleUhhc2gucDJwa2gpLnRpbWVzKG5PdXRwdXRzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3JzOiBbRGltZW5zaW9ucywgdW5rbm93bltdXVtdID0gW1xuICAgICAgW2RpbSgxLCAwLCAwLCAxKSwgW2ZhbHNlLCAxMCwgMjk4LCAzNCwgMzQyXV0sXG4gICAgICBbZGltKDAsIDEsIDAsIDEpLCBbdHJ1ZSwgMTEsIDE0MCwgMzQsIDE4NV1dLFxuICAgICAgW2RpbSgwLCAwLCAxLCAxKSwgW3RydWUsIDExLCAxMDUsIDM0LCAxNTBdXSxcbiAgICAgIFtkaW0oMiwgMCwgMCwgMSksIFtmYWxzZSwgMTAsIDU5NiwgMzQsIDY0MF1dLFxuICAgICAgW2RpbSgwLCAyLCAwLCAxKSwgW3RydWUsIDExLCAyODAsIDM0LCAzMjVdXSxcbiAgICAgIFtkaW0oMCwgMCwgMiwgMSksIFt0cnVlLCAxMSwgMjEwLCAzNCwgMjU1XV0sXG4gICAgICBbZGltKDEsIDEsIDEsIDEpLCBbdHJ1ZSwgMTEsIDU0MywgMzQsIDU4OF1dLFxuICAgICAgW2RpbSgxLCAxLCAxLCAyKSwgW3RydWUsIDExLCA1NDMsIDY4LCA2MjJdXSxcblxuICAgICAgW2RpbVAydHIoMSwgMCwgMCwgMSksIFt0cnVlLCAxMSwgNTgsIDM0LCAxMDNdXSxcbiAgICAgIFtkaW1QMnRyKDAsIDEsIDAsIDEpLCBbdHJ1ZSwgMTEsIDEwOCwgMzQsIDE1M11dLFxuICAgICAgW2RpbVAydHIoMCwgMCwgMSwgMSksIFt0cnVlLCAxMSwgMTE2LCAzNCwgMTYxXV0sXG4gICAgXTtcblxuICAgIHZlY3RvcnMuZm9yRWFjaCgoW2RpbWVuc2lvbnMsIHByb3BzXSkgPT4ge1xuICAgICAgW1xuICAgICAgICBkaW1lbnNpb25zLmlzU2Vnd2l0KCksXG4gICAgICAgIGRpbWVuc2lvbnMuZ2V0T3ZlcmhlYWRWU2l6ZSgpLFxuICAgICAgICBkaW1lbnNpb25zLmdldElucHV0c1ZTaXplKCksXG4gICAgICAgIGRpbWVuc2lvbnMuZ2V0T3V0cHV0c1ZTaXplKCksXG4gICAgICAgIGRpbWVuc2lvbnMuZ2V0VlNpemUoKSxcbiAgICAgIF0uc2hvdWxkLmVxbChwcm9wcyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inputWeights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputWeights.d.ts","sourceRoot":"","sources":["../../../test/signedTx/inputWeights.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
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
+ const assert = __importStar(require("assert"));
37
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
38
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
39
+ const inputWeights_1 = require("../../src/inputWeights");
40
+ const scriptSizes_1 = require("../../src/scriptSizes");
41
+ const testutils_1 = require("../testutils");
42
+ describe('Input Script Sizes (Worst-Case)', function () {
43
+ const keys = [1, 2, 3].map((v) => utxo_lib_1.bip32.fromSeed(Buffer.alloc(16, `test/${v}`)));
44
+ const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
45
+ function getLargestInputWithType(inputType, signKeys, inputCount = 100) {
46
+ const signerName = signKeys[0];
47
+ const cosignerName = signKeys.length > 1 ? signKeys[1] : signerName;
48
+ const inputScriptTypes = Array.from({ length: inputCount }).fill(inputType);
49
+ const outputScriptTypes = [testutils_1.UnspentTypeScript2of3.p2sh];
50
+ return (0, testutils_1.getSignedTransaction)(rootWalletKeys, signerName, cosignerName, inputScriptTypes, outputScriptTypes).ins.reduce((a, b) => ((0, inputWeights_1.getInputWeight)(a) > (0, inputWeights_1.getInputWeight)(b) ? a : b));
51
+ }
52
+ function getInputComponents(input) {
53
+ const decompiled = utxolib.script.decompile(input.script);
54
+ if (!decompiled) {
55
+ throw new Error();
56
+ }
57
+ const script = decompiled.map((v) => {
58
+ if (!Buffer.isBuffer(v)) {
59
+ return { length: 1 };
60
+ }
61
+ return { length: v.length + (0, scriptSizes_1.pushdataEncodingLength)(v.length) };
62
+ });
63
+ const witness = (input.witness || []).map((v) => ({ length: v.length }));
64
+ const scriptSize = script.reduce((a, b) => a + b.length, 0);
65
+ assert.strictEqual(scriptSize, input.script.length, utxolib.script.toASM(decompiled));
66
+ return {
67
+ script: script.map((v) => v.length),
68
+ witness: witness.map((v) => v.length),
69
+ };
70
+ }
71
+ function runTestComponentSizes(inputType, signKeys) {
72
+ const signKeysStr = signKeys.join(',');
73
+ describe(`inputType=${inputType} signKeys=${signKeysStr}`, function () {
74
+ it(`component sizes`, function () {
75
+ this.timeout(10000);
76
+ let expectedComponents;
77
+ switch (inputType) {
78
+ case 'p2sh':
79
+ expectedComponents = inputWeights_1.inputComponentsP2sh;
80
+ break;
81
+ case 'p2shP2wsh':
82
+ expectedComponents = inputWeights_1.inputComponentsP2shP2wsh;
83
+ break;
84
+ case 'p2wsh':
85
+ expectedComponents = inputWeights_1.inputComponentsP2wsh;
86
+ break;
87
+ case 'p2shP2pk':
88
+ expectedComponents = inputWeights_1.inputComponentsP2shP2pk;
89
+ break;
90
+ case 'p2tr':
91
+ if (signKeys[1] === 'bitgo') {
92
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
93
+ }
94
+ else if (signKeys[1] === 'backup') {
95
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel2;
96
+ }
97
+ else {
98
+ throw new Error(`unexpected cosigner`);
99
+ }
100
+ break;
101
+ case 'p2trMusig2':
102
+ // assumes only script path
103
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
104
+ break;
105
+ case 'taprootKeyPathSpend':
106
+ expectedComponents = inputWeights_1.inputComponentsP2trKeySpend;
107
+ break;
108
+ default:
109
+ throw new Error(`invalid inputType ${inputType}`);
110
+ }
111
+ const input = getLargestInputWithType(inputType, signKeys, inputType === 'p2tr' || inputType === 'p2trMusig2' || inputType === 'taprootKeyPathSpend' ? 10 : 100);
112
+ const components = getInputComponents(input);
113
+ assert.deepStrictEqual(components, expectedComponents);
114
+ assert.strictEqual((0, inputWeights_1.getInputComponentsWeight)(components), (0, inputWeights_1.getInputWeight)(input));
115
+ });
116
+ });
117
+ }
118
+ (0, testutils_1.getInputScriptTypes)().forEach((inputType) => {
119
+ if (inputType !== 'p2trMusig2') {
120
+ runTestComponentSizes(inputType, inputType === 'p2shP2pk' ? ['user'] : ['user', 'bitgo']);
121
+ }
122
+ if (inputType !== 'p2shP2pk' && inputType !== 'taprootKeyPathSpend') {
123
+ runTestComponentSizes(inputType, ['user', 'backup']);
124
+ }
125
+ });
126
+ });
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRXZWlnaHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9zaWduZWRUeC9pbnB1dFdlaWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFHakMsOERBQWdEO0FBQ2hELG1EQUE2RDtBQUM3RCx5REFXZ0M7QUFDaEMsdURBQStEO0FBQy9ELDRDQU1zQjtBQUV0QixRQUFRLENBQUMsaUNBQWlDLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQXFCLENBQUM7SUFDckcsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRixTQUFTLHVCQUF1QixDQUM5QixTQUFpQixFQUNqQixRQUFpQyxFQUNqQyxVQUFVLEdBQUcsR0FBRztRQUVoQixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FB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RUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBQSwrQkFBbUIsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtRQUNsRCxJQUFJLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMvQixxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxTQUFTLEtBQUssVUFBVSxJQUFJLFNBQVMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3BFLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIG1vY2hhIGZyb20gJ21vY2hhJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlwMzIsIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHtcbiAgZ2V0SW5wdXRDb21wb25lbnRzV2VpZ2h0LFxuICBnZXRJbnB1dFdlaWdodCxcbiAgSW5wdXRDb21wb25lbnRzLFxuICBpbnB1dENvbXBvbmVudHNQMnNoLFxuICBpbnB1dENvbXBvbmVudHNQMnNoUDJwayxcbiAgaW5wdXRDb21wb25lbnRzUDJzaFAyd3NoLFxuICBpbnB1dENvbXBvbmVudHNQMnRyS2V5U3BlbmQsXG4gIGlucHV0Q29tcG9uZW50c1AydHJTY3JpcHRTcGVuZExldmVsMSxcbiAgaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwyLFxuICBpbnB1dENvbXBvbmVudHNQMndzaCxcbn0gZnJvbSAnLi4vLi4vc3JjL2lucHV0V2VpZ2h0cyc7XG5pbXBvcnQgeyBwdXNoZGF0YUVuY29kaW5nTGVuZ3RoIH0gZnJvbSAnLi4vLi4vc3JjL3NjcmlwdFNpemVzJztcbmltcG9ydCB7XG4gIGdldElucHV0U2NyaXB0VHlwZXMsXG4gIGdldFNpZ25lZFRyYW5zYWN0aW9uLFxuICBJbnB1dFNjcmlwdFR5cGUsXG4gIFRlc3RVbnNwZW50VHlwZSxcbiAgVW5zcGVudFR5cGVTY3JpcHQyb2YzLFxufSBmcm9tICcuLi90ZXN0dXRpbHMnO1xuXG5kZXNjcmliZSgnSW5wdXQgU2NyaXB0IFNpemVzIChXb3JzdC1DYXNlKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qga2V5cyA9IFsxLCAyLCAzXS5tYXAoKHYpID0+IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygxNiwgYHRlc3QvJHt2fWApKSkgYXMgQklQMzJJbnRlcmZhY2VbXTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyhba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV0pO1xuXG4gIGZ1bmN0aW9uIGdldExhcmdlc3RJbnB1dFdpdGhUeXBlKFxuICAgIGlucHV0VHlwZTogc3RyaW5nLFxuICAgIHNpZ25LZXlzOiB1dHhvbGliLmJpdGdvLktleU5hbWVbXSxcbiAgICBpbnB1dENvdW50ID0gMTAwXG4gICk6IHV0eG9saWIuVHhJbnB1dCB7XG4gICAgY29uc3Qgc2lnbmVyTmFtZSA9IHNpZ25LZXlzWzBdO1xuICAgIGNvbnN0IGNvc2lnbmVyTmFtZSA9IHNpZ25LZXlzLmxlbmd0aCA+IDEgPyBzaWduS2V5c1sxXSA6IHNpZ25lck5hbWU7XG4gICAgY29uc3QgaW5wdXRTY3JpcHRUeXBlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGlucHV0Q291bnQgfSkuZmlsbChpbnB1dFR5cGUpIGFzIElucHV0U2NyaXB0VHlwZVtdO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdFR5cGVzID0gW1Vuc3BlbnRUeXBlU2NyaXB0Mm9mMy5wMnNoXSBhcyBUZXN0VW5zcGVudFR5cGVbXTtcbiAgICByZXR1cm4gZ2V0U2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIHNpZ25lck5hbWUsXG4gICAgICBjb3NpZ25lck5hbWUsXG4gICAgICBpbnB1dFNjcmlwdFR5cGVzLFxuICAgICAgb3V0cHV0U2NyaXB0VHlwZXNcbiAgICApLmlucy5yZWR1Y2UoKGEsIGIpID0+IChnZXRJbnB1dFdlaWdodChhKSA+IGdldElucHV0V2VpZ2h0KGIpID8gYSA6IGIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElucHV0Q29tcG9uZW50cyhpbnB1dDogdXR4b2xpYi5UeElucHV0KTogSW5wdXRDb21wb25lbnRzIHtcbiAgICBjb25zdCBkZWNvbXBpbGVkID0gdXR4b2xpYi5zY3JpcHQuZGVjb21waWxlKGlucHV0LnNjcmlwdCk7XG4gICAgaWYgKCFkZWNvbXBpbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHQgPSBkZWNvbXBpbGVkLm1hcCgodikgPT4ge1xuICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodikpIHtcbiAgICAgICAgcmV0dXJuIHsgbGVuZ3RoOiAxIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsZW5ndGg6IHYubGVuZ3RoICsgcHVzaGRhdGFFbmNvZGluZ0xlbmd0aCh2Lmxlbmd0aCkgfTtcbiAgICB9KTtcbiAgICBjb25zdCB3aXRuZXNzID0gKGlucHV0LndpdG5lc3MgfHwgW10pLm1hcCgodikgPT4gKHsgbGVuZ3RoOiB2Lmxlbmd0aCB9KSk7XG5cbiAgICBjb25zdCBzY3JpcHRTaXplID0gc2NyaXB0LnJlZHVjZSgoYSwgYikgPT4gYSArIGIubGVuZ3RoLCAwKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NyaXB0U2l6ZSwgaW5wdXQuc2NyaXB0Lmxlbmd0aCwgdXR4b2xpYi5zY3JpcHQudG9BU00oZGVjb21waWxlZCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcmlwdDogc2NyaXB0Lm1hcCgodikgPT4gdi5sZW5ndGgpLFxuICAgICAgd2l0bmVzczogd2l0bmVzcy5tYXAoKHYpID0+IHYubGVuZ3RoKSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcnVuVGVzdENvbXBvbmVudFNpemVzKGlucHV0VHlwZTogc3RyaW5nLCBzaWduS2V5czogdXR4b2xpYi5iaXRnby5LZXlOYW1lW10pIHtcbiAgICBjb25zdCBzaWduS2V5c1N0ciA9IHNpZ25LZXlzLmpvaW4oJywnKTtcblxuICAgIGRlc2NyaWJlKGBpbnB1dFR5cGU9JHtpbnB1dFR5cGV9IHNpZ25LZXlzPSR7c2lnbktleXNTdHJ9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYGNvbXBvbmVudCBzaXplc2AsIGZ1bmN0aW9uICh0aGlzOiBtb2NoYS5Db250ZXh0KSB7XG4gICAgICAgIHRoaXMudGltZW91dCgxMF8wMDApO1xuICAgICAgICBsZXQgZXhwZWN0ZWRDb21wb25lbnRzO1xuICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3Ayc2gnOlxuICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJzaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Ayc2hQMndzaCc6XG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnNoUDJ3c2g7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwMndzaCc6XG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMndzaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Ayc2hQMnBrJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1Ayc2hQMnBrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncDJ0cic6XG4gICAgICAgICAgICBpZiAoc2lnbktleXNbMV0gPT09ICdiaXRnbycpIHtcbiAgICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzaWduS2V5c1sxXSA9PT0gJ2JhY2t1cCcpIHtcbiAgICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGNvc2lnbmVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwMnRyTXVzaWcyJzpcbiAgICAgICAgICAgIC8vIGFzc3VtZXMgb25seSBzY3JpcHQgcGF0aFxuICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFwcm9vdEtleVBhdGhTcGVuZCc6XG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyS2V5U3BlbmQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlucHV0VHlwZSAke2lucHV0VHlwZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZ2V0TGFyZ2VzdElucHV0V2l0aFR5cGUoXG4gICAgICAgICAgaW5wdXRUeXBlLFxuICAgICAgICAgIHNpZ25LZXlzLFxuICAgICAgICAgIGlucHV0VHlwZSA9PT0gJ3AydHInIHx8IGlucHV0VHlwZSA9PT0gJ3AydHJNdXNpZzInIHx8IGlucHV0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnID8gMTAgOiAxMDBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGdldElucHV0Q29tcG9uZW50cyhpbnB1dCk7XG4gICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoY29tcG9uZW50cywgZXhwZWN0ZWRDb21wb25lbnRzKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGdldElucHV0Q29tcG9uZW50c1dlaWdodChjb21wb25lbnRzKSwgZ2V0SW5wdXRXZWlnaHQoaW5wdXQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0SW5wdXRTY3JpcHRUeXBlcygpLmZvckVhY2goKGlucHV0VHlwZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlucHV0VHlwZSAhPT0gJ3AydHJNdXNpZzInKSB7XG4gICAgICBydW5UZXN0Q29tcG9uZW50U2l6ZXMoaW5wdXRUeXBlLCBpbnB1dFR5cGUgPT09ICdwMnNoUDJwaycgPyBbJ3VzZXInXSA6IFsndXNlcicsICdiaXRnbyddKTtcbiAgICB9XG4gICAgaWYgKGlucHV0VHlwZSAhPT0gJ3Ayc2hQMnBrJyAmJiBpbnB1dFR5cGUgIT09ICd0YXByb290S2V5UGF0aFNwZW5kJykge1xuICAgICAgcnVuVGVzdENvbXBvbmVudFNpemVzKGlucHV0VHlwZSwgWyd1c2VyJywgJ2JhY2t1cCddKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ export type InputScriptType = utxolib.bitgo.outputScripts.ScriptType | 'taprootKeyPathSpend';
3
+ //# sourceMappingURL=txCombinations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txCombinations.d.ts","sourceRoot":"","sources":["../../../test/signedTx/txCombinations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,qBAAqB,CAAC"}
@@ -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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const should_1 = __importDefault(require("should"));
40
+ const src_1 = require("../../src");
41
+ const testutils_1 = require("../testutils");
42
+ const txGen_1 = require("./txGen");
43
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
44
+ const keys = [1, 2, 3].map((v) => utxolib.bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), utxolib.networks.bitcoin));
45
+ const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
46
+ const testDimensionsFromTx = (txCombo) => {
47
+ const { inputTypes, outputTypes, expectedDims } = txCombo;
48
+ describe(`Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
49
+ const nInputs = inputTypes.length;
50
+ const outputDims = src_1.Dimensions.sum(...outputTypes.map(testutils_1.getOutputDimensionsForUnspentType));
51
+ it(`calculates dimensions from unsigned transaction`, function () {
52
+ const unsignedTx = txCombo.getUnsignedTx();
53
+ // does not work for unsigned transactions
54
+ should_1.default.throws(() => src_1.Dimensions.fromTransaction(unsignedTx));
55
+ // unless explicitly allowed
56
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH }).should.eql(src_1.Dimensions.sum({ nP2shInputs: nInputs }, outputDims));
57
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: nInputs }, outputDims));
58
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: nInputs }, outputDims));
59
+ });
60
+ it(`calculates dimensions for signed transaction`, function () {
61
+ const dimensions = src_1.Dimensions.fromTransaction(txCombo.getSignedTx());
62
+ dimensions.should.eql(expectedDims);
63
+ });
64
+ it(`calculates dimensions for signed input of transaction`, function () {
65
+ const signedTx = txCombo.getSignedTx();
66
+ // test Dimensions.fromInput()
67
+ inputTypes.forEach((input, i) => src_1.Dimensions.fromInput(signedTx.ins[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
68
+ });
69
+ });
70
+ };
71
+ const testDimensionsFromPsbt = (keys, inputTypes, outputTypes, expectedDims) => {
72
+ describe(`Psbt Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
73
+ ['unsigned', 'halfsigned', 'fullysigned'].forEach((s) => {
74
+ it(`calculates dimensions from ${s} psbt`, function () {
75
+ const dimensions = src_1.Dimensions.fromPsbt((0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, s));
76
+ dimensions.should.eql(expectedDims);
77
+ });
78
+ });
79
+ it(`calculates dimensions for signed input of psbt`, function () {
80
+ const signedPsbt = (0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, 'fullysigned');
81
+ inputTypes.forEach((input, i) => src_1.Dimensions.fromPsbtInput(signedPsbt.data.inputs[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
82
+ });
83
+ });
84
+ };
85
+ describe(`Dimensions for transaction combinations`, function () {
86
+ // p2trMusig2 is supported only with PSBT
87
+ const scriptTypes = utxolib.bitgo.outputScripts.scriptTypes2Of3.filter((t) => t !== 'p2trMusig2');
88
+ const params = {
89
+ inputTypes: [...scriptTypes, testutils_1.UnspentTypeP2shP2pk],
90
+ maxNInputs: 2,
91
+ outputTypes: [...scriptTypes, ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
92
+ maxNOutputs: 2,
93
+ };
94
+ (0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
95
+ const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
96
+ const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
97
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims)));
98
+ // Doubling the inputs should yield twice the input dims
99
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims)));
100
+ // Same for outputs
101
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims)));
102
+ });
103
+ });
104
+ describe(`Dimensions for PSBT combinations`, function () {
105
+ const params = {
106
+ inputTypes: [
107
+ ...utxolib.bitgo.outputScripts.scriptTypes2Of3,
108
+ utxolib.bitgo.outputScripts.scriptTypeP2shP2pk,
109
+ 'taprootKeyPathSpend',
110
+ ],
111
+ maxNInputs: 1,
112
+ outputTypes: [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
113
+ maxNOutputs: 1,
114
+ };
115
+ it(`does not work for unknown psbt input`, function () {
116
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
117
+ psbt.addInput({ hash: Buffer.alloc(32), index: 0 });
118
+ should_1.default.throws(() => src_1.Dimensions.fromPsbt(psbt));
119
+ });
120
+ (0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
121
+ const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
122
+ const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
123
+ testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims));
124
+ // Doubling the inputs should yield twice the input dims
125
+ testDimensionsFromPsbt(rootWalletKeys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims));
126
+ // Same for outputs
127
+ testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims));
128
+ });
129
+ });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhDb21iaW5hdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3NpZ25lZFR4L3R4Q29tYmluYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUF1QztBQUV2Qyw0Q0FRc0I7QUFFdEIsbUNBQW1EO0FBQ25ELDhEQUFnRDtBQUloRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3RELENBQUM7QUFFOUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVyRixNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBWSxFQUFFLEVBQUU7SUFDNUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTFELFFBQVEsQ0FBQyxzQkFBc0IsVUFBVSxhQUFhLFdBQVcsRUFBRSxFQUFFO1FBQ25FLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsZ0JBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLDZDQUFpQyxDQUFDLENBQUMsQ0FBQztRQUV6RixFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRTNDLDBDQUEwQztZQUMxQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTVELDRCQUE0QjtZQUM1QixnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzNGLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUNyRCxDQUFDO1lBRUYsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxFQUFFLGdCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2pHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQzFELENBQUM7WUFFRixnQkFBVSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzVGLGdCQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxVQUFVLEdBQUcsZ0JBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDckUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUU7WUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXZDLDhCQUE4QjtZQUM5QixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQzNDLGdCQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFVLENBQUMsR0FBRyxDQUFDLElBQUEsNENBQWdDLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUMxRyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsSUFBa0MsRUFDbEMsVUFBNkIsRUFDN0IsV0FBOEIsRUFDOUIsWUFBd0IsRUFDeEIsRUFBRTtJQUNGLFFBQVEsQ0FBQywyQkFBMkIsVUFBVSxhQUFhLFdBQVcsRUFBRSxFQUFFO1FBQ3ZFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRSxFQUFFLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFO2dCQUN6QyxNQUFNLFVBQVUsR0FBRyxnQkFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFL0UsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUMzQyxnQkFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQzVELGdCQUFVLENBQUMsR0FBRyxDQUFDLElBQUEsNENBQWdDLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FDeEQsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRTtJQUNsRCx5Q0FBeUM7SUFDekMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLE1BQU0sTUFBTSxHQUFHO1FBQ2IsVUFBVSxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsK0JBQW1CLENBQXNCO1FBQ3RFLFVBQVUsRUFBRSxDQUFDO1FBQ2IsV0FBVyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFxQixDQUFDLENBQXNCO1FBQ3pGLFdBQVcsRUFBRSxDQUFDO0tBQ2YsQ0FBQztJQUVGLElBQUEsdUJBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxjQUFpQyxFQUFFLGVBQWtDLEVBQUUsRUFBRTtRQUNoRyxNQUFNLGlCQUFpQixHQUFHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyw0Q0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDbEcsTUFBTSxrQkFBa0IsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXJHLG9CQUFvQixDQUNsQixJQUFJLGVBQU8sQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUMvRixDQUFDO1FBRUYsd0RBQXdEO1FBQ3hELG9CQUFvQixDQUNsQixJQUFJLGVBQU8sQ0FDVCxJQUFJLEVBQ0osQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25FLENBQ0YsQ0FBQztRQUVGLG1CQUFtQjtRQUNuQixvQkFBb0IsQ0FDbEIsSUFBSSxlQUFPLENBQ1QsSUFBSSxFQUNKLGNBQWMsRUFDZCxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQ3hDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGtDQUFrQyxFQUFFO0lBQzNDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsVUFBVSxFQUFFO1lBQ1YsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGtCQUFrQjtZQUM5QyxxQkFBcUI7U0FDRDtRQUN0QixVQUFVLEVBQUUsQ0FBQztRQUNiLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBcUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBcUIsQ0FBQyxDQUFDO1FBQzNGLFdBQVcsRUFBRSxDQUFDO0tBQ2YsQ0FBQztJQUVGLEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtRQUN6QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsdUJBQWUsRUFBQyxNQUFNLEVBQUUsQ0FBQyxjQUFpQyxFQUFFLGVBQWtDLEVBQUUsRUFBRTtRQUNoRyxNQUFNLGlCQUFpQixHQUFHLGdCQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyw0Q0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDbEcsTUFBTSxrQkFBa0IsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXJHLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFcEgsd0RBQXdEO1FBQ3hELHNCQUFzQixDQUNwQixjQUFjLEVBQ2QsQ0FBQyxHQUFHLGNBQWMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQ25FLENBQUM7UUFFRixtQkFBbUI7UUFDbkIsc0JBQXNCLENBQ3BCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsQ0FBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUN4QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FDcEUsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHtcbiAgY29uc3RydWN0UHNidCxcbiAgZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUsXG4gIGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSxcbiAgVGVzdFVuc3BlbnRUeXBlLFxuICBVbnNwZW50VHlwZVAyc2hQMnBrLFxuICBVbnNwZW50VHlwZVB1YktleUhhc2gsXG4gIFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyxcbn0gZnJvbSAnLi4vdGVzdHV0aWxzJztcblxuaW1wb3J0IHsgcnVuQ29tYmluYXRpb25zLCBUeENvbWJvIH0gZnJvbSAnLi90eEdlbic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IHR5cGUgSW5wdXRTY3JpcHRUeXBlID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLlNjcmlwdFR5cGUgfCAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG5cbmNvbnN0IGtleXMgPSBbMSwgMiwgM10ubWFwKCh2KSA9PlxuICB1dHhvbGliLmJpcDMyLmZyb21TZWVkKEJ1ZmZlci5hbGxvYygxNiwgYHRlc3QvMi8ke3Z9YCksIHV0eG9saWIubmV0d29ya3MuYml0Y29pbilcbikgYXMgdXR4b2xpYi5CSVAzMkludGVyZmFjZVtdO1xuXG5jb25zdCByb290V2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXSk7XG5cbmNvbnN0IHRlc3REaW1lbnNpb25zRnJvbVR4ID0gKHR4Q29tYm86IGFueSkgPT4ge1xuICBjb25zdCB7IGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCBleHBlY3RlZERpbXMgfSA9IHR4Q29tYm87XG5cbiAgZGVzY3JpYmUoYENvbWJpbmF0aW9uIGlucHV0cz0ke2lucHV0VHlwZXN9OyBvdXRwdXRzPSR7b3V0cHV0VHlwZXN9YCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5JbnB1dHMgPSBpbnB1dFR5cGVzLmxlbmd0aDtcbiAgICBjb25zdCBvdXRwdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4ub3V0cHV0VHlwZXMubWFwKGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuXG4gICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmcm9tIHVuc2lnbmVkIHRyYW5zYWN0aW9uYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHR4Q29tYm8uZ2V0VW5zaWduZWRUeCgpO1xuXG4gICAgICAvLyBkb2VzIG5vdCB3b3JrIGZvciB1bnNpZ25lZCB0cmFuc2FjdGlvbnNcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWRUeCkpO1xuXG4gICAgICAvLyB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkXG4gICAgICBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih1bnNpZ25lZFR4LCB7IGFzc3VtZVVuc2lnbmVkOiBEaW1lbnNpb25zLkFTU1VNRV9QMlNIIH0pLnNob3VsZC5lcWwoXG4gICAgICAgIERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IG5JbnB1dHMgfSwgb3V0cHV0RGltcylcbiAgICAgICk7XG5cbiAgICAgIERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgsIHsgYXNzdW1lVW5zaWduZWQ6IERpbWVuc2lvbnMuQVNTVU1FX1AyU0hfUDJXU0ggfSkuc2hvdWxkLmVxbChcbiAgICAgICAgRGltZW5zaW9ucy5zdW0oeyBuUDJzaFAyd3NoSW5wdXRzOiBuSW5wdXRzIH0sIG91dHB1dERpbXMpXG4gICAgICApO1xuXG4gICAgICBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih1bnNpZ25lZFR4LCB7IGFzc3VtZVVuc2lnbmVkOiBEaW1lbnNpb25zLkFTU1VNRV9QMldTSCB9KS5zaG91bGQuZXFsKFxuICAgICAgICBEaW1lbnNpb25zLnN1bSh7IG5QMndzaElucHV0czogbklucHV0cyB9LCBvdXRwdXREaW1zKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZm9yIHNpZ25lZCB0cmFuc2FjdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih0eENvbWJvLmdldFNpZ25lZFR4KCkpO1xuICAgICAgZGltZW5zaW9ucy5zaG91bGQuZXFsKGV4cGVjdGVkRGltcyk7XG4gICAgfSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZvciBzaWduZWQgaW5wdXQgb2YgdHJhbnNhY3Rpb25gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IHR4Q29tYm8uZ2V0U2lnbmVkVHgoKTtcblxuICAgICAgLy8gdGVzdCBEaW1lbnNpb25zLmZyb21JbnB1dCgpXG4gICAgICBpbnB1dFR5cGVzLmZvckVhY2goKGlucHV0OiBhbnksIGk6IG51bWJlcikgPT5cbiAgICAgICAgRGltZW5zaW9ucy5mcm9tSW5wdXQoc2lnbmVkVHguaW5zW2ldKS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKGlucHV0KSkpXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmNvbnN0IHRlc3REaW1lbnNpb25zRnJvbVBzYnQgPSAoXG4gIGtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMsXG4gIGlucHV0VHlwZXM6IElucHV0U2NyaXB0VHlwZVtdLFxuICBvdXRwdXRUeXBlczogVGVzdFVuc3BlbnRUeXBlW10sXG4gIGV4cGVjdGVkRGltczogRGltZW5zaW9uc1xuKSA9PiB7XG4gIGRlc2NyaWJlKGBQc2J0IENvbWJpbmF0aW9uIGlucHV0cz0ke2lucHV0VHlwZXN9OyBvdXRwdXRzPSR7b3V0cHV0VHlwZXN9YCwgZnVuY3Rpb24gKCkge1xuICAgIChbJ3Vuc2lnbmVkJywgJ2hhbGZzaWduZWQnLCAnZnVsbHlzaWduZWQnXSBhcyBjb25zdCkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmcm9tICR7c30gcHNidGAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVBzYnQoY29uc3RydWN0UHNidChrZXlzLCBpbnB1dFR5cGVzLCBvdXRwdXRUeXBlcywgcykpO1xuICAgICAgICBkaW1lbnNpb25zLnNob3VsZC5lcWwoZXhwZWN0ZWREaW1zKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmb3Igc2lnbmVkIGlucHV0IG9mIHBzYnRgLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaWduZWRQc2J0ID0gY29uc3RydWN0UHNidChrZXlzLCBpbnB1dFR5cGVzLCBvdXRwdXRUeXBlcywgJ2Z1bGx5c2lnbmVkJyk7XG5cbiAgICAgIGlucHV0VHlwZXMuZm9yRWFjaCgoaW5wdXQ6IGFueSwgaTogbnVtYmVyKSA9PlxuICAgICAgICBEaW1lbnNpb25zLmZyb21Qc2J0SW5wdXQoc2lnbmVkUHNidC5kYXRhLmlucHV0c1tpXSkuc2hvdWxkLmVxbChcbiAgICAgICAgICBEaW1lbnNpb25zLnN1bShnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZShpbnB1dCkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuZGVzY3JpYmUoYERpbWVuc2lvbnMgZm9yIHRyYW5zYWN0aW9uIGNvbWJpbmF0aW9uc2AsIGZ1bmN0aW9uICgpIHtcbiAgLy8gcDJ0ck11c2lnMiBpcyBzdXBwb3J0ZWQgb25seSB3aXRoIFBTQlRcbiAgY29uc3Qgc2NyaXB0VHlwZXMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZpbHRlcigodCkgPT4gdCAhPT0gJ3AydHJNdXNpZzInKTtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGlucHV0VHlwZXM6IFsuLi5zY3JpcHRUeXBlcywgVW5zcGVudFR5cGVQMnNoUDJwa10gYXMgSW5wdXRTY3JpcHRUeXBlW10sXG4gICAgbWF4TklucHV0czogMixcbiAgICBvdXRwdXRUeXBlczogWy4uLnNjcmlwdFR5cGVzLCAuLi5PYmplY3Qua2V5cyhVbnNwZW50VHlwZVB1YktleUhhc2gpXSBhcyBUZXN0VW5zcGVudFR5cGVbXSxcbiAgICBtYXhOT3V0cHV0czogMixcbiAgfTtcblxuICBydW5Db21iaW5hdGlvbnMocGFyYW1zLCAoaW5wdXRUeXBlQ29tYm86IElucHV0U2NyaXB0VHlwZVtdLCBvdXRwdXRUeXBlQ29tYm86IFRlc3RVbnNwZW50VHlwZVtdKSA9PiB7XG4gICAgY29uc3QgZXhwZWN0ZWRJbnB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5pbnB1dFR5cGVDb21iby5tYXAoZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcbiAgICBjb25zdCBleHBlY3RlZE91dHB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5vdXRwdXRUeXBlQ29tYm8ubWFwKGdldE91dHB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tVHgoXG4gICAgICBuZXcgVHhDb21ibyhrZXlzLCBpbnB1dFR5cGVDb21ibywgb3V0cHV0VHlwZUNvbWJvLCBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykpXG4gICAgKTtcblxuICAgIC8vIERvdWJsaW5nIHRoZSBpbnB1dHMgc2hvdWxkIHlpZWxkIHR3aWNlIHRoZSBpbnB1dCBkaW1zXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tVHgoXG4gICAgICBuZXcgVHhDb21ibyhcbiAgICAgICAga2V5cyxcbiAgICAgICAgWy4uLmlucHV0VHlwZUNvbWJvLCAuLi5pbnB1dFR5cGVDb21ib10sXG4gICAgICAgIG91dHB1dFR5cGVDb21ibyxcbiAgICAgICAgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZElucHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIFNhbWUgZm9yIG91dHB1dHNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21UeChcbiAgICAgIG5ldyBUeENvbWJvKFxuICAgICAgICBrZXlzLFxuICAgICAgICBpbnB1dFR5cGVDb21ibyxcbiAgICAgICAgWy4uLm91dHB1dFR5cGVDb21ibywgLi4ub3V0cHV0VHlwZUNvbWJvXSxcbiAgICAgICAgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZE91dHB1dERpbXMpLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKGBEaW1lbnNpb25zIGZvciBQU0JUIGNvbWJpbmF0aW9uc2AsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGlucHV0VHlwZXM6IFtcbiAgICAgIC4uLnV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMsXG4gICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZVAyc2hQMnBrLFxuICAgICAgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnLFxuICAgIF0gYXMgSW5wdXRTY3JpcHRUeXBlW10sXG4gICAgbWF4TklucHV0czogMSxcbiAgICBvdXRwdXRUeXBlczogWy4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyksIC4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlUHViS2V5SGFzaCldLFxuICAgIG1heE5PdXRwdXRzOiAxLFxuICB9O1xuXG4gIGl0KGBkb2VzIG5vdCB3b3JrIGZvciB1bmtub3duIHBzYnQgaW5wdXRgLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4gfSk7XG4gICAgcHNidC5hZGRJbnB1dCh7IGhhc2g6IEJ1ZmZlci5hbGxvYygzMiksIGluZGV4OiAwIH0pO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KSk7XG4gIH0pO1xuXG4gIHJ1bkNvbWJpbmF0aW9ucyhwYXJhbXMsIChpbnB1dFR5cGVDb21ibzogSW5wdXRTY3JpcHRUeXBlW10sIG91dHB1dFR5cGVDb21ibzogVGVzdFVuc3BlbnRUeXBlW10pID0+IHtcbiAgICBjb25zdCBleHBlY3RlZElucHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLmlucHV0VHlwZUNvbWJvLm1hcChnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLm91dHB1dFR5cGVDb21iby5tYXAoZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG5cbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21Qc2J0KHJvb3RXYWxsZXRLZXlzLCBpbnB1dFR5cGVDb21ibywgb3V0cHV0VHlwZUNvbWJvLCBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykpO1xuXG4gICAgLy8gRG91YmxpbmcgdGhlIGlucHV0cyBzaG91bGQgeWllbGQgdHdpY2UgdGhlIGlucHV0IGRpbXNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21Qc2J0KFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICBbLi4uaW5wdXRUeXBlQ29tYm8sIC4uLmlucHV0VHlwZUNvbWJvXSxcbiAgICAgIG91dHB1dFR5cGVDb21ibyxcbiAgICAgIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRJbnB1dERpbXMpLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKVxuICAgICk7XG5cbiAgICAvLyBTYW1lIGZvciBvdXRwdXRzXG4gICAgdGVzdERpbWVuc2lvbnNGcm9tUHNidChcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAgaW5wdXRUeXBlQ29tYm8sXG4gICAgICBbLi4ub3V0cHV0VHlwZUNvbWJvLCAuLi5vdXRwdXRUeXBlQ29tYm9dLFxuICAgICAgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZE91dHB1dERpbXMpLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKVxuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=