@rudderstack/integrations-lib 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/constants.d.ts +3 -0
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +5 -2
- package/build/network/clients/{axios.d.ts → axios_client.d.ts} +1 -1
- package/build/network/clients/axios_client.d.ts.map +1 -0
- package/build/network/clients/axios_client.js +197 -0
- package/build/network/clients/axios_client.test.d.ts +2 -0
- package/build/network/clients/axios_client.test.d.ts.map +1 -0
- package/build/network/clients/axios_client.test.js +231 -0
- package/build/network/factory.js +3 -3
- package/build/network/factory.test.js +4 -4
- package/build/utils/sem.d.ts +21 -1
- package/build/utils/sem.d.ts.map +1 -1
- package/build/utils/sem.js +52 -1
- package/package.json +1 -1
- package/build/network/clients/axios.d.ts.map +0 -1
- package/build/network/clients/axios.js +0 -197
- package/build/network/clients/axios.test.d.ts +0 -2
- package/build/network/clients/axios.test.d.ts.map +0 -1
- package/build/network/clients/axios.test.js +0 -231
|
@@ -1,231 +0,0 @@
|
|
|
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
|
-
const axios_1 = __importDefault(require("axios"));
|
|
7
|
-
const axios_mock_adapter_1 = __importDefault(require("axios-mock-adapter"));
|
|
8
|
-
const axios_2 = require("./axios"); // Import the AxiosClient class
|
|
9
|
-
// Mock Axios for testing
|
|
10
|
-
jest.mock('axios', () => {
|
|
11
|
-
return {
|
|
12
|
-
...jest.requireActual('axios'),
|
|
13
|
-
create: jest.fn().mockReturnValue(jest.requireActual('axios')),
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
// Test cases
|
|
17
|
-
describe('AxiosClient', () => {
|
|
18
|
-
let axiosClient;
|
|
19
|
-
let mockAxios;
|
|
20
|
-
beforeEach(() => {
|
|
21
|
-
mockAxios = new axios_mock_adapter_1.default(axios_1.default); // Create a MockAdapter for Axios
|
|
22
|
-
axiosClient = new axios_2.AxiosClient(); // Create a new AxiosClient instance for each test
|
|
23
|
-
});
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
mockAxios.restore();
|
|
26
|
-
});
|
|
27
|
-
describe('happy flow tests', () => {
|
|
28
|
-
// Scenario 1: GET request and receive a response
|
|
29
|
-
it('should make a GET request and receive a response', async () => {
|
|
30
|
-
// Mock the GET request using axios-mock-adapter
|
|
31
|
-
mockAxios.onGet('https://example.com').reply(200, 'GET response');
|
|
32
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
33
|
-
expect(response.type).toBe('success');
|
|
34
|
-
expect(response.statusCode).toBe(200);
|
|
35
|
-
expect(response.responseBody).toBe('GET response');
|
|
36
|
-
});
|
|
37
|
-
// Scenario 2: POST request and receive a response
|
|
38
|
-
it('should make a POST request and receive a response', async () => {
|
|
39
|
-
// Mock the axios.post method to return a response
|
|
40
|
-
mockAxios.onPost('https://example.com').reply(201, 'POST response');
|
|
41
|
-
const response = (await axiosClient.post('https://example.com', {
|
|
42
|
-
foo: 'bar',
|
|
43
|
-
}));
|
|
44
|
-
expect(response.type).toBe('success');
|
|
45
|
-
expect(response.statusCode).toBe(201);
|
|
46
|
-
expect(response.responseBody).toBe('POST response');
|
|
47
|
-
});
|
|
48
|
-
// Scenario 3: PUT request and receive a response
|
|
49
|
-
it('should make a PUT request and receive a response', async () => {
|
|
50
|
-
// Mock the axios.put method to return a response
|
|
51
|
-
mockAxios.onPut('https://example.com').reply(204);
|
|
52
|
-
const response = (await axiosClient.put('https://example.com', {
|
|
53
|
-
foo: 'bar',
|
|
54
|
-
}));
|
|
55
|
-
expect(response.type).toBe('success');
|
|
56
|
-
expect(response.statusCode).toBe(204);
|
|
57
|
-
expect(response.responseBody).toBeUndefined(); // No response body for PUT
|
|
58
|
-
});
|
|
59
|
-
// Scenario 4: PATCH request and receive a response
|
|
60
|
-
it('should make a PATCH request and receive a response', async () => {
|
|
61
|
-
// Mock the axios.patch method to return a response
|
|
62
|
-
mockAxios.onPatch('https://example.com').reply(200, 'PATCH response');
|
|
63
|
-
const response = (await axiosClient.patch('https://example.com', {
|
|
64
|
-
foo: 'bar',
|
|
65
|
-
}));
|
|
66
|
-
expect(response.type).toBe('success');
|
|
67
|
-
expect(response.statusCode).toBe(200);
|
|
68
|
-
expect(response.responseBody).toBe('PATCH response');
|
|
69
|
-
});
|
|
70
|
-
// Scenario 5: DELETE request and receive a response
|
|
71
|
-
it('should make a DELETE request and receive a response', async () => {
|
|
72
|
-
// Mock the axios.delete method to return a response
|
|
73
|
-
mockAxios.onDelete('https://example.com').reply(204);
|
|
74
|
-
const response = (await axiosClient.delete('https://example.com'));
|
|
75
|
-
expect(response.type).toBe('success');
|
|
76
|
-
expect(response.statusCode).toBe(204);
|
|
77
|
-
expect(response.responseBody).toBeUndefined(); // No response body for DELETE
|
|
78
|
-
});
|
|
79
|
-
// Scenario 6: GET request with a response parser
|
|
80
|
-
it('should make a GET request with a response parser', async () => {
|
|
81
|
-
// Mock the GET request using axios-mock-adapter
|
|
82
|
-
mockAxios.onGet('https://example.com').reply(200, 'GET response');
|
|
83
|
-
const response = (await axiosClient.get('https://example.com', {}, (data) => {
|
|
84
|
-
return `Parsed ${data}`;
|
|
85
|
-
}));
|
|
86
|
-
expect(response.type).toBe('success');
|
|
87
|
-
expect(response.statusCode).toBe(200);
|
|
88
|
-
expect(response.responseBody).toBe('Parsed GET response');
|
|
89
|
-
});
|
|
90
|
-
// Scenario 7: POST request with a response parser
|
|
91
|
-
it('should make a POST request with a response parser', async () => {
|
|
92
|
-
// Mock the axios.post method to return a response
|
|
93
|
-
mockAxios.onPost('https://example.com').reply(201, 'POST response');
|
|
94
|
-
const response = (await axiosClient.post('https://example.com', {
|
|
95
|
-
foo: 'bar',
|
|
96
|
-
}, {}, (data) => {
|
|
97
|
-
return `Parsed ${data}`;
|
|
98
|
-
}));
|
|
99
|
-
expect(response.type).toBe('success');
|
|
100
|
-
expect(response.statusCode).toBe(201);
|
|
101
|
-
expect(response.responseBody).toBe('Parsed POST response');
|
|
102
|
-
});
|
|
103
|
-
// Scenario 8: PUT request with a response parser
|
|
104
|
-
it('should make a PUT request with a response parser', async () => {
|
|
105
|
-
// Mock the axios.put method to return a response
|
|
106
|
-
mockAxios.onPut('https://example.com').reply(204);
|
|
107
|
-
const response = (await axiosClient.put('https://example.com', {
|
|
108
|
-
foo: 'bar',
|
|
109
|
-
}, {}, (data) => {
|
|
110
|
-
return `Parsed ${data}`;
|
|
111
|
-
}));
|
|
112
|
-
expect(response.type).toBe('success');
|
|
113
|
-
expect(response.statusCode).toBe(204);
|
|
114
|
-
expect(response.responseBody).toBe('Parsed undefined'); // No response body for PUT
|
|
115
|
-
});
|
|
116
|
-
// Scenario 9: PATCH request with a response parser
|
|
117
|
-
it('should make a PATCH request with a response parser', async () => {
|
|
118
|
-
// Mock the axios.patch method to return a response
|
|
119
|
-
mockAxios.onPatch('https://example.com').reply(200, 'PATCH response');
|
|
120
|
-
const response = (await axiosClient.patch('https://example.com', {
|
|
121
|
-
foo: 'bar',
|
|
122
|
-
}, {}, (data) => {
|
|
123
|
-
return `Parsed ${data}`;
|
|
124
|
-
}));
|
|
125
|
-
expect(response.type).toBe('success');
|
|
126
|
-
expect(response.statusCode).toBe(200);
|
|
127
|
-
expect(response.responseBody).toBe('Parsed PATCH response');
|
|
128
|
-
});
|
|
129
|
-
// Scenario 10: DELETE request with a response parser
|
|
130
|
-
it('should make a DELETE request with a response parser', async () => {
|
|
131
|
-
// Mock the axios.delete method to return a response
|
|
132
|
-
mockAxios.onDelete('https://example.com').reply(204);
|
|
133
|
-
const response = (await axiosClient.delete('https://example.com', {}, (data) => {
|
|
134
|
-
return `Parsed ${data}`;
|
|
135
|
-
}));
|
|
136
|
-
expect(response.type).toBe('success');
|
|
137
|
-
expect(response.statusCode).toBe(204);
|
|
138
|
-
expect(response.responseBody).toBe('Parsed undefined'); // No response body for DELETE
|
|
139
|
-
});
|
|
140
|
-
// Scenario 11: GET request with headers
|
|
141
|
-
it('should make a GET request with headers', async () => {
|
|
142
|
-
// Mock the GET request using axios-mock-adapter
|
|
143
|
-
mockAxios.onGet('https://example.com').reply((config) => {
|
|
144
|
-
expect(config.headers['foo']).toEqual('bar');
|
|
145
|
-
return [
|
|
146
|
-
200,
|
|
147
|
-
'GET response',
|
|
148
|
-
{
|
|
149
|
-
Authorization: `Bearer Token`,
|
|
150
|
-
'Content-type': 'application/x-www-form-urlencoded',
|
|
151
|
-
},
|
|
152
|
-
];
|
|
153
|
-
});
|
|
154
|
-
const response = (await axiosClient.get('https://example.com', {
|
|
155
|
-
headers: { foo: 'bar' },
|
|
156
|
-
}));
|
|
157
|
-
expect(response.type).toBe('success');
|
|
158
|
-
expect(response.statusCode).toBe(200);
|
|
159
|
-
expect(response.responseBody).toBe('GET response');
|
|
160
|
-
});
|
|
161
|
-
// other happy flow tests
|
|
162
|
-
// Scenario 12:
|
|
163
|
-
});
|
|
164
|
-
describe('error flow tests', () => {
|
|
165
|
-
// Scenario 1: GET request and receive a network error
|
|
166
|
-
it('should make a GET request and receive a network error', async () => {
|
|
167
|
-
// Mock the GET request using axios-mock-adapter
|
|
168
|
-
mockAxios.onGet('https://example.com').abortRequest();
|
|
169
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
170
|
-
expect(response.type).toBe('client-error');
|
|
171
|
-
expect(response.statusCode).toBe(500);
|
|
172
|
-
expect(response.message).toBe('Unknown Error:Request aborted');
|
|
173
|
-
});
|
|
174
|
-
// should handle timeout errors
|
|
175
|
-
it('should make a GET request and receive a timeout error', async () => {
|
|
176
|
-
// Mock the GET request using axios-mock-adapter
|
|
177
|
-
mockAxios.onGet('https://example.com').timeout();
|
|
178
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
179
|
-
expect(response.type).toBe('client-error');
|
|
180
|
-
expect(response.statusCode).toBe(500);
|
|
181
|
-
expect(response.message).toBe('Unknown Error:timeout of 0ms exceeded');
|
|
182
|
-
});
|
|
183
|
-
it('should make a GET request and receive a network error', async () => {
|
|
184
|
-
// Mock the GET request using axios-mock-adapter
|
|
185
|
-
mockAxios.onGet('https://example.com').networkError();
|
|
186
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
187
|
-
expect(response.type).toBe('client-error');
|
|
188
|
-
expect(response.statusCode).toBe(500);
|
|
189
|
-
expect(response.message).toBe('Network Error');
|
|
190
|
-
});
|
|
191
|
-
// should handle application errors (4xx)
|
|
192
|
-
it('should make a GET request and receive a 400 error', async () => {
|
|
193
|
-
// Mock the GET request using axios-mock-adapter
|
|
194
|
-
mockAxios.onGet('https://example.com').reply(400, 'Bad Request Received');
|
|
195
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
196
|
-
expect(response.type).toBe('application-error');
|
|
197
|
-
expect(response.statusCode).toBe(400);
|
|
198
|
-
expect(response.responseBody).toBe('Bad Request Received');
|
|
199
|
-
});
|
|
200
|
-
// should handle application errors (5xx)
|
|
201
|
-
it('should make a GET request and receive a 500 error', async () => {
|
|
202
|
-
// Mock the GET request using axios-mock-adapter
|
|
203
|
-
mockAxios.onGet('https://example.com').reply(500, 'Internal Server Error');
|
|
204
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
205
|
-
expect(response.type).toBe('application-error');
|
|
206
|
-
expect(response.statusCode).toBe(500);
|
|
207
|
-
expect(response.responseBody).toBe('Internal Server Error');
|
|
208
|
-
});
|
|
209
|
-
// should handle unexpected errors
|
|
210
|
-
it('should make a GET request and receive an unexpected error', async () => {
|
|
211
|
-
// Mock the GET request using axios-mock-adapter
|
|
212
|
-
mockAxios.onGet('https://example.com').reply(200, 'GET response');
|
|
213
|
-
const response = (await axiosClient.get('https://example.com', {}, (data) => {
|
|
214
|
-
throw new Error('Unexpected Error');
|
|
215
|
-
}));
|
|
216
|
-
expect(response.type).toBe('client-error');
|
|
217
|
-
expect(response.statusCode).toBe(500);
|
|
218
|
-
expect(response.message).toBe('Failed to parse response data: Unexpected Error');
|
|
219
|
-
});
|
|
220
|
-
// should handle empty response body
|
|
221
|
-
it('should make a GET request and receive an empty response body', async () => {
|
|
222
|
-
// Mock the GET request using axios-mock-adapter
|
|
223
|
-
mockAxios.onGet('https://example.com').reply(200);
|
|
224
|
-
const response = (await axiosClient.get('https://example.com'));
|
|
225
|
-
expect(response.type).toBe('success');
|
|
226
|
-
expect(response.statusCode).toBe(200);
|
|
227
|
-
expect(response.responseBody).toBeUndefined();
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpb3MudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL2NsaWVudHMvYXhpb3MudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQjtBQUMxQiw0RUFBNkM7QUFDN0MsbUNBQXNDLENBQUMsK0JBQStCO0FBT3RFLHlCQUF5QjtBQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7SUFDdEIsT0FBTztRQUNMLEdBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQVk7UUFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMvRCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxhQUFhO0FBQ2IsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsSUFBSSxXQUF3QixDQUFDO0lBQzdCLElBQUksU0FBUyxDQUFDO0lBRWQsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLFNBQVMsR0FBRyxJQUFJLDRCQUFXLENBQUMsZUFBSyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDckUsV0FBVyxHQUFHLElBQUksbUJBQVcsRUFBRSxDQUFDLENBQUMsa0RBQWtEO0lBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsaURBQWlEO1FBQ2pELEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNoRSxnREFBZ0Q7WUFDaEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUs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SUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7UUFFSCxvQ0FBb0M7UUFDcEMsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzVFLGdEQUFnRDtZQUNoRCxTQUFTLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUNyQyxxQkFBcUIsQ0FDdEIsQ0FBa0MsQ0FBQztZQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgTW9ja0FkYXB0ZXIgZnJvbSAnYXhpb3MtbW9jay1hZGFwdGVyJztcbmltcG9ydCB7IEF4aW9zQ2xpZW50IH0gZnJvbSAnLi9heGlvcyc7IC8vIEltcG9ydCB0aGUgQXhpb3NDbGllbnQgY2xhc3NcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uRXJyb3JBcGlSZXNwb25zZSxcbiAgQ2xpZW50RXJyb3JBcGlSZXNwb25zZSxcbiAgU3VjY2Vzc2Z1bEFwaVJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLy8gTW9jayBBeGlvcyBmb3IgdGVzdGluZ1xuamVzdC5tb2NrKCdheGlvcycsICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oamVzdC5yZXF1aXJlQWN0dWFsKCdheGlvcycpIGFzIG9iamVjdCksXG4gICAgY3JlYXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGplc3QucmVxdWlyZUFjdHVhbCgnYXhpb3MnKSksXG4gIH07XG59KTtcblxuLy8gVGVzdCBjYXNlc1xuZGVzY3JpYmUoJ0F4aW9zQ2xpZW50JywgKCkgPT4ge1xuICBsZXQgYXhpb3NDbGllbnQ6IEF4aW9zQ2xpZW50O1xuICBsZXQgbW9ja0F4aW9zO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tBeGlvcyA9IG5ldyBNb2NrQWRhcHRlcihheGlvcyk7IC8vIENyZWF0ZSBhIE1vY2tBZGFwdGVyIGZvciBBeGlvc1xuICAgIGF4aW9zQ2xpZW50ID0gbmV3IEF4aW9zQ2xpZW50KCk7IC8vIENyZWF0ZSBhIG5ldyBBeGlvc0NsaWVudCBpbnN0YW5jZSBmb3IgZWFjaCB0ZXN0XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgbW9ja0F4aW9zLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hhcHB5IGZsb3cgdGVzdHMnLCAoKSA9PiB7XG4gICAgLy8gU2NlbmFyaW8gMTogR0VUIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSByZXNwb25zZVxuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGEgcmVzcG9uc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCwgJ0dFVCByZXNwb25zZScpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQuZ2V0KFxuICAgICAgICAnaHR0cHM6Ly9leGFtcGxlLmNvbScsXG4gICAgICApKSBhcyBTdWNjZXNzZnVsQXBpUmVzcG9uc2U8c3RyaW5nPjtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdzdWNjZXNzJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnJlc3BvbnNlQm9keSkudG9CZSgnR0VUIHJlc3BvbnNlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBTY2VuYXJpbyAyOiBQT1NUIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSByZXNwb25zZVxuICAgIGl0KCdzaG91bGQgbWFrZSBhIFBPU1QgcmVxdWVzdCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgYXhpb3MucG9zdCBtZXRob2QgdG8gcmV0dXJuIGEgcmVzcG9uc2VcbiAgICAgIG1vY2tBeGlvcy5vblBvc3QoJ2h0dHBzOi8vZXhhbXBsZS5jb20nKS5yZXBseSgyMDEsICdQT1NUIHJlc3BvbnNlJyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LnBvc3QoJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB7XG4gICAgICAgIGZvbzogJ2JhcicsXG4gICAgICB9KSkgYXMgU3VjY2Vzc2Z1bEFwaVJlc3BvbnNlPHN0cmluZz47XG4gICAgICBleHBlY3QocmVzcG9uc2UudHlwZSkudG9CZSgnc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpLnRvQmUoMjAxKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5yZXNwb25zZUJvZHkpLnRvQmUoJ1BPU1QgcmVzcG9uc2UnKTtcbiAgICB9KTtcblxuICAgIC8vIFNjZW5hcmlvIDM6IFBVVCByZXF1ZXN0IGFuZCByZWNlaXZlIGEgcmVzcG9uc2VcbiAgICBpdCgnc2hvdWxkIG1ha2UgYSBQVVQgcmVxdWVzdCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgYXhpb3MucHV0IG1ldGhvZCB0byByZXR1cm4gYSByZXNwb25zZVxuICAgICAgbW9ja0F4aW9zLm9uUHV0KCdodHRwczovL2V4YW1wbGUuY29tJykucmVwbHkoMjA0KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQucHV0KCdodHRwczovL2V4YW1wbGUuY29tJywge1xuICAgICAgICBmb286ICdiYXInLFxuICAgICAgfSkpIGFzIFN1Y2Nlc3NmdWxBcGlSZXNwb25zZTxzdHJpbmc+O1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ3N1Y2Nlc3MnKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDIwNCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UucmVzcG9uc2VCb2R5KS50b0JlVW5kZWZpbmVkKCk7IC8vIE5vIHJlc3BvbnNlIGJvZHkgZm9yIFBVVFxuICAgIH0pO1xuXG4gICAgLy8gU2NlbmFyaW8gNDogUEFUQ0ggcmVxdWVzdCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgUEFUQ0ggcmVxdWVzdCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgYXhpb3MucGF0Y2ggbWV0aG9kIHRvIHJldHVybiBhIHJlc3BvbnNlXG4gICAgICBtb2NrQXhpb3Mub25QYXRjaCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCwgJ1BBVENIIHJlc3BvbnNlJyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LnBhdGNoKCdodHRwczovL2V4YW1wbGUuY29tJywge1xuICAgICAgICBmb286ICdiYXInLFxuICAgICAgfSkpIGFzIFN1Y2Nlc3NmdWxBcGlSZXNwb25zZTxzdHJpbmc+O1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ3N1Y2Nlc3MnKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDIwMCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UucmVzcG9uc2VCb2R5KS50b0JlKCdQQVRDSCByZXNwb25zZScpO1xuICAgIH0pO1xuXG4gICAgLy8gU2NlbmFyaW8gNTogREVMRVRFIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSByZXNwb25zZVxuICAgIGl0KCdzaG91bGQgbWFrZSBhIERFTEVURSByZXF1ZXN0IGFuZCByZWNlaXZlIGEgcmVzcG9uc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBheGlvcy5kZWxldGUgbWV0aG9kIHRvIHJldHVybiBhIHJlc3BvbnNlXG4gICAgICBtb2NrQXhpb3Mub25EZWxldGUoJ2h0dHBzOi8vZXhhbXBsZS5jb20nKS5yZXBseSgyMDQpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBheGlvc0NsaWVudC5kZWxldGUoXG4gICAgICAgICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgICkpIGFzIFN1Y2Nlc3NmdWxBcGlSZXNwb25zZTxzdHJpbmc+O1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ3N1Y2Nlc3MnKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDIwNCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UucmVzcG9uc2VCb2R5KS50b0JlVW5kZWZpbmVkKCk7IC8vIE5vIHJlc3BvbnNlIGJvZHkgZm9yIERFTEVURVxuICAgIH0pO1xuXG4gICAgLy8gU2NlbmFyaW8gNjogR0VUIHJlcXVlc3Qgd2l0aCBhIHJlc3BvbnNlIHBhcnNlclxuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IHdpdGggYSByZXNwb25zZSBwYXJzZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCwgJ0dFVCByZXNwb25zZScpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBheGlvc0NsaWVudC5nZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB7fSwgKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGBQYXJzZWQgJHtkYXRhfWA7XG4gICAgICB9KSkgYXMgU3VjY2Vzc2Z1bEFwaVJlc3BvbnNlPHN0cmluZz47XG4gICAgICBleHBlY3QocmVzcG9uc2UudHlwZSkudG9CZSgnc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5yZXNwb25zZUJvZHkpLnRvQmUoJ1BhcnNlZCBHRVQgcmVzcG9uc2UnKTtcbiAgICB9KTtcblxuICAgIC8vIFNjZW5hcmlvIDc6IFBPU1QgcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UgcGFyc2VyXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgUE9TVCByZXF1ZXN0IHdpdGggYSByZXNwb25zZSBwYXJzZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBheGlvcy5wb3N0IG1ldGhvZCB0byByZXR1cm4gYSByZXNwb25zZVxuICAgICAgbW9ja0F4aW9zLm9uUG9zdCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMSwgJ1BPU1QgcmVzcG9uc2UnKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQucG9zdChcbiAgICAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICB7XG4gICAgICAgICAgZm9vOiAnYmFyJyxcbiAgICAgICAgfSxcbiAgICAgICAge30sXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBQYXJzZWQgJHtkYXRhfWA7XG4gICAgICAgIH0sXG4gICAgICApKSBhcyBTdWNjZXNzZnVsQXBpUmVzcG9uc2U8c3RyaW5nPjtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdzdWNjZXNzJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSgyMDEpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnJlc3BvbnNlQm9keSkudG9CZSgnUGFyc2VkIFBPU1QgcmVzcG9uc2UnKTtcbiAgICB9KTtcblxuICAgIC8vIFNjZW5hcmlvIDg6IFBVVCByZXF1ZXN0IHdpdGggYSByZXNwb25zZSBwYXJzZXJcbiAgICBpdCgnc2hvdWxkIG1ha2UgYSBQVVQgcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UgcGFyc2VyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgYXhpb3MucHV0IG1ldGhvZCB0byByZXR1cm4gYSByZXNwb25zZVxuICAgICAgbW9ja0F4aW9zLm9uUHV0KCdodHRwczovL2V4YW1wbGUuY29tJykucmVwbHkoMjA0KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQucHV0KFxuICAgICAgICAnaHR0cHM6Ly9leGFtcGxlLmNvbScsXG4gICAgICAgIHtcbiAgICAgICAgICBmb286ICdiYXInLFxuICAgICAgICB9LFxuICAgICAgICB7fSxcbiAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gYFBhcnNlZCAke2RhdGF9YDtcbiAgICAgICAgfSxcbiAgICAgICkpIGFzIFN1Y2Nlc3NmdWxBcGlSZXNwb25zZTxzdHJpbmc+O1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ3N1Y2Nlc3MnKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDIwNCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UucmVzcG9uc2VCb2R5KS50b0JlKCdQYXJzZWQgdW5kZWZpbmVkJyk7IC8vIE5vIHJlc3BvbnNlIGJvZHkgZm9yIFBVVFxuICAgIH0pO1xuXG4gICAgLy8gU2NlbmFyaW8gOTogUEFUQ0ggcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UgcGFyc2VyXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgUEFUQ0ggcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UgcGFyc2VyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgYXhpb3MucGF0Y2ggbWV0aG9kIHRvIHJldHVybiBhIHJlc3BvbnNlXG4gICAgICBtb2NrQXhpb3Mub25QYXRjaCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCwgJ1BBVENIIHJlc3BvbnNlJyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LnBhdGNoKFxuICAgICAgICAnaHR0cHM6Ly9leGFtcGxlLmNvbScsXG4gICAgICAgIHtcbiAgICAgICAgICBmb286ICdiYXInLFxuICAgICAgICB9LFxuICAgICAgICB7fSxcbiAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gYFBhcnNlZCAke2RhdGF9YDtcbiAgICAgICAgfSxcbiAgICAgICkpIGFzIFN1Y2Nlc3NmdWxBcGlSZXNwb25zZTxzdHJpbmc+O1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ3N1Y2Nlc3MnKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDIwMCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UucmVzcG9uc2VCb2R5KS50b0JlKCdQYXJzZWQgUEFUQ0ggcmVzcG9uc2UnKTtcbiAgICB9KTtcblxuICAgIC8vIFNjZW5hcmlvIDEwOiBERUxFVEUgcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UgcGFyc2VyXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgREVMRVRFIHJlcXVlc3Qgd2l0aCBhIHJlc3BvbnNlIHBhcnNlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1vY2sgdGhlIGF4aW9zLmRlbGV0ZSBtZXRob2QgdG8gcmV0dXJuIGEgcmVzcG9uc2VcbiAgICAgIG1vY2tBeGlvcy5vbkRlbGV0ZSgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwNCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LmRlbGV0ZSgnaHR0cHM6Ly9leGFtcGxlLmNvbScsIHt9LCAoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gYFBhcnNlZCAke2RhdGF9YDtcbiAgICAgIH0pKSBhcyBTdWNjZXNzZnVsQXBpUmVzcG9uc2U8c3RyaW5nPjtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdzdWNjZXNzJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSgyMDQpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnJlc3BvbnNlQm9keSkudG9CZSgnUGFyc2VkIHVuZGVmaW5lZCcpOyAvLyBObyByZXNwb25zZSBib2R5IGZvciBERUxFVEVcbiAgICB9KTtcblxuICAgIC8vIFNjZW5hcmlvIDExOiBHRVQgcmVxdWVzdCB3aXRoIGhlYWRlcnNcbiAgICBpdCgnc2hvdWxkIG1ha2UgYSBHRVQgcmVxdWVzdCB3aXRoIGhlYWRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KChjb25maWcpID0+IHtcbiAgICAgICAgZXhwZWN0KGNvbmZpZy5oZWFkZXJzWydmb28nXSkudG9FcXVhbCgnYmFyJyk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgMjAwLFxuICAgICAgICAgICdHRVQgcmVzcG9uc2UnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgVG9rZW5gLFxuICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQuZ2V0KCdodHRwczovL2V4YW1wbGUuY29tJywge1xuICAgICAgICBoZWFkZXJzOiB7IGZvbzogJ2JhcicgfSxcbiAgICAgIH0pKSBhcyBTdWNjZXNzZnVsQXBpUmVzcG9uc2U8c3RyaW5nPjtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdzdWNjZXNzJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnJlc3BvbnNlQm9keSkudG9CZSgnR0VUIHJlc3BvbnNlJyk7XG4gICAgfSk7XG5cbiAgICAvLyBvdGhlciBoYXBweSBmbG93IHRlc3RzXG4gICAgLy8gU2NlbmFyaW8gMTI6XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlcnJvciBmbG93IHRlc3RzJywgKCkgPT4ge1xuICAgIC8vIFNjZW5hcmlvIDE6IEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGEgbmV0d29yayBlcnJvclxuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGEgbmV0d29yayBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1vY2sgdGhlIEdFVCByZXF1ZXN0IHVzaW5nIGF4aW9zLW1vY2stYWRhcHRlclxuICAgICAgbW9ja0F4aW9zLm9uR2V0KCdodHRwczovL2V4YW1wbGUuY29tJykuYWJvcnRSZXF1ZXN0KCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LmdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpKSBhcyBDbGllbnRFcnJvckFwaVJlc3BvbnNlO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ2NsaWVudC1lcnJvcicpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpLnRvQmUoNTAwKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5tZXNzYWdlKS50b0JlKCdVbmtub3duIEVycm9yOlJlcXVlc3QgYWJvcnRlZCcpO1xuICAgIH0pO1xuXG4gICAgLy8gc2hvdWxkIGhhbmRsZSB0aW1lb3V0IGVycm9yc1xuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGEgdGltZW91dCBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1vY2sgdGhlIEdFVCByZXF1ZXN0IHVzaW5nIGF4aW9zLW1vY2stYWRhcHRlclxuICAgICAgbW9ja0F4aW9zLm9uR2V0KCdodHRwczovL2V4YW1wbGUuY29tJykudGltZW91dCgpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBheGlvc0NsaWVudC5nZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20nKSkgYXMgQ2xpZW50RXJyb3JBcGlSZXNwb25zZTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdjbGllbnQtZXJyb3InKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDUwMCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UubWVzc2FnZSkudG9CZSgnVW5rbm93biBFcnJvcjp0aW1lb3V0IG9mIDBtcyBleGNlZWRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgR0VUIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSBuZXR3b3JrIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTW9jayB0aGUgR0VUIHJlcXVlc3QgdXNpbmcgYXhpb3MtbW9jay1hZGFwdGVyXG4gICAgICBtb2NrQXhpb3Mub25HZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20nKS5uZXR3b3JrRXJyb3IoKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgYXhpb3NDbGllbnQuZ2V0KCdodHRwczovL2V4YW1wbGUuY29tJykpIGFzIENsaWVudEVycm9yQXBpUmVzcG9uc2U7XG4gICAgICBleHBlY3QocmVzcG9uc2UudHlwZSkudG9CZSgnY2xpZW50LWVycm9yJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSg1MDApO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLm1lc3NhZ2UpLnRvQmUoJ05ldHdvcmsgRXJyb3InKTtcbiAgICB9KTtcblxuICAgIC8vIHNob3VsZCBoYW5kbGUgYXBwbGljYXRpb24gZXJyb3JzICg0eHgpXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgR0VUIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSA0MDAgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDQwMCwgJ0JhZCBSZXF1ZXN0IFJlY2VpdmVkJyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LmdldChcbiAgICAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgKSkgYXMgQXBwbGljYXRpb25FcnJvckFwaVJlc3BvbnNlO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnR5cGUpLnRvQmUoJ2FwcGxpY2F0aW9uLWVycm9yJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSkudG9CZSg0MDApO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnJlc3BvbnNlQm9keSkudG9CZSgnQmFkIFJlcXVlc3QgUmVjZWl2ZWQnKTtcbiAgICB9KTtcblxuICAgIC8vIHNob3VsZCBoYW5kbGUgYXBwbGljYXRpb24gZXJyb3JzICg1eHgpXG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgR0VUIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSA1MDAgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDUwMCwgJ0ludGVybmFsIFNlcnZlciBFcnJvcicpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBheGlvc0NsaWVudC5nZXQoXG4gICAgICAgICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgICkpIGFzIEFwcGxpY2F0aW9uRXJyb3JBcGlSZXNwb25zZTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdhcHBsaWNhdGlvbi1lcnJvcicpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpLnRvQmUoNTAwKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5yZXNwb25zZUJvZHkpLnRvQmUoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpO1xuICAgIH0pO1xuXG4gICAgLy8gc2hvdWxkIGhhbmRsZSB1bmV4cGVjdGVkIGVycm9yc1xuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGFuIHVuZXhwZWN0ZWQgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCwgJ0dFVCByZXNwb25zZScpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCBheGlvc0NsaWVudC5nZXQoJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB7fSwgKGRhdGEpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIEVycm9yJyk7XG4gICAgICB9KSkgYXMgQ2xpZW50RXJyb3JBcGlSZXNwb25zZTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS50eXBlKS50b0JlKCdjbGllbnQtZXJyb3InKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNDb2RlKS50b0JlKDUwMCk7XG4gICAgICBleHBlY3QocmVzcG9uc2UubWVzc2FnZSkudG9CZSgnRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGRhdGE6IFVuZXhwZWN0ZWQgRXJyb3InKTtcbiAgICB9KTtcblxuICAgIC8vIHNob3VsZCBoYW5kbGUgZW1wdHkgcmVzcG9uc2UgYm9keVxuICAgIGl0KCdzaG91bGQgbWFrZSBhIEdFVCByZXF1ZXN0IGFuZCByZWNlaXZlIGFuIGVtcHR5IHJlc3BvbnNlIGJvZHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNb2NrIHRoZSBHRVQgcmVxdWVzdCB1c2luZyBheGlvcy1tb2NrLWFkYXB0ZXJcbiAgICAgIG1vY2tBeGlvcy5vbkdldCgnaHR0cHM6Ly9leGFtcGxlLmNvbScpLnJlcGx5KDIwMCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGF4aW9zQ2xpZW50LmdldChcbiAgICAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgKSkgYXMgU3VjY2Vzc2Z1bEFwaVJlc3BvbnNlPHN0cmluZz47XG4gICAgICBleHBlY3QocmVzcG9uc2UudHlwZSkudG9CZSgnc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICAgIGV4cGVjdChyZXNwb25zZS5yZXNwb25zZUJvZHkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|