medusa-analytics 0.0.13 → 0.0.15

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.
@@ -0,0 +1,624 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDaysParam = parseDaysParam;
4
+ exports.parseTopSellerPeriod = parseTopSellerPeriod;
5
+ exports.parseOverTimePeriod = parseOverTimePeriod;
6
+ exports.parseSalesChannelId = parseSalesChannelId;
7
+ exports.getRangeFromDays = getRangeFromDays;
8
+ exports.getRangeFromTopSellerPeriod = getRangeFromTopSellerPeriod;
9
+ exports.listSalesChannels = listSalesChannels;
10
+ exports.aggregateProductSales = aggregateProductSales;
11
+ exports.aggregateProductViews = aggregateProductViews;
12
+ exports.getProductsOverTime = getProductsOverTime;
13
+ exports.combineSalesAndViews = combineSalesAndViews;
14
+ const utils_1 = require("@medusajs/framework/utils");
15
+ const PRODUCT_VIEW_MODULE_KEY = "product_view";
16
+ const MIN_DAYS = 1;
17
+ const MAX_DAYS = 365;
18
+ const DAYS_ALL = -1;
19
+ const TOP_SELLER_PERIODS = ["week", "month", "year", "all"];
20
+ const OVER_TIME_PERIODS = ["one_week", "one_month", "one_year"];
21
+ function isRecord(value) {
22
+ return typeof value === "object" && value !== null;
23
+ }
24
+ function toValidDate(value) {
25
+ if (value instanceof Date) {
26
+ return Number.isNaN(value.getTime()) ? null : value;
27
+ }
28
+ if (typeof value === "string" || typeof value === "number") {
29
+ const parsed = new Date(value);
30
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
31
+ }
32
+ return null;
33
+ }
34
+ function toDateKey(date) {
35
+ return date.toISOString().slice(0, 10);
36
+ }
37
+ function safeNumber(value) {
38
+ if (typeof value === "number" && Number.isFinite(value))
39
+ return value;
40
+ const parsed = Number(value);
41
+ return Number.isFinite(parsed) ? parsed : 0;
42
+ }
43
+ function toNumber(value) {
44
+ if (value == null)
45
+ return 0;
46
+ const direct = safeNumber(value);
47
+ if (direct !== 0 || value === 0 || value === "0")
48
+ return direct;
49
+ if (!isRecord(value))
50
+ return 0;
51
+ if ("numeric" in value) {
52
+ return safeNumber(value.numeric);
53
+ }
54
+ if ("value" in value) {
55
+ return safeNumber(value.value);
56
+ }
57
+ if ("raw" in value && isRecord(value.raw) && "value" in value.raw) {
58
+ return safeNumber(value.raw.value);
59
+ }
60
+ if (typeof value.valueOf === "function") {
61
+ return safeNumber(value.valueOf());
62
+ }
63
+ if (typeof value.toJSON === "function") {
64
+ return safeNumber(value.toJSON());
65
+ }
66
+ return 0;
67
+ }
68
+ function isCancelled(status) {
69
+ if (!status)
70
+ return false;
71
+ const normalized = status.trim().toLowerCase();
72
+ return normalized === "canceled" || normalized === "cancelled";
73
+ }
74
+ function getMonthStart(date) {
75
+ const monthStart = new Date(date);
76
+ monthStart.setUTCHours(0, 0, 0, 0);
77
+ monthStart.setUTCDate(1);
78
+ return monthStart;
79
+ }
80
+ function extractLineItemRevenue(item) {
81
+ const total = toNumber(item.item_total ?? item.total);
82
+ if (total > 0)
83
+ return total;
84
+ const subtotal = toNumber(item.item_subtotal ?? item.subtotal);
85
+ if (subtotal > 0)
86
+ return subtotal;
87
+ const quantity = extractLineItemQuantity(item);
88
+ const unitPrice = toNumber(item.unit_price ?? item.detail?.unit_price);
89
+ return quantity > 0 && unitPrice > 0 ? quantity * unitPrice : 0;
90
+ }
91
+ function extractLineItemQuantity(item) {
92
+ const quantity = toNumber(item.quantity ??
93
+ item.raw_quantity ??
94
+ item.detail?.quantity ??
95
+ item.detail?.raw_quantity);
96
+ return Math.max(0, Math.floor(quantity));
97
+ }
98
+ function parseDaysParam(value) {
99
+ if (value === "all" || value === undefined || value === null)
100
+ return DAYS_ALL;
101
+ const parsed = Number(value);
102
+ if (!Number.isInteger(parsed) || parsed < MIN_DAYS) {
103
+ return parsed === 0 ? 0 : MIN_DAYS;
104
+ }
105
+ if (parsed > MAX_DAYS)
106
+ return MAX_DAYS;
107
+ return parsed;
108
+ }
109
+ function parseTopSellerPeriod(value) {
110
+ return typeof value === "string" &&
111
+ TOP_SELLER_PERIODS.includes(value)
112
+ ? value
113
+ : "week";
114
+ }
115
+ function parseOverTimePeriod(value) {
116
+ return typeof value === "string" &&
117
+ OVER_TIME_PERIODS.includes(value)
118
+ ? value
119
+ : "one_week";
120
+ }
121
+ function parseSalesChannelId(value) {
122
+ if (typeof value !== "string")
123
+ return null;
124
+ const normalized = value.trim();
125
+ if (!normalized || normalized === "all")
126
+ return null;
127
+ return normalized;
128
+ }
129
+ function getRangeFromDays(days) {
130
+ const today = new Date();
131
+ today.setUTCHours(0, 0, 0, 0);
132
+ const start = new Date(today);
133
+ const end = new Date(today);
134
+ end.setUTCHours(23, 59, 59, 999);
135
+ if (days === DAYS_ALL) {
136
+ start.setTime(0);
137
+ return { start, end };
138
+ }
139
+ if (days === 0) {
140
+ return { start, end };
141
+ }
142
+ start.setUTCDate(start.getUTCDate() - (days - 1));
143
+ start.setUTCHours(0, 0, 0, 0);
144
+ return { start, end };
145
+ }
146
+ function getRangeFromTopSellerPeriod(period) {
147
+ if (period === "all") {
148
+ return {
149
+ start: new Date(0),
150
+ end: new Date(),
151
+ };
152
+ }
153
+ if (period === "week") {
154
+ return getRangeFromDays(7);
155
+ }
156
+ if (period === "month") {
157
+ return getRangeFromDays(30);
158
+ }
159
+ return getRangeFromDays(365);
160
+ }
161
+ function createBuckets(period) {
162
+ const now = new Date();
163
+ now.setUTCHours(0, 0, 0, 0);
164
+ if (period === "one_year") {
165
+ const currentMonthStart = getMonthStart(now);
166
+ const buckets = [];
167
+ for (let i = 0; i < 12; i++) {
168
+ const bucketStart = new Date(currentMonthStart);
169
+ bucketStart.setUTCMonth(bucketStart.getUTCMonth() - (11 - i));
170
+ const bucketEnd = new Date(bucketStart);
171
+ bucketEnd.setUTCMonth(bucketEnd.getUTCMonth() + 1);
172
+ bucketEnd.setUTCMilliseconds(bucketEnd.getUTCMilliseconds() - 1);
173
+ buckets.push({
174
+ date: toDateKey(bucketStart),
175
+ label: bucketStart.toLocaleDateString(undefined, { month: "short" }),
176
+ start: bucketStart.getTime(),
177
+ end: bucketEnd.getTime(),
178
+ });
179
+ }
180
+ return buckets;
181
+ }
182
+ const totalDays = period === "one_month" ? 30 : 7;
183
+ const rangeStart = new Date(now);
184
+ rangeStart.setUTCDate(rangeStart.getUTCDate() - (totalDays - 1));
185
+ const buckets = [];
186
+ for (let i = 0; i < totalDays; i++) {
187
+ const bucketStart = new Date(rangeStart);
188
+ bucketStart.setUTCDate(bucketStart.getUTCDate() + i);
189
+ bucketStart.setUTCHours(0, 0, 0, 0);
190
+ const bucketEnd = new Date(bucketStart);
191
+ bucketEnd.setUTCHours(23, 59, 59, 999);
192
+ buckets.push({
193
+ date: toDateKey(bucketStart),
194
+ label: period === "one_week"
195
+ ? bucketStart.toLocaleDateString(undefined, { weekday: "short" })
196
+ : String(bucketStart.getUTCDate()),
197
+ start: bucketStart.getTime(),
198
+ end: bucketEnd.getTime(),
199
+ });
200
+ }
201
+ return buckets;
202
+ }
203
+ function findBucketIndex(timestamp, buckets) {
204
+ for (let index = 0; index < buckets.length; index += 1) {
205
+ const bucket = buckets[index];
206
+ if (timestamp >= bucket.start && timestamp <= bucket.end) {
207
+ return index;
208
+ }
209
+ }
210
+ return -1;
211
+ }
212
+ async function fetchOrdersWithItems(req) {
213
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
214
+ const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
215
+ const fields = [
216
+ "id",
217
+ "status",
218
+ "created_at",
219
+ "sales_channel_id",
220
+ "items.*",
221
+ ];
222
+ try {
223
+ const result = await remoteQuery((0, utils_1.remoteQueryObjectFromString)({
224
+ entryPoint: "order",
225
+ fields,
226
+ take: 50000,
227
+ }));
228
+ if (Array.isArray(result) && result.length > 0) {
229
+ return result;
230
+ }
231
+ }
232
+ catch {
233
+ // Fall back to query.graph below.
234
+ }
235
+ try {
236
+ const result = await query.graph({
237
+ entity: "order",
238
+ fields,
239
+ pagination: {
240
+ take: 50000,
241
+ },
242
+ });
243
+ const data = result?.data;
244
+ return Array.isArray(data) ? data : [];
245
+ }
246
+ catch {
247
+ return [];
248
+ }
249
+ }
250
+ async function buildProductLookup(req, variantIds) {
251
+ const lookup = {
252
+ productIdByVariantId: new Map(),
253
+ productTitleById: new Map(),
254
+ };
255
+ if (variantIds.length === 0) {
256
+ return lookup;
257
+ }
258
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
259
+ const variantResult = await query.graph({
260
+ entity: "product_variant",
261
+ fields: ["id", "product_id"],
262
+ filters: { id: variantIds },
263
+ pagination: {
264
+ take: variantIds.length,
265
+ },
266
+ });
267
+ const variants = Array.isArray(variantResult?.data)
268
+ ? variantResult.data
269
+ : [];
270
+ const productIds = new Set();
271
+ for (const variant of variants) {
272
+ if (variant.id && variant.product_id) {
273
+ lookup.productIdByVariantId.set(variant.id, variant.product_id);
274
+ productIds.add(variant.product_id);
275
+ }
276
+ }
277
+ if (productIds.size === 0) {
278
+ return lookup;
279
+ }
280
+ const productResult = await query.graph({
281
+ entity: "product",
282
+ fields: ["id", "title"],
283
+ filters: { id: Array.from(productIds) },
284
+ pagination: {
285
+ take: productIds.size,
286
+ },
287
+ });
288
+ const products = Array.isArray(productResult?.data)
289
+ ? productResult.data
290
+ : [];
291
+ for (const product of products) {
292
+ if (product.id) {
293
+ lookup.productTitleById.set(product.id, product.title?.trim() || "Unknown product");
294
+ }
295
+ }
296
+ return lookup;
297
+ }
298
+ async function getAllowedProductIdsForSalesChannel(req, salesChannelId) {
299
+ if (!salesChannelId) {
300
+ return null;
301
+ }
302
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
303
+ const result = await query.graph({
304
+ entity: "product",
305
+ fields: ["id"],
306
+ filters: {
307
+ sales_channels: {
308
+ id: [salesChannelId],
309
+ },
310
+ },
311
+ pagination: {
312
+ take: 50000,
313
+ },
314
+ });
315
+ const products = Array.isArray(result?.data)
316
+ ? result.data
317
+ : [];
318
+ return new Set(products
319
+ .map((product) => product.id)
320
+ .filter((productId) => Boolean(productId)));
321
+ }
322
+ async function listSalesChannels(req) {
323
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
324
+ const result = await query.graph({
325
+ entity: "sales_channel",
326
+ fields: ["id", "name"],
327
+ pagination: {
328
+ take: 100,
329
+ },
330
+ });
331
+ const channels = Array.isArray(result?.data)
332
+ ? result.data
333
+ : [];
334
+ return channels
335
+ .filter((channel) => Boolean(channel.id))
336
+ .map((channel) => ({
337
+ id: channel.id,
338
+ name: channel.name?.trim() || channel.id,
339
+ }));
340
+ }
341
+ async function aggregateProductSales(req, range, salesChannelId = null) {
342
+ const orders = await fetchOrdersWithItems(req);
343
+ const relevantOrders = [];
344
+ const variantIds = new Set();
345
+ for (const order of orders) {
346
+ if (isCancelled(order.status))
347
+ continue;
348
+ if (salesChannelId && order.sales_channel_id !== salesChannelId)
349
+ continue;
350
+ const createdAt = toValidDate(order.created_at);
351
+ if (!createdAt || createdAt < range.start || createdAt > range.end)
352
+ continue;
353
+ relevantOrders.push(order);
354
+ for (const item of order.items ?? []) {
355
+ if (item.variant_id)
356
+ variantIds.add(item.variant_id);
357
+ }
358
+ }
359
+ const lookup = await buildProductLookup(req, Array.from(variantIds));
360
+ const aggregates = new Map();
361
+ let unitsSold = 0;
362
+ let productRevenue = 0;
363
+ let ordersWithProducts = 0;
364
+ for (const order of relevantOrders) {
365
+ const productsInOrder = new Set();
366
+ for (const item of order.items ?? []) {
367
+ if (!item.variant_id)
368
+ continue;
369
+ const productId = lookup.productIdByVariantId.get(item.variant_id);
370
+ if (!productId)
371
+ continue;
372
+ const quantity = extractLineItemQuantity(item);
373
+ const revenue = extractLineItemRevenue(item);
374
+ const aggregate = aggregates.get(productId) ?? {
375
+ product_id: productId,
376
+ product_title: lookup.productTitleById.get(productId) ?? "Unknown product",
377
+ units_sold: 0,
378
+ revenue: 0,
379
+ order_count: 0,
380
+ variant_ids: [],
381
+ variantIdSet: new Set(),
382
+ };
383
+ aggregate.units_sold += quantity;
384
+ aggregate.revenue += revenue;
385
+ aggregate.variantIdSet.add(item.variant_id);
386
+ aggregates.set(productId, aggregate);
387
+ unitsSold += quantity;
388
+ productRevenue += revenue;
389
+ productsInOrder.add(productId);
390
+ }
391
+ if (productsInOrder.size > 0) {
392
+ ordersWithProducts += 1;
393
+ }
394
+ for (const productId of productsInOrder) {
395
+ const aggregate = aggregates.get(productId);
396
+ if (aggregate) {
397
+ aggregate.order_count += 1;
398
+ }
399
+ }
400
+ }
401
+ const products = Array.from(aggregates.values())
402
+ .map((aggregate) => ({
403
+ product_id: aggregate.product_id,
404
+ product_title: aggregate.product_title,
405
+ units_sold: aggregate.units_sold,
406
+ revenue: aggregate.revenue,
407
+ order_count: aggregate.order_count,
408
+ variant_ids: Array.from(aggregate.variantIdSet),
409
+ }))
410
+ .sort((left, right) => {
411
+ if (right.units_sold !== left.units_sold) {
412
+ return right.units_sold - left.units_sold;
413
+ }
414
+ if (right.revenue !== left.revenue) {
415
+ return right.revenue - left.revenue;
416
+ }
417
+ return right.order_count - left.order_count;
418
+ });
419
+ return {
420
+ totals: {
421
+ unitsSold,
422
+ productRevenue,
423
+ ordersWithProducts,
424
+ activeProductsSold: products.length,
425
+ },
426
+ products,
427
+ };
428
+ }
429
+ async function getProductViewService(req) {
430
+ try {
431
+ return req.scope.resolve(PRODUCT_VIEW_MODULE_KEY);
432
+ }
433
+ catch {
434
+ return null;
435
+ }
436
+ }
437
+ async function listProductViewsForRange(req, range) {
438
+ const service = await getProductViewService(req);
439
+ if (!service) {
440
+ return { connected: false, views: [] };
441
+ }
442
+ try {
443
+ const result = await service.listProductViews({
444
+ created_at: {
445
+ $gte: range.start,
446
+ $lte: range.end,
447
+ },
448
+ }, {
449
+ take: 100000,
450
+ order: { created_at: "ASC" },
451
+ });
452
+ return {
453
+ connected: true,
454
+ views: Array.isArray(result) ? result : [],
455
+ };
456
+ }
457
+ catch {
458
+ try {
459
+ const fallback = await service.listProductViews({}, {
460
+ take: 100000,
461
+ order: { created_at: "ASC" },
462
+ });
463
+ const filtered = Array.isArray(fallback)
464
+ ? fallback.filter((view) => {
465
+ const createdAt = toValidDate(view.created_at);
466
+ return (createdAt !== null &&
467
+ createdAt >= range.start &&
468
+ createdAt <= range.end);
469
+ })
470
+ : [];
471
+ return {
472
+ connected: true,
473
+ views: filtered,
474
+ };
475
+ }
476
+ catch {
477
+ return { connected: false, views: [] };
478
+ }
479
+ }
480
+ }
481
+ async function aggregateProductViews(req, range, salesChannelId = null) {
482
+ const { connected, views } = await listProductViewsForRange(req, range);
483
+ if (!connected || views.length === 0) {
484
+ return {
485
+ connected,
486
+ totalViews: 0,
487
+ products: [],
488
+ };
489
+ }
490
+ const variantIds = Array.from(new Set(views
491
+ .map((view) => view.variant_id)
492
+ .filter((variantId) => Boolean(variantId))));
493
+ const lookup = await buildProductLookup(req, variantIds);
494
+ const allowedProductIds = await getAllowedProductIdsForSalesChannel(req, salesChannelId);
495
+ const aggregates = new Map();
496
+ for (const view of views) {
497
+ if (!view.variant_id)
498
+ continue;
499
+ const productId = lookup.productIdByVariantId.get(view.variant_id);
500
+ if (!productId)
501
+ continue;
502
+ if (allowedProductIds && !allowedProductIds.has(productId))
503
+ continue;
504
+ const aggregate = aggregates.get(productId) ?? {
505
+ product_id: productId,
506
+ product_title: lookup.productTitleById.get(productId) ?? "Unknown product",
507
+ total_views: 0,
508
+ variant_ids: [],
509
+ variantIdSet: new Set(),
510
+ };
511
+ aggregate.total_views += 1;
512
+ aggregate.variantIdSet.add(view.variant_id);
513
+ aggregates.set(productId, aggregate);
514
+ }
515
+ const products = Array.from(aggregates.values())
516
+ .map((aggregate) => ({
517
+ product_id: aggregate.product_id,
518
+ product_title: aggregate.product_title,
519
+ total_views: aggregate.total_views,
520
+ variant_ids: Array.from(aggregate.variantIdSet),
521
+ }))
522
+ .sort((left, right) => right.total_views - left.total_views);
523
+ return {
524
+ connected: true,
525
+ totalViews: products.reduce((sum, product) => sum + product.total_views, 0),
526
+ products,
527
+ };
528
+ }
529
+ async function getProductsOverTime(req, period, salesChannelId = null) {
530
+ const buckets = createBuckets(period);
531
+ const range = {
532
+ start: new Date(buckets[0].start),
533
+ end: new Date(buckets[buckets.length - 1].end),
534
+ };
535
+ const bucketRows = buckets.map((bucket) => ({
536
+ date: bucket.date,
537
+ label: bucket.label,
538
+ units_sold: 0,
539
+ revenue: 0,
540
+ views: 0,
541
+ }));
542
+ const orders = await fetchOrdersWithItems(req);
543
+ for (const order of orders) {
544
+ if (isCancelled(order.status))
545
+ continue;
546
+ if (salesChannelId && order.sales_channel_id !== salesChannelId)
547
+ continue;
548
+ const createdAt = toValidDate(order.created_at);
549
+ if (!createdAt)
550
+ continue;
551
+ const bucketIndex = findBucketIndex(createdAt.getTime(), buckets);
552
+ if (bucketIndex === -1)
553
+ continue;
554
+ for (const item of order.items ?? []) {
555
+ const quantity = extractLineItemQuantity(item);
556
+ const revenue = extractLineItemRevenue(item);
557
+ bucketRows[bucketIndex].units_sold += quantity;
558
+ bucketRows[bucketIndex].revenue += revenue;
559
+ }
560
+ }
561
+ const { connected, views } = await listProductViewsForRange(req, range);
562
+ const allowedProductIds = await getAllowedProductIdsForSalesChannel(req, salesChannelId);
563
+ if (connected) {
564
+ const variantIds = Array.from(new Set(views
565
+ .map((view) => view.variant_id)
566
+ .filter((variantId) => Boolean(variantId))));
567
+ const lookup = await buildProductLookup(req, variantIds);
568
+ for (const view of views) {
569
+ const createdAt = toValidDate(view.created_at);
570
+ if (!createdAt)
571
+ continue;
572
+ if (allowedProductIds && view.variant_id) {
573
+ const productId = lookup.productIdByVariantId.get(view.variant_id);
574
+ if (!productId || !allowedProductIds.has(productId)) {
575
+ continue;
576
+ }
577
+ }
578
+ const bucketIndex = findBucketIndex(createdAt.getTime(), buckets);
579
+ if (bucketIndex !== -1) {
580
+ bucketRows[bucketIndex].views += 1;
581
+ }
582
+ }
583
+ }
584
+ return {
585
+ productViewsConnected: connected,
586
+ series: bucketRows,
587
+ };
588
+ }
589
+ function combineSalesAndViews(salesProducts, viewProducts) {
590
+ const rows = new Map();
591
+ for (const product of salesProducts) {
592
+ rows.set(product.product_id, {
593
+ product_id: product.product_id,
594
+ product_title: product.product_title,
595
+ units_sold: product.units_sold,
596
+ revenue: product.revenue,
597
+ order_count: product.order_count,
598
+ total_views: 0,
599
+ views_per_unit: null,
600
+ });
601
+ }
602
+ for (const product of viewProducts) {
603
+ const row = rows.get(product.product_id) ?? {
604
+ product_id: product.product_id,
605
+ product_title: product.product_title,
606
+ units_sold: 0,
607
+ revenue: 0,
608
+ order_count: 0,
609
+ total_views: 0,
610
+ views_per_unit: null,
611
+ };
612
+ row.total_views = product.total_views;
613
+ rows.set(product.product_id, row);
614
+ }
615
+ return Array.from(rows.values()).map((row) => ({
616
+ ...row,
617
+ views_per_unit: row.units_sold > 0
618
+ ? Math.round((row.total_views / row.units_sold) * 100) / 100
619
+ : row.total_views > 0
620
+ ? row.total_views
621
+ : null,
622
+ }));
623
+ }
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9hZG1pbi9hbmFseXRpY3MvcHJvZHVjdHMvc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb05BLHdDQVFDO0FBRUQsb0RBS0M7QUFFRCxrREFLQztBQUVELGtEQUtDO0FBRUQsNENBcUJDO0FBRUQsa0VBaUJDO0FBaU5ELDhDQXNCQztBQUVELHNEQXdHQztBQW9FRCxzREFrRUM7QUFFRCxrREE2RUM7QUFZRCxvREF5Q0M7QUFwM0JELHFEQUdrQztBQUVsQyxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQTtBQUM5QyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUE7QUFDbEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFBO0FBQ3BCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBRW5CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQVUsQ0FBQTtBQUdwRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQVUsQ0FBQTtBQTBHeEUsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFBO0FBQ3BELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDckQsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNE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