@serve.zone/dcrouter 32.1.1 → 32.1.2
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/deno.json +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.js +2 -2
- package/dist_ts/config/classes.gateway-client-manager.js +1 -1
- package/dist_ts/db/documents/classes.cached.email.d.ts +0 -1
- package/dist_ts/db/documents/classes.cached.email.js +45 -48
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.email-traffic-bucket.doc.js +61 -50
- package/dist_ts/db/documents/classes.gateway-client.doc.d.ts +9 -2
- package/dist_ts/db/documents/classes.gateway-client.doc.js +9 -11
- package/dist_ts/db/documents/classes.ip-intelligence.doc.d.ts +4 -3
- package/dist_ts/db/documents/classes.ip-intelligence.doc.js +27 -31
- package/dist_ts/db/documents/classes.ops-config-event.doc.d.ts +0 -2
- package/dist_ts/db/documents/classes.ops-config-event.doc.js +70 -68
- package/dist_ts/db/documents/classes.smartmta-storage.doc.d.ts +14 -0
- package/dist_ts/db/documents/classes.smartmta-storage.doc.js +17 -3
- package/dist_ts/db/documents/classes.webpush-admission.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-admission.doc.js +14 -5
- package/dist_ts/db/documents/classes.webpush-binding.doc.d.ts +1 -1
- package/dist_ts/db/documents/classes.webpush-binding.doc.js +45 -7
- package/dist_ts/db/documents/classes.webpush-spool.doc.d.ts +0 -1
- package/dist_ts/db/documents/classes.webpush-spool.doc.js +33 -5
- package/dist_ts/dns/manager.dns.js +7 -3
- package/dist_ts/email/classes.smartmta-storage-manager.d.ts +15 -3
- package/dist_ts/email/classes.smartmta-storage-manager.js +62 -36
- package/dist_ts/security/classes.security-policy-manager.js +11 -9
- package/dist_ts/webpush/classes.webpush-manager.d.ts +5 -1
- package/dist_ts/webpush/classes.webpush-manager.js +162 -232
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +3 -3
- package/readme.md +1 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +1 -1
- package/ts/config/classes.gateway-client-manager.ts +4 -2
- package/ts/db/documents/classes.cached.email.ts +51 -66
- package/ts/db/documents/classes.email-traffic-bucket.doc.ts +65 -59
- package/ts/db/documents/classes.gateway-client.doc.ts +38 -18
- package/ts/db/documents/classes.ip-intelligence.doc.ts +37 -40
- package/ts/db/documents/classes.ops-config-event.doc.ts +80 -77
- package/ts/db/documents/classes.smartmta-storage.doc.ts +16 -1
- package/ts/db/documents/classes.webpush-admission.doc.ts +14 -5
- package/ts/db/documents/classes.webpush-binding.doc.ts +53 -7
- package/ts/db/documents/classes.webpush-spool.doc.ts +39 -5
- package/ts/dns/manager.dns.ts +6 -2
- package/ts/email/classes.smartmta-storage-manager.ts +66 -50
- package/ts/security/classes.security-policy-manager.ts +10 -8
- package/ts/webpush/classes.webpush-manager.ts +175 -280
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -155,11 +155,10 @@ let GatewayClientDoc = (() => {
|
|
|
155
155
|
static async findById(id) {
|
|
156
156
|
return await GatewayClientDoc.getInstance({ id });
|
|
157
157
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
158
|
+
/**
|
|
159
|
+
* Compare-and-set selector. Revision 0 also matches documents written before the
|
|
160
|
+
* revision field existed, so a first mutation fences them exactly once.
|
|
161
|
+
*/
|
|
163
162
|
static buildRevisionSelector(idArg, revisionArg) {
|
|
164
163
|
if (revisionArg === 0) {
|
|
165
164
|
return {
|
|
@@ -173,25 +172,24 @@ let GatewayClientDoc = (() => {
|
|
|
173
172
|
return { id: idArg, mutationRevision: revisionArg };
|
|
174
173
|
}
|
|
175
174
|
static async compareAndSet(idArg, expectedRevisionArg, setArg, unsetArg = []) {
|
|
176
|
-
const collection = await GatewayClientDoc.getNativeCollection();
|
|
177
175
|
const update = {
|
|
178
176
|
$set: {
|
|
179
177
|
...setArg,
|
|
180
178
|
mutationRevision: expectedRevisionArg + 1,
|
|
181
|
-
_updatedAt: new Date().toISOString(),
|
|
182
179
|
},
|
|
183
180
|
};
|
|
184
181
|
if (unsetArg.length > 0) {
|
|
185
182
|
update.$unset = Object.fromEntries(unsetArg.map((fieldArg) => [fieldArg, '']));
|
|
186
183
|
}
|
|
187
|
-
|
|
184
|
+
// One fenced write: a mismatched revision matches nothing and the caller learns the
|
|
185
|
+
// document changed concurrently.
|
|
186
|
+
const result = await GatewayClientDoc.atomicUpdate(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg), update);
|
|
188
187
|
if (result.matchedCount !== 1)
|
|
189
188
|
return null;
|
|
190
189
|
return await GatewayClientDoc.findById(idArg);
|
|
191
190
|
}
|
|
192
191
|
static async deleteIfRevision(idArg, expectedRevisionArg) {
|
|
193
|
-
const
|
|
194
|
-
const result = await collection.deleteOne(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg));
|
|
192
|
+
const result = await GatewayClientDoc.atomicDelete(GatewayClientDoc.buildRevisionSelector(idArg, expectedRevisionArg));
|
|
195
193
|
return result.deletedCount === 1;
|
|
196
194
|
}
|
|
197
195
|
static async findAll() {
|
|
@@ -201,4 +199,4 @@ let GatewayClientDoc = (() => {
|
|
|
201
199
|
return GatewayClientDoc = _classThis;
|
|
202
200
|
})();
|
|
203
201
|
export { GatewayClientDoc };
|
|
204
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy5nYXRld2F5LWNsaWVudC5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBa0J2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUF1QnhDLGdCQUFnQjs0QkFENUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ04sT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dDQUF4QyxTQUFRLFdBQW9FOzs7OzhCQUN2RyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3VDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs0Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7K0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFB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
|
|
@@ -30,9 +30,10 @@ export declare class IpIntelligenceDoc extends plugins.smartdata.SmartDataDbDoc<
|
|
|
30
30
|
limit: number;
|
|
31
31
|
}): Promise<IpIntelligenceDoc[]>;
|
|
32
32
|
static countAll(): Promise<number>;
|
|
33
|
-
|
|
33
|
+
/** Least recently seen records first; the identity is the deterministic tiebreaker. */
|
|
34
|
+
static findOldestIpAddresses(options: {
|
|
34
35
|
lastSeenBefore?: number;
|
|
35
36
|
limit: number;
|
|
36
|
-
}): Promise<
|
|
37
|
-
static
|
|
37
|
+
}): Promise<string[]>;
|
|
38
|
+
static deleteByIpAddresses(ipAddressesArg: string[]): Promise<number>;
|
|
38
39
|
}
|
|
@@ -35,6 +35,7 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from '../../plugins.js';
|
|
36
36
|
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
37
|
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
const MAX_DELETE_BATCH_SIZE = 500;
|
|
38
39
|
let IpIntelligenceDoc = (() => {
|
|
39
40
|
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
40
41
|
let _classDescriptor;
|
|
@@ -199,10 +200,11 @@ let IpIntelligenceDoc = (() => {
|
|
|
199
200
|
const filter = options.ipAddresses
|
|
200
201
|
? { ipAddress: { $in: options.ipAddresses } }
|
|
201
202
|
: {};
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
const cursor = await IpIntelligenceDoc.getCursor(filter, {
|
|
204
|
+
// ipAddress is the immutable identity, so it is the deterministic tiebreaker.
|
|
205
|
+
sort: { lastSeenAt: -1, ipAddress: -1 },
|
|
206
|
+
limit: options.limit,
|
|
207
|
+
});
|
|
206
208
|
try {
|
|
207
209
|
return await cursor.toArray();
|
|
208
210
|
}
|
|
@@ -211,51 +213,45 @@ let IpIntelligenceDoc = (() => {
|
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
215
|
static async countAll() {
|
|
214
|
-
return await
|
|
215
|
-
.getDb()
|
|
216
|
-
.mongoDb
|
|
217
|
-
.collection('IpIntelligenceDoc')
|
|
218
|
-
.countDocuments({});
|
|
216
|
+
return await IpIntelligenceDoc.getCount({});
|
|
219
217
|
}
|
|
220
|
-
|
|
218
|
+
/** Least recently seen records first; the identity is the deterministic tiebreaker. */
|
|
219
|
+
static async findOldestIpAddresses(options) {
|
|
221
220
|
if (!Number.isSafeInteger(options.limit) || options.limit <= 0) {
|
|
222
|
-
throw new Error('IpIntelligenceDoc.
|
|
221
|
+
throw new Error('IpIntelligenceDoc.findOldestIpAddresses requires a positive integer limit');
|
|
223
222
|
}
|
|
224
|
-
const collection = DcRouterDb.getInstance()
|
|
225
|
-
.getDb()
|
|
226
|
-
.mongoDb
|
|
227
|
-
.collection('IpIntelligenceDoc');
|
|
228
223
|
const filter = options.lastSeenBefore === undefined
|
|
229
224
|
? {}
|
|
230
225
|
: { lastSeenAt: { $lt: options.lastSeenBefore } };
|
|
231
|
-
const cursor =
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
226
|
+
const cursor = await IpIntelligenceDoc.getCursor(filter, {
|
|
227
|
+
projection: { ipAddress: 1 },
|
|
228
|
+
sort: { lastSeenAt: 1, ipAddress: 1 },
|
|
229
|
+
limit: options.limit,
|
|
230
|
+
});
|
|
235
231
|
try {
|
|
236
232
|
const rows = await cursor.toArray();
|
|
237
|
-
return rows.map((
|
|
233
|
+
return rows.map((rowArg) => rowArg.ipAddress);
|
|
238
234
|
}
|
|
239
235
|
finally {
|
|
240
236
|
await cursor.close();
|
|
241
237
|
}
|
|
242
238
|
}
|
|
243
|
-
static async
|
|
244
|
-
if (
|
|
239
|
+
static async deleteByIpAddresses(ipAddressesArg) {
|
|
240
|
+
if (ipAddressesArg.length === 0)
|
|
245
241
|
return 0;
|
|
246
|
-
if (
|
|
247
|
-
|
|
242
|
+
if (ipAddressesArg.length > MAX_DELETE_BATCH_SIZE
|
|
243
|
+
|| ipAddressesArg.some((ipArg) => typeof ipArg !== 'string' || !ipArg)) {
|
|
244
|
+
throw new Error(`IpIntelligenceDoc.deleteByIpAddresses requires 1 to ${MAX_DELETE_BATCH_SIZE} ip addresses`);
|
|
248
245
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
.
|
|
253
|
-
|
|
254
|
-
.deleteMany(deleteFilter);
|
|
246
|
+
// Each `$or` branch pins the immutable identity, which is the equality anchor a
|
|
247
|
+
// plural atomic delete requires.
|
|
248
|
+
const result = await IpIntelligenceDoc.atomicDeleteMany({
|
|
249
|
+
$or: ipAddressesArg.map((ipArg) => ({ ipAddress: ipArg })),
|
|
250
|
+
});
|
|
255
251
|
return result.deletedCount;
|
|
256
252
|
}
|
|
257
253
|
};
|
|
258
254
|
return IpIntelligenceDoc = _classThis;
|
|
259
255
|
})();
|
|
260
256
|
export { IpIntelligenceDoc };
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pcC1pbnRlbGxpZ2VuY2UuZG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZGIvZG9jdW1lbnRzL2NsYXNzZXMuaXAtaW50ZWxsaWdlbmNlLmRvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNdkQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBRXJELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0lBR3JCLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7O3FDQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsrQkFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7a0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTs2Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7d0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3dDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt3Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FB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
|
|
@@ -27,8 +27,6 @@ export declare class OpsConfigEventDoc extends plugins.smartdata.SmartDataDbDoc<
|
|
|
27
27
|
constructor();
|
|
28
28
|
toApiObject(): IOpsConfigEvent;
|
|
29
29
|
createSavableObject(): Promise<OpsConfigEventDoc>;
|
|
30
|
-
private static getNativeCollection;
|
|
31
|
-
private static hydrate;
|
|
32
30
|
static upsertOpenEvent(optionsArg: {
|
|
33
31
|
id: string;
|
|
34
32
|
openDedupeKey: string;
|
|
@@ -35,6 +35,16 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from '../../plugins.js';
|
|
36
36
|
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
37
|
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
const PRUNE_BATCH_SIZE = 500;
|
|
39
|
+
/**
|
|
40
|
+
* "Not acknowledged yet" as a typed predicate: the field is absent (how the ORM stores
|
|
41
|
+
* an unset optional field) or explicitly null (how older documents may carry it). This
|
|
42
|
+
* is exactly what the previous `{ acknowledgedAt: null }` selector matched.
|
|
43
|
+
*/
|
|
44
|
+
const unacknowledgedBranches = () => [
|
|
45
|
+
{ acknowledgedAt: { $exists: false } },
|
|
46
|
+
{ acknowledgedAt: { $type: 'null' } },
|
|
47
|
+
];
|
|
38
48
|
/**
|
|
39
49
|
* Durable operator-facing platform configuration event (see
|
|
40
50
|
* ts_interfaces/data/config-events.ts). Unacknowledged events persist
|
|
@@ -141,50 +151,40 @@ let OpsConfigEventDoc = (() => {
|
|
|
141
151
|
delete savable.openDedupeKey;
|
|
142
152
|
return savable;
|
|
143
153
|
}
|
|
144
|
-
static async getNativeCollection() {
|
|
145
|
-
const smartdataCollection = OpsConfigEventDoc.collection;
|
|
146
|
-
await smartdataCollection.init();
|
|
147
|
-
const probe = new OpsConfigEventDoc();
|
|
148
|
-
await smartdataCollection.markUniqueIndexes(probe.uniqueIndexes || []);
|
|
149
|
-
await smartdataCollection.createRegularIndexes(probe.regularIndexes || []);
|
|
150
|
-
return smartdataCollection.mongoDbCollection;
|
|
151
|
-
}
|
|
152
|
-
static hydrate(rawArg) {
|
|
153
|
-
return OpsConfigEventDoc.createInstanceFromMongoDbNativeDoc(rawArg);
|
|
154
|
-
}
|
|
155
154
|
static async upsertOpenEvent(optionsArg) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
// Deduplication is arbitrated by the sparse unique `openDedupeKey` index: the filter
|
|
156
|
+
// anchors on that key, so two writers racing the same open occurrence either update
|
|
157
|
+
// it or lose the insert branch to the index. `$setOnInsert` seeds the `@unI()`
|
|
158
|
+
// identity on the insert branch only — the client refuses an identity seed without
|
|
159
|
+
// `upsert: true` and refuses a seed that contradicts an identity anchor in the
|
|
160
|
+
// filter, so the created event is addressable by `id` and immutable afterwards.
|
|
161
|
+
const result = await OpsConfigEventDoc.atomicUpdate({ openDedupeKey: optionsArg.openDedupeKey }, {
|
|
159
162
|
$set: {
|
|
160
163
|
severity: optionsArg.severity,
|
|
161
164
|
detail: optionsArg.detail,
|
|
162
165
|
context: optionsArg.context,
|
|
163
166
|
createdAt: optionsArg.createdAt,
|
|
164
|
-
_updatedAt: timestamp,
|
|
165
167
|
},
|
|
166
168
|
$setOnInsert: {
|
|
167
169
|
id: optionsArg.id,
|
|
168
170
|
category: optionsArg.category,
|
|
169
171
|
title: optionsArg.title,
|
|
170
172
|
openDedupeKey: optionsArg.openDedupeKey,
|
|
171
|
-
_createdAt: timestamp,
|
|
172
173
|
},
|
|
173
174
|
}, { upsert: true });
|
|
174
|
-
const
|
|
175
|
-
|
|
175
|
+
const event = await OpsConfigEventDoc.getInstance({
|
|
176
|
+
openDedupeKey: optionsArg.openDedupeKey,
|
|
177
|
+
});
|
|
178
|
+
if (!event)
|
|
176
179
|
throw new Error('Failed to read the recorded platform configuration event');
|
|
177
|
-
return {
|
|
178
|
-
event: OpsConfigEventDoc.hydrate(raw),
|
|
179
|
-
created: result.upsertedCount > 0,
|
|
180
|
-
};
|
|
180
|
+
return { event, created: result.upsertedId !== null };
|
|
181
181
|
}
|
|
182
182
|
static async findFiltered(filter = {}) {
|
|
183
183
|
const selector = {};
|
|
184
184
|
if (filter.acknowledged === true)
|
|
185
185
|
selector.acknowledgedAt = { $gt: 0 };
|
|
186
186
|
if (filter.acknowledged === false)
|
|
187
|
-
selector
|
|
187
|
+
Object.assign(selector, { $or: unacknowledgedBranches() });
|
|
188
188
|
if (filter.severity)
|
|
189
189
|
selector.severity = filter.severity;
|
|
190
190
|
if (filter.category)
|
|
@@ -193,48 +193,42 @@ let OpsConfigEventDoc = (() => {
|
|
|
193
193
|
? filter.limit
|
|
194
194
|
: 100;
|
|
195
195
|
const limit = Math.min(requestedLimit, 200);
|
|
196
|
-
const countSelector = structuredClone(selector);
|
|
197
196
|
if (filter.cursor) {
|
|
198
197
|
if (!Number.isSafeInteger(filter.cursor.createdAt) || filter.cursor.createdAt < 0
|
|
199
198
|
|| typeof filter.cursor.id !== 'string' || !filter.cursor.id.trim()) {
|
|
200
199
|
throw new Error('Invalid platform configuration event cursor');
|
|
201
200
|
}
|
|
202
|
-
selector.$or = [
|
|
203
|
-
{ createdAt: { $lt: filter.cursor.createdAt } },
|
|
204
|
-
{ createdAt: filter.cursor.createdAt, id: { $lt: filter.cursor.id } },
|
|
205
|
-
];
|
|
206
201
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
202
|
+
// Seek pagination over (createdAt, id) with the unique id as tiebreaker, plus the
|
|
203
|
+
// unpaged total for the same filter.
|
|
204
|
+
const page = await OpsConfigEventDoc.getPagedInstances({
|
|
205
|
+
filter: selector,
|
|
206
|
+
sortField: 'createdAt',
|
|
207
|
+
uniqueField: 'id',
|
|
208
|
+
sortDirection: 'desc',
|
|
209
|
+
limit,
|
|
210
|
+
withTotal: true,
|
|
211
|
+
...(filter.cursor
|
|
212
|
+
? { cursor: { sortValue: filter.cursor.createdAt, uniqueValue: filter.cursor.id } }
|
|
213
|
+
: {}),
|
|
214
|
+
});
|
|
215
|
+
return {
|
|
216
|
+
events: page.documents,
|
|
217
|
+
total: page.total ?? 0,
|
|
218
|
+
...(page.nextCursor
|
|
219
|
+
? {
|
|
224
220
|
nextCursor: {
|
|
225
|
-
createdAt: Number(
|
|
226
|
-
id: String(
|
|
221
|
+
createdAt: Number(page.nextCursor.sortValue),
|
|
222
|
+
id: String(page.nextCursor.uniqueValue),
|
|
227
223
|
},
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
}
|
|
231
|
-
finally {
|
|
232
|
-
await cursor.close();
|
|
233
|
-
}
|
|
224
|
+
}
|
|
225
|
+
: {}),
|
|
226
|
+
};
|
|
234
227
|
}
|
|
235
228
|
static async countUnacknowledged() {
|
|
236
|
-
|
|
237
|
-
|
|
229
|
+
return await OpsConfigEventDoc.getCount({
|
|
230
|
+
$or: unacknowledgedBranches(),
|
|
231
|
+
});
|
|
238
232
|
}
|
|
239
233
|
/** Acknowledge the given event ids; returns how many were newly acknowledged. */
|
|
240
234
|
static async acknowledgeByIds(ids, userId) {
|
|
@@ -247,14 +241,21 @@ let OpsConfigEventDoc = (() => {
|
|
|
247
241
|
const uniqueIds = Array.from(new Set(ids));
|
|
248
242
|
if (uniqueIds.length === 0)
|
|
249
243
|
return 0;
|
|
250
|
-
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
251
244
|
const now = Date.now();
|
|
252
|
-
|
|
245
|
+
// The per-id `$or` is the equality anchor a plural atomic write requires; the second
|
|
246
|
+
// branch keeps the "only newly acknowledged rows count" guard.
|
|
247
|
+
const result = await OpsConfigEventDoc.atomicUpdateMany({
|
|
248
|
+
$and: [
|
|
249
|
+
{ $or: uniqueIds.map((idArg) => ({ id: idArg })) },
|
|
250
|
+
{ $or: unacknowledgedBranches() },
|
|
251
|
+
],
|
|
252
|
+
}, {
|
|
253
253
|
$set: {
|
|
254
254
|
acknowledgedBy: userId,
|
|
255
255
|
acknowledgedAt: now,
|
|
256
|
-
_updatedAt: new Date(now).toISOString(),
|
|
257
256
|
},
|
|
257
|
+
// Presence of openDedupeKey is the open-event uniqueness authority, so
|
|
258
|
+
// acknowledging must release it.
|
|
258
259
|
$unset: { openDedupeKey: '' },
|
|
259
260
|
});
|
|
260
261
|
return result.modifiedCount;
|
|
@@ -263,12 +264,12 @@ let OpsConfigEventDoc = (() => {
|
|
|
263
264
|
static async pruneAcknowledged(maxAgeMs) {
|
|
264
265
|
const cutoff = Date.now() - maxAgeMs;
|
|
265
266
|
let pruned = 0;
|
|
266
|
-
const collection = await OpsConfigEventDoc.getNativeCollection();
|
|
267
267
|
while (true) {
|
|
268
|
-
const cursor =
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
268
|
+
const cursor = await OpsConfigEventDoc.getCursor({ acknowledgedAt: { $lt: cutoff } }, {
|
|
269
|
+
projection: { id: 1 },
|
|
270
|
+
sort: { acknowledgedAt: 1, id: 1 },
|
|
271
|
+
limit: PRUNE_BATCH_SIZE,
|
|
272
|
+
});
|
|
272
273
|
let rows;
|
|
273
274
|
try {
|
|
274
275
|
rows = await cursor.toArray();
|
|
@@ -278,11 +279,12 @@ let OpsConfigEventDoc = (() => {
|
|
|
278
279
|
}
|
|
279
280
|
if (rows.length === 0)
|
|
280
281
|
break;
|
|
281
|
-
|
|
282
|
-
|
|
282
|
+
// Anchored on the scanned identities, with the retention guard re-evaluated
|
|
283
|
+
// server-side so an event acknowledged after the scan is never pruned early.
|
|
284
|
+
const result = await OpsConfigEventDoc.atomicDeleteMany({
|
|
285
|
+
$or: rows.map((rowArg) => ({ id: rowArg.id })),
|
|
283
286
|
acknowledgedAt: { $lt: cutoff },
|
|
284
|
-
};
|
|
285
|
-
const result = await collection.deleteMany(deleteFilter);
|
|
287
|
+
});
|
|
286
288
|
if (result.deletedCount === 0)
|
|
287
289
|
break;
|
|
288
290
|
pruned += result.deletedCount;
|
|
@@ -293,4 +295,4 @@ let OpsConfigEventDoc = (() => {
|
|
|
293
295
|
return OpsConfigEventDoc = _classThis;
|
|
294
296
|
})();
|
|
295
297
|
export { OpsConfigEventDoc };
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHMtY29uZmlnLWV2ZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLm9wcy1jb25maWctZXZlbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVF2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFVckQ7Ozs7R0FJRztJQUVVLGlCQUFpQjs0QkFEN0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lDQUF4QyxTQUFRLFdBQXNFOzs7OzhCQUMxRyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtvQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFDekIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2lDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtrQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7bUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFB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
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHMtY29uZmlnLWV2ZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLm9wcy1jb25maWctZXZlbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVF2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0I7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsR0FFNUIsRUFBRSxDQUFDO0lBQ0osRUFBRSxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDdEMsRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7Q0FDdEMsQ0FBQztBQVVGOzs7O0dBSUc7SUFFVSxpQkFBaUI7NEJBRDdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7O3NCQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQ0FBeEMsU0FBUSxXQUFzRTs7Ozs4QkFDMUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO29DQUd4QixPQUFPLENBQUMsU0FBUyxD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
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* SmartMTA's durable key/value space.
|
|
4
|
+
*
|
|
5
|
+
* Every document is content-addressed: `id` is `sha256(normalizedKey)` and owns the stored
|
|
6
|
+
* `_id`, so the primary key — not a secondary index — is the uniqueness authority that makes
|
|
7
|
+
* a write a single race-free upsert. That is what `identityAsDocumentId: 'id'` declares, and
|
|
8
|
+
* it holds for every row dcrouter ever wrote here, because the manager has always derived
|
|
9
|
+
* both `_id` and `id` from the same hash.
|
|
10
|
+
*
|
|
11
|
+
* The declaration is irreversible: from here on reads are answered through `_id`, so a row
|
|
12
|
+
* whose `_id` is not its identity would no longer resolve, and the client refuses a unique
|
|
13
|
+
* index on `id` because the primary key is the only uniqueness authority a document-id
|
|
14
|
+
* identity may have.
|
|
15
|
+
*/
|
|
2
16
|
export declare class SmartMtaStorageDoc extends plugins.smartdata.SmartDataDbDoc<SmartMtaStorageDoc, SmartMtaStorageDoc> {
|
|
3
17
|
id: string;
|
|
4
18
|
key: string;
|
|
@@ -35,8 +35,22 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
35
35
|
import * as plugins from '../../plugins.js';
|
|
36
36
|
import { DcRouterDb } from '../classes.dcrouter-db.js';
|
|
37
37
|
const getDb = () => DcRouterDb.getInstance().getDb();
|
|
38
|
+
/**
|
|
39
|
+
* SmartMTA's durable key/value space.
|
|
40
|
+
*
|
|
41
|
+
* Every document is content-addressed: `id` is `sha256(normalizedKey)` and owns the stored
|
|
42
|
+
* `_id`, so the primary key — not a secondary index — is the uniqueness authority that makes
|
|
43
|
+
* a write a single race-free upsert. That is what `identityAsDocumentId: 'id'` declares, and
|
|
44
|
+
* it holds for every row dcrouter ever wrote here, because the manager has always derived
|
|
45
|
+
* both `_id` and `id` from the same hash.
|
|
46
|
+
*
|
|
47
|
+
* The declaration is irreversible: from here on reads are answered through `_id`, so a row
|
|
48
|
+
* whose `_id` is not its identity would no longer resolve, and the client refuses a unique
|
|
49
|
+
* index on `id` because the primary key is the only uniqueness authority a document-id
|
|
50
|
+
* identity may have.
|
|
51
|
+
*/
|
|
38
52
|
let SmartMtaStorageDoc = (() => {
|
|
39
|
-
let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
|
|
53
|
+
let _classDecorators = [plugins.smartdata.Collection(() => getDb(), { identityAsDocumentId: 'id' })];
|
|
40
54
|
let _classDescriptor;
|
|
41
55
|
let _classExtraInitializers = [];
|
|
42
56
|
let _classThis;
|
|
@@ -60,7 +74,7 @@ let SmartMtaStorageDoc = (() => {
|
|
|
60
74
|
static { _classThis = this; }
|
|
61
75
|
static {
|
|
62
76
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
63
|
-
_id_decorators = [plugins.smartdata.svDb()];
|
|
77
|
+
_id_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
|
|
64
78
|
_key_decorators = [plugins.smartdata.svDb()];
|
|
65
79
|
_value_decorators = [plugins.smartdata.svDb()];
|
|
66
80
|
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
@@ -88,4 +102,4 @@ let SmartMtaStorageDoc = (() => {
|
|
|
88
102
|
return SmartMtaStorageDoc = _classThis;
|
|
89
103
|
})();
|
|
90
104
|
export { SmartMtaStorageDoc };
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydG10YS1zdG9yYWdlLmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLnNtYXJ0bXRhLXN0b3JhZ2UuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7Ozs7R0FhRztJQUVVLGtCQUFrQjs0QkFEOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7OztzQkFDcEMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7O2tDQUF4QyxTQUFRLFdBR3ZDOzs7OzhCQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytCQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtpQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtZQVh6Qix3SkFBTyxFQUFFLDZCQUFGLEVBQUUsK0VBQVU7WUFHbkIsMkpBQU8sR0FBRyw2QkFBSCxHQUFHLGlGQUFVO1lBR3BCLGlLQUFPLEtBQUssNkJBQUwsS0FBSyxxRkFBVTtZQUd0Qiw2S0FBTyxTQUFTLDZCQUFULFNBQVMsNkZBQVU7WUFHMUIsNktBQU8sU0FBUyw2QkFBVCxTQUFTLDZGQUFVO1lBbEI1Qiw2S0FtQkM7OztZQW5CWSx1REFBa0I7O1FBTXRCLEVBQUUscURBQVU7UUFHWixHQUFHLHdHQUFVO1FBR2IsS0FBSywyR0FBVTtRQUdmLFNBQVMsaUhBQVU7UUFHbkIsU0FBUyxxSEFBVTs7Ozs7Ozs7U0FsQmYsa0JBQWtCIn0=
|
|
@@ -41,8 +41,20 @@ const getDb = () => DcRouterDb.getInstance().getDb();
|
|
|
41
41
|
* A credential rotation must not reset these counters, so the stable binding
|
|
42
42
|
* id and lifecycle generation are the authority rather than a credential id.
|
|
43
43
|
*/
|
|
44
|
+
// Both indexes are declared under the exact names the released Web Push schema migration
|
|
45
|
+
// created them with (`ts_migrations/index.ts` via `ts/webpush/webpush-indexes.ts`), so model
|
|
46
|
+
// initialization verifies the existing topology instead of installing a second, differently
|
|
47
|
+
// named index over the same key.
|
|
44
48
|
let WebPushAdmissionDoc = (() => {
|
|
45
|
-
let _classDecorators = [plugins.smartdata.
|
|
49
|
+
let _classDecorators = [plugins.smartdata.namedIndex({
|
|
50
|
+
name: 'web_push_admission_binding_unique',
|
|
51
|
+
key: { bindingId: 1, lifecycleGeneration: 1 },
|
|
52
|
+
options: { unique: true },
|
|
53
|
+
}), plugins.smartdata.namedIndex({
|
|
54
|
+
name: 'web_push_admission_ttl',
|
|
55
|
+
key: { purgeAt: 1 },
|
|
56
|
+
options: { expireAfterSeconds: 0 },
|
|
57
|
+
}), plugins.smartdata.Collection(() => getDb())];
|
|
46
58
|
let _classDescriptor;
|
|
47
59
|
let _classExtraInitializers = [];
|
|
48
60
|
let _classThis;
|
|
@@ -110,9 +122,6 @@ let WebPushAdmissionDoc = (() => {
|
|
|
110
122
|
revision = (__runInitializers(this, _longWindowCount_extraInitializers), __runInitializers(this, _revision_initializers, void 0));
|
|
111
123
|
updatedAt = (__runInitializers(this, _revision_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
|
|
112
124
|
purgeAt = (__runInitializers(this, _updatedAt_extraInitializers), __runInitializers(this, _purgeAt_initializers, void 0));
|
|
113
|
-
static getNativeCollection() {
|
|
114
|
-
return getDb().mongoDb.collection('WebPushAdmissionDoc');
|
|
115
|
-
}
|
|
116
125
|
constructor() {
|
|
117
126
|
super(...arguments);
|
|
118
127
|
__runInitializers(this, _purgeAt_extraInitializers);
|
|
@@ -121,4 +130,4 @@ let WebPushAdmissionDoc = (() => {
|
|
|
121
130
|
return WebPushAdmissionDoc = _classThis;
|
|
122
131
|
})();
|
|
123
132
|
export { WebPushAdmissionDoc };
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvY2xhc3Nlcy53ZWJwdXNoLWFkbWlzc2lvbi5kb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUVyRDs7Ozs7R0FLRztBQUNILHlGQUF5RjtBQUN6Riw2RkFBNkY7QUFDN0YsNEZBQTRGO0FBQzVGLGlDQUFpQztJQVlwQixtQkFBbUI7NEJBWC9CLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQzVCLElBQUksRUFBRSxtQ0FBbUM7WUFDekMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtTQUMxQixDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDNUIsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRTtTQUNuQyxDQUFDLEVBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21DQUF4QyxTQUFRLFdBR3hDOzs7O3FDQUNFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnREFHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOytDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTsyQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0NBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3FDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUF2QnpCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQiwyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQyw4TUFBTyxvQkFBb0IsNkJBQXBCLG9CQUFvQixtSEFBVTtZQUdyQyxrTUFBTyxnQkFBZ0IsNkJBQWhCLGdCQUFnQiwyR0FBVTtZQUdqQywyTUFBTyxtQkFBbUIsNkJBQW5CLG1CQUFtQixpSEFBVTtZQUdwQywrTEFBTyxlQUFlLDZCQUFmLGVBQWUseUdBQVU7WUFHaEMsMEtBQU8sUUFBUSw2QkFBUixRQUFRLDJGQUFVO1lBR3pCLDZLQUFPLFNBQVMsNkJBQVQsU0FBUyw2RkFBVTtZQUcxQix1S0FBTyxPQUFPLDZCQUFQLE9BQU8seUZBQVE7WUE3QnhCLDZLQThCQzs7O1lBOUJZLHVEQUFtQjs7UUFLdkIsU0FBUyw0REFBVTtRQUduQixtQkFBbUIsK0hBQVU7UUFHN0Isb0JBQW9CLDBJQUFVO1FBRzlCLGdCQUFnQix1SUFBVTtRQUcxQixtQkFBbUIsc0lBQVU7UUFHN0IsZUFBZSxxSUFBVTtRQUd6QixRQUFRLDBIQUFVO1FBR2xCLFNBQVMsb0hBQVU7UUFHbkIsT0FBTyxtSEFBUTs7Ozs7Ozs7U0E3QlgsbUJBQW1CIn0=
|