@mecanizou/telemetry-hub 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/.github/workflows/pull_request.yml +32 -32
  2. package/.github/workflows/release.yml +129 -129
  3. package/.prettierignore +4 -4
  4. package/CHANGELOG.md +14 -0
  5. package/DOCS_GUIDE.md +151 -0
  6. package/README.md +248 -0
  7. package/dist/core/__tests__/logger-types.test.d.ts +1 -0
  8. package/dist/core/__tests__/logger-types.test.js +325 -0
  9. package/dist/core/__tests__/logger.test.d.ts +1 -0
  10. package/dist/core/__tests__/logger.test.js +337 -0
  11. package/dist/core/__tests__/tracer.test.d.ts +1 -0
  12. package/dist/core/__tests__/tracer.test.js +330 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/index.js +8 -0
  15. package/dist/core/logger-types.d.ts +43 -0
  16. package/dist/core/logger-types.js +3 -0
  17. package/dist/core/logger.d.ts +13 -0
  18. package/dist/core/logger.js +123 -0
  19. package/dist/core/tracer-types.d.ts +50 -0
  20. package/dist/core/tracer-types.js +3 -0
  21. package/dist/core/tracer.d.ts +10 -0
  22. package/dist/core/tracer.js +114 -0
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.js +4 -2
  25. package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
  26. package/dist/sst/__tests__/telemetry.test.js +138 -0
  27. package/dist/sst/index.d.ts +1 -0
  28. package/dist/sst/index.js +18 -0
  29. package/dist/sst/middy/index.d.ts +1 -0
  30. package/dist/sst/middy/index.js +18 -0
  31. package/dist/sst/middy/middleware.d.ts +5 -0
  32. package/dist/sst/middy/middleware.js +157 -0
  33. package/dist/sst/telemetry.d.ts +4 -0
  34. package/dist/sst/telemetry.js +121 -0
  35. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
  36. package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
  37. package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
  38. package/dist/telemetry/core/__tests__/logger.test.js +337 -0
  39. package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
  40. package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
  41. package/dist/telemetry/core/index.d.ts +4 -0
  42. package/dist/telemetry/core/index.js +8 -0
  43. package/dist/telemetry/core/logger-types.d.ts +43 -0
  44. package/dist/telemetry/core/logger-types.js +3 -0
  45. package/dist/telemetry/core/logger.d.ts +13 -0
  46. package/dist/telemetry/core/logger.js +123 -0
  47. package/dist/telemetry/core/tracer-types.d.ts +50 -0
  48. package/dist/telemetry/core/tracer-types.js +3 -0
  49. package/dist/telemetry/core/tracer.d.ts +10 -0
  50. package/dist/telemetry/core/tracer.js +114 -0
  51. package/dist/telemetry/index.d.ts +3 -0
  52. package/dist/telemetry/index.js +20 -0
  53. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
  54. package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
  55. package/dist/telemetry/sst/index.d.ts +1 -0
  56. package/dist/telemetry/sst/index.js +18 -0
  57. package/dist/telemetry/sst/middy/index.d.ts +1 -0
  58. package/dist/telemetry/sst/middy/index.js +18 -0
  59. package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
  60. package/dist/telemetry/sst/middy/middleware.js +157 -0
  61. package/dist/telemetry/sst/telemetry.d.ts +4 -0
  62. package/dist/telemetry/sst/telemetry.js +121 -0
  63. package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
  64. package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
  65. package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
  66. package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
  67. package/dist/telemetry/tsed/config.d.ts +26 -0
  68. package/dist/telemetry/tsed/config.js +166 -0
  69. package/dist/telemetry/tsed/index.d.ts +4 -0
  70. package/dist/telemetry/tsed/index.js +21 -0
  71. package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
  72. package/dist/telemetry/tsed/log-telemetry.js +196 -0
  73. package/dist/telemetry/tsed/service.d.ts +26 -0
  74. package/dist/telemetry/tsed/service.js +150 -0
  75. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
  76. package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
  77. package/dist/tsed/__tests__/config.test.d.ts +1 -0
  78. package/dist/tsed/__tests__/config.test.js +146 -0
  79. package/dist/tsed/__tests__/service.test.d.ts +1 -0
  80. package/dist/tsed/__tests__/service.test.js +63 -0
  81. package/dist/tsed/config.d.ts +26 -0
  82. package/dist/tsed/config.js +166 -0
  83. package/dist/tsed/index.d.ts +4 -0
  84. package/dist/tsed/index.js +21 -0
  85. package/dist/tsed/log-telemetry.d.ts +1 -0
  86. package/dist/tsed/log-telemetry.js +196 -0
  87. package/dist/tsed/service.d.ts +26 -0
  88. package/dist/tsed/service.js +150 -0
  89. package/dist/tsed/sync-log-record-processor.d.ts +11 -0
  90. package/dist/tsed/sync-log-record-processor.js +74 -0
  91. package/package.json +72 -56
  92. package/release.config.js +23 -23
  93. package/vitest.config.ts +22 -0
  94. package/dist/check-if-is-working.d.ts +0 -1
  95. package/dist/check-if-is-working.js +0 -8
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const vitest_1 = require("vitest");
13
+ const logger_1 = require("../logger");
14
+ const api_logs_1 = require("@opentelemetry/api-logs");
15
+ (0, vitest_1.describe)('StandardLogger', () => {
16
+ let mockLogger;
17
+ let standardLogger;
18
+ (0, vitest_1.beforeEach)(() => {
19
+ mockLogger = {
20
+ emit: vitest_1.vi.fn(),
21
+ };
22
+ standardLogger = new logger_1.StandardLogger(mockLogger, 'test-service');
23
+ });
24
+ (0, vitest_1.describe)('logError', () => {
25
+ (0, vitest_1.it)('deve emitir log com severity ERROR', () => __awaiter(void 0, void 0, void 0, function* () {
26
+ const errorData = {
27
+ message: 'Test error message',
28
+ serviceName: 'test-service',
29
+ environment: 'test',
30
+ };
31
+ yield standardLogger.logError(errorData);
32
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
33
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
34
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.ERROR);
35
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('ERROR');
36
+ (0, vitest_1.expect)(emittedLog.body).toBe('Test error message');
37
+ }));
38
+ (0, vitest_1.it)('deve incluir informações do erro quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
39
+ const error = new Error('Custom error');
40
+ const errorData = {
41
+ message: 'Error occurred',
42
+ error,
43
+ serviceName: 'test-service',
44
+ environment: 'production',
45
+ };
46
+ yield standardLogger.logError(errorData);
47
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
48
+ (0, vitest_1.expect)(emittedLog.attributes['error.type']).toBe('Error');
49
+ (0, vitest_1.expect)(emittedLog.attributes['error.message']).toBe('Custom error');
50
+ (0, vitest_1.expect)(emittedLog.attributes['error.stack']).toBeDefined();
51
+ }));
52
+ (0, vitest_1.it)('deve incluir contexto HTTP quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
53
+ const errorData = {
54
+ message: 'HTTP error',
55
+ serviceName: 'test-service',
56
+ environment: 'production',
57
+ http: {
58
+ method: 'POST',
59
+ url: '/api/test',
60
+ endpoint: '/api/test',
61
+ statusCode: 500,
62
+ headers: { 'content-type': 'application/json' },
63
+ body: { test: 'data' },
64
+ params: { id: '123' },
65
+ query: { filter: 'active' },
66
+ },
67
+ };
68
+ yield standardLogger.logError(errorData);
69
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
70
+ (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
71
+ (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBe('/api/test');
72
+ (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
73
+ (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBe(500);
74
+ (0, vitest_1.expect)(emittedLog.attributes['http.headers']).toBe(JSON.stringify({ 'content-type': 'application/json' }));
75
+ (0, vitest_1.expect)(emittedLog.attributes['http.body']).toBe(JSON.stringify({ test: 'data' }));
76
+ }));
77
+ (0, vitest_1.it)('deve incluir informações de usuário quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
78
+ const errorData = {
79
+ message: 'User error',
80
+ serviceName: 'test-service',
81
+ environment: 'production',
82
+ user: {
83
+ accountUserUid: 'user-123',
84
+ accountUid: 'account-456',
85
+ applicationUid: 'app-789',
86
+ },
87
+ };
88
+ yield standardLogger.logError(errorData);
89
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
90
+ (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
91
+ (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBe('account-456');
92
+ (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBe('app-789');
93
+ }));
94
+ (0, vitest_1.it)('deve incluir informações de execução quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
95
+ const errorData = {
96
+ message: 'Execution error',
97
+ serviceName: 'test-service',
98
+ environment: 'production',
99
+ execution: {
100
+ requestId: 'req-123',
101
+ awsRequestId: 'aws-456',
102
+ functionName: 'testFunction',
103
+ invocationId: 'inv-789',
104
+ controller: 'TestController',
105
+ controllerMethod: 'testMethod',
106
+ origin: 'mobile',
107
+ },
108
+ };
109
+ yield standardLogger.logError(errorData);
110
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
111
+ (0, vitest_1.expect)(emittedLog.attributes['request.id']).toBe('req-123');
112
+ (0, vitest_1.expect)(emittedLog.attributes['aws.request.id']).toBe('aws-456');
113
+ (0, vitest_1.expect)(emittedLog.attributes['faas.name']).toBe('testFunction');
114
+ (0, vitest_1.expect)(emittedLog.attributes['faas.invocation_id']).toBe('inv-789');
115
+ (0, vitest_1.expect)(emittedLog.attributes['controller.name']).toBe('TestController');
116
+ (0, vitest_1.expect)(emittedLog.attributes['controller.method']).toBe('testMethod');
117
+ (0, vitest_1.expect)(emittedLog.attributes['origin']).toBe('mobile');
118
+ }));
119
+ (0, vitest_1.it)('deve incluir métricas de performance quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
120
+ const errorData = {
121
+ message: 'Performance error',
122
+ serviceName: 'test-service',
123
+ environment: 'production',
124
+ performance: {
125
+ durationMs: 1500,
126
+ success: false,
127
+ },
128
+ };
129
+ yield standardLogger.logError(errorData);
130
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
131
+ (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(1500);
132
+ (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(false);
133
+ }));
134
+ (0, vitest_1.it)('deve incluir contexto adicional quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
135
+ const errorData = {
136
+ message: 'Context error',
137
+ serviceName: 'test-service',
138
+ environment: 'production',
139
+ context: {
140
+ additionalInfo: 'some data',
141
+ nested: { value: 123 },
142
+ },
143
+ };
144
+ yield standardLogger.logError(errorData);
145
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
146
+ (0, vitest_1.expect)(emittedLog.attributes['context']).toBe(JSON.stringify({ additionalInfo: 'some data', nested: { value: 123 } }));
147
+ }));
148
+ (0, vitest_1.it)('deve usar serviceName padrão quando não fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
149
+ const errorData = {
150
+ message: 'Default service error',
151
+ serviceName: '',
152
+ environment: 'production',
153
+ };
154
+ yield standardLogger.logError(errorData);
155
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
156
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('test-service');
157
+ }));
158
+ (0, vitest_1.it)('deve adicionar timestamp automaticamente', () => __awaiter(void 0, void 0, void 0, function* () {
159
+ const errorData = {
160
+ message: 'Timestamp test',
161
+ serviceName: 'test-service',
162
+ environment: 'production',
163
+ };
164
+ yield standardLogger.logError(errorData);
165
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
166
+ (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toBeDefined();
167
+ (0, vitest_1.expect)(emittedLog.attributes['timestamp']).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
168
+ }));
169
+ (0, vitest_1.it)('deve filtrar valores undefined e null dos atributos', () => __awaiter(void 0, void 0, void 0, function* () {
170
+ const errorData = {
171
+ message: 'Filter test',
172
+ serviceName: 'test-service',
173
+ environment: 'production',
174
+ user: {
175
+ accountUserUid: 'user-123',
176
+ accountUid: undefined,
177
+ applicationUid: undefined,
178
+ },
179
+ };
180
+ yield standardLogger.logError(errorData);
181
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
182
+ (0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
183
+ (0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBeUndefined();
184
+ (0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBeUndefined();
185
+ }));
186
+ });
187
+ (0, vitest_1.describe)('logInfo', () => {
188
+ (0, vitest_1.it)('deve emitir log com severity INFO', () => __awaiter(void 0, void 0, void 0, function* () {
189
+ const infoData = {
190
+ message: 'Info message',
191
+ serviceName: 'test-service',
192
+ environment: 'production',
193
+ };
194
+ yield standardLogger.logInfo(infoData);
195
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
196
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
197
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.INFO);
198
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('INFO');
199
+ (0, vitest_1.expect)(emittedLog.body).toBe('Info message');
200
+ }));
201
+ (0, vitest_1.it)('deve incluir dados de performance em log de sucesso', () => __awaiter(void 0, void 0, void 0, function* () {
202
+ const infoData = {
203
+ message: 'Request completed',
204
+ serviceName: 'test-service',
205
+ environment: 'production',
206
+ performance: {
207
+ durationMs: 250,
208
+ success: true,
209
+ },
210
+ };
211
+ yield standardLogger.logInfo(infoData);
212
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
213
+ (0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(250);
214
+ (0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(true);
215
+ }));
216
+ });
217
+ (0, vitest_1.describe)('logWarn', () => {
218
+ (0, vitest_1.it)('deve emitir log com severity WARN', () => __awaiter(void 0, void 0, void 0, function* () {
219
+ const warnData = {
220
+ message: 'Warning message',
221
+ serviceName: 'test-service',
222
+ environment: 'production',
223
+ };
224
+ yield standardLogger.logWarn(warnData);
225
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
226
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
227
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.WARN);
228
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('WARN');
229
+ (0, vitest_1.expect)(emittedLog.body).toBe('Warning message');
230
+ }));
231
+ });
232
+ (0, vitest_1.describe)('logDebug', () => {
233
+ (0, vitest_1.it)('deve emitir log com severity DEBUG', () => __awaiter(void 0, void 0, void 0, function* () {
234
+ const debugData = {
235
+ message: 'Debug message',
236
+ serviceName: 'test-service',
237
+ environment: 'development',
238
+ };
239
+ yield standardLogger.logDebug(debugData);
240
+ (0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
241
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
242
+ (0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.DEBUG);
243
+ (0, vitest_1.expect)(emittedLog.severityText).toBe('DEBUG');
244
+ (0, vitest_1.expect)(emittedLog.body).toBe('Debug message');
245
+ }));
246
+ });
247
+ (0, vitest_1.describe)('buildAttributes', () => {
248
+ (0, vitest_1.it)('deve construir atributos completos com todos os campos', () => __awaiter(void 0, void 0, void 0, function* () {
249
+ const fullData = {
250
+ message: 'Complete log',
251
+ serviceName: 'complete-service',
252
+ environment: 'production',
253
+ error: new Error('Test error'),
254
+ http: {
255
+ method: 'GET',
256
+ url: '/api/users',
257
+ endpoint: '/api/users',
258
+ statusCode: 200,
259
+ },
260
+ user: {
261
+ accountUserUid: 'user-abc',
262
+ accountUid: 'account-xyz',
263
+ applicationUid: 'app-123',
264
+ },
265
+ execution: {
266
+ requestId: 'req-001',
267
+ awsRequestId: 'aws-002',
268
+ functionName: 'getUsers',
269
+ invocationId: 'inv-003',
270
+ controller: 'UserController',
271
+ controllerMethod: 'getAll',
272
+ origin: 'web',
273
+ },
274
+ performance: {
275
+ durationMs: 300,
276
+ success: true,
277
+ },
278
+ context: {
279
+ custom: 'data',
280
+ },
281
+ };
282
+ yield standardLogger.logInfo(fullData);
283
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
284
+ const attrs = emittedLog.attributes;
285
+ (0, vitest_1.expect)(attrs['service.name']).toBe('complete-service');
286
+ (0, vitest_1.expect)(attrs['deployment.environment.name']).toBe('production');
287
+ (0, vitest_1.expect)(attrs['error.type']).toBe('Error');
288
+ (0, vitest_1.expect)(attrs['http.method']).toBe('GET');
289
+ (0, vitest_1.expect)(attrs['accountUser.uid']).toBe('user-abc');
290
+ (0, vitest_1.expect)(attrs['request.id']).toBe('req-001');
291
+ (0, vitest_1.expect)(attrs['duration.ms']).toBe(300);
292
+ (0, vitest_1.expect)(attrs['context']).toBe(JSON.stringify({ custom: 'data' }));
293
+ }));
294
+ (0, vitest_1.it)('deve lidar com campos HTTP parciais', () => __awaiter(void 0, void 0, void 0, function* () {
295
+ const partialHttpData = {
296
+ message: 'Partial HTTP',
297
+ serviceName: 'test-service',
298
+ environment: 'production',
299
+ http: {
300
+ method: 'POST',
301
+ endpoint: '/api/test',
302
+ },
303
+ };
304
+ yield standardLogger.logInfo(partialHttpData);
305
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
306
+ (0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
307
+ (0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
308
+ (0, vitest_1.expect)(emittedLog.attributes['http.url']).toBeUndefined();
309
+ (0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBeUndefined();
310
+ }));
311
+ });
312
+ (0, vitest_1.describe)('construtor', () => {
313
+ (0, vitest_1.it)('deve aceitar serviceName padrão personalizado', () => {
314
+ const customLogger = new logger_1.StandardLogger(mockLogger, 'custom-service');
315
+ const logData = {
316
+ message: 'Test',
317
+ serviceName: '',
318
+ environment: 'test',
319
+ };
320
+ customLogger.logInfo(logData);
321
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
322
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('custom-service');
323
+ });
324
+ (0, vitest_1.it)('deve usar "unknown-service" como padrão quando não especificado', () => {
325
+ const defaultLogger = new logger_1.StandardLogger(mockLogger);
326
+ const logData = {
327
+ message: 'Test',
328
+ serviceName: '',
329
+ environment: 'test',
330
+ };
331
+ defaultLogger.logInfo(logData);
332
+ const emittedLog = mockLogger.emit.mock.calls[0][0];
333
+ (0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('unknown-service');
334
+ });
335
+ });
336
+ });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVsZW1ldHJ5L2NvcmUvX190ZXN0c19fL2xvZ2dlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThEO0FBQzlELHNDQUEyQztBQUMzQyxzREFBeUQ7QUFFekQsSUFBQSxpQkFBUSxFQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLFVBQWUsQ0FBQztJQUNwQixJQUFJLGNBQThCLENBQUM7SUFFbkMsSUFBQSxtQkFBVSxFQUFDLEdBQUcsRUFBRTtRQUNkLFVBQVUsR0FBRztZQUNYLElBQUksRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1NBQ2QsQ0FBQztRQUNGLGNBQWMsR0FBRyxJQUFJLHVCQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsb0JBQW9CO2dCQUM3QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLE1BQU07YUFDcEIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsbURBQW1ELEVBQUUsR0FBUyxFQUFFO1lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixLQUFLO2dCQUNMLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTthQUMxQixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyw2Q0FBNkMsRUFBRSxHQUFTLEVBQUU7WUFDM0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsTUFBTTtvQkFDZCxHQUFHLEVBQUUsV0FBVztvQkFDaEIsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxHQUFHO29CQUNmLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtvQkFDL0MsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDdEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtvQkFDckIsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtpQkFDNUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQ3ZELENBQUM7WUFDRixJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQ2pDLENBQUM7UUFDSixDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsc0RBQXNELEVBQUUsR0FBUyxFQUFFO1lBQ3BFLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsWUFBWTtnQkFDckIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixJQUFJLEVBQUU7b0JBQ0osY0FBYyxFQUFFLFVBQVU7b0JBQzFCLFVBQVUsRUFBRSxhQUFhO29CQUN6QixjQUFjLEVBQUUsU0FBUztpQkFDMUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHVEQUF1RCxFQUFFLEdBQVMsRUFBRTtZQUNyRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsY0FBYztvQkFDNUIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFlBQVk7b0JBQzlCLE1BQU0sRUFBRSxRQUFRO2lCQUNqQjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyx1REFBdUQsRUFBRSxHQUFTLEVBQUU7WUFDckUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFTLEVBQUU7WUFDaEUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsV0FBVztvQkFDM0IsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtpQkFDdkI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUN4RSxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLG1EQUFtRCxFQUFFLEdBQVMsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLHVCQUF1QjtnQkFDaEMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBUyxFQUFFO1lBQ3hELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2hELCtDQUErQyxDQUNoRCxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFEQUFxRCxFQUFFLEdBQVMsRUFBRTtZQUNuRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLGNBQWMsRUFBRSxVQUFVO29CQUMxQixVQUFVLEVBQUUsU0FBZ0I7b0JBQzVCLGNBQWMsRUFBRSxTQUFnQjtpQkFDakM7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25FLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLElBQUEsV0FBRSxFQUFDLG1DQUFtQyxFQUFFLEdBQVMsRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRztnQkFDZixPQUFPLEVBQUUsY0FBYztnQkFDdkIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxxREFBcUQsRUFBRSxHQUFTLEVBQUU7WUFDbkUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLEdBQUc7b0JBQ2YsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGlCQUFRLEVBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixJQUFBLFdBQUUsRUFBQyxtQ0FBbUMsRUFBRSxHQUFTLEVBQUU7WUFDakQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxhQUFhO2FBQzNCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBQSxXQUFFLEVBQUMsd0RBQXdELEVBQUUsR0FBUyxFQUFFO1lBQ3RFLE1BQU0sUUFBUSxHQUFHO2dCQUNmLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsa0JBQWtCO2dCQUMvQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDOUIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxLQUFLO29CQUNiLEdBQUcsRUFBRSxZQUFZO29CQUNqQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLEdBQUc7aUJBQ2hCO2dCQUNELElBQUksRUFBRTtvQkFDSixjQUFjLEVBQUUsVUFBVTtvQkFDMUIsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLGNBQWMsRUFBRSxTQUFTO2lCQUMxQjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFFBQVE7b0JBQzFCLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsR0FBRztvQkFDZixPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBR3BDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFDQUFxQyxFQUFFLEdBQVMsRUFBRTtZQUNuRCxNQUFNLGVBQWUsR0FBRztnQkFDdEIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxNQUFNO29CQUNkLFFBQVEsRUFBRSxXQUFXO2lCQUV0QjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFOUMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7UUFDMUIsSUFBQSxXQUFFLEVBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RSxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO1lBQ3pFLE1BQU0sYUFBYSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUvQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCwgZXhwZWN0LCB2aSwgYmVmb3JlRWFjaCB9IGZyb20gJ3ZpdGVzdCc7XHJcbmltcG9ydCB7IFN0YW5kYXJkTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcclxuaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGktbG9ncyc7XHJcblxyXG5kZXNjcmliZSgnU3RhbmRhcmRMb2dnZXInLCAoKSA9PiB7XHJcbiAgbGV0IG1vY2tMb2dnZXI6IGFueTtcclxuICBsZXQgc3RhbmRhcmRMb2dnZXI6IFN0YW5kYXJkTG9nZ2VyO1xyXG5cclxuICBiZWZvcmVFYWNoKCgpID0+IHtcclxuICAgIG1vY2tMb2dnZXIgPSB7XHJcbiAgICAgIGVtaXQ6IHZpLmZuKCksXHJcbiAgICB9O1xyXG4gICAgc3RhbmRhcmRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlciwgJ3Rlc3Qtc2VydmljZScpO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRXJyb3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBFUlJPUicsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0IGVycm9yIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5FUlJPUik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnRVJST1InKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYm9keSkudG9CZSgnVGVzdCBlcnJvciBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZG8gZXJybyBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ3VzdG9tIGVycm9yJyk7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXJyb3Igb2NjdXJyZWQnLFxyXG4gICAgICAgIGVycm9yLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXJyb3IudHlwZSddKS50b0JlKCdFcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5tZXNzYWdlJ10pLnRvQmUoJ0N1c3RvbSBlcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5zdGFjayddKS50b0JlRGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBjb250ZXh0byBIVFRQIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSFRUUCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICB1cmw6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxyXG4gICAgICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgICBib2R5OiB7IHRlc3Q6ICdkYXRhJyB9LFxyXG4gICAgICAgICAgcGFyYW1zOiB7IGlkOiAnMTIzJyB9LFxyXG4gICAgICAgICAgcXVlcnk6IHsgZmlsdGVyOiAnYWN0aXZlJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLmVuZHBvaW50J10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLnN0YXR1c19jb2RlJ10pLnRvQmUoNTAwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5oZWFkZXJzJ10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuYm9keSddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgdGVzdDogJ2RhdGEnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZGUgdXN1w6FyaW8gcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdVc2VyIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICB1c2VyOiB7XHJcbiAgICAgICAgICBhY2NvdW50VXNlclVpZDogJ3VzZXItMTIzJyxcclxuICAgICAgICAgIGFjY291bnRVaWQ6ICdhY2NvdW50LTQ1NicsXHJcbiAgICAgICAgICBhcHBsaWNhdGlvblVpZDogJ2FwcC03ODknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZSgnYWNjb3VudC00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYXBwbGljYXRpb24udWlkJ10pLnRvQmUoJ2FwcC03ODknKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkZSBleGVjdcOnw6NvIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXhlY3V0aW9uIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0xMjMnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTQ1NicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICd0ZXN0RnVuY3Rpb24nLFxyXG4gICAgICAgICAgaW52b2NhdGlvbklkOiAnaW52LTc4OScsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiAnVGVzdENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgY29udHJvbGxlck1ldGhvZDogJ3Rlc3RNZXRob2QnLFxyXG4gICAgICAgICAgb3JpZ2luOiAnbW9iaWxlJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sncmVxdWVzdC5pZCddKS50b0JlKCdyZXEtMTIzJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmUoJ2F3cy00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZmFhcy5uYW1lJ10pLnRvQmUoJ3Rlc3RGdW5jdGlvbicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydmYWFzLmludm9jYXRpb25faWQnXSkudG9CZSgnaW52LTc4OScpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250cm9sbGVyLm5hbWUnXSkudG9CZSgnVGVzdENvbnRyb2xsZXInKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udHJvbGxlci5tZXRob2QnXSkudG9CZSgndGVzdE1ldGhvZCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydvcmlnaW4nXSkudG9CZSgnbW9iaWxlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIG3DqXRyaWNhcyBkZSBwZXJmb3JtYW5jZSBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BlcmZvcm1hbmNlIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMTUwMCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydkdXJhdGlvbi5tcyddKS50b0JlKDE1MDApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydleGVjdXRpb24uc3VjY2VzcyddKS50b0JlKGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgY29udGV4dG8gYWRpY2lvbmFsIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnQ29udGV4dCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLFxyXG4gICAgICAgICAgbmVzdGVkOiB7IHZhbHVlOiAxMjMgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udGV4dCddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLCBuZXN0ZWQ6IHsgdmFsdWU6IDEyMyB9IH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSB1c2FyIHNlcnZpY2VOYW1lIHBhZHLDo28gcXVhbmRvIG7Do28gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0RlZmF1bHQgc2VydmljZSBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICcnLCAvLyBFbXB0eSBzdHJpbmcgcGFyYSB0ZXN0YXIgZmFsbGJhY2tcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Rlc3Qtc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgYWRpY2lvbmFyIHRpbWVzdGFtcCBhdXRvbWF0aWNhbWVudGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnVGltZXN0YW1wIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sndGltZXN0YW1wJ10pLnRvQmVEZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ3RpbWVzdGFtcCddKS50b01hdGNoKFxyXG4gICAgICAgIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC9cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGZpbHRyYXIgdmFsb3JlcyB1bmRlZmluZWQgZSBudWxsIGRvcyBhdHJpYnV0b3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRmlsdGVyIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogdW5kZWZpbmVkIGFzIGFueSxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dJbmZvJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgZW1pdGlyIGxvZyBjb20gc2V2ZXJpdHkgSU5GTycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0luZm8gbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGluZm9EYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5JTkZPKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdJTkZPJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ0luZm8gbWVzc2FnZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBkYWRvcyBkZSBwZXJmb3JtYW5jZSBlbSBsb2cgZGUgc3VjZXNzbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgY29tcGxldGVkJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMjUwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhpbmZvRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMjUwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXhlY3V0aW9uLnN1Y2Nlc3MnXSkudG9CZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nV2FybicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IFdBUk4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhcm5EYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdXYXJuaW5nIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nV2Fybih3YXJuRGF0YSk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja0xvZ2dlci5lbWl0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlOdW1iZXIpLnRvQmUoU2V2ZXJpdHlOdW1iZXIuV0FSTik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnV0FSTicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdXYXJuaW5nIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRGVidWcnLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBERUJVRycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZGVidWdEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdEZWJ1ZyBtZXNzYWdlJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dEZWJ1ZyhkZWJ1Z0RhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLkRFQlVHKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdERUJVRycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdEZWJ1ZyBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2J1aWxkQXR0cmlidXRlcycsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGNvbnN0cnVpciBhdHJpYnV0b3MgY29tcGxldG9zIGNvbSB0b2RvcyBvcyBjYW1wb3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZ1bGxEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdDb21wbGV0ZSBsb2cnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnY29tcGxldGUtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdUZXN0IGVycm9yJyksXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgIHVybDogJy9hcGkvdXNlcnMnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3VzZXJzJyxcclxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci1hYmMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQteHl6JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTEyMycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0wMDEnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTAwMicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdnZXRVc2VycycsXHJcbiAgICAgICAgICBpbnZvY2F0aW9uSWQ6ICdpbnYtMDAzJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdVc2VyQ29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAnZ2V0QWxsJyxcclxuICAgICAgICAgIG9yaWdpbjogJ3dlYicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMzAwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgIGN1c3RvbTogJ2RhdGEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGZ1bGxEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgY29uc3QgYXR0cnMgPSBlbWl0dGVkTG9nLmF0dHJpYnV0ZXM7XHJcblxyXG4gICAgICAvLyBWZXJpZmljYXIgdG9kb3Mgb3MgY2FtcG9zXHJcbiAgICAgIGV4cGVjdChhdHRyc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ2NvbXBsZXRlLXNlcnZpY2UnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnXSkudG9CZSgncHJvZHVjdGlvbicpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2Vycm9yLnR5cGUnXSkudG9CZSgnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydodHRwLm1ldGhvZCddKS50b0JlKCdHRVQnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci1hYmMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydyZXF1ZXN0LmlkJ10pLnRvQmUoJ3JlcS0wMDEnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkdXJhdGlvbi5tcyddKS50b0JlKDMwMCk7XHJcbiAgICAgIGV4cGVjdChhdHRyc1snY29udGV4dCddKS50b0JlKEpTT04uc3RyaW5naWZ5KHsgY3VzdG9tOiAnZGF0YScgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgbGlkYXIgY29tIGNhbXBvcyBIVFRQIHBhcmNpYWlzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJ0aWFsSHR0cERhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BhcnRpYWwgSFRUUCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICAvLyB1cmwsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGV0YyBuw6NvIGZvcm5lY2lkb3NcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhwYXJ0aWFsSHR0cERhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5zdGF0dXNfY29kZSddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2NvbnN0cnV0b3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBhY2VpdGFyIHNlcnZpY2VOYW1lIHBhZHLDo28gcGVyc29uYWxpemFkbycsICgpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9tTG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIsICdjdXN0b20tc2VydmljZScpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGN1c3RvbUxvZ2dlci5sb2dJbmZvKGxvZ0RhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgnY3VzdG9tLXNlcnZpY2UnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgXCJ1bmtub3duLXNlcnZpY2VcIiBjb21vIHBhZHLDo28gcXVhbmRvIG7Do28gZXNwZWNpZmljYWRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWZhdWx0TG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGRlZmF1bHRMb2dnZXIubG9nSW5mbyhsb2dEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Vua25vd24tc2VydmljZScpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn0pO1xyXG4iXX0=
@@ -0,0 +1 @@
1
+ export {};