@lodashventure/medusa-login-provider 4.1.3 → 4.1.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/index.js +17 -1
- package/.medusa/server/src/providers/line/customer-helper.js +152 -0
- package/.medusa/server/src/providers/line/index.js +3 -2
- package/.medusa/server/src/providers/line/redis-helper.js +132 -0
- package/.medusa/server/src/providers/line/service.js +71 -77
- package/package.json +3 -1
- package/.medusa/server/src/providers/line/__tests__/line-api.mock.test.js +0 -472
- package/.medusa/server/src/providers/line/__tests__/service.test.js +0 -438
- package/.medusa/server/src/providers/line/__tests__/utils.test.js +0 -351
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
18
|
};
|
|
@@ -12,4 +26,6 @@ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, {
|
|
|
12
26
|
// Export the LINE provider for direct access
|
|
13
27
|
var service_2 = require("./providers/line/service");
|
|
14
28
|
Object.defineProperty(exports, "LineProvider", { enumerable: true, get: function () { return __importDefault(service_2).default; } });
|
|
15
|
-
|
|
29
|
+
__exportStar(require("./providers/line/customer-helper"), exports);
|
|
30
|
+
__exportStar(require("./providers/line/utils"), exports);
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBb0U7QUFDcEUsdUVBQTJEO0FBRTNELGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsSUFBSSxFQUFFO0lBQzFDLFFBQVEsRUFBRSxDQUFDLGlCQUFtQixDQUFDO0NBQ2hDLENBQUMsQ0FBQztBQUVILDZDQUE2QztBQUM3QyxvREFBbUU7QUFBMUQsd0hBQUEsT0FBTyxPQUFnQjtBQUNoQyxtRUFBaUQ7QUFDakQseURBQXVDIn0=
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOrUpdateLineCustomer = createOrUpdateLineCustomer;
|
|
4
|
+
exports.extractCustomerData = extractCustomerData;
|
|
5
|
+
exports.shouldCreateCustomer = shouldCreateCustomer;
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
/**
|
|
9
|
+
* Creates or updates a customer account for a LINE authenticated user
|
|
10
|
+
* Uses Medusa's createCustomerAccountWorkflow for proper integration
|
|
11
|
+
*/
|
|
12
|
+
async function createOrUpdateLineCustomer(options) {
|
|
13
|
+
const { authIdentityId, userMetadata, container, logger } = options;
|
|
14
|
+
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
15
|
+
const authService = container.resolve(utils_1.Modules.AUTH);
|
|
16
|
+
const email = userMetadata.email || `line_${userMetadata.line_user_id}@line.me`;
|
|
17
|
+
const firstName = userMetadata.first_name || userMetadata.display_name || "LINE User";
|
|
18
|
+
const lastName = userMetadata.last_name || "";
|
|
19
|
+
try {
|
|
20
|
+
// Check if customer already exists
|
|
21
|
+
const existingCustomers = await customerService.listCustomers({ email });
|
|
22
|
+
if (existingCustomers?.length > 0) {
|
|
23
|
+
// Update existing customer
|
|
24
|
+
const customer = existingCustomers[0];
|
|
25
|
+
await customerService.updateCustomers(customer.id, {
|
|
26
|
+
first_name: firstName,
|
|
27
|
+
last_name: lastName,
|
|
28
|
+
metadata: {
|
|
29
|
+
...customer.metadata,
|
|
30
|
+
line_user_id: userMetadata.line_user_id,
|
|
31
|
+
line_display_name: userMetadata.display_name,
|
|
32
|
+
line_picture_url: userMetadata.picture_url,
|
|
33
|
+
line_status_message: userMetadata.status_message,
|
|
34
|
+
line_updated_at: new Date().toISOString(),
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
// Update auth identity with customer ID
|
|
38
|
+
await authService.updateAuthIdentities({
|
|
39
|
+
id: authIdentityId,
|
|
40
|
+
app_metadata: {
|
|
41
|
+
customer_id: customer.id,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
if (logger) {
|
|
45
|
+
logger.info(`Updated existing customer ${customer.id} for LINE user ${userMetadata.line_user_id}`);
|
|
46
|
+
}
|
|
47
|
+
return { customer, created: false };
|
|
48
|
+
}
|
|
49
|
+
// Create new customer using workflow
|
|
50
|
+
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(container).run({
|
|
51
|
+
input: {
|
|
52
|
+
authIdentityId,
|
|
53
|
+
customerData: {
|
|
54
|
+
email,
|
|
55
|
+
first_name: firstName,
|
|
56
|
+
last_name: lastName,
|
|
57
|
+
metadata: {
|
|
58
|
+
line_user_id: userMetadata.line_user_id,
|
|
59
|
+
line_display_name: userMetadata.display_name,
|
|
60
|
+
line_picture_url: userMetadata.picture_url,
|
|
61
|
+
line_status_message: userMetadata.status_message,
|
|
62
|
+
line_created_at: new Date().toISOString(),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (logger) {
|
|
68
|
+
logger.info(`Created new customer ${result.id} for LINE user ${userMetadata.line_user_id}`);
|
|
69
|
+
}
|
|
70
|
+
return { customer: result, created: true };
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (logger) {
|
|
74
|
+
logger.error(`Failed to create/update customer for LINE user ${userMetadata.line_user_id}:`, error);
|
|
75
|
+
}
|
|
76
|
+
// Fallback: Try direct customer creation
|
|
77
|
+
try {
|
|
78
|
+
const customer = await customerService.createCustomers({
|
|
79
|
+
email,
|
|
80
|
+
first_name: firstName,
|
|
81
|
+
last_name: lastName,
|
|
82
|
+
metadata: {
|
|
83
|
+
line_user_id: userMetadata.line_user_id,
|
|
84
|
+
line_display_name: userMetadata.display_name,
|
|
85
|
+
line_picture_url: userMetadata.picture_url,
|
|
86
|
+
line_status_message: userMetadata.status_message,
|
|
87
|
+
line_created_at: new Date().toISOString(),
|
|
88
|
+
auth_identity_id: authIdentityId,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
// Update auth identity with customer ID
|
|
92
|
+
await authService.updateAuthIdentities({
|
|
93
|
+
id: authIdentityId,
|
|
94
|
+
app_metadata: {
|
|
95
|
+
customer_id: customer.id,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
if (logger) {
|
|
99
|
+
logger.info(`Created customer ${customer.id} via fallback method for LINE user ${userMetadata.line_user_id}`);
|
|
100
|
+
}
|
|
101
|
+
return { customer, created: true };
|
|
102
|
+
}
|
|
103
|
+
catch (fallbackError) {
|
|
104
|
+
if (logger) {
|
|
105
|
+
logger.error(`Fallback customer creation also failed:`, fallbackError);
|
|
106
|
+
}
|
|
107
|
+
throw fallbackError;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Extract customer data from LINE user metadata
|
|
113
|
+
*/
|
|
114
|
+
function extractCustomerData(userMetadata) {
|
|
115
|
+
const email = userMetadata.email || `line_${userMetadata.line_user_id}@line.me`;
|
|
116
|
+
const displayName = userMetadata.name || userMetadata.display_name || "";
|
|
117
|
+
const nameParts = displayName.trim().split(" ");
|
|
118
|
+
return {
|
|
119
|
+
email,
|
|
120
|
+
first_name: userMetadata.first_name || nameParts[0] || "LINE User",
|
|
121
|
+
last_name: userMetadata.last_name || nameParts.slice(1).join(" ") || "",
|
|
122
|
+
metadata: {
|
|
123
|
+
line_user_id: userMetadata.line_user_id,
|
|
124
|
+
line_display_name: userMetadata.display_name,
|
|
125
|
+
line_picture_url: userMetadata.picture_url || userMetadata.picture,
|
|
126
|
+
line_status_message: userMetadata.status_message,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a customer needs to be created based on auth identity
|
|
132
|
+
*/
|
|
133
|
+
async function shouldCreateCustomer(authIdentity, container) {
|
|
134
|
+
// Check if customer creation flag is set
|
|
135
|
+
if (!authIdentity.user_metadata?.needs_customer_creation) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Check if customer already exists in app_metadata
|
|
139
|
+
if (authIdentity.app_metadata?.customer_id) {
|
|
140
|
+
const customerService = container.resolve(utils_1.Modules.CUSTOMER);
|
|
141
|
+
try {
|
|
142
|
+
await customerService.retrieveCustomer(authIdentity.app_metadata.customer_id);
|
|
143
|
+
return false; // Customer exists
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Customer doesn't exist, should create
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9saW5lL2N1c3RvbWVyLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJCQSxnRUFnSEM7QUFLRCxrREFnQkM7QUFLRCxvREFzQkM7QUEzTEQsNERBQTRFO0FBRTVFLHFEQUFvRDtBQXFCcEQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLDBCQUEwQixDQUM5QyxPQUFrQztJQUVsQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3BFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksUUFBUSxZQUFZLENBQUMsWUFBWSxVQUFVLENBQUM7SUFDaEYsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsWUFBWSxJQUFJLFdBQVcsQ0FBQztJQUN0RixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUU5QyxJQUFJLENBQUM7UUFDSCxtQ0FBbUM7UUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLElBQUksaUJBQWlCLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xDLDJCQUEyQjtZQUMzQixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV0QyxNQUFNLGVBQWUsQ0FBQyxlQUFlLENBQUMsUUFB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
|
|
@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
7
7
|
const service_1 = __importDefault(require("./service"));
|
|
8
|
+
const services = [service_1.default];
|
|
8
9
|
exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, {
|
|
9
|
-
services
|
|
10
|
+
services,
|
|
10
11
|
});
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2xpbmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBb0U7QUFDcEUsd0RBQTRDO0FBRTVDLE1BQU0sUUFBUSxHQUFHLENBQUMsaUJBQW1CLENBQUMsQ0FBQztBQUV2QyxrQkFBZSxJQUFBLHNCQUFjLEVBQUMsZUFBTyxDQUFDLElBQUksRUFBRTtJQUMxQyxRQUFRO0NBQ1QsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,132 @@
|
|
|
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.LineRedisHelper = void 0;
|
|
7
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
|
+
class LineRedisHelper {
|
|
9
|
+
constructor(redisUrl, logger) {
|
|
10
|
+
this.PREFIX = "line:pending_customer:";
|
|
11
|
+
this.TTL_SECONDS = 86400; // 24 hours
|
|
12
|
+
this.redis = new ioredis_1.default(redisUrl);
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Store pending customer data in Redis with TTL
|
|
17
|
+
* Uses auth_identity_id as the key for easy retrieval
|
|
18
|
+
*/
|
|
19
|
+
async storePendingCustomer(authIdentityId, data) {
|
|
20
|
+
const key = `${this.PREFIX}${authIdentityId}`;
|
|
21
|
+
const pendingData = {
|
|
22
|
+
...data,
|
|
23
|
+
created_at: new Date().toISOString(),
|
|
24
|
+
expires_at: new Date(Date.now() + this.TTL_SECONDS * 1000).toISOString(),
|
|
25
|
+
};
|
|
26
|
+
try {
|
|
27
|
+
await this.redis.setex(key, this.TTL_SECONDS, JSON.stringify(pendingData));
|
|
28
|
+
this.logger.info(`Stored pending customer in Redis: ${key}`);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
this.logger.error(`Failed to store pending customer in Redis: ${error}`);
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Retrieve pending customer data from Redis by auth_identity_id
|
|
37
|
+
*/
|
|
38
|
+
async getPendingCustomer(authIdentityId) {
|
|
39
|
+
const key = `${this.PREFIX}${authIdentityId}`;
|
|
40
|
+
try {
|
|
41
|
+
const data = await this.redis.get(key);
|
|
42
|
+
if (!data) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return JSON.parse(data);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.logger.error(`Failed to get pending customer from Redis: ${error}`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Delete pending customer data from Redis (after successful creation)
|
|
54
|
+
*/
|
|
55
|
+
async deletePendingCustomer(authIdentityId) {
|
|
56
|
+
const key = `${this.PREFIX}${authIdentityId}`;
|
|
57
|
+
try {
|
|
58
|
+
await this.redis.del(key);
|
|
59
|
+
this.logger.info(`Deleted pending customer from Redis: ${key}`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.logger.error(`Failed to delete pending customer from Redis: ${error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all pending customers (for admin monitoring)
|
|
67
|
+
*/
|
|
68
|
+
async getAllPendingCustomers() {
|
|
69
|
+
try {
|
|
70
|
+
const pattern = `${this.PREFIX}*`;
|
|
71
|
+
const keys = await this.redis.keys(pattern);
|
|
72
|
+
if (keys.length === 0) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
const pipeline = this.redis.pipeline();
|
|
76
|
+
keys.forEach(key => pipeline.get(key));
|
|
77
|
+
const results = await pipeline.exec();
|
|
78
|
+
const pendingCustomers = [];
|
|
79
|
+
results?.forEach(([err, data]) => {
|
|
80
|
+
if (!err && data) {
|
|
81
|
+
try {
|
|
82
|
+
pendingCustomers.push(JSON.parse(data));
|
|
83
|
+
}
|
|
84
|
+
catch (parseError) {
|
|
85
|
+
this.logger.error(`Failed to parse pending customer data: ${parseError}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return pendingCustomers;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.logger.error(`Failed to get all pending customers from Redis: ${error}`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if customer data exists in Redis
|
|
98
|
+
*/
|
|
99
|
+
async hasPendingCustomer(authIdentityId) {
|
|
100
|
+
const key = `${this.PREFIX}${authIdentityId}`;
|
|
101
|
+
try {
|
|
102
|
+
const exists = await this.redis.exists(key);
|
|
103
|
+
return exists === 1;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
this.logger.error(`Failed to check pending customer in Redis: ${error}`);
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update TTL for pending customer
|
|
112
|
+
*/
|
|
113
|
+
async extendTTL(authIdentityId, additionalSeconds = 86400) {
|
|
114
|
+
const key = `${this.PREFIX}${authIdentityId}`;
|
|
115
|
+
try {
|
|
116
|
+
const result = await this.redis.expire(key, this.TTL_SECONDS + additionalSeconds);
|
|
117
|
+
return result === 1;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.logger.error(`Failed to extend TTL for pending customer: ${error}`);
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Close Redis connection
|
|
126
|
+
*/
|
|
127
|
+
async disconnect() {
|
|
128
|
+
await this.redis.quit();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.LineRedisHelper = LineRedisHelper;
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXMtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9saW5lL3JlZGlzLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBMkI7QUFlM0IsTUFBYSxlQUFlO0lBTTFCLFlBQVksUUFBZ0IsRUFBRSxNQUFjO1FBSDNCLFdBQU0sR0FBRyx3QkFBd0IsQ0FBQTtRQUNqQyxnQkFBVyxHQUFHLEtBQUssQ0FBQSxDQUFDLFdBQVc7UUFHOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGlCQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDeEIsY0FBc0IsRUFDdEIsSUFBNEQ7UUFFNUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFBO1FBQzdDLE1BQU0sV0FBVyxHQUF3QjtZQUN2QyxHQUFHLElBQUk7WUFDUCxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtTQUN6RSxDQUFBO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FDcEIsR0FBRyxFQUNILElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQzVCLENBQUE7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUM5RCxDQUFDO1FBQUMsT0FBTyxLQUFL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
|