@uql/core 0.4.80 → 0.4.83

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 (57) hide show
  1. package/README.md +11 -11
  2. package/dialect/abstractSqlDialect-spec.d.ts +49 -0
  3. package/dialect/abstractSqlDialect-spec.js +765 -0
  4. package/dialect/abstractSqlDialect.js +11 -17
  5. package/dialect/mysqlDialect.js +2 -2
  6. package/dialect/mysqlDialect.spec.d.ts +6 -0
  7. package/dialect/mysqlDialect.spec.js +33 -0
  8. package/dialect/postgresDialect.js +2 -2
  9. package/dialect/postgresDialect.spec.d.ts +1 -0
  10. package/dialect/postgresDialect.spec.js +139 -0
  11. package/dialect/sqliteDialect.spec.d.ts +1 -0
  12. package/dialect/sqliteDialect.spec.js +12 -0
  13. package/entity/decorator/definition.js +22 -24
  14. package/entity/decorator/definition.spec.d.ts +1 -0
  15. package/entity/decorator/definition.spec.js +725 -0
  16. package/entity/decorator/relation.spec.d.ts +1 -0
  17. package/entity/decorator/relation.spec.js +55 -0
  18. package/options.js +2 -2
  19. package/options.spec.d.ts +1 -0
  20. package/options.spec.js +50 -0
  21. package/package.json +3 -3
  22. package/querier/abstractQuerier-it.d.ts +41 -0
  23. package/querier/abstractQuerier-it.js +410 -0
  24. package/querier/abstractSqlQuerier-it.d.ts +9 -0
  25. package/querier/abstractSqlQuerier-it.js +19 -0
  26. package/querier/abstractSqlQuerier-spec.d.ts +53 -0
  27. package/querier/abstractSqlQuerier-spec.js +607 -0
  28. package/querier/abstractSqlQuerier.js +2 -3
  29. package/querier/decorator/injectQuerier.js +2 -3
  30. package/querier/decorator/injectQuerier.spec.d.ts +1 -0
  31. package/querier/decorator/injectQuerier.spec.js +108 -0
  32. package/querier/decorator/transactional.js +2 -2
  33. package/querier/decorator/transactional.spec.d.ts +1 -0
  34. package/querier/decorator/transactional.spec.js +241 -0
  35. package/repository/genericRepository.spec.d.ts +1 -0
  36. package/repository/genericRepository.spec.js +86 -0
  37. package/test/entityMock.d.ts +180 -0
  38. package/test/entityMock.js +451 -0
  39. package/test/index.d.ts +3 -0
  40. package/test/index.js +7 -0
  41. package/test/it.util.d.ts +4 -0
  42. package/test/it.util.js +60 -0
  43. package/test/spec.util.d.ts +13 -0
  44. package/test/spec.util.js +54 -0
  45. package/type/entity.d.ts +12 -17
  46. package/type/entity.js +1 -1
  47. package/type/utility.d.ts +3 -2
  48. package/type/utility.js +1 -1
  49. package/util/dialect.util.js +2 -3
  50. package/util/dialect.util.spec.d.ts +1 -0
  51. package/util/dialect.util.spec.js +23 -0
  52. package/util/object.util.spec.d.ts +1 -0
  53. package/util/object.util.spec.js +26 -0
  54. package/util/sql.util.spec.d.ts +1 -0
  55. package/util/sql.util.spec.js +164 -0
  56. package/util/string.util.spec.d.ts +1 -0
  57. package/util/string.util.spec.js +26 -0
@@ -0,0 +1,765 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqlDialectSpec = void 0;
4
+ const test_1 = require("@uql/core/test");
5
+ const util_1 = require("@uql/core/util");
6
+ class AbstractSqlDialectSpec {
7
+ constructor(dialect) {
8
+ this.dialect = dialect;
9
+ }
10
+ shouldBeValidEscapeCharacter() {
11
+ expect(this.dialect.escapeIdChar).toBe('`');
12
+ }
13
+ shouldBeginTransaction() {
14
+ expect(this.dialect.beginTransactionCommand).toBe('BEGIN TRANSACTION');
15
+ }
16
+ shouldInsertMany() {
17
+ expect(this.dialect.insert(test_1.User, [
18
+ {
19
+ name: 'Some name 1',
20
+ email: 'someemail1@example.com',
21
+ createdAt: 123,
22
+ },
23
+ {
24
+ name: 'Some name 2',
25
+ email: 'someemail2@example.com',
26
+ createdAt: 456,
27
+ },
28
+ {
29
+ name: 'Some name 3',
30
+ email: 'someemail3@example.com',
31
+ createdAt: 789,
32
+ },
33
+ ])).toBe('INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES' +
34
+ " ('Some name 1', 'someemail1@example.com', 123)" +
35
+ ", ('Some name 2', 'someemail2@example.com', 456)" +
36
+ ", ('Some name 3', 'someemail3@example.com', 789)");
37
+ }
38
+ shouldInsertOne() {
39
+ expect(this.dialect.insert(test_1.User, {
40
+ name: 'Some Name',
41
+ email: 'someemail@example.com',
42
+ createdAt: 123,
43
+ })).toBe("INSERT INTO `User` (`name`, `email`, `createdAt`) VALUES ('Some Name', 'someemail@example.com', 123)");
44
+ expect(this.dialect.insert(test_1.InventoryAdjustment, {
45
+ date: new Date(2021, 11, 31, 23, 59, 59, 999),
46
+ createdAt: 123,
47
+ })).toBe("INSERT INTO `InventoryAdjustment` (`date`, `createdAt`) VALUES ('2021-12-31 23:59:59.999', 123)");
48
+ }
49
+ shouldInsertWithOnInsertId() {
50
+ expect(this.dialect.insert(test_1.TaxCategory, {
51
+ name: 'Some Name',
52
+ createdAt: 123,
53
+ })).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name', 123, '.+'\)$/);
54
+ }
55
+ shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
56
+ expect(this.dialect.insert(test_1.TaxCategory, [
57
+ {
58
+ name: 'Some Name A',
59
+ },
60
+ {
61
+ pk: '50',
62
+ name: 'Some Name B',
63
+ },
64
+ {
65
+ name: 'Some Name C',
66
+ },
67
+ {
68
+ pk: '70',
69
+ name: 'Some Name D',
70
+ },
71
+ ])).toMatch(/^INSERT INTO `TaxCategory` \(`name`, `createdAt`, `pk`\) VALUES \('Some Name A', \d+, '.+'\), \('Some Name B', \d+, '50'\), \('Some Name C', \d+, '.+'\), \('Some Name D', \d+, '70'\)$/);
72
+ }
73
+ shouldUpdate() {
74
+ expect(this.dialect.update(test_1.User, { $filter: { name: 'some', creatorId: 123 } }, {
75
+ name: 'Some Text',
76
+ updatedAt: 321,
77
+ })).toBe("UPDATE `User` SET `name` = 'Some Text', `updatedAt` = 321 WHERE `name` = 'some' AND `creatorId` = 123");
78
+ }
79
+ shouldFind() {
80
+ expect(this.dialect.find(test_1.User, {
81
+ $project: ['id'],
82
+ $filter: { id: 123, name: 'abc' },
83
+ })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
84
+ expect(this.dialect.find(test_1.Profile, {
85
+ $project: ['id', 'picture', 'companyId'],
86
+ $filter: { id: 123, picture: 'abc' },
87
+ })).toBe("SELECT `pk` `id`, `image` `picture`, `companyId` FROM `user_profile` WHERE `pk` = 123 AND `image` = 'abc'");
88
+ expect(this.dialect.find(test_1.MeasureUnit, {
89
+ $project: ['id'],
90
+ $filter: { id: 123, name: 'abc' },
91
+ })).toBe("SELECT `id` FROM `MeasureUnit` WHERE `id` = 123 AND `name` = 'abc' AND `deletedAt` IS NULL");
92
+ }
93
+ shouldBeSecure() {
94
+ expect(this.dialect.find(test_1.User, {
95
+ $project: ['id', 'something'],
96
+ $filter: {
97
+ id: 1,
98
+ something: 1,
99
+ },
100
+ $sort: {
101
+ id: 1,
102
+ something: 1,
103
+ },
104
+ $group: ['id', 'something'],
105
+ })).toBe('SELECT `id` FROM `User` WHERE `id` = 1 AND `something` = 1 GROUP BY `id`, `something` ORDER BY `id`, `something`');
106
+ expect(this.dialect.insert(test_1.User, {
107
+ name: 'Some Name',
108
+ something: 'anything',
109
+ createdAt: 1,
110
+ })).toBe("INSERT INTO `User` (`name`, `createdAt`) VALUES ('Some Name', 1)");
111
+ expect(this.dialect.update(test_1.User, {
112
+ $filter: { something: 'anything' },
113
+ }, {
114
+ name: 'Some Name',
115
+ something: 'anything',
116
+ updatedAt: 1,
117
+ })).toBe("UPDATE `User` SET `name` = 'Some Name', `updatedAt` = 1 WHERE `something` = 'anything'");
118
+ expect(this.dialect.delete(test_1.User, {
119
+ $filter: { something: 'anything' },
120
+ })).toBe("DELETE FROM `User` WHERE `something` = 'anything'");
121
+ }
122
+ shouldFind$and() {
123
+ const sql = "SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'";
124
+ expect(this.dialect.find(test_1.User, {
125
+ $project: ['id'],
126
+ $filter: { $and: [{ id: 123, name: 'abc' }] },
127
+ })).toBe(sql);
128
+ expect(this.dialect.find(test_1.User, {
129
+ $project: { id: 1 },
130
+ $filter: { $and: [{ id: 123 }], name: 'abc' },
131
+ })).toBe(sql);
132
+ }
133
+ shouldFind$or() {
134
+ expect(this.dialect.find(test_1.User, {
135
+ $project: ['id'],
136
+ $filter: { $or: [{ id: 123 }, { name: 'abc' }] },
137
+ })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 OR `name` = 'abc'");
138
+ expect(this.dialect.find(test_1.User, {
139
+ $project: ['id'],
140
+ $filter: { $or: [{ id: 123 }] },
141
+ })).toBe('SELECT `id` FROM `User` WHERE `id` = 123');
142
+ expect(this.dialect.find(test_1.User, {
143
+ $project: { id: 1 },
144
+ $filter: { $or: [{ id: 123, name: 'abc' }] },
145
+ })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
146
+ expect(this.dialect.find(test_1.User, {
147
+ $project: ['id'],
148
+ $filter: { $or: [{ id: 123 }], name: 'abc' },
149
+ })).toBe("SELECT `id` FROM `User` WHERE `id` = 123 AND `name` = 'abc'");
150
+ }
151
+ shouldFind$not() {
152
+ expect(this.dialect.find(test_1.User, {
153
+ $project: ['id'],
154
+ $filter: { $not: [{ name: 'Some' }] },
155
+ })).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
156
+ expect(this.dialect.find(test_1.Company, {
157
+ $project: ['id'],
158
+ $filter: { id: { $not: 123 } },
159
+ })).toBe('SELECT `id` FROM `Company` WHERE NOT `id` = 123');
160
+ expect(this.dialect.find(test_1.Company, {
161
+ $project: ['id'],
162
+ $filter: { id: { $not: [123, 456] } },
163
+ })).toBe('SELECT `id` FROM `Company` WHERE NOT `id` IN (123, 456)');
164
+ expect(this.dialect.find(test_1.Company, {
165
+ $project: ['id'],
166
+ $filter: { id: 123, name: { $not: { $startsWith: 'a' } } },
167
+ })).toBe("SELECT `id` FROM `Company` WHERE `id` = 123 AND NOT `name` LIKE 'a%'");
168
+ expect(this.dialect.find(test_1.Company, {
169
+ $project: ['id'],
170
+ $filter: { name: { $not: { $startsWith: 'a', $endsWith: 'z' } } },
171
+ })).toBe("SELECT `id` FROM `Company` WHERE NOT (`name` LIKE 'a%' AND `name` LIKE '%z')");
172
+ expect(this.dialect.find(test_1.User, {
173
+ $project: { id: true },
174
+ $filter: { $not: [{ name: { $like: 'Some', $ne: 'Something' } }] },
175
+ })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
176
+ expect(this.dialect.find(test_1.User, {
177
+ $project: { id: true },
178
+ $filter: { $not: [{ name: 'abc' }, { creatorId: 1 }] },
179
+ })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' AND `creatorId` = 1)");
180
+ expect(this.dialect.find(test_1.Tax, {
181
+ $project: ['id'],
182
+ $filter: { companyId: 1, name: { $not: { $startsWith: 'a' } } },
183
+ })).toBe("SELECT `id` FROM `Tax` WHERE `companyId` = 1 AND NOT `name` LIKE 'a%'");
184
+ }
185
+ shouldFind$nor() {
186
+ expect(this.dialect.find(test_1.User, {
187
+ $project: ['id'],
188
+ $filter: { $nor: [{ name: 'Some' }] },
189
+ })).toBe("SELECT `id` FROM `User` WHERE NOT `name` = 'Some'");
190
+ expect(this.dialect.find(test_1.User, {
191
+ $project: { id: true },
192
+ $filter: { $nor: [{ name: { $like: 'Some', $ne: 'Something' } }] },
193
+ })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` LIKE 'Some' AND `name` <> 'Something')");
194
+ expect(this.dialect.find(test_1.User, {
195
+ $project: { id: true },
196
+ $filter: { $nor: [{ name: 'abc' }, { creatorId: 1 }] },
197
+ })).toBe("SELECT `id` FROM `User` WHERE NOT (`name` = 'abc' OR `creatorId` = 1)");
198
+ }
199
+ shouldFind$orAnd$and() {
200
+ expect(this.dialect.find(test_1.User, {
201
+ $project: ['id'],
202
+ $filter: { creatorId: 1, $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }], id: 1 },
203
+ })).toBe("SELECT `id` FROM `User` WHERE `creatorId` = 1 AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1");
204
+ expect(this.dialect.find(test_1.User, {
205
+ $project: ['id'],
206
+ $filter: {
207
+ creatorId: 1,
208
+ $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
209
+ id: 1,
210
+ email: 'e',
211
+ },
212
+ })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
213
+ " AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com') AND `id` = 1 AND `email` = 'e'");
214
+ expect(this.dialect.find(test_1.User, {
215
+ $project: ['id'],
216
+ $filter: {
217
+ creatorId: 1,
218
+ $or: [{ name: ['a', 'b', 'c'] }, { email: 'abc@example.com' }],
219
+ id: 1,
220
+ email: 'e',
221
+ },
222
+ $sort: { name: 1, createdAt: -1 },
223
+ $skip: 50,
224
+ $limit: 10,
225
+ })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 1' +
226
+ " AND (`name` IN ('a', 'b', 'c') OR `email` = 'abc@example.com')" +
227
+ " AND `id` = 1 AND `email` = 'e'" +
228
+ ' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
229
+ expect(this.dialect.find(test_1.User, {
230
+ $project: ['id'],
231
+ $filter: {
232
+ $or: [
233
+ {
234
+ creatorId: 1,
235
+ id: 1,
236
+ email: 'e',
237
+ },
238
+ { name: ['a', 'b', 'c'], email: 'abc@example.com' },
239
+ ],
240
+ },
241
+ $sort: [
242
+ { field: 'name', sort: 'asc' },
243
+ { field: 'createdAt', sort: 'desc' },
244
+ ],
245
+ $skip: 50,
246
+ $limit: 10,
247
+ })).toBe("SELECT `id` FROM `User` WHERE (`creatorId` = 1 AND `id` = 1 AND `email` = 'e')" +
248
+ " OR (`name` IN ('a', 'b', 'c') AND `email` = 'abc@example.com')" +
249
+ ' ORDER BY `name`, `createdAt` DESC LIMIT 10 OFFSET 50');
250
+ }
251
+ shouldFindSingle$filter() {
252
+ expect(this.dialect.find(test_1.User, {
253
+ $project: ['id'],
254
+ $filter: { name: 'some' },
255
+ $limit: 3,
256
+ })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' LIMIT 3");
257
+ }
258
+ shouldFindMultipleComparisonOperators() {
259
+ expect(this.dialect.find(test_1.User, {
260
+ $project: ['id'],
261
+ $filter: { $or: [{ name: { $eq: 'other', $ne: 'other unwanted' } }, { companyId: 1 }] },
262
+ })).toBe("SELECT `id` FROM `User` WHERE (`name` = 'other' AND `name` <> 'other unwanted') OR `companyId` = 1");
263
+ expect(this.dialect.find(test_1.User, {
264
+ $project: ['id'],
265
+ $filter: { createdAt: { $gte: 123, $lte: 999 } },
266
+ $limit: 10,
267
+ })).toBe('SELECT `id` FROM `User` WHERE (`createdAt` >= 123 AND `createdAt` <= 999) LIMIT 10');
268
+ expect(this.dialect.find(test_1.User, {
269
+ $project: ['id'],
270
+ $filter: { createdAt: { $gt: 123, $lt: 999 } },
271
+ $limit: 10,
272
+ })).toBe('SELECT `id` FROM `User` WHERE (`createdAt` > 123 AND `createdAt` < 999) LIMIT 10');
273
+ }
274
+ shouldFind$ne() {
275
+ expect(this.dialect.find(test_1.User, {
276
+ $project: ['id'],
277
+ $filter: { name: 'some', companyId: { $ne: 5 } },
278
+ $limit: 20,
279
+ })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` <> 5 LIMIT 20");
280
+ }
281
+ shouldFindIsNull() {
282
+ expect(this.dialect.find(test_1.User, {
283
+ $project: ['id'],
284
+ $filter: { creatorId: 123, companyId: null },
285
+ $limit: 5,
286
+ })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NULL LIMIT 5');
287
+ expect(this.dialect.find(test_1.User, {
288
+ $project: { id: true },
289
+ $filter: { creatorId: 123, companyId: { $ne: null } },
290
+ $limit: 5,
291
+ })).toBe('SELECT `id` FROM `User` WHERE `creatorId` = 123 AND `companyId` IS NOT NULL LIMIT 5');
292
+ }
293
+ shouldFind$in() {
294
+ const sql = "SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` IN (1, 2, 3) LIMIT 10";
295
+ expect(this.dialect.find(test_1.User, {
296
+ $project: ['id'],
297
+ $filter: { name: 'some', companyId: [1, 2, 3] },
298
+ $limit: 10,
299
+ })).toBe(sql);
300
+ expect(this.dialect.find(test_1.User, {
301
+ $project: ['id'],
302
+ $filter: { name: 'some', companyId: { $in: [1, 2, 3] } },
303
+ $limit: 10,
304
+ })).toBe(sql);
305
+ }
306
+ shouldFind$nin() {
307
+ expect(this.dialect.find(test_1.User, {
308
+ $project: ['id'],
309
+ $filter: { name: 'some', companyId: { $nin: [1, 2, 3] } },
310
+ $limit: 10,
311
+ })).toBe("SELECT `id` FROM `User` WHERE `name` = 'some' AND `companyId` NOT IN (1, 2, 3) LIMIT 10");
312
+ }
313
+ shouldFind$projectFields() {
314
+ expect(this.dialect.find(test_1.User, { $project: { id: true, company: true } })).toBe('SELECT `User`.`id`, `company`.`id` `company.id`, `company`.`companyId` `company.companyId`, `company`.`creatorId` `company.creatorId`' +
315
+ ', `company`.`createdAt` `company.createdAt`, `company`.`updatedAt` `company.updatedAt`' +
316
+ ', `company`.`name` `company.name`, `company`.`description` `company.description`' +
317
+ ' FROM `User` LEFT JOIN `Company` `company` ON `company`.`id` = `User`.`companyId`');
318
+ }
319
+ shouldFind$projectOneToOne() {
320
+ expect(this.dialect.find(test_1.User, {
321
+ $project: { id: true, name: true, profile: ['id', 'picture'] },
322
+ })).toBe('SELECT `User`.`id`, `User`.`name`, `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture` FROM `User`' +
323
+ ' LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
324
+ expect(this.dialect.find(test_1.User, { $project: { profile: true } })).toBe('SELECT `User`.`id`, `profile`.`companyId` `profile.companyId`' +
325
+ ', `profile`.`creatorId` `profile.creatorId`, `profile`.`createdAt` `profile.createdAt`' +
326
+ ', `profile`.`updatedAt` `profile.updatedAt`' +
327
+ ', `profile`.`pk` `profile.id`, `profile`.`image` `profile.picture`' +
328
+ ' FROM `User` LEFT JOIN `user_profile` `profile` ON `profile`.`creatorId` = `User`.`id`');
329
+ }
330
+ shouldFind$projectManyToOne() {
331
+ expect(this.dialect.find(test_1.Item, {
332
+ $project: {
333
+ id: true,
334
+ name: true,
335
+ code: true,
336
+ tax: { $project: ['id', 'name'], $required: true },
337
+ measureUnit: { $project: ['id', 'name', 'categoryId'] },
338
+ },
339
+ $limit: 100,
340
+ })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
341
+ ', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
342
+ ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
343
+ ' FROM `Item`' +
344
+ ' INNER JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
345
+ ' LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
346
+ ' LIMIT 100');
347
+ }
348
+ shouldFind$projectWithAllFieldsAndSpecificFieldsAndFilter() {
349
+ expect(this.dialect.find(test_1.Item, {
350
+ $project: {
351
+ id: true,
352
+ name: true,
353
+ measureUnit: { $project: ['id', 'name'], $filter: { name: { $ne: 'unidad' } }, $required: true },
354
+ tax: ['id', 'name'],
355
+ },
356
+ $filter: { salePrice: { $gte: 1000 }, name: { $istartsWith: 'A' } },
357
+ $sort: { tax: { name: 1 }, measureUnit: { name: 1 }, createdAt: -1 },
358
+ $limit: 100,
359
+ })).toBe('SELECT `Item`.`id`, `Item`.`name`' +
360
+ ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`' +
361
+ ', `tax`.`id` `tax.id`, `tax`.`name` `tax.name`' +
362
+ ' FROM `Item`' +
363
+ " INNER JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId` AND `measureUnit`.`name` <> 'unidad' AND `measureUnit`.`deletedAt` IS NULL" +
364
+ ' LEFT JOIN `Tax` `tax` ON `tax`.`id` = `Item`.`taxId`' +
365
+ " WHERE `Item`.`salePrice` >= 1000 AND LOWER(`Item`.`name`) LIKE 'a%'" +
366
+ ' ORDER BY `tax`.`name`, `measureUnit`.`name`, `Item`.`createdAt` DESC LIMIT 100');
367
+ }
368
+ shouldVirtualField() {
369
+ expect(this.dialect.find(test_1.Item, {
370
+ $project: {
371
+ id: 1,
372
+ },
373
+ $filter: {
374
+ tagsCount: { $gte: 10 },
375
+ },
376
+ })).toBe('SELECT `id` FROM `Item` WHERE (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `id`) >= 10');
377
+ expect(this.dialect.find(test_1.Item, {
378
+ $project: {
379
+ id: 1,
380
+ name: 1,
381
+ code: 1,
382
+ tagsCount: 1,
383
+ measureUnit: {
384
+ $project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
385
+ },
386
+ },
387
+ $limit: 100,
388
+ })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
389
+ ', (SELECT COUNT(*) `count` FROM `ItemTag` WHERE `ItemTag`.`itemId` = `Item`.`id`) `tagsCount`' +
390
+ ', `measureUnit`.`id` `measureUnit.id`, `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
391
+ ', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
392
+ ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
393
+ ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
394
+ ' LIMIT 100');
395
+ }
396
+ shouldFind$projectDeep() {
397
+ expect(this.dialect.find(test_1.Item, {
398
+ $project: {
399
+ id: 1,
400
+ name: 1,
401
+ code: 1,
402
+ measureUnit: {
403
+ $project: { id: 1, name: 1, categoryId: 1, category: ['name'] },
404
+ },
405
+ },
406
+ $limit: 100,
407
+ })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`' +
408
+ ', `measureUnit`.`id` `measureUnit.id`' +
409
+ ', `measureUnit`.`name` `measureUnit.name`, `measureUnit`.`categoryId` `measureUnit.categoryId`' +
410
+ ', `measureUnit.category`.`id` `measureUnit.category.id`, `measureUnit.category`.`name` `measureUnit.category.name`' +
411
+ ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
412
+ ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
413
+ ' LIMIT 100');
414
+ expect(this.dialect.find(test_1.Item, {
415
+ $project: {
416
+ id: true,
417
+ name: true,
418
+ code: true,
419
+ measureUnit: {
420
+ $project: { id: true, name: true, category: { $project: { id: true, name: true } } },
421
+ },
422
+ },
423
+ $limit: 100,
424
+ })).toBe('SELECT `Item`.`id`, `Item`.`name`, `Item`.`code`, `measureUnit`.`id` `measureUnit.id`' +
425
+ ', `measureUnit`.`name` `measureUnit.name`, `measureUnit.category`.`id` `measureUnit.category.id`' +
426
+ ', `measureUnit.category`.`name` `measureUnit.category.name`' +
427
+ ' FROM `Item` LEFT JOIN `MeasureUnit` `measureUnit` ON `measureUnit`.`id` = `Item`.`measureUnitId`' +
428
+ ' LEFT JOIN `MeasureUnitCategory` `measureUnit.category` ON `measureUnit.category`.`id` = `measureUnit`.`categoryId`' +
429
+ ' LIMIT 100');
430
+ expect(this.dialect.find(test_1.ItemAdjustment, {
431
+ $project: {
432
+ id: true,
433
+ buyPrice: true,
434
+ number: true,
435
+ item: {
436
+ $project: {
437
+ id: true,
438
+ name: true,
439
+ measureUnit: {
440
+ $project: { id: true, name: true, category: ['id', 'name'] },
441
+ },
442
+ },
443
+ $required: true,
444
+ },
445
+ },
446
+ $limit: 100,
447
+ })).toBe('SELECT `ItemAdjustment`.`id`, `ItemAdjustment`.`buyPrice`, `ItemAdjustment`.`number`' +
448
+ ', `item`.`id` `item.id`, `item`.`name` `item.name`' +
449
+ ', `item.measureUnit`.`id` `item.measureUnit.id`, `item.measureUnit`.`name` `item.measureUnit.name`' +
450
+ ', `item.measureUnit.category`.`id` `item.measureUnit.category.id`, `item.measureUnit.category`.`name` `item.measureUnit.category.name`' +
451
+ ' FROM `ItemAdjustment`' +
452
+ ' INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId`' +
453
+ ' LEFT JOIN `MeasureUnit` `item.measureUnit` ON `item.measureUnit`.`id` = `item`.`measureUnitId`' +
454
+ ' LEFT JOIN `MeasureUnitCategory` `item.measureUnit.category` ON `item.measureUnit.category`.`id` = `item.measureUnit`.`categoryId`' +
455
+ ' LIMIT 100');
456
+ }
457
+ shouldFind$group() {
458
+ expect(this.dialect.find(test_1.User, {
459
+ $group: ['companyId'],
460
+ })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email`, `password` FROM `User` GROUP BY `companyId`');
461
+ expect(this.dialect.find(test_1.User, {
462
+ $project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
463
+ $group: ['companyId'],
464
+ $having: {
465
+ count: {
466
+ $gte: 10,
467
+ },
468
+ },
469
+ })).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
470
+ expect(this.dialect.find(test_1.User, {
471
+ $project: ['id', 'name'],
472
+ $filter: { companyId: 1 },
473
+ $group: ['companyId'],
474
+ $skip: 50,
475
+ $limit: 100,
476
+ $sort: { name: 'desc' },
477
+ })).toBe('SELECT `id`, `name` FROM `User` WHERE `companyId` = 1 GROUP BY `companyId` ORDER BY `name` DESC LIMIT 100 OFFSET 50');
478
+ }
479
+ shouldFind$limit() {
480
+ expect(this.dialect.find(test_1.User, {
481
+ $project: ['id'],
482
+ $filter: 9,
483
+ $limit: 1,
484
+ })).toBe('SELECT `id` FROM `User` WHERE `id` = 9 LIMIT 1');
485
+ expect(this.dialect.find(test_1.User, {
486
+ $project: { id: 1, name: 1, creatorId: 1 },
487
+ $filter: 9,
488
+ $limit: 1,
489
+ })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` WHERE `id` = 9 LIMIT 1');
490
+ expect(this.dialect.find(test_1.User, {
491
+ $project: ['id'],
492
+ $filter: { name: 'something', creatorId: 123 },
493
+ $limit: 1,
494
+ })).toBe("SELECT `id` FROM `User` WHERE `name` = 'something' AND `creatorId` = 123 LIMIT 1");
495
+ expect(this.dialect.find(test_1.User, {
496
+ $project: ['id', 'name', 'creatorId'],
497
+ $limit: 25,
498
+ })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` LIMIT 25');
499
+ }
500
+ shouldFind$skip() {
501
+ expect(this.dialect.find(test_1.User, {
502
+ $project: { id: 1, name: 1, creatorId: 1 },
503
+ $skip: 30,
504
+ })).toBe('SELECT `id`, `name`, `creatorId` FROM `User` OFFSET 30');
505
+ }
506
+ shouldFind$project() {
507
+ expect(this.dialect.find(test_1.User, {
508
+ $project: { password: false },
509
+ })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `name`, `email` FROM `User`');
510
+ expect(this.dialect.find(test_1.User, {
511
+ $project: { name: 0, password: 0 },
512
+ })).toBe('SELECT `id`, `companyId`, `creatorId`, `createdAt`, `updatedAt`, `email` FROM `User`');
513
+ expect(this.dialect.find(test_1.User, {
514
+ $project: { id: 1, name: 1, password: 0 },
515
+ })).toBe('SELECT `id`, `name` FROM `User`');
516
+ expect(this.dialect.find(test_1.User, {
517
+ $project: { id: 1, name: 0, password: 0 },
518
+ })).toBe('SELECT `id` FROM `User`');
519
+ expect(this.dialect.find(test_1.User, {
520
+ $project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
521
+ $filter: { name: 'something' },
522
+ })).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
523
+ }
524
+ shouldDelete() {
525
+ expect(this.dialect.delete(test_1.User, { $filter: 123 })).toBe('DELETE FROM `User` WHERE `id` = 123');
526
+ expect(() => this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: true })).toThrow("'User' has not enabled 'softDelete'");
527
+ expect(this.dialect.delete(test_1.User, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `User` WHERE `id` = 123');
528
+ expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
529
+ expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: true })).toMatch(/^UPDATE `MeasureUnit` SET `deletedAt` = \d+ WHERE `id` = 123 AND `deletedAt` IS NULL$/);
530
+ expect(this.dialect.delete(test_1.MeasureUnit, { $filter: 123 }, { softDelete: false })).toBe('DELETE FROM `MeasureUnit` WHERE `id` = 123');
531
+ }
532
+ shouldFind$projectRaw() {
533
+ expect(this.dialect.find(test_1.Item, {
534
+ $project: {
535
+ companyId: true,
536
+ total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
537
+ },
538
+ $group: ['companyId'],
539
+ })).toBe('SELECT `companyId`, SUM(`salePrice`) `total` FROM `Item` GROUP BY `companyId`');
540
+ expect(this.dialect.find(test_1.ItemAdjustment, {
541
+ $project: {
542
+ item: {
543
+ $project: {
544
+ companyId: true,
545
+ total: (0, util_1.raw)(({ escapedPrefix, dialect }) => `SUM(${escapedPrefix}${dialect.escapeId('salePrice')})`),
546
+ },
547
+ $required: true,
548
+ },
549
+ },
550
+ $group: ['companyId'],
551
+ })).toBe('SELECT `ItemAdjustment`.`id`, `item`.`id` `item.id`, `item`.`companyId` `item.companyId`, SUM(`item`.`salePrice`) `item.total`' +
552
+ ' FROM `ItemAdjustment` INNER JOIN `Item` `item` ON `item`.`id` = `ItemAdjustment`.`itemId` GROUP BY `companyId`');
553
+ expect(this.dialect.find(test_1.User, {
554
+ $project: ['companyId', (0, util_1.raw)('COUNT(*)', 'count')],
555
+ $group: ['companyId'],
556
+ $having: {
557
+ count: {
558
+ $gte: 10,
559
+ },
560
+ },
561
+ })).toBe('SELECT `companyId`, COUNT(*) `count` FROM `User` GROUP BY `companyId` HAVING `count` >= 10');
562
+ expect(this.dialect.find(test_1.User, {
563
+ $project: [(0, util_1.raw)(() => 'createdAt', 'hotness')],
564
+ $filter: { name: 'something' },
565
+ })).toBe("SELECT createdAt `hotness` FROM `User` WHERE `name` = 'something'");
566
+ expect(this.dialect.find(test_1.User, {
567
+ $project: [(0, util_1.raw)('*'), (0, util_1.raw)('LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt', 'hotness')],
568
+ $filter: { name: 'something' },
569
+ })).toBe("SELECT *, LOG10(numberOfVotes + 1) * 287014.5873982681 + createdAt `hotness` FROM `User` WHERE `name` = 'something'");
570
+ }
571
+ shouldFind$filterRaw() {
572
+ expect(this.dialect.find(test_1.Item, {
573
+ $project: ['id'],
574
+ $filter: { $and: [{ companyId: 1 }, (0, util_1.raw)('SUM(salePrice) > 500')] },
575
+ $group: ['creatorId'],
576
+ })).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 AND SUM(salePrice) > 500 GROUP BY `creatorId`');
577
+ expect(this.dialect.find(test_1.Item, {
578
+ $project: ['id'],
579
+ $filter: { $or: [{ companyId: 1 }, 5, (0, util_1.raw)('SUM(salePrice) > 500')] },
580
+ })).toBe('SELECT `id` FROM `Item` WHERE `companyId` = 1 OR `id` = 5 OR SUM(salePrice) > 500');
581
+ expect(this.dialect.find(test_1.Item, {
582
+ $project: ['id'],
583
+ $filter: { $and: [(0, util_1.raw)('SUM(`salePrice`) > 500')] },
584
+ $group: ['companyId'],
585
+ })).toBe('SELECT `id` FROM `Item` WHERE SUM(`salePrice`) > 500 GROUP BY `companyId`');
586
+ expect(this.dialect.find(test_1.Item, {
587
+ $project: ['id'],
588
+ $filter: { $or: [1, (0, util_1.raw)('SUM(salePrice) > 500')] },
589
+ })).toBe('SELECT `id` FROM `Item` WHERE `id` = 1 OR SUM(salePrice) > 500');
590
+ expect(this.dialect.find(test_1.Item, {
591
+ $project: ['id'],
592
+ $filter: { $or: [(0, util_1.raw)('SUM(salePrice) > 500'), 1, { companyId: 1 }] },
593
+ })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 OR `id` = 1 OR `companyId` = 1');
594
+ expect(this.dialect.find(test_1.Item, {
595
+ $project: ['id'],
596
+ $filter: { $and: [(0, util_1.raw)('SUM(salePrice) > 500')] },
597
+ $group: ['creatorId'],
598
+ })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
599
+ expect(this.dialect.find(test_1.Item, {
600
+ $project: ['id'],
601
+ $filter: (0, util_1.raw)('SUM(salePrice) > 500'),
602
+ $group: ['creatorId'],
603
+ })).toBe('SELECT `id` FROM `Item` WHERE SUM(salePrice) > 500 GROUP BY `creatorId`');
604
+ expect(this.dialect.find(test_1.Item, {
605
+ $project: ['id'],
606
+ $filter: { $or: [[1, 2], { code: 'abc' }] },
607
+ $group: ['creatorId'],
608
+ })).toBe("SELECT `id` FROM `Item` WHERE `id` IN (1, 2) OR `code` = 'abc' GROUP BY `creatorId`");
609
+ }
610
+ shouldFind$startsWith() {
611
+ expect(this.dialect.find(test_1.User, {
612
+ $project: ['id'],
613
+ $filter: { name: { $startsWith: 'Some' } },
614
+ $sort: [
615
+ { field: 'name', sort: 'asc' },
616
+ { field: 'createdAt', sort: 'desc' },
617
+ ],
618
+ $skip: 0,
619
+ $limit: 50,
620
+ })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some%' ORDER BY `name`, `createdAt` DESC LIMIT 50 OFFSET 0");
621
+ expect(this.dialect.find(test_1.User, {
622
+ $project: { id: true },
623
+ $filter: { name: { $startsWith: 'Some', $ne: 'Something' } },
624
+ $sort: { name: 1, id: -1 },
625
+ $skip: 0,
626
+ $limit: 50,
627
+ })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
628
+ }
629
+ shouldFind$istartsWith() {
630
+ expect(this.dialect.find(test_1.User, {
631
+ $project: ['id'],
632
+ $filter: { name: { $istartsWith: 'Some' } },
633
+ $sort: { name: 1, id: -1 },
634
+ $skip: 0,
635
+ $limit: 50,
636
+ })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
637
+ expect(this.dialect.find(test_1.User, {
638
+ $project: { id: true },
639
+ $filter: { name: { $istartsWith: 'Some', $ne: 'Something' } },
640
+ $sort: { name: 1, id: -1 },
641
+ $skip: 0,
642
+ $limit: 50,
643
+ })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
644
+ }
645
+ shouldFind$endsWith() {
646
+ expect(this.dialect.find(test_1.User, {
647
+ $project: ['id'],
648
+ $filter: { name: { $endsWith: 'Some' } },
649
+ $sort: { name: 1, id: -1 },
650
+ $skip: 0,
651
+ $limit: 50,
652
+ })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
653
+ expect(this.dialect.find(test_1.User, {
654
+ $project: ['id'],
655
+ $filter: { name: { $endsWith: 'Some', $ne: 'Something' } },
656
+ $sort: { name: 1, id: -1 },
657
+ $skip: 0,
658
+ $limit: 50,
659
+ })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
660
+ }
661
+ shouldFind$iendsWith() {
662
+ expect(this.dialect.find(test_1.User, {
663
+ $project: ['id'],
664
+ $filter: { name: { $iendsWith: 'Some' } },
665
+ $sort: { name: 1, id: -1 },
666
+ $skip: 0,
667
+ $limit: 50,
668
+ })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
669
+ expect(this.dialect.find(test_1.User, {
670
+ $project: ['id'],
671
+ $filter: { name: { $iendsWith: 'Some', $ne: 'Something' } },
672
+ $sort: { name: 1, id: -1 },
673
+ $skip: 0,
674
+ $limit: 50,
675
+ })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
676
+ }
677
+ shouldFind$includes() {
678
+ expect(this.dialect.find(test_1.User, {
679
+ $project: ['id'],
680
+ $filter: { name: { $includes: 'Some' } },
681
+ $sort: { name: 1, id: -1 },
682
+ $skip: 0,
683
+ $limit: 50,
684
+ })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE '%Some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
685
+ expect(this.dialect.find(test_1.User, {
686
+ $project: ['id'],
687
+ $filter: { name: { $includes: 'Some', $ne: 'Something' } },
688
+ $sort: { name: 1, id: -1 },
689
+ $skip: 0,
690
+ $limit: 50,
691
+ })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE '%Some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
692
+ }
693
+ shouldFind$iincludes() {
694
+ expect(this.dialect.find(test_1.User, {
695
+ $project: ['id'],
696
+ $filter: { name: { $iincludes: 'Some' } },
697
+ $sort: { name: 1, id: -1 },
698
+ $skip: 0,
699
+ $limit: 50,
700
+ })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE '%some%' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
701
+ expect(this.dialect.find(test_1.User, {
702
+ $project: ['id'],
703
+ $filter: { name: { $iincludes: 'Some', $ne: 'Something' } },
704
+ $sort: { name: 1, id: -1 },
705
+ $skip: 0,
706
+ $limit: 50,
707
+ })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE '%some%' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
708
+ }
709
+ shouldFind$like() {
710
+ expect(this.dialect.find(test_1.User, {
711
+ $project: ['id'],
712
+ $filter: { name: { $like: 'Some' } },
713
+ $sort: { name: 1, id: -1 },
714
+ $skip: 0,
715
+ $limit: 50,
716
+ })).toBe("SELECT `id` FROM `User` WHERE `name` LIKE 'Some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
717
+ expect(this.dialect.find(test_1.User, {
718
+ $project: { id: true },
719
+ $filter: { name: { $like: 'Some', $ne: 'Something' } },
720
+ $sort: { name: 1, id: -1 },
721
+ $skip: 0,
722
+ $limit: 50,
723
+ })).toBe("SELECT `id` FROM `User` WHERE (`name` LIKE 'Some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
724
+ }
725
+ shouldFind$ilike() {
726
+ expect(this.dialect.find(test_1.User, {
727
+ $project: ['id'],
728
+ $filter: { name: { $ilike: 'Some' } },
729
+ $sort: { name: 1, id: -1 },
730
+ $skip: 0,
731
+ $limit: 50,
732
+ })).toBe("SELECT `id` FROM `User` WHERE LOWER(`name`) LIKE 'some' ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
733
+ expect(this.dialect.find(test_1.User, {
734
+ $project: { id: true },
735
+ $filter: { name: { $ilike: 'Some', $ne: 'Something' } },
736
+ $sort: { name: 1, id: -1 },
737
+ $skip: 0,
738
+ $limit: 50,
739
+ })).toBe("SELECT `id` FROM `User` WHERE (LOWER(`name`) LIKE 'some' AND `name` <> 'Something') ORDER BY `name`, `id` DESC LIMIT 50 OFFSET 0");
740
+ }
741
+ shouldFind$regex() {
742
+ expect(this.dialect.find(test_1.User, {
743
+ $project: ['id'],
744
+ $filter: { name: { $regex: '^some' } },
745
+ })).toBe("SELECT `id` FROM `User` WHERE `name` REGEXP '^some'");
746
+ }
747
+ shouldFind$text() {
748
+ expect(this.dialect.find(test_1.Item, {
749
+ $project: { id: true },
750
+ $filter: { $text: { $fields: ['name', 'description'], $value: 'some text' }, companyId: 1 },
751
+ $limit: 30,
752
+ })).toBe("SELECT `id` FROM `Item` WHERE `Item` MATCH {`name` `description`} : 'some text' AND `companyId` = 1 LIMIT 30");
753
+ expect(this.dialect.find(test_1.User, {
754
+ $project: { id: 1 },
755
+ $filter: {
756
+ $text: { $fields: ['name'], $value: 'something' },
757
+ name: { $ne: 'other unwanted' },
758
+ companyId: 1,
759
+ },
760
+ $limit: 10,
761
+ })).toBe("SELECT `id` FROM `User` WHERE `User` MATCH {`name`} : 'something' AND `name` <> 'other unwanted' AND `companyId` = 1 LIMIT 10");
762
+ }
763
+ }
764
+ exports.AbstractSqlDialectSpec = AbstractSqlDialectSpec;
765
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxEaWFsZWN0LXNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGlhbGVjdC9hYnN0cmFjdFNxbERpYWxlY3Qtc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0k7QUFHeEkseUNBQXFDO0FBR3JDLE1BQXNCLHNCQUFzQjtJQUMxQyxZQUFxQixPQUEyQjtRQUEzQixZQUFPLEdBQVAsT0FBTyxDQUFvQjtJQUFHLENBQUM7SUFFcEQsNEJBQTRCO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sQ0FDSixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFJLEVBQUU7WUFDeEI7Z0JBQ0UsSUFBSSxFQUFFLGFBQWE7Z0JBQ25CLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLFNBQVMsRUFBRSxHQUFHO2FBQ2Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLHdCQUF3QjtnQkFDL0IsU0FBUyxFQUFFLEdBQUc7YUFDZjtZQUNEO2dCQUNFLElBQUksRUFBRSxhQUFhO2dCQUNuQixLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixTQUFTLEVBQUUsR0FBRzthQUNmO1NBQ0YsQ0FBQyxDQUNILENBQUMsSUFBSSxDQUNKLDBEQUEwRDtZQUN4RCxpREFBaUQ7WUFDakQsa0RBQWtEO1lBQ2xELGtEQUFrRCxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLENBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENB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dCB7IFNwZWMsIFVzZXIsIEl0ZW0sIEl0ZW1BZGp1c3RtZW50LCBUYXhDYXRlZ29yeSwgUHJvZmlsZSwgSW52ZW50b3J5QWRqdXN0bWVudCwgTWVhc3VyZVVuaXQsIENvbXBhbnksIFRheCB9IGZyb20gJ0B1cWwvY29yZS90ZXN0JztcblxuaW1wb3J0IHsgRmllbGRLZXksIFF1ZXJ5RmlsdGVyIH0gZnJvbSAnQHVxbC9jb3JlL3R5cGUnO1xuaW1wb3J0IHsgcmF3IH0gZnJvbSAnQHVxbC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RTcWxEaWFsZWN0IH0gZnJvbSAnLi9hYnN0cmFjdFNxbERpYWxlY3QnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxEaWFsZWN0U3BlYyBpbXBsZW1lbnRzIFNwZWMge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBkaWFsZWN0OiBBYnN0cmFjdFNxbERpYWxlY3QpIHt9XG5cbiAgc2hvdWxkQmVWYWxpZEVzY2FwZUNoYXJhY3RlcigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmVzY2FwZUlkQ2hhcikudG9CZSgnYCcpO1xuICB9XG5cbiAgc2hvdWxkQmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmJlZ2luVHJhbnNhY3Rpb25Db21tYW5kKS50b0JlKCdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMScsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwxQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMicsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwyQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDQ1NixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIG5hbWUgMycsXG4gICAgICAgICAgZW1haWw6ICdzb21lZW1haWwzQGV4YW1wbGUuY29tJyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IDc4OSxcbiAgICAgICAgfSxcbiAgICAgIF0pXG4gICAgKS50b0JlKFxuICAgICAgJ0lOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTJyArXG4gICAgICAgIFwiICgnU29tZSBuYW1lIDEnLCAnc29tZWVtYWlsMUBleGFtcGxlLmNvbScsIDEyMylcIiArXG4gICAgICAgIFwiLCAoJ1NvbWUgbmFtZSAyJywgJ3NvbWVlbWFpbDJAZXhhbXBsZS5jb20nLCA0NTYpXCIgK1xuICAgICAgICBcIiwgKCdTb21lIG5hbWUgMycsICdzb21lZW1haWwzQGV4YW1wbGUuY29tJywgNzg5KVwiXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEluc2VydE9uZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFVzZXIsIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZScsXG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsQGV4YW1wbGUuY29tJyxcbiAgICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICB9KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgZW1haWxgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgJ3NvbWVlbWFpbEBleGFtcGxlLmNvbScsIDEyMylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KEludmVudG9yeUFkanVzdG1lbnQsIHtcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoMjAyMSwgMTEsIDMxLCAyMywgNTksIDU5LCA5OTkpLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiSU5TRVJUIElOVE8gYEludmVudG9yeUFkanVzdG1lbnRgIChgZGF0ZWAsIGBjcmVhdGVkQXRgKSBWQUxVRVMgKCcyMDIxLTEyLTMxIDIzOjU5OjU5Ljk5OScsIDEyMylcIik7XG4gIH1cblxuICBzaG91bGRJbnNlcnRXaXRoT25JbnNlcnRJZCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KFRheENhdGVnb3J5LCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBjcmVhdGVkQXQ6IDEyMyxcbiAgICAgIH0pXG4gICAgKS50b01hdGNoKC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lJywgMTIzLCAnLisnXFwpJC8pO1xuICB9XG5cbiAgc2hvdWxkSW5zZXJ0TWFueVdpdGhTcGVjaWZpZWRJZHNBbmRPbkluc2VydElkQXNEZWZhdWx0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5pbnNlcnQoVGF4Q2F0ZWdvcnksIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwazogJzUwJyxcbiAgICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEInLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBrOiAnNzAnLFxuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUgRCcsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICkudG9NYXRjaChcbiAgICAgIC9eSU5TRVJUIElOVE8gYFRheENhdGVnb3J5YCBcXChgbmFtZWAsIGBjcmVhdGVkQXRgLCBgcGtgXFwpIFZBTFVFUyBcXCgnU29tZSBOYW1lIEEnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEInLCBcXGQrLCAnNTAnXFwpLCBcXCgnU29tZSBOYW1lIEMnLCBcXGQrLCAnLisnXFwpLCBcXCgnU29tZSBOYW1lIEQnLCBcXGQrLCAnNzAnXFwpJC9cbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVXBkYXRlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC51cGRhdGUoXG4gICAgICAgIFVzZXIsXG4gICAgICAgIHsgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNyZWF0b3JJZDogMTIzIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIFRleHQnLFxuICAgICAgICAgIHVwZGF0ZWRBdDogMzIxLFxuICAgICAgICB9XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgVGV4dCcsIGB1cGRhdGVkQXRgID0gMzIxIFdIRVJFIGBuYW1lYCA9ICdzb21lJyBBTkQgYGNyZWF0b3JJZGAgPSAxMjNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJ1wiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFByb2ZpbGUsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAncGljdHVyZScsICdjb21wYW55SWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBwaWN0dXJlOiAnYWJjJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYHBrYCBgaWRgLCBgaW1hZ2VgIGBwaWN0dXJlYCwgYGNvbXBhbnlJZGAgRlJPTSBgdXNlcl9wcm9maWxlYCBXSEVSRSBgcGtgID0gMTIzIEFORCBgaW1hZ2VgID0gJ2FiYydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChNZWFzdXJlVW5pdCwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYE1lYXN1cmVVbml0YCBXSEVSRSBgaWRgID0gMTIzIEFORCBgbmFtZWAgPSAnYWJjJyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTFwiKTtcbiAgfVxuXG4gIHNob3VsZEJlU2VjdXJlKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnLCAnc29tZXRoaW5nJyBhcyBGaWVsZEtleTxVc2VyPl0sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBzb21ldGhpbmc6IDEsXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICAkc29ydDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIHNvbWV0aGluZzogMSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICRncm91cDogWydpZCcsICdzb21ldGhpbmcnIGFzIGFueV0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEgQU5EIGBzb21ldGhpbmdgID0gMSBHUk9VUCBCWSBgaWRgLCBgc29tZXRoaW5nYCBPUkRFUiBCWSBgaWRgLCBgc29tZXRoaW5nYCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0Lmluc2VydChVc2VyLCB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICBzb21ldGhpbmc6ICdhbnl0aGluZycsXG4gICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgIH0gYXMgYW55KVxuICAgICkudG9CZShcIklOU0VSVCBJTlRPIGBVc2VyYCAoYG5hbWVgLCBgY3JlYXRlZEF0YCkgVkFMVUVTICgnU29tZSBOYW1lJywgMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QudXBkYXRlKFxuICAgICAgICBVc2VyLFxuICAgICAgICB7XG4gICAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTb21lIE5hbWUnLFxuICAgICAgICAgIHNvbWV0aGluZzogJ2FueXRoaW5nJyxcbiAgICAgICAgICB1cGRhdGVkQXQ6IDEsXG4gICAgICAgIH0gYXMgYW55XG4gICAgICApXG4gICAgKS50b0JlKFwiVVBEQVRFIGBVc2VyYCBTRVQgYG5hbWVgID0gJ1NvbWUgTmFtZScsIGB1cGRhdGVkQXRgID0gMSBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZGVsZXRlKFVzZXIsIHtcbiAgICAgICAgJGZpbHRlcjogeyBzb21ldGhpbmc6ICdhbnl0aGluZycgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICkudG9CZShcIkRFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgc29tZXRoaW5nYCA9ICdhbnl0aGluZydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGFuZCgpIHtcbiAgICBjb25zdCBzcWwgPSBcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCI7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMywgbmFtZTogJ2FiYycgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKHNxbCk7XG4gIH1cblxuICBzaG91bGRGaW5kJG9yKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMgfSwgeyBuYW1lOiAnYWJjJyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzIE9SIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IGlkOiAxMjMsIG5hbWU6ICdhYmMnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBuYW1lYCA9ICdhYmMnXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRvcjogW3sgaWQ6IDEyMyB9XSwgbmFtZTogJ2FiYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYG5hbWVgID0gJ2FiYydcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vdDogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgaWQ6IHsgJG5vdDogMTIzIH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgYGlkYCA9IDEyMycpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoQ29tcGFueSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGlkOiB7ICRub3Q6IFsxMjMsIDQ1Nl0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYENvbXBhbnlgIFdIRVJFIE5PVCBgaWRgIElOICgxMjMsIDQ1NiknKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKENvbXBhbnksIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBpZDogMTIzLCBuYW1lOiB7ICRub3Q6IHsgJHN0YXJ0c1dpdGg6ICdhJyB9IH0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgQ29tcGFueWAgV0hFUkUgYGlkYCA9IDEyMyBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChDb21wYW55LCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkbm90OiB7ICRzdGFydHNXaXRoOiAnYScsICRlbmRzV2l0aDogJ3onIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBDb21wYW55YCBXSEVSRSBOT1QgKGBuYW1lYCBMSUtFICdhJScgQU5EIGBuYW1lYCBMSUtFICcleicpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgIExJS0UgJ1NvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7ICRub3Q6IFt7IG5hbWU6ICdhYmMnIH0sIHsgY3JlYXRvcklkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCAoYG5hbWVgID0gJ2FiYycgQU5EIGBjcmVhdG9ySWRgID0gMSlcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChUYXgsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEsIG5hbWU6IHsgJG5vdDogeyAkc3RhcnRzV2l0aDogJ2EnIH0gfSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBUYXhgIFdIRVJFIGBjb21wYW55SWRgID0gMSBBTkQgTk9UIGBuYW1lYCBMSUtFICdhJSdcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJG5vcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ1NvbWUnIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIE5PVCBgbmFtZWAgPSAnU29tZSdcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogeyAkbGlrZTogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgTElLRSAnU29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJylcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJG5vcjogW3sgbmFtZTogJ2FiYycgfSwgeyBjcmVhdG9ySWQ6IDEgfV0gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgTk9UIChgbmFtZWAgPSAnYWJjJyBPUiBgY3JlYXRvcklkYCA9IDEpXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRvckFuZCRhbmQoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMSwgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sIGlkOiAxIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMSBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDFcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMScgK1xuICAgICAgICBcIiBBTkQgKGBuYW1lYCBJTiAoJ2EnLCAnYicsICdjJykgT1IgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZSdcIlxuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICBjcmVhdG9ySWQ6IDEsXG4gICAgICAgICAgJG9yOiBbeyBuYW1lOiBbJ2EnLCAnYicsICdjJ10gfSwgeyBlbWFpbDogJ2FiY0BleGFtcGxlLmNvbScgfV0sXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgY3JlYXRlZEF0OiAtMSB9LFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgY3JlYXRvcklkYCA9IDEnICtcbiAgICAgICAgXCIgQU5EIChgbmFtZWAgSU4gKCdhJywgJ2InLCAnYycpIE9SIGBlbWFpbGAgPSAnYWJjQGV4YW1wbGUuY29tJylcIiArXG4gICAgICAgIFwiIEFORCBgaWRgID0gMSBBTkQgYGVtYWlsYCA9ICdlJ1wiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY3JlYXRvcklkOiAxLFxuICAgICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgICAgZW1haWw6ICdlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFsnYScsICdiJywgJ2MnXSwgZW1haWw6ICdhYmNAZXhhbXBsZS5jb20nIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgJHNvcnQ6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnbmFtZScsIHNvcnQ6ICdhc2MnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIHNvcnQ6ICdkZXNjJyB9LFxuICAgICAgICBdLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgIFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBjcmVhdG9ySWRgID0gMSBBTkQgYGlkYCA9IDEgQU5EIGBlbWFpbGAgPSAnZScpXCIgK1xuICAgICAgICBcIiBPUiAoYG5hbWVgIElOICgnYScsICdiJywgJ2MnKSBBTkQgYGVtYWlsYCA9ICdhYmNAZXhhbXBsZS5jb20nKVwiICtcbiAgICAgICAgJyBPUkRFUiBCWSBgbmFtZWAsIGBjcmVhdGVkQXRgIERFU0MgTElNSVQgMTAgT0ZGU0VUIDUwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kU2luZ2xlJGZpbHRlcigpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnIH0sXG4gICAgICAgICRsaW1pdDogMyxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIExJTUlUIDNcIik7XG4gIH1cblxuICBzaG91bGRGaW5kTXVsdGlwbGVDb21wYXJpc29uT3BlcmF0b3JzKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFt7IG5hbWU6IHsgJGVxOiAnb3RoZXInLCAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSB9LCB7IGNvbXBhbnlJZDogMSB9XSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYG5hbWVgID0gJ290aGVyJyBBTkQgYG5hbWVgIDw+ICdvdGhlciB1bndhbnRlZCcpIE9SIGBjb21wYW55SWRgID0gMVwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0ZTogMTIzLCAkbHRlOiA5OTkgfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgY3JlYXRlZEF0YCA+PSAxMjMgQU5EIGBjcmVhdGVkQXRgIDw9IDk5OSkgTElNSVQgMTAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjcmVhdGVkQXQ6IHsgJGd0OiAxMjMsICRsdDogOTk5IH0gfSxcbiAgICAgICAgJGxpbWl0OiAxMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoYGNyZWF0ZWRBdGAgPiAxMjMgQU5EIGBjcmVhdGVkQXRgIDwgOTk5KSBMSU1JVCAxMCcpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRuZSgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJG5lOiA1IH0gfSxcbiAgICAgICAgJGxpbWl0OiAyMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCA8PiA1IExJTUlUIDIwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZElzTnVsbCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgY3JlYXRvcklkOiAxMjMsIGNvbXBhbnlJZDogbnVsbCB9LFxuICAgICAgICAkbGltaXQ6IDUsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGNyZWF0b3JJZGAgPSAxMjMgQU5EIGBjb21wYW55SWRgIElTIE5VTEwgTElNSVQgNScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IGNyZWF0b3JJZDogMTIzLCBjb21wYW55SWQ6IHsgJG5lOiBudWxsIH0gfSxcbiAgICAgICAgJGxpbWl0OiA1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBjcmVhdG9ySWRgID0gMTIzIEFORCBgY29tcGFueUlkYCBJUyBOT1QgTlVMTCBMSU1JVCA1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGluKCkge1xuICAgIGNvbnN0IHNxbCA9IFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWUnIEFORCBgY29tcGFueUlkYCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIjtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IFsxLCAyLCAzXSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWUnLCBjb21wYW55SWQ6IHsgJGluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoc3FsKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkbmluKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZScsIGNvbXBhbnlJZDogeyAkbmluOiBbMSwgMiwgM10gfSB9LFxuICAgICAgICAkbGltaXQ6IDEwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgPSAnc29tZScgQU5EIGBjb21wYW55SWRgIE5PVCBJTiAoMSwgMiwgMykgTElNSVQgMTBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3RGaWVsZHMoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIGNvbXBhbnk6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBjb21wYW55YC5gaWRgIGBjb21wYW55LmlkYCwgYGNvbXBhbnlgLmBjb21wYW55SWRgIGBjb21wYW55LmNvbXBhbnlJZGAsIGBjb21wYW55YC5gY3JlYXRvcklkYCBgY29tcGFueS5jcmVhdG9ySWRgJyArXG4gICAgICAgICcsIGBjb21wYW55YC5gY3JlYXRlZEF0YCBgY29tcGFueS5jcmVhdGVkQXRgLCBgY29tcGFueWAuYHVwZGF0ZWRBdGAgYGNvbXBhbnkudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgY29tcGFueWAuYG5hbWVgIGBjb21wYW55Lm5hbWVgLCBgY29tcGFueWAuYGRlc2NyaXB0aW9uYCBgY29tcGFueS5kZXNjcmlwdGlvbmAnICtcbiAgICAgICAgJyBGUk9NIGBVc2VyYCBMRUZUIEpPSU4gYENvbXBhbnlgIGBjb21wYW55YCBPTiBgY29tcGFueWAuYGlkYCA9IGBVc2VyYC5gY29tcGFueUlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0T25lVG9PbmUoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgcHJvZmlsZTogWydpZCcsICdwaWN0dXJlJ10gfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgVXNlcmAuYGlkYCwgYFVzZXJgLmBuYW1lYCwgYHByb2ZpbGVgLmBwa2AgYHByb2ZpbGUuaWRgLCBgcHJvZmlsZWAuYGltYWdlYCBgcHJvZmlsZS5waWN0dXJlYCBGUk9NIGBVc2VyYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgdXNlcl9wcm9maWxlYCBgcHJvZmlsZWAgT04gYHByb2ZpbGVgLmBjcmVhdG9ySWRgID0gYFVzZXJgLmBpZGAnXG4gICAgKTtcblxuICAgIGV4cGVjdCh0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7ICRwcm9qZWN0OiB7IHByb2ZpbGU6IHRydWUgfSB9KSkudG9CZShcbiAgICAgICdTRUxFQ1QgYFVzZXJgLmBpZGAsIGBwcm9maWxlYC5gY29tcGFueUlkYCBgcHJvZmlsZS5jb21wYW55SWRgJyArXG4gICAgICAgICcsIGBwcm9maWxlYC5gY3JlYXRvcklkYCBgcHJvZmlsZS5jcmVhdG9ySWRgLCBgcHJvZmlsZWAuYGNyZWF0ZWRBdGAgYHByb2ZpbGUuY3JlYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHVwZGF0ZWRBdGAgYHByb2ZpbGUudXBkYXRlZEF0YCcgK1xuICAgICAgICAnLCBgcHJvZmlsZWAuYHBrYCBgcHJvZmlsZS5pZGAsIGBwcm9maWxlYC5gaW1hZ2VgIGBwcm9maWxlLnBpY3R1cmVgJyArXG4gICAgICAgICcgRlJPTSBgVXNlcmAgTEVGVCBKT0lOIGB1c2VyX3Byb2ZpbGVgIGBwcm9maWxlYCBPTiBgcHJvZmlsZWAuYGNyZWF0b3JJZGAgPSBgVXNlcmAuYGlkYCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0TWFueVRvT25lKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgICAgdGF4OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHsgJHByb2plY3Q6IFsnaWQnLCAnbmFtZScsICdjYXRlZ29yeUlkJ10gfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAnICtcbiAgICAgICAgJywgYHRheGAuYGlkYCBgdGF4LmlkYCwgYHRheGAuYG5hbWVgIGB0YXgubmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAnICtcbiAgICAgICAgJyBJTk5FUiBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBtZWFzdXJlVW5pdGAgT04gYG1lYXN1cmVVbml0YC5gaWRgID0gYEl0ZW1gLmBtZWFzdXJlVW5pdElkYCcgK1xuICAgICAgICAnIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0V2l0aEFsbEZpZWxkc0FuZFNwZWNpZmljRmllbGRzQW5kRmlsdGVyKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICBuYW1lOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7ICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSwgJGZpbHRlcjogeyBuYW1lOiB7ICRuZTogJ3VuaWRhZCcgfSB9LCAkcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB0YXg6IFsnaWQnLCAnbmFtZSddLFxuICAgICAgICB9LFxuICAgICAgICAkZmlsdGVyOiB7IHNhbGVQcmljZTogeyAkZ3RlOiAxMDAwIH0sIG5hbWU6IHsgJGlzdGFydHNXaXRoOiAnQScgfSB9LFxuICAgICAgICAkc29ydDogeyB0YXg6IHsgbmFtZTogMSB9LCBtZWFzdXJlVW5pdDogeyBuYW1lOiAxIH0sIGNyZWF0ZWRBdDogLTEgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0YC5gaWRgIGBtZWFzdXJlVW5pdC5pZGAsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCcgK1xuICAgICAgICAnLCBgdGF4YC5gaWRgIGB0YXguaWRgLCBgdGF4YC5gbmFtZWAgYHRheC5uYW1lYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1gJyArXG4gICAgICAgIFwiIElOTkVSIEpPSU4gYE1lYXN1cmVVbml0YCBgbWVhc3VyZVVuaXRgIE9OIGBtZWFzdXJlVW5pdGAuYGlkYCA9IGBJdGVtYC5gbWVhc3VyZVVuaXRJZGAgQU5EIGBtZWFzdXJlVW5pdGAuYG5hbWVgIDw+ICd1bmlkYWQnIEFORCBgbWVhc3VyZVVuaXRgLmBkZWxldGVkQXRgIElTIE5VTExcIiArXG4gICAgICAgICcgTEVGVCBKT0lOIGBUYXhgIGB0YXhgIE9OIGB0YXhgLmBpZGAgPSBgSXRlbWAuYHRheElkYCcgK1xuICAgICAgICBcIiBXSEVSRSBgSXRlbWAuYHNhbGVQcmljZWAgPj0gMTAwMCBBTkQgTE9XRVIoYEl0ZW1gLmBuYW1lYCkgTElLRSAnYSUnXCIgK1xuICAgICAgICAnIE9SREVSIEJZIGB0YXhgLmBuYW1lYCwgYG1lYXN1cmVVbml0YC5gbmFtZWAsIGBJdGVtYC5gY3JlYXRlZEF0YCBERVNDIExJTUlUIDEwMCdcbiAgICApO1xuICB9XG5cbiAgc2hvdWxkVmlydHVhbEZpZWxkKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgIHRhZ3NDb3VudDogeyAkZ3RlOiAxMCB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIChTRUxFQ1QgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBJdGVtVGFnYCBXSEVSRSBgSXRlbVRhZ2AuYGl0ZW1JZGAgPSBgaWRgKSA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiAxLFxuICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgY29kZTogMSxcbiAgICAgICAgICB0YWdzQ291bnQ6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCAoU0VMRUNUIENPVU5UKCopIGBjb3VudGAgRlJPTSBgSXRlbVRhZ2AgV0hFUkUgYEl0ZW1UYWdgLmBpdGVtSWRgID0gYEl0ZW1gLmBpZGApIGB0YWdzQ291bnRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG4gIH1cblxuICBzaG91bGRGaW5kJHByb2plY3REZWVwKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICBuYW1lOiAxLFxuICAgICAgICAgIGNvZGU6IDEsXG4gICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBjYXRlZ29yeUlkOiAxLCBjYXRlZ29yeTogWyduYW1lJ10gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAkbGltaXQ6IDEwMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbWAuYGlkYCwgYEl0ZW1gLmBuYW1lYCwgYEl0ZW1gLmBjb2RlYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBpZGAgYG1lYXN1cmVVbml0LmlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXRgLmBuYW1lYCBgbWVhc3VyZVVuaXQubmFtZWAsIGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeUlkYCcgK1xuICAgICAgICAnLCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYG1lYXN1cmVVbml0LmNhdGVnb3J5LmlkYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICAgIG1lYXN1cmVVbml0OiB7XG4gICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IHsgJHByb2plY3Q6IHsgaWQ6IHRydWUsIG5hbWU6IHRydWUgfSB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJGxpbWl0OiAxMDAsXG4gICAgICB9KVxuICAgICkudG9CZShcbiAgICAgICdTRUxFQ1QgYEl0ZW1gLmBpZGAsIGBJdGVtYC5gbmFtZWAsIGBJdGVtYC5gY29kZWAsIGBtZWFzdXJlVW5pdGAuYGlkYCBgbWVhc3VyZVVuaXQuaWRgJyArXG4gICAgICAgICcsIGBtZWFzdXJlVW5pdGAuYG5hbWVgIGBtZWFzdXJlVW5pdC5uYW1lYCwgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gaWRgIGBtZWFzdXJlVW5pdC5jYXRlZ29yeS5pZGAnICtcbiAgICAgICAgJywgYG1lYXN1cmVVbml0LmNhdGVnb3J5YC5gbmFtZWAgYG1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbWAgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdGAgYG1lYXN1cmVVbml0YCBPTiBgbWVhc3VyZVVuaXRgLmBpZGAgPSBgSXRlbWAuYG1lYXN1cmVVbml0SWRgJyArXG4gICAgICAgICcgTEVGVCBKT0lOIGBNZWFzdXJlVW5pdENhdGVnb3J5YCBgbWVhc3VyZVVuaXQuY2F0ZWdvcnlgIE9OIGBtZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBtZWFzdXJlVW5pdGAuYGNhdGVnb3J5SWRgJyArXG4gICAgICAgICcgTElNSVQgMTAwJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtQWRqdXN0bWVudCwge1xuICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgIGlkOiB0cnVlLFxuICAgICAgICAgIGJ1eVByaWNlOiB0cnVlLFxuICAgICAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgICAgICBpdGVtOiB7XG4gICAgICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbmFtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVhc3VyZVVuaXQ6IHtcbiAgICAgICAgICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSwgbmFtZTogdHJ1ZSwgY2F0ZWdvcnk6IFsnaWQnLCAnbmFtZSddIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXG4gICAgICAnU0VMRUNUIGBJdGVtQWRqdXN0bWVudGAuYGlkYCwgYEl0ZW1BZGp1c3RtZW50YC5gYnV5UHJpY2VgLCBgSXRlbUFkanVzdG1lbnRgLmBudW1iZXJgJyArXG4gICAgICAgICcsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBuYW1lYCBgaXRlbS5uYW1lYCcgK1xuICAgICAgICAnLCBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCBgaXRlbS5tZWFzdXJlVW5pdC5pZGAsIGBpdGVtLm1lYXN1cmVVbml0YC5gbmFtZWAgYGl0ZW0ubWVhc3VyZVVuaXQubmFtZWAnICtcbiAgICAgICAgJywgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnlgLmBpZGAgYGl0ZW0ubWVhc3VyZVVuaXQuY2F0ZWdvcnkuaWRgLCBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYG5hbWVgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5Lm5hbWVgJyArXG4gICAgICAgICcgRlJPTSBgSXRlbUFkanVzdG1lbnRgJyArXG4gICAgICAgICcgSU5ORVIgSk9JTiBgSXRlbWAgYGl0ZW1gIE9OIGBpdGVtYC5gaWRgID0gYEl0ZW1BZGp1c3RtZW50YC5gaXRlbUlkYCcgK1xuICAgICAgICAnIExFRlQgSk9JTiBgTWVhc3VyZVVuaXRgIGBpdGVtLm1lYXN1cmVVbml0YCBPTiBgaXRlbS5tZWFzdXJlVW5pdGAuYGlkYCA9IGBpdGVtYC5gbWVhc3VyZVVuaXRJZGAnICtcbiAgICAgICAgJyBMRUZUIEpPSU4gYE1lYXN1cmVVbml0Q2F0ZWdvcnlgIGBpdGVtLm1lYXN1cmVVbml0LmNhdGVnb3J5YCBPTiBgaXRlbS5tZWFzdXJlVW5pdC5jYXRlZ29yeWAuYGlkYCA9IGBpdGVtLm1lYXN1cmVVbml0YC5gY2F0ZWdvcnlJZGAnICtcbiAgICAgICAgJyBMSU1JVCAxMDAnXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkZ3JvdXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgbmFtZWAsIGBlbWFpbGAsIGBwYXNzd29yZGAgRlJPTSBgVXNlcmAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnY29tcGFueUlkJywgcmF3KCdDT1VOVCgqKScsICdjb3VudCcpXSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkaGF2aW5nOiB7XG4gICAgICAgICAgY291bnQ6IHtcbiAgICAgICAgICAgICRndGU6IDEwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgUXVlcnlGaWx0ZXI8VXNlcj4sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBDT1VOVCgqKSBgY291bnRgIEZST00gYFVzZXJgIEdST1VQIEJZIGBjb21wYW55SWRgIEhBVklORyBgY291bnRgID49IDEwJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJywgJ25hbWUnXSxcbiAgICAgICAgJGZpbHRlcjogeyBjb21wYW55SWQ6IDEgfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgICAkc2tpcDogNTAsXG4gICAgICAgICRsaW1pdDogMTAwLFxuICAgICAgICAkc29ydDogeyBuYW1lOiAnZGVzYycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgIEZST00gYFVzZXJgIFdIRVJFIGBjb21wYW55SWRgID0gMSBHUk9VUCBCWSBgY29tcGFueUlkYCBPUkRFUiBCWSBgbmFtZWAgREVTQyBMSU1JVCAxMDAgT0ZGU0VUIDUwJyk7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpbWl0KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogOSxcbiAgICAgICAgJGxpbWl0OiAxLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSA5IExJTUlUIDEnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDEsIGNyZWF0b3JJZDogMSB9LFxuICAgICAgICAkZmlsdGVyOiA5LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBuYW1lYCwgYGNyZWF0b3JJZGAgRlJPTSBgVXNlcmAgV0hFUkUgYGlkYCA9IDkgTElNSVQgMScpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnLCBjcmVhdG9ySWQ6IDEyMyB9LFxuICAgICAgICAkbGltaXQ6IDEsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnIEFORCBgY3JlYXRvcklkYCA9IDEyMyBMSU1JVCAxXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCcsICduYW1lJywgJ2NyZWF0b3JJZCddLFxuICAgICAgICAkbGltaXQ6IDI1LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAsIGBjcmVhdG9ySWRgIEZST00gYFVzZXJgIExJTUlUIDI1Jyk7XG4gIH1cblxuICBzaG91bGRGaW5kJHNraXAoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogMSwgbmFtZTogMSwgY3JlYXRvcklkOiAxIH0sXG4gICAgICAgICRza2lwOiAzMCxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCwgYG5hbWVgLCBgY3JlYXRvcklkYCBGUk9NIGBVc2VyYCBPRkZTRVQgMzAnKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkcHJvamVjdCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IHBhc3N3b3JkOiBmYWxzZSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgY29tcGFueUlkYCwgYGNyZWF0b3JJZGAsIGBjcmVhdGVkQXRgLCBgdXBkYXRlZEF0YCwgYG5hbWVgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAsIGBjb21wYW55SWRgLCBgY3JlYXRvcklkYCwgYGNyZWF0ZWRBdGAsIGB1cGRhdGVkQXRgLCBgZW1haWxgIEZST00gYFVzZXJgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAxLCBwYXNzd29yZDogMCB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgLCBgbmFtZWAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEsIG5hbWU6IDAsIHBhc3N3b3JkOiAwIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFtyYXcoJyonKSwgcmF3KCdMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCcsICdob3RuZXNzJyldLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCAqLCBMT0cxMChudW1iZXJPZlZvdGVzICsgMSkgKiAyODcwMTQuNTg3Mzk4MjY4MSArIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG4gIH1cblxuICBzaG91bGREZWxldGUoKSB7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBVc2VyYCBXSEVSRSBgaWRgID0gMTIzJyk7XG4gICAgZXhwZWN0KCgpID0+IHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b1Rocm93KFwiJ1VzZXInIGhhcyBub3QgZW5hYmxlZCAnc29mdERlbGV0ZSdcIik7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoVXNlciwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiBmYWxzZSB9KSkudG9CZSgnREVMRVRFIEZST00gYFVzZXJgIFdIRVJFIGBpZGAgPSAxMjMnKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSkpLnRvTWF0Y2goXG4gICAgICAvXlVQREFURSBgTWVhc3VyZVVuaXRgIFNFVCBgZGVsZXRlZEF0YCA9IFxcZCsgV0hFUkUgYGlkYCA9IDEyMyBBTkQgYGRlbGV0ZWRBdGAgSVMgTlVMTCQvXG4gICAgKTtcbiAgICBleHBlY3QodGhpcy5kaWFsZWN0LmRlbGV0ZShNZWFzdXJlVW5pdCwgeyAkZmlsdGVyOiAxMjMgfSwgeyBzb2Z0RGVsZXRlOiB0cnVlIH0pKS50b01hdGNoKFxuICAgICAgL15VUERBVEUgYE1lYXN1cmVVbml0YCBTRVQgYGRlbGV0ZWRBdGAgPSBcXGQrIFdIRVJFIGBpZGAgPSAxMjMgQU5EIGBkZWxldGVkQXRgIElTIE5VTEwkL1xuICAgICk7XG4gICAgZXhwZWN0KHRoaXMuZGlhbGVjdC5kZWxldGUoTWVhc3VyZVVuaXQsIHsgJGZpbHRlcjogMTIzIH0sIHsgc29mdERlbGV0ZTogZmFsc2UgfSkpLnRvQmUoJ0RFTEVURSBGUk9NIGBNZWFzdXJlVW5pdGAgV0hFUkUgYGlkYCA9IDEyMycpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRwcm9qZWN0UmF3KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICBjb21wYW55SWQ6IHRydWUsXG4gICAgICAgICAgdG90YWw6IHJhdygoeyBlc2NhcGVkUHJlZml4LCBkaWFsZWN0IH0pID0+IGBTVU0oJHtlc2NhcGVkUHJlZml4fSR7ZGlhbGVjdC5lc2NhcGVJZCgnc2FsZVByaWNlJyl9KWApLFxuICAgICAgICB9LFxuICAgICAgICAkZ3JvdXA6IFsnY29tcGFueUlkJ10sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBjb21wYW55SWRgLCBTVU0oYHNhbGVQcmljZWApIGB0b3RhbGAgRlJPTSBgSXRlbWAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW1BZGp1c3RtZW50LCB7XG4gICAgICAgICRwcm9qZWN0OiB7XG4gICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgJHByb2plY3Q6IHtcbiAgICAgICAgICAgICAgY29tcGFueUlkOiB0cnVlLFxuICAgICAgICAgICAgICB0b3RhbDogcmF3KCh7IGVzY2FwZWRQcmVmaXgsIGRpYWxlY3QgfSkgPT4gYFNVTSgke2VzY2FwZWRQcmVmaXh9JHtkaWFsZWN0LmVzY2FwZUlkKCdzYWxlUHJpY2UnKX0pYCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFxuICAgICAgJ1NFTEVDVCBgSXRlbUFkanVzdG1lbnRgLmBpZGAsIGBpdGVtYC5gaWRgIGBpdGVtLmlkYCwgYGl0ZW1gLmBjb21wYW55SWRgIGBpdGVtLmNvbXBhbnlJZGAsIFNVTShgaXRlbWAuYHNhbGVQcmljZWApIGBpdGVtLnRvdGFsYCcgK1xuICAgICAgICAnIEZST00gYEl0ZW1BZGp1c3RtZW50YCBJTk5FUiBKT0lOIGBJdGVtYCBgaXRlbWAgT04gYGl0ZW1gLmBpZGAgPSBgSXRlbUFkanVzdG1lbnRgLmBpdGVtSWRgIEdST1VQIEJZIGBjb21wYW55SWRgJ1xuICAgICk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2NvbXBhbnlJZCcsIHJhdygnQ09VTlQoKiknLCAnY291bnQnKV0sXG4gICAgICAgICRncm91cDogWydjb21wYW55SWQnXSxcbiAgICAgICAgJGhhdmluZzoge1xuICAgICAgICAgIGNvdW50OiB7XG4gICAgICAgICAgICAkZ3RlOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIFF1ZXJ5RmlsdGVyPFVzZXI+LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgY29tcGFueUlkYCwgQ09VTlQoKikgYGNvdW50YCBGUk9NIGBVc2VyYCBHUk9VUCBCWSBgY29tcGFueUlkYCBIQVZJTkcgYGNvdW50YCA+PSAxMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogW3JhdygoKSA9PiAnY3JlYXRlZEF0JywgJ2hvdG5lc3MnKV0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogJ3NvbWV0aGluZycgfSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGNyZWF0ZWRBdCBgaG90bmVzc2AgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgID0gJ3NvbWV0aGluZydcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbcmF3KCcqJyksIHJhdygnTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQnLCAnaG90bmVzcycpXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiAnc29tZXRoaW5nJyB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgKiwgTE9HMTAobnVtYmVyT2ZWb3RlcyArIDEpICogMjg3MDE0LjU4NzM5ODI2ODEgKyBjcmVhdGVkQXQgYGhvdG5lc3NgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCA9ICdzb21ldGhpbmcnXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRmaWx0ZXJSYXcoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFt7IGNvbXBhbnlJZDogMSB9LCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKCdTRUxFQ1QgYGlkYCBGUk9NIGBJdGVtYCBXSEVSRSBgY29tcGFueUlkYCA9IDEgQU5EIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbeyBjb21wYW55SWQ6IDEgfSwgNSwgcmF3KCdTVU0oc2FsZVByaWNlKSA+IDUwMCcpXSB9LFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBjb21wYW55SWRgID0gMSBPUiBgaWRgID0gNSBPUiBTVU0oc2FsZVByaWNlKSA+IDUwMCcpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoSXRlbSwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7ICRhbmQ6IFtyYXcoJ1NVTShgc2FsZVByaWNlYCkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NvbXBhbnlJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShgc2FsZVByaWNlYCkgPiA1MDAgR1JPVVAgQlkgYGNvbXBhbnlJZGAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFsxLCByYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyldIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCA9IDEgT1IgU1VNKHNhbGVQcmljZSkgPiA1MDAnKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKEl0ZW0sIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyAkb3I6IFtyYXcoJ1NVTShzYWxlUHJpY2UpID4gNTAwJyksIDEsIHsgY29tcGFueUlkOiAxIH1dIH0sXG4gICAgICB9KVxuICAgICkudG9CZSgnU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgU1VNKHNhbGVQcmljZSkgPiA1MDAgT1IgYGlkYCA9IDEgT1IgYGNvbXBhbnlJZGAgPSAxJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJGFuZDogW3JhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKV0gfSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHJhdygnU1VNKHNhbGVQcmljZSkgPiA1MDAnKSxcbiAgICAgICAgJGdyb3VwOiBbJ2NyZWF0b3JJZCddLFxuICAgICAgfSlcbiAgICApLnRvQmUoJ1NFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIFNVTShzYWxlUHJpY2UpID4gNTAwIEdST1VQIEJZIGBjcmVhdG9ySWRgJyk7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgJG9yOiBbWzEsIDJdLCB7IGNvZGU6ICdhYmMnIH1dIH0sXG4gICAgICAgICRncm91cDogWydjcmVhdG9ySWQnXSxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgSXRlbWAgV0hFUkUgYGlkYCBJTiAoMSwgMikgT1IgYGNvZGVgID0gJ2FiYycgR1JPVVAgQlkgYGNyZWF0b3JJZGBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHN0YXJ0c1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBzb3J0OiAnYXNjJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjcmVhdGVkQXQnLCBzb3J0OiAnZGVzYycgfSxcbiAgICAgICAgXSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBMSUtFICdTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgY3JlYXRlZEF0YCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJHN0YXJ0c1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGlzdGFydHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJ3NvbWUlJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IHRydWUgfSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpc3RhcnRzV2l0aDogJ1NvbWUnLCAkbmU6ICdTb21ldGhpbmcnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSAoTE9XRVIoYG5hbWVgKSBMSUtFICdzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGVuZHNXaXRoKCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRlbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBgbmFtZWAgTElLRSAnJVNvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGVuZHNXaXRoOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChgbmFtZWAgTElLRSAnJVNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpZW5kc1dpdGgoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGllbmRzV2l0aDogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJyBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRpZW5kc1dpdGg6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnJXNvbWUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpbmNsdWRlcygpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJyVTb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaW5jbHVkZXM6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICclU29tZSUnIEFORCBgbmFtZWAgPD4gJ1NvbWV0aGluZycpIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuICB9XG5cbiAgc2hvdWxkRmluZCRpaW5jbHVkZXMoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlpbmNsdWRlczogJ1NvbWUnIH0gfSxcbiAgICAgICAgJHNvcnQ6IHsgbmFtZTogMSwgaWQ6IC0xIH0sXG4gICAgICAgICRza2lwOiAwLFxuICAgICAgICAkbGltaXQ6IDUwLFxuICAgICAgfSlcbiAgICApLnRvQmUoXCJTRUxFQ1QgYGlkYCBGUk9NIGBVc2VyYCBXSEVSRSBMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiBbJ2lkJ10sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWluY2x1ZGVzOiAnU29tZScsICRuZTogJ1NvbWV0aGluZycgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIChMT1dFUihgbmFtZWApIExJS0UgJyVzb21lJScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJGxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgYG5hbWVgIExJS0UgJ1NvbWUnIE9SREVSIEJZIGBuYW1lYCwgYGlkYCBERVNDIExJTUlUIDUwIE9GRlNFVCAwXCIpO1xuXG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogeyBpZDogdHJ1ZSB9LFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKGBuYW1lYCBMSUtFICdTb21lJyBBTkQgYG5hbWVgIDw+ICdTb21ldGhpbmcnKSBPUkRFUiBCWSBgbmFtZWAsIGBpZGAgREVTQyBMSU1JVCA1MCBPRkZTRVQgMFwiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkaWxpa2UoKSB7XG4gICAgZXhwZWN0KFxuICAgICAgdGhpcy5kaWFsZWN0LmZpbmQoVXNlciwge1xuICAgICAgICAkcHJvamVjdDogWydpZCddLFxuICAgICAgICAkZmlsdGVyOiB7IG5hbWU6IHsgJGlsaWtlOiAnU29tZScgfSB9LFxuICAgICAgICAkc29ydDogeyBuYW1lOiAxLCBpZDogLTEgfSxcbiAgICAgICAgJHNraXA6IDAsXG4gICAgICAgICRsaW1pdDogNTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG5cbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChVc2VyLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgbmFtZTogeyAkaWxpa2U6ICdTb21lJywgJG5lOiAnU29tZXRoaW5nJyB9IH0sXG4gICAgICAgICRzb3J0OiB7IG5hbWU6IDEsIGlkOiAtMSB9LFxuICAgICAgICAkc2tpcDogMCxcbiAgICAgICAgJGxpbWl0OiA1MCxcbiAgICAgIH0pXG4gICAgKS50b0JlKFwiU0VMRUNUIGBpZGAgRlJPTSBgVXNlcmAgV0hFUkUgKExPV0VSKGBuYW1lYCkgTElLRSAnc29tZScgQU5EIGBuYW1lYCA8PiAnU29tZXRoaW5nJykgT1JERVIgQlkgYG5hbWVgLCBgaWRgIERFU0MgTElNSVQgNTAgT0ZGU0VUIDBcIik7XG4gIH1cblxuICBzaG91bGRGaW5kJHJlZ2V4KCkge1xuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IFsnaWQnXSxcbiAgICAgICAgJGZpbHRlcjogeyBuYW1lOiB7ICRyZWdleDogJ15zb21lJyB9IH0sXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBuYW1lYCBSRUdFWFAgJ15zb21lJ1wiKTtcbiAgfVxuXG4gIHNob3VsZEZpbmQkdGV4dCgpIHtcbiAgICBleHBlY3QoXG4gICAgICB0aGlzLmRpYWxlY3QuZmluZChJdGVtLCB7XG4gICAgICAgICRwcm9qZWN0OiB7IGlkOiB0cnVlIH0sXG4gICAgICAgICRmaWx0ZXI6IHsgJHRleHQ6IHsgJGZpZWxkczogWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10sICR2YWx1ZTogJ3NvbWUgdGV4dCcgfSwgY29tcGFueUlkOiAxIH0sXG4gICAgICAgICRsaW1pdDogMzAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYEl0ZW1gIFdIRVJFIGBJdGVtYCBNQVRDSCB7YG5hbWVgIGBkZXNjcmlwdGlvbmB9IDogJ3NvbWUgdGV4dCcgQU5EIGBjb21wYW55SWRgID0gMSBMSU1JVCAzMFwiKTtcblxuICAgIGV4cGVjdChcbiAgICAgIHRoaXMuZGlhbGVjdC5maW5kKFVzZXIsIHtcbiAgICAgICAgJHByb2plY3Q6IHsgaWQ6IDEgfSxcbiAgICAgICAgJGZpbHRlcjoge1xuICAgICAgICAgICR0ZXh0OiB7ICRmaWVsZHM6IFsnbmFtZSddLCAkdmFsdWU6ICdzb21ldGhpbmcnIH0sXG4gICAgICAgICAgbmFtZTogeyAkbmU6ICdvdGhlciB1bndhbnRlZCcgfSxcbiAgICAgICAgICBjb21wYW55SWQ6IDEsXG4gICAgICAgIH0sXG4gICAgICAgICRsaW1pdDogMTAsXG4gICAgICB9KVxuICAgICkudG9CZShcIlNFTEVDVCBgaWRgIEZST00gYFVzZXJgIFdIRVJFIGBVc2VyYCBNQVRDSCB7YG5hbWVgfSA6ICdzb21ldGhpbmcnIEFORCBgbmFtZWAgPD4gJ290aGVyIHVud2FudGVkJyBBTkQgYGNvbXBhbnlJZGAgPSAxIExJTUlUIDEwXCIpO1xuICB9XG59XG4iXX0=