medusajs-documents-plugin 1.1.50 → 1.1.52

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.
@@ -2,7 +2,7 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { defineRouteConfig } from "@medusajs/admin-sdk";
3
3
  import { Container, Heading, Text, Button, Input, Select, Tooltip, IconButton, Switch, Label, Table, Badge, DropdownMenu, Textarea, FocusModal } from "@medusajs/ui";
4
4
  import { useState, useEffect, useMemo, Fragment } from "react";
5
- import { DocumentText, ArrowPath, Plus, Sparkles, ChevronDown, ChevronRight, ArrowDownTray, Envelope, Trash } from "@medusajs/icons";
5
+ import { DocumentText, ArrowPath, Plus, Sparkles, ChevronDown, ChevronRight, ArrowDownTray, PencilSquare, Envelope, Trash } from "@medusajs/icons";
6
6
  function extractBaseReference(displayId) {
7
7
  if (!displayId) return "";
8
8
  const cleaned = String(displayId).trim();
@@ -421,6 +421,18 @@ const DocumentsPage = () => {
421
421
  const [customDocModalOpen, setCustomDocModalOpen] = useState(false);
422
422
  const [sendModalOpen, setSendModalOpen] = useState(false);
423
423
  const [selectedDoc, setSelectedDoc] = useState(null);
424
+ const [editModalOpen, setEditModalOpen] = useState(false);
425
+ const [editingDoc, setEditingDoc] = useState(null);
426
+ const [isUpdatingDoc, setIsUpdatingDoc] = useState(false);
427
+ const [editForm, setEditForm] = useState({
428
+ title: "",
429
+ customer_name: "",
430
+ customer_email: "",
431
+ customer_phone: "",
432
+ notes: "",
433
+ terms: "",
434
+ items: []
435
+ });
424
436
  const [settings, setSettings] = useState({
425
437
  company_name: "Store",
426
438
  storefront_url: "",
@@ -982,6 +994,77 @@ const DocumentsPage = () => {
982
994
  alert("Error sending notification.");
983
995
  }
984
996
  };
997
+ const handleOpenEditModal = (doc) => {
998
+ setEditingDoc(doc);
999
+ let meta = doc.metadata || {};
1000
+ if (typeof meta === "string") {
1001
+ try {
1002
+ meta = JSON.parse(meta);
1003
+ } catch (_) {
1004
+ meta = {};
1005
+ }
1006
+ }
1007
+ const docItems = Array.isArray(meta == null ? void 0 : meta.items) && meta.items.length > 0 ? meta.items.map((it) => ({
1008
+ title: it.title || it.name || "Item",
1009
+ description: it.description || "",
1010
+ quantity: Number(it.quantity || 1),
1011
+ unit_price: Number(it.unit_price || it.rate || 0)
1012
+ })) : [
1013
+ {
1014
+ title: doc.title || "Service / Goods",
1015
+ description: "",
1016
+ quantity: 1,
1017
+ unit_price: Number(doc.total_amount || 0)
1018
+ }
1019
+ ];
1020
+ setEditForm({
1021
+ title: doc.title || (doc.type === "invoice" ? "Tax Invoice" : "Quotation"),
1022
+ customer_name: doc.customer_name || "",
1023
+ customer_email: doc.customer_email || "",
1024
+ customer_phone: doc.customer_phone || "",
1025
+ notes: (meta == null ? void 0 : meta.notes) || "",
1026
+ terms: (meta == null ? void 0 : meta.terms) || "",
1027
+ items: docItems
1028
+ });
1029
+ setEditModalOpen(true);
1030
+ };
1031
+ const handleSaveEditDocument = async (e) => {
1032
+ if (!editingDoc) return;
1033
+ setIsUpdatingDoc(true);
1034
+ try {
1035
+ const calculatedTotal = editForm.items.reduce(
1036
+ (sum, it) => sum + Number(it.quantity || 1) * Number(it.unit_price || 0),
1037
+ 0
1038
+ );
1039
+ const res = await fetch(`/admin/documents/${editingDoc.id}`, {
1040
+ method: "PUT",
1041
+ headers: { "Content-Type": "application/json" },
1042
+ credentials: "include",
1043
+ body: JSON.stringify({
1044
+ title: editForm.title,
1045
+ customer_name: editForm.customer_name,
1046
+ customer_email: editForm.customer_email,
1047
+ customer_phone: editForm.customer_phone,
1048
+ notes: editForm.notes,
1049
+ terms: editForm.terms,
1050
+ items: editForm.items,
1051
+ total: calculatedTotal
1052
+ })
1053
+ });
1054
+ const data = await res.json();
1055
+ if (!res.ok || data.error) {
1056
+ throw new Error(data.message || "Failed to update document");
1057
+ }
1058
+ setEditModalOpen(false);
1059
+ setEditingDoc(null);
1060
+ await loadDocuments();
1061
+ alert("Document updated successfully and synced with Zoho Books!");
1062
+ } catch (err) {
1063
+ alert(`Error updating document: ${err.message}`);
1064
+ } finally {
1065
+ setIsUpdatingDoc(false);
1066
+ }
1067
+ };
985
1068
  const handleSyncToZoho = async (docId) => {
986
1069
  try {
987
1070
  const res = await fetch(`/admin/documents/${docId}/sync-zoho`, {
@@ -1364,6 +1447,16 @@ const DocumentsPage = () => {
1364
1447
  children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-4 h-4" })
1365
1448
  }
1366
1449
  ),
1450
+ (doc.type === "invoice" || doc.type === "estimate" || doc.type === "quote") && /* @__PURE__ */ jsx(
1451
+ "button",
1452
+ {
1453
+ type: "button",
1454
+ onClick: () => handleOpenEditModal(doc),
1455
+ className: "p-1.5 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600 cursor-pointer",
1456
+ title: "Edit Quote / Invoice & Sync with Zoho Books",
1457
+ children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-4 h-4" })
1458
+ }
1459
+ ),
1367
1460
  /* @__PURE__ */ jsx(
1368
1461
  "button",
1369
1462
  {
@@ -1511,6 +1604,16 @@ const DocumentsPage = () => {
1511
1604
  children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-3.5 h-3.5" })
1512
1605
  }
1513
1606
  ),
1607
+ (subDoc.type === "invoice" || subDoc.type === "estimate" || subDoc.type === "quote") && /* @__PURE__ */ jsx(
1608
+ "button",
1609
+ {
1610
+ type: "button",
1611
+ onClick: () => handleOpenEditModal(subDoc),
1612
+ className: "p-1 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600",
1613
+ title: "Edit Quote / Invoice & Sync with Zoho Books",
1614
+ children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-3.5 h-3.5" })
1615
+ }
1616
+ ),
1514
1617
  /* @__PURE__ */ jsx(
1515
1618
  "button",
1516
1619
  {
@@ -1606,6 +1709,16 @@ const DocumentsPage = () => {
1606
1709
  children: /* @__PURE__ */ jsx(ArrowDownTray, { className: "w-4 h-4" })
1607
1710
  }
1608
1711
  ),
1712
+ (doc.type === "invoice" || doc.type === "estimate" || doc.type === "quote") && /* @__PURE__ */ jsx(
1713
+ "button",
1714
+ {
1715
+ type: "button",
1716
+ onClick: () => handleOpenEditModal(doc),
1717
+ className: "p-1.5 rounded hover:bg-ui-bg-subtle text-ui-fg-subtle hover:text-purple-600 cursor-pointer",
1718
+ title: "Edit Quote / Invoice & Sync with Zoho Books",
1719
+ children: /* @__PURE__ */ jsx(PencilSquare, { className: "w-4 h-4" })
1720
+ }
1721
+ ),
1609
1722
  /* @__PURE__ */ jsx(
1610
1723
  "button",
1611
1724
  {
@@ -3976,6 +4089,241 @@ Your *{document_title} #{display_id}* has been generated.
3976
4089
  )
3977
4090
  ] }) })
3978
4091
  ] })
4092
+ ] }) }),
4093
+ editModalOpen && editingDoc && /* @__PURE__ */ jsx(FocusModal, { open: editModalOpen, onOpenChange: setEditModalOpen, children: /* @__PURE__ */ jsxs(FocusModal.Content, { children: [
4094
+ /* @__PURE__ */ jsxs(FocusModal.Header, { className: "flex items-center justify-between px-6 py-4 border-b border-ui-border-base", children: [
4095
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
4096
+ /* @__PURE__ */ jsx(PencilSquare, { className: "w-5 h-5 text-purple-600" }),
4097
+ /* @__PURE__ */ jsxs(Heading, { level: "h2", children: [
4098
+ "Edit ",
4099
+ editingDoc.type === "invoice" ? "Invoice" : "Quote / Estimate",
4100
+ " #",
4101
+ editingDoc.display_id
4102
+ ] }),
4103
+ /* @__PURE__ */ jsx(Badge, { color: "purple", size: "small", children: "Zoho Synced" })
4104
+ ] }),
4105
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
4106
+ /* @__PURE__ */ jsx(
4107
+ Button,
4108
+ {
4109
+ variant: "secondary",
4110
+ size: "small",
4111
+ onClick: () => setEditModalOpen(false),
4112
+ disabled: isUpdatingDoc,
4113
+ children: "Cancel"
4114
+ }
4115
+ ),
4116
+ /* @__PURE__ */ jsx(
4117
+ Button,
4118
+ {
4119
+ variant: "primary",
4120
+ size: "small",
4121
+ onClick: () => handleSaveEditDocument(),
4122
+ isLoading: isUpdatingDoc,
4123
+ disabled: isUpdatingDoc,
4124
+ className: "bg-purple-600 hover:bg-purple-700 text-white",
4125
+ children: "Save & Sync to Zoho Books"
4126
+ }
4127
+ )
4128
+ ] })
4129
+ ] }),
4130
+ /* @__PURE__ */ jsxs(FocusModal.Body, { className: "p-6 flex flex-col gap-6 max-w-3xl mx-auto overflow-y-auto max-h-[80vh]", children: [
4131
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
4132
+ /* @__PURE__ */ jsxs("div", { children: [
4133
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Document Title" }),
4134
+ /* @__PURE__ */ jsx(
4135
+ Input,
4136
+ {
4137
+ value: editForm.title,
4138
+ onChange: (e) => setEditForm({ ...editForm, title: e.target.value }),
4139
+ size: "small"
4140
+ }
4141
+ )
4142
+ ] }),
4143
+ /* @__PURE__ */ jsxs("div", { children: [
4144
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Name" }),
4145
+ /* @__PURE__ */ jsx(
4146
+ Input,
4147
+ {
4148
+ value: editForm.customer_name,
4149
+ onChange: (e) => setEditForm({ ...editForm, customer_name: e.target.value }),
4150
+ size: "small"
4151
+ }
4152
+ )
4153
+ ] }),
4154
+ /* @__PURE__ */ jsxs("div", { children: [
4155
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Email" }),
4156
+ /* @__PURE__ */ jsx(
4157
+ Input,
4158
+ {
4159
+ value: editForm.customer_email,
4160
+ onChange: (e) => setEditForm({ ...editForm, customer_email: e.target.value }),
4161
+ size: "small"
4162
+ }
4163
+ )
4164
+ ] }),
4165
+ /* @__PURE__ */ jsxs("div", { children: [
4166
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Customer Phone" }),
4167
+ /* @__PURE__ */ jsx(
4168
+ Input,
4169
+ {
4170
+ value: editForm.customer_phone,
4171
+ onChange: (e) => setEditForm({ ...editForm, customer_phone: e.target.value }),
4172
+ size: "small"
4173
+ }
4174
+ )
4175
+ ] })
4176
+ ] }),
4177
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
4178
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
4179
+ /* @__PURE__ */ jsx(Label, { className: "text-xs font-semibold", children: "Itemized Line Items" }),
4180
+ /* @__PURE__ */ jsxs(
4181
+ Button,
4182
+ {
4183
+ variant: "secondary",
4184
+ size: "small",
4185
+ onClick: () => setEditForm({
4186
+ ...editForm,
4187
+ items: [
4188
+ ...editForm.items,
4189
+ { title: "", description: "", quantity: 1, unit_price: 0 }
4190
+ ]
4191
+ }),
4192
+ children: [
4193
+ /* @__PURE__ */ jsx(Plus, { className: "w-3.5 h-3.5 mr-1" }),
4194
+ " Add Line Item"
4195
+ ]
4196
+ }
4197
+ )
4198
+ ] }),
4199
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: editForm.items.map((it, idx) => /* @__PURE__ */ jsxs(
4200
+ "div",
4201
+ {
4202
+ className: "p-3 border border-ui-border-base rounded-lg bg-ui-bg-base flex flex-col gap-2",
4203
+ children: [
4204
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-12 gap-2 items-start", children: [
4205
+ /* @__PURE__ */ jsxs("div", { className: "col-span-6 flex flex-col gap-1", children: [
4206
+ /* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Item Title *" }),
4207
+ /* @__PURE__ */ jsx(
4208
+ Input,
4209
+ {
4210
+ placeholder: "Item name / Service",
4211
+ value: it.title,
4212
+ onChange: (e) => {
4213
+ const newItems = [...editForm.items];
4214
+ newItems[idx] = { ...newItems[idx], title: e.target.value };
4215
+ setEditForm({ ...editForm, items: newItems });
4216
+ },
4217
+ size: "small"
4218
+ }
4219
+ )
4220
+ ] }),
4221
+ /* @__PURE__ */ jsxs("div", { className: "col-span-2 flex flex-col gap-1", children: [
4222
+ /* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Qty" }),
4223
+ /* @__PURE__ */ jsx(
4224
+ Input,
4225
+ {
4226
+ type: "number",
4227
+ min: "1",
4228
+ value: it.quantity,
4229
+ onChange: (e) => {
4230
+ const newItems = [...editForm.items];
4231
+ newItems[idx] = { ...newItems[idx], quantity: Number(e.target.value) || 1 };
4232
+ setEditForm({ ...editForm, items: newItems });
4233
+ },
4234
+ size: "small"
4235
+ }
4236
+ )
4237
+ ] }),
4238
+ /* @__PURE__ */ jsxs("div", { className: "col-span-3 flex flex-col gap-1", children: [
4239
+ /* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Unit Price" }),
4240
+ /* @__PURE__ */ jsx(
4241
+ Input,
4242
+ {
4243
+ type: "number",
4244
+ step: "0.01",
4245
+ value: it.unit_price,
4246
+ onChange: (e) => {
4247
+ const newItems = [...editForm.items];
4248
+ newItems[idx] = { ...newItems[idx], unit_price: Number(e.target.value) || 0 };
4249
+ setEditForm({ ...editForm, items: newItems });
4250
+ },
4251
+ size: "small"
4252
+ }
4253
+ )
4254
+ ] }),
4255
+ /* @__PURE__ */ jsx("div", { className: "col-span-1 pt-6 flex justify-end", children: /* @__PURE__ */ jsx(
4256
+ Button,
4257
+ {
4258
+ variant: "transparent",
4259
+ size: "small",
4260
+ onClick: () => {
4261
+ const newItems = editForm.items.filter((_, i) => i !== idx);
4262
+ setEditForm({ ...editForm, items: newItems });
4263
+ },
4264
+ className: "text-ui-fg-muted hover:text-ui-fg-error p-1",
4265
+ children: /* @__PURE__ */ jsx(Trash, { className: "w-4 h-4" })
4266
+ }
4267
+ ) })
4268
+ ] }),
4269
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
4270
+ /* @__PURE__ */ jsx(Label, { className: "text-[11px] text-ui-fg-subtle", children: "Description (Optional)" }),
4271
+ /* @__PURE__ */ jsx(
4272
+ Input,
4273
+ {
4274
+ placeholder: "Optional item details / specifications",
4275
+ value: it.description,
4276
+ onChange: (e) => {
4277
+ const newItems = [...editForm.items];
4278
+ newItems[idx] = { ...newItems[idx], description: e.target.value };
4279
+ setEditForm({ ...editForm, items: newItems });
4280
+ },
4281
+ size: "small"
4282
+ }
4283
+ )
4284
+ ] })
4285
+ ]
4286
+ },
4287
+ idx
4288
+ )) }),
4289
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-end items-center gap-4 py-2 border-t border-ui-border-base", children: [
4290
+ /* @__PURE__ */ jsx(Text, { className: "text-xs text-ui-fg-subtle", children: "Calculated Total:" }),
4291
+ /* @__PURE__ */ jsx(Text, { className: "text-sm font-semibold", children: formatCurrency(
4292
+ editForm.items.reduce(
4293
+ (sum, it) => sum + (Number(it.quantity) || 1) * (Number(it.unit_price) || 0),
4294
+ 0
4295
+ ),
4296
+ editingDoc.currency_code || "KES"
4297
+ ) })
4298
+ ] })
4299
+ ] }),
4300
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
4301
+ /* @__PURE__ */ jsxs("div", { children: [
4302
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Notes / Client Remarks" }),
4303
+ /* @__PURE__ */ jsx(
4304
+ Textarea,
4305
+ {
4306
+ value: editForm.notes,
4307
+ onChange: (e) => setEditForm({ ...editForm, notes: e.target.value }),
4308
+ rows: 3,
4309
+ placeholder: "Notes visible on the document..."
4310
+ }
4311
+ )
4312
+ ] }),
4313
+ /* @__PURE__ */ jsxs("div", { children: [
4314
+ /* @__PURE__ */ jsx(Label, { className: "text-xs", children: "Terms & Conditions" }),
4315
+ /* @__PURE__ */ jsx(
4316
+ Textarea,
4317
+ {
4318
+ value: editForm.terms,
4319
+ onChange: (e) => setEditForm({ ...editForm, terms: e.target.value }),
4320
+ rows: 3,
4321
+ placeholder: "Terms and conditions..."
4322
+ }
4323
+ )
4324
+ ] })
4325
+ ] })
4326
+ ] })
3979
4327
  ] }) })
3980
4328
  ] });
3981
4329
  };
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GET = GET;
7
7
  exports.DELETE = DELETE;
8
+ exports.PUT = PUT;
9
+ exports.POST = POST;
8
10
  const documents_1 = require("../../../../modules/documents");
9
11
  const service_1 = require("../../../../modules/documents/service");
10
12
  const zoho_books_1 = __importDefault(require("../../../../services/zoho-books"));
@@ -98,4 +100,26 @@ async function DELETE(req, res) {
98
100
  return res.status(500).json({ message: error.message, error: true });
99
101
  }
100
102
  }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsa0JBMEJDO0FBR0Qsd0JBd0VDO0FBMUdELDZEQUFpRTtBQUNqRSxtRUFBcUc7QUFDckcsaUZBQStEO0FBRS9ELDZEQUE2RDtBQUN0RCxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUFrQyxFQUNsQyxHQUFtQjtJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsNEJBQWdCLENBQUMsQ0FBQztRQUNuRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUU1QixJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBQSwrQkFBcUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENB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
103
+ // PUT /admin/documents/:id - Edit / update an existing document (in database and Zoho Books)
104
+ async function PUT(req, res) {
105
+ try {
106
+ const documentService = req.scope.resolve(documents_1.DOCUMENTS_MODULE);
107
+ const docId = req.params.id;
108
+ const body = (req.body || {});
109
+ const updated = await documentService.updateDocument(docId, body, req.scope);
110
+ return res.json({
111
+ success: true,
112
+ message: "Document updated successfully",
113
+ document: updated,
114
+ });
115
+ }
116
+ catch (error) {
117
+ req.scope.resolve("logger", { allowUnregistered: true })?.error?.(`[Documents-API] Failed to update document ${req.params.id}: ${error.message}`);
118
+ return res.status(500).json({ message: error.message, error: true });
119
+ }
120
+ }
121
+ // POST /admin/documents/:id - Alternative method for updating document
122
+ async function POST(req, res) {
123
+ return PUT(req, res);
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RvY3VtZW50cy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsa0JBMEJDO0FBR0Qsd0JBd0VDO0FBR0Qsa0JBc0JDO0FBR0Qsb0JBS0M7QUEzSUQsNkRBQWlFO0FBQ2pFLG1FQUFxRztBQUNyRyxpRkFBK0Q7QUFFL0QsNkRBQTZEO0FBQ3RELEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQWtDLEVBQ2xDLEdBQW1CO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBRTVCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7QUFDSCxDQUFDO0FBRUQsMkZBQTJGO0FBQ3BGLEtBQUssVUFBVSxNQUFNLENBQzFCLEdBQWtDLEVBQ2xDLEdBQW1CO0lBRW5CLElBQUksQ0FBQztRQUNILE1BQU0sZUFBZSxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBRTVCLElBQUksTUFBTSxHQUFRLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RFLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6RSxJQUNFLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsQ0FBQyxjQUFjO29CQUN2QixRQUFRLENBQUMsa0JBQWtCO29CQUMzQixRQUFRLENBQUMsa0JBQWtCO29CQUMzQixRQUFRLENBQUMsb0JBQW9CLEVBQzdCLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxvQkFBZ0IsQ0FDL0I7d0JBQ0UsU0FBUyxFQUFFLFFBQVEsQ0FBQyxjQUFjO3dCQUNsQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGtCQUFrQjt3QkFDMUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7d0JBQzFDLGVBQWUsRUFBRSxRQUFRLENBQUMsb0JBQW9CO3dCQUM5QyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxLQUFLO3FCQUN0QyxFQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQ3pELENBQUM7b0JBRUYsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUM5QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO3lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDdEMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztvQkFDckUsQ0FBQzt5QkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3JDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxlQUFlLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxJQUFBLCtCQUFxQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSwrQkFBK0I7WUFDeEMsRUFBRSxFQUFFLEtBQUs7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztBQUNILENBQUM7QUFFRCw2RkFBNkY7QUFDdEYsS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBdUIsRUFDdkIsR0FBbUI7SUFFbkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxlQUFlLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUFnQixDQUFDLENBQUM7UUFDbkYsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBUSxDQUFDO1FBRXJDLE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSwrQkFBK0I7WUFDeEMsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FDL0QsNkNBQTZDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FDL0UsQ0FBQztRQUNGLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0FBQ0gsQ0FBQztBQUVELHVFQUF1RTtBQUNoRSxLQUFLLFVBQVUsSUFBSSxDQUN4QixHQUF1QixFQUN2QixHQUFtQjtJQUVuQixPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyJ9