@legenki/print2medusa 0.9.4 → 0.9.5
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/hooks/printful/[token]/route.js +21 -14
- package/.medusa/server/src/modules/printful/service.js +36 -12
- package/.medusa/server/src/subscribers/printful-webhook.js +25 -0
- package/.medusa/server/src/utils/webhook-events.js +9 -2
- package/.medusa/server/src/workflows/sync-products.js +364 -267
- package/package.json +1 -1
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.POST = POST;
|
|
7
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
8
5
|
const printful_1 = require("../../../../modules/printful");
|
|
9
6
|
const webhook_events_1 = require("../../../../utils/webhook-events");
|
|
10
|
-
const
|
|
7
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
11
8
|
/**
|
|
12
9
|
* Public Printful webhook endpoint.
|
|
13
10
|
*
|
|
@@ -65,16 +62,26 @@ async function POST(req, res) {
|
|
|
65
62
|
res.status(200).json({ received: true, event_id: eventId, duplicate: true });
|
|
66
63
|
return;
|
|
67
64
|
}
|
|
68
|
-
res.status(200).json({ received: true, event_id: eventId });
|
|
69
65
|
if (handled) {
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
66
|
+
// Emitted before the response, not after. Emitting afterwards means a
|
|
67
|
+
// failure here — an unresolvable Event Bus, a broken transport — throws
|
|
68
|
+
// with the 200 already sent: an unhandled rejection Printful reads as
|
|
69
|
+
// success, and the event waits for the retry job with nothing logged.
|
|
70
|
+
//
|
|
71
|
+
// Failing to emit is not failing the webhook, though. The durable row is
|
|
72
|
+
// already written and the retry job picks it up, so this logs and still
|
|
73
|
+
// answers 200 rather than asking Printful to redeliver an event we hold.
|
|
74
|
+
try {
|
|
75
|
+
const eventBus = req.scope.resolve(utils_2.Modules.EVENT_BUS);
|
|
76
|
+
await eventBus.emit({
|
|
77
|
+
name: webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED,
|
|
78
|
+
data: { event_row_id: event.id },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger.error(`Printful: could not emit ${webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED} for event ${eventId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
+
}
|
|
78
84
|
}
|
|
85
|
+
res.status(200).json({ received: true, event_id: eventId });
|
|
79
86
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2hvb2tzL3ByaW50ZnVsL1t0b2tlbl0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsb0JBeUZDO0FBL0dELHFEQUFxRTtBQUNyRSwyREFBOEQ7QUFFOUQscUVBUXlDO0FBQ3pDLHFEQUFtRDtBQUduRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxRQUFRLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUMxRSxNQUFNLE1BQU0sR0FBcUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2hFLGlDQUF5QixDQUFDLE1BQU0sQ0FDakMsQ0FBQTtJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRTNDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO0lBQ2pDLElBQUksQ0FBQyxJQUFBLG1DQUFrQixFQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxzREFBc0Q7UUFDdEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUM5QyxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQTJCLENBQUE7SUFDMUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUE7SUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBQSwrQkFBYyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRS9DLElBQUksQ0FBQyxlQUFlLEVB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
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MAX_WEBHOOK_ATTEMPTS = exports.PENDING_PRINTFUL_ORDER_ID = void 0;
|
|
6
|
+
exports.MAX_WEBHOOK_ATTEMPTS = exports.MIN_WEBHOOK_SECRET_LENGTH = exports.PENDING_PRINTFUL_ORDER_ID = void 0;
|
|
7
7
|
exports.nextRetryDelayMs = nextRetryDelayMs;
|
|
8
8
|
exports.lockKeyFor = lockKeyFor;
|
|
9
9
|
exports.isUniqueViolation = isUniqueViolation;
|
|
@@ -23,6 +23,13 @@ const printful_webhook_event_1 = __importDefault(require("./models/printful-webh
|
|
|
23
23
|
* the concurrent-claim race; tests/order-link.test.ts guards the pairing.
|
|
24
24
|
*/
|
|
25
25
|
exports.PENDING_PRINTFUL_ORDER_ID = "pending";
|
|
26
|
+
/**
|
|
27
|
+
* Shortest webhook secret the module will start with.
|
|
28
|
+
*
|
|
29
|
+
* The secret is the sole authentication for the public webhook endpoint, so
|
|
30
|
+
* its length is what stands between a stranger and forged shipment events.
|
|
31
|
+
*/
|
|
32
|
+
exports.MIN_WEBHOOK_SECRET_LENGTH = 32;
|
|
26
33
|
/** Attempts before an event is parked as permanently failed. */
|
|
27
34
|
exports.MAX_WEBHOOK_ATTEMPTS = 20;
|
|
28
35
|
/** Backoff: 5 minutes doubling per attempt, capped at 6 hours. */
|
|
@@ -32,19 +39,21 @@ function nextRetryDelayMs(attempts) {
|
|
|
32
39
|
return Math.min(FIVE_MINUTES * Math.pow(2, attempts), SIX_HOURS);
|
|
33
40
|
}
|
|
34
41
|
/**
|
|
35
|
-
* Stable
|
|
42
|
+
* Stable 64-bit key for pg_advisory_xact_lock, derived from the order id.
|
|
36
43
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
44
|
+
* Returned as two signed 32-bit halves because that is the shape the
|
|
45
|
+
* two-argument form takes — `pg_advisory_xact_lock(int4, int4)` — and
|
|
46
|
+
* readInt32BE yields exactly that width. The order id itself never reaches
|
|
47
|
+
* SQL; only these two numbers do, as bind parameters.
|
|
40
48
|
*
|
|
41
|
-
* 32 bits
|
|
42
|
-
*
|
|
43
|
-
*
|
|
49
|
+
* The single-argument form was 32 bits, where distinct orders collided at
|
|
50
|
+
* roughly 2 per 200k ids. A collision only serialized two unrelated orders,
|
|
51
|
+
* which is slower rather than wrong — but 64 bits makes it not worth thinking
|
|
52
|
+
* about, for one extra bind parameter.
|
|
44
53
|
*/
|
|
45
54
|
function lockKeyFor(printfulOrderId) {
|
|
46
55
|
const digest = (0, crypto_1.createHash)("sha256").update(String(printfulOrderId)).digest();
|
|
47
|
-
return digest.readInt32BE(0);
|
|
56
|
+
return [digest.readInt32BE(0), digest.readInt32BE(4)];
|
|
48
57
|
}
|
|
49
58
|
/**
|
|
50
59
|
* Detect a Postgres unique-constraint violation (SQLSTATE 23505) regardless of
|
|
@@ -94,6 +103,21 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
94
103
|
super(...arguments);
|
|
95
104
|
this.client_ = null;
|
|
96
105
|
this.options_ = options ?? {};
|
|
106
|
+
// The secret is the whole authentication for the public webhook endpoint:
|
|
107
|
+
// it sits in the URL path and anyone who guesses it can post forged
|
|
108
|
+
// shipment events. Verification is already constant-time, so length is
|
|
109
|
+
// what remains — 32 characters puts brute force out of reach.
|
|
110
|
+
//
|
|
111
|
+
// Refused at construction rather than at the first request. A too-short
|
|
112
|
+
// secret is a misconfiguration, and failing at boot surfaces it while
|
|
113
|
+
// someone is watching, instead of leaving a weak endpoint live.
|
|
114
|
+
//
|
|
115
|
+
// Only checked when set: the option is optional, and a deployment that
|
|
116
|
+
// never registers a webhook is entitled to omit it.
|
|
117
|
+
const secret = this.options_.webhookSecret;
|
|
118
|
+
if (secret !== undefined && secret.length < exports.MIN_WEBHOOK_SECRET_LENGTH) {
|
|
119
|
+
throw new Error(`Printful webhookSecret must be at least ${exports.MIN_WEBHOOK_SECRET_LENGTH} characters (got ${secret.length}).`);
|
|
120
|
+
}
|
|
97
121
|
}
|
|
98
122
|
async getOptions() {
|
|
99
123
|
return this.options_;
|
|
@@ -206,9 +230,9 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
206
230
|
* pg_advisory_xact_lock is released by Postgres on commit or rollback.
|
|
207
231
|
*/
|
|
208
232
|
async withOrderLock(printfulOrderId, fn) {
|
|
209
|
-
const
|
|
233
|
+
const keys = lockKeyFor(printfulOrderId);
|
|
210
234
|
return this.baseRepository_.transaction(async (txManager) => {
|
|
211
|
-
await txManager.execute("select pg_advisory_xact_lock(?)",
|
|
235
|
+
await txManager.execute("select pg_advisory_xact_lock(?, ?)", keys);
|
|
212
236
|
return await fn();
|
|
213
237
|
});
|
|
214
238
|
}
|
|
@@ -347,4 +371,4 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
347
371
|
}
|
|
348
372
|
}
|
|
349
373
|
exports.default = PrintfulModuleService;
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50ZnVsL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZ0RBLDRDQUlDO0FBYUQsZ0NBR0M7QUFpQkQsOENBMkJDO0FBaEhELHFEQUF5RDtBQUN6RCxtQ0FBbUM7QUFDbkMsaUVBQTREO0FBRTVELHVGQUE0RDtBQUM1RCwyRkFBZ0U7QUFDaEUsbUZBQXdEO0FBQ3hELDJGQUFnRTtBQUNoRSw2RkFBa0U7QUEyQmxFOzs7Ozs7R0FNRztBQUNVLFFBQUEseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0FBRWxELGdFQUFnRTtBQUNuRCxRQUFBLG9CQUFvQixHQUFHLEVBQUUsQ0FBQTtBQUV0QyxrRUFBa0U7QUFDbEUsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7SUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDbEUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixVQUFVLENBQUMsZUFBdUI7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUM1RSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsR0FB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
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50ZnVsL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBd0RBLDRDQUlDO0FBZUQsZ0NBR0M7QUFpQkQsOENBMkJDO0FBMUhELHFEQUF5RDtBQUN6RCxtQ0FBbUM7QUFDbkMsaUVBQTREO0FBRTVELHVGQUE0RDtBQUM1RCwyRkFBZ0U7QUFDaEUsbUZBQXdEO0FBQ3hELDJGQUFnRTtBQUNoRSw2RkFBa0U7QUEyQmxFOzs7Ozs7R0FNRztBQUNVLFFBQUEseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0FBRWxEOzs7OztHQUtHO0FBQ1UsUUFBQSx5QkFBeUIsR0FBRyxFQUFFLENBQUE7QUFFM0MsZ0VBQWdFO0FBQ25ELFFBQUEsb0JBQW9CLEdBQUcsRUFBRSxDQUFBO0FBRXRDLGtFQUFrRTtBQUNsRSxTQUFnQixnQkFBZ0IsQ0FBQyxRQUFnQjtJQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtJQUNsQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7SUFDcEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLGVBQXVCO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDNUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxD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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = printfulWebhookReceivedHandler;
|
|
8
|
+
const apply_order_status_1 = __importDefault(require("../workflows/apply-order-status"));
|
|
9
|
+
const webhook_events_1 = require("../utils/webhook-events");
|
|
10
|
+
async function printfulWebhookReceivedHandler({ event: { data }, container, }) {
|
|
11
|
+
const logger = container.resolve("logger");
|
|
12
|
+
try {
|
|
13
|
+
await (0, apply_order_status_1.default)(container).run({
|
|
14
|
+
input: { event_row_id: data.event_row_id },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
logger.error(`Printful: apply failed for event_row_id ${data.event_row_id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.config = {
|
|
23
|
+
event: webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtd2ViaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wcmludGZ1bC13ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLGlEQWlCQztBQXBCRCx5RkFBc0U7QUFDdEUsNERBQW1FO0FBRXBELEtBQUssVUFBVSw4QkFBOEIsQ0FBQyxFQUMzRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBQ2dDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFBLDRCQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtTQUMzQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQ1YsMkNBQTJDLElBQUksQ0FBQyxZQUFZLEtBQzFELEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2pELEVBQUUsQ0FDSCxDQUFBO1FBQ0QsTUFBTSxHQUFHLENBQUE7SUFDWCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsMENBQXlCO0NBQ2pDLENBQUEifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PRINTFUL_WEBHOOK_TYPES = void 0;
|
|
3
|
+
exports.PRINTFUL_WEBHOOK_TYPES = exports.PRINTFUL_WEBHOOK_RECEIVED = void 0;
|
|
4
4
|
exports.verifyWebhookToken = verifyWebhookToken;
|
|
5
5
|
exports.payloadFingerprint = payloadFingerprint;
|
|
6
6
|
exports.extractOrderId = extractOrderId;
|
|
@@ -23,6 +23,13 @@ function verifyWebhookToken(configured, provided) {
|
|
|
23
23
|
const b = (0, crypto_1.createHash)("sha256").update(provided).digest();
|
|
24
24
|
return (0, crypto_1.timingSafeEqual)(a, b);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The internal Medusa event the webhook route emits and the subscriber listens
|
|
28
|
+
* for. Shared so the two cannot drift apart — a typo on either side would be
|
|
29
|
+
* silent: the route would answer 200, the subscriber would never fire, and the
|
|
30
|
+
* event would only be applied by the retry job.
|
|
31
|
+
*/
|
|
32
|
+
exports.PRINTFUL_WEBHOOK_RECEIVED = "printful.webhook.received";
|
|
26
33
|
/** Event types we register with Printful. order_updated is noisy and opt-in. */
|
|
27
34
|
exports.PRINTFUL_WEBHOOK_TYPES = [
|
|
28
35
|
"package_shipped",
|
|
@@ -114,4 +121,4 @@ function deriveEventId(payload) {
|
|
|
114
121
|
.update(`${type}|${orderId}|${discriminator}|${timeKey}`)
|
|
115
122
|
.digest("hex");
|
|
116
123
|
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvd2ViaG9vay1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsZ0RBYUM7QUF3REQsZ0RBRUM7QUFFRCx3Q0FHQztBQUVELDhDQVNDO0FBaUJELHNDQWlDQztBQWhKRCxtQ0FBb0Q7QUFFcEQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxVQUFxQyxFQUNyQyxRQUFtQztJQUVuQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUMxRCxNQUFNLENBQUMsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3hELE9BQU8sSUFBQSx3QkFBZSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDVSxRQUFBLHlCQUF5QixHQUFHLDJCQUEyQixDQUFBO0FBRXBFLGdGQUFnRjtBQUNuRSxRQUFBLHNCQUFzQixHQUFHO0lBQ3BDLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtDQUNWLENBQUE7QUFVVjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7QUFFbEMsZ0ZBQWdGO0FBQ2hGLFNBQVMsWUFB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
|
|
@@ -13,22 +13,12 @@ const stock_1 = require("../utils/stock");
|
|
|
13
13
|
const removed_1 = require("../utils/removed");
|
|
14
14
|
const design_1 = require("../utils/design");
|
|
15
15
|
const bundle_1 = require("../utils/bundle");
|
|
16
|
-
const
|
|
17
|
-
name: "printful-
|
|
18
|
-
// Runs past the HTTP response and completes on its own — no
|
|
19
|
-
// setStepSuccess needed, which is what backgroundExecution adds to async.
|
|
16
|
+
const fetchPrintfulProductsStep = (0, workflows_sdk_1.createStep)({
|
|
17
|
+
name: "printful-fetch-products",
|
|
20
18
|
async: true,
|
|
21
19
|
backgroundExecution: true,
|
|
22
|
-
// No timeout on purpose. Medusa schedules one only when the step sets it
|
|
23
|
-
// (TransactionStep.hasTimeout() returns !!definition.timeout, and
|
|
24
|
-
// transaction-orchestrator.js:637 guards on it), so omitting it is the
|
|
25
|
-
// safe state. Any value we picked could be exceeded by a large enough
|
|
26
|
-
// catalog, and the penalty is a SUCCESSFUL sync being reverted — deleting
|
|
27
|
-
// the orphans it was about to link.
|
|
28
20
|
}, async (input, { container }) => {
|
|
29
21
|
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
30
|
-
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
31
|
-
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
32
22
|
const client = await printful.getClient();
|
|
33
23
|
const options = await printful.getOptions();
|
|
34
24
|
const storeId = await printful.getStoreId();
|
|
@@ -36,49 +26,85 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
36
26
|
limit: 100,
|
|
37
27
|
});
|
|
38
28
|
const toProcess = input.limit != null ? summaries.slice(0, input.limit) : summaries;
|
|
39
|
-
const counters = {
|
|
40
|
-
created: 0,
|
|
41
|
-
updated: 0,
|
|
42
|
-
failed: 0,
|
|
43
|
-
errors: [],
|
|
44
|
-
};
|
|
45
|
-
// Products created but not yet linked. A crash leaves exactly these
|
|
46
|
-
// invisible to the next sync's findProductLink, so they are the only
|
|
47
|
-
// thing the compensation may delete.
|
|
48
|
-
const orphans = new orphans_1.OrphanTracker();
|
|
49
|
-
// One cache for the whole run, not one per product, so a blank two
|
|
50
|
-
// products share costs a single call across the catalogue. Inside a
|
|
51
|
-
// product it is what keeps a 756-variant tee at 84 calls instead of 756.
|
|
52
|
-
const catalogCache = new design_1.CatalogVariantCache((id) => client.getCatalogVariant(id));
|
|
53
|
-
let processed = 0;
|
|
54
29
|
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
55
30
|
products_total: toProcess.length,
|
|
56
31
|
});
|
|
32
|
+
const detailsMap = new Map();
|
|
33
|
+
let processed = 0;
|
|
34
|
+
const errors = [];
|
|
35
|
+
let failed = 0;
|
|
57
36
|
for (const summary of toProcess) {
|
|
58
37
|
if (summary.is_ignored) {
|
|
59
38
|
continue;
|
|
60
39
|
}
|
|
61
|
-
// Scoped to this iteration so the catch below knows which product, if
|
|
62
|
-
// any, this pass created. Set the moment the product exists in Medusa
|
|
63
|
-
// and cleared once its link row is written.
|
|
64
|
-
let pendingProductId;
|
|
65
40
|
try {
|
|
66
41
|
const detail = await client.getSyncProduct(summary.id);
|
|
67
42
|
if (!detail.sync_variants?.length) {
|
|
68
|
-
|
|
69
|
-
|
|
43
|
+
failed += 1;
|
|
44
|
+
errors.push(`Product ${summary.id} has no variants`);
|
|
70
45
|
continue;
|
|
71
46
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
47
|
+
detailsMap.set(String(summary.id), detail);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
failed += 1;
|
|
51
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
+
errors.push(`Product ${summary.id}: ${message}`);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
processed += 1;
|
|
56
|
+
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
57
|
+
products_processed: processed,
|
|
58
|
+
products_total: toProcess.length,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return new workflows_sdk_1.StepResponse({
|
|
63
|
+
toProcess,
|
|
64
|
+
details: Array.from(detailsMap.entries()),
|
|
65
|
+
options,
|
|
66
|
+
storeId,
|
|
67
|
+
initialCounters: {
|
|
68
|
+
created: 0,
|
|
69
|
+
updated: 0,
|
|
70
|
+
failed,
|
|
71
|
+
errors,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
const mapToMedusaProductsStep = (0, workflows_sdk_1.createStep)({
|
|
76
|
+
name: "printful-map-products",
|
|
77
|
+
async: true,
|
|
78
|
+
backgroundExecution: true,
|
|
79
|
+
}, async (input, { container }) => {
|
|
80
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
81
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
82
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
83
|
+
const client = await printful.getClient();
|
|
84
|
+
const counters = {
|
|
85
|
+
created: input.initialCounters.created,
|
|
86
|
+
updated: input.initialCounters.updated,
|
|
87
|
+
failed: input.initialCounters.failed,
|
|
88
|
+
errors: [...input.initialCounters.errors],
|
|
89
|
+
};
|
|
90
|
+
const detailsMap = new Map(input.details);
|
|
91
|
+
const catalogCache = new design_1.CatalogVariantCache((id) => client.getCatalogVariant(id));
|
|
92
|
+
const productsToCreate = [];
|
|
93
|
+
const productsToUpdate = [];
|
|
94
|
+
const variantsToCreate = [];
|
|
95
|
+
const variantsToUpdate = [];
|
|
96
|
+
const linksToCreate = [];
|
|
97
|
+
const linksToUpdate = [];
|
|
98
|
+
const reconcileItems = [];
|
|
99
|
+
let processed = 0;
|
|
100
|
+
for (const summary of input.toProcess) {
|
|
101
|
+
if (summary.is_ignored)
|
|
102
|
+
continue;
|
|
103
|
+
const detail = detailsMap.get(String(summary.id));
|
|
104
|
+
if (!detail)
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
const mapped = (0, mappers_1.mapSyncProductToMedusa)(detail, input.options);
|
|
82
108
|
mapped.variants = await (0, design_1.enrichVariantsWithDesign)(mapped.variants, detail.sync_variants, {
|
|
83
109
|
syncProductId: String(summary.id),
|
|
84
110
|
getCatalogVariant: (id) => client.getCatalogVariant(id),
|
|
@@ -87,10 +113,6 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
87
113
|
const existingLink = await printful.findProductLink(String(summary.id));
|
|
88
114
|
if (existingLink?.medusa_product_id) {
|
|
89
115
|
const productId = existingLink.medusa_product_id;
|
|
90
|
-
// Retrieved before the update so the current status and metadata are
|
|
91
|
-
// the merchant's, not ours. `mapped.status` is derived from Printful
|
|
92
|
-
// stock alone; writing it directly is what republished a product the
|
|
93
|
-
// merchant had deliberately drafted.
|
|
94
116
|
const product = await productModule.retrieveProduct(productId, {
|
|
95
117
|
relations: ["variants"],
|
|
96
118
|
});
|
|
@@ -100,76 +122,52 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
100
122
|
currentMetadata: (product.metadata ?? {}),
|
|
101
123
|
mappedMetadata: mapped.metadata,
|
|
102
124
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
125
|
+
productsToUpdate.push({
|
|
126
|
+
productId,
|
|
127
|
+
data: {
|
|
128
|
+
title: mapped.title,
|
|
129
|
+
thumbnail: mapped.thumbnail,
|
|
130
|
+
metadata: publication.metadata,
|
|
131
|
+
status: publication.status,
|
|
132
|
+
},
|
|
109
133
|
});
|
|
110
|
-
// Upsert variants so price/assortment changes in Printful reach Medusa.
|
|
111
134
|
const { toCreate, toUpdate } = (0, mappers_1.diffVariantsForUpsert)(mapped.variants, (product.variants ?? []).map((pv) => ({
|
|
112
135
|
id: pv.id,
|
|
113
136
|
metadata: pv.metadata,
|
|
114
137
|
})));
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
prices: u.prices,
|
|
122
|
-
metadata: u.metadata,
|
|
123
|
-
})),
|
|
124
|
-
},
|
|
138
|
+
for (const u of toUpdate) {
|
|
139
|
+
variantsToUpdate.push({
|
|
140
|
+
id: u.id,
|
|
141
|
+
title: u.title,
|
|
142
|
+
prices: u.prices,
|
|
143
|
+
metadata: u.metadata,
|
|
125
144
|
});
|
|
126
145
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
manage_inventory: c.manage_inventory,
|
|
138
|
-
allow_backorder: c.allow_backorder,
|
|
139
|
-
})),
|
|
140
|
-
},
|
|
146
|
+
for (const c of toCreate) {
|
|
147
|
+
variantsToCreate.push({
|
|
148
|
+
product_id: productId,
|
|
149
|
+
title: c.title,
|
|
150
|
+
sku: c.sku,
|
|
151
|
+
options: c.options,
|
|
152
|
+
prices: c.prices,
|
|
153
|
+
metadata: c.metadata,
|
|
154
|
+
manage_inventory: c.manage_inventory,
|
|
155
|
+
allow_backorder: c.allow_backorder,
|
|
141
156
|
});
|
|
142
|
-
// No link loop here: the reconcile below re-reads the product, so
|
|
143
|
-
// these new variants are in its scope and get linked there.
|
|
144
157
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// The refresh-only loop this replaces could never repair a link row
|
|
150
|
-
// that failed to write, because `diffVariantsForUpsert` matches on
|
|
151
|
-
// variant metadata rather than link rows — so the variant looked
|
|
152
|
-
// already-synced and its row was never written again.
|
|
153
|
-
const linked = await productModule.retrieveProduct(productId, {
|
|
154
|
-
relations: ["variants"],
|
|
158
|
+
linksToUpdate.push({
|
|
159
|
+
linkId: existingLink.id,
|
|
160
|
+
syncProductId: String(summary.id),
|
|
161
|
+
medusaProductId: productId,
|
|
155
162
|
});
|
|
156
|
-
|
|
157
|
-
storeId,
|
|
163
|
+
reconcileItems.push({
|
|
158
164
|
syncProductId: String(summary.id),
|
|
165
|
+
medusaProductId: productId,
|
|
159
166
|
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
160
|
-
|
|
161
|
-
id: pv.id,
|
|
162
|
-
metadata: pv.metadata,
|
|
163
|
-
})),
|
|
164
|
-
});
|
|
165
|
-
await printful.updatePrintfulProductLinks({
|
|
166
|
-
id: existingLink.id,
|
|
167
|
-
last_synced_at: new Date(),
|
|
167
|
+
isCreate: false,
|
|
168
168
|
});
|
|
169
|
-
counters.updated += 1;
|
|
170
169
|
}
|
|
171
170
|
else {
|
|
172
|
-
// Ensure unique handle if collision
|
|
173
171
|
let handle = mapped.handle;
|
|
174
172
|
try {
|
|
175
173
|
const existing = await productModule.listProducts({ handle: [handle] }, { take: 1 });
|
|
@@ -178,11 +176,8 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
catch {
|
|
181
|
-
// ignore
|
|
179
|
+
// ignore
|
|
182
180
|
}
|
|
183
|
-
// A product created already sold out is drafted by the mapper, but
|
|
184
|
-
// the mapper writes no marker — so without this the restock path
|
|
185
|
-
// would read it as a merchant's own draft and never republish it.
|
|
186
181
|
const createStock = (0, stock_1.planStockActions)(detail.sync_variants);
|
|
187
182
|
const createMetadata = {
|
|
188
183
|
...mapped.metadata,
|
|
@@ -190,152 +185,226 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
190
185
|
? { [stock_1.STOCK_MARKER_KEY]: "unavailable" }
|
|
191
186
|
: {}),
|
|
192
187
|
};
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
})),
|
|
212
|
-
metadata: createMetadata,
|
|
213
|
-
external_id: mapped.external_id,
|
|
214
|
-
},
|
|
215
|
-
],
|
|
216
|
-
},
|
|
217
|
-
});
|
|
218
|
-
const created = result[0];
|
|
219
|
-
orphans.track(created.id);
|
|
220
|
-
pendingProductId = created.id;
|
|
221
|
-
await printful.createPrintfulProductLinks({
|
|
222
|
-
printful_store_id: storeId,
|
|
223
|
-
printful_sync_product_id: String(summary.id),
|
|
224
|
-
medusa_product_id: created.id,
|
|
225
|
-
last_synced_at: new Date(),
|
|
188
|
+
productsToCreate.push({
|
|
189
|
+
title: mapped.title,
|
|
190
|
+
handle,
|
|
191
|
+
status: mapped.status,
|
|
192
|
+
thumbnail: mapped.thumbnail,
|
|
193
|
+
images: mapped.images,
|
|
194
|
+
options: mapped.options,
|
|
195
|
+
variants: mapped.variants.map((v) => ({
|
|
196
|
+
title: v.title,
|
|
197
|
+
sku: v.sku,
|
|
198
|
+
options: v.options,
|
|
199
|
+
prices: v.prices,
|
|
200
|
+
metadata: v.metadata,
|
|
201
|
+
manage_inventory: v.manage_inventory,
|
|
202
|
+
allow_backorder: v.allow_backorder,
|
|
203
|
+
})),
|
|
204
|
+
metadata: createMetadata,
|
|
205
|
+
external_id: mapped.external_id,
|
|
226
206
|
});
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
pendingProductId = undefined;
|
|
230
|
-
// Resumable rather than best-effort: a throw here used to abandon
|
|
231
|
-
// every remaining variant, and because the product link row above
|
|
232
|
-
// already exists, the next sync took the update path and never went
|
|
233
|
-
// back for them. Now one unwritable row costs only that row, and the
|
|
234
|
-
// next sync's reconcile picks it up.
|
|
235
|
-
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
236
|
-
storeId,
|
|
207
|
+
linksToCreate.push({ syncProductId: String(summary.id) });
|
|
208
|
+
reconcileItems.push({
|
|
237
209
|
syncProductId: String(summary.id),
|
|
238
210
|
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
239
|
-
|
|
240
|
-
id: variant.id,
|
|
241
|
-
metadata: variant.metadata,
|
|
242
|
-
})),
|
|
211
|
+
isCreate: true,
|
|
243
212
|
});
|
|
244
|
-
counters.created += 1;
|
|
245
213
|
}
|
|
246
214
|
}
|
|
247
215
|
catch (err) {
|
|
248
216
|
counters.failed += 1;
|
|
249
217
|
const message = err instanceof Error ? err.message : String(err);
|
|
250
218
|
counters.errors.push(`Product ${summary.id}: ${message}`);
|
|
251
|
-
// The product was created but its link write never landed. The loop
|
|
252
|
-
// continues and the step still SUCCEEDS, so compensation — which runs
|
|
253
|
-
// only on step failure — will never see this. Left alone it is a
|
|
254
|
-
// product stranded in Medusa with no link row: invisible to the next
|
|
255
|
-
// sync's findProductLink, which duplicates it.
|
|
256
|
-
if (pendingProductId) {
|
|
257
|
-
const orphanId = pendingProductId;
|
|
258
|
-
try {
|
|
259
|
-
await productModule.deleteProducts([orphanId]);
|
|
260
|
-
// Released only after a delete that actually happened, so a
|
|
261
|
-
// failure here still leaves it for the compensation to retry.
|
|
262
|
-
orphans.release(orphanId);
|
|
263
|
-
}
|
|
264
|
-
catch (deleteErr) {
|
|
265
|
-
// Must not mask the original error — that is what gets reported.
|
|
266
|
-
logger.error(`Printful sync: could not delete orphaned product ${orphanId} after a failed link write: ${deleteErr instanceof Error
|
|
267
|
-
? deleteErr.message
|
|
268
|
-
: String(deleteErr)}`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
219
|
}
|
|
272
220
|
finally {
|
|
273
|
-
pendingProductId = undefined;
|
|
274
|
-
// In `finally` so it runs however the product exited — success, an
|
|
275
|
-
// early `continue`, or a throw. The heartbeat is what keeps the claim
|
|
276
|
-
// from being reaped, so a catalog of failures must not starve it.
|
|
277
221
|
processed += 1;
|
|
278
222
|
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
279
223
|
products_processed: processed,
|
|
280
|
-
products_total: toProcess.length,
|
|
224
|
+
products_total: input.toProcess.length,
|
|
281
225
|
});
|
|
282
226
|
}
|
|
283
227
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
228
|
+
logger.info(`Printful sync: ${catalogCache.calls} catalog variant call(s) for design parameters`);
|
|
229
|
+
return new workflows_sdk_1.StepResponse({
|
|
230
|
+
productsToCreate,
|
|
231
|
+
productsToUpdate,
|
|
232
|
+
variantsToCreate,
|
|
233
|
+
variantsToUpdate,
|
|
234
|
+
linksToCreate,
|
|
235
|
+
linksToUpdate,
|
|
236
|
+
reconcileItems,
|
|
237
|
+
counters,
|
|
238
|
+
catalogCacheCalls: catalogCache.calls,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
const updateMedusaProductsStep = (0, workflows_sdk_1.createStep)("printful-update-medusa-products", async (productsToUpdate, { container }) => {
|
|
242
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
243
|
+
for (const update of productsToUpdate) {
|
|
244
|
+
await productModule.updateProducts(update.productId, update.data);
|
|
245
|
+
}
|
|
246
|
+
return new workflows_sdk_1.StepResponse(null);
|
|
247
|
+
});
|
|
248
|
+
const syncLinksStep = (0, workflows_sdk_1.createStep)("printful-sync-links", async (input, { container }) => {
|
|
249
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
250
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
251
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
252
|
+
const counters = {
|
|
253
|
+
created: input.counters.created,
|
|
254
|
+
updated: input.counters.updated,
|
|
255
|
+
failed: input.counters.failed,
|
|
256
|
+
errors: [...input.counters.errors],
|
|
257
|
+
};
|
|
258
|
+
const orphans = new orphans_1.OrphanTracker();
|
|
259
|
+
const createdBySyncId = new Map();
|
|
260
|
+
if (input.createdProducts && Array.isArray(input.createdProducts)) {
|
|
261
|
+
for (const cp of input.createdProducts) {
|
|
262
|
+
if (cp.external_id) {
|
|
263
|
+
createdBySyncId.set(cp.external_id, cp);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const lc of input.linksToCreate) {
|
|
268
|
+
const created = createdBySyncId.get(lc.syncProductId);
|
|
269
|
+
if (!created) {
|
|
270
|
+
counters.failed += 1;
|
|
271
|
+
counters.errors.push(`Product ${lc.syncProductId} created but not found in output`);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
orphans.track(created.id);
|
|
275
|
+
try {
|
|
276
|
+
await printful.createPrintfulProductLinks({
|
|
277
|
+
printful_store_id: input.storeId,
|
|
278
|
+
printful_sync_product_id: lc.syncProductId,
|
|
279
|
+
medusa_product_id: created.id,
|
|
280
|
+
last_synced_at: new Date(),
|
|
281
|
+
});
|
|
282
|
+
orphans.release(created.id);
|
|
283
|
+
counters.created += 1;
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
counters.failed += 1;
|
|
287
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
288
|
+
counters.errors.push(`Product ${lc.syncProductId}: ${message}`);
|
|
291
289
|
try {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
290
|
+
await productModule.deleteProducts([created.id]);
|
|
291
|
+
orphans.release(created.id);
|
|
292
|
+
}
|
|
293
|
+
catch (deleteErr) {
|
|
294
|
+
logger.error(`Printful sync: could not delete orphaned product ${created.id} after a failed link write: ${deleteErr instanceof Error ? deleteErr.message : String(deleteErr)}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
for (const lu of input.linksToUpdate) {
|
|
299
|
+
try {
|
|
300
|
+
await printful.updatePrintfulProductLinks({
|
|
301
|
+
id: lu.linkId,
|
|
302
|
+
last_synced_at: new Date(),
|
|
303
|
+
});
|
|
304
|
+
counters.updated += 1;
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
counters.failed += 1;
|
|
308
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
309
|
+
counters.errors.push(`Product update link ${lu.syncProductId}: ${message}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
for (const item of input.reconcileItems) {
|
|
313
|
+
try {
|
|
314
|
+
const medusaProductId = item.isCreate
|
|
315
|
+
? createdBySyncId.get(item.syncProductId)?.id
|
|
316
|
+
: item.medusaProductId;
|
|
317
|
+
if (!medusaProductId)
|
|
318
|
+
continue;
|
|
319
|
+
const linked = await productModule.retrieveProduct(medusaProductId, {
|
|
320
|
+
relations: ["variants"],
|
|
321
|
+
});
|
|
322
|
+
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
323
|
+
storeId: input.storeId,
|
|
324
|
+
syncProductId: item.syncProductId,
|
|
325
|
+
syncVariantIds: item.syncVariantIds,
|
|
326
|
+
medusaVariants: (linked.variants ?? []).map((pv) => ({
|
|
327
|
+
id: pv.id,
|
|
328
|
+
metadata: pv.metadata,
|
|
329
|
+
})),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
334
|
+
logger.error(`Failed to reconcile variant links for ${item.syncProductId}: ${message}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return new workflows_sdk_1.StepResponse({ counters, orphanProductIds: orphans.toDelete() }, { orphanProductIds: orphans.toDelete() });
|
|
338
|
+
}, async (compensateInput, { container }) => {
|
|
339
|
+
if (!compensateInput?.orphanProductIds?.length) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
343
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
344
|
+
for (const id of compensateInput.orphanProductIds) {
|
|
345
|
+
try {
|
|
346
|
+
await productModule.deleteProducts([id]);
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
logger.error(`Printful sync rollback: could not delete orphaned product ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
logger.info(`Printful sync rolled back ${compensateInput.orphanProductIds.length} orphaned product(s)`);
|
|
353
|
+
});
|
|
354
|
+
const removalsAndBundlesStep = (0, workflows_sdk_1.createStep)({
|
|
355
|
+
name: "printful-removals-bundles",
|
|
356
|
+
async: true,
|
|
357
|
+
backgroundExecution: true,
|
|
358
|
+
}, async (input, { container }) => {
|
|
359
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
360
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
361
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
362
|
+
const counters = {
|
|
363
|
+
created: input.counters.created,
|
|
364
|
+
updated: input.counters.updated,
|
|
365
|
+
failed: input.counters.failed,
|
|
366
|
+
errors: [...input.counters.errors],
|
|
367
|
+
};
|
|
368
|
+
const removalPolicy = input.options.onRemovedFromPrintful ?? "unpublish";
|
|
369
|
+
if ((0, removed_1.shouldRunRemovalPass)({ policy: removalPolicy, limit: input.limit })) {
|
|
370
|
+
try {
|
|
371
|
+
const seenIds = input.summaries.map((s) => String(s.id));
|
|
372
|
+
const links = await printful.listPrintfulProductLinks({ printful_store_id: input.storeId }, { take: 100_000 });
|
|
373
|
+
const missing = (0, removed_1.findMissingSyncProductLinks)(links, seenIds);
|
|
374
|
+
for (const link of missing) {
|
|
375
|
+
try {
|
|
376
|
+
const product = await productModule.retrieveProduct(link.medusa_product_id);
|
|
377
|
+
const plan = (0, removed_1.planRemovedProductWrite)({
|
|
378
|
+
policy: removalPolicy,
|
|
379
|
+
currentStatus: product.status === "published" ? "published" : "draft",
|
|
380
|
+
currentMetadata: (product.metadata ?? {}),
|
|
381
|
+
});
|
|
382
|
+
if (plan.action === "unpublish") {
|
|
383
|
+
await productModule.updateProducts(link.medusa_product_id, {
|
|
384
|
+
status: plan.status,
|
|
385
|
+
metadata: plan.metadata,
|
|
303
386
|
});
|
|
304
|
-
|
|
305
|
-
await productModule.updateProducts(link.medusa_product_id, {
|
|
306
|
-
status: plan.status,
|
|
307
|
-
metadata: plan.metadata,
|
|
308
|
-
});
|
|
309
|
-
counters.updated += 1;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
counters.failed += 1;
|
|
314
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
315
|
-
counters.errors.push(`Removed product ${link.printful_sync_product_id}: ${message}`);
|
|
387
|
+
counters.updated += 1;
|
|
316
388
|
}
|
|
317
|
-
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
318
|
-
products_processed: processed,
|
|
319
|
-
products_total: toProcess.length,
|
|
320
|
-
});
|
|
321
389
|
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
counters.failed += 1;
|
|
392
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
393
|
+
counters.errors.push(`Removed product ${link.printful_sync_product_id}: ${message}`);
|
|
394
|
+
}
|
|
395
|
+
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
396
|
+
products_processed: input.summaries.length,
|
|
397
|
+
products_total: input.summaries.length,
|
|
398
|
+
});
|
|
322
399
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
}
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
counters.failed += 1;
|
|
403
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
404
|
+
counters.errors.push(`Removal pass failed: ${message}`);
|
|
405
|
+
logger.error(`Printful sync removal pass failed: ${message}`);
|
|
329
406
|
}
|
|
330
407
|
}
|
|
331
|
-
// Bundles. They have no Printful product of their own, so the loop above
|
|
332
|
-
// never reaches them: nothing in `summaries` names a bundle. Without this
|
|
333
|
-
// pass a bundle stays on sale after a member sells out, and every order
|
|
334
|
-
// containing it fails at Printful.
|
|
335
|
-
//
|
|
336
|
-
// Only after a full pass, for the same reason the removal pass is gated: a
|
|
337
|
-
// `limit` leaves most members unrefreshed, and deciding availability from
|
|
338
|
-
// stale metadata would draft bundles on last week's stock.
|
|
339
408
|
if (!input.limit) {
|
|
340
409
|
try {
|
|
341
410
|
const products = await productModule.listProducts({}, { take: 100_000, relations: ["variants"] });
|
|
@@ -367,63 +436,91 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
367
436
|
}
|
|
368
437
|
}
|
|
369
438
|
catch (err) {
|
|
370
|
-
// Isolated like the removal pass: bundles are a small part of the
|
|
371
|
-
// catalogue, and failing to reconcile them must not fail a sync that
|
|
372
|
-
// otherwise imported every product correctly.
|
|
373
439
|
counters.failed += 1;
|
|
374
440
|
const message = err instanceof Error ? err.message : String(err);
|
|
375
441
|
counters.errors.push(`Bundle pass failed: ${message}`);
|
|
376
442
|
logger.error(`Printful sync bundle pass failed: ${message}`);
|
|
377
443
|
}
|
|
378
444
|
}
|
|
379
|
-
|
|
380
|
-
// than the distinct product-and-colour count, the probe key has regressed.
|
|
381
|
-
logger.info(`Printful sync: ${catalogCache.calls} catalog variant call(s) for design parameters`);
|
|
382
|
-
return new workflows_sdk_1.StepResponse(counters, { orphanProductIds: orphans.toDelete() });
|
|
383
|
-
}, async (compensateInput, { container }) => {
|
|
384
|
-
if (!compensateInput?.orphanProductIds?.length) {
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
388
|
-
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
389
|
-
// Delete through the product module so variants, prices, and images go
|
|
390
|
-
// with the product rather than being orphaned a second time.
|
|
391
|
-
for (const id of compensateInput.orphanProductIds) {
|
|
392
|
-
try {
|
|
393
|
-
await productModule.deleteProducts([id]);
|
|
394
|
-
}
|
|
395
|
-
catch (err) {
|
|
396
|
-
logger.error(`Printful sync rollback: could not delete orphaned product ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
logger.info(`Printful sync rolled back ${compensateInput.orphanProductIds.length} orphaned product(s)`);
|
|
445
|
+
return new workflows_sdk_1.StepResponse(counters);
|
|
400
446
|
});
|
|
401
447
|
const finalizeSyncLogStep = (0, workflows_sdk_1.createStep)("printful-finalize-sync-log", async (input, { container }) => {
|
|
402
448
|
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
status
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
:
|
|
413
|
-
|
|
414
|
-
|
|
449
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
450
|
+
try {
|
|
451
|
+
const status = (0, sync_status_1.planSyncLogStatus)(input.counters);
|
|
452
|
+
const log = await printful.updatePrintfulSyncLogs({
|
|
453
|
+
id: input.logId,
|
|
454
|
+
status,
|
|
455
|
+
finished_at: new Date(),
|
|
456
|
+
products_created: input.counters.created,
|
|
457
|
+
products_updated: input.counters.updated,
|
|
458
|
+
products_failed: input.counters.failed,
|
|
459
|
+
error_message: input.counters.errors.length > 0
|
|
460
|
+
? input.counters.errors.slice(0, 20).join("\n")
|
|
461
|
+
: null,
|
|
462
|
+
});
|
|
463
|
+
logger.info(`Printful sync completed with status ${status}: ` +
|
|
464
|
+
`${input.counters.created} created, ` +
|
|
465
|
+
`${input.counters.updated} updated, ` +
|
|
466
|
+
`${input.counters.failed} failed`);
|
|
467
|
+
return new workflows_sdk_1.StepResponse(log);
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
logger.error(`Printful sync could not finalize log ${input.logId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
471
|
+
throw err;
|
|
472
|
+
}
|
|
415
473
|
});
|
|
416
474
|
exports.syncProductsWorkflow = (0, workflows_sdk_1.createWorkflow)("printful-sync-products", (input) => {
|
|
417
|
-
const
|
|
418
|
-
const
|
|
475
|
+
const fetchRes = fetchPrintfulProductsStep(input);
|
|
476
|
+
const mapRes = mapToMedusaProductsStep({
|
|
477
|
+
sync_log_id: input.sync_log_id,
|
|
478
|
+
toProcess: fetchRes.toProcess,
|
|
479
|
+
details: fetchRes.details,
|
|
480
|
+
options: fetchRes.options,
|
|
481
|
+
storeId: fetchRes.storeId,
|
|
482
|
+
initialCounters: fetchRes.initialCounters,
|
|
483
|
+
});
|
|
484
|
+
const createProductsInput = (0, workflows_sdk_1.transform)({ productsToCreate: mapRes.productsToCreate }, (data) => ({
|
|
485
|
+
input: { products: data.productsToCreate },
|
|
486
|
+
}));
|
|
487
|
+
const createdProducts = core_flows_1.createProductsWorkflow.runAsStep(createProductsInput);
|
|
488
|
+
updateMedusaProductsStep(mapRes.productsToUpdate);
|
|
489
|
+
const batchVariantsInput = (0, workflows_sdk_1.transform)({
|
|
490
|
+
variantsToCreate: mapRes.variantsToCreate,
|
|
491
|
+
variantsToUpdate: mapRes.variantsToUpdate,
|
|
492
|
+
}, (data) => ({
|
|
493
|
+
input: {
|
|
494
|
+
create: data.variantsToCreate,
|
|
495
|
+
update: data.variantsToUpdate,
|
|
496
|
+
},
|
|
497
|
+
}));
|
|
498
|
+
core_flows_1.batchProductVariantsWorkflow.runAsStep(batchVariantsInput);
|
|
499
|
+
const linkRes = syncLinksStep({
|
|
500
|
+
createdProducts,
|
|
501
|
+
linksToCreate: mapRes.linksToCreate,
|
|
502
|
+
linksToUpdate: mapRes.linksToUpdate,
|
|
503
|
+
reconcileItems: mapRes.reconcileItems,
|
|
504
|
+
storeId: fetchRes.storeId,
|
|
505
|
+
counters: mapRes.counters,
|
|
506
|
+
});
|
|
507
|
+
const finalCounters = removalsAndBundlesStep({
|
|
508
|
+
sync_log_id: input.sync_log_id,
|
|
509
|
+
limit: input.limit,
|
|
510
|
+
storeId: fetchRes.storeId,
|
|
511
|
+
options: fetchRes.options,
|
|
512
|
+
summaries: fetchRes.toProcess,
|
|
513
|
+
counters: linkRes.counters,
|
|
514
|
+
});
|
|
515
|
+
const finalizeInput = (0, workflows_sdk_1.transform)({ input, counters: finalCounters }, (data) => ({
|
|
419
516
|
logId: data.input.sync_log_id,
|
|
420
517
|
counters: data.counters,
|
|
421
518
|
}));
|
|
422
519
|
const finalLog = finalizeSyncLogStep(finalizeInput);
|
|
423
520
|
return new workflows_sdk_1.WorkflowResponse({
|
|
424
521
|
sync_log: finalLog,
|
|
425
|
-
counters,
|
|
522
|
+
counters: finalCounters,
|
|
426
523
|
});
|
|
427
524
|
});
|
|
428
525
|
exports.default = exports.syncProductsWorkflow;
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQUN2Qiw4Q0FLeUI7QUFDekIsNENBQStFO0FBQy9FLDRDQUEyRTtBQWdCM0UsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDO0lBQ0UsSUFBSSxFQUFFLHdCQUF3QjtJQUM5Qiw0REFBNEQ7SUFDNUQsMEVBQTBFO0lBQzFFLEtBQUssRUFBRSxJQUFJO0lBQ1gsbUJBQW1CLEVBQUUsSUFBSTtJQUN6Qix5RUFBeUU7SUFDekUsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLG9DQUFvQztDQUNyQyxFQUNELEtBQUssRUFBRSxLQUF3QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNoRCxNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUs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
|
|
526
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQUN2Qiw4Q0FLeUI7QUFDekIsNENBQStFO0FBQy9FLDRDQUEyRTtBQWlDM0UsTUFBTSx5QkFBeUIsR0FBRyxJQUFBLDBCQUFVLEVBQzFDO0lBQ0UsSUFBSSxFQUFFLHlCQUF5QjtJQUMvQixLQUFLLEVBQUUsSUFBSTtJQUNYLG1CQUFtQixFQUFFLElBQUk7Q0FDMUIsRUFDRCxLQUFLLEVBQUUsS0FBd0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRTNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ2pELEtBQUssRUFBRSxHQUFHO0tBQ1gsQ0FBQyxDQUFBO0lBRUYsTUFBTSxTQUFTLEdBQ2IsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRW5FLE1BQU0sUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFDakQsY0FBYyxFQUFFLFNBQVMsQ0FBQyxNQUFNO0tBQ2pDLENBQUMsQ0FBQTtJQUVGLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFxQyxDQUFBO0lBQy9ELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQTtJQUNqQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUE7SUFDM0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBRWQsS0FBSyxNQUFNLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QixTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxDQUFDLENBQUE7Z0JBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUE7Z0JBQ3BELFNBQVE7WUFDVixDQUFDO1lBQ0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzVDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLENBQUMsQ0FBQTtZQUNYLE1BQU0sT0FBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ2xELENBQUM7Z0JBQVMsQ0FBQztZQUNULFNBQVMsSUFBSSxDQUFDLENBQUE7WUFDZCxNQUFNLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUNqRCxrQkFBa0IsRUFBRSxTQUFTO2dCQUM3QixjQUFjLEVBQUUsU0FBUyxDQUFDLE1BQU07YUFDakMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBQztRQUN0QixTQUFTO1FBQ1QsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE9BQU87UUFDUCxPQUFPO1FBQ1AsZUFBZSxFQUFFO1lBQ2YsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLE1BQU07WUFDTixNQUFNO1NBQ2dCO0tBQ3pCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBO0FBRUQsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3hDO0lBQ0UsSUFBSSxFQUFFLHVCQUF1QjtJQUM3QixLQUFLLEVBQUUsSUFBSTtJQUNYLG1CQUFtQixFQUFFLElBQUk7Q0FDMUIsRUFDRCxLQUFLLEVBQ0gsS0FPQyxFQUNELEVBQUUsU0FBUyxFQUFFLEVBQ2IsRUFBRTtJQUNGLE1BQU0sUUFBUSxHQUEwQixTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUMxRSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBRXpDLE1BQU0sUUFBUSxHQUFpQjtRQUM3QixPQUFPLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU87UUFDdEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTTtRQUNwQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0tBQzFDLENBQUE7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSw0QkFBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ2xELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FDN0IsQ0FBQTtJQUVELE1BQU0sZ0JBQWdCLEdBQXlCLEVBQUUsQ0FBQTtJQUNqRCxNQUFNLGdCQUFnQixHQUdoQixFQUFFLENBQUE7SUFDUixNQUFNLGdCQUFnQixHQUF5QixFQUFFLENBQUE7SUFDakQsTUFBTSxnQkFBZ0IsR0FBeUIsRUFBRSxDQUFBO0lBQ2pELE1BQU0sYUFBYSxHQUFnQyxFQUFFLENBQUE7SUFDckQsTUFBTSxhQUFhLEdBSWIsRUFBRSxDQUFBO0lBQ1IsTUFBTSxjQUFjLEdBS2QsRUFBRSxDQUFBO0lBQ1IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBRWpCLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLElBQUksT0FBTyxDQUFDLFVBQVU7WUFBRSxTQUFRO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxNQUFNO1lBQUUsU0FBUTtRQUVyQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFBLGdDQUFzQixFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFNUQsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLElBQUEsaUNBQXdCLEVBQzlDLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUFDLGFBQWEsRUFDcEI7Z0JBQ0UsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDdkQsS0FBSyxFQUFFLFlBQVk7YUFDcEIsQ0FDRixDQUFBO1lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUV2RSxJQUFJLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUE7Z0JBRWhELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUU7b0JBQzdELFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQztpQkFDeEIsQ0FBQyxDQUFBO2dCQUVGLE1BQU0sV0FBVyxHQUFHLElBQUEsbUNBQTJCLEVBQUM7b0JBQzlDLElBQUksRUFBRSxJQUFBLHdCQUFnQixFQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7b0JBQzVDLGFBQWEsRUFDWCxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUN4RCxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FHdkM7b0JBQ0QsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRO2lCQUNoQyxDQUFDLENBQUE7Z0JBRUYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO29CQUNwQixTQUFTO29CQUNULElBQUksRUFBRTt3QkFDSixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7d0JBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzt3QkFDM0IsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUM5QixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07cUJBQzNCO2lCQUNGLENBQUMsQ0FBQTtnQkFFRixNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEsK0JBQXFCLEVBQ2xELE1BQU0sQ0FBQyxRQUFRLEVBQ2YsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDcEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUNULFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtpQkFDdEIsQ0FBQyxDQUFDLENBQ0osQ0FBQTtnQkFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUN6QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7d0JBQ3BCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTt3QkFDUixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7d0JBQ2QsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO3dCQUNoQixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7cUJBQ3JCLENBQUMsQ0FBQTtnQkFDSixDQUFDO2dCQUVELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ3pCLGdCQUFnQixDQUFDLElBQUksQ0FBQzt3QkFDcEIsVUFBVSxFQUFFLFNBQVM7d0JBQ3JCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSzt3QkFDZCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7d0JBQ1YsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO3dCQUNsQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07d0JBQ2hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTt3QkFDcEIsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjt3QkFDcEMsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlO3FCQUNuQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztnQkFFRCxhQUFhLENBQUMsSUFBSSxDQUFDO29CQUNqQixNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUU7b0JBQ3ZCLGFBQWEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDakMsZUFBZSxFQUFFLFNBQVM7aUJBQzNCLENBQUMsQ0FBQTtnQkFFRixjQUFjLENBQUMsSUFBSSxDQUFDO29CQUNsQixhQUFhLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSxTQUFTO29CQUMxQixjQUFjLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELFFBQVEsRUFBRSxLQUFLO2lCQUNoQixDQUFDLENBQUE7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtnQkFDMUIsSUFBSSxDQUFDO29CQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksQ0FDL0MsRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUNwQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FDWixDQUFBO29CQUNELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFBO29CQUN2QyxDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLHdCQUFnQixFQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtnQkFDMUQsTUFBTSxjQUFjLEdBQTRCO29CQUM5QyxHQUFHLE1BQU0sQ0FBQyxRQUFRO29CQUNsQixHQUFHLENBQUMsV0FBVyxDQUFDLGNBQWM7d0JBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsd0JBQWdCLENBQUMsRUFBRSxhQUFhLEVBQUU7d0JBQ3ZDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ1IsQ0FBQTtnQkFFRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztvQkFDbkIsTUFBTTtvQkFDTixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87b0JBQ3ZCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dCQUNkLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRzt3QkFDVixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87d0JBQ2xCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTt3QkFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO3dCQUNwQixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZ0JBQWdCO3dCQUNwQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWU7cUJBQ25DLENBQUMsQ0FBQztvQkFDSCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2lCQUNoQyxDQUFDLENBQUE7Z0JBRUYsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFFekQsY0FBYyxDQUFDLElBQUksQ0FBQztvQkFDbEIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNqQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUMsQ0FBQTtZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUMzRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxTQUFTLElBQUksQ0FBQyxDQUFBO1lBQ2QsTUFBTSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDakQsa0JBQWtCLEVBQUUsU0FBUztnQkFDN0IsY0FBYyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTTthQUN2QyxDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0JBQWtCLFlBQVksQ0FBQyxLQUFLLGdEQUFnRCxDQUNyRixDQUFBO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQUM7UUFDdEIsZ0JBQWdCO1FBQ2hCLGdCQUFnQjtRQUNoQixnQkFBZ0I7UUFDaEIsZ0JBQWdCO1FBQ2hCLGFBQWE7UUFDYixhQUFhO1FBQ2IsY0FBYztRQUNkLFFBQVE7UUFDUixpQkFBaUIsRUFBRSxZQUFZLENBQUMsS0FBSztLQUN0QyxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sd0JBQXdCLEdBQUcsSUFBQSwwQkFBVSxFQUN6QyxpQ0FBaUMsRUFDakMsS0FBSyxFQUNILGdCQUF3RSxFQUN4RSxFQUFFLFNBQVMsRUFBRSxFQUNiLEVBQUU7SUFDRixNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RCxLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRCxPQUFPLElBQUksNEJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMvQixDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sYUFBYSxHQUFHLElBQUEsMEJBQVUsRUFDOUIscUJBQXFCLEVBQ3JCLEtBQUssRUFDSCxLQWdCQyxFQUNELEVBQUUsU0FBUyxFQUFFLEVBQ2IsRUFBRTtJQUNGLE1BQU0sUUFBUSxHQUEwQixTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUMxRSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWxFLE1BQU0sUUFBUSxHQUFHO1FBQ2YsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTztRQUMvQixPQUFPLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPO1FBQy9CLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07UUFDN0IsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztLQUNuQyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSx1QkFBYSxFQUFFLENBQUE7SUFFbkMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUE7SUFDckQsSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDbEUsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtZQUNwQixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEIsV0FBVyxFQUFFLENBQUMsYUFBYSxrQ0FBa0MsQ0FDOUQsQ0FBQTtZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3hDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUNoQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsYUFBYTtnQkFDMUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQzdCLGNBQWMsRUFBRSxJQUFJLElBQUksRUFBRTthQUMzQixDQUFDLENBQUE7WUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUMzQixRQUFRLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQTtRQUN2QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxhQUFhLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUUvRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hELE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzdCLENBQUM7WUFBQyxPQUFPLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLENBQUMsS0FBSyxDQUNWLG9EQUFvRCxPQUFPLENBQUMsRUFBRSwrQkFDNUQsU0FBUyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDbkUsRUFBRSxDQUNILENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztnQkFDeEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNO2dCQUNiLGNBQWMsRUFBRSxJQUFJLElBQUksRUFBRTthQUMzQixDQUFDLENBQUE7WUFDRixRQUFRLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQTtRQUN2QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEIsdUJBQXVCLEVBQUUsQ0FBQyxhQUFhLEtBQUssT0FBTyxFQUFFLENBQ3RELENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQztZQUNILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRO2dCQUNuQyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRTtnQkFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUE7WUFFeEIsSUFBSSxDQUFDLGVBQWU7Z0JBQUUsU0FBUTtZQUU5QixNQUFNLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFO2dCQUNsRSxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUM7YUFDeEIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxJQUFBLHFDQUFxQixFQUFDLFFBQVEsRUFBRTtnQkFDcEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ2pDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbkMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25ELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDVCxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7aUJBQ3RCLENBQUMsQ0FBQzthQUNKLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxPQUFPLEdBQUcsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQ1YseUNBQXlDLElBQUksQ0FBQyxhQUFhLEtBQUssT0FBTyxFQUFFLENBQzFFLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUNyQixFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFDbEQsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDekMsQ0FBQTtBQUNILENBQUMsRUFDRCxLQUFLLEVBQ0gsZUFBMkQsRUFDM0QsRUFBRSxTQUFTLEVBQUUsRUFDYixFQUFFO0lBQ0YsSUFBSSxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUMvQyxPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFbEUsS0FBSyxNQUFNLEVBQUUsSUFBSSxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzFDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEtBQUssQ0FDViw2REFBNkQsRUFBRSxLQUM3RCxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNqRCxFQUFFLENBQ0gsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FDVCw2QkFBNkIsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sc0JBQXNCLENBQzNGLENBQUE7QUFDSCxDQUFDLENBQ0YsQ0FBQTtBQUVELE1BQU0sc0JBQXNCLEdBQUcsSUFBQSwwQkFBVSxFQUN2QztJQUNFLElBQUksRUFBRSwyQkFBMkI7SUFDakMsS0FBSyxFQUFFLElBQUk7SUFDWCxtQkFBbUIsRUFBRSxJQUFJO0NBQzFCLEVBQ0QsS0FBSyxFQUNILEtBT0MsRUFDRCxFQUFFLFNBQVMsRUFBRSxFQUNiLEVBQUU7SUFDRixNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVsRSxNQUFNLFFBQVEsR0FBRztRQUNmLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU87UUFDL0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTztRQUMvQixNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO1FBQzdCLE1BQU0sRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7S0FDbkMsQ0FBQTtJQUVELE1BQU0sYUFBYSxHQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQTtJQUVwRCxJQUFJLElBQUEsOEJBQW9CLEVBQUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUMsd0JBQXdCLENBQ25ELEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUNwQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FDbEIsQ0FBQTtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQTJCLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRTNELEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQztvQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxlQUFlLENBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FDdkIsQ0FBQTtvQkFDRCxNQUFNLElBQUksR0FBRyxJQUFBLGlDQUF1QixFQUFDO3dCQUNuQyxNQUFNLEVBQUUsYUFBYTt3QkFDckIsYUFBYSxFQUNYLE9BQU8sQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU87d0JBQ3hELGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUd2QztxQkFDRixDQUFDLENBQUE7b0JBRUYsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO3dCQUNoQyxNQUFNLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFOzRCQUN6RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07NEJBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTt5QkFDeEIsQ0FBQyxDQUFBO3dCQUNGLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO29CQUN2QixDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDYixRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtvQkFDcEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNoRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEIsbUJBQW1CLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxPQUFPLEVBQUUsQ0FDL0QsQ0FBQTtnQkFDSCxDQUFDO2dCQUVELE1BQU0sUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ2pELGtCQUFrQixFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTTtvQkFDMUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTTtpQkFDdkMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDcEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksQ0FDL0MsRUFBRSxFQUNGLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUMzQyxDQUFBO1lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQzFCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNyQixDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQTBDLEVBQUU7YUFDM0QsQ0FBQyxDQUNILENBQ0YsQ0FBQTtZQUVELE1BQU0sTUFBTSxHQUFHLElBQUEsdUJBQWMsRUFBQztnQkFDNUIsT0FBTyxFQUFFLFFBQWtDO2dCQUMzQyxZQUFZO2FBQ2IsQ0FBQyxDQUFBO1lBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDO29CQUNILE1BQU0sYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFO3dCQUNuRCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07d0JBQ3BCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtxQkFDekIsQ0FBQyxDQUFBO29CQUNGLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNyQixNQUFNLENBQUMsSUFBSSxDQUNULHlCQUF5QixLQUFLLENBQUMsVUFBVSxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUU7d0JBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNOzRCQUNuQixDQUFDLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzRCQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ1YsQ0FBQTtnQkFDSCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUE7b0JBQ3BCLE1BQU0sT0FBTyxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDaEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUE7Z0JBQ2hFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtZQUNwQixNQUFNLE9BQU8sR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDaEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDdEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ25DLENBQUMsQ0FDRixDQUFBO0FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3BDLDRCQUE0QixFQUM1QixLQUFLLEVBQUUsS0FBZ0QsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDeEUsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSwrQkFBaUIsRUFBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxRQUFRLENBQUMsc0JBQXNCLENBQUM7WUFDaEQsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2YsTUFBTTtZQUNOLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtZQUN2QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDeEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPO1lBQ3hDLGVBQWUsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU07WUFDdEMsYUFBYSxFQUNYLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUM5QixDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsSUFBSTtTQUNYLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQ1QsdUNBQXVDLE1BQU0sSUFBSTtZQUMvQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxZQUFZO1lBQ3JDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLFlBQVk7WUFDckMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sU0FBUyxDQUNwQyxDQUFBO1FBQ0QsT0FBTyxJQUFJLDRCQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUNWLHdDQUF3QyxLQUFLLENBQUMsS0FBSyxLQUNqRCxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNqRCxFQUFFLENBQ0gsQ0FBQTtRQUNELE1BQU0sR0FBRyxDQUFBO0lBQ1gsQ0FBQztBQUNILENBQUMsQ0FDRixDQUFBO0FBRVksUUFBQSxvQkFBb0IsR0FBRyxJQUFBLDhCQUFjLEVBQ2hELHdCQUF3QixFQUN4QixDQUFDLEtBQXdCLEVBQUUsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVqRCxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQztRQUNyQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1FBQzdCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztRQUN6QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZTtLQUMxQyxDQUFDLENBQUE7SUFFRixNQUFNLG1CQUFtQixHQUFHLElBQUEseUJBQVMsRUFDbkMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFDN0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO0tBQzNDLENBQUMsQ0FDSCxDQUFBO0lBQ0QsTUFBTSxlQUFlLEdBQ25CLG1DQUFzQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBRXZELHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRWpELE1BQU0sa0JBQWtCLEdBQUcsSUFBQSx5QkFBUyxFQUNsQztRQUNFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDekMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtLQUMxQyxFQUNELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7U0FDOUI7S0FDRixDQUFDLENBQ0gsQ0FBQTtJQUNELHlDQUE0QixDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBRTFELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUM1QixlQUFlO1FBQ2YsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1FBQ25DLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtRQUNuQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7UUFDckMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtLQUMxQixDQUFDLENBQUE7SUFFRixNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQztRQUMzQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztRQUN6QixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1FBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtLQUMzQixDQUFDLENBQUE7SUFFRixNQUFNLGFBQWEsR0FBRyxJQUFBLHlCQUFTLEVBQzdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFDbEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1FBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBd0I7S0FDeEMsQ0FBQyxDQUNILENBQUE7SUFFRCxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUVuRCxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsUUFBUSxFQUFFLGFBQWE7S0FDeEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSw0QkFBb0IsQ0FBQSJ9
|