medusa-pos-plugin 0.0.1

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 (36) hide show
  1. package/.medusa/server/src/admin/index.js +23 -0
  2. package/.medusa/server/src/admin/index.mjs +24 -0
  3. package/.medusa/server/src/api/admin/pos/catalog/route.js +139 -0
  4. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/confirm-lite/route.js +41 -0
  5. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/customer/route.js +68 -0
  6. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/finalize/route.js +424 -0
  7. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/route.js +452 -0
  8. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/update/route.js +137 -0
  9. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/manual-discount/route.js +386 -0
  10. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/promotions/route.js +59 -0
  11. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/route.js +178 -0
  12. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/wallet-debit/route.js +220 -0
  13. package/.medusa/server/src/api/admin/pos/draft-orders/route.js +193 -0
  14. package/.medusa/server/src/api/admin/pos/manual-discounts/route.js +76 -0
  15. package/.medusa/server/src/api/admin/pos/orders/[id]/fulfill/route.js +103 -0
  16. package/.medusa/server/src/api/admin/pos/orders/[id]/returns/route.js +512 -0
  17. package/.medusa/server/src/api/admin/pos/orders/fulfill-pos-items.js +63 -0
  18. package/.medusa/server/src/api/admin/pos/orders/validators.js +62 -0
  19. package/.medusa/server/src/api/admin/pos/payments/config/route.js +15 -0
  20. package/.medusa/server/src/api/admin/pos/payments/device/[orderId]/route.js +39 -0
  21. package/.medusa/server/src/api/admin/pos/payments/device/cancel/route.js +27 -0
  22. package/.medusa/server/src/api/admin/pos/payments/device/route.js +107 -0
  23. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/close/route.js +36 -0
  24. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/route.js +42 -0
  25. package/.medusa/server/src/api/admin/pos/payments/qr/route.js +78 -0
  26. package/.medusa/server/src/index.js +8 -0
  27. package/.medusa/server/src/types.js +3 -0
  28. package/.medusa/server/src/utils/pos-draft-edit.js +178 -0
  29. package/.medusa/server/src/utils/pos-finalize.js +166 -0
  30. package/.medusa/server/src/utils/pos-inventory.js +265 -0
  31. package/.medusa/server/src/utils/pos-returns.js +339 -0
  32. package/.medusa/server/src/utils/razorpay-pos-device.js +122 -0
  33. package/.medusa/server/src/utils/razorpay-pos.js +134 -0
  34. package/README.md +39 -0
  35. package/index.js +9 -0
  36. package/package.json +82 -0
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ const i18nTranslations0 = {};
3
+ const widgetModule = { widgets: [] };
4
+ const routeModule = {
5
+ routes: []
6
+ };
7
+ const menuItemModule = {
8
+ menuItems: []
9
+ };
10
+ const formModule = { customFields: {} };
11
+ const displayModule = {
12
+ displays: {}
13
+ };
14
+ const i18nModule = { resources: i18nTranslations0 };
15
+ const plugin = {
16
+ widgetModule,
17
+ routeModule,
18
+ menuItemModule,
19
+ formModule,
20
+ displayModule,
21
+ i18nModule
22
+ };
23
+ module.exports = plugin;
@@ -0,0 +1,24 @@
1
+ const i18nTranslations0 = {};
2
+ const widgetModule = { widgets: [] };
3
+ const routeModule = {
4
+ routes: []
5
+ };
6
+ const menuItemModule = {
7
+ menuItems: []
8
+ };
9
+ const formModule = { customFields: {} };
10
+ const displayModule = {
11
+ displays: {}
12
+ };
13
+ const i18nModule = { resources: i18nTranslations0 };
14
+ const plugin = {
15
+ widgetModule,
16
+ routeModule,
17
+ menuItemModule,
18
+ formModule,
19
+ displayModule,
20
+ i18nModule
21
+ };
22
+ export {
23
+ plugin as default
24
+ };
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const CATALOG_FIELDS = [
6
+ "id",
7
+ "title",
8
+ "thumbnail",
9
+ "handle",
10
+ "status",
11
+ "variants.id",
12
+ "variants.title",
13
+ "variants.sku",
14
+ "variants.barcode",
15
+ "variants.ean",
16
+ "variants.upc",
17
+ "variants.prices.amount",
18
+ "variants.prices.currency_code",
19
+ "variants.options.id",
20
+ "variants.options.value",
21
+ "variants.options.option_id",
22
+ "variants.options.option.id",
23
+ "variants.options.option.title",
24
+ "options.id",
25
+ "options.title",
26
+ "options.values.id",
27
+ "options.values.value",
28
+ ];
29
+ /**
30
+ * GET /admin/pos/catalog?sales_channel_id=...
31
+ * Compact product+variant payload for POS search/scan (no inventory graphs).
32
+ */
33
+ async function GET(req, res) {
34
+ const queryParams = (req.query || {});
35
+ const salesChannelId = typeof queryParams.sales_channel_id === "string" ? queryParams.sales_channel_id.trim() : "";
36
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
37
+ const t0 = performance.now();
38
+ try {
39
+ const pageSize = 100;
40
+ let offset = 0;
41
+ const products = [];
42
+ let total = 0;
43
+ // Prefer sales-channel filter when provided; fall back to all products if the
44
+ // link filter shape is unsupported by the query engine.
45
+ const tryFilters = salesChannelId
46
+ ? [{ sales_channels: { id: salesChannelId } }, { sales_channel_id: salesChannelId }, undefined]
47
+ : [undefined];
48
+ let filters = tryFilters[0];
49
+ let filterIndex = 0;
50
+ let loadedWithFilter = false;
51
+ while (filterIndex < tryFilters.length) {
52
+ filters = tryFilters[filterIndex];
53
+ try {
54
+ offset = 0;
55
+ products.length = 0;
56
+ total = 0;
57
+ for (;;) {
58
+ const result = await query.graph({
59
+ entity: "product",
60
+ fields: CATALOG_FIELDS,
61
+ filters: {
62
+ status: "published",
63
+ ...(filters || {}),
64
+ },
65
+ pagination: {
66
+ skip: offset,
67
+ take: pageSize,
68
+ },
69
+ });
70
+ const batch = Array.isArray(result.data) ? result.data : result.data ? [result.data] : [];
71
+ const count = typeof result.metadata?.count === "number"
72
+ ? result.metadata.count
73
+ : typeof result.count === "number"
74
+ ? result.count
75
+ : offset + batch.length;
76
+ total = count;
77
+ products.push(...batch);
78
+ loadedWithFilter = true;
79
+ if (batch.length < pageSize || products.length >= count) {
80
+ break;
81
+ }
82
+ offset += pageSize;
83
+ }
84
+ break;
85
+ }
86
+ catch (err) {
87
+ filterIndex += 1;
88
+ if (filterIndex >= tryFilters.length) {
89
+ throw err;
90
+ }
91
+ }
92
+ }
93
+ // If channel filter returned empty but we had a channel, retry without filter once
94
+ // so POS still works when products aren't linked in the query shape we tried.
95
+ if (salesChannelId && products.length === 0 && loadedWithFilter && filters) {
96
+ offset = 0;
97
+ total = 0;
98
+ for (;;) {
99
+ const result = await query.graph({
100
+ entity: "product",
101
+ fields: [...CATALOG_FIELDS, "sales_channels.id"],
102
+ filters: { status: "published" },
103
+ pagination: { skip: offset, take: pageSize },
104
+ });
105
+ const batch = Array.isArray(result.data) ? result.data : result.data ? [result.data] : [];
106
+ const count = typeof result.metadata?.count === "number"
107
+ ? result.metadata.count
108
+ : offset + batch.length;
109
+ total = count;
110
+ for (const product of batch) {
111
+ const channels = Array.isArray(product?.sales_channels) ? product.sales_channels : [];
112
+ if (channels.some((c) => c?.id === salesChannelId)) {
113
+ const { sales_channels: _sc, ...rest } = product;
114
+ products.push(rest);
115
+ }
116
+ }
117
+ if (batch.length < pageSize || offset + batch.length >= count) {
118
+ break;
119
+ }
120
+ offset += pageSize;
121
+ }
122
+ total = products.length;
123
+ }
124
+ const ms = Math.round(performance.now() - t0);
125
+ console.log(`[pos catalog] channel=${salesChannelId || "all"} products=${products.length} ms=${ms}`);
126
+ res.status(200).json({
127
+ products,
128
+ count: products.length || total,
129
+ _pos_timings_ms: { total: ms },
130
+ });
131
+ }
132
+ catch (error) {
133
+ console.error("[pos catalog] GET error:", error);
134
+ res.status(500).json({
135
+ message: String(error?.message || "Failed to load POS catalog"),
136
+ });
137
+ }
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9jYXRhbG9nL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0NBLGtCQXdIQztBQTNKRCxxREFBcUU7QUFNckUsTUFBTSxjQUFjLEdBQUc7SUFDckIsSUFBSTtJQUNKLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsY0FBYztJQUNkLGNBQWM7SUFDZCx3QkFBd0I7SUFDeEIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQix3QkFBd0I7SUFDeEIsNEJBQTRCO0lBQzVCLDRCQUE0QjtJQUM1QiwrQkFBK0I7SUFDL0IsWUFBWTtJQUNaLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsc0JBQXNCO0NBQ3ZCLENBQUE7QUFFRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBaUIsQ0FBQTtJQUNyRCxNQUFNLGNBQWMsR0FDbEIsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUU3RixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUE7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFBO1FBQ3BCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNk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
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const pos_draft_edit_1 = require("../../../../../../utils/pos-draft-edit");
5
+ const route_1 = require("../items/route");
6
+ /**
7
+ * POST /admin/pos/draft-orders/:id/confirm-lite
8
+ * Idle flush for new POS keep_edit_open path:
9
+ * confirm open draft edit (no payment-collection), then apply auto promotions.
10
+ */
11
+ async function POST(req, res) {
12
+ const draftOrderId = req.params.id;
13
+ if (!draftOrderId) {
14
+ res.status(400).json({ message: "Draft order id is required" });
15
+ return;
16
+ }
17
+ const actorId = req.auth_context?.actor_id ||
18
+ req.auth?.actor_id ||
19
+ null;
20
+ const confirmedBy = actorId || "system";
21
+ try {
22
+ const t0 = performance.now();
23
+ const confirmed = await (0, pos_draft_edit_1.confirmEditLite)(req.scope, draftOrderId, confirmedBy);
24
+ const autoPromoRes = await (0, route_1.applyAutoPromotions)(req.scope, draftOrderId, confirmedBy);
25
+ const ms = Math.round(performance.now() - t0);
26
+ console.log(`[pos confirm-lite] draft=${draftOrderId} confirmed=${confirmed ? 1 : 0} ms=${ms} auto_promos=${JSON.stringify(autoPromoRes)}`);
27
+ res.status(200).json({
28
+ id: draftOrderId,
29
+ confirmed: Boolean(confirmed),
30
+ _pos_auto_promos: autoPromoRes,
31
+ _pos_timings_ms: { confirm_lite: ms },
32
+ });
33
+ }
34
+ catch (error) {
35
+ console.error("[pos confirm-lite] POST error:", error);
36
+ res.status(500).json({
37
+ message: String(error?.message || "Failed to confirm draft edit"),
38
+ });
39
+ }
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS9jb25maXJtLWxpdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSxvQkFrQ0M7QUExQ0QsMkVBQXdFO0FBQ3hFLDBDQUFvRDtBQUVwRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFBO0lBRWxDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDLENBQUE7UUFDL0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FDVixHQUFXLENBQUMsWUFBWSxFQUFFLFFBQVE7UUFDbEMsR0FBVyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQzNCLElBQUksQ0FBQTtJQUNOLE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxRQUFRLENBQUE7SUFFdkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzVCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxnQ0FBZSxFQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQzdFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSwyQkFBbUIsRUFBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUNwRixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUNULDRCQUE0QixZQUFZLGNBQWMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQy9ILENBQUE7UUFDRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixFQUFFLEVBQUUsWUFBWTtZQUNoQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUM3QixnQkFBZ0IsRUFBRSxZQUFZO1lBQzlCLGVBQWUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7U0FDdEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN0RCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksOEJBQThCLENBQUM7U0FDbEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
6
+ const pos_draft_edit_1 = require("../../../../../../utils/pos-draft-edit");
7
+ /**
8
+ * POST /admin/pos/draft-orders/:id/customer
9
+ * Attach/clear customer with confirm-lite (no payment-collection refresh).
10
+ */
11
+ async function POST(req, res) {
12
+ const draftOrderId = req.params.id;
13
+ const body = (req.body || {});
14
+ const t0 = performance.now();
15
+ if (!draftOrderId) {
16
+ res.status(400).json({ message: "Draft order id is required" });
17
+ return;
18
+ }
19
+ const actorId = req.auth_context?.actor_id ||
20
+ req.auth?.actor_id ||
21
+ null;
22
+ const confirmedBy = actorId || "system";
23
+ try {
24
+ // Prefer direct order update when possible (no payment-collection path).
25
+ // Fall back to draft-edit + confirm-lite if Medusa rejects the direct write.
26
+ let usedEdit = false;
27
+ try {
28
+ const orderModule = req.scope.resolve(utils_1.Modules.ORDER);
29
+ const payload = {};
30
+ if ("customer_id" in body)
31
+ payload.customer_id = body.customer_id ?? null;
32
+ if ("email" in body && body.email != null)
33
+ payload.email = body.email;
34
+ if (body.billing_address)
35
+ payload.billing_address = body.billing_address;
36
+ await orderModule.updateOrders(draftOrderId, payload);
37
+ }
38
+ catch (directErr) {
39
+ console.warn(`[pos customer] direct updateOrders failed, using edit: ${directErr?.message || directErr}`);
40
+ usedEdit = true;
41
+ await (0, pos_draft_edit_1.beginEditSafe)(req.scope, draftOrderId);
42
+ await (0, core_flows_1.updateDraftOrderWorkflow)(req.scope).run({
43
+ input: {
44
+ id: draftOrderId,
45
+ user_id: confirmedBy,
46
+ customer_id: body.customer_id ?? undefined,
47
+ email: body.email ?? undefined,
48
+ ...(body.billing_address ? { billing_address: body.billing_address } : {}),
49
+ },
50
+ });
51
+ await (0, pos_draft_edit_1.confirmEditLite)(req.scope, draftOrderId, confirmedBy);
52
+ }
53
+ const draft_order = await (0, pos_draft_edit_1.retrievePosCart)(req.scope, draftOrderId);
54
+ const ms = Math.round(performance.now() - t0);
55
+ console.log(`[pos customer] draft=${draftOrderId} used_edit=${usedEdit ? 1 : 0} ms=${ms}`);
56
+ res.status(200).json({
57
+ draft_order: draft_order || { id: draftOrderId },
58
+ _pos_timings_ms: { total: ms },
59
+ });
60
+ }
61
+ catch (error) {
62
+ console.error("[pos customer] POST error:", error);
63
+ res.status(500).json({
64
+ message: String(error?.message || "Failed to update draft customer"),
65
+ });
66
+ }
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Bvcy9kcmFmdC1vcmRlcnMvW2lkXS9jdXN0b21lci9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1CQSxvQkFnRUM7QUFsRkQscURBQW1EO0FBQ25ELDREQUFzRTtBQUN0RSwyRUFJK0M7QUFRL0M7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFBO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQWlCLENBQUE7SUFDN0MsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBRTVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDLENBQUE7UUFDL0QsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FDVixHQUFXLENBQUMsWUFBWSxFQUFFLFFBQVE7UUFDbEMsR0FBVyxDQUFDLElBQUksRUFBRSxRQUFRO1FBQzNCLElBQUksQ0FBQTtJQUNOLE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxRQUFRLENBQUE7SUFFdkMsSUFBSSxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLDZFQUE2RTtRQUM3RSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FFbEQsQ0FBQTtZQUNELE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUE7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