@effect-app/infra 0.64.0 → 0.66.0

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 (42) hide show
  1. package/.cache/effect/095519d034161945a8d2616a506d3e7f35a9b3d868814f44c747429c60fc4e7f.content +241 -0
  2. package/.cache/effect/095519d034161945a8d2616a506d3e7f35a9b3d868814f44c747429c60fc4e7f.hash +1 -0
  3. package/.cache/effect/1bfd92946b11da4292f2ed99dc0e322462b60559148f9524abc20e26f70779e1.content +86 -0
  4. package/.cache/effect/1bfd92946b11da4292f2ed99dc0e322462b60559148f9524abc20e26f70779e1.hash +1 -0
  5. package/.cache/effect/49c1bd9ec26e6df78b994d8df0bfe21b119803fa4aa46349bf4679fd0f1e7cda.content +47 -0
  6. package/.cache/effect/49c1bd9ec26e6df78b994d8df0bfe21b119803fa4aa46349bf4679fd0f1e7cda.hash +1 -0
  7. package/.cache/effect/58d4ccde8bd2db7829706db5bebd01b99900ee83f0f6a8413b53d17cbd69f510.content +70 -0
  8. package/.cache/effect/58d4ccde8bd2db7829706db5bebd01b99900ee83f0f6a8413b53d17cbd69f510.hash +1 -0
  9. package/.cache/effect/72a5a16a6b62b63cd71719c833091128207d7e6c823cb32293549b3dd58c451b.content +170 -0
  10. package/.cache/effect/72a5a16a6b62b63cd71719c833091128207d7e6c823cb32293549b3dd58c451b.hash +1 -0
  11. package/.cache/effect/7a9c33db6aedaf00093a132c1d4e48e9d043cef05e932b8a37da24d44e224248.content +57 -0
  12. package/.cache/effect/7a9c33db6aedaf00093a132c1d4e48e9d043cef05e932b8a37da24d44e224248.hash +1 -0
  13. package/.cache/effect/c67d971634d2dc8118b40452b61c9a51620c35809be4a89982476aa80701d852.content +11 -0
  14. package/.cache/effect/c67d971634d2dc8118b40452b61c9a51620c35809be4a89982476aa80701d852.hash +1 -0
  15. package/.cache/effect/f38adf43700dab905456a534a0690eaf882cff2cd576c731f23d6d14a3c3d659.content +360 -0
  16. package/.cache/effect/f38adf43700dab905456a534a0690eaf882cff2cd576c731f23d6d14a3c3d659.hash +1 -0
  17. package/CHANGELOG.md +20 -0
  18. package/_cjs/filter.cjs +25 -52
  19. package/_cjs/filter.cjs.map +1 -1
  20. package/_cjs/services/Store/Cosmos.cjs +36 -2
  21. package/_cjs/services/Store/Cosmos.cjs.map +1 -1
  22. package/_cjs/services/Store/codeFilter.test.cjs +6 -0
  23. package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
  24. package/_cjs/services/Store/service.cjs.map +1 -1
  25. package/_cjs/services/Store/utils.cjs +59 -5
  26. package/_cjs/services/Store/utils.cjs.map +1 -1
  27. package/_src/filter.ts +20 -46
  28. package/_src/services/Store/Cosmos.ts +43 -21
  29. package/_src/services/Store/codeFilter.test.ts +54 -0
  30. package/_src/services/Store/service.ts +1 -0
  31. package/_src/services/Store/utils.ts +64 -42
  32. package/dist/filter.d.ts +9 -13
  33. package/dist/filter.d.ts.map +1 -1
  34. package/dist/filter.js +22 -38
  35. package/dist/services/Store/Cosmos.d.ts.map +1 -1
  36. package/dist/services/Store/Cosmos.js +41 -21
  37. package/dist/services/Store/service.d.ts +4 -0
  38. package/dist/services/Store/service.d.ts.map +1 -1
  39. package/dist/services/Store/service.js +1 -1
  40. package/dist/services/Store/utils.d.ts.map +1 -1
  41. package/dist/services/Store/utils.js +65 -39
  42. package/package.json +10 -10
@@ -0,0 +1,360 @@
1
+ import * as tsplus_module_1 from "@effect/io/Effect";
2
+ import * as tsplus_module_2 from "@effect/data/Option";
3
+ import * as tsplus_module_3 from "@effect-app/core/Array";
4
+ import * as tsplus_module_4 from "@effect/data/Chunk";
5
+ import * as tsplus_module_5 from "@effect-app/core/_ext/Iterable";
6
+ import * as tsplus_module_6 from "@effect-app/infra/instrument";
7
+ import * as tsplus_module_7 from "@effect-app/prelude/utils";
8
+ import * as tsplus_module_8 from "@effect-app/core/Effect";
9
+ import * as tsplus_module_9 from "@effect-app/prelude/_ext/misc";
10
+ import * as tsplus_module_10 from "@effect/data/typeclass/Equivalence";
11
+ import * as tsplus_module_11 from "@effect-app/core/_ext/ord.ext";
12
+ /* eslint-disable @typescript-eslint/no-explicit-any */
13
+ import { CosmosClient } from "@effect-app/infra-adapters/cosmos-client";
14
+ import { omit } from "@effect-app/prelude/utils";
15
+ import { OptimisticConcurrencyException } from "../../errors.js";
16
+ import { StoreMaker } from "./service.js";
17
+ // TODO: Retry operation when running into RU limit.
18
+ export function makeCosmosStore({ prefix }) {
19
+ return tsplus_module_1.gen(function* ($) {
20
+ const { db } = yield* $(CosmosClient);
21
+ return {
22
+ make: (name, seed, config) => tsplus_module_1.gen(function* ($) {
23
+ const containerId = `${prefix}${name}`;
24
+ yield* $(tsplus_module_1.promise(() => db.containers.createIfNotExists({
25
+ id: containerId,
26
+ uniqueKeyPolicy: config?.uniqueKeys
27
+ ? { uniqueKeys: config.uniqueKeys }
28
+ : undefined
29
+ })));
30
+ const container = db.container(containerId);
31
+ const bulk = container.items.bulk.bind(container.items);
32
+ const execBatch = container.items.batch.bind(container.items);
33
+ const importedMarkerId = containerId;
34
+ const bulkSet = (items) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.gen(function* ($) {
35
+ // TODO: disable batching if need atomicity
36
+ // we delay and batch to keep low amount of RUs
37
+ const b = [...items].map((x) => [
38
+ x,
39
+ tsplus_module_2.match(tsplus_module_2.fromNullable(x._etag), () => ({
40
+ operationType: "Create",
41
+ resourceBody: {
42
+ ...omit(x, "_etag"),
43
+ _partitionKey: config?.partitionValue(x)
44
+ },
45
+ partitionKey: config?.partitionValue(x)
46
+ }), (eTag) => ({
47
+ operationType: "Replace",
48
+ id: x.id,
49
+ resourceBody: {
50
+ ...omit(x, "_etag"),
51
+ _partitionKey: config?.partitionValue(x)
52
+ },
53
+ ifMatch: eTag,
54
+ partitionKey: config?.partitionValue(x)
55
+ }))
56
+ ]);
57
+ const batches = tsplus_module_4.toReadonlyArray(tsplus_module_3.chunk_(b, config?.maxBulkSize ?? 10));
58
+ const batchResult = yield* $(tsplus_module_5.ext_forEach(batches
59
+ .map((x, i) => [i, x]), ([i, batch]) => tsplus_module_1.flatMap(tsplus_module_1.delay(tsplus_module_1.promise(() => bulk(batch.map(([, op]) => op))), tsplus_module_3.millis_(i === 0 ? 0 : 1100)), (responses) => tsplus_module_1.gen(function* ($) {
60
+ const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404);
61
+ if (r) {
62
+ return yield* $(tsplus_module_1.fail(new OptimisticConcurrencyException(name, JSON.stringify(r.resourceBody?.["id"]))));
63
+ }
64
+ const r2 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
65
+ if (r2) {
66
+ return yield* $(tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + r2.statusCode)));
67
+ }
68
+ return batch.map(([e], i) => ({
69
+ ...e,
70
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
71
+ _etag: responses[i].eTag
72
+ }));
73
+ }))));
74
+ return batchResult.flat();
75
+ }), "cosmos.bulkSet"), "cosmos.db", containerId);
76
+ const batchSet = (items) => {
77
+ return tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.suspend(() => {
78
+ const batch = [...items].map((x) => [
79
+ x,
80
+ tsplus_module_2.match(tsplus_module_2.fromNullable(x._etag), () => ({
81
+ operationType: "Create",
82
+ resourceBody: {
83
+ ...omit(x, "_etag"),
84
+ _partitionKey: config?.partitionValue(x)
85
+ }
86
+ }), (eTag) => ({
87
+ operationType: "Replace",
88
+ id: x.id,
89
+ resourceBody: {
90
+ ...omit(x, "_etag"),
91
+ _partitionKey: config?.partitionValue(x)
92
+ },
93
+ ifMatch: eTag
94
+ }))
95
+ ]);
96
+ const ex = batch.map(([, c]) => c);
97
+ return tsplus_module_1.flatMap(tsplus_module_1.promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey)), (x) => tsplus_module_1.gen(function* ($) {
98
+ const result = x.result ?? [];
99
+ const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
100
+ if (firstFailed) {
101
+ const code = firstFailed.statusCode ?? 0;
102
+ if (code === 412 || code === 404) {
103
+ return yield* $(tsplus_module_1.fail(new OptimisticConcurrencyException(name, "batch")));
104
+ }
105
+ return yield* $(tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + code)));
106
+ }
107
+ return batch.map(([e], i) => ({
108
+ ...e,
109
+ _etag: result[i]?.eTag
110
+ }));
111
+ }));
112
+ }), "cosmos.batchSet"), "cosmos.db", containerId);
113
+ };
114
+ const s = {
115
+ all: tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => ({
116
+ query: `SELECT * FROM ${name} f WHERE f.id != @id`,
117
+ parameters: [{ name: "@id", value: importedMarkerId }]
118
+ })), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
119
+ .items
120
+ .query(q)
121
+ .fetchAll()
122
+ .then(({ resources }) => resources))), "cosmos.all"), "cosmos.db", containerId),
123
+ filterJoinSelect: (filter, cursor) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.map(tsplus_module_5.ext_forEach(filter
124
+ .keys, (k) => tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildFilterJoinSelectCosmosQuery(filter, k, name, cursor?.skip, cursor?.limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
125
+ .items
126
+ .query(q)
127
+ .fetchAll()
128
+ .then(({ resources }) => resources)))), (a) => {
129
+ const v = a
130
+ .flatMap((_) => _)
131
+ .map((x) => tsplus_module_7.spread(x, ({ r, ...rest }) => ({ ...rest, ...r })));
132
+ return v;
133
+ }), "cosmos.filterJoinSelect"), "cosmos.db", containerId),
134
+ /**
135
+ * May return duplicate results for "join_find", when matching more than once.
136
+ */
137
+ filter: (filter, cursor) => {
138
+ const skip = cursor?.skip;
139
+ const limit = cursor?.limit;
140
+ return tsplus_module_1.logAnnotate(tsplus_module_6.instr((filter.type === "join_find"
141
+ // This is a problem if one of the multiple joined arrays can be empty!
142
+ // https://stackoverflow.com/questions/60320780/azure-cosmosdb-sql-join-not-returning-results-when-the-child-contains-empty-arra
143
+ // so we use multiple queries instead.
144
+ ? tsplus_module_1.map(tsplus_module_5.ext_forEach(filter
145
+ .keys, (k) => tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildFindJoinCosmosQuery(filter, k, name, skip, limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
146
+ .items
147
+ .query(q)
148
+ .fetchAll()
149
+ .then(({ resources }) => resources)))), (_) => _.flatMap((_) => _))
150
+ : tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildCosmosQuery(filter, name, importedMarkerId, skip, limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
151
+ .items
152
+ .query(q)
153
+ .fetchAll()
154
+ .then(({ resources }) => resources.map((_) => _.f))))), "cosmos.filter"), "cosmos.db", containerId);
155
+ },
156
+ find: (id) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.promise(() => container
157
+ .item(id, config?.partitionValue({ id }))
158
+ .read()
159
+ .then(({ resource }) => tsplus_module_2.fromNullable(resource))), "cosmos.find"), "cosmos.db", containerId),
160
+ set: (e) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.flatMap(tsplus_module_2.match(tsplus_module_2.fromNullable(e._etag), () => tsplus_module_1.promise(() => container.items.create({
161
+ ...e,
162
+ _partitionKey: config?.partitionValue(e)
163
+ })), (eTag) => tsplus_module_1.promise(() => container.item(e.id, config?.partitionValue(e)).replace({ ...e, _partitionKey: config?.partitionValue(e) }, {
164
+ accessCondition: {
165
+ type: "IfMatch",
166
+ condition: eTag
167
+ }
168
+ }))), (x) => {
169
+ if (x.statusCode === 412 || x.statusCode === 404) {
170
+ return tsplus_module_1.fail(new OptimisticConcurrencyException(name, e.id));
171
+ }
172
+ if (x.statusCode > 299 || x.statusCode < 200) {
173
+ return tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
174
+ }
175
+ return tsplus_module_1.sync(() => ({
176
+ ...e,
177
+ _etag: x.etag
178
+ }));
179
+ }), "cosmos.set"), "cosmos.db", containerId),
180
+ batchSet,
181
+ bulkSet,
182
+ remove: (e) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.promise(() => container.item(e.id, config?.partitionValue(e)).delete()), "cosmos.remove"), "cosmos.db", containerId)
183
+ };
184
+ // handle mock data
185
+ const marker = yield* $(tsplus_module_1.promise(() => container
186
+ .item(importedMarkerId, importedMarkerId)
187
+ .read()
188
+ .then(({ resource }) => tsplus_module_2.fromNullable(resource))));
189
+ if (!tsplus_module_2.isSome(marker)) {
190
+ console.log("Creating mock data for " + name);
191
+ if (seed) {
192
+ const m = yield* $(seed);
193
+ yield* $(tsplus_module_8.flatMapOption(tsplus_module_1.sync(() => tsplus_module_3.CollectionToNonEmptyReadonlyArray(m)), (a) => tsplus_module_1.delay(tsplus_module_1.orDie(s
194
+ .bulkSet(a)), tsplus_module_3.millis_(1100))));
195
+ }
196
+ // Mark as imported
197
+ yield* $(tsplus_module_1.promise(() => container.items.create({
198
+ _partitionKey: importedMarkerId,
199
+ id: importedMarkerId
200
+ })));
201
+ }
202
+ return s;
203
+ })
204
+ };
205
+ });
206
+ }
207
+ function logQuery(q) {
208
+ return tsplus_module_9.logAnnotates({
209
+ query: q.query,
210
+ parameters: JSON.stringify(q.parameters.reduce((acc, v) => {
211
+ acc[v.name] = v.value;
212
+ return acc;
213
+ }, {}), undefined, 2)
214
+ })(tsplus_module_1.logDebug("cosmos query"));
215
+ }
216
+ /**
217
+ * @deprecated: should build Select into Where query
218
+ */
219
+ export function buildFilterJoinSelectCosmosQuery(filter, k, name, skip, limit) {
220
+ const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
221
+ return {
222
+ query: `
223
+ SELECT r, f.id as _rootId
224
+ FROM ${name} f
225
+ JOIN r IN f.${k}
226
+ WHERE LOWER(r.${filter.valueKey}) = LOWER(@value)
227
+ ${lm}
228
+ `,
229
+ parameters: [{ name: "@value", value: filter.value }]
230
+ };
231
+ }
232
+ /**
233
+ * @deprecated: is now part of Where query as k.-1.valueKey
234
+ */
235
+ export function buildFindJoinCosmosQuery(filter, k, name, skip, limit) {
236
+ const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
237
+ return {
238
+ query: `
239
+ SELECT DISTINCT VALUE f
240
+ FROM ${name} f
241
+ JOIN r IN f.${k}
242
+ WHERE LOWER(r.${filter.valueKey}) = LOWER(@value)
243
+ ${lm}`,
244
+ parameters: [{ name: "@value", value: filter.value }]
245
+ };
246
+ }
247
+ /**
248
+ * @deprecated: should build into Where query
249
+ */
250
+ export function buildLegacyCosmosQuery(filter, name, importedMarkerId, skip, limit) {
251
+ const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
252
+ return {
253
+ query: `
254
+ SELECT f
255
+ FROM ${name} AS f
256
+ WHERE f.id != @id AND f.${String(filter.by)} LIKE @filter
257
+ ${lm}`,
258
+ parameters: [
259
+ { name: "@id", value: importedMarkerId },
260
+ {
261
+ name: "@filter",
262
+ value: filter.type === "endsWith"
263
+ ? `%${filter.value}`
264
+ : filter.type === "contains"
265
+ ? `%${filter.value}%`
266
+ : `${filter.value}%`
267
+ }
268
+ ]
269
+ };
270
+ }
271
+ export function buildWhereCosmosQuery(filter, name, importedMarkerId, skip, limit) {
272
+ const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
273
+ return {
274
+ query: `
275
+ SELECT f
276
+ FROM ${name} AS f
277
+ ${tsplus_module_11.uniqArray(tsplus_module_10.string)(filter
278
+ .where
279
+ .filter((_) => _.key.includes(".-1."))
280
+ .map((_) => _.key.split(".-1.")[0])
281
+ .map((_) => `JOIN ${_} IN f.${_}`))
282
+ .join("\n")}
283
+ WHERE f.id != @id AND ${filter
284
+ .where
285
+ .map((_) => _.key.includes(".-1.")
286
+ ? { ..._, f: _.key.split(".-1.")[0], key: _.key.split(".-1.")[1] }
287
+ : { ..._, f: "f" })
288
+ .map((x, i) => {
289
+ const k = `${x.f}.${x.key}`;
290
+ const v = `@v${i}`;
291
+ switch (x.t) {
292
+ case "in":
293
+ return `ARRAY_CONTAINS(${v}, ${k})`;
294
+ case "not-in":
295
+ return `(NOT ARRAY_CONTAINS(${v}, ${k}))`;
296
+ case "ends-with":
297
+ return `ENDSWITH(${k}, ${v}, true)`;
298
+ case "contains":
299
+ return `CONTAINS(${k}, ${v}, true)`;
300
+ case "starts-with":
301
+ return `STARTSWITH(${k}, ${v}, true)`;
302
+ }
303
+ const lk = lowerIfNeeded(k, x.value);
304
+ const lv = lowerIfNeeded(v, x.value);
305
+ switch (x.t) {
306
+ case "lt":
307
+ return `${lk} < ${lv}`;
308
+ case "lte":
309
+ return `${lk} <= ${lv}`;
310
+ case "gt":
311
+ return `${lk} > ${lv}`;
312
+ case "gte":
313
+ return `${lk} >= ${lv}`;
314
+ case "not-eq":
315
+ return x.value === null
316
+ ? `IS_NULL(${k}) = false`
317
+ : `${lk} <> ${lv}`;
318
+ case undefined:
319
+ case "eq":
320
+ return x.value === null
321
+ ? `IS_NULL(${k}) = true`
322
+ : `${lk} = ${lv}`;
323
+ }
324
+ })
325
+ .join(filter.mode === "or" ? " OR " : " AND ")}
326
+ ${lm}`,
327
+ parameters: [
328
+ { name: "@id", value: importedMarkerId },
329
+ ...filter
330
+ .where
331
+ .map((x, i) => ({
332
+ name: `@v${i}`,
333
+ value: x.value
334
+ }))
335
+ ]
336
+ };
337
+ }
338
+ // function isArray(t: SupportedValues | readonly SupportedValues[]): t is readonly SupportedValues[] {
339
+ // return Array.isArray(t)
340
+ // }
341
+ function lowerIfNeeded(key, value) {
342
+ return typeof value === "string" ? `LOWER(${key})` : `${key}`;
343
+ }
344
+ export function buildCosmosQuery(filter, name, importedMarkerId, skip, limit) {
345
+ return filter.type === "startsWith"
346
+ || filter.type === "endsWith"
347
+ || filter.type === "contains"
348
+ ? buildLegacyCosmosQuery(filter, name, importedMarkerId, skip, limit)
349
+ : buildWhereCosmosQuery(filter, name, importedMarkerId, skip, limit);
350
+ }
351
+ class CosmosDbOperationError {
352
+ message;
353
+ constructor(message) {
354
+ this.message = message;
355
+ }
356
+ }
357
+ export function CosmosStoreLive(config) {
358
+ return tsplus_module_1.toLayer(tsplus_module_1.flatMap(tsplus_module_1.config(config), makeCosmosStore), StoreMaker);
359
+ }
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vX3NyYy9zZXJ2aWNlcy9TdG9yZS9Db3Ntb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBDQUEwQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQWFoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpDLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFpQjtJQUN2RCxPQUFPLG9CQUFXLFFBQVEsQ0FBQyxFQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNyQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLENBQ0osSUFBWSxFQUNaLElBQXlDLEVBQ3pDLE1BQXdCLEVBQ3hCLEVBQUUsQ0FDRixvQkFBVyxRQUFRLENBQUMsRUFBQyxDQUFDO2dCQUNwQixNQUFNLFdBQVcsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQTtnQkFDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNOLHdCQUFlLEdBQUcsRUFBRSxDQUNsQixFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO29CQUM5QixFQUFFLEVBQUUsV0FBVztvQkFDZixlQUFlLEVBQUUsTUFBTSxFQUFFLFVBQVU7d0JBQ2pDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO3dCQUNuQyxDQUFDLENBQUMsU0FBUztpQkFDZCxDQUFDLENBQ0gsQ0FDRixDQUFBO2dCQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUs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QixDQUM5QixNQUEyQyxFQUMzQyxJQUFZLEVBQ1osZ0JBQXdCLEVBQ3hCLElBQWEsRUFDYixLQUFjO0lBRWQsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVk7V0FDNUIsTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVO1dBQzFCLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVTtRQUMvQixDQUFDLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN4RSxDQUFDO0FBRUQsTUFBTSxzQkFBc0I7SUFDTDtJQUFyQixZQUFxQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7Q0FDekM7QUFDRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQTZCO0lBQzNELE9BQU8sd0JBQUEsK0NBQUEsTUFBTSxHQUFnQixlQUFlLENBQUMsRUFBUyxVQUFVLENBQUMsQ0FBQTtBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBDb3Ntb3NDbGllbnQgfSBmcm9tIFwiQGVmZmVjdC1hcHAvaW5mcmEtYWRhcHRlcnMvY29zbW9zLWNsaWVudFwiXG5pbXBvcnQgeyBvbWl0IH0gZnJvbSBcIkBlZmZlY3QtYXBwL3ByZWx1ZGUvdXRpbHNcIlxuaW1wb3J0IHsgT3B0aW1pc3RpY0NvbmN1cnJlbmN5RXhjZXB0aW9uIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5qc1wiXG5pbXBvcnQgdHlwZSB7XG4gIEZpbHRlcixcbiAgRmlsdGVySm9pblNlbGVjdCxcbiAgSm9pbkZpbmRGaWx0ZXIsXG4gIExlZ2FjeUZpbHRlcixcbiAgUGVyc2lzdGVuY2VNb2RlbFR5cGUsXG4gIFN0b3JhZ2VDb25maWcsXG4gIFN0b3JlLFxuICBTdG9yZUNvbmZpZyxcbiAgU3RvcmVXaGVyZUZpbHRlcixcbiAgU3VwcG9ydGVkVmFsdWVzXG59IGZyb20gXCIuL3NlcnZpY2UuanNcIlxuaW1wb3J0IHsgU3RvcmVNYWtlciB9IGZyb20gXCIuL3NlcnZpY2UuanNcIlxuXG4vLyBUT0RPOiBSZXRyeSBvcGVyYXRpb24gd2hlbiBydW5uaW5nIGludG8gUlUgbGltaXQuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvc21vc1N0b3JlKHsgcHJlZml4IH06IFN0b3JhZ2VDb25maWcpIHtcbiAgcmV0dXJuIEVmZmVjdC5nZW4oZnVuY3Rpb24qKCQpIHtcbiAgICBjb25zdCB7IGRiIH0gPSB5aWVsZCogJChDb3Ntb3NDbGllbnQpXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ha2U6IDxJZCBleHRlbmRzIHN0cmluZywgUE0gZXh0ZW5kcyBQZXJzaXN0ZW5jZU1vZGVsVHlwZTxJZD4+KFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHNlZWQ/OiBFZmZlY3Q8bmV2ZXIsIG5ldmVyLCBJdGVyYWJsZTxQTT4+LFxuICAgICAgICBjb25maWc/OiBTdG9yZUNvbmZpZzxQTT5cbiAgICAgICkgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiooJCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gYCR7cHJlZml4fSR7bmFtZX1gXG4gICAgICAgICAgeWllbGQqICQoXG4gICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICBkYi5jb250YWluZXJzLmNyZWF0ZUlmTm90RXhpc3RzKHtcbiAgICAgICAgICAgICAgICBpZDogY29udGFpbmVySWQsXG4gICAgICAgICAgICAgICAgdW5pcXVlS2V5UG9saWN5OiBjb25maWc/LnVuaXF1ZUtleXNcbiAgICAgICAgICAgICAgICAgID8geyB1bmlxdWVLZXlzOiBjb25maWcudW5pcXVlS2V5cyB9XG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkYi5jb250YWluZXIoY29udGFpbmVySWQpXG4gICAgICAgICAgY29uc3QgYnVsayA9IGNvbnRhaW5lci5pdGVtcy5idWxrLmJpbmQoY29udGFpbmVyLml0ZW1zKVxuICAgICAgICAgIGNvbnN0IGV4ZWNCYXRjaCA9IGNvbnRhaW5lci5pdGVtcy5iYXRjaC5iaW5kKGNvbnRhaW5lci5pdGVtcylcbiAgICAgICAgICBjb25zdCBpbXBvcnRlZE1hcmtlcklkID0gY29udGFpbmVySWRcblxuICAgICAgICAgIGNvbnN0IGJ1bGtTZXQgPSAoaXRlbXM6IE5vbkVtcHR5UmVhZG9ubHlBcnJheTxQTT4pID0+XG4gICAgICAgICAgICBFZmZlY3RcbiAgICAgICAgICAgICAgLmdlbihmdW5jdGlvbiooJCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGRpc2FibGUgYmF0Y2hpbmcgaWYgbmVlZCBhdG9taWNpdHlcbiAgICAgICAgICAgICAgICAvLyB3ZSBkZWxheSBhbmQgYmF0Y2ggdG8ga2VlcCBsb3cgYW1vdW50IG9mIFJVc1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBbLi4uaXRlbXNdLm1hcChcbiAgICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICBPcHRpb24uZnJvbU51bGxhYmxlKHguX2V0YWcpLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogXCJDcmVhdGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCb2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub21pdCh4LCBcIl9ldGFnXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleTogY29uZmlnPy5wYXJ0aXRpb25WYWx1ZSh4KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAoZVRhZykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogXCJSZXBsYWNlXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB4LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbWl0KHgsIFwiX2V0YWdcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BhcnRpdGlvbktleTogY29uZmlnPy5wYXJ0aXRpb25WYWx1ZSh4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZNYXRjaDogZVRhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5OiBjb25maWc/LnBhcnRpdGlvblZhbHVlKHgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXSBhcyBjb25zdFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaGVzID0gYi5jaHVuayhjb25maWc/Lm1heEJ1bGtTaXplID8/IDEwKS50b1JlYWRvbmx5QXJyYXlcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0geWllbGQqICQoXG4gICAgICAgICAgICAgICAgICBiYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHgsIGkpID0+IFtpLCB4XSBhcyBjb25zdClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2hFZmZlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgKFtpLCBiYXRjaF0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb21pc2UoKCkgPT4gYnVsayhiYXRjaC5tYXAoKFssIG9wXSkgPT4gb3ApKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlbGF5KER1cmF0aW9uLm1ha2VNaWxsaXMoaSA9PT0gMCA/IDAgOiAxMTAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHJlc3BvbnNlcykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKigkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gcmVzcG9uc2VzLmZpbmQoKHgpID0+IHguc3RhdHVzQ29kZSA9PT0gNDEyIHx8IHguc3RhdHVzQ29kZSA9PT0gNDA0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5mYWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wdGltaXN0aWNDb25jdXJyZW5jeUV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoci5yZXNvdXJjZUJvZHk/LltcImlkXCJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcjIgPSByZXNwb25zZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHgpID0+IHguc3RhdHVzQ29kZSA+IDI5OSB8fCB4LnN0YXR1c0NvZGUgPCAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmRpZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3Ntb3NEYk9wZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5vdCBhYmxlIHRvIHVwZGF0ZSByZWNvcmQ6IFwiICsgcjIuc3RhdHVzQ29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoLm1hcCgoW2VdLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXRhZzogcmVzcG9uc2VzW2ldIS5lVGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoUmVzdWx0LmZsYXQoKSBhcyB1bmtub3duIGFzIE5vbkVtcHR5UmVhZG9ubHlBcnJheTxQTT5cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MuYnVsa1NldFwiKVxuICAgICAgICAgICAgICAubG9nQW5ub3RhdGUoXCJjb3Ntb3MuZGJcIiwgY29udGFpbmVySWQpXG5cbiAgICAgICAgICBjb25zdCBiYXRjaFNldCA9IChpdGVtczogTm9uRW1wdHlSZWFkb25seUFycmF5PFBNPikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEVmZmVjdFxuICAgICAgICAgICAgICAuc3VzcGVuZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSBbLi4uaXRlbXNdLm1hcChcbiAgICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICBPcHRpb24uZnJvbU51bGxhYmxlKHguX2V0YWcpLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogXCJDcmVhdGVcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCb2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub21pdCh4LCBcIl9ldGFnXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVUYWcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IFwiUmVwbGFjZVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCb2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub21pdCh4LCBcIl9ldGFnXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmTWF0Y2g6IGVUYWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBdIGFzIGNvbnN0XG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXggPSBiYXRjaC5tYXAoKFssIGNdKSA9PiBjKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdFxuICAgICAgICAgICAgICAgICAgLnByb21pc2UoKCkgPT4gZXhlY0JhdGNoKGV4LCBleFswXT8ucmVzb3VyY2VCb2R5Ll9wYXJ0aXRpb25LZXkpKVxuICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHgpID0+XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qKCQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB4LnJlc3VsdCA/PyBbXVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0RmFpbGVkID0gcmVzdWx0LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoeDogYW55KSA9PiB4LnN0YXR1c0NvZGUgPiAyOTkgfHwgeC5zdGF0dXNDb2RlIDwgMjAwXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGZpcnN0RmFpbGVkLnN0YXR1c0NvZGUgPz8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDQxMiB8fCBjb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5mYWlsKG5ldyBPcHRpbWlzdGljQ29uY3VycmVuY3lFeGNlcHRpb24obmFtZSwgXCJiYXRjaFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5kaWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvc21vc0RiT3BlcmF0aW9uRXJyb3IoXCJub3QgYWJsZSB0byB1cGRhdGUgcmVjb3JkOiBcIiArIGNvZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmF0Y2gubWFwKChbZV0sIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX2V0YWc6IHJlc3VsdFtpXT8uZVRhZ1xuICAgICAgICAgICAgICAgICAgICAgIH0pKSBhcyB1bmtub3duIGFzIE5vbkVtcHR5UmVhZG9ubHlBcnJheTxQTT5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MuYmF0Y2hTZXRcIilcbiAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHM6IFN0b3JlPFBNLCBJZD4gPSB7XG4gICAgICAgICAgICBhbGw6IEVmZmVjdCh7XG4gICAgICAgICAgICAgIHF1ZXJ5OiBgU0VMRUNUICogRlJPTSAke25hbWV9IGYgV0hFUkUgZi5pZCAhPSBAaWRgLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcIkBpZFwiLCB2YWx1ZTogaW1wb3J0ZWRNYXJrZXJJZCB9XVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnRhcCgocSkgPT4gbG9nUXVlcnkocSkpXG4gICAgICAgICAgICAgIC5mbGF0TWFwKChxKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICAgIC5xdWVyeTxQTT4ocSlcbiAgICAgICAgICAgICAgICAgICAgLmZldGNoQWxsKClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzb3VyY2VzIH0pID0+IHJlc291cmNlcylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MuYWxsXCIpXG4gICAgICAgICAgICAgIC5sb2dBbm5vdGF0ZShcImNvc21vcy5kYlwiLCBjb250YWluZXJJZCksXG4gICAgICAgICAgICBmaWx0ZXJKb2luU2VsZWN0OiA8VCBleHRlbmRzIG9iamVjdD4oXG4gICAgICAgICAgICAgIGZpbHRlcjogRmlsdGVySm9pblNlbGVjdCxcbiAgICAgICAgICAgICAgY3Vyc29yPzogeyBza2lwPzogbnVtYmVyOyBsaW1pdD86IG51bWJlciB9XG4gICAgICAgICAgICApID0+XG4gICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgICAgIC5rZXlzXG4gICAgICAgICAgICAgICAgLmZvckVhY2hFZmZlY3QoKGspID0+XG4gICAgICAgICAgICAgICAgICBFZmZlY3QoYnVpbGRGaWx0ZXJKb2luU2VsZWN0Q29zbW9zUXVlcnkoZmlsdGVyLCBrLCBuYW1lLCBjdXJzb3I/LnNraXAsIGN1cnNvcj8ubGltaXQpKVxuICAgICAgICAgICAgICAgICAgICAudGFwKChxKSA9PiBsb2dRdWVyeShxKSlcbiAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHEpID0+XG4gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5PFQ+KHEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5mZXRjaEFsbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCh7IHJlc291cmNlcyB9KSA9PiByZXNvdXJjZXMpXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAoKGEpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBhXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChfKSA9PiBfKVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNwcmVhZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAoeyByLCAuLi5yZXN0IH06IGFueSkgPT4gKHsgLi4ucmVzdCwgLi4uciB9IGFzIFQgJiB7IF9yb290SWQ6IHN0cmluZyB9KVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLmZpbHRlckpvaW5TZWxlY3RcIilcbiAgICAgICAgICAgICAgICAubG9nQW5ub3RhdGUoXCJjb3Ntb3MuZGJcIiwgY29udGFpbmVySWQpLFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBNYXkgcmV0dXJuIGR1cGxpY2F0ZSByZXN1bHRzIGZvciBcImpvaW5fZmluZFwiLCB3aGVuIG1hdGNoaW5nIG1vcmUgdGhhbiBvbmNlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBmaWx0ZXI6IChmaWx0ZXI6IEZpbHRlcjxQTT4sIGN1cnNvcj86IHsgc2tpcD86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBza2lwID0gY3Vyc29yPy5za2lwXG4gICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gY3Vyc29yPy5saW1pdFxuICAgICAgICAgICAgICByZXR1cm4gKGZpbHRlci50eXBlID09PSBcImpvaW5fZmluZFwiXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHByb2JsZW0gaWYgb25lIG9mIHRoZSBtdWx0aXBsZSBqb2luZWQgYXJyYXlzIGNhbiBiZSBlbXB0eSFcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MDMyMDc4MC9henVyZS1jb3Ntb3NkYi1zcWwtam9pbi1ub3QtcmV0dXJuaW5nLXJlc3VsdHMtd2hlbi10aGUtY2hpbGQtY29udGFpbnMtZW1wdHktYXJyYVxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIHVzZSBtdWx0aXBsZSBxdWVyaWVzIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgPyBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgIC5rZXlzXG4gICAgICAgICAgICAgICAgICAuZm9yRWFjaEVmZmVjdCgoaykgPT5cbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0KGJ1aWxkRmluZEpvaW5Db3Ntb3NRdWVyeShmaWx0ZXIsIGssIG5hbWUsIHNraXAsIGxpbWl0KSlcbiAgICAgICAgICAgICAgICAgICAgICAudGFwKChxKSA9PiBsb2dRdWVyeShxKSlcbiAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcCgocSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeTxQTT4ocSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmV0Y2hBbGwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCh7IHJlc291cmNlcyB9KSA9PiByZXNvdXJjZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLm1hcCgoXykgPT4gXy5mbGF0TWFwKChfKSA9PiBfKSlcbiAgICAgICAgICAgICAgICA6IEVmZmVjdChidWlsZENvc21vc1F1ZXJ5KGZpbHRlciwgbmFtZSwgaW1wb3J0ZWRNYXJrZXJJZCwgc2tpcCwgbGltaXQpKVxuICAgICAgICAgICAgICAgICAgLnRhcCgocSkgPT4gbG9nUXVlcnkocSkpXG4gICAgICAgICAgICAgICAgICAuZmxhdE1hcCgocSkgPT5cbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5PHsgZjogUE0gfT4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mZXRjaEFsbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyByZXNvdXJjZXMgfSkgPT4gcmVzb3VyY2VzLm1hcCgoXykgPT4gXy5mKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAuaW5zdHJ1bWVudChcImNvc21vcy5maWx0ZXJcIilcbiAgICAgICAgICAgICAgICAubG9nQW5ub3RhdGUoXCJjb3Ntb3MuZGJcIiwgY29udGFpbmVySWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmluZDogKGlkKSA9PlxuICAgICAgICAgICAgICBFZmZlY3RcbiAgICAgICAgICAgICAgICAucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIC5pdGVtKGlkLCBjb25maWc/LnBhcnRpdGlvblZhbHVlKHsgaWQgfSBhcyBQTSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWFkPFBNPigpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh7IHJlc291cmNlIH0pID0+IE9wdGlvbi5mcm9tTnVsbGFibGUocmVzb3VyY2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuaW5zdHJ1bWVudChcImNvc21vcy5maW5kXCIpXG4gICAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKSxcbiAgICAgICAgICAgIHNldDogKGUpID0+XG4gICAgICAgICAgICAgIE9wdGlvblxuICAgICAgICAgICAgICAgIC5mcm9tTnVsbGFibGUoZS5fZXRhZylcbiAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoZSlcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKGVUYWcpID0+XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLml0ZW0oZS5pZCwgY29uZmlnPy5wYXJ0aXRpb25WYWx1ZShlKSkucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgLi4uZSwgX3BhcnRpdGlvbktleTogY29uZmlnPy5wYXJ0aXRpb25WYWx1ZShlKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIklmTWF0Y2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGVUYWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHguc3RhdHVzQ29kZSA9PT0gNDEyIHx8IHguc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3QuZmFpbChuZXcgT3B0aW1pc3RpY0NvbmN1cnJlbmN5RXhjZXB0aW9uKG5hbWUsIGUuaWQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHguc3RhdHVzQ29kZSA+IDI5OSB8fCB4LnN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdC5kaWUoXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IENvc21vc0RiT3BlcmF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5vdCBhYmxlIHRvIHVwZGF0ZSByZWNvcmQ6IFwiICsgeC5zdGF0dXNDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICAgICAgX2V0YWc6IHguZXRhZ1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLnNldFwiKVxuICAgICAgICAgICAgICAgIC5sb2dBbm5vdGF0ZShcImNvc21vcy5kYlwiLCBjb250YWluZXJJZCksXG4gICAgICAgICAgICBiYXRjaFNldCxcbiAgICAgICAgICAgIGJ1bGtTZXQsXG4gICAgICAgICAgICByZW1vdmU6IChlOiBQTSkgPT5cbiAgICAgICAgICAgICAgRWZmZWN0XG4gICAgICAgICAgICAgICAgLnByb21pc2UoKCkgPT4gY29udGFpbmVyLml0ZW0oZS5pZCwgY29uZmlnPy5wYXJ0aXRpb25WYWx1ZShlKSkuZGVsZXRlKCkpXG4gICAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MucmVtb3ZlXCIpXG4gICAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGhhbmRsZSBtb2NrIGRhdGFcbiAgICAgICAgICBjb25zdCBtYXJrZXIgPSB5aWVsZCogJChcbiAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIC5pdGVtKGltcG9ydGVkTWFya2VySWQsIGltcG9ydGVkTWFya2VySWQpXG4gICAgICAgICAgICAgICAgLnJlYWQ8eyBpZDogc3RyaW5nIH0+KClcbiAgICAgICAgICAgICAgICAudGhlbigoeyByZXNvdXJjZSB9KSA9PiBPcHRpb24uZnJvbU51bGxhYmxlKHJlc291cmNlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG5cbiAgICAgICAgICBpZiAoIW1hcmtlci5pc1NvbWUoKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdGluZyBtb2NrIGRhdGEgZm9yIFwiICsgbmFtZSlcbiAgICAgICAgICAgIGlmIChzZWVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSB5aWVsZCogJChzZWVkKVxuICAgICAgICAgICAgICB5aWVsZCogJChcbiAgICAgICAgICAgICAgICBFZmZlY3QobS50b05vbkVtcHR5QXJyYXkpXG4gICAgICAgICAgICAgICAgICAuZmxhdE1hcE9wdCgoYSkgPT5cbiAgICAgICAgICAgICAgICAgICAgc1xuICAgICAgICAgICAgICAgICAgICAgIC5idWxrU2V0KGEpXG4gICAgICAgICAgICAgICAgICAgICAgLm9yRGllXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZGVsYXkgZXh0cmEgaGVyZSwgc28gdGhhdCBpbml0aWFsIGNyZWF0aW9uIGJldHdlZW4gQ29tcGFuaWVzL1BPcyBhbHNvIGhhdmUgYW4gaW50ZXJ2YWwgYmV0d2VlbiB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgIC5kZWxheShEdXJhdGlvbi5tYWtlTWlsbGlzKDExMDApKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYXJrIGFzIGltcG9ydGVkXG4gICAgICAgICAgICB5aWVsZCogJChcbiAgICAgICAgICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgICBjb250YWluZXIuaXRlbXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGltcG9ydGVkTWFya2VySWQsXG4gICAgICAgICAgICAgICAgICBpZDogaW1wb3J0ZWRNYXJrZXJJZFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNcbiAgICAgICAgfSlcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGxvZ1F1ZXJ5KHE6IHtcbiAgcXVlcnk6IHN0cmluZ1xuICBwYXJhbWV0ZXJzOiB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgdmFsdWU6IFN1cHBvcnRlZFZhbHVlcyB8IHJlYWRvbmx5IFN1cHBvcnRlZFZhbHVlc1tdXG4gIH1bXVxufSkge1xuICByZXR1cm4gRWZmZWN0XG4gICAgLmxvZ0RlYnVnKFwiY29zbW9zIHF1ZXJ5XCIpXG4gICAgLmFwcGx5KEVmZmVjdC5sb2dBbm5vdGF0ZXMoe1xuICAgICAgcXVlcnk6IHEucXVlcnksXG4gICAgICBwYXJhbWV0ZXJzOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgcS5wYXJhbWV0ZXJzLnJlZHVjZSgoYWNjLCB2KSA9PiB7XG4gICAgICAgICAgYWNjW3YubmFtZV0gPSB2LnZhbHVlXG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBTdXBwb3J0ZWRWYWx1ZXMgfCByZWFkb25seSBTdXBwb3J0ZWRWYWx1ZXNbXT4pLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIDJcbiAgICAgIClcbiAgICB9KSlcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZDogc2hvdWxkIGJ1aWxkIFNlbGVjdCBpbnRvIFdoZXJlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbHRlckpvaW5TZWxlY3RDb3Ntb3NRdWVyeShcbiAgZmlsdGVyOiBGaWx0ZXJKb2luU2VsZWN0LFxuICBrOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc2tpcD86IG51bWJlcixcbiAgbGltaXQ/OiBudW1iZXJcbikge1xuICBjb25zdCBsbSA9IHNraXAgIT09IHVuZGVmaW5lZCB8fCBsaW1pdCAhPT0gdW5kZWZpbmVkID8gYE9GRlNFVCAke3NraXAgPz8gMH0gTElNSVQgJHtsaW1pdCA/PyA5OTk5OTl9YCA6IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogYFxuU0VMRUNUIHIsIGYuaWQgYXMgX3Jvb3RJZFxuRlJPTSAke25hbWV9IGZcbkpPSU4gciBJTiBmLiR7a31cbldIRVJFIExPV0VSKHIuJHtmaWx0ZXIudmFsdWVLZXl9KSA9IExPV0VSKEB2YWx1ZSlcbiR7bG19XG5gLFxuICAgIHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwiQHZhbHVlXCIsIHZhbHVlOiBmaWx0ZXIudmFsdWUgfV1cbiAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkOiBpcyBub3cgcGFydCBvZiBXaGVyZSBxdWVyeSBhcyBrLi0xLnZhbHVlS2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEZpbmRKb2luQ29zbW9zUXVlcnkoXG4gIGZpbHRlcjogSm9pbkZpbmRGaWx0ZXIsXG4gIGs6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBza2lwPzogbnVtYmVyLFxuICBsaW1pdD86IG51bWJlclxuKSB7XG4gIGNvbnN0IGxtID0gc2tpcCAhPT0gdW5kZWZpbmVkIHx8IGxpbWl0ICE9PSB1bmRlZmluZWQgPyBgT0ZGU0VUICR7c2tpcCA/PyAwfSBMSU1JVCAke2xpbWl0ID8/IDk5OTk5OX1gIDogXCJcIlxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBgXG5TRUxFQ1QgRElTVElOQ1QgVkFMVUUgZlxuRlJPTSAke25hbWV9IGZcbkpPSU4gciBJTiBmLiR7a31cbldIRVJFIExPV0VSKHIuJHtmaWx0ZXIudmFsdWVLZXl9KSA9IExPV0VSKEB2YWx1ZSlcbiR7bG19YCxcbiAgICBwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcIkB2YWx1ZVwiLCB2YWx1ZTogZmlsdGVyLnZhbHVlIH1dXG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZDogc2hvdWxkIGJ1aWxkIGludG8gV2hlcmUgcXVlcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGVnYWN5Q29zbW9zUXVlcnk8UE0+KFxuICBmaWx0ZXI6IExlZ2FjeUZpbHRlcjxQTT4sXG4gIG5hbWU6IHN0cmluZyxcbiAgaW1wb3J0ZWRNYXJrZXJJZDogc3RyaW5nLFxuICBza2lwPzogbnVtYmVyLFxuICBsaW1pdD86IG51bWJlclxuKSB7XG4gIGNvbnN0IGxtID0gc2tpcCAhPT0gdW5kZWZpbmVkIHx8IGxpbWl0ICE9PSB1bmRlZmluZWQgPyBgT0ZGU0VUICR7c2tpcCA/PyAwfSBMSU1JVCAke2xpbWl0ID8/IDk5OTk5OX1gIDogXCJcIlxuICByZXR1cm4ge1xuICAgIHF1ZXJ5OiBgXG4gICAgU0VMRUNUIGZcbiAgICBGUk9NICR7bmFtZX0gQVMgZlxuICAgIFdIRVJFIGYuaWQgIT0gQGlkIEFORCBmLiR7XG4gICAgICBTdHJpbmcoXG4gICAgICAgIGZpbHRlci5ieVxuICAgICAgKVxuICAgIH0gTElLRSBAZmlsdGVyXG4gICR7bG19YCxcbiAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICB7IG5hbWU6IFwiQGlkXCIsIHZhbHVlOiBpbXBvcnRlZE1hcmtlcklkIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiQGZpbHRlclwiLFxuICAgICAgICB2YWx1ZTogZmlsdGVyLnR5cGUgPT09IFwiZW5kc1dpdGhcIlxuICAgICAgICAgID8gYCUke2ZpbHRlci52YWx1ZX1gXG4gICAgICAgICAgOiBmaWx0ZXIudHlwZSA9PT0gXCJjb250YWluc1wiXG4gICAgICAgICAgPyBgJSR7ZmlsdGVyLnZhbHVlfSVgXG4gICAgICAgICAgOiBgJHtmaWx0ZXIudmFsdWV9JWBcbiAgICAgIH1cbiAgICBdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2hlcmVDb3Ntb3NRdWVyeShcbiAgZmlsdGVyOiBTdG9yZVdoZXJlRmlsdGVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIGltcG9ydGVkTWFya2VySWQ6IHN0cmluZyxcbiAgc2tpcD86IG51bWJlcixcbiAgbGltaXQ/OiBudW1iZXJcbikge1xuICBjb25zdCBsbSA9IHNraXAgIT09IHVuZGVmaW5lZCB8fCBsaW1pdCAhPT0gdW5kZWZpbmVkID8gYE9GRlNFVCAke3NraXAgPz8gMH0gTElNSVQgJHtsaW1pdCA/PyA5OTk5OTl9YCA6IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogYFxuICAgIFNFTEVDVCBmXG4gICAgRlJPTSAke25hbWV9IEFTIGZcbiAgICAke1xuICAgICAgZmlsdGVyXG4gICAgICAgIC53aGVyZVxuICAgICAgICAuZmlsdGVyKChfKSA9PiBfLmtleS5pbmNsdWRlcyhcIi4tMS5cIikpXG4gICAgICAgIC5tYXAoKF8pID0+IF8ua2V5LnNwbGl0KFwiLi0xLlwiKVswXSlcbiAgICAgICAgLm1hcCgoXykgPT4gYEpPSU4gJHtffSBJTiBmLiR7X31gKVxuICAgICAgICAudW5pcShFcXVpdmFsZW5jZS5zdHJpbmcpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpXG4gICAgfVxuICAgIFdIRVJFIGYuaWQgIT0gQGlkIEFORCAke1xuICAgICAgZmlsdGVyXG4gICAgICAgIC53aGVyZVxuICAgICAgICAubWFwKChfKSA9PlxuICAgICAgICAgIF8ua2V5LmluY2x1ZGVzKFwiLi0xLlwiKVxuICAgICAgICAgICAgPyB7IC4uLl8sIGY6IF8ua2V5LnNwbGl0KFwiLi0xLlwiKVswXSwga2V5OiBfLmtleS5zcGxpdChcIi4tMS5cIilbMV0hIH1cbiAgICAgICAgICAgIDogeyAuLi5fLCBmOiBcImZcIiB9XG4gICAgICAgIClcbiAgICAgICAgLm1hcChcbiAgICAgICAgICAoeCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgayA9IGAke3guZn0uJHt4LmtleX1gXG4gICAgICAgICAgICBjb25zdCB2ID0gYEB2JHtpfWBcblxuICAgICAgICAgICAgc3dpdGNoICh4LnQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImluXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBUlJBWV9DT05UQUlOUygke3Z9LCAke2t9KWBcbiAgICAgICAgICAgICAgY2FzZSBcIm5vdC1pblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgKE5PVCBBUlJBWV9DT05UQUlOUygke3Z9LCAke2t9KSlgXG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRzLXdpdGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYEVORFNXSVRIKCR7a30sICR7dn0sIHRydWUpYFxuICAgICAgICAgICAgICBjYXNlIFwiY29udGFpbnNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYENPTlRBSU5TKCR7a30sICR7dn0sIHRydWUpYFxuICAgICAgICAgICAgICBjYXNlIFwic3RhcnRzLXdpdGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYFNUQVJUU1dJVEgoJHtrfSwgJHt2fSwgdHJ1ZSlgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxrID0gbG93ZXJJZk5lZWRlZChrLCB4LnZhbHVlKVxuICAgICAgICAgICAgY29uc3QgbHYgPSBsb3dlcklmTmVlZGVkKHYsIHgudmFsdWUpXG5cbiAgICAgICAgICAgIHN3aXRjaCAoeC50KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJsdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsa30gPCAke2x2fWBcbiAgICAgICAgICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsa30gPD0gJHtsdn1gXG4gICAgICAgICAgICAgIGNhc2UgXCJndFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsa30gPiAke2x2fWBcbiAgICAgICAgICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsa30gPj0gJHtsdn1gXG4gICAgICAgICAgICAgIGNhc2UgXCJub3QtZXFcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyBgSVNfTlVMTCgke2t9KSA9IGZhbHNlYFxuICAgICAgICAgICAgICAgICAgOiBgJHtsa30gPD4gJHtsdn1gXG4gICAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyBgSVNfTlVMTCgke2t9KSA9IHRydWVgXG4gICAgICAgICAgICAgICAgICA6IGAke2xrfSA9ICR7bHZ9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAuam9pbihmaWx0ZXIubW9kZSA9PT0gXCJvclwiID8gXCIgT1IgXCIgOiBcIiBBTkQgXCIpXG4gICAgfVxuICAgICR7bG19YCxcbiAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICB7IG5hbWU6IFwiQGlkXCIsIHZhbHVlOiBpbXBvcnRlZE1hcmtlcklkIH0sXG4gICAgICAuLi5maWx0ZXJcbiAgICAgICAgLndoZXJlXG4gICAgICAgIC5tYXAoKHgsIGkpID0+ICh7XG4gICAgICAgICAgbmFtZTogYEB2JHtpfWAsXG4gICAgICAgICAgdmFsdWU6IHgudmFsdWVcbiAgICAgICAgfSkpXG4gICAgXVxuICB9XG59XG5cbi8vIGZ1bmN0aW9uIGlzQXJyYXkodDogU3VwcG9ydGVkVmFsdWVzIHwgcmVhZG9ubHkgU3VwcG9ydGVkVmFsdWVzW10pOiB0IGlzIHJlYWRvbmx5IFN1cHBvcnRlZFZhbHVlc1tdIHtcbi8vICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodClcbi8vIH1cblxuZnVuY3Rpb24gbG93ZXJJZk5lZWRlZChrZXk6IHVua25vd24sIHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBgTE9XRVIoJHtrZXl9KWAgOiBgJHtrZXl9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb3Ntb3NRdWVyeTxQTT4oXG4gIGZpbHRlcjogTGVnYWN5RmlsdGVyPFBNPiB8IFN0b3JlV2hlcmVGaWx0ZXIsXG4gIG5hbWU6IHN0cmluZyxcbiAgaW1wb3J0ZWRNYXJrZXJJZDogc3RyaW5nLFxuICBza2lwPzogbnVtYmVyLFxuICBsaW1pdD86IG51bWJlclxuKSB7XG4gIHJldHVybiBmaWx0ZXIudHlwZSA9PT0gXCJzdGFydHNXaXRoXCJcbiAgICAgIHx8IGZpbHRlci50eXBlID09PSBcImVuZHNXaXRoXCJcbiAgICAgIHx8IGZpbHRlci50eXBlID09PSBcImNvbnRhaW5zXCJcbiAgICA/IGJ1aWxkTGVnYWN5Q29zbW9zUXVlcnkoZmlsdGVyLCBuYW1lLCBpbXBvcnRlZE1hcmtlcklkLCBza2lwLCBsaW1pdClcbiAgICA6IGJ1aWxkV2hlcmVDb3Ntb3NRdWVyeShmaWx0ZXIsIG5hbWUsIGltcG9ydGVkTWFya2VySWQsIHNraXAsIGxpbWl0KVxufVxuXG5jbGFzcyBDb3Ntb3NEYk9wZXJhdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nKSB7fVxufVxuZXhwb3J0IGZ1bmN0aW9uIENvc21vc1N0b3JlTGl2ZShjb25maWc6IENvbmZpZzxTdG9yYWdlQ29uZmlnPikge1xuICByZXR1cm4gY29uZmlnLmNvbmZpZy5mbGF0TWFwKG1ha2VDb3Ntb3NTdG9yZSkudG9MYXllcihTdG9yZU1ha2VyKVxufVxuIl19
@@ -0,0 +1 @@
1
+ 76ac514b63e950709a008303d53d3e9cc91c0bdb845dc16d2b78b8c751391d40
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 0.66.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Update packages
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @effect-app/core@0.53.0
13
+ - @effect-app/infra-adapters@0.46.0
14
+ - @effect-app/prelude@0.53.0
15
+ - @effect-app/schema@0.47.0
16
+
17
+ ## 0.65.0
18
+
19
+ ### Minor Changes
20
+
21
+ - Update filters
22
+
3
23
  ## 0.64.0
4
24
 
5
25
  ### Minor Changes
package/_cjs/filter.cjs CHANGED
@@ -3,15 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.$contains = $contains;
7
- exports.$endsWith = $endsWith;
8
- exports.$in = exports.$gte = exports.$gt = void 0;
9
- exports.$includes = $includes;
10
- exports.$lte = exports.$lt = exports.$isnt = exports.$is = void 0;
11
- exports.$notContains = $notContains;
12
- exports.$notIn = void 0;
13
- exports.$startsWith = $startsWith;
14
- exports.Filters = void 0;
6
+ exports.Filters = exports.$startsWith = exports.$notIn = exports.$lte = exports.$lt = exports.$isnt = exports.$is = exports.$in = exports.$gte = exports.$gt = exports.$endsWith = exports.$contains = void 0;
15
7
  exports.makeFilters = makeFilters;
16
8
  exports.makeWhereFilter = makeWhereFilter;
17
9
  const $in = $in_1;
@@ -30,6 +22,12 @@ const $lt = $lt_1;
30
22
  exports.$lt = $lt;
31
23
  const $lte = $lte_1;
32
24
  exports.$lte = $lte;
25
+ const $startsWith = $startsWith_1;
26
+ exports.$startsWith = $startsWith;
27
+ const $endsWith = $endsWith_1;
28
+ exports.$endsWith = $endsWith;
29
+ const $contains = $contains_1;
30
+ exports.$contains = $contains;
33
31
  function makeWhereFilter() {
34
32
  const f = makeWhereFilter_();
35
33
  return f;
@@ -103,18 +101,6 @@ function makeWhereFilter_() {
103
101
  const f = Object.assign(helpers.eq, helpers);
104
102
  return f;
105
103
  }
106
- /**
107
- * @tsplus fluent Iterable $contains
108
- */
109
- function $contains(_, v) {
110
- return $$contains(v);
111
- }
112
- /**
113
- * @tsplus fluent Iterable $notContains
114
- */
115
- function $notContains(_, v) {
116
- return $$notContains(v);
117
- }
118
104
  /**
119
105
  * @tsplus fluent string $in
120
106
  * @tsplus fluent boolean $in
@@ -215,16 +201,15 @@ function $in__(...v) {
215
201
  function $notIn__(...v) {
216
202
  return _ => $notIn_1(_, ...v);
217
203
  }
218
- // function $contains__<A extends SupportedValues, V extends A>(
219
- // v: V
220
- // ) {
221
- // return (_: readonly A[]) => $contains(_, v)
222
- // }
223
- // function $notContains__<A extends SupportedValues, V extends A>(
224
- // v: V
225
- // ) {
226
- // return (_: readonly A[]) => $notContains(_, v)
227
- // }
204
+ function $startsWith__(v) {
205
+ return _ => $startsWith_1(_, v);
206
+ }
207
+ function $endsWith__(v) {
208
+ return _ => $endsWith_1(_, v);
209
+ }
210
+ function $contains__(v) {
211
+ return _ => $contains_1(_, v);
212
+ }
228
213
  const Filters = {
229
214
  $is: $is__,
230
215
  $isnt: $isnt__,
@@ -233,28 +218,29 @@ const Filters = {
233
218
  $gt: $gt__,
234
219
  $gte: $gte__,
235
220
  $lt: $lt__,
236
- $lte: $lte__
237
- // $contains: $contains__,
238
- // $notContains: $notContains__,
221
+ $lte: $lte__,
222
+ $contains: $contains__,
223
+ $endsWith: $endsWith__,
224
+ $startsWith: $startsWith__
239
225
  };
240
226
  /**
241
227
  * @tsplus fluent string $startsWith
242
228
  */
243
229
  exports.Filters = Filters;
244
- function $startsWith(_, v) {
230
+ function $startsWith_1(_, v) {
245
231
  return $$startsWith(v);
246
232
  }
247
233
  /**
248
234
  * @tsplus fluent string $endsWith
249
235
  */
250
- function $endsWith(_, v) {
236
+ function $endsWith_1(_, v) {
251
237
  return $$endsWith(v);
252
238
  }
253
239
  /**
254
- * @tsplus fluent string $includes
240
+ * @tsplus fluent string $contains
255
241
  */
256
- function $includes(_, v) {
257
- return $$includes(v);
242
+ function $contains_1(_, v) {
243
+ return $$contains(v);
258
244
  }
259
245
  function $$in(v) {
260
246
  return {
@@ -304,25 +290,12 @@ function $$gte(v) {
304
290
  v
305
291
  };
306
292
  }
307
- // containsAny, containsAll?
308
293
  function $$contains(v) {
309
294
  return {
310
295
  t: "contains",
311
296
  v
312
297
  };
313
298
  }
314
- function $$notContains(v) {
315
- return {
316
- t: "not-contains",
317
- v
318
- };
319
- }
320
- function $$includes(v) {
321
- return {
322
- t: "includes",
323
- v
324
- };
325
- }
326
299
  function $$startsWith(v) {
327
300
  return {
328
301
  t: "starts-with",