keez-invoicing 1.1.5

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 (111) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +366 -0
  3. package/dist/coverage/lcov-report/block-navigation.js +71 -0
  4. package/dist/coverage/lcov-report/prettify.js +478 -0
  5. package/dist/coverage/lcov-report/sorter.js +177 -0
  6. package/dist/eslint.config.js +56 -0
  7. package/dist/jest.config.cjs +13 -0
  8. package/dist/jest.config.js +13 -0
  9. package/dist/src/api/__tests__/index.test.js +52 -0
  10. package/dist/src/api/authorise.js +48 -0
  11. package/dist/src/api/invoices/cancel.js +33 -0
  12. package/dist/src/api/invoices/create.js +97 -0
  13. package/dist/src/api/invoices/delete.js +33 -0
  14. package/dist/src/api/invoices/downloadPdf.js +31 -0
  15. package/dist/src/api/invoices/getAll.js +84 -0
  16. package/dist/src/api/invoices/sendMail.js +59 -0
  17. package/dist/src/api/invoices/submitEfactura.js +34 -0
  18. package/dist/src/api/invoices/update.js +61 -0
  19. package/dist/src/api/invoices/validate.js +39 -0
  20. package/dist/src/api/invoices/view.js +93 -0
  21. package/dist/src/api/items/create.js +42 -0
  22. package/dist/src/api/items/getAll.js +74 -0
  23. package/dist/src/api/items/getById.js +46 -0
  24. package/dist/src/api/items/index.js +14 -0
  25. package/dist/src/api/items/patch.js +49 -0
  26. package/dist/src/api/items/update.js +41 -0
  27. package/dist/src/config/constants.js +23 -0
  28. package/dist/src/config/constructorParam.js +3 -0
  29. package/dist/src/config/measureUnit.js +22 -0
  30. package/dist/src/config/paymentType.js +17 -0
  31. package/dist/src/config/paymentType.js.js +16 -0
  32. package/dist/src/dto/allInvoicesResponse.js +3 -0
  33. package/dist/src/dto/authResponse.js +3 -0
  34. package/dist/src/dto/common/index.js +3 -0
  35. package/dist/src/dto/common/paginationParams.js +3 -0
  36. package/dist/src/dto/createInvoiceRequest.js +3 -0
  37. package/dist/src/dto/invoiceResponse.js +3 -0
  38. package/dist/src/dto/invoices/index.js +3 -0
  39. package/dist/src/dto/invoices/invoiceFilterParams.js +3 -0
  40. package/dist/src/dto/invoices/invoiceRequestV2.js +3 -0
  41. package/dist/src/dto/invoices/sendInvoiceParams.js +3 -0
  42. package/dist/src/dto/items/allItemsResponse.js +3 -0
  43. package/dist/src/dto/items/index.js +3 -0
  44. package/dist/src/dto/items/itemRequest.js +3 -0
  45. package/dist/src/dto/items/itemResponse.js +3 -0
  46. package/dist/src/errors/KeezError.js +27 -0
  47. package/dist/src/helpers/logger.js +15 -0
  48. package/dist/src/index.js +15 -0
  49. package/dist/src/keezApi.js +283 -0
  50. package/dist/tests/additional-coverage.test.js +351 -0
  51. package/dist/tests/edge-cases.test.js +353 -0
  52. package/dist/tests/error-handling.test.js +224 -0
  53. package/dist/tests/filter-params.test.js +267 -0
  54. package/dist/tests/index.test.js +493 -0
  55. package/dist/tests/invoices-extended.test.js +168 -0
  56. package/dist/tests/items.test.js +142 -0
  57. package/dist/types/coverage/lcov-report/block-navigation.d.ts +1 -0
  58. package/dist/types/coverage/lcov-report/prettify.d.ts +0 -0
  59. package/dist/types/coverage/lcov-report/sorter.d.ts +1 -0
  60. package/dist/types/eslint.config.d.ts +2 -0
  61. package/dist/types/jest.config.d.cts +9 -0
  62. package/dist/types/jest.config.d.ts +9 -0
  63. package/dist/types/src/api/__tests__/index.test.d.ts +1 -0
  64. package/dist/types/src/api/authorise.d.ts +18 -0
  65. package/dist/types/src/api/invoices/cancel.d.ts +9 -0
  66. package/dist/types/src/api/invoices/create.d.ts +22 -0
  67. package/dist/types/src/api/invoices/delete.d.ts +9 -0
  68. package/dist/types/src/api/invoices/downloadPdf.d.ts +8 -0
  69. package/dist/types/src/api/invoices/getAll.d.ts +22 -0
  70. package/dist/types/src/api/invoices/sendMail.d.ts +24 -0
  71. package/dist/types/src/api/invoices/submitEfactura.d.ts +9 -0
  72. package/dist/types/src/api/invoices/update.d.ts +11 -0
  73. package/dist/types/src/api/invoices/validate.d.ts +21 -0
  74. package/dist/types/src/api/invoices/view.d.ts +22 -0
  75. package/dist/types/src/api/items/create.d.ts +10 -0
  76. package/dist/types/src/api/items/getAll.d.ts +10 -0
  77. package/dist/types/src/api/items/getById.d.ts +10 -0
  78. package/dist/types/src/api/items/index.d.ts +5 -0
  79. package/dist/types/src/api/items/patch.d.ts +11 -0
  80. package/dist/types/src/api/items/update.d.ts +11 -0
  81. package/dist/types/src/config/constants.d.ts +13 -0
  82. package/dist/types/src/config/constructorParam.d.ts +6 -0
  83. package/dist/types/src/config/measureUnit.d.ts +17 -0
  84. package/dist/types/src/config/paymentType.d.ts +12 -0
  85. package/dist/types/src/config/paymentType.js.d.ts +11 -0
  86. package/dist/types/src/dto/allInvoicesResponse.d.ts +21 -0
  87. package/dist/types/src/dto/authResponse.d.ts +7 -0
  88. package/dist/types/src/dto/common/index.d.ts +1 -0
  89. package/dist/types/src/dto/common/paginationParams.d.ts +4 -0
  90. package/dist/types/src/dto/createInvoiceRequest.d.ts +34 -0
  91. package/dist/types/src/dto/invoiceResponse.d.ts +48 -0
  92. package/dist/types/src/dto/invoices/index.d.ts +3 -0
  93. package/dist/types/src/dto/invoices/invoiceFilterParams.d.ts +8 -0
  94. package/dist/types/src/dto/invoices/invoiceRequestV2.d.ts +23 -0
  95. package/dist/types/src/dto/invoices/sendInvoiceParams.d.ts +5 -0
  96. package/dist/types/src/dto/items/allItemsResponse.d.ts +13 -0
  97. package/dist/types/src/dto/items/index.d.ts +3 -0
  98. package/dist/types/src/dto/items/itemRequest.d.ts +34 -0
  99. package/dist/types/src/dto/items/itemResponse.d.ts +15 -0
  100. package/dist/types/src/errors/KeezError.d.ts +11 -0
  101. package/dist/types/src/helpers/logger.d.ts +2 -0
  102. package/dist/types/src/index.d.ts +11 -0
  103. package/dist/types/src/keezApi.d.ts +114 -0
  104. package/dist/types/tests/additional-coverage.test.d.ts +1 -0
  105. package/dist/types/tests/edge-cases.test.d.ts +1 -0
  106. package/dist/types/tests/error-handling.test.d.ts +1 -0
  107. package/dist/types/tests/filter-params.test.d.ts +1 -0
  108. package/dist/types/tests/index.test.d.ts +1 -0
  109. package/dist/types/tests/invoices-extended.test.d.ts +1 -0
  110. package/dist/types/tests/items.test.d.ts +1 -0
  111. package/package.json +66 -0
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nock = require("nock");
4
+ const keezApi_1 = require("../src/keezApi");
5
+ const authorise_1 = require("../src/api/authorise");
6
+ const cancel_1 = require("../src/api/invoices/cancel");
7
+ const delete_1 = require("../src/api/invoices/delete");
8
+ const downloadPdf_1 = require("../src/api/invoices/downloadPdf");
9
+ const update_1 = require("../src/api/invoices/update");
10
+ const submitEfactura_1 = require("../src/api/invoices/submitEfactura");
11
+ const validate_1 = require("../src/api/invoices/validate");
12
+ const view_1 = require("../src/api/invoices/view");
13
+ const getAll_1 = require("../src/api/invoices/getAll");
14
+ const sendMail_1 = require("../src/api/invoices/sendMail");
15
+ const create_1 = require("../src/api/items/create");
16
+ const getAll_2 = require("../src/api/items/getAll");
17
+ const getById_1 = require("../src/api/items/getById");
18
+ const update_2 = require("../src/api/items/update");
19
+ const patch_1 = require("../src/api/items/patch");
20
+ const paymentType_1 = require("../src/config/paymentType");
21
+ const measureUnit_1 = require("../src/config/measureUnit");
22
+ const KeezError_1 = require("../src/errors/KeezError");
23
+ const baseDomain = 'https://staging.keez.ro';
24
+ const clientEid = 'test-client-eid';
25
+ describe('Additional Coverage Tests', () => {
26
+ afterEach(() => {
27
+ nock.cleanAll();
28
+ });
29
+ describe('KeezApi getInvoiceByExternalId through class', () => {
30
+ let keezApi;
31
+ beforeAll(() => {
32
+ keezApi = new keezApi_1.KeezApi({
33
+ application_id: 'test-app-id',
34
+ client_eid: clientEid,
35
+ secret: 'test-secret',
36
+ live: false,
37
+ });
38
+ });
39
+ it('should get invoice by external ID through KeezApi class', async () => {
40
+ nock(baseDomain)
41
+ .post('/idp/connect/token')
42
+ .reply(200, {
43
+ access_token: 'test-token',
44
+ expires_in: 3600,
45
+ token_type: 'Bearer',
46
+ scope: 'public-api',
47
+ });
48
+ const mockInvoice = {
49
+ currencyCode: 'RON',
50
+ discountGrossValue: 0,
51
+ discountNetValue: 0,
52
+ discountVatValue: 0,
53
+ discountValueOnNet: false,
54
+ exciseAmount: 0,
55
+ documentDate: 20230423,
56
+ dueDate: 20230430,
57
+ exchangeRate: 1,
58
+ grossAmount: 119,
59
+ netAmount: 100,
60
+ number: 1,
61
+ originalNetAmount: 100,
62
+ originalVatAmount: 19,
63
+ partner: {
64
+ addressDetails: 'Test Address',
65
+ cityName: 'Bucharest',
66
+ countryCode: 'RO',
67
+ countryName: 'Romania',
68
+ countyCode: 'RO.B',
69
+ countyName: 'Bucharest',
70
+ identificationNumber: '12345678',
71
+ isLegalPerson: false,
72
+ partnerName: 'Test Partner',
73
+ },
74
+ invoiceDetails: [
75
+ {
76
+ discountGrossValue: 0,
77
+ discountNetValue: 0,
78
+ discountVatValue: 0,
79
+ discountValueOnNet: false,
80
+ grossAmount: 119,
81
+ itemCode: 'ITEM-001',
82
+ itemDescription: 'Test Item',
83
+ itemExternalId: 'item-ext-1',
84
+ itemName: 'Test Item Name',
85
+ measureUnitId: 1,
86
+ netAmount: 100,
87
+ originalNetAmount: 100,
88
+ originalVatAmount: 19,
89
+ quantity: 1,
90
+ unMeasureUnit: 'buc',
91
+ unVatCategory: 'S',
92
+ unVatExemptionReason: '',
93
+ unitPrice: 100,
94
+ vatAmount: 19,
95
+ vatPercent: 19,
96
+ exciseAmount: 0,
97
+ },
98
+ ],
99
+ paymentTypeId: 3,
100
+ referenceCurrencyCode: 'RON',
101
+ series: 'PDI',
102
+ status: 'draft',
103
+ vatAmount: 19,
104
+ vatOnCollection: false,
105
+ };
106
+ nock(baseDomain)
107
+ .get(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
108
+ .reply(200, mockInvoice);
109
+ const result = await keezApi.getInvoiceByExternalId('inv-123');
110
+ expect(result.grossAmount).toBe(119);
111
+ expect(result.partner.partnerName).toBe('Test Partner');
112
+ });
113
+ });
114
+ describe('Network Error Handling (axiosError.message fallback)', () => {
115
+ it('should handle network error in apiGenerateToken', async () => {
116
+ nock(baseDomain)
117
+ .post('/idp/connect/token')
118
+ .replyWithError('Network Error');
119
+ await expect((0, authorise_1.apiGenerateToken)({
120
+ baseDomain,
121
+ appId: 'test-app-id',
122
+ apiSecret: 'test-secret',
123
+ })).rejects.toThrow(KeezError_1.KeezAuthError);
124
+ });
125
+ it('should handle network error in apiCancelInvoice', async () => {
126
+ nock(baseDomain)
127
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/canceled`)
128
+ .replyWithError('Connection refused');
129
+ await expect((0, cancel_1.apiCancelInvoice)({
130
+ baseDomain,
131
+ appId: 'test-app-id',
132
+ appClientId: clientEid,
133
+ bearerToken: 'test-token',
134
+ invoiceId: 'inv-123',
135
+ })).rejects.toThrow(KeezError_1.KeezApiError);
136
+ });
137
+ it('should handle network error in apiDeleteInvoice', async () => {
138
+ nock(baseDomain)
139
+ .delete(`/api/v1.0/public-api/${clientEid}/invoices`)
140
+ .replyWithError('Connection timeout');
141
+ await expect((0, delete_1.apiDeleteInvoice)({
142
+ baseDomain,
143
+ appId: 'test-app-id',
144
+ appClientId: clientEid,
145
+ bearerToken: 'test-token',
146
+ invoiceId: 'inv-123',
147
+ })).rejects.toThrow(KeezError_1.KeezApiError);
148
+ });
149
+ it('should handle network error in apiDownloadInvoicePdf', async () => {
150
+ nock(baseDomain)
151
+ .get('/api/v1.0/public-api/invoices/inv-123/pdf')
152
+ .replyWithError('DNS resolution failed');
153
+ await expect((0, downloadPdf_1.apiDownloadInvoicePdf)({
154
+ baseDomain,
155
+ appId: 'test-app-id',
156
+ bearerToken: 'test-token',
157
+ invoiceId: 'inv-123',
158
+ })).rejects.toThrow(KeezError_1.KeezApiError);
159
+ });
160
+ it('should handle network error in apiUpdateInvoice', async () => {
161
+ nock(baseDomain)
162
+ .put(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
163
+ .replyWithError('Socket hang up');
164
+ await expect((0, update_1.apiUpdateInvoice)({
165
+ baseDomain,
166
+ appId: 'test-app-id',
167
+ appClientId: clientEid,
168
+ bearerToken: 'test-token',
169
+ invoiceId: 'inv-123',
170
+ invoice: {
171
+ series: 'INV',
172
+ documentDate: 20230101,
173
+ dueDate: 20230115,
174
+ currencyCode: 'RON',
175
+ paymentType: paymentType_1.PaymentType.BANK_TRANSFER,
176
+ partner: {
177
+ isLegalPerson: false,
178
+ partnerName: 'Test Partner',
179
+ identificationNumber: '123456',
180
+ countryCode: 'RO',
181
+ countryName: 'Romania',
182
+ countyCode: 'B',
183
+ countyName: 'Bucuresti',
184
+ cityName: 'Bucuresti',
185
+ addressDetails: 'Test Address',
186
+ },
187
+ items: [
188
+ {
189
+ itemExternalId: 'item-1',
190
+ measureUnitId: 1,
191
+ quantity: 1,
192
+ unitPrice: 100,
193
+ },
194
+ ],
195
+ },
196
+ })).rejects.toThrow(KeezError_1.KeezApiError);
197
+ });
198
+ it('should handle network error in apiSubmitEfactura', async () => {
199
+ nock(baseDomain)
200
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/efactura/submitted`)
201
+ .replyWithError('ECONNRESET');
202
+ await expect((0, submitEfactura_1.apiSubmitEfactura)({
203
+ baseDomain,
204
+ appId: 'test-app-id',
205
+ appClientId: clientEid,
206
+ bearerToken: 'test-token',
207
+ invoiceId: 'inv-123',
208
+ })).rejects.toThrow(KeezError_1.KeezApiError);
209
+ });
210
+ it('should handle network error in apiValidateInvoice', async () => {
211
+ nock(baseDomain)
212
+ .post(`/api/v1.0/public-api/${clientEid}/invoices/valid`)
213
+ .replyWithError('ETIMEDOUT');
214
+ await expect((0, validate_1.apiValidateInvoice)({
215
+ baseDomain,
216
+ appId: 'test-app-id',
217
+ appClientId: clientEid,
218
+ bearerToken: 'test-token',
219
+ invoiceId: 'inv-123',
220
+ })).rejects.toThrow(KeezError_1.KeezApiError);
221
+ });
222
+ it('should handle network error in apiGetInvoiceByExternalId', async () => {
223
+ nock(baseDomain)
224
+ .get(`/api/v1.0/public-api/${clientEid}/invoices/inv-123`)
225
+ .replyWithError('ENOTFOUND');
226
+ await expect((0, view_1.apiGetInvoiceByExternalId)({
227
+ baseDomain,
228
+ appId: 'test-app-id',
229
+ appClientId: clientEid,
230
+ bearerToken: 'test-token',
231
+ invoiceId: 'inv-123',
232
+ })).rejects.toThrow(KeezError_1.KeezApiError);
233
+ });
234
+ it('should handle network error in apiGetAllInvoices', async () => {
235
+ nock(baseDomain)
236
+ .get(`/api/v1.0/public-api/${clientEid}/invoices`)
237
+ .replyWithError('EHOSTUNREACH');
238
+ await expect((0, getAll_1.apiGetAllInvoices)({
239
+ baseDomain,
240
+ appId: 'test-app-id',
241
+ appClientId: clientEid,
242
+ bearerToken: 'test-token',
243
+ })).rejects.toThrow(KeezError_1.KeezApiError);
244
+ });
245
+ it('should handle network error in apiSendInvoice', async () => {
246
+ nock(baseDomain)
247
+ .post('/api/v1.0/public-api/invoices/delivery')
248
+ .replyWithError('ECONNREFUSED');
249
+ await expect((0, sendMail_1.apiSendInvoice)({
250
+ baseDomain,
251
+ appId: 'test-app-id',
252
+ bearerToken: 'test-token',
253
+ clientMail: 'test@example.com',
254
+ invoiceId: 'inv-123',
255
+ })).rejects.toThrow(KeezError_1.KeezApiError);
256
+ });
257
+ it('should handle network error in apiCreateItem', async () => {
258
+ nock(baseDomain)
259
+ .post(`/api/v1.0/public-api/${clientEid}/items`)
260
+ .replyWithError('Network Error');
261
+ await expect((0, create_1.apiCreateItem)({
262
+ baseDomain,
263
+ appId: 'test-app-id',
264
+ appClientId: clientEid,
265
+ bearerToken: 'test-token',
266
+ item: {
267
+ itemName: 'Test Item',
268
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
269
+ unitPrice: 100,
270
+ vatPercent: 19,
271
+ },
272
+ })).rejects.toThrow(KeezError_1.KeezApiError);
273
+ });
274
+ it('should handle network error in apiGetAllItems', async () => {
275
+ nock(baseDomain)
276
+ .get(`/api/v1.0/public-api/${clientEid}/items`)
277
+ .replyWithError('Connection failed');
278
+ await expect((0, getAll_2.apiGetAllItems)({
279
+ baseDomain,
280
+ appId: 'test-app-id',
281
+ appClientId: clientEid,
282
+ bearerToken: 'test-token',
283
+ })).rejects.toThrow(KeezError_1.KeezApiError);
284
+ });
285
+ it('should handle network error in apiGetItemById', async () => {
286
+ nock(baseDomain)
287
+ .get(`/api/v1.0/public-api/${clientEid}/items/item-123`)
288
+ .replyWithError('Request timeout');
289
+ await expect((0, getById_1.apiGetItemById)({
290
+ baseDomain,
291
+ appId: 'test-app-id',
292
+ appClientId: clientEid,
293
+ bearerToken: 'test-token',
294
+ itemId: 'item-123',
295
+ })).rejects.toThrow(KeezError_1.KeezApiError);
296
+ });
297
+ it('should handle network error in apiUpdateItem', async () => {
298
+ nock(baseDomain)
299
+ .put(`/api/v1.0/public-api/${clientEid}/items/item-123`)
300
+ .replyWithError('Socket closed');
301
+ await expect((0, update_2.apiUpdateItem)({
302
+ baseDomain,
303
+ appId: 'test-app-id',
304
+ appClientId: clientEid,
305
+ bearerToken: 'test-token',
306
+ itemId: 'item-123',
307
+ item: {
308
+ itemName: 'Updated Item',
309
+ measureUnitId: measureUnit_1.MeasureUnit.PIECE,
310
+ unitPrice: 150,
311
+ vatPercent: 19,
312
+ },
313
+ })).rejects.toThrow(KeezError_1.KeezApiError);
314
+ });
315
+ it('should handle network error in apiPatchItem', async () => {
316
+ nock(baseDomain)
317
+ .patch(`/api/v1.0/public-api/${clientEid}/items/item-123`)
318
+ .replyWithError('Peer reset connection');
319
+ await expect((0, patch_1.apiPatchItem)({
320
+ baseDomain,
321
+ appId: 'test-app-id',
322
+ appClientId: clientEid,
323
+ bearerToken: 'test-token',
324
+ itemId: 'item-123',
325
+ item: {
326
+ unitPrice: 200,
327
+ },
328
+ })).rejects.toThrow(KeezError_1.KeezApiError);
329
+ });
330
+ });
331
+ describe('Logger branch coverage', () => {
332
+ it('should use debug log level when DEBUG env is set', async () => {
333
+ // This test is more for completeness - the logger branch is based on LOG_LEVEL env
334
+ nock(baseDomain)
335
+ .post('/idp/connect/token')
336
+ .reply(200, {
337
+ access_token: 'test-token',
338
+ expires_in: 3600,
339
+ token_type: 'Bearer',
340
+ scope: 'public-api',
341
+ });
342
+ const result = await (0, authorise_1.apiGenerateToken)({
343
+ baseDomain,
344
+ appId: 'test-app-id',
345
+ apiSecret: 'test-secret',
346
+ });
347
+ expect(result.access_token).toBe('test-token');
348
+ });
349
+ });
350
+ });
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkaXRpb25hbC1jb3ZlcmFnZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvYWRkaXRpb25hbC1jb3ZlcmFnZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQThCO0FBQzlCLHVDQUFvQztBQUNwQywrQ0FBbUQ7QUFDbkQsa0RBQXlEO0FBQ3pELGtEQUF5RDtBQUN6RCw0REFBbUU7QUFDbkUsa0RBQXlEO0FBQ3pELGtFQUFrRTtBQUNsRSxzREFBNkQ7QUFDN0QsOENBQWdFO0FBQ2hFLGtEQUEwRDtBQUMxRCxzREFBeUQ7QUFDekQsK0NBQW1EO0FBQ25ELCtDQUFvRDtBQUNwRCxpREFBcUQ7QUFDckQsK0NBQW1EO0FBQ25ELDZDQUFpRDtBQUNqRCxzREFBbUQ7QUFDbkQsc0RBQW1EO0FBQ25ELGtEQUFpRTtBQUVqRSxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUM3QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQUVwQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQzFELElBQUksT0FBZ0IsQ0FBQztRQUVyQixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1gsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQztnQkFDbEIsY0FBYyxFQUFFLGFBQWE7Z0JBQzdCLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixNQUFNLEVBQUUsYUFBYTtnQkFDckIsSUFBSSxFQUFFLEtBQUs7YUFDZCxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNYLElB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WSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgS2VlekFwaSB9IGZyb20gJ0Ava2VlekFwaSc7XG5pbXBvcnQgeyBhcGlHZW5lcmF0ZVRva2VuIH0gZnJvbSAnQC9hcGkvYXV0aG9yaXNlJztcbmltcG9ydCB7IGFwaUNhbmNlbEludm9pY2UgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9jYW5jZWwnO1xuaW1wb3J0IHsgYXBpRGVsZXRlSW52b2ljZSB9IGZyb20gJ0AvYXBpL2ludm9pY2VzL2RlbGV0ZSc7XG5pbXBvcnQgeyBhcGlEb3dubG9hZEludm9pY2VQZGYgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9kb3dubG9hZFBkZic7XG5pbXBvcnQgeyBhcGlVcGRhdGVJbnZvaWNlIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvdXBkYXRlJztcbmltcG9ydCB7IGFwaVN1Ym1pdEVmYWN0dXJhIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvc3VibWl0RWZhY3R1cmEnO1xuaW1wb3J0IHsgYXBpVmFsaWRhdGVJbnZvaWNlIH0gZnJvbSAnQC9hcGkvaW52b2ljZXMvdmFsaWRhdGUnO1xuaW1wb3J0IHsgYXBpR2V0SW52b2ljZUJ5RXh0ZXJuYWxJZCB9IGZyb20gJ0AvYXBpL2ludm9pY2VzL3ZpZXcnO1xuaW1wb3J0IHsgYXBpR2V0QWxsSW52b2ljZXMgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9nZXRBbGwnO1xuaW1wb3J0IHsgYXBpU2VuZEludm9pY2UgfSBmcm9tICdAL2FwaS9pbnZvaWNlcy9zZW5kTWFpbCc7XG5pbXBvcnQgeyBhcGlDcmVhdGVJdGVtIH0gZnJvbSAnQC9hcGkvaXRlbXMvY3JlYXRlJztcbmltcG9ydCB7IGFwaUdldEFsbEl0ZW1zIH0gZnJvbSAnQC9hcGkvaXRlbXMvZ2V0QWxsJztcbmltcG9ydCB7IGFwaUdldEl0ZW1CeUlkIH0gZnJvbSAnQC9hcGkvaXRlbXMvZ2V0QnlJZCc7XG5pbXBvcnQgeyBhcGlVcGRhdGVJdGVtIH0gZnJvbSAnQC9hcGkvaXRlbXMvdXBkYXRlJztcbmltcG9ydCB7IGFwaVBhdGNoSXRlbSB9IGZyb20gJ0AvYXBpL2l0ZW1zL3BhdGNoJztcbmltcG9ydCB7IFBheW1lbnRUeXBlIH0gZnJvbSAnQC9jb25maWcvcGF5bWVudFR5cGUnO1xuaW1wb3J0IHsgTWVhc3VyZVVuaXQgfSBmcm9tICdAL2NvbmZpZy9tZWFzdXJlVW5pdCc7XG5pbXBvcnQgeyBLZWV6QXV0aEVycm9yLCBLZWV6QXBpRXJyb3IgfSBmcm9tICdAL2Vycm9ycy9LZWV6RXJyb3InO1xuXG5jb25zdCBiYXNlRG9tYWluID0gJ2h0dHBzOi8vc3RhZ2luZy5rZWV6LnJvJztcbmNvbnN0IGNsaWVudEVpZCA9ICd0ZXN0LWNsaWVudC1laWQnO1xuXG5kZXNjcmliZSgnQWRkaXRpb25hbCBDb3ZlcmFnZSBUZXN0cycsICgpID0+IHtcbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnS2VlekFwaSBnZXRJbnZvaWNlQnlFeHRlcm5hbElkIHRocm91Z2ggY2xhc3MnLCAoKSA9PiB7XG4gICAgICAgIGxldCBrZWV6QXBpOiBLZWV6QXBpO1xuXG4gICAgICAgIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgICAgICAgICBrZWV6QXBpID0gbmV3IEtlZXpBcGkoe1xuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgIGNsaWVudF9laWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICBzZWNyZXQ6ICd0ZXN0LXNlY3JldCcsXG4gICAgICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgaW52b2ljZSBieSBleHRlcm5hbCBJRCB0aHJvdWdoIEtlZXpBcGkgY2xhc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vY2tJbnZvaWNlID0ge1xuICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZTogJ1JPTicsXG4gICAgICAgICAgICAgICAgZGlzY291bnRHcm9zc1ZhbHVlOiAwLFxuICAgICAgICAgICAgICAgIGRpc2NvdW50TmV0VmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgZGlzY291bnRWYXRWYWx1ZTogMCxcbiAgICAgICAgICAgICAgICBkaXNjb3VudFZhbHVlT25OZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4Y2lzZUFtb3VudDogMCxcbiAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwNDIzLFxuICAgICAgICAgICAgICAgIGR1ZURhdGU6IDIwMjMwNDMwLFxuICAgICAgICAgICAgICAgIGV4Y2hhbmdlUmF0ZTogMSxcbiAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgIG51bWJlcjogMSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsVmF0QW1vdW50OiAxOSxcbiAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NEZXRhaWxzOiAnVGVzdCBBZGRyZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgY2l0eU5hbWU6ICdCdWNoYXJlc3QnLFxuICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeU5hbWU6ICdSb21hbmlhJyxcbiAgICAgICAgICAgICAgICAgICAgY291bnR5Q29kZTogJ1JPLkInLFxuICAgICAgICAgICAgICAgICAgICBjb3VudHlOYW1lOiAnQnVjaGFyZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmljYXRpb25OdW1iZXI6ICcxMjM0NTY3OCcsXG4gICAgICAgICAgICAgICAgICAgIGlzTGVnYWxQZXJzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyTmFtZTogJ1Rlc3QgUGFydG5lcicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZvaWNlRGV0YWlsczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudEdyb3NzVmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE5ldFZhbHVlOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRWYXRWYWx1ZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50VmFsdWVPbk5ldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBncm9zc0Ftb3VudDogMTE5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvZGU6ICdJVEVNLTAwMScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtRGVzY3JpcHRpb246ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUV4dGVybmFsSWQ6ICdpdGVtLWV4dC0xJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVGVzdCBJdGVtIE5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldEFtb3VudDogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOZXRBbW91bnQ6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmF0QW1vdW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5NZWFzdXJlVW5pdDogJ2J1YycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1blZhdENhdGVnb3J5OiAnUycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1blZhdEV4ZW1wdGlvblJlYXNvbjogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdEFtb3VudDogMTksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2lzZUFtb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHBheW1lbnRUeXBlSWQ6IDMsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlQ3VycmVuY3lDb2RlOiAnUk9OJyxcbiAgICAgICAgICAgICAgICBzZXJpZXM6ICdQREknLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgICAgICAgICAgICB2YXRBbW91bnQ6IDE5LFxuICAgICAgICAgICAgICAgIHZhdE9uQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLmdldChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseSgyMDAsIG1vY2tJbnZvaWNlKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2VlekFwaS5nZXRJbnZvaWNlQnlFeHRlcm5hbElkKCdpbnYtMTIzJyk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0Lmdyb3NzQW1vdW50KS50b0JlKDExOSk7XG4gICAgICAgICAgICBleHBlY3QocmVzdWx0LnBhcnRuZXIucGFydG5lck5hbWUpLnRvQmUoJ1Rlc3QgUGFydG5lcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdOZXR3b3JrIEVycm9yIEhhbmRsaW5nIChheGlvc0Vycm9yLm1lc3NhZ2UgZmFsbGJhY2spJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaUdlbmVyYXRlVG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdOZXR3b3JrIEVycm9yJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZW5lcmF0ZVRva2VuKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGFwaVNlY3JldDogJ3Rlc3Qtc2VjcmV0JyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekF1dGhFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpQ2FuY2VsSW52b2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2NhbmNlbGVkYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0Nvbm5lY3Rpb24gcmVmdXNlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpQ2FuY2VsSW52b2ljZSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlEZWxldGVJbnZvaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5kZWxldGUoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdDb25uZWN0aW9uIHRpbWVvdXQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaURlbGV0ZUludm9pY2Uoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpRG93bmxvYWRJbnZvaWNlUGRmJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoJy9hcGkvdjEuMC9wdWJsaWMtYXBpL2ludm9pY2VzL2ludi0xMjMvcGRmJylcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0ROUyByZXNvbHV0aW9uIGZhaWxlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpRG93bmxvYWRJbnZvaWNlUGRmKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGJlYXJlclRva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgIGludm9pY2VJZDogJ2ludi0xMjMnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaVVwZGF0ZUludm9pY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnB1dChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2ludi0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignU29ja2V0IGhhbmcgdXAnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVVwZGF0ZUludm9pY2Uoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgICAgIGludm9pY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogJ0lOVicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudERhdGU6IDIwMjMwMTAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVlRGF0ZTogMjAyMzAxMTUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU6ICdST04nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bWVudFR5cGU6IFBheW1lbnRUeXBlLkJBTktfVFJBTlNGRVIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZWdhbFBlcnNvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lck5hbWU6ICdUZXN0IFBhcnRuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpY2F0aW9uTnVtYmVyOiAnMTIzNDU2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZTogJ1JPJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZTogJ1JvbWFuaWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eUNvZGU6ICdCJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlOYW1lOiAnQnVjdXJlc3RpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXR5TmFtZTogJ0J1Y3VyZXN0aScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0RldGFpbHM6ICdUZXN0IEFkZHJlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtRXh0ZXJuYWxJZDogJ2l0ZW0tMScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlTdWJtaXRFZmFjdHVyYScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2ludm9pY2VzL2VmYWN0dXJhL3N1Ym1pdHRlZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFQ09OTlJFU0VUJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlTdWJtaXRFZmFjdHVyYSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlWYWxpZGF0ZUludm9pY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy92YWxpZGApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFVElNRURPVVQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVZhbGlkYXRlSW52b2ljZSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRJbnZvaWNlQnlFeHRlcm5hbElkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pbnZvaWNlcy9pbnYtMTIzYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ0VOT1RGT1VORCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpR2V0SW52b2ljZUJ5RXh0ZXJuYWxJZCh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpbnZvaWNlSWQ6ICdpbnYtMTIzJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRBbGxJbnZvaWNlcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaW52b2ljZXNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignRUhPU1RVTlJFQUNIJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZXRBbGxJbnZvaWNlcyh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaVNlbmRJbnZvaWNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5wb3N0KCcvYXBpL3YxLjAvcHVibGljLWFwaS9pbnZvaWNlcy9kZWxpdmVyeScpXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdFQ09OTlJFRlVTRUQnKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaVNlbmRJbnZvaWNlKHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZURvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgICAgIGJlYXJlclRva2VuOiAndGVzdC10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudE1haWw6ICd0ZXN0QGV4YW1wbGUuY29tJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2ljZUlkOiAnaW52LTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpQ3JlYXRlSXRlbScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucG9zdChgL2FwaS92MS4wL3B1YmxpYy1hcGkvJHtjbGllbnRFaWR9L2l0ZW1zYClcbiAgICAgICAgICAgICAgICAucmVwbHlXaXRoRXJyb3IoJ05ldHdvcmsgRXJyb3InKTtcblxuICAgICAgICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICAgICAgICAgIGFwaUNyZWF0ZUl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWU6ICdUZXN0IEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVVuaXRJZDogTWVhc3VyZVVuaXQuUElFQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhdFBlcmNlbnQ6IDE5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLnJlamVjdHMudG9UaHJvdyhLZWV6QXBpRXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZXR3b3JrIGVycm9yIGluIGFwaUdldEFsbEl0ZW1zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbm9jayhiYXNlRG9tYWluKVxuICAgICAgICAgICAgICAgIC5nZXQoYC9hcGkvdjEuMC9wdWJsaWMtYXBpLyR7Y2xpZW50RWlkfS9pdGVtc2ApXG4gICAgICAgICAgICAgICAgLnJlcGx5V2l0aEVycm9yKCdDb25uZWN0aW9uIGZhaWxlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpR2V0QWxsSXRlbXMoe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlHZXRJdGVtQnlJZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAuZ2V0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignUmVxdWVzdCB0aW1lb3V0Jyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlHZXRJdGVtQnlJZCh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6ICdpdGVtLTEyMycsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkucmVqZWN0cy50b1Rocm93KEtlZXpBcGlFcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG5ldHdvcmsgZXJyb3IgaW4gYXBpVXBkYXRlSXRlbScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIG5vY2soYmFzZURvbWFpbilcbiAgICAgICAgICAgICAgICAucHV0KGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignU29ja2V0IGNsb3NlZCcpO1xuXG4gICAgICAgICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgICAgICAgICAgYXBpVXBkYXRlSXRlbSh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgICAgIGFwcElkOiAndGVzdC1hcHAtaWQnLFxuICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRJZDogY2xpZW50RWlkLFxuICAgICAgICAgICAgICAgICAgICBiZWFyZXJUb2tlbjogJ3Rlc3QtdG9rZW4nLFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6ICdpdGVtLTEyMycsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lOiAnVXBkYXRlZCBJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVVbml0SWQ6IE1lYXN1cmVVbml0LlBJRUNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdFByaWNlOiAxNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXRQZXJjZW50OiAxOSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbmV0d29yayBlcnJvciBpbiBhcGlQYXRjaEl0ZW0nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBhdGNoKGAvYXBpL3YxLjAvcHVibGljLWFwaS8ke2NsaWVudEVpZH0vaXRlbXMvaXRlbS0xMjNgKVxuICAgICAgICAgICAgICAgIC5yZXBseVdpdGhFcnJvcignUGVlciByZXNldCBjb25uZWN0aW9uJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgICAgICAgICBhcGlQYXRjaEl0ZW0oe1xuICAgICAgICAgICAgICAgICAgICBiYXNlRG9tYWluLFxuICAgICAgICAgICAgICAgICAgICBhcHBJZDogJ3Rlc3QtYXBwLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgYXBwQ2xpZW50SWQ6IGNsaWVudEVpZCxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmVyVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiAnaXRlbS0xMjMnLFxuICAgICAgICAgICAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0UHJpY2U6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5yZWplY3RzLnRvVGhyb3coS2VlekFwaUVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTG9nZ2VyIGJyYW5jaCBjb3ZlcmFnZScsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCB1c2UgZGVidWcgbG9nIGxldmVsIHdoZW4gREVCVUcgZW52IGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBpcyBtb3JlIGZvciBjb21wbGV0ZW5lc3MgLSB0aGUgbG9nZ2VyIGJyYW5jaCBpcyBiYXNlZCBvbiBMT0dfTEVWRUwgZW52XG4gICAgICAgICAgICBub2NrKGJhc2VEb21haW4pXG4gICAgICAgICAgICAgICAgLnBvc3QoJy9pZHAvY29ubmVjdC90b2tlbicpXG4gICAgICAgICAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19pbjogMzYwMCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ0JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiAncHVibGljLWFwaScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUdlbmVyYXRlVG9rZW4oe1xuICAgICAgICAgICAgICAgIGJhc2VEb21haW4sXG4gICAgICAgICAgICAgICAgYXBwSWQ6ICd0ZXN0LWFwcC1pZCcsXG4gICAgICAgICAgICAgICAgYXBpU2VjcmV0OiAndGVzdC1zZWNyZXQnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGV4cGVjdChyZXN1bHQuYWNjZXNzX3Rva2VuKS50b0JlKCd0ZXN0LXRva2VuJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=