@zaamx/netme-bundle 0.0.2 → 0.0.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/admin/index.js +359 -333
- package/.medusa/server/src/admin/index.mjs +361 -335
- package/.medusa/server/src/api/admin/bundled-products/route.js +64 -72
- package/.medusa/server/src/api/admin/products/[id]/bundle/route.js +2 -11
- package/README.md +443 -48
- package/package.json +10 -5
|
@@ -4,94 +4,86 @@ exports.GET = GET;
|
|
|
4
4
|
exports.POST = POST;
|
|
5
5
|
const bundles_1 = require("../../../modules/bundles");
|
|
6
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
function parseJsonField(field) {
|
|
8
|
+
if (!field)
|
|
9
|
+
return {};
|
|
10
|
+
if (typeof field === "string") {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(field);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return field;
|
|
19
|
+
}
|
|
7
20
|
async function GET(req, res) {
|
|
8
21
|
try {
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
...req.queryConfig
|
|
13
|
-
});
|
|
14
|
-
// Enrich bundles with product information
|
|
22
|
+
const limit = parseInt(req.query.limit) || 15;
|
|
23
|
+
const offset = parseInt(req.query.offset) || 0;
|
|
24
|
+
const bundleService = req.scope.resolve(bundles_1.BUNDLE_MODULE);
|
|
15
25
|
const productService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
26
|
+
// Use the service directly — query.graph doesn't index plugin module entities
|
|
27
|
+
const allBundles = await bundleService.listBundles({ is_bundle: true });
|
|
28
|
+
const count = allBundles.length;
|
|
29
|
+
const bundles = allBundles.slice(offset, offset + limit);
|
|
16
30
|
const enrichedBundles = await Promise.all(bundles.map(async (bundle) => {
|
|
31
|
+
const childProductsData = parseJsonField(bundle.child_products)?.data || [];
|
|
32
|
+
const bundleMetaData = parseJsonField(bundle.bundle_meta)?.data || [];
|
|
33
|
+
let productTitle = "Product not found";
|
|
34
|
+
let productStatus = "unknown";
|
|
17
35
|
try {
|
|
18
36
|
const product = await productService.retrieveProduct(bundle.id);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return {
|
|
25
|
-
id: childConfig.id,
|
|
26
|
-
product: {
|
|
27
|
-
id: childProduct.id,
|
|
28
|
-
title: childProduct.title,
|
|
29
|
-
},
|
|
30
|
-
quantity: childConfig.default_quantity || 1,
|
|
31
|
-
min_quantity: childConfig.min_quantity,
|
|
32
|
-
max_quantity: childConfig.max_quantity,
|
|
33
|
-
optional: childConfig.optional,
|
|
34
|
-
separate_shipping: childConfig.separate_shipping,
|
|
35
|
-
individual_price: childConfig.individual_price,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
// If child product doesn't exist, return basic info
|
|
40
|
-
return {
|
|
41
|
-
id: childConfig.id,
|
|
42
|
-
product: {
|
|
43
|
-
id: childConfig.id,
|
|
44
|
-
title: "Product not found",
|
|
45
|
-
},
|
|
46
|
-
quantity: childConfig.default_quantity || 1,
|
|
47
|
-
min_quantity: childConfig.min_quantity,
|
|
48
|
-
max_quantity: childConfig.max_quantity,
|
|
49
|
-
optional: childConfig.optional,
|
|
50
|
-
separate_shipping: childConfig.separate_shipping,
|
|
51
|
-
individual_price: childConfig.individual_price,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}));
|
|
55
|
-
return {
|
|
56
|
-
id: bundle.id,
|
|
57
|
-
title: product.title,
|
|
58
|
-
product: {
|
|
59
|
-
id: product.id,
|
|
60
|
-
},
|
|
61
|
-
items: enrichedChildProducts,
|
|
62
|
-
bundle_meta: bundle.bundle_meta?.data || [],
|
|
63
|
-
is_bundle: bundle.is_bundle,
|
|
64
|
-
created_at: bundle.created_at,
|
|
65
|
-
updated_at: bundle.updated_at,
|
|
66
|
-
};
|
|
37
|
+
productTitle = product.title;
|
|
38
|
+
productStatus = product.status;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// product deleted or missing — still show the bundle
|
|
67
42
|
}
|
|
68
|
-
|
|
69
|
-
|
|
43
|
+
const enrichedItems = await Promise.all(childProductsData.map(async (childConfig) => {
|
|
44
|
+
let childTitle = "Product not found";
|
|
45
|
+
try {
|
|
46
|
+
const childProduct = await productService.retrieveProduct(childConfig.id);
|
|
47
|
+
childTitle = childProduct.title;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// child product missing
|
|
51
|
+
}
|
|
70
52
|
return {
|
|
71
|
-
id:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
updated_at: bundle.updated_at,
|
|
53
|
+
id: childConfig.id,
|
|
54
|
+
product: { id: childConfig.id, title: childTitle },
|
|
55
|
+
quantity: childConfig.default_quantity || 1,
|
|
56
|
+
default_quantity: childConfig.default_quantity || 1,
|
|
57
|
+
min_quantity: childConfig.min_quantity ?? 1,
|
|
58
|
+
max_quantity: childConfig.max_quantity ?? 1,
|
|
59
|
+
optional: childConfig.optional ?? false,
|
|
60
|
+
separate_shipping: childConfig.separate_shipping ?? false,
|
|
61
|
+
individual_price: childConfig.individual_price ?? false,
|
|
81
62
|
};
|
|
82
|
-
}
|
|
63
|
+
}));
|
|
64
|
+
return {
|
|
65
|
+
id: bundle.id,
|
|
66
|
+
title: productTitle,
|
|
67
|
+
status: productStatus,
|
|
68
|
+
product: { id: bundle.id },
|
|
69
|
+
items: enrichedItems,
|
|
70
|
+
bundle_meta: bundleMetaData,
|
|
71
|
+
is_bundle: bundle.is_bundle,
|
|
72
|
+
created_at: bundle.created_at,
|
|
73
|
+
updated_at: bundle.updated_at,
|
|
74
|
+
};
|
|
83
75
|
}));
|
|
84
76
|
res.json({
|
|
85
77
|
bundled_products: enrichedBundles,
|
|
86
|
-
count
|
|
87
|
-
limit
|
|
88
|
-
offset
|
|
78
|
+
count,
|
|
79
|
+
limit,
|
|
80
|
+
offset,
|
|
89
81
|
});
|
|
90
82
|
}
|
|
91
83
|
catch (error) {
|
|
92
84
|
res.status(500).json({
|
|
93
85
|
message: "Failed to retrieve bundled products",
|
|
94
|
-
error: error instanceof Error ? error.message : "Unknown error"
|
|
86
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
95
87
|
});
|
|
96
88
|
}
|
|
97
89
|
}
|
|
@@ -149,4 +141,4 @@ async function POST(req, res) {
|
|
|
149
141
|
});
|
|
150
142
|
}
|
|
151
143
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2J1bmRsZWQtcHJvZHVjdHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSxrQkFpRkM7QUFFRCxvQkE4REM7QUE5SkQsc0RBQXdEO0FBRXhELHFEQUFtRDtBQUduRCxTQUFTLGNBQWMsQ0FBQyxLQUFVO0lBQ2hDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDckIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQUMsT0FBTyxFQUFFLENBQUE7UUFBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFTSxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUFrQixFQUNsQixHQUFtQjtJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFlLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDdkQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV4RCxNQUFNLGFBQWEsR0FBa0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQWEsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sY0FBYyxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFaEYsOEVBQThFO1FBQzlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUE7UUFDL0IsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFBO1FBRXhELE1BQU0sZUFBZSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0IsTUFBTSxpQkFBaUIsR0FBVSxjQUFjLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUE7WUFDbEYsTUFBTSxjQUFjLEdBQVUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFBO1lBRTVFLElBQUksWUFBWSxHQUFHLG1CQUFtQixDQUFBO1lBQ3RDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQTtZQUU3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDL0QsWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7Z0JBQzVCLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1lBQ2hDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AscURBQXFEO1lBQ3ZELENBQUM7WUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3JDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBZ0IsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQTtnQkFDcEMsSUFBSSxDQUFDO29CQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sY0FBYyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7b0JBQ3pFLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFBO2dCQUNqQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCx3QkFBd0I7Z0JBQzFCLENBQUM7Z0JBQ0QsT0FBTztvQkFDTCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7b0JBQ2xELFFBQVEsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLElBQUksQ0FBQztvQkFDM0MsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQixJQUFJLENBQUM7b0JBQ25ELFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWSxJQUFJLENBQUM7b0JBQzNDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWSxJQUFJLENBQUM7b0JBQzNDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxJQUFJLEtBQUs7b0JBQ3ZDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsSUFBSSxLQUFLO29CQUN6RCxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLElBQUksS0FBSztpQkFDeEQsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUNILENBQUE7WUFFRCxPQUFPO2dCQUNMLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDYixLQUFLLEVBQUUsWUFBWTtnQkFDbkIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUMxQixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7YUFDOUIsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUNILENBQUE7UUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsZ0JBQWdCLEVBQUUsZUFBZTtZQUNqQyxLQUFLO1lBQ0wsS0FBSztZQUNMLE1BQU07U0FDUCxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxxQ0FBcUM7WUFDOUMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWU7U0FDaEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUN4QixHQUFrQixFQUNsQixHQUFtQjtJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFJckMsQ0FBQTtRQUVELDJCQUEyQjtRQUMzQixNQUFNLGNBQWMsR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sZUFBZSxHQUFHLE1BQU0sY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXpDLDhCQUE4QjtRQUM5QixNQUFNLGFBQWEsR0FBa0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQWEsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNoRCxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0JBQ3JCLGNBQWMsRUFBRTtvQkFDZCxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDekIsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUNuQixZQUFZLEVBQUUsQ0FBQzt3QkFDZixZQUFZLEVBQUUsQ0FBQzt3QkFDZixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDL0IsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsaUJBQWlCLEVBQUUsS0FBSzt3QkFDeEIsZ0JBQWdCLEVBQUUsS0FBSztxQkFDeEIsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxJQUFJLEVBQUUsRUFBRTtpQkFDVDtnQkFDRCxTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDLENBQUMsQ0FBQTtRQUVILEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDUCxlQUFlLEVBQUU7Z0JBQ2YsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNyQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUs7Z0JBQzNCLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUU7aUJBQ3RCO2dCQUNELEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxQixFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQ25CLE9BQU8sRUFBRTt3QkFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQ25CLEtBQUssRUFBRSxTQUFTLEVBQUUsbURBQW1EO3FCQUN0RTtvQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7Z0JBQ2hDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTthQUNqQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLGtDQUFrQztZQUMzQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZTtTQUNoRSxDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -39,16 +39,7 @@ async function GET(req, res) {
|
|
|
39
39
|
async function POST(req, res) {
|
|
40
40
|
const { id: productId } = req.params;
|
|
41
41
|
const { child_product_ids, bundle_meta, is_bundle } = req.body;
|
|
42
|
-
//
|
|
43
|
-
try {
|
|
44
|
-
await (0, delete_product_bundle_1.deleteProductBundleWorkflow)(req.scope).run({
|
|
45
|
-
input: { product_id: productId }
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
// Ignore errors if no bundle exists to delete
|
|
50
|
-
}
|
|
51
|
-
// Then create a new bundle config
|
|
42
|
+
// updateProductBundleWorkflow handles both create and update (upsert logic)
|
|
52
43
|
const { result: product } = await (0, update_product_bundle_1.updateProductBundleWorkflow)(req.scope).run({
|
|
53
44
|
input: {
|
|
54
45
|
product_id: productId,
|
|
@@ -68,4 +59,4 @@ async function DELETE(req, res) {
|
|
|
68
59
|
});
|
|
69
60
|
res.json({ product });
|
|
70
61
|
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3RzL1tpZF0vYnVuZGxlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsa0JBa0NDO0FBRUQsb0JBa0NDO0FBRUQsd0JBYUM7QUFqR0QsMEZBQXNIO0FBQ3RILDBGQUE0RjtBQUM1Riw0REFBOEQ7QUFFOUQscURBQW1EO0FBUTVDLEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtRQUNwQyxNQUFNLGFBQWEsR0FBa0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQWEsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sY0FBYyxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFaEYsa0JBQWtCO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUM5QyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7U0FDaEIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN2QyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFL0QsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLE9BQU8sRUFBRTtnQkFDUCxHQUFHLE9BQU87Z0JBQ1YsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLHVDQUF1QztZQUNoRCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZTtTQUNoRSxDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQ3hCLEdBQWtCLEVBQ2xCLEdBQW1CO0lBRW5CLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUNwQyxNQUFNLEVBQ0osaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxTQUFTLEVBQ1YsR0FBRyxHQUFHLENBQUMsSUFZUCxDQUFBO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFBLG1EQUEyQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0UsS0FBSyxFQUFFO1lBQ0wsVUFBVSxFQUFFLFNBQVM7WUFDckIsaUJBQWlCO1lBQ2pCLFdBQVc7WUFDWCxTQUFTO1NBQ3lCO0tBQ3JDLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZCLENBQUM7QUFFTSxLQUFLLFVBQVUsTUFBTSxDQUMxQixHQUFrQixFQUNsQixHQUFtQjtJQUVuQixNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFFcEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUEsbURBQTJCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMzRSxLQUFLLEVBQUU7WUFDTCxVQUFVLEVBQUUsU0FBUztTQUN0QjtLQUNGLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZCLENBQUMifQ==
|