@rudderstack/integrations-lib 0.2.17 → 0.2.19
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/types.d.ts +0 -273
- package/build/types.d.ts.map +1 -1
- package/build/types.js +1 -26
- package/build/utils/index.d.ts +2 -2
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +3 -3
- package/build/utils/json-schema-generator.d.ts +109 -0
- package/build/utils/json-schema-generator.d.ts.map +1 -0
- package/build/utils/json-schema-generator.js +218 -0
- package/build/utils/json-schema-generator.test.d.ts +2 -0
- package/build/utils/json-schema-generator.test.d.ts.map +1 -0
- package/build/utils/json-schema-generator.test.js +368 -0
- package/build/utils/misc.d.ts +2 -10
- package/build/utils/misc.d.ts.map +1 -1
- package/build/utils/misc.js +4 -26
- package/build/utils/misc.test.js +21 -65
- package/build/utils/tests.d.ts +8 -0
- package/build/utils/tests.d.ts.map +1 -0
- package/build/utils/tests.js +15 -0
- package/build/utils/tests.test.d.ts +2 -0
- package/build/utils/tests.test.d.ts.map +1 -0
- package/build/utils/tests.test.js +89 -0
- package/package.json +4 -3
- package/build/utils/json.d.ts +0 -51
- package/build/utils/json.d.ts.map +0 -1
- package/build/utils/json.js +0 -520
- package/build/utils/json.test.d.ts +0 -2
- package/build/utils/json.test.d.ts.map +0 -1
- package/build/utils/json.test.js +0 -1290
- package/build/utils/sem.d.ts +0 -49
- package/build/utils/sem.d.ts.map +0 -1
- package/build/utils/sem.js +0 -247
- package/build/utils/sem.test.d.ts +0 -2
- package/build/utils/sem.test.d.ts.map +0 -1
- package/build/utils/sem.test.js +0 -317
package/build/utils/sem.test.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Generated by CodiumAI
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const sem_1 = require("./sem");
|
|
5
|
-
describe('SemanticUtil', () => {
|
|
6
|
-
describe('getIntegrationsObj', () => {
|
|
7
|
-
// Tests that 'getIntegrationsObj' returns the integrations object for a valid integration name
|
|
8
|
-
it('should return the integrations object for a valid integration name', () => {
|
|
9
|
-
const message = {
|
|
10
|
-
integrations: {
|
|
11
|
-
fb_pixel: {
|
|
12
|
-
key: 'value',
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
const intgName = 'fb_pixel';
|
|
17
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
18
|
-
expect(result).toEqual({ key: 'value' });
|
|
19
|
-
});
|
|
20
|
-
// Tests that 'getIntegrationsObj' returns null for an empty integration name
|
|
21
|
-
it('should return null for an empty integration name', () => {
|
|
22
|
-
const message = {
|
|
23
|
-
integrations: {
|
|
24
|
-
fb_pixel: {
|
|
25
|
-
key: 'value',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
const intgName = '';
|
|
30
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
31
|
-
expect(result).toBeNull();
|
|
32
|
-
});
|
|
33
|
-
// Tests that 'getIntegrationsObj' returns null for an invalid integration name
|
|
34
|
-
it('should return null for an invalid integration name', () => {
|
|
35
|
-
const message = {
|
|
36
|
-
integrations: {
|
|
37
|
-
fb_pixel: {
|
|
38
|
-
key: 'value',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
const intgName = 'invalid_integration';
|
|
43
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
44
|
-
expect(result).toBeNull();
|
|
45
|
-
});
|
|
46
|
-
// Tests that 'getIntegrationsObj' returns null when the integration name has multiple canonical names but none of them exist in the message.integrations object
|
|
47
|
-
it('should return null when the integration name has multiple canonical names but none of them exist in the message.integrations object', () => {
|
|
48
|
-
const message = {
|
|
49
|
-
integrations: {
|
|
50
|
-
fb_pixel: {
|
|
51
|
-
key: 'value',
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
const intgName = 'invalid_integration';
|
|
56
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
57
|
-
expect(result).toBeNull();
|
|
58
|
-
});
|
|
59
|
-
// Tests that 'getIntegrationsObj' returns null when the message object has no integrations object
|
|
60
|
-
it('should return null when the message object has no integrations object', () => {
|
|
61
|
-
const message = {};
|
|
62
|
-
const intgName = 'fb_pixel';
|
|
63
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
64
|
-
expect(result).toBeNull();
|
|
65
|
-
});
|
|
66
|
-
// Tests that 'getIntegrationsObj' returns null when none of the canonical names for the integration name exist in the integrations object
|
|
67
|
-
it('should return null when none of the canonical names for the integration name exist in the integrations object', () => {
|
|
68
|
-
const message = {
|
|
69
|
-
integrations: {
|
|
70
|
-
some_integration: {
|
|
71
|
-
key: 'value',
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
const intgName = 'fb_pixel';
|
|
76
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
77
|
-
expect(result).toBeNull();
|
|
78
|
-
});
|
|
79
|
-
// Tests that 'getIntegrationsObj' returns null when the canonical name for the integration name exists in the integrations object but its value is null
|
|
80
|
-
it('should return null when the canonical name for the integration name exists in the integrations object but its value is null', () => {
|
|
81
|
-
const message = {
|
|
82
|
-
integrations: {
|
|
83
|
-
fb_pixel: null,
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
const intgName = 'fb_pixel';
|
|
87
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
88
|
-
expect(result).toBeNull();
|
|
89
|
-
});
|
|
90
|
-
// Tests that 'getIntegrationsObj' returns the integrations object for a valid integration name when the value is a number
|
|
91
|
-
it('should return the integrations object for a valid integration name when the value is a number', () => {
|
|
92
|
-
const message = {
|
|
93
|
-
integrations: {
|
|
94
|
-
fb_pixel: 123,
|
|
95
|
-
},
|
|
96
|
-
};
|
|
97
|
-
const intgName = 'fb_pixel';
|
|
98
|
-
const result = sem_1.SemanticUtil.getIntegrationsObj(message, intgName);
|
|
99
|
-
expect(result).toEqual(123);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('getDestinationExternalID', () => {
|
|
103
|
-
// Returns the destination-specific external ID when it exists in the message context.
|
|
104
|
-
it('should return the destination-specific external ID when it exists in the message context', () => {
|
|
105
|
-
const message = {
|
|
106
|
-
context: {
|
|
107
|
-
externalId: [
|
|
108
|
-
{
|
|
109
|
-
type: 'kustomerId',
|
|
110
|
-
id: '12345678',
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
const type = 'kustomerId';
|
|
116
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
117
|
-
expect(result).toBe('12345678');
|
|
118
|
-
});
|
|
119
|
-
// Returns null when the destination-specific external ID does not exist in the message context.
|
|
120
|
-
it('should return null when the destination-specific external ID does not exist in the message context', () => {
|
|
121
|
-
const message = {
|
|
122
|
-
context: {
|
|
123
|
-
externalId: [
|
|
124
|
-
{
|
|
125
|
-
type: 'kustomerId',
|
|
126
|
-
id: '12345678',
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
const type = 'otherId';
|
|
132
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
133
|
-
expect(result).toBeNull();
|
|
134
|
-
});
|
|
135
|
-
// Returns null when the message context is undefined.
|
|
136
|
-
it('should return null when the message context is undefined', () => {
|
|
137
|
-
const message = {};
|
|
138
|
-
const type = 'kustomerId';
|
|
139
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
140
|
-
expect(result).toBeNull();
|
|
141
|
-
});
|
|
142
|
-
// Returns null when the externalId array is not an array.
|
|
143
|
-
it('should return null when the externalId array is not an array', () => {
|
|
144
|
-
const message = {
|
|
145
|
-
context: {
|
|
146
|
-
externalId: '12345678',
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
const type = 'kustomerId';
|
|
150
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
151
|
-
expect(result).toBeNull();
|
|
152
|
-
});
|
|
153
|
-
// Returns null when the externalId array is an empty array.
|
|
154
|
-
it('should return null when the externalId array is an empty array', () => {
|
|
155
|
-
const message = {
|
|
156
|
-
context: {
|
|
157
|
-
externalId: [],
|
|
158
|
-
},
|
|
159
|
-
};
|
|
160
|
-
const type = 'kustomerId';
|
|
161
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
162
|
-
expect(result).toBeNull();
|
|
163
|
-
});
|
|
164
|
-
// Returns null when the externalId array does not contain an object with the specified type.
|
|
165
|
-
it('should return null when the externalId array does not contain an object with the specified type', () => {
|
|
166
|
-
const message = {
|
|
167
|
-
context: {
|
|
168
|
-
externalId: [
|
|
169
|
-
{
|
|
170
|
-
type: 'kustomerId',
|
|
171
|
-
id: '12345678',
|
|
172
|
-
},
|
|
173
|
-
],
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
const type = 'nonExistentType';
|
|
177
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
178
|
-
expect(result).toBeNull();
|
|
179
|
-
});
|
|
180
|
-
// Returns the first destination-specific external ID object with the specified type when multiple objects with the same type exist in the externalId array.
|
|
181
|
-
it('should return the destination-specific external ID when multiple objects with the same type exist in the externalId array', () => {
|
|
182
|
-
const message = {
|
|
183
|
-
context: {
|
|
184
|
-
externalId: [
|
|
185
|
-
{
|
|
186
|
-
type: 'kustomerId',
|
|
187
|
-
id: '12345678',
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
type: 'kustomerId',
|
|
191
|
-
id: '87654321',
|
|
192
|
-
},
|
|
193
|
-
],
|
|
194
|
-
},
|
|
195
|
-
};
|
|
196
|
-
const type = 'kustomerId';
|
|
197
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
198
|
-
expect(result).toBe('12345678');
|
|
199
|
-
});
|
|
200
|
-
// Returns null when the destination-specific external ID object does not have an id property.
|
|
201
|
-
it('should return null when the destination-specific external ID object does not have an id property', () => {
|
|
202
|
-
const message = {
|
|
203
|
-
context: {
|
|
204
|
-
externalId: [
|
|
205
|
-
{
|
|
206
|
-
type: 'kustomerId',
|
|
207
|
-
id: '12345678',
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
type: 'otherId',
|
|
211
|
-
// id property is missing
|
|
212
|
-
},
|
|
213
|
-
],
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
const type = 'otherId';
|
|
217
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
218
|
-
expect(result).toBeUndefined();
|
|
219
|
-
});
|
|
220
|
-
// Returns null when the destination-specific external ID object does not have a type property.
|
|
221
|
-
it('should return null when the destination-specific external ID object does not have a type property', () => {
|
|
222
|
-
const message = {
|
|
223
|
-
context: {
|
|
224
|
-
externalId: [
|
|
225
|
-
{
|
|
226
|
-
id: '12345678',
|
|
227
|
-
},
|
|
228
|
-
],
|
|
229
|
-
},
|
|
230
|
-
};
|
|
231
|
-
const type = 'kustomerId';
|
|
232
|
-
const result = sem_1.SemanticUtil.getDestinationExternalID(message, type);
|
|
233
|
-
expect(result).toBeNull();
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
describe('getDestinationExternalIDInfoForRetl', () => {
|
|
237
|
-
test('should parse everything successfully', () => {
|
|
238
|
-
const msg = {
|
|
239
|
-
context: {
|
|
240
|
-
externalId: [
|
|
241
|
-
{
|
|
242
|
-
type: 'destination-user',
|
|
243
|
-
id: 1245,
|
|
244
|
-
identifierType: 'some',
|
|
245
|
-
},
|
|
246
|
-
],
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDInfoForRetl(msg, 'destination');
|
|
250
|
-
expect(actual.destinationExternalId).toEqual(1245);
|
|
251
|
-
expect(actual.objectType).toEqual('user');
|
|
252
|
-
expect(actual.identifierType).toEqual('some');
|
|
253
|
-
});
|
|
254
|
-
test('should parse everything but return all as null', () => {
|
|
255
|
-
const msg = {
|
|
256
|
-
context: {
|
|
257
|
-
externalId: [
|
|
258
|
-
{
|
|
259
|
-
type: 'destination-',
|
|
260
|
-
},
|
|
261
|
-
],
|
|
262
|
-
},
|
|
263
|
-
};
|
|
264
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDInfoForRetl(msg, 'destination');
|
|
265
|
-
expect(actual.destinationExternalId).toEqual(null);
|
|
266
|
-
expect(actual.objectType).toEqual('');
|
|
267
|
-
expect(actual.identifierType).toEqual(null);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
describe('getDestinationExternalIDObjectForRetl', () => {
|
|
271
|
-
test('should parse everything successfully', () => {
|
|
272
|
-
const msg = {
|
|
273
|
-
context: {
|
|
274
|
-
externalId: [
|
|
275
|
-
{
|
|
276
|
-
type: 'destination-user',
|
|
277
|
-
id: 1245,
|
|
278
|
-
identifierType: 'some',
|
|
279
|
-
},
|
|
280
|
-
],
|
|
281
|
-
},
|
|
282
|
-
};
|
|
283
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDObjectForRetl(msg, 'destination');
|
|
284
|
-
expect(actual?.id).toEqual(1245);
|
|
285
|
-
// TODO: Is this expected ? Confirm with team
|
|
286
|
-
expect(actual?.type).toEqual('destination-user');
|
|
287
|
-
expect(actual?.identifierType).toEqual('some');
|
|
288
|
-
});
|
|
289
|
-
test('should be undefined when externalId does not have type', () => {
|
|
290
|
-
const msg = {
|
|
291
|
-
context: {
|
|
292
|
-
externalId: [
|
|
293
|
-
{
|
|
294
|
-
id: 1245,
|
|
295
|
-
identifierType: 'some',
|
|
296
|
-
},
|
|
297
|
-
],
|
|
298
|
-
},
|
|
299
|
-
};
|
|
300
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDObjectForRetl(msg, 'destination');
|
|
301
|
-
expect(actual).toEqual(undefined);
|
|
302
|
-
});
|
|
303
|
-
test('should be undefined when externalId is not present', () => {
|
|
304
|
-
const msg = {
|
|
305
|
-
context: {},
|
|
306
|
-
};
|
|
307
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDObjectForRetl(msg, 'destination');
|
|
308
|
-
expect(actual).toEqual(undefined);
|
|
309
|
-
});
|
|
310
|
-
test('should be undefined when context is not present', () => {
|
|
311
|
-
const msg = {};
|
|
312
|
-
const actual = sem_1.SemanticUtil.getDestinationExternalIDObjectForRetl(msg, 'destination');
|
|
313
|
-
expect(actual).toEqual(undefined);
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VtLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUF3Qjs7QUFFeEIsK0JBQXFDO0FBRXJDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQzVCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsK0ZBQStGO1FBQy9GLEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxHQUFHLEVBQUU7WUFDNUUsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsWUFBWSxFQUFFO29CQUNaLFFBQVEsRUFBRTt3QkFDUixHQUFHLEVBQUUsT0FBTztxQkFDYjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsa0JBQVksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsNkVBQTZFO1FBQzdFLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsWUFBWSxFQUFFO29CQUNaLFFBQVEsRUFBRTt3QkFDUixHQUFHLEVBQUUsT0FBTztxQkFDYjtpQkFDRjthQUNGLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDcEIsTUFBTSxNQUFNLEdBQUcsa0JBQVksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsK0VBQStFO1FBQy9FLEVBQUUsQ0FBQyxv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YW50aWNVdGlsIH0gZnJvbSAnLi9zZW0nO1xuXG5kZXNjcmliZSgnU2VtYW50aWNVdGlsJywgKCkgPT4ge1xuICBkZXNjcmliZSgnZ2V0SW50ZWdyYXRpb25zT2JqJywgKCkgPT4ge1xuICAgIC8vIFRlc3RzIHRoYXQgJ2dldEludGVncmF0aW9uc09iaicgcmV0dXJucyB0aGUgaW50ZWdyYXRpb25zIG9iamVjdCBmb3IgYSB2YWxpZCBpbnRlZ3JhdGlvbiBuYW1lXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGludGVncmF0aW9ucyBvYmplY3QgZm9yIGEgdmFsaWQgaW50ZWdyYXRpb24gbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGludGVncmF0aW9uczoge1xuICAgICAgICAgIGZiX3BpeGVsOiB7XG4gICAgICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbnRnTmFtZSA9ICdmYl9waXhlbCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0SW50ZWdyYXRpb25zT2JqKG1lc3NhZ2UgYXMgYW55LCBpbnRnTmFtZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsga2V5OiAndmFsdWUnIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCAnZ2V0SW50ZWdyYXRpb25zT2JqJyByZXR1cm5zIG51bGwgZm9yIGFuIGVtcHR5IGludGVncmF0aW9uIG5hbWVcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIGZvciBhbiBlbXB0eSBpbnRlZ3JhdGlvbiBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgICAgZmJfcGl4ZWw6IHtcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGdOYW1lID0gJyc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0SW50ZWdyYXRpb25zT2JqKG1lc3NhZ2UgYXMgYW55LCBpbnRnTmFtZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCAnZ2V0SW50ZWdyYXRpb25zT2JqJyByZXR1cm5zIG51bGwgZm9yIGFuIGludmFsaWQgaW50ZWdyYXRpb24gbmFtZVxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgZm9yIGFuIGludmFsaWQgaW50ZWdyYXRpb24gbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGludGVncmF0aW9uczoge1xuICAgICAgICAgIGZiX3BpeGVsOiB7XG4gICAgICAgICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbnRnTmFtZSA9ICdpbnZhbGlkX2ludGVncmF0aW9uJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXRJbnRlZ3JhdGlvbnNPYmoobWVzc2FnZSBhcyBhbnksIGludGdOYW1lKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0ICdnZXRJbnRlZ3JhdGlvbnNPYmonIHJldHVybnMgbnVsbCB3aGVuIHRoZSBpbnRlZ3JhdGlvbiBuYW1lIGhhcyBtdWx0aXBsZSBjYW5vbmljYWwgbmFtZXMgYnV0IG5vbmUgb2YgdGhlbSBleGlzdCBpbiB0aGUgbWVzc2FnZS5pbnRlZ3JhdGlvbnMgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBpbnRlZ3JhdGlvbiBuYW1lIGhhcyBtdWx0aXBsZSBjYW5vbmljYWwgbmFtZXMgYnV0IG5vbmUgb2YgdGhlbSBleGlzdCBpbiB0aGUgbWVzc2FnZS5pbnRlZ3JhdGlvbnMgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgICAgZmJfcGl4ZWw6IHtcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGdOYW1lID0gJ2ludmFsaWRfaW50ZWdyYXRpb24nO1xuICAgICAgY29uc3QgcmVzdWx0ID0gU2VtYW50aWNVdGlsLmdldEludGVncmF0aW9uc09iaihtZXNzYWdlIGFzIGFueSwgaW50Z05hbWUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFRlc3RzIHRoYXQgJ2dldEludGVncmF0aW9uc09iaicgcmV0dXJucyBudWxsIHdoZW4gdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBubyBpbnRlZ3JhdGlvbnMgb2JqZWN0XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBtZXNzYWdlIG9iamVjdCBoYXMgbm8gaW50ZWdyYXRpb25zIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7fTtcbiAgICAgIGNvbnN0IGludGdOYW1lID0gJ2ZiX3BpeGVsJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXRJbnRlZ3JhdGlvbnNPYmoobWVzc2FnZSBhcyBhbnksIGludGdOYW1lKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0ICdnZXRJbnRlZ3JhdGlvbnNPYmonIHJldHVybnMgbnVsbCB3aGVuIG5vbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBmb3IgdGhlIGludGVncmF0aW9uIG5hbWUgZXhpc3QgaW4gdGhlIGludGVncmF0aW9ucyBvYmplY3RcbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gbm9uZSBvZiB0aGUgY2Fub25pY2FsIG5hbWVzIGZvciB0aGUgaW50ZWdyYXRpb24gbmFtZSBleGlzdCBpbiB0aGUgaW50ZWdyYXRpb25zIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGludGVncmF0aW9uczoge1xuICAgICAgICAgIHNvbWVfaW50ZWdyYXRpb246IHtcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGdOYW1lID0gJ2ZiX3BpeGVsJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXRJbnRlZ3JhdGlvbnNPYmoobWVzc2FnZSBhcyBhbnksIGludGdOYW1lKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBUZXN0cyB0aGF0ICdnZXRJbnRlZ3JhdGlvbnNPYmonIHJldHVybnMgbnVsbCB3aGVuIHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGludGVncmF0aW9uIG5hbWUgZXhpc3RzIGluIHRoZSBpbnRlZ3JhdGlvbnMgb2JqZWN0IGJ1dCBpdHMgdmFsdWUgaXMgbnVsbFxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBpbnRlZ3JhdGlvbiBuYW1lIGV4aXN0cyBpbiB0aGUgaW50ZWdyYXRpb25zIG9iamVjdCBidXQgaXRzIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBpbnRlZ3JhdGlvbnM6IHtcbiAgICAgICAgICBmYl9waXhlbDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbnRnTmFtZSA9ICdmYl9waXhlbCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0SW50ZWdyYXRpb25zT2JqKG1lc3NhZ2UgYXMgYW55LCBpbnRnTmFtZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGVzdHMgdGhhdCAnZ2V0SW50ZWdyYXRpb25zT2JqJyByZXR1cm5zIHRoZSBpbnRlZ3JhdGlvbnMgb2JqZWN0IGZvciBhIHZhbGlkIGludGVncmF0aW9uIG5hbWUgd2hlbiB0aGUgdmFsdWUgaXMgYSBudW1iZXJcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW50ZWdyYXRpb25zIG9iamVjdCBmb3IgYSB2YWxpZCBpbnRlZ3JhdGlvbiBuYW1lIHdoZW4gdGhlIHZhbHVlIGlzIGEgbnVtYmVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgICAgZmJfcGl4ZWw6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbnRnTmFtZSA9ICdmYl9waXhlbCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0SW50ZWdyYXRpb25zT2JqKG1lc3NhZ2UgYXMgYW55LCBpbnRnTmFtZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKDEyMyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXREZXN0aW5hdGlvbkV4dGVybmFsSUQnLCAoKSA9PiB7XG4gICAgLy8gUmV0dXJucyB0aGUgZGVzdGluYXRpb24tc3BlY2lmaWMgZXh0ZXJuYWwgSUQgd2hlbiBpdCBleGlzdHMgaW4gdGhlIG1lc3NhZ2UgY29udGV4dC5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgZGVzdGluYXRpb24tc3BlY2lmaWMgZXh0ZXJuYWwgSUQgd2hlbiBpdCBleGlzdHMgaW4gdGhlIG1lc3NhZ2UgY29udGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdrdXN0b21lcklkJyxcbiAgICAgICAgICAgICAgaWQ6ICcxMjM0NTY3OCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHlwZSA9ICdrdXN0b21lcklkJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXREZXN0aW5hdGlvbkV4dGVybmFsSUQobWVzc2FnZSBhcyBhbnksIHR5cGUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgnMTIzNDU2NzgnKTtcbiAgICB9KTtcblxuICAgIC8vIFJldHVybnMgbnVsbCB3aGVuIHRoZSBkZXN0aW5hdGlvbi1zcGVjaWZpYyBleHRlcm5hbCBJRCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWVzc2FnZSBjb250ZXh0LlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgZGVzdGluYXRpb24tc3BlY2lmaWMgZXh0ZXJuYWwgSUQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1lc3NhZ2UgY29udGV4dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdrdXN0b21lcklkJyxcbiAgICAgICAgICAgICAgaWQ6ICcxMjM0NTY3OCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHlwZSA9ICdvdGhlcklkJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXREZXN0aW5hdGlvbkV4dGVybmFsSUQobWVzc2FnZSBhcyBhbnksIHR5cGUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFJldHVybnMgbnVsbCB3aGVuIHRoZSBtZXNzYWdlIGNvbnRleHQgaXMgdW5kZWZpbmVkLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgbWVzc2FnZSBjb250ZXh0IGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7fTtcbiAgICAgIGNvbnN0IHR5cGUgPSAna3VzdG9tZXJJZCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0RGVzdGluYXRpb25FeHRlcm5hbElEKG1lc3NhZ2UgYXMgYW55LCB0eXBlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm5zIG51bGwgd2hlbiB0aGUgZXh0ZXJuYWxJZCBhcnJheSBpcyBub3QgYW4gYXJyYXkuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVsbCB3aGVuIHRoZSBleHRlcm5hbElkIGFycmF5IGlzIG5vdCBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiAnMTIzNDU2NzgnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSAna3VzdG9tZXJJZCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0RGVzdGluYXRpb25FeHRlcm5hbElEKG1lc3NhZ2UgYXMgYW55LCB0eXBlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm5zIG51bGwgd2hlbiB0aGUgZXh0ZXJuYWxJZCBhcnJheSBpcyBhbiBlbXB0eSBhcnJheS5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gdGhlIGV4dGVybmFsSWQgYXJyYXkgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZXh0ZXJuYWxJZDogW10sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHlwZSA9ICdrdXN0b21lcklkJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXREZXN0aW5hdGlvbkV4dGVybmFsSUQobWVzc2FnZSBhcyBhbnksIHR5cGUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIC8vIFJldHVybnMgbnVsbCB3aGVuIHRoZSBleHRlcm5hbElkIGFycmF5IGRvZXMgbm90IGNvbnRhaW4gYW4gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgZXh0ZXJuYWxJZCBhcnJheSBkb2VzIG5vdCBjb250YWluIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdrdXN0b21lcklkJyxcbiAgICAgICAgICAgICAgaWQ6ICcxMjM0NTY3OCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHlwZSA9ICdub25FeGlzdGVudFR5cGUnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gU2VtYW50aWNVdGlsLmdldERlc3RpbmF0aW9uRXh0ZXJuYWxJRChtZXNzYWdlIGFzIGFueSwgdHlwZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZGVzdGluYXRpb24tc3BlY2lmaWMgZXh0ZXJuYWwgSUQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHR5cGUgZXhpc3QgaW4gdGhlIGV4dGVybmFsSWQgYXJyYXkuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGRlc3RpbmF0aW9uLXNwZWNpZmljIGV4dGVybmFsIElEIHdoZW4gbXVsdGlwbGUgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHR5cGUgZXhpc3QgaW4gdGhlIGV4dGVybmFsSWQgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZXh0ZXJuYWxJZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAna3VzdG9tZXJJZCcsXG4gICAgICAgICAgICAgIGlkOiAnMTIzNDU2NzgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ2t1c3RvbWVySWQnLFxuICAgICAgICAgICAgICBpZDogJzg3NjU0MzIxJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eXBlID0gJ2t1c3RvbWVySWQnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gU2VtYW50aWNVdGlsLmdldERlc3RpbmF0aW9uRXh0ZXJuYWxJRChtZXNzYWdlIGFzIGFueSwgdHlwZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKCcxMjM0NTY3OCcpO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJucyBudWxsIHdoZW4gdGhlIGRlc3RpbmF0aW9uLXNwZWNpZmljIGV4dGVybmFsIElEIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFuIGlkIHByb3BlcnR5LlxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgd2hlbiB0aGUgZGVzdGluYXRpb24tc3BlY2lmaWMgZXh0ZXJuYWwgSUQgb2JqZWN0IGRvZXMgbm90IGhhdmUgYW4gaWQgcHJvcGVydHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZXh0ZXJuYWxJZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAna3VzdG9tZXJJZCcsXG4gICAgICAgICAgICAgIGlkOiAnMTIzNDU2NzgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogJ290aGVySWQnLFxuICAgICAgICAgICAgICAvLyBpZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgdHlwZSA9ICdvdGhlcklkJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFNlbWFudGljVXRpbC5nZXREZXN0aW5hdGlvbkV4dGVybmFsSUQobWVzc2FnZSBhcyBhbnksIHR5cGUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0dXJucyBudWxsIHdoZW4gdGhlIGRlc3RpbmF0aW9uLXNwZWNpZmljIGV4dGVybmFsIElEIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eS5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBudWxsIHdoZW4gdGhlIGRlc3RpbmF0aW9uLXNwZWNpZmljIGV4dGVybmFsIElEIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTIzNDU2NzgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR5cGUgPSAna3VzdG9tZXJJZCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBTZW1hbnRpY1V0aWwuZ2V0RGVzdGluYXRpb25FeHRlcm5hbElEKG1lc3NhZ2UgYXMgYW55LCB0eXBlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXREZXN0aW5hdGlvbkV4dGVybmFsSURJbmZvRm9yUmV0bCcsICgpID0+IHtcbiAgICB0ZXN0KCdzaG91bGQgcGFyc2UgZXZlcnl0aGluZyBzdWNjZXNzZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZXN0aW5hdGlvbi11c2VyJyxcbiAgICAgICAgICAgICAgaWQ6IDEyNDUsXG4gICAgICAgICAgICAgIGlkZW50aWZpZXJUeXBlOiAnc29tZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgYWN0dWFsID0gU2VtYW50aWNVdGlsLmdldERlc3RpbmF0aW9uRXh0ZXJuYWxJREluZm9Gb3JSZXRsKG1zZyBhcyBhbnksICdkZXN0aW5hdGlvbicpO1xuICAgICAgZXhwZWN0KGFjdHVhbC5kZXN0aW5hdGlvbkV4dGVybmFsSWQpLnRvRXF1YWwoMTI0NSk7XG4gICAgICBleHBlY3QoYWN0dWFsLm9iamVjdFR5cGUpLnRvRXF1YWwoJ3VzZXInKTtcbiAgICAgIGV4cGVjdChhY3R1YWwuaWRlbnRpZmllclR5cGUpLnRvRXF1YWwoJ3NvbWUnKTtcbiAgICB9KTtcbiAgICB0ZXN0KCdzaG91bGQgcGFyc2UgZXZlcnl0aGluZyBidXQgcmV0dXJuIGFsbCBhcyBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZXh0ZXJuYWxJZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnZGVzdGluYXRpb24tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhY3R1YWwgPSBTZW1hbnRpY1V0aWwuZ2V0RGVzdGluYXRpb25FeHRlcm5hbElESW5mb0ZvclJldGwobXNnIGFzIGFueSwgJ2Rlc3RpbmF0aW9uJyk7XG4gICAgICBleHBlY3QoYWN0dWFsLmRlc3RpbmF0aW9uRXh0ZXJuYWxJZCkudG9FcXVhbChudWxsKTtcbiAgICAgIGV4cGVjdChhY3R1YWwub2JqZWN0VHlwZSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoYWN0dWFsLmlkZW50aWZpZXJUeXBlKS50b0VxdWFsKG51bGwpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0RGVzdGluYXRpb25FeHRlcm5hbElET2JqZWN0Rm9yUmV0bCcsICgpID0+IHtcbiAgICB0ZXN0KCdzaG91bGQgcGFyc2UgZXZlcnl0aGluZyBzdWNjZXNzZnVsbHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZXN0aW5hdGlvbi11c2VyJyxcbiAgICAgICAgICAgICAgaWQ6IDEyNDUsXG4gICAgICAgICAgICAgIGlkZW50aWZpZXJUeXBlOiAnc29tZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgYWN0dWFsID0gU2VtYW50aWNVdGlsLmdldERlc3RpbmF0aW9uRXh0ZXJuYWxJRE9iamVjdEZvclJldGwobXNnIGFzIGFueSwgJ2Rlc3RpbmF0aW9uJyk7XG4gICAgICBleHBlY3QoYWN0dWFsPy5pZCkudG9FcXVhbCgxMjQ1KTtcbiAgICAgIC8vIFRPRE86IElzIHRoaXMgZXhwZWN0ZWQgPyBDb25maXJtIHdpdGggdGVhbVxuICAgICAgZXhwZWN0KGFjdHVhbD8udHlwZSkudG9FcXVhbCgnZGVzdGluYXRpb24tdXNlcicpO1xuICAgICAgZXhwZWN0KGFjdHVhbD8uaWRlbnRpZmllclR5cGUpLnRvRXF1YWwoJ3NvbWUnKTtcbiAgICB9KTtcbiAgICB0ZXN0KCdzaG91bGQgYmUgdW5kZWZpbmVkIHdoZW4gZXh0ZXJuYWxJZCBkb2VzIG5vdCBoYXZlIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBleHRlcm5hbElkOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAxMjQ1LFxuICAgICAgICAgICAgICBpZGVudGlmaWVyVHlwZTogJ3NvbWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IFNlbWFudGljVXRpbC5nZXREZXN0aW5hdGlvbkV4dGVybmFsSURPYmplY3RGb3JSZXRsKG1zZyBhcyBhbnksICdkZXN0aW5hdGlvbicpO1xuICAgICAgZXhwZWN0KGFjdHVhbCkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICAgIHRlc3QoJ3Nob3VsZCBiZSB1bmRlZmluZWQgd2hlbiBleHRlcm5hbElkIGlzIG5vdCBwcmVzZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbXNnID0ge1xuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhY3R1YWwgPSBTZW1hbnRpY1V0aWwuZ2V0RGVzdGluYXRpb25FeHRlcm5hbElET2JqZWN0Rm9yUmV0bChtc2cgYXMgYW55LCAnZGVzdGluYXRpb24nKTtcbiAgICAgIGV4cGVjdChhY3R1YWwpLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICB0ZXN0KCdzaG91bGQgYmUgdW5kZWZpbmVkIHdoZW4gY29udGV4dCBpcyBub3QgcHJlc2VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IHt9O1xuICAgICAgY29uc3QgYWN0dWFsID0gU2VtYW50aWNVdGlsLmdldERlc3RpbmF0aW9uRXh0ZXJuYWxJRE9iamVjdEZvclJldGwobXNnIGFzIGFueSwgJ2Rlc3RpbmF0aW9uJyk7XG4gICAgICBleHBlY3QoYWN0dWFsKS50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|