@bitgo/sdk-coin-ethw 20.3.2 → 20.3.3

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.
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/integration/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIiXX0=
@@ -0,0 +1,3 @@
1
+ import { TestBitGoAPI } from '@bitgo/sdk-test';
2
+ export declare function nockEthwRecovery(bitgo: TestBitGoAPI, nockData?: any[]): void;
3
+ //# sourceMappingURL=recovery-nocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-nocks.d.ts","sourceRoot":"","sources":["../../../test/lib/recovery-nocks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA+J/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAc,GAAG,IAAI,CAUlF"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.nockEthwRecovery = nockEthwRecovery;
7
+ const nock_1 = __importDefault(require("nock"));
8
+ const nockEthData = [
9
+ {
10
+ params: {
11
+ method: 'eth_getTransactionCount',
12
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
13
+ },
14
+ response: {
15
+ result: '0x0',
16
+ id: 0,
17
+ jsonrpc: '2.0',
18
+ },
19
+ },
20
+ {
21
+ params: {
22
+ method: 'eth_getBalance',
23
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
24
+ },
25
+ response: {
26
+ result: '0x16345785d8a0000',
27
+ id: 0,
28
+ jsonrpc: '2.0',
29
+ },
30
+ },
31
+ {
32
+ params: {
33
+ method: 'eth_getBalance',
34
+ params: ['0x5df5a96b478bb1808140d87072143e60262e8670', 'latest'],
35
+ },
36
+ response: {
37
+ result: '0x1e87f85809dc0000',
38
+ id: 0,
39
+ jsonrpc: '2.0',
40
+ },
41
+ },
42
+ {
43
+ params: {
44
+ method: 'eth_getTransactionCount',
45
+ params: ['0xba6d9d82cf2920c544b834b72f4c6d11a3ef3de6', 'latest'],
46
+ },
47
+ response: {
48
+ result: '0x0',
49
+ id: 0,
50
+ jsonrpc: '2.0',
51
+ },
52
+ },
53
+ {
54
+ params: {
55
+ method: 'eth_getBalance',
56
+ params: ['0xba6d9d82cf2920c544b834b72f4c6d11a3ef3de6', 'latest'],
57
+ },
58
+ response: {
59
+ result: '0x0',
60
+ id: 0,
61
+ jsonrpc: '2.0',
62
+ },
63
+ },
64
+ {
65
+ params: {
66
+ method: 'eth_getTransactionCount',
67
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
68
+ },
69
+ response: {
70
+ result: '0x0',
71
+ id: 0,
72
+ jsonrpc: '2.0',
73
+ },
74
+ },
75
+ {
76
+ params: {
77
+ method: 'eth_getBalance',
78
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
79
+ },
80
+ response: {
81
+ result: '0x16345785d8a0000',
82
+ id: 0,
83
+ jsonrpc: '2.0',
84
+ },
85
+ },
86
+ {
87
+ params: {
88
+ method: 'eth_getBalance',
89
+ params: ['0x5df5a96b478bb1808140d87072143e60262e8670', 'latest'],
90
+ },
91
+ response: {
92
+ result: '0x1e87f85809dc0000',
93
+ id: 0,
94
+ jsonrpc: '2.0',
95
+ },
96
+ },
97
+ {
98
+ params: {
99
+ method: 'eth_call',
100
+ params: [{ to: '0x5df5a96b478bb1808140d87072143e60262e8670', data: '0xa0b7967b' }, 'latest'],
101
+ },
102
+ response: {
103
+ jsonrpc: '2.0',
104
+ result: '0x0000000000000000000000000000000000000000000000000000000000000001',
105
+ id: 0,
106
+ },
107
+ },
108
+ {
109
+ params: {
110
+ method: 'eth_getBalance',
111
+ params: ['0xa1a88a502274073b1bc4fe06ea0f5fe77e151b91', 'latest'],
112
+ },
113
+ response: {
114
+ result: '0x470de4df820000',
115
+ id: 0,
116
+ jsonrpc: '2.0',
117
+ },
118
+ },
119
+ {
120
+ params: {
121
+ method: 'eth_getTransactionCount',
122
+ params: ['0xa1a88a502274073b1bc4fe06ea0f5fe77e151b91', 'latest'],
123
+ },
124
+ response: {
125
+ result: '0x1',
126
+ id: 0,
127
+ jsonrpc: '2.0',
128
+ },
129
+ },
130
+ {
131
+ params: {
132
+ method: 'eth_getTransactionCount',
133
+ params: ['0xa1a88a502274073b1bc4fe06ea0f5fe77e151b91', 'latest'],
134
+ },
135
+ response: {
136
+ result: '0x1',
137
+ id: 0,
138
+ jsonrpc: '2.0',
139
+ },
140
+ },
141
+ {
142
+ params: {
143
+ method: 'eth_call',
144
+ params: [{ to: '0xdf07117705a9f8dc4c2a78de66b7f1797dba9d4e', data: '0xa0b7967b' }, 'latest'],
145
+ },
146
+ response: {
147
+ jsonrpc: '2.0',
148
+ result: '0x0000000000000000000000000000000000000000000000000000000000002a7f',
149
+ id: 0,
150
+ },
151
+ },
152
+ {
153
+ params: {
154
+ method: 'eth_getBalance',
155
+ params: ['0xdf07117705a9f8dc4c2a78de66b7f1797dba9d4e', 'latest'],
156
+ },
157
+ response: {
158
+ result: '0x8ac7230489e7ffb8',
159
+ id: 0,
160
+ jsonrpc: '2.0',
161
+ },
162
+ },
163
+ ];
164
+ function nockEthwRecovery(bitgo, nockData = nockEthData) {
165
+ nockData.forEach((data) => {
166
+ (0, nock_1.default)('https://mainnet.ethereumpow.org')
167
+ .post('/', {
168
+ jsonrpc: '2.0',
169
+ id: 0,
170
+ ...data.params,
171
+ })
172
+ .reply(200, data.response);
173
+ });
174
+ }
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3Zlcnktbm9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2xpYi9yZWNvdmVyeS1ub2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlLQSw0Q0FVQztBQTNLRCxnREFBd0I7QUFJeEIsTUFBTSxXQUFXLEdBQVU7SUFDekI7UUFDRSxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUseUJBQXlCO1lBQ2pDLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxLQUFLO1lBQ2IsRUFBRSxFQUFFLENBQUM7WUFDTCxPQUFPLEVBQUUsS0FBSztTQUNmO0tBQ0Y7SUFDRDtRQUNFLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsTUFBTSxFQUFFLG1CQUFtQjtZQUMzQixFQUFFLEVBQUUsQ0FBQztZQUNMLE9BQU8sRUFBRSxLQUFLO1NBQ2Y7S0FDRjtJQUNEO1FBQ0UsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLGdCQUFnQjtZQUN4QixNQUFNLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxRQUFRLENBQUM7U0FDakU7UUFDRCxRQUFRLEVBQUU7WUFDUixNQUFNLEVBQUUsb0JBQW9CO1lBQzVCLEVBQUUsRUFBRSxDQUFDO1lBQ0wsT0FBTyxFQUFFLEtBQUs7U0FDZjtLQUNGO0lBQ0Q7UUFDRSxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUseUJBQXlCO1lBQ2pDLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxLQUFLO1lBQ2IsRUFBRSxFQUFFLENBQUM7WUFDTCxPQUFPLEVBQUUsS0FBSztTQUNmO0tBQ0Y7SUFDRDtRQUNFLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsTUFBTSxFQUFFLEtBQUs7WUFDYixFQUFFLEVBQUUsQ0FBQztZQUNMLE9BQU8sRUFBRSxLQUFLO1NBQ2Y7S0FDRjtJQUNEO1FBQ0UsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxNQUFNLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxRQUFRLENBQUM7U0FDakU7UUFDRCxRQUFRLEVBQUU7WUFDUixNQUFNLEVBQUUsS0FBSztZQUNiLEVBQUUsRUFBRSxDQUFDO1lBQ0wsT0FBTyxFQUFFLEtBQUs7U0FDZjtLQUNGO0lBQ0Q7UUFDRSxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsRUFBRSxFQUFFLENBQUM7WUFDTCxPQUFPLEVBQUUsS0FBSztTQUNmO0tBQ0Y7SUFDRDtRQUNFLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixFQUFFLEVBQUUsQ0FBQztZQUNMLE9BQU8sRUFBRSxLQUFLO1NBQ2Y7S0FDRjtJQUNEO1FBQ0UsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsNENBQTRDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsQ0FBQztTQUM3RjtRQUNELFFBQVEsRUFBRTtZQUNSLE9BQU8sRUFBRSxLQUFLO1lBQ2QsTUFBTSxFQUFFLG9FQUFvRTtZQUM1RSxFQUFFLEVBQUUsQ0FBQztTQUNOO0tBQ0Y7SUFDRDtRQUNFLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLENBQUMsNENBQTRDLEVBQUUsUUFBUSxDQUFDO1NBQ2pFO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixFQUFFLEVBQUUsQ0FBQztZQUNMLE9BQU8sRUFBRSxLQUFLO1NBQ2Y7S0FDRjtJQUNEO1FBQ0UsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxNQUFNLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxRQUFRLENBQUM7U0FDakU7UUFDRCxRQUFRLEVBQUU7WUFDUixNQUFNLEVBQUUsS0FBSztZQUNiLEVBQUUsRUFBRSxDQUFDO1lBQ0wsT0FBTyxFQUFFLEtBQUs7U0FDZjtLQUNGO0lBQ0Q7UUFDRSxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUseUJBQXlCO1lBQ2pDLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxLQUFLO1lBQ2IsRUFBRSxFQUFFLENBQUM7WUFDTCxPQUFPLEVBQUUsS0FBSztTQUNmO0tBQ0Y7SUFDRDtRQUNFLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLDRDQUE0QyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxRQUFRLENBQUM7U0FDN0Y7UUFDRCxRQUFRLEVBQUU7WUFDUixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxvRUFBb0U7WUFDNUUsRUFBRSxFQUFFLENBQUM7U0FDTjtLQUNGO0lBQ0Q7UUFDRSxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQztTQUNqRTtRQUNELFFBQVEsRUFBRTtZQUNSLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsRUFBRSxFQUFFLENBQUM7WUFDTCxPQUFPLEVBQUUsS0FBSztTQUNmO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsU0FBZ0IsZ0JBQWdCLENBQUMsS0FBbUIsRUFBRSxRQUFRLEdBQUcsV0FBVztJQUMxRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsSUFBQSxjQUFJLEVBQUMsaUNBQWlDLENBQUM7YUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULE9BQU8sRUFBRSxLQUFLO1lBQ2QsRUFBRSxFQUFFLENBQUM7WUFDTCxHQUFHLElBQUksQ0FBQyxNQUFNO1NBQ2YsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuXG5pbXBvcnQgeyBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuXG5jb25zdCBub2NrRXRoRGF0YTogYW55W10gPSBbXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgIHBhcmFtczogWycweDc0YzIxMzdkNTRiMGZjOWY5MDdlMTNmMTRlMGRkMTg0ODVmZWU5MjQnLCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAgcmVzdWx0OiAnMHgwJyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgcGFyYW1zOiBbJzB4NzRjMjEzN2Q1NGIwZmM5ZjkwN2UxM2YxNGUwZGQxODQ4NWZlZTkyNCcsICdsYXRlc3QnXSxcbiAgICB9LFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICByZXN1bHQ6ICcweDE2MzQ1Nzg1ZDhhMDAwMCcsXG4gICAgICBpZDogMCxcbiAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgIHBhcmFtczogWycweDVkZjVhOTZiNDc4YmIxODA4MTQwZDg3MDcyMTQzZTYwMjYyZTg2NzAnLCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAgcmVzdWx0OiAnMHgxZTg3Zjg1ODA5ZGMwMDAwJyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2dldFRyYW5zYWN0aW9uQ291bnQnLFxuICAgICAgcGFyYW1zOiBbJzB4YmE2ZDlkODJjZjI5MjBjNTQ0YjgzNGI3MmY0YzZkMTFhM2VmM2RlNicsICdsYXRlc3QnXSxcbiAgICB9LFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICByZXN1bHQ6ICcweDAnLFxuICAgICAgaWQ6IDAsXG4gICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgcGFyYW1zOiB7XG4gICAgICBtZXRob2Q6ICdldGhfZ2V0QmFsYW5jZScsXG4gICAgICBwYXJhbXM6IFsnMHhiYTZkOWQ4MmNmMjkyMGM1NDRiODM0YjcyZjRjNmQxMWEzZWYzZGU2JywgJ2xhdGVzdCddLFxuICAgIH0sXG4gICAgcmVzcG9uc2U6IHtcbiAgICAgIHJlc3VsdDogJzB4MCcsXG4gICAgICBpZDogMCxcbiAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgIHBhcmFtczogWycweDc0YzIxMzdkNTRiMGZjOWY5MDdlMTNmMTRlMGRkMTg0ODVmZWU5MjQnLCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAgcmVzdWx0OiAnMHgwJyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgcGFyYW1zOiBbJzB4NzRjMjEzN2Q1NGIwZmM5ZjkwN2UxM2YxNGUwZGQxODQ4NWZlZTkyNCcsICdsYXRlc3QnXSxcbiAgICB9LFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICByZXN1bHQ6ICcweDE2MzQ1Nzg1ZDhhMDAwMCcsXG4gICAgICBpZDogMCxcbiAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgIHBhcmFtczogWycweDVkZjVhOTZiNDc4YmIxODA4MTQwZDg3MDcyMTQzZTYwMjYyZTg2NzAnLCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAgcmVzdWx0OiAnMHgxZTg3Zjg1ODA5ZGMwMDAwJyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2NhbGwnLFxuICAgICAgcGFyYW1zOiBbeyB0bzogJzB4NWRmNWE5NmI0NzhiYjE4MDgxNDBkODcwNzIxNDNlNjAyNjJlODY3MCcsIGRhdGE6ICcweGEwYjc5NjdiJyB9LCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICByZXN1bHQ6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLFxuICAgICAgaWQ6IDAsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgcGFyYW1zOiBbJzB4YTFhODhhNTAyMjc0MDczYjFiYzRmZTA2ZWEwZjVmZTc3ZTE1MWI5MScsICdsYXRlc3QnXSxcbiAgICB9LFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICByZXN1bHQ6ICcweDQ3MGRlNGRmODIwMDAwJyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHBhcmFtczoge1xuICAgICAgbWV0aG9kOiAnZXRoX2dldFRyYW5zYWN0aW9uQ291bnQnLFxuICAgICAgcGFyYW1zOiBbJzB4YTFhODhhNTAyMjc0MDczYjFiYzRmZTA2ZWEwZjVmZTc3ZTE1MWI5MScsICdsYXRlc3QnXSxcbiAgICB9LFxuICAgIHJlc3BvbnNlOiB7XG4gICAgICByZXN1bHQ6ICcweDEnLFxuICAgICAgaWQ6IDAsXG4gICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgcGFyYW1zOiB7XG4gICAgICBtZXRob2Q6ICdldGhfZ2V0VHJhbnNhY3Rpb25Db3VudCcsXG4gICAgICBwYXJhbXM6IFsnMHhhMWE4OGE1MDIyNzQwNzNiMWJjNGZlMDZlYTBmNWZlNzdlMTUxYjkxJywgJ2xhdGVzdCddLFxuICAgIH0sXG4gICAgcmVzcG9uc2U6IHtcbiAgICAgIHJlc3VsdDogJzB4MScsXG4gICAgICBpZDogMCxcbiAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAgICAgIHBhcmFtczogW3sgdG86ICcweGRmMDcxMTc3MDVhOWY4ZGM0YzJhNzhkZTY2YjdmMTc5N2RiYTlkNGUnLCBkYXRhOiAnMHhhMGI3OTY3YicgfSwgJ2xhdGVzdCddLFxuICAgIH0sXG4gICAgcmVzcG9uc2U6IHtcbiAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgcmVzdWx0OiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyYTdmJyxcbiAgICAgIGlkOiAwLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG1ldGhvZDogJ2V0aF9nZXRCYWxhbmNlJyxcbiAgICAgIHBhcmFtczogWycweGRmMDcxMTc3MDVhOWY4ZGM0YzJhNzhkZTY2YjdmMTc5N2RiYTlkNGUnLCAnbGF0ZXN0J10sXG4gICAgfSxcbiAgICByZXNwb25zZToge1xuICAgICAgcmVzdWx0OiAnMHg4YWM3MjMwNDg5ZTdmZmI4JyxcbiAgICAgIGlkOiAwLFxuICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBub2NrRXRod1JlY292ZXJ5KGJpdGdvOiBUZXN0Qml0R29BUEksIG5vY2tEYXRhID0gbm9ja0V0aERhdGEpOiB2b2lkIHtcbiAgbm9ja0RhdGEuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgIG5vY2soJ2h0dHBzOi8vbWFpbm5ldC5ldGhlcmV1bXBvdy5vcmcnKVxuICAgICAgLnBvc3QoJy8nLCB7XG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogMCxcbiAgICAgICAgLi4uZGF0YS5wYXJhbXMsXG4gICAgICB9KVxuICAgICAgLnJlcGx5KDIwMCwgZGF0YS5yZXNwb25zZSk7XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/unit/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,262 @@
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 nock = __importStar(require("nock"));
37
+ const should = __importStar(require("should"));
38
+ const sdk_test_1 = require("@bitgo/sdk-test");
39
+ const sdk_api_1 = require("@bitgo/sdk-api");
40
+ const index_1 = require("../../src/index");
41
+ const recovery_nocks_1 = require("../lib/recovery-nocks");
42
+ nock.disableNetConnect();
43
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
44
+ bitgo.safeRegister('ethw', index_1.Ethw.createInstance);
45
+ describe('Ethereum pow', function () {
46
+ let basecoin;
47
+ before(function () {
48
+ bitgo.initializeTestVars();
49
+ basecoin = bitgo.coin('ethw');
50
+ });
51
+ after(function () {
52
+ nock.cleanAll();
53
+ });
54
+ it('should instantiate the coin', function () {
55
+ const basecoin = bitgo.coin('ethw');
56
+ basecoin.should.be.an.instanceof(index_1.Ethw);
57
+ });
58
+ describe('Recover Ethereum PoW', function () {
59
+ beforeEach(() => {
60
+ nock.cleanAll();
61
+ });
62
+ let recoveryParams;
63
+ before(() => {
64
+ recoveryParams = {
65
+ userKey: '{"iv":"+TkmT3GJ5msVWQjBrt3lsw==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
66
+ ':"ccm","adata":"","cipher":"aes","salt":"cCE20fGIobs=","ct":"NVIdYIh91J3aRI\n' +
67
+ '8GG0JE3DhXW3AUmz2G5RqMejdz1+t4/vovIP7lleegI7VYyWiiLvlM0OCFf3EVvV/RyXr8+2vsn\n' +
68
+ 'Q0Vn8c2CV5FRZ80OjGYrW3A/6T/zpOz6E8CMvnD++iIpeO4r2eZJavejZxdzlxF0BRz7VI="}',
69
+ backupKey: '{"iv":"asB356ofC7nZtg4NBvQkiQ==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
70
+ ':"ccm","adata":"","cipher":"aes","salt":"1hr2HhBbBIk=","ct":"8CZc6upt+XNOto\n' +
71
+ 'KDD38TUg3ZUjzW+DraZlkcku2bNp0JS2s1g/iC6YTGUGtPoxDxumDlXwlWQx+5WPjZu79M8DCrI\n' +
72
+ 't9aZaOvHkGH9aFtMbavFX419TcrwDmpUeQFN0hRkfrIHXyHNbTpGSVAjHvHMtzDMaw+ACg="}',
73
+ walletPassphrase: sdk_test_1.TestBitGo.V2.TEST_RECOVERY_PASSCODE,
74
+ walletContractAddress: '0x5df5a96b478bb1808140d87072143e60262e8670',
75
+ recoveryDestination: '0xac05da78464520aa7c9d4c19bd7a440b111b3054',
76
+ replayProtectionOptions: {
77
+ chain: 10001,
78
+ },
79
+ };
80
+ });
81
+ it('should throw on invalid gasLimit', async function () {
82
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
83
+ await basecoin
84
+ .recover({
85
+ ...recoveryParams,
86
+ gasLimit: -400000,
87
+ gasPrice: 25000000000,
88
+ })
89
+ .should.be.rejectedWith('Gas limit must be between 30000 and 20000000');
90
+ });
91
+ it('should throw if etherscan errs', async function () {
92
+ const nockUnsuccessfulEtherscanData = [
93
+ {
94
+ params: {
95
+ method: 'eth_getTransactionCount',
96
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
97
+ },
98
+ response: {
99
+ result: '0x0',
100
+ id: 0,
101
+ jsonrpc: '2.0',
102
+ },
103
+ },
104
+ {
105
+ params: {
106
+ method: 'eth_getBalance',
107
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
108
+ },
109
+ response: {
110
+ error: {
111
+ code: -32602,
112
+ message: 'invalid argument 0: json: cannot unmarshal hex string of odd length into Go value of type common.Address',
113
+ },
114
+ id: 0,
115
+ jsonrpc: '2.0',
116
+ },
117
+ },
118
+ ];
119
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo, nockUnsuccessfulEtherscanData);
120
+ await basecoin
121
+ .recover(recoveryParams)
122
+ .should.be.rejectedWith('ETHW full node error: -32602 - invalid argument 0: json: cannot unmarshal hex string of odd length into Go value of type common.Address');
123
+ });
124
+ it('should throw if backup key address has insufficient balance', async function () {
125
+ const insufficientFeeData = [
126
+ {
127
+ params: {
128
+ method: 'eth_getTransactionCount',
129
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
130
+ },
131
+ response: {
132
+ id: 0,
133
+ jsonrpc: '2.0',
134
+ result: '0x0',
135
+ },
136
+ },
137
+ {
138
+ params: {
139
+ method: 'eth_getBalance',
140
+ params: ['0x74c2137d54b0fc9f907e13f14e0dd18485fee924', 'latest'],
141
+ },
142
+ response: {
143
+ id: 0,
144
+ jsonrpc: '2.0',
145
+ result: '0x4d2',
146
+ },
147
+ },
148
+ ];
149
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo, insufficientFeeData);
150
+ await basecoin
151
+ .recover({
152
+ ...recoveryParams,
153
+ gasLimit: 300000,
154
+ gasPrice: 1000000000,
155
+ })
156
+ .should.be.rejectedWith('Backup key address 0x74c2137d54b0fc9f907e13f14e0dd18485fee924 has balance 0.000001234 Gwei.' +
157
+ 'This address must have a balance of at least 300000 Gwei to perform recoveries. Try sending some ETH to this address then retry.');
158
+ });
159
+ it('should throw on invalid gasPrice', async function () {
160
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
161
+ await basecoin
162
+ .recover({
163
+ ...recoveryParams,
164
+ gasLimit: 400000,
165
+ gasPrice: 2500000,
166
+ })
167
+ .should.be.rejectedWith('Gas price must be between 1000000000 and 2500000000000');
168
+ });
169
+ it('should successfully construct a tx with custom gas price and limit', async function () {
170
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
171
+ const recovery = await basecoin.recover({
172
+ ...recoveryParams,
173
+ gasLimit: 400000,
174
+ gasPrice: 1000000000,
175
+ });
176
+ // id and tx will always be different because of expireTime
177
+ should.exist(recovery);
178
+ recovery.should.have.property('id');
179
+ recovery.should.have.property('tx');
180
+ await checkRecoveryTxExplanation(recovery.tx, 2200000000000000000, recoveryParams.recoveryDestination);
181
+ });
182
+ it('should construct a recovery transaction without BitGo', async function () {
183
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
184
+ const recovery = await basecoin.recover(recoveryParams);
185
+ // id and tx will always be different because of expireTime
186
+ should.exist(recovery);
187
+ recovery.should.have.property('id');
188
+ recovery.should.have.property('tx');
189
+ await checkRecoveryTxExplanation(recovery.tx, 2200000000000000000, recoveryParams.recoveryDestination);
190
+ });
191
+ it('should construct a recovery transaction without BitGo and with KRS', async function () {
192
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
193
+ const recovery = await basecoin.recover({
194
+ ...recoveryParams,
195
+ backupKey: 'xpub661MyMwAqRbcGsCNiG4BzbxLmXnJFo4K5gVSE2b9AxufAtpuTun1SYwg9Uykqqf4DrKrDZ6KqPm9ehthWbCma7pnaMrtXY11nY7MeFbEDPm',
196
+ krsProvider: 'keyternal',
197
+ });
198
+ // id and tx will always be different because of expireTime
199
+ should.exist(recovery);
200
+ recovery.should.have.property('id');
201
+ recovery.should.have.property('tx');
202
+ await checkRecoveryTxExplanation(recovery.tx, 2200000000000000000, recoveryParams.recoveryDestination);
203
+ });
204
+ it('should error when the backup key is unfunded (cannot pay gas)', async function () {
205
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
206
+ await basecoin
207
+ .recover({
208
+ userKey: '{"iv":"VNvG6t3fHfxMcfvNuafYYA==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
209
+ ':"ccm","adata":"","cipher":"aes","salt":"mc9pCk3H43w=","ct":"Qe4Z1evaXcrOMC\n' +
210
+ 'cQ/XMVVBO9M/99D1QQ6LxkG8z3fQtwwOVXM3/6doNrriprUqs+adpFC93KRcAaDroL1E6o17J2k\n' +
211
+ 'mcpXRd2CuXRFORZmZ/6QBfjKfCJ3aq0kEkDVv37gZNVT3aNtGkNSQdCEWKQLwd1++r5AkA="}\n',
212
+ backupKey: '{"iv":"EjD7x0OJX9kNM/C3yEDvyQ==","v":1,"iter":10000,"ks":256,"ts":64,"mode"\n' +
213
+ ':"ccm","adata":"","cipher":"aes","salt":"Na9NvRRe3n8=","ct":"B/AtSLHolsdNLr\n' +
214
+ '4Dlij4kQ0E6NyUUs6wo6T2HtPDAPO0hyhPPbh1OAYqIS7VlL9xmJRFC2zPxwRJvzf6OWC/m48HX\n' +
215
+ 'vgLoXYgahArhalzJVlRxcXUz4HOhozRWfv/eK3t5HJfm+25+WBOiW8YgSE7hVEYTbeBRD4="}',
216
+ walletContractAddress: '0x22ff743216b58aeb3efc46985406b50112e9e176',
217
+ walletPassphrase: sdk_test_1.TestBitGo.V2.TEST_RECOVERY_PASSCODE,
218
+ recoveryDestination: '0xac05da78464520aa7c9d4c19bd7a440b111b3054',
219
+ })
220
+ .should.be.rejectedWith('Backup key address 0xba6d9d82cf2920c544b834b72f4c6d11a3ef3de6 has balance 0 Gwei.This address must have a balance of at least 10000000 Gwei to perform recoveries. Try sending some ETH to this address then retry.');
221
+ });
222
+ it('should generate an ETH unsigned sweep', async function () {
223
+ (0, recovery_nocks_1.nockEthwRecovery)(bitgo);
224
+ const transaction = await basecoin.recover({
225
+ userKey: 'xpub661MyMwAqRbcFXDcWD2vxuebcT1ZpTF4Vke6qmMW8yzddwNYpAPjvYEEL5jLfyYXW2fuxtAxY8TgjPUJLcf1C8qz9N6VgZxArKX4EwB8rH5',
226
+ backupKey: 'xpub661MyMwAqRbcGhSaXikpuTC9KU88Xx9LrjKSw1JKsvXNgabpTdgjy7LSovh9ZHhcqhAHQu7uthu7FguNGdcC4aXTKK5gqTcPe4WvLYRbCSG',
227
+ walletContractAddress: sdk_test_1.TestBitGo.V2.TEST_ETH_WALLET_FIRST_ADDRESS,
228
+ recoveryDestination: sdk_test_1.TestBitGo.V2.TEST_ERC20_TOKEN_RECIPIENT,
229
+ gasPrice: '20000000000',
230
+ gasLimit: '500000',
231
+ });
232
+ should.exist(transaction);
233
+ transaction.should.have.property('tx');
234
+ transaction.should.have.property('contractSequenceId');
235
+ transaction.should.have.property('expireTime');
236
+ transaction.should.have.property('gasLimit');
237
+ transaction.gasLimit.should.equal('500000');
238
+ transaction.should.have.property('gasPrice');
239
+ transaction.gasPrice.should.equal('20000000000');
240
+ transaction.should.have.property('walletContractAddress');
241
+ transaction.walletContractAddress.should.equal(sdk_test_1.TestBitGo.V2.TEST_ETH_WALLET_FIRST_ADDRESS);
242
+ transaction.should.have.property('recipient');
243
+ transaction.recipient.should.have.property('address');
244
+ transaction.recipient.address.should.equal(sdk_test_1.TestBitGo.V2.TEST_ERC20_TOKEN_RECIPIENT);
245
+ transaction.recipient.should.have.property('amount');
246
+ transaction.recipient.amount.should.equal('9999999999999999928');
247
+ checkRecoveryTxExplanation(transaction.tx, 9999999999999999928, sdk_test_1.TestBitGo.V2.TEST_ERC20_TOKEN_RECIPIENT);
248
+ });
249
+ async function checkRecoveryTxExplanation(tx, recoveryAmount, recoveryDestination) {
250
+ const explanation = await basecoin.explainTransaction({ txHex: '0x' + tx, feeInfo: { fee: 1 } });
251
+ explanation.should.have.property('outputs');
252
+ explanation.outputs.should.containEql({
253
+ amount: recoveryAmount.toFixed(),
254
+ address: recoveryDestination,
255
+ });
256
+ explanation.should.have.property('changeOutputs', []);
257
+ explanation.should.have.property('changeAmount', '0');
258
+ explanation.should.have.property('fee', { fee: 1 });
259
+ }
260
+ });
261
+ });
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsK0NBQWlDO0FBRWpDLDhDQUEwRDtBQUMxRCw0Q0FBMEM7QUFFMUMsMkNBQXVDO0FBQ3ZDLDBEQUF5RDtBQUV6RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUV6QixNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFlBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUVoRCxRQUFRLENBQUMsY0FBYyxFQUFFO0lBQ3ZCLElBQUksUUFBUSxDQUFDO0lBRWIsTUFBTSxDQUFDO1FBQ0wsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxLQUFLLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFO1FBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFD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QyxDQUFDLENBQUM7UUFFSCxLQUFLLFVBQVUsMEJBQTBCLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxtQkFBbUI7WUFDL0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUNoQyxPQUFPLEVBQUUsbUJBQW1CO2FBQzdCLENBQUMsQ0FBQztZQUNILFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBFdGh3IH0gZnJvbSAnLi4vLi4vc3JjL2luZGV4JztcbmltcG9ydCB7IG5vY2tFdGh3UmVjb3ZlcnkgfSBmcm9tICcuLi9saWIvcmVjb3Zlcnktbm9ja3MnO1xuXG5ub2NrLmRpc2FibGVOZXRDb25uZWN0KCk7XG5cbmNvbnN0IGJpdGdvOiBUZXN0Qml0R29BUEkgPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG5iaXRnby5zYWZlUmVnaXN0ZXIoJ2V0aHcnLCBFdGh3LmNyZWF0ZUluc3RhbmNlKTtcblxuZGVzY3JpYmUoJ0V0aGVyZXVtIHBvdycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYmFzZWNvaW4gPSBiaXRnby5jb2luKCdldGh3Jyk7XG4gIH0pO1xuXG4gIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmFzZWNvaW4gPSBiaXRnby5jb2luKCdldGh3Jyk7XG4gICAgYmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoRXRodyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZWNvdmVyIEV0aGVyZXVtIFBvVycsIGZ1bmN0aW9uICgpIHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcbiAgICBsZXQgcmVjb3ZlcnlQYXJhbXM7XG4gICAgYmVmb3JlKCgpID0+IHtcbiAgICAgIHJlY292ZXJ5UGFyYW1zID0ge1xuICAgICAgICB1c2VyS2V5OlxuICAgICAgICAgICd7XCJpdlwiOlwiK1RrbVQzR0o1bXNWV1FqQnJ0M2xzdz09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIlxcbicgK1xuICAgICAgICAgICc6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCJjQ0UyMGZHSW9icz1cIixcImN0XCI6XCJOVklkWUloOTFKM2FSSVxcbicgK1xuICAgICAgICAgICc4R0cwSkUzRGhYVzNBVW16Mkc1UnFNZWpkejErdDQvdm92SVA3bGxlZWdJN1ZZeVdpaUx2bE0wT0NGZjNFVnZWL1J5WHI4KzJ2c25cXG4nICtcbiAgICAgICAgICAnUTBWbjhjMkNWNUZSWjgwT2pHWXJXM0EvNlQvenBPejZFOENNdm5EKytpSXBlTzRyMmVaSmF2ZWpaeGR6bHhGMEJSejdWST1cIn0nLFxuICAgICAgICBiYWNrdXBLZXk6XG4gICAgICAgICAgJ3tcIml2XCI6XCJhc0IzNTZvZkM3blp0ZzROQnZRa2lRPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiXFxuJyArXG4gICAgICAgICAgJzpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcIjFocjJIaEJiQklrPVwiLFwiY3RcIjpcIjhDWmM2dXB0K1hOT3RvXFxuJyArXG4gICAgICAgICAgJ0tERDM4VFVnM1pVanpXK0RyYVpsa2NrdTJiTnAwSlMyczFnL2lDNllUR1VHdFBveER4dW1EbFh3bFdReCs1V1BqWnU3OU04RENySVxcbicgK1xuICAgICAgICAgICd0OWFaYU92SGtHSDlhRnRNYmF2Rlg0MTlUY3J3RG1wVWVRRk4waFJrZnJJSFh5SE5iVHBHU1ZBakh2SE10ekRNYXcrQUNnPVwifScsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IFRlc3RCaXRHby5WMi5URVNUX1JFQ09WRVJZX1BBU1NDT0RFLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6ICcweDVkZjVhOTZiNDc4YmIxODA4MTQwZDg3MDcyMTQzZTYwMjYyZTg2NzAnLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiAnMHhhYzA1ZGE3ODQ2NDUyMGFhN2M5ZDRjMTliZDdhNDQwYjExMWIzMDU0JyxcbiAgICAgICAgcmVwbGF5UHJvdGVjdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICBjaGFpbjogMTAwMDEsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIGdhc0xpbWl0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9ja0V0aHdSZWNvdmVyeShiaXRnbyk7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgLi4ucmVjb3ZlcnlQYXJhbXMsXG4gICAgICAgICAgZ2FzTGltaXQ6IC00MDAwMDAsXG4gICAgICAgICAgZ2FzUHJpY2U6IDI1MDAwMDAwMDAwLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnR2FzIGxpbWl0IG11c3QgYmUgYmV0d2VlbiAzMDAwMCBhbmQgMjAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZXRoZXJzY2FuIGVycnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub2NrVW5zdWNjZXNzZnVsRXRoZXJzY2FuRGF0YTogYW55W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JyxcbiAgICAgICAgICAgIHBhcmFtczogWycweDc0YzIxMzdkNTRiMGZjOWY5MDdlMTNmMTRlMGRkMTg0ODVmZWU5MjQnLCAnbGF0ZXN0J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcmVzdWx0OiAnMHgwJyxcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWV0aG9kOiAnZXRoX2dldEJhbGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1zOiBbJzB4NzRjMjEzN2Q1NGIwZmM5ZjkwN2UxM2YxNGUwZGQxODQ4NWZlZTkyNCcsICdsYXRlc3QnXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiAtMzI2MDIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgYXJndW1lbnQgMDoganNvbjogY2Fubm90IHVubWFyc2hhbCBoZXggc3RyaW5nIG9mIG9kZCBsZW5ndGggaW50byBHbyB2YWx1ZSBvZiB0eXBlIGNvbW1vbi5BZGRyZXNzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpZDogMCxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgbm9ja0V0aHdSZWNvdmVyeShiaXRnbywgbm9ja1Vuc3VjY2Vzc2Z1bEV0aGVyc2NhbkRhdGEpO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXIocmVjb3ZlcnlQYXJhbXMpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdFVEhXIGZ1bGwgbm9kZSBlcnJvcjogLTMyNjAyIC0gaW52YWxpZCBhcmd1bWVudCAwOiBqc29uOiBjYW5ub3QgdW5tYXJzaGFsIGhleCBzdHJpbmcgb2Ygb2RkIGxlbmd0aCBpbnRvIEdvIHZhbHVlIG9mIHR5cGUgY29tbW9uLkFkZHJlc3MnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGJhY2t1cCBrZXkgYWRkcmVzcyBoYXMgaW5zdWZmaWNpZW50IGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnN1ZmZpY2llbnRGZWVEYXRhOiBhbnlbXSA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWV0aG9kOiAnZXRoX2dldFRyYW5zYWN0aW9uQ291bnQnLFxuICAgICAgICAgICAgcGFyYW1zOiBbJzB4NzRjMjEzN2Q1NGIwZmM5ZjkwN2UxM2YxNGUwZGQxODQ4NWZlZTkyNCcsICdsYXRlc3QnXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBpZDogMCxcbiAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICAgICAgcmVzdWx0OiAnMHgwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtZXRob2Q6ICdldGhfZ2V0QmFsYW5jZScsXG4gICAgICAgICAgICBwYXJhbXM6IFsnMHg3NGMyMTM3ZDU0YjBmYzlmOTA3ZTEzZjE0ZTBkZDE4NDg1ZmVlOTI0JywgJ2xhdGVzdCddLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgICByZXN1bHQ6ICcweDRkMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBub2NrRXRod1JlY292ZXJ5KGJpdGdvLCBpbnN1ZmZpY2llbnRGZWVEYXRhKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICAuLi5yZWNvdmVyeVBhcmFtcyxcbiAgICAgICAgICBnYXNMaW1pdDogMzAwMDAwLFxuICAgICAgICAgIGdhc1ByaWNlOiAxMDAwMDAwMDAwLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICAnQmFja3VwIGtleSBhZGRyZXNzIDB4NzRjMjEzN2Q1NGIwZmM5ZjkwN2UxM2YxNGUwZGQxODQ4NWZlZTkyNCBoYXMgYmFsYW5jZSAwLjAwMDAwMTIzNCBHd2VpLicgK1xuICAgICAgICAgICAgJ1RoaXMgYWRkcmVzcyBtdXN0IGhhdmUgYSBiYWxhbmNlIG9mIGF0IGxlYXN0IDMwMDAwMCBHd2VpIHRvIHBlcmZvcm0gcmVjb3Zlcmllcy4gVHJ5IHNlbmRpbmcgc29tZSBFVEggdG8gdGhpcyBhZGRyZXNzIHRoZW4gcmV0cnkuJ1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBpbnZhbGlkIGdhc1ByaWNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9ja0V0aHdSZWNvdmVyeShiaXRnbyk7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucmVjb3Zlcih7XG4gICAgICAgICAgLi4ucmVjb3ZlcnlQYXJhbXMsXG4gICAgICAgICAgZ2FzTGltaXQ6IDQwMDAwMCxcbiAgICAgICAgICBnYXNQcmljZTogMjUwMDAwMCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0dhcyBwcmljZSBtdXN0IGJlIGJldHdlZW4gMTAwMDAwMDAwMCBhbmQgMjUwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgY29uc3RydWN0IGEgdHggd2l0aCBjdXN0b20gZ2FzIHByaWNlIGFuZCBsaW1pdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2tFdGh3UmVjb3ZlcnkoYml0Z28pO1xuICAgICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHtcbiAgICAgICAgLi4ucmVjb3ZlcnlQYXJhbXMsXG4gICAgICAgIGdhc0xpbWl0OiA0MDAwMDAsXG4gICAgICAgIGdhc1ByaWNlOiAxMDAwMDAwMDAwLFxuICAgICAgfSk7XG4gICAgICAvLyBpZCBhbmQgdHggd2lsbCBhbHdheXMgYmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgZXhwaXJlVGltZVxuICAgICAgc2hvdWxkLmV4aXN0KHJlY292ZXJ5KTtcbiAgICAgIHJlY292ZXJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgICBhd2FpdCBjaGVja1JlY292ZXJ5VHhFeHBsYW5hdGlvbihyZWNvdmVyeS50eCwgMjIwMDAwMDAwMDAwMDAwMDAwMCwgcmVjb3ZlcnlQYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnN0cnVjdCBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R28nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrRXRod1JlY292ZXJ5KGJpdGdvKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeVBhcmFtcyk7XG4gICAgICAvLyBpZCBhbmQgdHggd2lsbCBhbHdheXMgYmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgZXhwaXJlVGltZVxuICAgICAgc2hvdWxkLmV4aXN0KHJlY292ZXJ5KTtcbiAgICAgIHJlY292ZXJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCdpZCcpO1xuICAgICAgcmVjb3Zlcnkuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4Jyk7XG4gICAgICBhd2FpdCBjaGVja1JlY292ZXJ5VHhFeHBsYW5hdGlvbihyZWNvdmVyeS50eCwgMjIwMDAwMDAwMDAwMDAwMDAwMCwgcmVjb3ZlcnlQYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnN0cnVjdCBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R28gYW5kIHdpdGggS1JTJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9ja0V0aHdSZWNvdmVyeShiaXRnbyk7XG4gICAgICBjb25zdCByZWNvdmVyeSA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICAuLi5yZWNvdmVyeVBhcmFtcyxcbiAgICAgICAgYmFja3VwS2V5OlxuICAgICAgICAgICd4cHViNjYxTXlNd0FxUmJjR3NDTmlHNEJ6YnhMbVhuSkZvNEs1Z1ZTRTJiOUF4dWZBdHB1VHVuMVNZd2c5VXlrcXFmNERyS3JEWjZLcVBtOWVodGhXYkNtYTdwbmFNcnRYWTExblk3TWVGYkVEUG0nLFxuICAgICAgICBrcnNQcm92aWRlcjogJ2tleXRlcm5hbCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gaWQgYW5kIHR4IHdpbGwgYWx3YXlzIGJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIGV4cGlyZVRpbWVcbiAgICAgIHNob3VsZC5leGlzdChyZWNvdmVyeSk7XG4gICAgICByZWNvdmVyeS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaWQnKTtcbiAgICAgIHJlY292ZXJ5LnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eCcpO1xuICAgICAgYXdhaXQgY2hlY2tSZWNvdmVyeVR4RXhwbGFuYXRpb24ocmVjb3ZlcnkudHgsIDIyMDAwMDAwMDAwMDAwMDAwMDAsIHJlY292ZXJ5UGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlcnJvciB3aGVuIHRoZSBiYWNrdXAga2V5IGlzIHVuZnVuZGVkIChjYW5ub3QgcGF5IGdhcyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrRXRod1JlY292ZXJ5KGJpdGdvKTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHtcbiAgICAgICAgICB1c2VyS2V5OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJWTnZHNnQzZkhmeE1jZnZOdWFmWVlBPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiXFxuJyArXG4gICAgICAgICAgICAnOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwibWM5cENrM0g0M3c9XCIsXCJjdFwiOlwiUWU0WjFldmFYY3JPTUNcXG4nICtcbiAgICAgICAgICAgICdjUS9YTVZWQk85TS85OUQxUVE2THhrRzh6M2ZRdHd3T1ZYTTMvNmRvTnJyaXByVXFzK2FkcEZDOTNLUmNBYURyb0wxRTZvMTdKMmtcXG4nICtcbiAgICAgICAgICAgICdtY3BYUmQyQ3VYUkZPUlptWi82UUJmaktmQ0ozYXEwa0VrRFZ2MzdnWk5WVDNhTnRHa05TUWRDRVdLUUx3ZDErK3I1QWtBPVwifVxcbicsXG4gICAgICAgICAgYmFja3VwS2V5OlxuICAgICAgICAgICAgJ3tcIml2XCI6XCJFakQ3eDBPSlg5a05NL0MzeUVEdnlRPT1cIixcInZcIjoxLFwiaXRlclwiOjEwMDAwLFwia3NcIjoyNTYsXCJ0c1wiOjY0LFwibW9kZVwiXFxuJyArXG4gICAgICAgICAgICAnOlwiY2NtXCIsXCJhZGF0YVwiOlwiXCIsXCJjaXBoZXJcIjpcImFlc1wiLFwic2FsdFwiOlwiTmE5TnZSUmUzbjg9XCIsXCJjdFwiOlwiQi9BdFNMSG9sc2ROTHJcXG4nICtcbiAgICAgICAgICAgICc0RGxpajRrUTBFNk55VVVzNndvNlQySHRQREFQTzBoeWhQUGJoMU9BWXFJUzdWbEw5eG1KUkZDMnpQeHdSSnZ6ZjZPV0MvbTQ4SFhcXG4nICtcbiAgICAgICAgICAgICd2Z0xvWFlnYWhBcmhhbHpKVmxSeGNYVXo0SE9ob3pSV2Z2L2VLM3Q1SEpmbSsyNStXQk9pVzhZZ1NFN2hWRVlUYmVCUkQ0PVwifScsXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiAnMHgyMmZmNzQzMjE2YjU4YWViM2VmYzQ2OTg1NDA2YjUwMTEyZTllMTc2JyxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBUZXN0Qml0R28uVjIuVEVTVF9SRUNPVkVSWV9QQVNTQ09ERSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiAnMHhhYzA1ZGE3ODQ2NDUyMGFhN2M5ZDRjMTliZDdhNDQwYjExMWIzMDU0JyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ0JhY2t1cCBrZXkgYWRkcmVzcyAweGJhNmQ5ZDgyY2YyOTIwYzU0NGI4MzRiNzJmNGM2ZDExYTNlZjNkZTYgaGFzIGJhbGFuY2UgMCBHd2VpLlRoaXMgYWRkcmVzcyBtdXN0IGhhdmUgYSBiYWxhbmNlIG9mIGF0IGxlYXN0IDEwMDAwMDAwIEd3ZWkgdG8gcGVyZm9ybSByZWNvdmVyaWVzLiBUcnkgc2VuZGluZyBzb21lIEVUSCB0byB0aGlzIGFkZHJlc3MgdGhlbiByZXRyeS4nXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGFuIEVUSCB1bnNpZ25lZCBzd2VlcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2tFdGh3UmVjb3ZlcnkoYml0Z28pO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIoe1xuICAgICAgICB1c2VyS2V5OlxuICAgICAgICAgICd4cHViNjYxTXlNd0FxUmJjRlhEY1dEMnZ4dWViY1QxWnBURjRWa2U2cW1NVzh5emRkd05ZcEFQanZZRUVMNWpMZnlZWFcyZnV4dEF4WThUZ2pQVUpMY2YxQzhxejlONlZnWnhBcktYNEV3QjhySDUnLFxuICAgICAgICBiYWNrdXBLZXk6XG4gICAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNHaFNhWGlrcHVUQzlLVTg4WHg5THJqS1N3MUpLc3ZYTmdhYnBUZGdqeTdMU292aDlaSGhjcWhBSFF1N3V0aHU3Rmd1TkdkY0M0YVhUS0s1Z3FUY1BlNFd2TFlSYkNTRycsXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogVGVzdEJpdEdvLlYyLlRFU1RfRVRIX1dBTExFVF9GSVJTVF9BRERSRVNTLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBUZXN0Qml0R28uVjIuVEVTVF9FUkMyMF9UT0tFTl9SRUNJUElFTlQsXG4gICAgICAgIGdhc1ByaWNlOiAnMjAwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzUwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHNob3VsZC5leGlzdCh0cmFuc2FjdGlvbik7XG4gICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHgnKTtcbiAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb250cmFjdFNlcXVlbmNlSWQnKTtcbiAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdleHBpcmVUaW1lJyk7XG4gICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZ2FzTGltaXQnKTtcbiAgICAgIHRyYW5zYWN0aW9uLmdhc0xpbWl0LnNob3VsZC5lcXVhbCgnNTAwMDAwJyk7XG4gICAgICB0cmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZ2FzUHJpY2UnKTtcbiAgICAgIHRyYW5zYWN0aW9uLmdhc1ByaWNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMDAwMDAnKTtcbiAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3YWxsZXRDb250cmFjdEFkZHJlc3MnKTtcbiAgICAgIHRyYW5zYWN0aW9uLndhbGxldENvbnRyYWN0QWRkcmVzcy5zaG91bGQuZXF1YWwoVGVzdEJpdEdvLlYyLlRFU1RfRVRIX1dBTExFVF9GSVJTVF9BRERSRVNTKTtcbiAgICAgIHRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWNpcGllbnQnKTtcbiAgICAgIHRyYW5zYWN0aW9uLnJlY2lwaWVudC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWRkcmVzcycpO1xuICAgICAgdHJhbnNhY3Rpb24ucmVjaXBpZW50LmFkZHJlc3Muc2hvdWxkLmVxdWFsKFRlc3RCaXRHby5WMi5URVNUX0VSQzIwX1RPS0VOX1JFQ0lQSUVOVCk7XG4gICAgICB0cmFuc2FjdGlvbi5yZWNpcGllbnQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Ftb3VudCcpO1xuICAgICAgdHJhbnNhY3Rpb24ucmVjaXBpZW50LmFtb3VudC5zaG91bGQuZXF1YWwoJzk5OTk5OTk5OTk5OTk5OTk5MjgnKTtcbiAgICAgIGNoZWNrUmVjb3ZlcnlUeEV4cGxhbmF0aW9uKHRyYW5zYWN0aW9uLnR4LCA5OTk5OTk5OTk5OTk5OTk5OTI4LCBUZXN0Qml0R28uVjIuVEVTVF9FUkMyMF9UT0tFTl9SRUNJUElFTlQpO1xuICAgIH0pO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gY2hlY2tSZWNvdmVyeVR4RXhwbGFuYXRpb24odHgsIHJlY292ZXJ5QW1vdW50LCByZWNvdmVyeURlc3RpbmF0aW9uKSB7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAnMHgnICsgdHgsIGZlZUluZm86IHsgZmVlOiAxIH0gfSk7XG4gICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb3V0cHV0cycpO1xuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0cy5zaG91bGQuY29udGFpbkVxbCh7XG4gICAgICAgIGFtb3VudDogcmVjb3ZlcnlBbW91bnQudG9GaXhlZCgpLFxuICAgICAgICBhZGRyZXNzOiByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgfSk7XG4gICAgICBleHBsYW5hdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2hhbmdlT3V0cHV0cycsIFtdKTtcbiAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjaGFuZ2VBbW91bnQnLCAnMCcpO1xuICAgICAgZXhwbGFuYXRpb24uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZScsIHsgZmVlOiAxIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ==