@devx-commerce/plugin-gati 0.0.34 → 0.0.35-beta.2
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.
- package/.medusa/server/src/api/admin/masters/[master]/[id]/route.js +121 -0
- package/.medusa/server/src/api/admin/masters/[master]/route.js +33 -0
- package/.medusa/server/src/api/admin/masters/middlewares.js +35 -0
- package/.medusa/server/src/api/admin/masters/query-config.js +14 -0
- package/.medusa/server/src/api/admin/masters/search-middleware.js +16 -0
- package/.medusa/server/src/api/admin/masters/utils.js +108 -0
- package/.medusa/server/src/api/admin/masters/validators.js +28 -0
- package/.medusa/server/src/api/admin/middlewares.js +6 -2
- package/.medusa/server/src/api/admin/variant-options/recalculate/route.js +446 -0
- package/.medusa/server/src/api/admin/variant-options/sync/route.js +329 -0
- package/.medusa/server/src/api/erp/webhook/config.js +37 -6
- package/.medusa/server/src/api/erp/webhook/route.js +10 -137
- package/.medusa/server/src/api/middlewares.js +3 -1
- package/.medusa/server/src/api/pos/gold-rate/middleware.js +13 -0
- package/.medusa/server/src/api/pos/gold-rate/route.js +96 -0
- package/.medusa/server/src/api/pos/middleware.js +13 -0
- package/.medusa/server/src/api/store/gold-rate/current/route.js +70 -0
- package/.medusa/server/src/api/store/gold-rate/historical/route.js +108 -0
- package/.medusa/server/src/api/store/gold-rate/middleware.js +19 -0
- package/.medusa/server/src/api/store/gold-rate/validators.js +37 -0
- package/.medusa/server/src/api/store/middleware.js +3 -1
- package/.medusa/server/src/jobs/process-erp-events.js +205 -0
- package/.medusa/server/src/jobs/process-variant-option-sync.js +536 -0
- package/.medusa/server/src/jobs/sync-order-erp.js +2 -2
- package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +14 -0
- package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +14 -0
- package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +14 -0
- package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +14 -0
- package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +14 -0
- package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +14 -0
- package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +14 -0
- package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +14 -0
- package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +14 -0
- package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +14 -0
- package/.medusa/server/src/modules/erp/service.js +59 -1
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +14 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +16 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +14 -0
- package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +16 -0
- package/.medusa/server/src/modules/extended-product/models/extended-product.js +89 -9
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +20 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +14 -0
- package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +14 -0
- package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +145 -12
- package/.medusa/server/src/modules/item-size-master/index.js +13 -0
- package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +17 -0
- package/.medusa/server/src/modules/item-size-master/models/item-size-master.js +14 -0
- package/.medusa/server/src/modules/item-size-master/service.js +10 -0
- package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +14 -0
- package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +14 -0
- package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +14 -0
- package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +14 -0
- package/.medusa/server/src/modules/quality-master/index.js +13 -0
- package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +16 -0
- package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +14 -0
- package/.medusa/server/src/modules/quality-master/models/quality-master.js +17 -0
- package/.medusa/server/src/modules/quality-master/service.js +10 -0
- package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +14 -0
- package/.medusa/server/src/modules/raw-master/models/raw-master.js +2 -1
- package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +14 -0
- package/.medusa/server/src/modules/shape-master/models/shape-master.js +2 -1
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +14 -0
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +14 -0
- package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251203083315.js +16 -0
- package/.medusa/server/src/modules/shipping-info-master/models/shipping-info-master.js +2 -2
- package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +14 -0
- package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +14 -0
- package/.medusa/server/src/modules/tone-master/index.js +13 -0
- package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +16 -0
- package/.medusa/server/src/modules/tone-master/models/tone-master.js +15 -0
- package/.medusa/server/src/modules/tone-master/service.js +10 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/index.js +13 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +19 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +16 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/models/variant-option-sync-queue.js +23 -0
- package/.medusa/server/src/modules/variant-option-sync-queue/service.js +49 -0
- package/.medusa/server/src/subscribers/cutomer-updated.js +2 -1
- package/.medusa/server/src/subscribers/party-master.js +35 -34
- package/.medusa/server/src/utils/build-redis-key.js +30 -0
- package/.medusa/server/src/workflows/create-or-update-product-options/steps/create-update-product-options.js +39 -2
- package/.medusa/server/src/workflows/helpers/product-helper.js +445 -115
- package/.medusa/server/src/workflows/helpers/update-variant-option-metadata.js +105 -0
- package/.medusa/server/src/workflows/helpers/variant-helper.js +215 -0
- package/.medusa/server/src/workflows/hooks/product-updated.js +6 -11
- package/.medusa/server/src/workflows/inward-master/helper/index.js +88 -39
- package/.medusa/server/src/workflows/inward-master/workflows/update-inward.js +6 -2
- package/.medusa/server/src/workflows/item-size-master/create-or-update-item-size-master.js +51 -0
- package/.medusa/server/src/workflows/item-size-master/index.js +15 -0
- package/.medusa/server/src/workflows/item-size-master/steps/create-item-size.js +21 -0
- package/.medusa/server/src/workflows/item-size-master/steps/delete-item-size.js +23 -0
- package/.medusa/server/src/workflows/item-size-master/steps/fetch-item-size-master.js +55 -0
- package/.medusa/server/src/workflows/item-size-master/steps/update-item-size.js +36 -0
- package/.medusa/server/src/workflows/orders/steps/sync-order-to-erp.js +3 -2
- package/.medusa/server/src/workflows/orders/utils/order-helper.js +6 -5
- package/.medusa/server/src/workflows/orders/workflows/sync-order-to-erp.js +27 -2
- package/.medusa/server/src/workflows/party-master/steps/delete-party.js +4 -7
- package/.medusa/server/src/workflows/party-master/steps/fetch-party-master.js +2 -1
- package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +2 -50
- package/.medusa/server/src/workflows/party-master/workflows/delete-party-master.js +60 -0
- package/.medusa/server/src/workflows/party-master/workflows/index.js +2 -1
- package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +80 -195
- package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +448 -0
- package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +126 -4
- package/.medusa/server/src/workflows/quality-master/create-or-update-quality-master.js +58 -0
- package/.medusa/server/src/workflows/quality-master/index.js +30 -0
- package/.medusa/server/src/workflows/quality-master/steps/create-quality.js +22 -0
- package/.medusa/server/src/workflows/quality-master/steps/delete-quality.js +20 -0
- package/.medusa/server/src/workflows/quality-master/steps/fetch-quality-master.js +54 -0
- package/.medusa/server/src/workflows/quality-master/steps/update-quality.js +37 -0
- package/.medusa/server/src/workflows/raw-master/create-or-update-raw-master.js +58 -0
- package/.medusa/server/src/workflows/raw-master/steps/delete-raw.js +9 -11
- package/.medusa/server/src/workflows/shape-master/create-or-update-shape-master.js +53 -0
- package/.medusa/server/src/workflows/shape-master/steps/delete-shape.js +9 -9
- package/.medusa/server/src/workflows/style-master/workflows/create-or-update-style-master.js +2 -2
- package/.medusa/server/src/workflows/tone-master/create-or-update-tone-master.js +52 -0
- package/.medusa/server/src/workflows/tone-master/index.js +30 -0
- package/.medusa/server/src/workflows/tone-master/steps/create-tone.js +22 -0
- package/.medusa/server/src/workflows/tone-master/steps/delete-tone.js +20 -0
- package/.medusa/server/src/workflows/tone-master/steps/fetch-tone-master.js +54 -0
- package/.medusa/server/src/workflows/tone-master/steps/update-tone.js +37 -0
- package/.medusa/server/src/workflows/update-extended-product-from-product/index.js +6 -8
- package/.medusa/server/src/workflows/update-extended-variant-from-variant/workflows/update-extended-variant-status-from-variant.js +9 -3
- package/package.json +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = processErpEvents;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const bulk_jobs_task_trigger_1 = require("../workflows/bulk-jobs-task-trigger");
|
|
7
|
+
const update_erp_event_1 = require("../workflows/erp-event/workflows/update-erp-event");
|
|
8
|
+
const config_1 = require("../api/erp/webhook/config");
|
|
9
|
+
const framework_1 = require("@medusajs/framework");
|
|
10
|
+
// ECS task configuration for different data types
|
|
11
|
+
const ECS_TASK_CONFIG = {
|
|
12
|
+
StyleMst: {
|
|
13
|
+
taskType: "erp-webhook-batch-processing",
|
|
14
|
+
batchSize: 200,
|
|
15
|
+
enabled: true,
|
|
16
|
+
},
|
|
17
|
+
PartyStyleMst: {
|
|
18
|
+
taskType: "erp-webhook-batch-processing",
|
|
19
|
+
batchSize: 200,
|
|
20
|
+
enabled: true,
|
|
21
|
+
},
|
|
22
|
+
Inward: {
|
|
23
|
+
taskType: "erp-webhook-batch-processing",
|
|
24
|
+
batchSize: 200,
|
|
25
|
+
enabled: true,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Triggers ECS task for StyleMst, PartyStyleMst, and Inward
|
|
30
|
+
*/
|
|
31
|
+
async function triggerEcsTask(container, datafor, operation, data, erpEventId) {
|
|
32
|
+
const taskConfig = ECS_TASK_CONFIG[datafor];
|
|
33
|
+
framework_1.logger.info(`🚀 Triggering ECS task for ${datafor} with ${data.length} items`);
|
|
34
|
+
try {
|
|
35
|
+
const { result } = await (0, bulk_jobs_task_trigger_1.bulkJobsTaskTriggerWorkflow)(container).run({
|
|
36
|
+
input: {
|
|
37
|
+
taskType: taskConfig.taskType,
|
|
38
|
+
parameters: {
|
|
39
|
+
batchSize: taskConfig.batchSize,
|
|
40
|
+
erpEventId,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
framework_1.logger.info(`✅ ECS task triggered successfully for ${datafor}: ${JSON.stringify(result)}`);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
framework_1.logger.error(`❌ Failed to trigger ECS task for ${datafor}:`, error);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Processes the webhook request by executing the appropriate workflow
|
|
53
|
+
*/
|
|
54
|
+
async function processWebhookRequest(container, datafor, operation, data, eventId) {
|
|
55
|
+
const workflowConfig = config_1.MASTER_WORKFLOW_CONFIG[datafor];
|
|
56
|
+
if (!workflowConfig) {
|
|
57
|
+
throw new Error(`Unsupported datafor type: ${datafor}`);
|
|
58
|
+
}
|
|
59
|
+
const workflowHandler = workflowConfig[operation];
|
|
60
|
+
if (!workflowHandler) {
|
|
61
|
+
throw new Error(`Unsupported operation: ${operation} for ${datafor}`);
|
|
62
|
+
}
|
|
63
|
+
const input = { datafor, operation, data, eventId };
|
|
64
|
+
await workflowHandler(container, input);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Processes pending ERP events one by one in the order they were received
|
|
68
|
+
*/
|
|
69
|
+
async function processErpEvents(container) {
|
|
70
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
71
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
72
|
+
try {
|
|
73
|
+
// First, get all in-progress events to know which datafor types are blocked
|
|
74
|
+
const allInProgressEvents = [];
|
|
75
|
+
let skip = 0;
|
|
76
|
+
const take = 100;
|
|
77
|
+
let hasMore = true;
|
|
78
|
+
while (hasMore) {
|
|
79
|
+
const { data: inProgressEvents } = await query.graph({
|
|
80
|
+
entity: "erp_event",
|
|
81
|
+
fields: ["id", "datafor"],
|
|
82
|
+
filters: {
|
|
83
|
+
status: "in-progress",
|
|
84
|
+
},
|
|
85
|
+
pagination: {
|
|
86
|
+
skip,
|
|
87
|
+
take,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
if (inProgressEvents.length === 0) {
|
|
91
|
+
hasMore = false;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
allInProgressEvents.push(...inProgressEvents);
|
|
95
|
+
skip += take;
|
|
96
|
+
// Safety check - in-progress events should be limited
|
|
97
|
+
if (skip > 1000) {
|
|
98
|
+
logger.warn("⚠️ Safety limit reached for in-progress events query");
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Get the set of datafor types that are currently in-progress
|
|
103
|
+
const blockedDataforTypes = new Set(allInProgressEvents.map((e) => e.datafor));
|
|
104
|
+
if (blockedDataforTypes.size > 0) {
|
|
105
|
+
logger.debug(`In-progress event types: ${Array.from(blockedDataforTypes).join(", ")}`);
|
|
106
|
+
}
|
|
107
|
+
// Get pending events ordered by created_at (FIFO)
|
|
108
|
+
const { data: pendingEvents } = await query.graph({
|
|
109
|
+
entity: "erp_event",
|
|
110
|
+
fields: ["id", "datafor", "operation", "data", "status", "created_at"],
|
|
111
|
+
filters: {
|
|
112
|
+
status: "pending",
|
|
113
|
+
},
|
|
114
|
+
pagination: {
|
|
115
|
+
skip: 0,
|
|
116
|
+
take: 100, // Get more to find one that's not blocked
|
|
117
|
+
order: { created_at: "asc" }, // Process oldest first
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
if (pendingEvents.length === 0) {
|
|
121
|
+
logger.debug("No pending ERP events to process");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Find the first pending event whose datafor type is not blocked
|
|
125
|
+
const event = pendingEvents.find((e) => !blockedDataforTypes.has(e.datafor));
|
|
126
|
+
if (!event) {
|
|
127
|
+
logger.debug(`All pending events are blocked by in-progress events of same type`);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const { id, datafor, operation, data } = event;
|
|
131
|
+
logger.info(`Processing ERP event ${id}: ${operation} for ${datafor} with ${data.length} items`);
|
|
132
|
+
// Update status to in-progress
|
|
133
|
+
await (0, update_erp_event_1.updateErpEventWorkflow)(container).run({
|
|
134
|
+
input: {
|
|
135
|
+
id,
|
|
136
|
+
status: "in-progress",
|
|
137
|
+
sync_completed_at: null,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
// Check if this is a data type that should use ECS processing
|
|
142
|
+
const shouldUseEcsProcessing = [
|
|
143
|
+
"StyleMst",
|
|
144
|
+
"PartyStyleMst",
|
|
145
|
+
"Inward",
|
|
146
|
+
].includes(datafor);
|
|
147
|
+
if (shouldUseEcsProcessing && data.length > 100) {
|
|
148
|
+
// Trigger ECS task for large batches
|
|
149
|
+
logger.info(`📋 Using ECS processing for ${datafor}`);
|
|
150
|
+
await triggerEcsTask(container, datafor, operation, data, id);
|
|
151
|
+
// Note: ECS task will update status to completed when done
|
|
152
|
+
// We don't update it here as the ECS task handles completion
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Use regular workflow processing
|
|
156
|
+
logger.info(`⚡ Using regular workflow processing for ${datafor}`);
|
|
157
|
+
await processWebhookRequest(container, datafor, operation, data, id);
|
|
158
|
+
// Update ERP event status to completed
|
|
159
|
+
await (0, update_erp_event_1.updateErpEventWorkflow)(container).run({
|
|
160
|
+
input: {
|
|
161
|
+
id,
|
|
162
|
+
status: "completed",
|
|
163
|
+
sync_completed_at: new Date(),
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
logger.info(`✅ Successfully processed ERP event ${id}`);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
171
|
+
// Check if the error indicates the event is already completed
|
|
172
|
+
if (errorMessage.includes("ERP event is already completed")) {
|
|
173
|
+
logger.info(`✅ ERP event ${id} is already completed (detected from error)`);
|
|
174
|
+
await (0, update_erp_event_1.updateErpEventWorkflow)(container).run({
|
|
175
|
+
input: {
|
|
176
|
+
id,
|
|
177
|
+
status: "completed",
|
|
178
|
+
sync_completed_at: new Date(),
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
logger.error(`❌ Failed to process ERP event ${id}:`, error);
|
|
184
|
+
// Update status to failed
|
|
185
|
+
await (0, update_erp_event_1.updateErpEventWorkflow)(container).run({
|
|
186
|
+
input: {
|
|
187
|
+
id,
|
|
188
|
+
status: "failed",
|
|
189
|
+
sync_completed_at: null,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
// Re-throw to allow retry on next run if needed
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
logger.error("Error in processErpEvents cron job:", error);
|
|
198
|
+
// Don't throw - allow the cron job to continue on next run
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.config = {
|
|
202
|
+
name: "process-erp-events",
|
|
203
|
+
schedule: "* * * * *", // Every minute
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1lcnAtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2pvYnMvcHJvY2Vzcy1lcnAtZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlHQSxtQ0FnTEM7QUFoUkQscURBQXNFO0FBQ3RFLGdGQUFrRjtBQUNsRix3RkFBMkY7QUFDM0Ysc0RBSW1DO0FBQ25DLG1EQUE2QztBQUU3QyxrREFBa0Q7QUFDbEQsTUFBTSxlQUFlLEdBQUc7SUFDdEIsUUFBUSxFQUFFO1FBQ1IsUUFBUSxFQUFFLDhCQUE4QjtRQUN4QyxTQUFTLEVBQUUsR0FBRztRQUNkLE9BQU8sRUFBRSxJQUFJO0tBQ2Q7SUFDRCxhQUFhLEVBQUU7UUFDYixRQUFRLEVBQUUsOEJBQThCO1FBQ3hDLFNBQVMsRUFBRSxHQUFHO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZDtJQUNELE1BQU0sRUFBRTtRQUNOLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsU0FBUyxFQUFFLEdBQUc7UUFDZCxPQUFPLEVBQUUsSUFBSTtLQUNkO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGNBQWMsQ0FDM0IsU0FBMEIsRUFDMUIsT0FBbUIsRUFDbkIsU0FBb0IsRUFDcEIsSUFBYyxFQUNkLFVBQWtCO0lBRWxCLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxPQUF1QyxDQUFDLENBQUM7SUFFNUUsa0JBQU0sQ0FBQyxJQUFJLENBQ1QsOEJBQThCLE9BQU8sU0FBUyxJQUFJLENBQUMsTUFBTSxRQUFRLENBQ2xFLENBQUM7SUFFRixJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLG9EQUEyQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNsRSxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2dCQUM3QixVQUFVLEVBQUU7b0JBQ1YsU0FBUyxFQUFFLFVB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
|