@researchdatabox/redbox-core 5.0.4-beta.12498 → 5.1.0-beta.12568

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.
Files changed (101) hide show
  1. package/dist/DatastreamService.d.ts +2 -0
  2. package/dist/DatastreamService.d.ts.map +1 -1
  3. package/dist/QueueService.d.ts +1 -1
  4. package/dist/QueueService.d.ts.map +1 -1
  5. package/dist/RecordStorageConcurrency.d.ts +2 -1
  6. package/dist/RecordStorageConcurrency.d.ts.map +1 -1
  7. package/dist/RecordStorageConcurrency.js +1 -1
  8. package/dist/RecordWriteOptions.d.ts +21 -0
  9. package/dist/RecordWriteOptions.d.ts.map +1 -0
  10. package/dist/RecordWriteOptions.js +17 -0
  11. package/dist/RecordsService.d.ts +5 -0
  12. package/dist/RecordsService.d.ts.map +1 -1
  13. package/dist/RecordsService.js +1 -1
  14. package/dist/StorageService.d.ts +12 -0
  15. package/dist/StorageService.d.ts.map +1 -1
  16. package/dist/StorageService.js +1 -1
  17. package/dist/api-routes/schemas/responses.d.ts +1 -1
  18. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  19. package/dist/config/agendaQueue.config.js +10 -1
  20. package/dist/config/i18n.config.d.ts +4 -0
  21. package/dist/config/i18n.config.d.ts.map +1 -1
  22. package/dist/config/i18n.config.js +1 -1
  23. package/dist/configmodels/FigsharePublishing.d.ts +103 -0
  24. package/dist/configmodels/FigsharePublishing.d.ts.map +1 -1
  25. package/dist/configmodels/FigsharePublishing.js +36 -2
  26. package/dist/controllers/RecordAuditController.d.ts.map +1 -1
  27. package/dist/controllers/RecordAuditController.js +24 -6
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -1
  31. package/dist/model/storage/FigshareSyncModel.d.ts +126 -0
  32. package/dist/model/storage/FigshareSyncModel.d.ts.map +1 -0
  33. package/dist/model/storage/FigshareSyncModel.js +3 -0
  34. package/dist/model/storage/RecordAuditModel.d.ts +3 -0
  35. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -1
  36. package/dist/model/storage/RecordAuditModel.js +29 -1
  37. package/dist/model/storage/RecordModel.d.ts +3 -0
  38. package/dist/model/storage/RecordModel.d.ts.map +1 -1
  39. package/dist/services/AgendaQueueService.d.ts +1 -1
  40. package/dist/services/AgendaQueueService.d.ts.map +1 -1
  41. package/dist/services/AgendaQueueService.js +7 -4
  42. package/dist/services/FigshareService.d.ts +15 -10
  43. package/dist/services/FigshareService.d.ts.map +1 -1
  44. package/dist/services/FigshareService.js +76 -576
  45. package/dist/services/I18nEntriesService.d.ts +13 -12
  46. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  47. package/dist/services/I18nEntriesService.js +103 -65
  48. package/dist/services/RecordsService.d.ts +5 -1
  49. package/dist/services/RecordsService.d.ts.map +1 -1
  50. package/dist/services/RecordsService.js +77 -23
  51. package/dist/services/StandardDatastreamService.d.ts +5 -0
  52. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  53. package/dist/services/StandardDatastreamService.js +18 -1
  54. package/dist/services/figshare-v2/admin.d.ts +16 -0
  55. package/dist/services/figshare-v2/admin.d.ts.map +1 -0
  56. package/dist/services/figshare-v2/admin.js +283 -0
  57. package/dist/services/figshare-v2/assets.d.ts +20 -1
  58. package/dist/services/figshare-v2/assets.d.ts.map +1 -1
  59. package/dist/services/figshare-v2/assets.js +16 -1
  60. package/dist/services/figshare-v2/config.d.ts +8 -2
  61. package/dist/services/figshare-v2/config.d.ts.map +1 -1
  62. package/dist/services/figshare-v2/config.js +31 -3
  63. package/dist/services/figshare-v2/execution.d.ts +25 -0
  64. package/dist/services/figshare-v2/execution.d.ts.map +1 -0
  65. package/dist/services/figshare-v2/execution.js +49 -0
  66. package/dist/services/figshare-v2/http.d.ts +6 -1
  67. package/dist/services/figshare-v2/http.d.ts.map +1 -1
  68. package/dist/services/figshare-v2/http.js +69 -12
  69. package/dist/services/figshare-v2/identity.d.ts +12 -0
  70. package/dist/services/figshare-v2/identity.d.ts.map +1 -0
  71. package/dist/services/figshare-v2/identity.js +78 -0
  72. package/dist/services/figshare-v2/managed-assets.d.ts +9 -0
  73. package/dist/services/figshare-v2/managed-assets.d.ts.map +1 -0
  74. package/dist/services/figshare-v2/managed-assets.js +229 -0
  75. package/dist/services/figshare-v2/plan.d.ts.map +1 -1
  76. package/dist/services/figshare-v2/plan.js +2 -9
  77. package/dist/services/figshare-v2/source-intent.d.ts +9 -0
  78. package/dist/services/figshare-v2/source-intent.d.ts.map +1 -0
  79. package/dist/services/figshare-v2/source-intent.js +93 -0
  80. package/dist/services/figshare-v2/status.d.ts +4 -0
  81. package/dist/services/figshare-v2/status.d.ts.map +1 -0
  82. package/dist/services/figshare-v2/status.js +29 -0
  83. package/dist/services/figshare-v2/sync-store.d.ts +27 -0
  84. package/dist/services/figshare-v2/sync-store.d.ts.map +1 -0
  85. package/dist/services/figshare-v2/sync-store.js +139 -0
  86. package/dist/services/figshare-v2/types.d.ts +3 -0
  87. package/dist/services/figshare-v2/types.d.ts.map +1 -1
  88. package/dist/services/figshare-v2/types.js +1 -1
  89. package/dist/services/figshare-v2/worker.d.ts +16 -0
  90. package/dist/services/figshare-v2/worker.d.ts.map +1 -0
  91. package/dist/services/figshare-v2/worker.js +752 -0
  92. package/dist/utilities/TranslationHtml.d.ts +3 -0
  93. package/dist/utilities/TranslationHtml.d.ts.map +1 -0
  94. package/dist/utilities/TranslationHtml.js +46 -0
  95. package/dist/waterline-models/FigshareSync.d.ts +41 -0
  96. package/dist/waterline-models/FigshareSync.d.ts.map +1 -0
  97. package/dist/waterline-models/FigshareSync.js +168 -0
  98. package/dist/waterline-models/index.d.ts +2 -0
  99. package/dist/waterline-models/index.d.ts.map +1 -1
  100. package/dist/waterline-models/index.js +4 -1
  101. package/package.json +9 -8
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mirrorManagedAssets = mirrorManagedAssets;
4
+ exports.cleanupProjection = cleanupProjection;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const types_1 = require("./types");
7
+ const plan_1 = require("./plan");
8
+ const assets_1 = require("./assets");
9
+ const runtime_1 = require("./runtime");
10
+ const execution_1 = require("./execution");
11
+ const identity_1 = require("./identity");
12
+ const available = (status) => ['available', 'completed'].includes(String(status ?? '').toLowerCase());
13
+ /** Only receipts confer deletion authority; a filename never does. */
14
+ async function mirrorManagedAssets(client, config, record, articleId, state, checkpoint) {
15
+ const selected = (0, plan_1.getSelectedDataLocations)(config, record);
16
+ const hosted = selected.filter(e => e.type === 'attachment' || typeof e.figshareReceipt === 'string');
17
+ const links = config.assets.enableHostedFiles && hosted.length ? [] : selected.filter(e => e.type === 'url' && !e.ignore && !e.figshareReceipt);
18
+ const desired = new Set();
19
+ let files = await (0, runtime_1.listArticleFiles)(client, articleId);
20
+ for (const entry of hosted) {
21
+ if (!config.assets.enableHostedFiles)
22
+ continue;
23
+ if (typeof entry.figshareReceipt === 'string') {
24
+ const receipt = state.receipts.find(r => r.key === entry.figshareReceipt && r.articleId === articleId && r.state === 'available');
25
+ if (!receipt || !files.some(f => String(f.id) === receipt.fileId && available(f.status)))
26
+ throw new execution_1.FigshareRepairRequired('Hosted file reference has no verified receipt');
27
+ desired.add(receipt.key);
28
+ continue;
29
+ }
30
+ const localId = String(entry.fileId ?? '');
31
+ const name = String(entry.name ?? '');
32
+ if (!localId || !name)
33
+ throw new Error('Selected attachment is missing its ID or name');
34
+ // Read before staging, so a concurrent rewrite can only make the recorded fingerprint stale (forcing a re-hash),
35
+ // never pair a new fingerprint with old content.
36
+ const fingerprint = await (0, assets_1.getAttachmentFingerprint)(record.redboxOid, localId);
37
+ const unchanged = fingerprint && state.receipts.find(r => r.kind === 'hosted' && r.localId === localId && r.fingerprint === fingerprint && r.articleId === articleId && r.state === 'available');
38
+ if (unchanged && files.some(f => String(f.id) === unchanged.fileId && available(f.status) && Number(f.size) === unchanged.size)) {
39
+ desired.add(unchanged.key);
40
+ continue;
41
+ }
42
+ const disk = (0, assets_1.getStagingDisk)(config);
43
+ const stagingKey = (0, assets_1.buildStagingKey)(config, articleId, record.redboxOid, localId, name);
44
+ try {
45
+ const size = await (0, assets_1.stageAttachmentToDisk)(disk, stagingKey, await (0, assets_1.getAttachmentStream)(record.redboxOid, localId));
46
+ const hash = (0, node_crypto_1.createHash)('sha256');
47
+ const md5Hash = (0, node_crypto_1.createHash)('md5');
48
+ for await (const chunk of await disk.getStream(stagingKey)) {
49
+ hash.update(chunk);
50
+ md5Hash.update(chunk);
51
+ }
52
+ const md5 = md5Hash.digest('hex');
53
+ const digest = hash.digest('hex');
54
+ const key = (0, node_crypto_1.createHash)('sha256').update(`${localId}:${digest}:${size}`).digest('hex');
55
+ desired.add(key);
56
+ let receipt = state.receipts.find(r => r.key === key);
57
+ if (receipt?.state === 'removed')
58
+ receipt = undefined;
59
+ let resumeFileId;
60
+ if (receipt) {
61
+ const remote = files.find(f => String(f.id) === receipt.fileId);
62
+ if (remote && available(remote.status) && Number(remote.size) === size) {
63
+ const verified = receipt;
64
+ state = await checkpoint(s => {
65
+ const target = s.receipts.find(r => r.key === verified.key);
66
+ target.state = 'available';
67
+ target.completedAt = new Date().toISOString();
68
+ target.downloadUrl = remote.download_url;
69
+ target.desired = true;
70
+ if (fingerprint)
71
+ target.fingerprint = fingerprint;
72
+ });
73
+ continue;
74
+ }
75
+ // Only an explicit operator decision, made after stopping the old uploader,
76
+ // permits resuming an interrupted multipart upload.
77
+ if (receipt.resumeApproved && receipt.fileId && receipt.state === 'uploading' && remote)
78
+ resumeFileId = receipt.fileId;
79
+ else {
80
+ if (['initialising', 'uploading'].includes(receipt.state))
81
+ throw new execution_1.FigshareRepairRequired('Interrupted upload requires reconciliation before another initialisation');
82
+ if (receipt.state === 'completing' && remote)
83
+ throw new execution_1.FigshareWaiting('uploads');
84
+ throw new execution_1.FigshareRepairRequired('Managed remote file is missing or no longer matches its receipt');
85
+ }
86
+ }
87
+ let location;
88
+ let fileId;
89
+ if (resumeFileId) {
90
+ location = `${config.connection.baseUrl.replace(/\/+$/, '')}/account/articles/${articleId}/files/${resumeFileId}`;
91
+ fileId = resumeFileId;
92
+ state = await checkpoint(s => { s.receipts.find(r => r.key === key).resumeApproved = false; });
93
+ }
94
+ else {
95
+ receipt = { key, localId, digest, md5, size, name, articleId, kind: 'hosted', state: 'initialising', desired: true };
96
+ const created = receipt;
97
+ state = await checkpoint(s => { s.receipts = s.receipts.filter(r => r.key !== key); s.receipts.push(created); });
98
+ const init = await client.createArticleFile(articleId, { name, size, md5 });
99
+ const remoteId = String(init.entity_id ?? init.id ?? /\/files\/(\d+)(?:$|\?)/.exec(init.location)?.[1] ?? '');
100
+ if (remoteId) {
101
+ fileId = remoteId;
102
+ state = await checkpoint(s => { s.receipts.find(r => r.key === key).fileId = remoteId; });
103
+ }
104
+ location = init.location;
105
+ }
106
+ try {
107
+ const descriptor = await client.getLocation(location);
108
+ const uploadFileId = String(descriptor.id);
109
+ fileId = uploadFileId;
110
+ state = await checkpoint(s => { Object.assign(s.receipts.find(r => r.key === key), { fileId: uploadFileId, state: 'uploading' }); });
111
+ const parts = (await client.getLocation(descriptor.upload_url)).parts ?? [];
112
+ const source = await disk.getStream(stagingKey);
113
+ try {
114
+ for await (const part of (0, assets_1.readPartsSequentially)(source, parts)) {
115
+ if (resumeFileId && ['COMPLETE', 'COMPLETED'].includes(String(parts.find(p => p.partNo === part.partNo)?.status).toUpperCase())) {
116
+ for await (const _chunk of part.stream) { /* advance through the confirmed part */ }
117
+ }
118
+ else
119
+ await client.uploadFilePart(descriptor.upload_url, part.partNo, part.stream);
120
+ }
121
+ }
122
+ finally {
123
+ source.destroy();
124
+ }
125
+ state = await checkpoint(s => { s.receipts.find(r => r.key === key).state = 'completing'; });
126
+ await client.completeFileUpload(articleId, uploadFileId);
127
+ }
128
+ catch (error) {
129
+ // This worker has stopped uploading and, if its lease-checked checkpoint succeeds, no successor can have
130
+ // started, so its own interrupted upload may resume on retry. A lost lease leaves the decision to an operator.
131
+ const interrupted = fileId;
132
+ if (interrupted)
133
+ state = await checkpoint(s => { Object.assign(s.receipts.find(r => r.key === key), { fileId: interrupted, state: 'uploading', resumeApproved: true }); });
134
+ throw error;
135
+ }
136
+ files = await (0, runtime_1.listArticleFiles)(client, articleId);
137
+ const remote = files.find(f => String(f.id) === fileId);
138
+ if (!remote || !available(remote.status))
139
+ throw new execution_1.FigshareWaiting('uploads');
140
+ if (Number(remote.size) !== size)
141
+ throw new execution_1.FigshareRepairRequired('Uploaded file size does not match staged content');
142
+ state = await checkpoint(s => { Object.assign(s.receipts.find(r => r.key === key), { state: 'available', completedAt: new Date().toISOString(), downloadUrl: remote.download_url, ...(fingerprint ? { fingerprint } : {}) }); });
143
+ }
144
+ finally {
145
+ // Only temporary staging objects are removed. Source attachment bytes remain.
146
+ await disk.delete(stagingKey);
147
+ }
148
+ }
149
+ for (const entry of links) {
150
+ if (!config.assets.enableLinkFiles)
151
+ continue;
152
+ const link = String(entry.location ?? '');
153
+ if (!/^https?:\/\//i.test(link))
154
+ throw new Error('Selected Figshare link must use HTTP or HTTPS');
155
+ const key = (0, node_crypto_1.createHash)('sha256').update(`link:${link}`).digest('hex');
156
+ desired.add(key);
157
+ const receipt = state.receipts.find(r => r.key === key && r.state !== 'removed');
158
+ if (receipt) {
159
+ if (!receipt.fileId || !files.some(f => String(f.id) === receipt.fileId))
160
+ throw new execution_1.FigshareRepairRequired('Uncertain linked file initialisation requires repair');
161
+ continue;
162
+ }
163
+ // A legacy-created link has no receipt, so it is reused but never adopted for deletion.
164
+ if (files.some(f => f.is_link_only === true && f.download_url === link))
165
+ continue;
166
+ state = await checkpoint(s => {
167
+ s.receipts = s.receipts.filter(r => r.key !== key);
168
+ s.receipts.push({ key, localId: link, digest: key, size: 0, name: link, articleId, link, kind: 'link', state: 'initialising', desired: true });
169
+ });
170
+ const init = await client.createArticleFile(articleId, { link });
171
+ const fileId = String(init.entity_id ?? init.id ?? /\/files\/(\d+)(?:$|\?)/.exec(init.location)?.[1] ?? '');
172
+ if (!fileId)
173
+ throw new execution_1.FigshareRepairRequired('Linked file response did not identify the created file');
174
+ state = await checkpoint(s => { Object.assign(s.receipts.find(r => r.key === key), { fileId, state: 'available', completedAt: new Date().toISOString() }); });
175
+ }
176
+ for (const receipt of state.receipts) {
177
+ if (desired.has(receipt.key) || receipt.state === 'removed')
178
+ continue;
179
+ if (!receipt.fileId || !['available', 'deleting'].includes(receipt.state))
180
+ throw new execution_1.FigshareRepairRequired('Unresolved managed upload cannot be deleted');
181
+ state = await checkpoint(s => { Object.assign(s.receipts.find(r => r.key === receipt.key), { desired: false, state: 'deleting' }); });
182
+ if (files.some(f => String(f.id) === receipt.fileId))
183
+ await client.deleteArticleFile(articleId, receipt.fileId);
184
+ state = await checkpoint(s => { s.receipts.find(r => r.key === receipt.key).state = 'removed'; });
185
+ }
186
+ state = await checkpoint(s => {
187
+ for (const receipt of s.receipts)
188
+ receipt.desired = desired.has(receipt.key);
189
+ s.checkpoints.assets = (0, node_crypto_1.createHash)('sha256').update([...desired].sort().join(':')).digest('hex');
190
+ });
191
+ }
192
+ async function cleanupProjection(client, config, record, article, state) {
193
+ if (!(0, identity_1.observedPublished)(article) || article.is_embargoed === true || !client.getPublicArticle)
194
+ throw new execution_1.FigshareWaiting('replacement_access');
195
+ const publicArticle = await client.getPublicArticle(String(article.id));
196
+ const publicFiles = Array.isArray(publicArticle.files) ? publicArticle.files : [];
197
+ const entries = ((0, types_1.getRecordField)(record, config.record.dataLocationsPath) ?? []);
198
+ let pending = false;
199
+ const replacements = [];
200
+ for (const entry of entries) {
201
+ if (entry.type !== 'attachment') {
202
+ replacements.push(entry);
203
+ continue;
204
+ }
205
+ const receipt = state.receipts.find(r => r.localId === entry.fileId && r.articleId === String(article.id) && r.desired && r.state === 'available');
206
+ if (!receipt) {
207
+ replacements.push(entry);
208
+ continue;
209
+ } // Unmanaged/unselected local attachments are retained.
210
+ const remote = publicFiles.find(f => String(f.id) === receipt.fileId && Number(f.size) === receipt.size);
211
+ if (!remote || typeof remote.download_url !== 'string' || !/^https?:\/\//.test(remote.download_url)) {
212
+ pending = true;
213
+ replacements.push(entry);
214
+ continue;
215
+ }
216
+ const source = await (0, assets_1.getAttachmentStream)(record.redboxOid, String(entry.fileId));
217
+ const digest = (0, node_crypto_1.createHash)('sha256');
218
+ for await (const chunk of source.readstream)
219
+ digest.update(chunk);
220
+ if (digest.digest('hex') !== receipt.digest)
221
+ throw new execution_1.FigshareWaiting('newer_sync');
222
+ replacements.push({ ...entry, type: 'url', location: remote.download_url, originalFileName: receipt.name, ignore: true,
223
+ figshareReceipt: receipt.key, localBytesRetained: true });
224
+ }
225
+ if (pending)
226
+ throw new execution_1.FigshareWaiting('replacement_access');
227
+ return replacements;
228
+ }
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1hc3NldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZmlnc2hhcmUtdjIvbWFuYWdlZC1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsa0RBNElDO0FBRUQsOENBc0JDO0FBcExELDZDQUF5QztBQUt6QyxtQ0FBeUM7QUFDekMsaUNBQWtEO0FBQ2xELHFDQUF3SjtBQUN4Six1Q0FBNkM7QUFDN0MsMkNBQXNFO0FBQ3RFLHlDQUErQztBQUcvQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWUsRUFBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUV4SCxzRUFBc0U7QUFDL0QsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE1BQXNCLEVBQUUsTUFBb0MsRUFBRSxNQUFtQixFQUFFLFNBQWlCLEVBQUUsS0FBd0IsRUFBRSxVQUEyQjtJQUNuTSxNQUFNLFFBQVEsR0FBRyxJQUFBLCtCQUF3QixFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLElBQUksT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2hKLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDbEMsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFBLDBCQUFnQixFQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtZQUFFLFNBQVM7UUFDL0MsSUFBSSxPQUFPLEtBQUssQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQztZQUNsSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUFFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBQzVLLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDeEYsaUhBQWlIO1FBQ2pILGlEQUFpRDtRQUNqRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsaUNBQXdCLEVBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RSxNQUFNLFNBQVMsR0FBRyxXQUFXLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ2pNLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUEsd0JBQWUsRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSw4QkFBcUIsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBQSw0QkFBbUIsRUFBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakgsTUFBTSxJQUFJLEdBQUcsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUEsd0JBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzFHLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUFJLE9BQU8sRUFBRSxLQUFLLEtBQUssU0FBUztnQkFBRSxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3RELElBQUksWUFBZ0MsQ0FBQztZQUNyQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE9BQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakUsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUN2RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUM7b0JBQ3pCLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUUsQ0FBQzt3QkFDN0QsTUFBTSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7d0JBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzt3QkFBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzt3QkFDM0ksSUFBSSxXQUFXOzRCQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO29CQUNwRCxDQUFDLENBQUMsQ0FBQztvQkFDSCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsNEVBQTRFO2dCQUM1RSxvREFBb0Q7Z0JBQ3BELElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssV0FBVyxJQUFJLE1BQU07b0JBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7cUJBQ2xILENBQUM7b0JBQ0osSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQzt3QkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsMEVBQTBFLENBQUMsQ0FBQztvQkFDeEssSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFlBQVksSUFBSSxNQUFNO3dCQUFFLE1BQU0sSUFBSSwyQkFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNuRixNQUFNLElBQUksa0NBQXNCLENBQUMsaUVBQWlFLENBQUMsQ0FBQztnQkFDdEcsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLFFBQWdCLENBQUM7WUFDckIsSUFBSSxNQUEwQixDQUFDO1lBQy9CLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixTQUFTLFVBQVUsWUFBWSxFQUFFLENBQUM7Z0JBQ2xILE1BQU0sR0FBRyxZQUFZLENBQUM7Z0JBQ3RCLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUUsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNySCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3hCLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakgsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDOUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO29CQUFDLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQztnQkFDaEksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0IsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sR0FBRyxZQUFZLENBQUM7Z0JBQ3RCLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0SSxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM1RSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQztvQkFDSCxJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxJQUFBLDhCQUFxQixFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUM5RCxJQUFJLFlBQVksSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7NEJBQ2hJLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7d0JBQ3RGLENBQUM7OzRCQUFNLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN0RixDQUFDO2dCQUNILENBQUM7d0JBQVMsQ0FBQztvQkFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsQ0FBQztnQkFDL0IsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBRSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUYsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHlHQUF5RztnQkFDekcsK0dBQStHO2dCQUMvRyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7Z0JBQzNCLElBQUksV0FBVztvQkFBRSxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1SyxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7WUFDRCxLQUFLLEdBQUcsTUFBTSxJQUFBLDBCQUFnQixFQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQUUsTUFBTSxJQUFJLDJCQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0UsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUk7Z0JBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLGtEQUFrRCxDQUFDLENBQUM7WUFDdkgsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BPLENBQUM7Z0JBQVMsQ0FBQztZQUNULDhFQUE4RTtZQUM5RSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWU7WUFBRSxTQUFTO1FBQzdDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNsRyxNQUFNLEdBQUcsR0FBRyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDakYsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNuSyxTQUFTO1FBQ1gsQ0FBQztRQUNELHdGQUF3RjtRQUN4RixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDbEYsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNCLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakosQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDeEcsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqSyxDQUFDO0lBQ0QsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksa0NBQXNCLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUMzSixLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQUUsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoSCxLQUFLLEdBQUcsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBRSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNCLEtBQUssTUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVE7WUFBRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUEsd0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/services/figshare-v2/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAC;AAGrH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAiBvH;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,GAAG,uBAAuB,CA+B9K"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/services/figshare-v2/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAC;AAErH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAiBvH;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,GAAG,uBAAuB,CA0B9K"}
@@ -3,14 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSelectedDataLocations = getSelectedDataLocations;
4
4
  exports.preparePublication = preparePublication;
5
5
  const types_1 = require("./types");
6
- const config_1 = require("./config");
7
6
  function getSelectedDataLocations(config, record) {
8
7
  const dataLocations = ((0, types_1.getRecordField)(record, config.record.dataLocationsPath) ?? []);
9
8
  return dataLocations.filter((entry) => {
10
9
  if (entry == null || typeof entry !== 'object') {
11
10
  return false;
12
11
  }
13
- if (entry.type === 'attachment') {
12
+ if (entry.type === 'attachment' || typeof entry.figshareReceipt === 'string') {
14
13
  return config.selection.attachmentMode === 'all' || entry[config.selection.selectedFlagPath] === true;
15
14
  }
16
15
  if (entry.type === 'url') {
@@ -22,10 +21,6 @@ function getSelectedDataLocations(config, record) {
22
21
  function preparePublication(config, record, existingState, correlationId) {
23
22
  const sameJob = existingState.lockOwner === correlationId;
24
23
  const existingArticleId = (0, types_1.getRecordField)(record, config.record.articleIdPath);
25
- if (!sameJob && (existingState.status === 'syncing' || existingState.status === 'awaiting_upload_completion')) {
26
- sails.log.warn(`FigService v2 - skipping duplicate sync for record ${record.redboxOid ?? record.id}`);
27
- return { action: 'skip', articleId: existingArticleId ? String(existingArticleId) : undefined, sameJob: false, syncState: existingState };
28
- }
29
24
  const hasArticleId = existingArticleId != null && existingArticleId !== '';
30
25
  const action = !hasArticleId
31
26
  ? 'create'
@@ -35,12 +30,10 @@ function preparePublication(config, record, existingState, correlationId) {
35
30
  const syncState = {
36
31
  ...existingState,
37
32
  status: 'syncing',
38
- lockOwner: correlationId,
39
33
  correlationId,
40
34
  lastError: '',
41
35
  lastSyncAt: new Date().toISOString()
42
36
  };
43
- (0, config_1.setSyncState)(config, record, syncState);
44
37
  return {
45
38
  action,
46
39
  articleId: hasArticleId ? String(existingArticleId) : undefined,
@@ -48,4 +41,4 @@ function preparePublication(config, record, existingState, correlationId) {
48
41
  syncState
49
42
  };
50
43
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9maWdzaGFyZS12Mi9wbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0EsNERBaUJDO0FBRUQsZ0RBK0JDO0FBckRELG1DQUFxSDtBQUNySCxxQ0FBd0M7QUFFeEMsU0FBZ0Isd0JBQXdCLENBQUMsTUFBb0MsRUFBRSxNQUFtQjtJQUNoRyxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUEsc0JBQWMsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBd0IsQ0FBQztJQUM3RyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNwQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0MsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ2hDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ3hHLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDekIsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDakcsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsTUFBb0MsRUFBRSxNQUFtQixFQUFFLGFBQWdDLEVBQUUsYUFBcUI7SUFDbkosTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUM7SUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHNCQUFjLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssNEJBQTRCLENBQUMsRUFBRSxDQUFDO1FBQzlHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUM1SSxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLElBQUksSUFBSSxJQUFJLGlCQUFpQixLQUFLLEVBQUUsQ0FBQztJQUMzRSxNQUFNLE1BQU0sR0FBRyxDQUFDLFlBQVk7UUFDMUIsQ0FBQyxDQUFDLFFBQVE7UUFDVixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHlCQUF5QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDM0gsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsUUFBUSxDQUFDO0lBRWYsTUFBTSxTQUFTLEdBQXNCO1FBQ25DLEdBQUcsYUFBYTtRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixTQUFTLEVBQUUsYUFBYTtRQUN4QixhQUFhO1FBQ2IsU0FBUyxFQUFFLEVBQUU7UUFDYixVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7S0FDckMsQ0FBQztJQUNGLElBQUEscUJBQVksRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxNQUFNO1FBQ04sU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDL0QsT0FBTztRQUNQLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQyJ9
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9maWdzaGFyZS12Mi9wbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsNERBaUJDO0FBRUQsZ0RBMEJDO0FBL0NELG1DQUFxSDtBQUVySCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFvQyxFQUFFLE1BQW1CO0lBQ2hHLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBQSxzQkFBYyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUF3QixDQUFDO0lBQzdHLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3BDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLE9BQU8sS0FBSyxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3RSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUN4RyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ2pHLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLE1BQW9DLEVBQUUsTUFBbUIsRUFBRSxhQUFnQyxFQUFFLGFBQXFCO0lBQ25KLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDO0lBQzFELE1BQU0saUJBQWlCLEdBQUcsSUFBQSxzQkFBYyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixJQUFJLElBQUksSUFBSSxpQkFBaUIsS0FBSyxFQUFFLENBQUM7SUFDM0UsTUFBTSxNQUFNLEdBQUcsQ0FBQyxZQUFZO1FBQzFCLENBQUMsQ0FBQyxRQUFRO1FBQ1YsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1lBQzNILENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUVmLE1BQU0sU0FBUyxHQUFzQjtRQUNuQyxHQUFHLGFBQWE7UUFDaEIsTUFBTSxFQUFFLFNBQVM7UUFFakIsYUFBYTtRQUNiLFNBQVMsRUFBRSxFQUFFO1FBQ2IsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO0tBQ3JDLENBQUM7SUFHRixPQUFPO1FBQ0wsTUFBTTtRQUNOLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQy9ELE9BQU87UUFDUCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,9 @@
1
+ import type { RecordModel } from '../../model/storage/RecordModel';
2
+ import type { RecordWriteOptions } from '../../RecordWriteOptions';
3
+ import type { FigshareSourceRequest } from '../../model/storage/FigshareSyncModel';
4
+ export declare function evaluateSourceCondition(condition: string, oid: string, record: Record<string, unknown>, user?: unknown): boolean;
5
+ /** Inspect configured hooks after all pre hooks, so a failed save never queues work. */
6
+ export declare function prepareSourceIntent(record: Record<string, unknown>, recordType: unknown, events: string[], user: Record<string, unknown>, initialising: boolean, maintenance?: boolean): RecordWriteOptions['figshareIntent'];
7
+ /** Resolve the original policy ID against current hook configuration, without reauthorising as the service user. */
8
+ export declare function currentExecutionEligible(recordType: unknown, policies: FigshareSourceRequest[], oid: string, record: RecordModel): boolean;
9
+ //# sourceMappingURL=source-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-intent.d.ts","sourceRoot":"","sources":["../../../src/services/figshare-v2/source-intent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAqCnF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAGhI;AACD,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,UAAQ,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAqB3N;AAED,oHAAoH;AACpH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAW1I"}
@@ -0,0 +1,93 @@
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.evaluateSourceCondition = evaluateSourceCondition;
7
+ exports.prepareSourceIntent = prepareSourceIntent;
8
+ exports.currentExecutionEligible = currentExecutionEligible;
9
+ const lodash_1 = __importDefault(require("lodash"));
10
+ const node_crypto_1 = require("node:crypto");
11
+ const config_1 = require("./config");
12
+ const syncHooks = new Set(['validateFigshareRecord', 'wakeFigshareRecord', 'createUpdateFigshareArticle', 'uploadFilesToFigshareArticle']);
13
+ const cleanupHooks = new Set(['requestFigshareCleanup', 'deleteFilesFromRedboxTrigger']);
14
+ const warnedRepeatedHooks = new Set();
15
+ /**
16
+ * Figshare hooks configured for one event phase. A default policy ID names the hook function, so reordering
17
+ * other hooks keeps queued work eligible; a repeated function adds its occurrence. `legacyId` is the earlier
18
+ * position-based default, still honoured for work queued before this change.
19
+ */
20
+ function figshareHookPolicies(recordType, event, phase) {
21
+ const hooks = lodash_1.default.get(recordType, `hooks.${event}.${phase}`, []);
22
+ if (!Array.isArray(hooks))
23
+ return [];
24
+ const occurrences = new Map();
25
+ const policies = [];
26
+ for (const [index, hook] of hooks.entries()) {
27
+ const name = String(hook.function ?? '').split('.').pop() ?? '';
28
+ const kind = syncHooks.has(name) ? 'sync' : cleanupHooks.has(name) ? 'cleanup' : null;
29
+ if (!kind)
30
+ continue;
31
+ const options = hook.options ?? {};
32
+ const site = `${event}.${phase}.${name}`;
33
+ const occurrence = occurrences.get(site) ?? 0;
34
+ occurrences.set(site, occurrence + 1);
35
+ const legacyId = String(options.policyId ?? `${event}.${phase}.${index}`);
36
+ policies.push({ kind, options, site, legacyId, policyId: String(options.policyId ?? (occurrence ? `${site}.${occurrence}` : site)) });
37
+ }
38
+ for (const [site, count] of occurrences) {
39
+ if (count > 1 && policies.some(p => p.site === site && p.options.policyId == null) && !warnedRepeatedHooks.has(site)) {
40
+ warnedRepeatedHooks.add(site);
41
+ sails.log.warn(`Figshare hook ${site} is configured ${count} times; set options.policyId on each so reordering cannot exchange their queued work`);
42
+ }
43
+ }
44
+ return policies;
45
+ }
46
+ function evaluateSourceCondition(condition, oid, record, user) {
47
+ if (!condition)
48
+ return true;
49
+ return lodash_1.default.template(condition, { imports: { _: lodash_1.default, oid, record, user: user ?? null } })().trim() === 'true';
50
+ }
51
+ /** Inspect configured hooks after all pre hooks, so a failed save never queues work. */
52
+ function prepareSourceIntent(record, recordType, events, user, initialising, maintenance = false) {
53
+ if (maintenance)
54
+ return undefined;
55
+ const config = (0, config_1.resolveFigsharePublishingConfig)(record, { requireToken: false });
56
+ if (!config?.processing?.enabled)
57
+ return undefined;
58
+ const intents = [];
59
+ let configured = false;
60
+ for (const event of events) {
61
+ for (const phase of ['pre', 'postSync', 'post']) {
62
+ for (const { kind, options, policyId } of figshareHookPolicies(recordType, event, phase)) {
63
+ configured = true;
64
+ const sourceCondition = String(options.triggerCondition ?? '');
65
+ const condition = String(options.executionCondition ?? sourceCondition);
66
+ if (/\buser\b/.test(condition))
67
+ throw new Error('Figshare hooks with requester conditions require a separate user-independent executionCondition');
68
+ if (evaluateSourceCondition(sourceCondition, String(record.redboxOid ?? ''), record, user)) {
69
+ intents.push({ kind, policyId, condition, requestedBy: String(user.username ?? user.id ?? 'unknown') });
70
+ }
71
+ }
72
+ }
73
+ }
74
+ if (!configured)
75
+ return undefined;
76
+ return { intents, requestedBy: String(user.username ?? user.id ?? 'unknown'), saveToken: (0, node_crypto_1.randomUUID)(), readiness: initialising ? 'initialising' : 'ready' };
77
+ }
78
+ /** Resolve the original policy ID against current hook configuration, without reauthorising as the service user. */
79
+ function currentExecutionEligible(recordType, policies, oid, record) {
80
+ for (const event of ['onCreate', 'onUpdate', 'onTransitionWorkflow']) {
81
+ for (const phase of ['pre', 'postSync', 'post']) {
82
+ for (const { kind, options, policyId, legacyId } of figshareHookPolicies(recordType, event, phase)) {
83
+ if (!policies.some(policy => (policy.policyId === policyId || policy.policyId === legacyId) && policy.kind === kind))
84
+ continue;
85
+ const condition = String(options.executionCondition ?? options.triggerCondition ?? '');
86
+ if (!/\buser\b/.test(condition) && evaluateSourceCondition(condition, oid, record))
87
+ return true;
88
+ }
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLWludGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9maWdzaGFyZS12Mi9zb3VyY2UtaW50ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBeUNBLDBEQUdDO0FBRUQsa0RBcUJDO0FBR0QsNERBV0M7QUFqRkQsb0RBQXVCO0FBQ3ZCLDZDQUF5QztBQUl6QyxxQ0FBMkQ7QUFFM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSw2QkFBNkIsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7QUFDM0ksTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7QUFDekYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBRzlDOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUFDLFVBQW1CLEVBQUUsS0FBYSxFQUFFLEtBQWE7SUFDN0UsTUFBTSxLQUFLLEdBQVksZ0JBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsS0FBSyxJQUFJLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUFpRCxFQUFFLENBQUM7SUFDbEUsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMs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
@@ -0,0 +1,4 @@
1
+ import type { IntegrationStatusSummary } from '../IntegrationAuditService';
2
+ /** Called only after the existing record-view access check. Never expose operation tokens or accounts. */
3
+ export declare function figshareLiveSummary(oid: string, record: Record<string, unknown>): Promise<IntegrationStatusSummary | null>;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/services/figshare-v2/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAK3E,0GAA0G;AAC1G,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAoBhI"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.figshareLiveSummary = figshareLiveSummary;
4
+ const worker_1 = require("./worker");
5
+ const config_1 = require("./config");
6
+ /** Called only after the existing record-view access check. Never expose operation tokens or accounts. */
7
+ async function figshareLiveSummary(oid, record) {
8
+ const intent = record.figshareSyncIntent;
9
+ const state = typeof FigshareSync === 'undefined' ? null : await (0, worker_1.getSyncStore)().get(oid);
10
+ const queued = intent?.pending && intent.readiness === 'ready' && intent.generation > (state?.importedGeneration ?? 0);
11
+ if (!state && !queued)
12
+ return null;
13
+ const processingError = (0, config_1.resolveFigsharePublishingConfig)(record, { requireToken: false })?.processingError;
14
+ const unresolvedFailure = state?.error?.terminal && (!state.error.kind || state.error.kind === 'sync')
15
+ && state.work.sync.requested > state.work.sync.processed;
16
+ const status = processingError ? 'configuration_error' : queued ? 'queued' : unresolvedFailure ? state.error.category === 'repair' ? 'repair_required' : 'failed' : state.status;
17
+ const failed = ['failed', 'repair_required', 'configuration_error'].includes(status);
18
+ const waiting = ['waiting', 'queued', 'retrying'].includes(status);
19
+ const outcomeState = processingError ? 'configuration_error' : queued ? 'queued' : status === 'waiting' ? state?.waitingReason ?? 'pending' : status;
20
+ return {
21
+ integrationName: 'figshare', status: failed ? 'failed' : status === 'running' ? 'started' : waiting ? 'pending' : 'success',
22
+ startedAt: state?.audit?.startedAt ?? intent?.requestedAt ?? '', traceId: state?.audit?.traceId ?? `figshare-live:${oid}`,
23
+ message: processingError ?? (failed ? state?.error?.message : undefined),
24
+ outcome: { state: outcomeState, severity: failed ? 'error' : status === 'running' ? 'in-progress' : waiting ? 'pending' : 'success', labelKey: `@figshare-live-${outcomeState}` },
25
+ keyResult: { articleId: state?.binding?.articleId, publication: state?.publication, embargoed: state?.embargoed,
26
+ lastObservation: state?.observedAt, localBytesRetained: true, nextCheckAt: processingError ? undefined : state?.nextActionAt }
27
+ };
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2ZpZ3NoYXJlLXYyL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU1BLGtEQW9CQztBQXhCRCxxQ0FBd0M7QUFDeEMscUNBQTJEO0FBRTNELDBHQUEwRztBQUNuRyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsR0FBVyxFQUFFLE1BQStCO0lBQ3BGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxrQkFBc0QsQ0FBQztJQUM3RSxNQUFNLEtBQUssR0FBRyxPQUFPLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFBLHFCQUFZLEdBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekYsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLGtCQUFrQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbkMsTUFBTSxlQUFlLEdBQUcsSUFBQSx3Q0FBK0IsRUFBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDMUcsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO1dBQ2pHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkwsTUFBTSxNQUFNLEdBQUcsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRSxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGFBQWEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNySixPQUFPO1FBQ0wsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDM0gsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxJQUFJLE1BQU0sRUFBRSxXQUFXLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxpQkFBaUIsR0FBRyxFQUFFO1FBQ3pILE9BQU8sRUFBRSxlQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEUsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLFlBQVksRUFBRSxFQUFFO1FBQ2pMLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVM7WUFDN0csZUFBZSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRTtLQUNqSSxDQUFDO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,27 @@
1
+ import type { Collection, Db } from 'mongodb';
2
+ import type { FigshareSyncModel, FigshareIntentKind, FigshareSourceIntent } from '../../model/storage/FigshareSyncModel';
3
+ export declare class FigshareLeaseLost extends Error {
4
+ constructor();
5
+ }
6
+ export declare function nextAction(work: FigshareSyncModel['work']): number | null;
7
+ /** All compound mutations use revision CAS; workers additionally match an unexpired owner. */
8
+ export declare class FigshareSyncStore {
9
+ readonly collection: Collection<FigshareSyncModel>;
10
+ constructor(db: Db);
11
+ ensureIndexes(): Promise<void>;
12
+ initialise(oid: string, brandId: string): Promise<void>;
13
+ get(oid: string): Promise<import("mongodb").WithId<FigshareSyncModel> | null>;
14
+ change(oid: string, fn: (state: FigshareSyncModel) => void, owner?: string): Promise<FigshareSyncModel>;
15
+ importSource(oid: string, brandId: string, intent: FigshareSourceIntent): Promise<void>;
16
+ request(oid: string, kind: FigshareIntentKind, dueAt?: number, onlyIfIdle?: boolean): Promise<void>;
17
+ claim(oid: string, brandId: string, owner: string, leaseMs: number): Promise<FigshareSyncModel | null>;
18
+ renew(oid: string, owner: string, leaseMs: number): Promise<void>;
19
+ assertOwner(oid: string, owner: string): Promise<void>;
20
+ release(oid: string, owner: string): Promise<void>;
21
+ due(limit?: number, excludeOids?: Iterable<string>): Promise<Array<{
22
+ oid: string;
23
+ brandId: string;
24
+ }>>;
25
+ dispatchClaim(oid: string, cooldownMs?: number, extend?: boolean): Promise<boolean>;
26
+ }
27
+ //# sourceMappingURL=sync-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../../../src/services/figshare-v2/sync-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAU,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAgB,MAAM,uCAAuC,CAAC;AAEvI,qBAAa,iBAAkB,SAAQ,KAAK;;CAE3C;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAGzE;AAED,8FAA8F;AAC9F,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;gBACvC,EAAE,EAAE,EAAE;IACZ,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7D,GAAG,CAAC,GAAG,EAAE,MAAM;IACT,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiBvG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,SAAa,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAMtG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGtD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlD,GAAG,CAAC,KAAK,SAAM,EAAE,WAAW,GAAE,QAAQ,CAAC,MAAM,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAKtG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,SAAQ,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAMvF"}