@tiddlywiki/mws 0.2.1 → 0.2.3
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/dist/metafile-esm.json +1 -1
- package/dist/mws.js +730 -780
- package/dist/mws.js.map +1 -1
- package/package.json +1 -1
- package/prisma/client/internal/class.ts +3 -3
- package/prisma/client/models/RecipeBag.ts +4 -3
- package/prisma/schema.prisma +5 -5
- package/public/admin-vanilla/{main-Y4GDO4MD.js → main-Z66TEMIJ.js} +329 -21
- package/public/admin-vanilla/main-Z66TEMIJ.js.map +7 -0
- package/public/admin-vanilla.html +1 -1
- package/public/admin-vanilla.json +1 -1
- package/scripts/scripts.mjs +1 -1
- package/public/admin-vanilla/main-Y4GDO4MD.js.map +0 -7
package/dist/mws.js
CHANGED
|
@@ -1204,7 +1204,7 @@ var require_command = __commonJS({
|
|
|
1204
1204
|
init_esm_shims();
|
|
1205
1205
|
var EventEmitter3 = __require("events").EventEmitter;
|
|
1206
1206
|
var childProcess = __require("child_process");
|
|
1207
|
-
var
|
|
1207
|
+
var path10 = __require("path");
|
|
1208
1208
|
var fs5 = __require("fs");
|
|
1209
1209
|
var process5 = __require("process");
|
|
1210
1210
|
var { Argument: Argument2, humanReadableArgName } = require_argument();
|
|
@@ -2207,9 +2207,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2207
2207
|
let launchWithNode = false;
|
|
2208
2208
|
const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"];
|
|
2209
2209
|
function findFile(baseDir, baseName) {
|
|
2210
|
-
const localBin =
|
|
2210
|
+
const localBin = path10.resolve(baseDir, baseName);
|
|
2211
2211
|
if (fs5.existsSync(localBin)) return localBin;
|
|
2212
|
-
if (sourceExt.includes(
|
|
2212
|
+
if (sourceExt.includes(path10.extname(baseName))) return void 0;
|
|
2213
2213
|
const foundExt = sourceExt.find(
|
|
2214
2214
|
(ext) => fs5.existsSync(`${localBin}${ext}`)
|
|
2215
2215
|
);
|
|
@@ -2228,17 +2228,17 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2228
2228
|
} catch {
|
|
2229
2229
|
resolvedScriptPath = this._scriptPath;
|
|
2230
2230
|
}
|
|
2231
|
-
executableDir =
|
|
2232
|
-
|
|
2231
|
+
executableDir = path10.resolve(
|
|
2232
|
+
path10.dirname(resolvedScriptPath),
|
|
2233
2233
|
executableDir
|
|
2234
2234
|
);
|
|
2235
2235
|
}
|
|
2236
2236
|
if (executableDir) {
|
|
2237
2237
|
let localFile = findFile(executableDir, executableFile);
|
|
2238
2238
|
if (!localFile && !subcommand._executableFile && this._scriptPath) {
|
|
2239
|
-
const legacyName =
|
|
2239
|
+
const legacyName = path10.basename(
|
|
2240
2240
|
this._scriptPath,
|
|
2241
|
-
|
|
2241
|
+
path10.extname(this._scriptPath)
|
|
2242
2242
|
);
|
|
2243
2243
|
if (legacyName !== this._name) {
|
|
2244
2244
|
localFile = findFile(
|
|
@@ -2249,7 +2249,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
2249
2249
|
}
|
|
2250
2250
|
executableFile = localFile || executableFile;
|
|
2251
2251
|
}
|
|
2252
|
-
launchWithNode = sourceExt.includes(
|
|
2252
|
+
launchWithNode = sourceExt.includes(path10.extname(executableFile));
|
|
2253
2253
|
let proc;
|
|
2254
2254
|
if (process5.platform !== "win32") {
|
|
2255
2255
|
if (launchWithNode) {
|
|
@@ -3097,7 +3097,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
3097
3097
|
* @return {Command}
|
|
3098
3098
|
*/
|
|
3099
3099
|
nameFromFilename(filename) {
|
|
3100
|
-
this._name =
|
|
3100
|
+
this._name = path10.basename(filename, path10.extname(filename));
|
|
3101
3101
|
return this;
|
|
3102
3102
|
}
|
|
3103
3103
|
/**
|
|
@@ -3111,9 +3111,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
3111
3111
|
* @param {string} [path]
|
|
3112
3112
|
* @return {(string|null|Command)}
|
|
3113
3113
|
*/
|
|
3114
|
-
executableDir(
|
|
3115
|
-
if (
|
|
3116
|
-
this._executableDir =
|
|
3114
|
+
executableDir(path11) {
|
|
3115
|
+
if (path11 === void 0) return this._executableDir;
|
|
3116
|
+
this._executableDir = path11;
|
|
3117
3117
|
return this;
|
|
3118
3118
|
}
|
|
3119
3119
|
/**
|
|
@@ -4143,7 +4143,7 @@ var require_Observable = __commonJS({
|
|
|
4143
4143
|
Observable2.prototype.forEach = function(next, promiseCtor) {
|
|
4144
4144
|
var _this = this;
|
|
4145
4145
|
promiseCtor = getPromiseCtor(promiseCtor);
|
|
4146
|
-
return new promiseCtor(function(
|
|
4146
|
+
return new promiseCtor(function(resolve11, reject) {
|
|
4147
4147
|
var subscriber = new Subscriber_1.SafeSubscriber({
|
|
4148
4148
|
next: /* @__PURE__ */ __name(function(value) {
|
|
4149
4149
|
try {
|
|
@@ -4154,7 +4154,7 @@ var require_Observable = __commonJS({
|
|
|
4154
4154
|
}
|
|
4155
4155
|
}, "next"),
|
|
4156
4156
|
error: reject,
|
|
4157
|
-
complete:
|
|
4157
|
+
complete: resolve11
|
|
4158
4158
|
});
|
|
4159
4159
|
_this.subscribe(subscriber);
|
|
4160
4160
|
});
|
|
@@ -4176,14 +4176,14 @@ var require_Observable = __commonJS({
|
|
|
4176
4176
|
Observable2.prototype.toPromise = function(promiseCtor) {
|
|
4177
4177
|
var _this = this;
|
|
4178
4178
|
promiseCtor = getPromiseCtor(promiseCtor);
|
|
4179
|
-
return new promiseCtor(function(
|
|
4179
|
+
return new promiseCtor(function(resolve11, reject) {
|
|
4180
4180
|
var value;
|
|
4181
4181
|
_this.subscribe(function(x) {
|
|
4182
4182
|
return value = x;
|
|
4183
4183
|
}, function(err) {
|
|
4184
4184
|
return reject(err);
|
|
4185
4185
|
}, function() {
|
|
4186
|
-
return
|
|
4186
|
+
return resolve11(value);
|
|
4187
4187
|
});
|
|
4188
4188
|
});
|
|
4189
4189
|
};
|
|
@@ -6390,12 +6390,12 @@ var require_innerFrom = __commonJS({
|
|
|
6390
6390
|
init_esm_shims();
|
|
6391
6391
|
var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P2, generator) {
|
|
6392
6392
|
function adopt(value) {
|
|
6393
|
-
return value instanceof P2 ? value : new P2(function(
|
|
6394
|
-
|
|
6393
|
+
return value instanceof P2 ? value : new P2(function(resolve11) {
|
|
6394
|
+
resolve11(value);
|
|
6395
6395
|
});
|
|
6396
6396
|
}
|
|
6397
6397
|
__name(adopt, "adopt");
|
|
6398
|
-
return new (P2 || (P2 = Promise))(function(
|
|
6398
|
+
return new (P2 || (P2 = Promise))(function(resolve11, reject) {
|
|
6399
6399
|
function fulfilled(value) {
|
|
6400
6400
|
try {
|
|
6401
6401
|
step(generator.next(value));
|
|
@@ -6413,7 +6413,7 @@ var require_innerFrom = __commonJS({
|
|
|
6413
6413
|
}
|
|
6414
6414
|
__name(rejected, "rejected");
|
|
6415
6415
|
function step(result) {
|
|
6416
|
-
result.done ?
|
|
6416
|
+
result.done ? resolve11(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
6417
6417
|
}
|
|
6418
6418
|
__name(step, "step");
|
|
6419
6419
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
@@ -6498,15 +6498,15 @@ var require_innerFrom = __commonJS({
|
|
|
6498
6498
|
}, i);
|
|
6499
6499
|
function verb(n) {
|
|
6500
6500
|
i[n] = o[n] && function(v2) {
|
|
6501
|
-
return new Promise(function(
|
|
6502
|
-
v2 = o[n](v2), settle(
|
|
6501
|
+
return new Promise(function(resolve11, reject) {
|
|
6502
|
+
v2 = o[n](v2), settle(resolve11, reject, v2.done, v2.value);
|
|
6503
6503
|
});
|
|
6504
6504
|
};
|
|
6505
6505
|
}
|
|
6506
6506
|
__name(verb, "verb");
|
|
6507
|
-
function settle(
|
|
6507
|
+
function settle(resolve11, reject, d, v2) {
|
|
6508
6508
|
Promise.resolve(v2).then(function(v3) {
|
|
6509
|
-
|
|
6509
|
+
resolve11({ value: v3, done: d });
|
|
6510
6510
|
}, reject);
|
|
6511
6511
|
}
|
|
6512
6512
|
__name(settle, "settle");
|
|
@@ -7167,7 +7167,7 @@ var require_lastValueFrom = __commonJS({
|
|
|
7167
7167
|
var EmptyError_1 = require_EmptyError();
|
|
7168
7168
|
function lastValueFrom(source, config3) {
|
|
7169
7169
|
var hasConfig = typeof config3 === "object";
|
|
7170
|
-
return new Promise(function(
|
|
7170
|
+
return new Promise(function(resolve11, reject) {
|
|
7171
7171
|
var _hasValue = false;
|
|
7172
7172
|
var _value;
|
|
7173
7173
|
source.subscribe({
|
|
@@ -7178,9 +7178,9 @@ var require_lastValueFrom = __commonJS({
|
|
|
7178
7178
|
error: reject,
|
|
7179
7179
|
complete: /* @__PURE__ */ __name(function() {
|
|
7180
7180
|
if (_hasValue) {
|
|
7181
|
-
|
|
7181
|
+
resolve11(_value);
|
|
7182
7182
|
} else if (hasConfig) {
|
|
7183
|
-
|
|
7183
|
+
resolve11(config3.defaultValue);
|
|
7184
7184
|
} else {
|
|
7185
7185
|
reject(new EmptyError_1.EmptyError());
|
|
7186
7186
|
}
|
|
@@ -7204,16 +7204,16 @@ var require_firstValueFrom = __commonJS({
|
|
|
7204
7204
|
var Subscriber_1 = require_Subscriber();
|
|
7205
7205
|
function firstValueFrom(source, config3) {
|
|
7206
7206
|
var hasConfig = typeof config3 === "object";
|
|
7207
|
-
return new Promise(function(
|
|
7207
|
+
return new Promise(function(resolve11, reject) {
|
|
7208
7208
|
var subscriber = new Subscriber_1.SafeSubscriber({
|
|
7209
7209
|
next: /* @__PURE__ */ __name(function(value) {
|
|
7210
|
-
|
|
7210
|
+
resolve11(value);
|
|
7211
7211
|
subscriber.unsubscribe();
|
|
7212
7212
|
}, "next"),
|
|
7213
7213
|
error: reject,
|
|
7214
7214
|
complete: /* @__PURE__ */ __name(function() {
|
|
7215
7215
|
if (hasConfig) {
|
|
7216
|
-
|
|
7216
|
+
resolve11(config3.defaultValue);
|
|
7217
7217
|
} else {
|
|
7218
7218
|
reject(new EmptyError_1.EmptyError());
|
|
7219
7219
|
}
|
|
@@ -21888,11 +21888,11 @@ var require_mime_types = __commonJS({
|
|
|
21888
21888
|
return exts[0];
|
|
21889
21889
|
}
|
|
21890
21890
|
__name(extension, "extension");
|
|
21891
|
-
function lookup(
|
|
21892
|
-
if (!
|
|
21891
|
+
function lookup(path10) {
|
|
21892
|
+
if (!path10 || typeof path10 !== "string") {
|
|
21893
21893
|
return false;
|
|
21894
21894
|
}
|
|
21895
|
-
var extension2 = extname2("x." +
|
|
21895
|
+
var extension2 = extname2("x." + path10).toLowerCase().substr(1);
|
|
21896
21896
|
if (!extension2) {
|
|
21897
21897
|
return false;
|
|
21898
21898
|
}
|
|
@@ -23800,7 +23800,7 @@ var readBodyDirect = /* @__PURE__ */ __name((request) => {
|
|
|
23800
23800
|
if (request[bodyReadPromiseKey]) return request[bodyReadPromiseKey];
|
|
23801
23801
|
const incoming = request[incomingKey];
|
|
23802
23802
|
if (Readable.isDisturbed(incoming)) return rejectBodyUnusable();
|
|
23803
|
-
const promise2 = new Promise((
|
|
23803
|
+
const promise2 = new Promise((resolve11, reject) => {
|
|
23804
23804
|
const chunks = [];
|
|
23805
23805
|
let settled = false;
|
|
23806
23806
|
const finish = /* @__PURE__ */ __name((callback) => {
|
|
@@ -23816,7 +23816,7 @@ var readBodyDirect = /* @__PURE__ */ __name((request) => {
|
|
|
23816
23816
|
finish(() => {
|
|
23817
23817
|
const buffer = chunks.length === 1 ? chunks[0] : Buffer.concat(chunks);
|
|
23818
23818
|
request[bodyBufferKey] = buffer;
|
|
23819
|
-
|
|
23819
|
+
resolve11(buffer);
|
|
23820
23820
|
});
|
|
23821
23821
|
}, "onEnd");
|
|
23822
23822
|
const onError = /* @__PURE__ */ __name((error48) => {
|
|
@@ -24350,7 +24350,7 @@ var responseViaResponseObject = /* @__PURE__ */ __name(async (res, outgoing, opt
|
|
|
24350
24350
|
});
|
|
24351
24351
|
if (!chunk) {
|
|
24352
24352
|
if (i === 1) {
|
|
24353
|
-
await new Promise((
|
|
24353
|
+
await new Promise((resolve11) => setTimeout(resolve11));
|
|
24354
24354
|
maxReadCount = 3;
|
|
24355
24355
|
continue;
|
|
24356
24356
|
}
|
|
@@ -24507,9 +24507,9 @@ var setupWebSocket = /* @__PURE__ */ __name((options) => {
|
|
|
24507
24507
|
}
|
|
24508
24508
|
});
|
|
24509
24509
|
const waitForWebSocket = /* @__PURE__ */ __name((request, connectionSymbol) => {
|
|
24510
|
-
return new Promise((
|
|
24510
|
+
return new Promise((resolve11) => {
|
|
24511
24511
|
waiterMap.set(request, {
|
|
24512
|
-
resolve:
|
|
24512
|
+
resolve: resolve11,
|
|
24513
24513
|
connectionSymbol
|
|
24514
24514
|
});
|
|
24515
24515
|
});
|
|
@@ -24669,8 +24669,8 @@ var NodeListenerBase = class {
|
|
|
24669
24669
|
__name(this, "NodeListenerBase");
|
|
24670
24670
|
}
|
|
24671
24671
|
onServerExit = /* @__PURE__ */ __name(async () => {
|
|
24672
|
-
await new Promise((
|
|
24673
|
-
this.server.close(
|
|
24672
|
+
await new Promise((resolve11) => {
|
|
24673
|
+
this.server.close(resolve11);
|
|
24674
24674
|
});
|
|
24675
24675
|
}, "onServerExit");
|
|
24676
24676
|
};
|
|
@@ -25779,10 +25779,10 @@ function cloneDef(schema) {
|
|
|
25779
25779
|
return mergeDefs(schema._zod.def);
|
|
25780
25780
|
}
|
|
25781
25781
|
__name(cloneDef, "cloneDef");
|
|
25782
|
-
function getElementAtPath(obj,
|
|
25783
|
-
if (!
|
|
25782
|
+
function getElementAtPath(obj, path10) {
|
|
25783
|
+
if (!path10)
|
|
25784
25784
|
return obj;
|
|
25785
|
-
return
|
|
25785
|
+
return path10.reduce((acc, key) => acc?.[key], obj);
|
|
25786
25786
|
}
|
|
25787
25787
|
__name(getElementAtPath, "getElementAtPath");
|
|
25788
25788
|
function promiseAllObject(promisesObj) {
|
|
@@ -26188,11 +26188,11 @@ function aborted(x, startIndex = 0) {
|
|
|
26188
26188
|
return false;
|
|
26189
26189
|
}
|
|
26190
26190
|
__name(aborted, "aborted");
|
|
26191
|
-
function prefixIssues(
|
|
26191
|
+
function prefixIssues(path10, issues) {
|
|
26192
26192
|
return issues.map((iss) => {
|
|
26193
26193
|
var _a2;
|
|
26194
26194
|
(_a2 = iss).path ?? (_a2.path = []);
|
|
26195
|
-
iss.path.unshift(
|
|
26195
|
+
iss.path.unshift(path10);
|
|
26196
26196
|
return iss;
|
|
26197
26197
|
});
|
|
26198
26198
|
}
|
|
@@ -26394,7 +26394,7 @@ function formatError(error48, mapper = (issue2) => issue2.message) {
|
|
|
26394
26394
|
__name(formatError, "formatError");
|
|
26395
26395
|
function treeifyError(error48, mapper = (issue2) => issue2.message) {
|
|
26396
26396
|
const result = { errors: [] };
|
|
26397
|
-
const processError = /* @__PURE__ */ __name((error49,
|
|
26397
|
+
const processError = /* @__PURE__ */ __name((error49, path10 = []) => {
|
|
26398
26398
|
var _a2, _b;
|
|
26399
26399
|
for (const issue2 of error49.issues) {
|
|
26400
26400
|
if (issue2.code === "invalid_union" && issue2.errors.length) {
|
|
@@ -26404,7 +26404,7 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
|
|
|
26404
26404
|
} else if (issue2.code === "invalid_element") {
|
|
26405
26405
|
processError({ issues: issue2.issues }, issue2.path);
|
|
26406
26406
|
} else {
|
|
26407
|
-
const fullpath = [...
|
|
26407
|
+
const fullpath = [...path10, ...issue2.path];
|
|
26408
26408
|
if (fullpath.length === 0) {
|
|
26409
26409
|
result.errors.push(mapper(issue2));
|
|
26410
26410
|
continue;
|
|
@@ -26437,8 +26437,8 @@ function treeifyError(error48, mapper = (issue2) => issue2.message) {
|
|
|
26437
26437
|
__name(treeifyError, "treeifyError");
|
|
26438
26438
|
function toDotPath(_path) {
|
|
26439
26439
|
const segs = [];
|
|
26440
|
-
const
|
|
26441
|
-
for (const seg of
|
|
26440
|
+
const path10 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
|
|
26441
|
+
for (const seg of path10) {
|
|
26442
26442
|
if (typeof seg === "number")
|
|
26443
26443
|
segs.push(`[${seg}]`);
|
|
26444
26444
|
else if (typeof seg === "symbol")
|
|
@@ -38852,13 +38852,13 @@ function resolveRef(ref, ctx) {
|
|
|
38852
38852
|
if (!ref.startsWith("#")) {
|
|
38853
38853
|
throw new Error("External $ref is not supported, only local refs (#/...) are allowed");
|
|
38854
38854
|
}
|
|
38855
|
-
const
|
|
38856
|
-
if (
|
|
38855
|
+
const path10 = ref.slice(1).split("/").filter(Boolean);
|
|
38856
|
+
if (path10.length === 0) {
|
|
38857
38857
|
return ctx.rootSchema;
|
|
38858
38858
|
}
|
|
38859
38859
|
const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions";
|
|
38860
|
-
if (
|
|
38861
|
-
const key =
|
|
38860
|
+
if (path10[0] === defsKey) {
|
|
38861
|
+
const key = path10[1];
|
|
38862
38862
|
if (!key || !ctx.defs[key]) {
|
|
38863
38863
|
throw new Error(`Reference not found: ${ref}`);
|
|
38864
38864
|
}
|
|
@@ -42669,10 +42669,10 @@ var ENCODINGS = {
|
|
|
42669
42669
|
gzip: ".gz"
|
|
42670
42670
|
};
|
|
42671
42671
|
var ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS);
|
|
42672
|
-
var getStats = /* @__PURE__ */ __name((
|
|
42672
|
+
var getStats = /* @__PURE__ */ __name((path10) => {
|
|
42673
42673
|
let stats;
|
|
42674
42674
|
try {
|
|
42675
|
-
stats = statSync(
|
|
42675
|
+
stats = statSync(path10);
|
|
42676
42676
|
} catch {
|
|
42677
42677
|
}
|
|
42678
42678
|
return stats;
|
|
@@ -42706,29 +42706,29 @@ var serveStatic = /* @__PURE__ */ __name((options = { root: "" }) => {
|
|
|
42706
42706
|
await options.onNotFound?.(c.req.path, c);
|
|
42707
42707
|
return next();
|
|
42708
42708
|
}
|
|
42709
|
-
let
|
|
42710
|
-
let stats = getStats(
|
|
42709
|
+
let path10 = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename);
|
|
42710
|
+
let stats = getStats(path10);
|
|
42711
42711
|
if (stats && stats.isDirectory()) {
|
|
42712
42712
|
const indexFile = options.index ?? "index.html";
|
|
42713
|
-
|
|
42714
|
-
stats = getStats(
|
|
42713
|
+
path10 = join(path10, indexFile);
|
|
42714
|
+
stats = getStats(path10);
|
|
42715
42715
|
}
|
|
42716
42716
|
if (!stats) {
|
|
42717
|
-
await options.onNotFound?.(
|
|
42717
|
+
await options.onNotFound?.(path10, c);
|
|
42718
42718
|
return next();
|
|
42719
42719
|
}
|
|
42720
|
-
const mimeType = getMimeType(
|
|
42720
|
+
const mimeType = getMimeType(path10);
|
|
42721
42721
|
c.header("Content-Type", mimeType || "application/octet-stream");
|
|
42722
42722
|
if (options.precompressed && (!mimeType || mimeType === "application/octet-stream" || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
|
|
42723
42723
|
const acceptEncodingSet = new Set(c.req.header("Accept-Encoding")?.split(",").map((encoding) => encoding.trim()));
|
|
42724
42724
|
for (const encoding of ENCODINGS_ORDERED_KEYS) {
|
|
42725
42725
|
if (!acceptEncodingSet.has(encoding)) continue;
|
|
42726
|
-
const precompressedStats = getStats(
|
|
42726
|
+
const precompressedStats = getStats(path10 + ENCODINGS[encoding]);
|
|
42727
42727
|
if (precompressedStats) {
|
|
42728
42728
|
c.header("Content-Encoding", encoding);
|
|
42729
42729
|
c.header("Vary", "Accept-Encoding", { append: true });
|
|
42730
42730
|
stats = precompressedStats;
|
|
42731
|
-
|
|
42731
|
+
path10 = path10 + ENCODINGS[encoding];
|
|
42732
42732
|
break;
|
|
42733
42733
|
}
|
|
42734
42734
|
}
|
|
@@ -42743,7 +42743,7 @@ var serveStatic = /* @__PURE__ */ __name((options = { root: "" }) => {
|
|
|
42743
42743
|
result = c.body(null);
|
|
42744
42744
|
} else if (!range) {
|
|
42745
42745
|
c.header("Content-Length", size.toString());
|
|
42746
|
-
result = c.body(createStreamBody(createReadStream(
|
|
42746
|
+
result = c.body(createStreamBody(createReadStream(path10)), 200);
|
|
42747
42747
|
} else {
|
|
42748
42748
|
c.header("Accept-Ranges", "bytes");
|
|
42749
42749
|
const parts = range.replace(/bytes=/, "").split("-", 2);
|
|
@@ -42751,7 +42751,7 @@ var serveStatic = /* @__PURE__ */ __name((options = { root: "" }) => {
|
|
|
42751
42751
|
let end = parseInt(parts[1], 10) || size - 1;
|
|
42752
42752
|
if (size < end - start + 1) end = size - 1;
|
|
42753
42753
|
const chunksize = end - start + 1;
|
|
42754
|
-
const stream = createReadStream(
|
|
42754
|
+
const stream = createReadStream(path10, {
|
|
42755
42755
|
start,
|
|
42756
42756
|
end
|
|
42757
42757
|
});
|
|
@@ -42759,7 +42759,7 @@ var serveStatic = /* @__PURE__ */ __name((options = { root: "" }) => {
|
|
|
42759
42759
|
c.header("Content-Range", `bytes ${start}-${end}/${stats.size}`);
|
|
42760
42760
|
result = c.body(createStreamBody(stream), 206);
|
|
42761
42761
|
}
|
|
42762
|
-
await options.onFound?.(
|
|
42762
|
+
await options.onFound?.(path10, c);
|
|
42763
42763
|
return result;
|
|
42764
42764
|
};
|
|
42765
42765
|
}, "serveStatic");
|
|
@@ -42781,26 +42781,26 @@ init_esm_shims();
|
|
|
42781
42781
|
|
|
42782
42782
|
// node_modules/hono/dist/utils/url.js
|
|
42783
42783
|
init_esm_shims();
|
|
42784
|
-
var splitPath = /* @__PURE__ */ __name((
|
|
42785
|
-
const paths =
|
|
42784
|
+
var splitPath = /* @__PURE__ */ __name((path10) => {
|
|
42785
|
+
const paths = path10.split("/");
|
|
42786
42786
|
if (paths[0] === "") {
|
|
42787
42787
|
paths.shift();
|
|
42788
42788
|
}
|
|
42789
42789
|
return paths;
|
|
42790
42790
|
}, "splitPath");
|
|
42791
42791
|
var splitRoutingPath = /* @__PURE__ */ __name((routePath) => {
|
|
42792
|
-
const { groups, path:
|
|
42793
|
-
const paths = splitPath(
|
|
42792
|
+
const { groups, path: path10 } = extractGroupsFromPath(routePath);
|
|
42793
|
+
const paths = splitPath(path10);
|
|
42794
42794
|
return replaceGroupMarks(paths, groups);
|
|
42795
42795
|
}, "splitRoutingPath");
|
|
42796
|
-
var extractGroupsFromPath = /* @__PURE__ */ __name((
|
|
42796
|
+
var extractGroupsFromPath = /* @__PURE__ */ __name((path10) => {
|
|
42797
42797
|
const groups = [];
|
|
42798
|
-
|
|
42798
|
+
path10 = path10.replace(/\{[^}]+\}/g, (match2, index) => {
|
|
42799
42799
|
const mark = `@${index}`;
|
|
42800
42800
|
groups.push([mark, match2]);
|
|
42801
42801
|
return mark;
|
|
42802
42802
|
});
|
|
42803
|
-
return { groups, path:
|
|
42803
|
+
return { groups, path: path10 };
|
|
42804
42804
|
}, "extractGroupsFromPath");
|
|
42805
42805
|
var replaceGroupMarks = /* @__PURE__ */ __name((paths, groups) => {
|
|
42806
42806
|
for (let i = groups.length - 1; i >= 0; i--) {
|
|
@@ -42857,8 +42857,8 @@ var getPath = /* @__PURE__ */ __name((request) => {
|
|
|
42857
42857
|
const queryIndex = url2.indexOf("?", i);
|
|
42858
42858
|
const hashIndex = url2.indexOf("#", i);
|
|
42859
42859
|
const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
|
|
42860
|
-
const
|
|
42861
|
-
return tryDecodeURI2(
|
|
42860
|
+
const path10 = url2.slice(start, end);
|
|
42861
|
+
return tryDecodeURI2(path10.includes("%25") ? path10.replace(/%25/g, "%2525") : path10);
|
|
42862
42862
|
} else if (charCode === 63 || charCode === 35) {
|
|
42863
42863
|
break;
|
|
42864
42864
|
}
|
|
@@ -42875,11 +42875,11 @@ var mergePath = /* @__PURE__ */ __name((base, sub, ...rest) => {
|
|
|
42875
42875
|
}
|
|
42876
42876
|
return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
|
|
42877
42877
|
}, "mergePath");
|
|
42878
|
-
var checkOptionalParameter = /* @__PURE__ */ __name((
|
|
42879
|
-
if (
|
|
42878
|
+
var checkOptionalParameter = /* @__PURE__ */ __name((path10) => {
|
|
42879
|
+
if (path10.charCodeAt(path10.length - 1) !== 63 || !path10.includes(":")) {
|
|
42880
42880
|
return null;
|
|
42881
42881
|
}
|
|
42882
|
-
const segments =
|
|
42882
|
+
const segments = path10.split("/");
|
|
42883
42883
|
const results = [];
|
|
42884
42884
|
let basePath = "";
|
|
42885
42885
|
segments.forEach((segment) => {
|
|
@@ -43316,9 +43316,9 @@ var Streamer = class extends StreamerRequest {
|
|
|
43316
43316
|
root: options.root,
|
|
43317
43317
|
index: options.index,
|
|
43318
43318
|
precompressed: options.precompressed,
|
|
43319
|
-
onNotFound: /* @__PURE__ */ __name(async (
|
|
43319
|
+
onNotFound: /* @__PURE__ */ __name(async (path10, c) => {
|
|
43320
43320
|
if (options.on404)
|
|
43321
|
-
await options.on404(
|
|
43321
|
+
await options.on404(path10, this);
|
|
43322
43322
|
else
|
|
43323
43323
|
this.res.sendResponse(await c.notFound());
|
|
43324
43324
|
}, "onNotFound")
|
|
@@ -43546,10 +43546,10 @@ var Streamer = class extends StreamerRequest {
|
|
|
43546
43546
|
};
|
|
43547
43547
|
async function awaitPipe(from, to2) {
|
|
43548
43548
|
from.pipe(to2, { end: false });
|
|
43549
|
-
return new Promise((
|
|
43549
|
+
return new Promise((resolve11, reject) => {
|
|
43550
43550
|
const unpipe = /* @__PURE__ */ __name(() => {
|
|
43551
43551
|
to2.off("error", error48);
|
|
43552
|
-
|
|
43552
|
+
resolve11();
|
|
43553
43553
|
}, "unpipe");
|
|
43554
43554
|
const error48 = /* @__PURE__ */ __name((e) => {
|
|
43555
43555
|
to2.off("unpipe", unpipe);
|
|
@@ -43561,10 +43561,10 @@ async function awaitPipe(from, to2) {
|
|
|
43561
43561
|
}
|
|
43562
43562
|
__name(awaitPipe, "awaitPipe");
|
|
43563
43563
|
async function awaitDrain(writer) {
|
|
43564
|
-
await new Promise((
|
|
43564
|
+
await new Promise((resolve11, reject) => {
|
|
43565
43565
|
const onDrain = /* @__PURE__ */ __name(() => {
|
|
43566
43566
|
writer.off("error", onError);
|
|
43567
|
-
|
|
43567
|
+
resolve11();
|
|
43568
43568
|
}, "onDrain");
|
|
43569
43569
|
const onError = /* @__PURE__ */ __name((error48) => {
|
|
43570
43570
|
writer.off("drain", onDrain);
|
|
@@ -43761,9 +43761,9 @@ var HonoRequest = class {
|
|
|
43761
43761
|
*/
|
|
43762
43762
|
path;
|
|
43763
43763
|
bodyCache = {};
|
|
43764
|
-
constructor(request,
|
|
43764
|
+
constructor(request, path10 = "/", matchResult = [[]]) {
|
|
43765
43765
|
this.raw = request;
|
|
43766
|
-
this.path =
|
|
43766
|
+
this.path = path10;
|
|
43767
43767
|
this.#matchResult = matchResult;
|
|
43768
43768
|
this.#validatedData = {};
|
|
43769
43769
|
}
|
|
@@ -44527,8 +44527,8 @@ var Hono = class _Hono {
|
|
|
44527
44527
|
return this;
|
|
44528
44528
|
};
|
|
44529
44529
|
});
|
|
44530
|
-
this.on = (method,
|
|
44531
|
-
for (const p2 of [
|
|
44530
|
+
this.on = (method, path10, ...handlers) => {
|
|
44531
|
+
for (const p2 of [path10].flat()) {
|
|
44532
44532
|
this.#path = p2;
|
|
44533
44533
|
for (const m2 of [method].flat()) {
|
|
44534
44534
|
handlers.map((handler) => {
|
|
@@ -44585,8 +44585,8 @@ var Hono = class _Hono {
|
|
|
44585
44585
|
* app.route("/api", app2) // GET /api/user
|
|
44586
44586
|
* ```
|
|
44587
44587
|
*/
|
|
44588
|
-
route(
|
|
44589
|
-
const subApp = this.basePath(
|
|
44588
|
+
route(path10, app) {
|
|
44589
|
+
const subApp = this.basePath(path10);
|
|
44590
44590
|
app.routes.map((r) => {
|
|
44591
44591
|
let handler;
|
|
44592
44592
|
if (app.errorHandler === errorHandler) {
|
|
@@ -44612,9 +44612,9 @@ var Hono = class _Hono {
|
|
|
44612
44612
|
* const api = new Hono().basePath('/api')
|
|
44613
44613
|
* ```
|
|
44614
44614
|
*/
|
|
44615
|
-
basePath(
|
|
44615
|
+
basePath(path10) {
|
|
44616
44616
|
const subApp = this.#clone();
|
|
44617
|
-
subApp._basePath = mergePath(this._basePath,
|
|
44617
|
+
subApp._basePath = mergePath(this._basePath, path10);
|
|
44618
44618
|
return subApp;
|
|
44619
44619
|
}
|
|
44620
44620
|
/**
|
|
@@ -44688,7 +44688,7 @@ var Hono = class _Hono {
|
|
|
44688
44688
|
* })
|
|
44689
44689
|
* ```
|
|
44690
44690
|
*/
|
|
44691
|
-
mount(
|
|
44691
|
+
mount(path10, applicationHandler, options) {
|
|
44692
44692
|
let replaceRequest;
|
|
44693
44693
|
let optionHandler;
|
|
44694
44694
|
if (options) {
|
|
@@ -44715,7 +44715,7 @@ var Hono = class _Hono {
|
|
|
44715
44715
|
return [c.env, executionContext];
|
|
44716
44716
|
};
|
|
44717
44717
|
replaceRequest ||= (() => {
|
|
44718
|
-
const mergedPath = mergePath(this._basePath,
|
|
44718
|
+
const mergedPath = mergePath(this._basePath, path10);
|
|
44719
44719
|
const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length;
|
|
44720
44720
|
return (request) => {
|
|
44721
44721
|
const url2 = new URL(request.url);
|
|
@@ -44730,19 +44730,19 @@ var Hono = class _Hono {
|
|
|
44730
44730
|
}
|
|
44731
44731
|
await next();
|
|
44732
44732
|
}, "handler");
|
|
44733
|
-
this.#addRoute(METHOD_NAME_ALL, mergePath(
|
|
44733
|
+
this.#addRoute(METHOD_NAME_ALL, mergePath(path10, "*"), handler);
|
|
44734
44734
|
return this;
|
|
44735
44735
|
}
|
|
44736
|
-
#addRoute(method,
|
|
44736
|
+
#addRoute(method, path10, handler, baseRoutePath) {
|
|
44737
44737
|
method = method.toUpperCase();
|
|
44738
|
-
|
|
44738
|
+
path10 = mergePath(this._basePath, path10);
|
|
44739
44739
|
const r = {
|
|
44740
44740
|
basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,
|
|
44741
|
-
path:
|
|
44741
|
+
path: path10,
|
|
44742
44742
|
method,
|
|
44743
44743
|
handler
|
|
44744
44744
|
};
|
|
44745
|
-
this.router.add(method,
|
|
44745
|
+
this.router.add(method, path10, [handler, r]);
|
|
44746
44746
|
this.routes.push(r);
|
|
44747
44747
|
}
|
|
44748
44748
|
#handleError(err, c) {
|
|
@@ -44755,10 +44755,10 @@ var Hono = class _Hono {
|
|
|
44755
44755
|
if (method === "HEAD") {
|
|
44756
44756
|
return (async () => new Response(null, await this.#dispatch(request, executionCtx, env3, "GET")))();
|
|
44757
44757
|
}
|
|
44758
|
-
const
|
|
44759
|
-
const matchResult = this.router.match(method,
|
|
44758
|
+
const path10 = this.getPath(request, { env: env3 });
|
|
44759
|
+
const matchResult = this.router.match(method, path10);
|
|
44760
44760
|
const c = new Context(request, {
|
|
44761
|
-
path:
|
|
44761
|
+
path: path10,
|
|
44762
44762
|
matchResult,
|
|
44763
44763
|
env: env3,
|
|
44764
44764
|
executionCtx,
|
|
@@ -44865,7 +44865,7 @@ init_esm_shims();
|
|
|
44865
44865
|
// node_modules/hono/dist/router/reg-exp-router/matcher.js
|
|
44866
44866
|
init_esm_shims();
|
|
44867
44867
|
var emptyParam = [];
|
|
44868
|
-
function match(method,
|
|
44868
|
+
function match(method, path10) {
|
|
44869
44869
|
const matchers = this.buildAllMatchers();
|
|
44870
44870
|
const match2 = /* @__PURE__ */ __name(((method2, path22) => {
|
|
44871
44871
|
const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];
|
|
@@ -44881,7 +44881,7 @@ function match(method, path9) {
|
|
|
44881
44881
|
return [matcher[1][index], match3];
|
|
44882
44882
|
}), "match2");
|
|
44883
44883
|
this.match = match2;
|
|
44884
|
-
return match2(method,
|
|
44884
|
+
return match2(method, path10);
|
|
44885
44885
|
}
|
|
44886
44886
|
__name(match, "match");
|
|
44887
44887
|
|
|
@@ -45006,12 +45006,12 @@ var Trie = class {
|
|
|
45006
45006
|
}
|
|
45007
45007
|
#context = { varIndex: 0 };
|
|
45008
45008
|
#root = new Node();
|
|
45009
|
-
insert(
|
|
45009
|
+
insert(path10, index, pathErrorCheckOnly) {
|
|
45010
45010
|
const paramAssoc = [];
|
|
45011
45011
|
const groups = [];
|
|
45012
45012
|
for (let i = 0; ; ) {
|
|
45013
45013
|
let replaced = false;
|
|
45014
|
-
|
|
45014
|
+
path10 = path10.replace(/\{[^}]+\}/g, (m2) => {
|
|
45015
45015
|
const mark = `@\\${i}`;
|
|
45016
45016
|
groups[i] = [mark, m2];
|
|
45017
45017
|
i++;
|
|
@@ -45022,7 +45022,7 @@ var Trie = class {
|
|
|
45022
45022
|
break;
|
|
45023
45023
|
}
|
|
45024
45024
|
}
|
|
45025
|
-
const tokens =
|
|
45025
|
+
const tokens = path10.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
|
|
45026
45026
|
for (let i = groups.length - 1; i >= 0; i--) {
|
|
45027
45027
|
const [mark] = groups[i];
|
|
45028
45028
|
for (let j2 = tokens.length - 1; j2 >= 0; j2--) {
|
|
@@ -45061,9 +45061,9 @@ var Trie = class {
|
|
|
45061
45061
|
// node_modules/hono/dist/router/reg-exp-router/router.js
|
|
45062
45062
|
var nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];
|
|
45063
45063
|
var wildcardRegExpCache = /* @__PURE__ */ Object.create(null);
|
|
45064
|
-
function buildWildcardRegExp(
|
|
45065
|
-
return wildcardRegExpCache[
|
|
45066
|
-
|
|
45064
|
+
function buildWildcardRegExp(path10) {
|
|
45065
|
+
return wildcardRegExpCache[path10] ??= new RegExp(
|
|
45066
|
+
path10 === "*" ? "" : `^${path10.replace(
|
|
45067
45067
|
/\/\*$|([.\\+*[^\]$()])/g,
|
|
45068
45068
|
(_2, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)"
|
|
45069
45069
|
)}$`
|
|
@@ -45087,17 +45087,17 @@ function buildMatcherFromPreprocessedRoutes(routes) {
|
|
|
45087
45087
|
);
|
|
45088
45088
|
const staticMap = /* @__PURE__ */ Object.create(null);
|
|
45089
45089
|
for (let i = 0, j2 = -1, len = routesWithStaticPathFlag.length; i < len; i++) {
|
|
45090
|
-
const [pathErrorCheckOnly,
|
|
45090
|
+
const [pathErrorCheckOnly, path10, handlers] = routesWithStaticPathFlag[i];
|
|
45091
45091
|
if (pathErrorCheckOnly) {
|
|
45092
|
-
staticMap[
|
|
45092
|
+
staticMap[path10] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];
|
|
45093
45093
|
} else {
|
|
45094
45094
|
j2++;
|
|
45095
45095
|
}
|
|
45096
45096
|
let paramAssoc;
|
|
45097
45097
|
try {
|
|
45098
|
-
paramAssoc = trie.insert(
|
|
45098
|
+
paramAssoc = trie.insert(path10, j2, pathErrorCheckOnly);
|
|
45099
45099
|
} catch (e) {
|
|
45100
|
-
throw e === PATH_ERROR ? new UnsupportedPathError(
|
|
45100
|
+
throw e === PATH_ERROR ? new UnsupportedPathError(path10) : e;
|
|
45101
45101
|
}
|
|
45102
45102
|
if (pathErrorCheckOnly) {
|
|
45103
45103
|
continue;
|
|
@@ -45132,12 +45132,12 @@ function buildMatcherFromPreprocessedRoutes(routes) {
|
|
|
45132
45132
|
return [regexp, handlerMap, staticMap];
|
|
45133
45133
|
}
|
|
45134
45134
|
__name(buildMatcherFromPreprocessedRoutes, "buildMatcherFromPreprocessedRoutes");
|
|
45135
|
-
function findMiddleware(middleware,
|
|
45135
|
+
function findMiddleware(middleware, path10) {
|
|
45136
45136
|
if (!middleware) {
|
|
45137
45137
|
return void 0;
|
|
45138
45138
|
}
|
|
45139
45139
|
for (const k2 of Object.keys(middleware).sort((a, b2) => b2.length - a.length)) {
|
|
45140
|
-
if (buildWildcardRegExp(k2).test(
|
|
45140
|
+
if (buildWildcardRegExp(k2).test(path10)) {
|
|
45141
45141
|
return [...middleware[k2]];
|
|
45142
45142
|
}
|
|
45143
45143
|
}
|
|
@@ -45155,7 +45155,7 @@ var RegExpRouter = class {
|
|
|
45155
45155
|
this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
|
|
45156
45156
|
this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };
|
|
45157
45157
|
}
|
|
45158
|
-
add(method,
|
|
45158
|
+
add(method, path10, handler) {
|
|
45159
45159
|
const middleware = this.#middleware;
|
|
45160
45160
|
const routes = this.#routes;
|
|
45161
45161
|
if (!middleware || !routes) {
|
|
@@ -45170,18 +45170,18 @@ var RegExpRouter = class {
|
|
|
45170
45170
|
});
|
|
45171
45171
|
});
|
|
45172
45172
|
}
|
|
45173
|
-
if (
|
|
45174
|
-
|
|
45173
|
+
if (path10 === "/*") {
|
|
45174
|
+
path10 = "*";
|
|
45175
45175
|
}
|
|
45176
|
-
const paramCount = (
|
|
45177
|
-
if (/\*$/.test(
|
|
45178
|
-
const re2 = buildWildcardRegExp(
|
|
45176
|
+
const paramCount = (path10.match(/\/:/g) || []).length;
|
|
45177
|
+
if (/\*$/.test(path10)) {
|
|
45178
|
+
const re2 = buildWildcardRegExp(path10);
|
|
45179
45179
|
if (method === METHOD_NAME_ALL) {
|
|
45180
45180
|
Object.keys(middleware).forEach((m2) => {
|
|
45181
|
-
middleware[m2][
|
|
45181
|
+
middleware[m2][path10] ||= findMiddleware(middleware[m2], path10) || findMiddleware(middleware[METHOD_NAME_ALL], path10) || [];
|
|
45182
45182
|
});
|
|
45183
45183
|
} else {
|
|
45184
|
-
middleware[method][
|
|
45184
|
+
middleware[method][path10] ||= findMiddleware(middleware[method], path10) || findMiddleware(middleware[METHOD_NAME_ALL], path10) || [];
|
|
45185
45185
|
}
|
|
45186
45186
|
Object.keys(middleware).forEach((m2) => {
|
|
45187
45187
|
if (method === METHOD_NAME_ALL || method === m2) {
|
|
@@ -45199,7 +45199,7 @@ var RegExpRouter = class {
|
|
|
45199
45199
|
});
|
|
45200
45200
|
return;
|
|
45201
45201
|
}
|
|
45202
|
-
const paths = checkOptionalParameter(
|
|
45202
|
+
const paths = checkOptionalParameter(path10) || [path10];
|
|
45203
45203
|
for (let i = 0, len = paths.length; i < len; i++) {
|
|
45204
45204
|
const path22 = paths[i];
|
|
45205
45205
|
Object.keys(routes).forEach((m2) => {
|
|
@@ -45226,13 +45226,13 @@ var RegExpRouter = class {
|
|
|
45226
45226
|
const routes = [];
|
|
45227
45227
|
let hasOwnRoute = method === METHOD_NAME_ALL;
|
|
45228
45228
|
[this.#middleware, this.#routes].forEach((r) => {
|
|
45229
|
-
const ownRoute = r[method] ? Object.keys(r[method]).map((
|
|
45229
|
+
const ownRoute = r[method] ? Object.keys(r[method]).map((path10) => [path10, r[method][path10]]) : [];
|
|
45230
45230
|
if (ownRoute.length !== 0) {
|
|
45231
45231
|
hasOwnRoute ||= true;
|
|
45232
45232
|
routes.push(...ownRoute);
|
|
45233
45233
|
} else if (method !== METHOD_NAME_ALL) {
|
|
45234
45234
|
routes.push(
|
|
45235
|
-
...Object.keys(r[METHOD_NAME_ALL]).map((
|
|
45235
|
+
...Object.keys(r[METHOD_NAME_ALL]).map((path10) => [path10, r[METHOD_NAME_ALL][path10]])
|
|
45236
45236
|
);
|
|
45237
45237
|
}
|
|
45238
45238
|
});
|
|
@@ -45262,13 +45262,13 @@ var SmartRouter = class {
|
|
|
45262
45262
|
constructor(init) {
|
|
45263
45263
|
this.#routers = init.routers;
|
|
45264
45264
|
}
|
|
45265
|
-
add(method,
|
|
45265
|
+
add(method, path10, handler) {
|
|
45266
45266
|
if (!this.#routes) {
|
|
45267
45267
|
throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);
|
|
45268
45268
|
}
|
|
45269
|
-
this.#routes.push([method,
|
|
45269
|
+
this.#routes.push([method, path10, handler]);
|
|
45270
45270
|
}
|
|
45271
|
-
match(method,
|
|
45271
|
+
match(method, path10) {
|
|
45272
45272
|
if (!this.#routes) {
|
|
45273
45273
|
throw new Error("Fatal error");
|
|
45274
45274
|
}
|
|
@@ -45283,7 +45283,7 @@ var SmartRouter = class {
|
|
|
45283
45283
|
for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {
|
|
45284
45284
|
router.add(...routes[i2]);
|
|
45285
45285
|
}
|
|
45286
|
-
res = router.match(method,
|
|
45286
|
+
res = router.match(method, path10);
|
|
45287
45287
|
} catch (e) {
|
|
45288
45288
|
if (e instanceof UnsupportedPathError) {
|
|
45289
45289
|
continue;
|
|
@@ -45343,10 +45343,10 @@ var Node2 = class _Node2 {
|
|
|
45343
45343
|
}
|
|
45344
45344
|
this.#patterns = [];
|
|
45345
45345
|
}
|
|
45346
|
-
insert(method,
|
|
45346
|
+
insert(method, path10, handler) {
|
|
45347
45347
|
this.#order = ++this.#order;
|
|
45348
45348
|
let curNode = this;
|
|
45349
|
-
const parts = splitRoutingPath(
|
|
45349
|
+
const parts = splitRoutingPath(path10);
|
|
45350
45350
|
const possibleKeys = [];
|
|
45351
45351
|
for (let i = 0, len = parts.length; i < len; i++) {
|
|
45352
45352
|
const p2 = parts[i];
|
|
@@ -45395,12 +45395,12 @@ var Node2 = class _Node2 {
|
|
|
45395
45395
|
}
|
|
45396
45396
|
}
|
|
45397
45397
|
}
|
|
45398
|
-
search(method,
|
|
45398
|
+
search(method, path10) {
|
|
45399
45399
|
const handlerSets = [];
|
|
45400
45400
|
this.#params = emptyParams;
|
|
45401
45401
|
const curNode = this;
|
|
45402
45402
|
let curNodes = [curNode];
|
|
45403
|
-
const parts = splitPath(
|
|
45403
|
+
const parts = splitPath(path10);
|
|
45404
45404
|
const curNodesQueue = [];
|
|
45405
45405
|
const len = parts.length;
|
|
45406
45406
|
let partOffsets = null;
|
|
@@ -45442,13 +45442,13 @@ var Node2 = class _Node2 {
|
|
|
45442
45442
|
if (matcher instanceof RegExp) {
|
|
45443
45443
|
if (partOffsets === null) {
|
|
45444
45444
|
partOffsets = new Array(len);
|
|
45445
|
-
let offset =
|
|
45445
|
+
let offset = path10[0] === "/" ? 1 : 0;
|
|
45446
45446
|
for (let p2 = 0; p2 < len; p2++) {
|
|
45447
45447
|
partOffsets[p2] = offset;
|
|
45448
45448
|
offset += parts[p2].length + 1;
|
|
45449
45449
|
}
|
|
45450
45450
|
}
|
|
45451
|
-
const restPathString =
|
|
45451
|
+
const restPathString = path10.substring(partOffsets[i]);
|
|
45452
45452
|
const m2 = matcher.exec(restPathString);
|
|
45453
45453
|
if (m2) {
|
|
45454
45454
|
params[name] = m2[0];
|
|
@@ -45504,18 +45504,18 @@ var TrieRouter = class {
|
|
|
45504
45504
|
constructor() {
|
|
45505
45505
|
this.#node = new Node2();
|
|
45506
45506
|
}
|
|
45507
|
-
add(method,
|
|
45508
|
-
const results = checkOptionalParameter(
|
|
45507
|
+
add(method, path10, handler) {
|
|
45508
|
+
const results = checkOptionalParameter(path10);
|
|
45509
45509
|
if (results) {
|
|
45510
45510
|
for (let i = 0, len = results.length; i < len; i++) {
|
|
45511
45511
|
this.#node.insert(method, results[i], handler);
|
|
45512
45512
|
}
|
|
45513
45513
|
return;
|
|
45514
45514
|
}
|
|
45515
|
-
this.#node.insert(method,
|
|
45515
|
+
this.#node.insert(method, path10, handler);
|
|
45516
45516
|
}
|
|
45517
|
-
match(method,
|
|
45518
|
-
return this.#node.search(method,
|
|
45517
|
+
match(method, path10) {
|
|
45518
|
+
return this.#node.search(method, path10);
|
|
45519
45519
|
}
|
|
45520
45520
|
};
|
|
45521
45521
|
|
|
@@ -45911,6 +45911,7 @@ var catcher = /* @__PURE__ */ __name((errorKey, err) => {
|
|
|
45911
45911
|
if (err === STREAM_ENDED) return;
|
|
45912
45912
|
if (!err.skiplog)
|
|
45913
45913
|
console.log(errorKey, err);
|
|
45914
|
+
if (err instanceof Error && err.name === "AbortError") return;
|
|
45914
45915
|
if (err instanceof PrismaClientKnownRequestError2) {
|
|
45915
45916
|
console.log(err.meta?.driverAdapterError?.cause);
|
|
45916
45917
|
}
|
|
@@ -46019,31 +46020,31 @@ var Router = class _Router {
|
|
|
46019
46020
|
return this.hono.fetch;
|
|
46020
46021
|
}
|
|
46021
46022
|
routeHandlerMiddleware = createMiddleware((c, next) => {
|
|
46022
|
-
let
|
|
46023
|
+
let resolve11;
|
|
46023
46024
|
const prom = new Promise((r) => {
|
|
46024
|
-
|
|
46025
|
+
resolve11 = r;
|
|
46025
46026
|
});
|
|
46026
|
-
this.handleHonoRequest(c,
|
|
46027
|
+
this.handleHonoRequest(c, resolve11, next).catch((err) => {
|
|
46027
46028
|
const err2 = catcher(`${c.req.method} ${c.req.url}`, err);
|
|
46028
46029
|
if (!err2)
|
|
46029
46030
|
return;
|
|
46030
46031
|
if (err2.reason === "REDIRECT")
|
|
46031
|
-
return
|
|
46032
|
-
return
|
|
46032
|
+
return resolve11(c.redirect(err2.details.location));
|
|
46033
|
+
return resolve11(c.text(JSON.stringify(err2), err2.status, {
|
|
46033
46034
|
"content-type": "application/json",
|
|
46034
46035
|
"x-reason": err2.reason
|
|
46035
46036
|
}));
|
|
46036
46037
|
});
|
|
46037
46038
|
return prom;
|
|
46038
46039
|
});
|
|
46039
|
-
async handleHonoRequest(c,
|
|
46040
|
+
async handleHonoRequest(c, resolve11, next) {
|
|
46040
46041
|
const parsed = parseHonoRequest(c.req, c.env.pathPrefix, c.env.presumeHTTPS);
|
|
46041
46042
|
await serverEvents.emitAsync("request.init", this, parsed);
|
|
46042
46043
|
const routes = this.findRouteRecursive([this.rootRoute], parsed.urlInfo.pathname, parsed.method, false);
|
|
46043
46044
|
const routePath = routes.find((e) => e.every((f2) => !f2.route.method.length || f2.route.method.includes(parsed.method))) ?? [];
|
|
46044
46045
|
const bodyFormat = routePath.find((e) => e.route.bodyFormat)?.route.bodyFormat || "ignore";
|
|
46045
46046
|
this.securityChecks(parsed, routePath);
|
|
46046
|
-
const state = await this.createServerRequest(parsed, routePath, bodyFormat, c,
|
|
46047
|
+
const state = await this.createServerRequest(parsed, routePath, bodyFormat, c, resolve11);
|
|
46047
46048
|
await this.handleStateBody(state);
|
|
46048
46049
|
await serverEvents.emitAsync("request.state", this, state);
|
|
46049
46050
|
if (state.headersSent) return;
|
|
@@ -46103,10 +46104,13 @@ var Router = class _Router {
|
|
|
46103
46104
|
const res2 = await match2.route.handler(state);
|
|
46104
46105
|
await state[ROUTER_PROMISE];
|
|
46105
46106
|
return res2;
|
|
46106
|
-
}).catch((e) => {
|
|
46107
|
+
}).catch(async (e) => {
|
|
46107
46108
|
if (e === STREAM_ENDED) return e;
|
|
46108
46109
|
if (match2.route.catchHandler) {
|
|
46109
|
-
|
|
46110
|
+
state[ROUTER_PROMISE] = void 0;
|
|
46111
|
+
const res2 = match2.route.catchHandler(state, e);
|
|
46112
|
+
await state[ROUTER_PROMISE];
|
|
46113
|
+
return res2;
|
|
46110
46114
|
} else {
|
|
46111
46115
|
throw e;
|
|
46112
46116
|
}
|
|
@@ -46220,28 +46224,28 @@ var registerZodRoutes = /* @__PURE__ */ __name((parent, router, keys) => {
|
|
|
46220
46224
|
defineZodRoute(parent, key, router[key]);
|
|
46221
46225
|
});
|
|
46222
46226
|
}, "registerZodRoutes");
|
|
46223
|
-
function buildPathRegex(
|
|
46224
|
-
if (!
|
|
46227
|
+
function buildPathRegex(path10, key, keyReplacer) {
|
|
46228
|
+
if (!path10.startsWith("/")) throw new Error(`Path ${path10} must start with a forward slash`);
|
|
46225
46229
|
if (key.startsWith(":")) throw new Error(`Key ${key} must not start with a colon`);
|
|
46226
|
-
if (
|
|
46227
|
-
const parts =
|
|
46230
|
+
if (path10 !== path10.trim()) throw new Error(`Path ${path10} must not have leading and trailing white space or line terminator characters`);
|
|
46231
|
+
const parts = path10.split("/");
|
|
46228
46232
|
return "^" + parts.map((e, i) => {
|
|
46229
46233
|
const last = i === parts.length - 1;
|
|
46230
46234
|
if (e === "") {
|
|
46231
|
-
if (!last && i !== 0) throw new Error(`Path ${
|
|
46235
|
+
if (!last && i !== 0) throw new Error(`Path ${path10} has an empty part at index ${i}`);
|
|
46232
46236
|
return "";
|
|
46233
46237
|
}
|
|
46234
46238
|
const name = e.startsWith(":") && e.slice(1);
|
|
46235
46239
|
if (e === keyReplacer) return key;
|
|
46236
46240
|
if (!name) return e;
|
|
46237
|
-
return last && !
|
|
46238
|
-
}).join("/") + (
|
|
46241
|
+
return last && !path10.endsWith("/") ? `(?<${name}>.+)` : `(?<${name}>[^/]+)`;
|
|
46242
|
+
}).join("/") + (path10.endsWith("/") ? "(?=/)" : "$");
|
|
46239
46243
|
}
|
|
46240
46244
|
__name(buildPathRegex, "buildPathRegex");
|
|
46241
46245
|
function defineZodRoute(parent, key, route) {
|
|
46242
46246
|
const {
|
|
46243
46247
|
method,
|
|
46244
|
-
path:
|
|
46248
|
+
path: path10,
|
|
46245
46249
|
bodyFormat,
|
|
46246
46250
|
registerError,
|
|
46247
46251
|
keyReplacer,
|
|
@@ -46253,7 +46257,7 @@ function defineZodRoute(parent, key, route) {
|
|
|
46253
46257
|
} = route;
|
|
46254
46258
|
if (method.includes("OPTIONS") && method.length > 1)
|
|
46255
46259
|
throw new Error(key + " includes OPTIONS. The OPTIONS method should be set on its own handler since it is path-specific and setting it more than once per path will result in confusing behavior.");
|
|
46256
|
-
const pathregex = typeof
|
|
46260
|
+
const pathregex = typeof path10 === "string" ? buildPathRegex(path10, key, keyReplacer ?? "") : path10;
|
|
46257
46261
|
try {
|
|
46258
46262
|
return parent.defineRoute({
|
|
46259
46263
|
method,
|
|
@@ -46519,11 +46523,11 @@ import { readFileSync as readFileSync2 } from "fs";
|
|
|
46519
46523
|
// packages/mws/src/new-managers/sessions.ts
|
|
46520
46524
|
init_esm_shims();
|
|
46521
46525
|
import { createHash, randomBytes } from "crypto";
|
|
46522
|
-
function zodSession(
|
|
46526
|
+
function zodSession(path10, zodRequest, preflight, inner) {
|
|
46523
46527
|
return {
|
|
46524
46528
|
...zodRoute({
|
|
46525
46529
|
method: ["POST"],
|
|
46526
|
-
path:
|
|
46530
|
+
path: path10,
|
|
46527
46531
|
bodyFormat: "json",
|
|
46528
46532
|
zodPathParams: /* @__PURE__ */ __name((z3) => ({}), "zodPathParams"),
|
|
46529
46533
|
zodQueryKeys: [],
|
|
@@ -46536,7 +46540,7 @@ function zodSession(path9, zodRequest, preflight, inner) {
|
|
|
46536
46540
|
return state.$transaction(async (prisma) => await inner(state, prisma));
|
|
46537
46541
|
}, "inner")
|
|
46538
46542
|
}),
|
|
46539
|
-
path:
|
|
46543
|
+
path: path10
|
|
46540
46544
|
};
|
|
46541
46545
|
}
|
|
46542
46546
|
__name(zodSession, "zodSession");
|
|
@@ -46564,7 +46568,7 @@ var RateLimiter = class {
|
|
|
46564
46568
|
}
|
|
46565
46569
|
this.nextRunAt.set(key, now + this.minIntervalMs);
|
|
46566
46570
|
try {
|
|
46567
|
-
await new Promise((
|
|
46571
|
+
await new Promise((resolve11) => setTimeout(resolve11, this.minIntervalMs));
|
|
46568
46572
|
} finally {
|
|
46569
46573
|
if (this.nextRunAt.get(key)) {
|
|
46570
46574
|
this.nextRunAt.delete(key);
|
|
@@ -46584,7 +46588,12 @@ var SessionManager = class _SessionManager {
|
|
|
46584
46588
|
}
|
|
46585
46589
|
static AdminRoleName = "ADMIN";
|
|
46586
46590
|
static UserRoleName = "USER";
|
|
46591
|
+
static roleLookup = void 0;
|
|
46587
46592
|
static async parseIncomingRequest(cookies, config3) {
|
|
46593
|
+
this.roleLookup ??= Object.fromEntries((await config3.engine.roles.findMany({
|
|
46594
|
+
where: { role_name: { in: [this.AdminRoleName, this.UserRoleName] } },
|
|
46595
|
+
select: { role_id: true, role_name: true }
|
|
46596
|
+
})).map((e) => [e.role_name, e.role_id]));
|
|
46588
46597
|
const sessionId = cookies.getAll("session");
|
|
46589
46598
|
const session = sessionId && await config3.engine.sessions.findFirst({
|
|
46590
46599
|
where: { session_id: { in: sessionId } },
|
|
@@ -46601,7 +46610,9 @@ var SessionManager = class _SessionManager {
|
|
|
46601
46610
|
sessionId: session.session_id,
|
|
46602
46611
|
isLoggedIn: true,
|
|
46603
46612
|
AdminRoleName: _SessionManager.AdminRoleName,
|
|
46604
|
-
UserRoleName: _SessionManager.UserRoleName
|
|
46613
|
+
UserRoleName: _SessionManager.UserRoleName,
|
|
46614
|
+
AdminRoleID: this.roleLookup[this.AdminRoleName],
|
|
46615
|
+
UserRoleID: this.roleLookup[this.UserRoleName]
|
|
46605
46616
|
};
|
|
46606
46617
|
else return {
|
|
46607
46618
|
user_id: "",
|
|
@@ -46611,7 +46622,9 @@ var SessionManager = class _SessionManager {
|
|
|
46611
46622
|
sessionId: void 0,
|
|
46612
46623
|
isLoggedIn: false,
|
|
46613
46624
|
AdminRoleName: _SessionManager.AdminRoleName,
|
|
46614
|
-
UserRoleName: _SessionManager.UserRoleName
|
|
46625
|
+
UserRoleName: _SessionManager.UserRoleName,
|
|
46626
|
+
AdminRoleID: this.roleLookup[this.AdminRoleName],
|
|
46627
|
+
UserRoleID: this.roleLookup[this.UserRoleName]
|
|
46615
46628
|
};
|
|
46616
46629
|
}
|
|
46617
46630
|
login1 = zodSession("/login/1", (z3) => z3.object({
|
|
@@ -46994,14 +47007,14 @@ async function setupClientBuild({ rootdir, publicdir, clientMounts, title }) {
|
|
|
46994
47007
|
if (!existsSync3(publicdir)) throw new Error(`${publicdir} does not exist`);
|
|
46995
47008
|
return /* @__PURE__ */ __name(async function sendProdServer(state, sendError) {
|
|
46996
47009
|
if (sendError)
|
|
46997
|
-
return await serveIndex({ state, publicdir, status: sendError.status, serverResponse: { userState: state.user, sendError } });
|
|
47010
|
+
return await serveIndex({ state, publicdir, status: sendError.status, serverResponse: { userState: state.user, tw5Version: state.pluginCache.tw5Docs.version, sendError } });
|
|
46998
47011
|
if (state.urlInfo.pathname === "/" || clientMounts?.some((e) => state.urlInfo.pathname === e || state.urlInfo.pathname.startsWith(e + "/")))
|
|
46999
|
-
return await serveIndex({ state, publicdir, status: 200, serverResponse: { userState: state.user } });
|
|
47012
|
+
return await serveIndex({ state, publicdir, status: 200, serverResponse: { userState: state.user, tw5Version: state.pluginCache.tw5Docs.version } });
|
|
47000
47013
|
return state.sendFile(200, {}, {
|
|
47001
47014
|
root: publicdir,
|
|
47002
47015
|
reqpath: state.urlInfo.pathname,
|
|
47003
47016
|
on404: !clientMounts ? (async () => {
|
|
47004
|
-
await serveIndex({ state, publicdir, status: 200, serverResponse: { userState: state.user } });
|
|
47017
|
+
await serveIndex({ state, publicdir, status: 200, serverResponse: { userState: state.user, tw5Version: state.pluginCache.tw5Docs.version } });
|
|
47005
47018
|
}) : void 0
|
|
47006
47019
|
});
|
|
47007
47020
|
}, "sendProdServer");
|
|
@@ -47250,217 +47263,7 @@ var config2 = {
|
|
|
47250
47263
|
"clientVersion": "7.8.0",
|
|
47251
47264
|
"engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a",
|
|
47252
47265
|
"activeProvider": "sqlite",
|
|
47253
|
-
"inlineSchema":
|
|
47254
|
-
provider = "sqlite"
|
|
47255
|
-
}
|
|
47256
|
-
|
|
47257
|
-
generator client {
|
|
47258
|
-
provider = "prisma-client"
|
|
47259
|
-
output = "client"
|
|
47260
|
-
previewFeatures = ["partialIndexes"]
|
|
47261
|
-
}
|
|
47262
|
-
|
|
47263
|
-
generator json {
|
|
47264
|
-
provider = "prisma-json-types-generator"
|
|
47265
|
-
namespace = "PrismaJson"
|
|
47266
|
-
}
|
|
47267
|
-
|
|
47268
|
-
// ---------------------------------------------------------------------------
|
|
47269
|
-
// Tiddler storage
|
|
47270
|
-
// ---------------------------------------------------------------------------
|
|
47271
|
-
|
|
47272
|
-
model Bag {
|
|
47273
|
-
id String @id @default(uuid(7))
|
|
47274
|
-
name String @unique
|
|
47275
|
-
created DateTime @default(now())
|
|
47276
|
-
updated DateTime @updatedAt
|
|
47277
|
-
description String
|
|
47278
|
-
permissions BagPermission[]
|
|
47279
|
-
tiddlers Tiddler[]
|
|
47280
|
-
recipe_bags RecipeBag[]
|
|
47281
|
-
tiddler_events TiddlerEvent[]
|
|
47282
|
-
|
|
47283
|
-
@@map("bag")
|
|
47284
|
-
}
|
|
47285
|
-
|
|
47286
|
-
// role_id references the auth module's roles table; no FK declared here \u2014
|
|
47287
|
-
// permission and auth tables are owned by separate modules.
|
|
47288
|
-
model BagPermission {
|
|
47289
|
-
bag_id String
|
|
47290
|
-
role_id String
|
|
47291
|
-
level BagPermissionLevel
|
|
47292
|
-
bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)
|
|
47293
|
-
|
|
47294
|
-
@@id([bag_id, role_id])
|
|
47295
|
-
@@map("bag_permission")
|
|
47296
|
-
}
|
|
47297
|
-
|
|
47298
|
-
model Tiddler {
|
|
47299
|
-
bag_id String
|
|
47300
|
-
title String
|
|
47301
|
-
created DateTime @default(now())
|
|
47302
|
-
updated DateTime @updatedAt
|
|
47303
|
-
revision BigInt @default(0)
|
|
47304
|
-
// partition_key String @default("")
|
|
47305
|
-
/// [Tiddler_fields]
|
|
47306
|
-
fields Json
|
|
47307
|
-
bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)
|
|
47308
|
-
|
|
47309
|
-
@@id([bag_id, title])
|
|
47310
|
-
@@index([title])
|
|
47311
|
-
@@map("tiddler")
|
|
47312
|
-
}
|
|
47313
|
-
|
|
47314
|
-
model TiddlerEvent {
|
|
47315
|
-
seq Int @id @default(autoincrement())
|
|
47316
|
-
bag_id String
|
|
47317
|
-
title String
|
|
47318
|
-
type TiddlerEventType
|
|
47319
|
-
|
|
47320
|
-
bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)
|
|
47321
|
-
|
|
47322
|
-
@@index([bag_id, seq])
|
|
47323
|
-
@@map("tiddler_event")
|
|
47324
|
-
}
|
|
47325
|
-
|
|
47326
|
-
enum TiddlerEventType {
|
|
47327
|
-
save
|
|
47328
|
-
delete
|
|
47329
|
-
}
|
|
47330
|
-
|
|
47331
|
-
model Template {
|
|
47332
|
-
id String @id @default(uuid(7))
|
|
47333
|
-
name String @unique
|
|
47334
|
-
created DateTime @default(now())
|
|
47335
|
-
updated DateTime @updatedAt
|
|
47336
|
-
/// [Template_type]
|
|
47337
|
-
type String
|
|
47338
|
-
/// [Template_definition]
|
|
47339
|
-
definition Json
|
|
47340
|
-
recipes Recipe[]
|
|
47341
|
-
permissions TemplatePermission[]
|
|
47342
|
-
|
|
47343
|
-
@@map("template")
|
|
47344
|
-
}
|
|
47345
|
-
|
|
47346
|
-
model TemplatePermission {
|
|
47347
|
-
template_id String
|
|
47348
|
-
role_id String
|
|
47349
|
-
level TemplatePermissionLevel
|
|
47350
|
-
template Template @relation(fields: [template_id], references: [id], onDelete: Cascade)
|
|
47351
|
-
|
|
47352
|
-
@@id([template_id, role_id])
|
|
47353
|
-
@@map("template_permission")
|
|
47354
|
-
}
|
|
47355
|
-
|
|
47356
|
-
model Recipe {
|
|
47357
|
-
id String @id @default(uuid(7))
|
|
47358
|
-
slug String @unique
|
|
47359
|
-
created DateTime @default(now())
|
|
47360
|
-
updated DateTime @updatedAt
|
|
47361
|
-
template_id String
|
|
47362
|
-
/// [Recipe_definition]
|
|
47363
|
-
definition Json
|
|
47364
|
-
template Template @relation(fields: [template_id], references: [id], onDelete: Restrict)
|
|
47365
|
-
recipe_bags RecipeBag[]
|
|
47366
|
-
permissions RecipePermission[]
|
|
47367
|
-
/// [Recipe_plugins]
|
|
47368
|
-
plugins Json
|
|
47369
|
-
compiledAt DateTime
|
|
47370
|
-
|
|
47371
|
-
@@map("recipe")
|
|
47372
|
-
}
|
|
47373
|
-
|
|
47374
|
-
model RecipePermission {
|
|
47375
|
-
recipe_id String
|
|
47376
|
-
role_id String
|
|
47377
|
-
level RecipePermissionLevel
|
|
47378
|
-
recipe Recipe @relation(fields: [recipe_id], references: [id], onDelete: Cascade)
|
|
47379
|
-
|
|
47380
|
-
@@id([recipe_id, role_id])
|
|
47381
|
-
@@map("recipe_permission")
|
|
47382
|
-
}
|
|
47383
|
-
|
|
47384
|
-
model RecipeBag {
|
|
47385
|
-
recipe_id String
|
|
47386
|
-
bag_id String
|
|
47387
|
-
priority Int
|
|
47388
|
-
is_writable Boolean
|
|
47389
|
-
prefix String
|
|
47390
|
-
recipe Recipe @relation(fields: [recipe_id], references: [id], onDelete: Cascade)
|
|
47391
|
-
bag Bag @relation(fields: [bag_id], references: [id], onDelete: Restrict)
|
|
47392
|
-
|
|
47393
|
-
@@id([recipe_id, bag_id, prefix])
|
|
47394
|
-
@@map("recipe_bag")
|
|
47395
|
-
}
|
|
47396
|
-
|
|
47397
|
-
model Settings {
|
|
47398
|
-
key String @id
|
|
47399
|
-
value String
|
|
47400
|
-
updated DateTime @updatedAt
|
|
47401
|
-
|
|
47402
|
-
@@map("settings")
|
|
47403
|
-
}
|
|
47404
|
-
|
|
47405
|
-
// ---------------------------------------------------------------------------
|
|
47406
|
-
// Auth \u2014 managed by the auth module, separate from tiddler storage.
|
|
47407
|
-
// No FK references cross from auth into tiddler/recipe/bag tables.
|
|
47408
|
-
// ---------------------------------------------------------------------------
|
|
47409
|
-
|
|
47410
|
-
model Roles {
|
|
47411
|
-
role_id String @id @default(uuid(7))
|
|
47412
|
-
role_name String @unique()
|
|
47413
|
-
description String?
|
|
47414
|
-
users Users[]
|
|
47415
|
-
|
|
47416
|
-
@@map("roles")
|
|
47417
|
-
}
|
|
47418
|
-
|
|
47419
|
-
model Users {
|
|
47420
|
-
user_id String @id @default(uuid(7))
|
|
47421
|
-
username String @unique
|
|
47422
|
-
email String @unique
|
|
47423
|
-
password String
|
|
47424
|
-
resetCode String? @unique(where: { resetCode: { not: null } })
|
|
47425
|
-
created_at DateTime @default(now())
|
|
47426
|
-
last_login DateTime?
|
|
47427
|
-
sessions Sessions[]
|
|
47428
|
-
roles Roles[]
|
|
47429
|
-
|
|
47430
|
-
@@map("users")
|
|
47431
|
-
}
|
|
47432
|
-
|
|
47433
|
-
model Sessions {
|
|
47434
|
-
session_id String @id
|
|
47435
|
-
created_at DateTime @default(now())
|
|
47436
|
-
last_accessed DateTime
|
|
47437
|
-
session_key String?
|
|
47438
|
-
user_id String
|
|
47439
|
-
user Users @relation(fields: [user_id], references: [user_id], onDelete: NoAction, onUpdate: NoAction)
|
|
47440
|
-
|
|
47441
|
-
@@map("sessions")
|
|
47442
|
-
}
|
|
47443
|
-
|
|
47444
|
-
// ---------------------------------------------------------------------------
|
|
47445
|
-
// Enums
|
|
47446
|
-
// ---------------------------------------------------------------------------
|
|
47447
|
-
|
|
47448
|
-
enum BagPermissionLevel {
|
|
47449
|
-
A_read
|
|
47450
|
-
B_write
|
|
47451
|
-
C_admin
|
|
47452
|
-
}
|
|
47453
|
-
|
|
47454
|
-
enum RecipePermissionLevel {
|
|
47455
|
-
A_read
|
|
47456
|
-
B_write
|
|
47457
|
-
}
|
|
47458
|
-
|
|
47459
|
-
enum TemplatePermissionLevel {
|
|
47460
|
-
A_read
|
|
47461
|
-
B_write
|
|
47462
|
-
}
|
|
47463
|
-
`,
|
|
47266
|
+
"inlineSchema": 'datasource db {\n provider = "sqlite"\n}\n\ngenerator client {\n provider = "prisma-client"\n output = "client"\n previewFeatures = ["partialIndexes"]\n}\n\ngenerator json {\n provider = "prisma-json-types-generator"\n namespace = "PrismaJson"\n}\n\n// ---------------------------------------------------------------------------\n// Tiddler storage\n// ---------------------------------------------------------------------------\n\nmodel Bag {\n id String @id @default(uuid(7))\n name String @unique\n created DateTime @default(now())\n updated DateTime @updatedAt\n description String\n permissions BagPermission[]\n tiddlers Tiddler[]\n recipe_bags RecipeBag[]\n tiddler_events TiddlerEvent[]\n\n @@map("bag")\n}\n\n// role_id references the auth module\'s roles table; no FK declared here \u2014\n// permission and auth tables are owned by separate modules.\nmodel BagPermission {\n bag_id String\n role_id String\n level BagPermissionLevel\n bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)\n\n @@id([bag_id, role_id])\n @@map("bag_permission")\n}\n\nmodel Tiddler {\n bag_id String\n title String\n created DateTime @default(now())\n updated DateTime @updatedAt\n revision BigInt @default(0)\n // partition_key String @default("")\n /// [Tiddler_fields]\n fields Json\n bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)\n\n @@id([bag_id, title])\n @@index([title])\n @@map("tiddler")\n}\n\nmodel TiddlerEvent {\n seq Int @id @default(autoincrement())\n bag_id String\n title String\n type TiddlerEventType\n\n bag Bag @relation(fields: [bag_id], references: [id], onDelete: Cascade)\n\n @@index([bag_id, seq])\n @@map("tiddler_event")\n}\n\nenum TiddlerEventType {\n save\n delete\n}\n\nmodel Template {\n id String @id @default(uuid(7))\n name String @unique\n created DateTime @default(now())\n updated DateTime @updatedAt\n /// [Template_type]\n type String\n /// [Template_definition]\n definition Json\n recipes Recipe[]\n permissions TemplatePermission[]\n\n @@map("template")\n}\n\nmodel TemplatePermission {\n template_id String\n role_id String\n level TemplatePermissionLevel\n template Template @relation(fields: [template_id], references: [id], onDelete: Cascade)\n\n @@id([template_id, role_id])\n @@map("template_permission")\n}\n\nmodel Recipe {\n id String @id @default(uuid(7))\n slug String @unique\n created DateTime @default(now())\n updated DateTime @updatedAt\n template_id String\n /// [Recipe_definition]\n definition Json\n template Template @relation(fields: [template_id], references: [id], onDelete: Restrict)\n recipe_bags RecipeBag[]\n permissions RecipePermission[]\n /// [Recipe_plugins]\n plugins Json\n compiledAt DateTime\n\n @@map("recipe")\n}\n\nmodel RecipePermission {\n recipe_id String\n role_id String\n level RecipePermissionLevel\n recipe Recipe @relation(fields: [recipe_id], references: [id], onDelete: Cascade)\n\n @@id([recipe_id, role_id])\n @@map("recipe_permission")\n}\n\nmodel RecipeBag {\n recipe_id String\n bag_id String\n priority Int\n is_writable Boolean\n prefix String\n recipe Recipe @relation(fields: [recipe_id], references: [id], onDelete: Cascade)\n bag Bag @relation(fields: [bag_id], references: [id], onDelete: Restrict)\n\n @@id([recipe_id, bag_id, is_writable, prefix])\n @@map("recipe_bag")\n}\n\nmodel Settings {\n key String @id\n value String\n updated DateTime @updatedAt\n\n @@map("settings")\n}\n\n// ---------------------------------------------------------------------------\n// Auth \u2014 managed by the auth module, separate from tiddler storage.\n// No FK references cross from auth into tiddler/recipe/bag tables.\n// ---------------------------------------------------------------------------\n\nmodel Roles {\n role_id String @id @default(uuid(7))\n role_name String @unique()\n description String?\n users Users[]\n\n @@map("roles")\n}\n\nmodel Users {\n user_id String @id @default(uuid(7))\n username String @unique\n email String @unique\n password String\n\n // MySQL: multiple NULLs are allowed in unique columns and there is no way to make a partial index.\n // SQL Server: the `where` clause is required to get the "multiple NULLs allowed" behavior.\n // Everything else: multiple nulls are allowed in unique columns and partial indexes also work\n resetCode String? @unique(where: { resetCode: { not: null } })\n created_at DateTime @default(now())\n last_login DateTime?\n sessions Sessions[]\n roles Roles[]\n\n @@map("users")\n}\n\nmodel Sessions {\n session_id String @id\n created_at DateTime @default(now())\n last_accessed DateTime\n session_key String?\n user_id String\n user Users @relation(fields: [user_id], references: [user_id], onDelete: NoAction, onUpdate: NoAction)\n\n @@map("sessions")\n}\n\n// ---------------------------------------------------------------------------\n// Enums\n// ---------------------------------------------------------------------------\n\nenum BagPermissionLevel {\n A_read\n B_write\n C_admin\n}\n\nenum RecipePermissionLevel {\n A_read\n B_write\n}\n\nenum TemplatePermissionLevel {\n A_read\n B_write\n}\n',
|
|
47464
47267
|
"runtimeDataModel": {
|
|
47465
47268
|
"models": {},
|
|
47466
47269
|
"enums": {},
|
|
@@ -47473,8 +47276,8 @@ enum TemplatePermissionLevel {
|
|
|
47473
47276
|
};
|
|
47474
47277
|
config2.runtimeDataModel = JSON.parse('{"models":{"Bag":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"name","kind":"scalar","type":"String"},{"name":"created","kind":"scalar","type":"DateTime"},{"name":"updated","kind":"scalar","type":"DateTime"},{"name":"description","kind":"scalar","type":"String"},{"name":"permissions","kind":"object","type":"BagPermission","relationName":"BagToBagPermission"},{"name":"tiddlers","kind":"object","type":"Tiddler","relationName":"BagToTiddler"},{"name":"recipe_bags","kind":"object","type":"RecipeBag","relationName":"BagToRecipeBag"},{"name":"tiddler_events","kind":"object","type":"TiddlerEvent","relationName":"BagToTiddlerEvent"}],"dbName":"bag"},"BagPermission":{"fields":[{"name":"bag_id","kind":"scalar","type":"String"},{"name":"role_id","kind":"scalar","type":"String"},{"name":"level","kind":"enum","type":"BagPermissionLevel"},{"name":"bag","kind":"object","type":"Bag","relationName":"BagToBagPermission"}],"dbName":"bag_permission"},"Tiddler":{"fields":[{"name":"bag_id","kind":"scalar","type":"String"},{"name":"title","kind":"scalar","type":"String"},{"name":"created","kind":"scalar","type":"DateTime"},{"name":"updated","kind":"scalar","type":"DateTime"},{"name":"revision","kind":"scalar","type":"BigInt"},{"name":"fields","kind":"scalar","type":"Json"},{"name":"bag","kind":"object","type":"Bag","relationName":"BagToTiddler"}],"dbName":"tiddler"},"TiddlerEvent":{"fields":[{"name":"seq","kind":"scalar","type":"Int"},{"name":"bag_id","kind":"scalar","type":"String"},{"name":"title","kind":"scalar","type":"String"},{"name":"type","kind":"enum","type":"TiddlerEventType"},{"name":"bag","kind":"object","type":"Bag","relationName":"BagToTiddlerEvent"}],"dbName":"tiddler_event"},"Template":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"name","kind":"scalar","type":"String"},{"name":"created","kind":"scalar","type":"DateTime"},{"name":"updated","kind":"scalar","type":"DateTime"},{"name":"type","kind":"scalar","type":"String"},{"name":"definition","kind":"scalar","type":"Json"},{"name":"recipes","kind":"object","type":"Recipe","relationName":"RecipeToTemplate"},{"name":"permissions","kind":"object","type":"TemplatePermission","relationName":"TemplateToTemplatePermission"}],"dbName":"template"},"TemplatePermission":{"fields":[{"name":"template_id","kind":"scalar","type":"String"},{"name":"role_id","kind":"scalar","type":"String"},{"name":"level","kind":"enum","type":"TemplatePermissionLevel"},{"name":"template","kind":"object","type":"Template","relationName":"TemplateToTemplatePermission"}],"dbName":"template_permission"},"Recipe":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"slug","kind":"scalar","type":"String"},{"name":"created","kind":"scalar","type":"DateTime"},{"name":"updated","kind":"scalar","type":"DateTime"},{"name":"template_id","kind":"scalar","type":"String"},{"name":"definition","kind":"scalar","type":"Json"},{"name":"template","kind":"object","type":"Template","relationName":"RecipeToTemplate"},{"name":"recipe_bags","kind":"object","type":"RecipeBag","relationName":"RecipeToRecipeBag"},{"name":"permissions","kind":"object","type":"RecipePermission","relationName":"RecipeToRecipePermission"},{"name":"plugins","kind":"scalar","type":"Json"},{"name":"compiledAt","kind":"scalar","type":"DateTime"}],"dbName":"recipe"},"RecipePermission":{"fields":[{"name":"recipe_id","kind":"scalar","type":"String"},{"name":"role_id","kind":"scalar","type":"String"},{"name":"level","kind":"enum","type":"RecipePermissionLevel"},{"name":"recipe","kind":"object","type":"Recipe","relationName":"RecipeToRecipePermission"}],"dbName":"recipe_permission"},"RecipeBag":{"fields":[{"name":"recipe_id","kind":"scalar","type":"String"},{"name":"bag_id","kind":"scalar","type":"String"},{"name":"priority","kind":"scalar","type":"Int"},{"name":"is_writable","kind":"scalar","type":"Boolean"},{"name":"prefix","kind":"scalar","type":"String"},{"name":"recipe","kind":"object","type":"Recipe","relationName":"RecipeToRecipeBag"},{"name":"bag","kind":"object","type":"Bag","relationName":"BagToRecipeBag"}],"dbName":"recipe_bag"},"Settings":{"fields":[{"name":"key","kind":"scalar","type":"String"},{"name":"value","kind":"scalar","type":"String"},{"name":"updated","kind":"scalar","type":"DateTime"}],"dbName":"settings"},"Roles":{"fields":[{"name":"role_id","kind":"scalar","type":"String"},{"name":"role_name","kind":"scalar","type":"String"},{"name":"description","kind":"scalar","type":"String"},{"name":"users","kind":"object","type":"Users","relationName":"RolesToUsers"}],"dbName":"roles"},"Users":{"fields":[{"name":"user_id","kind":"scalar","type":"String"},{"name":"username","kind":"scalar","type":"String"},{"name":"email","kind":"scalar","type":"String"},{"name":"password","kind":"scalar","type":"String"},{"name":"resetCode","kind":"scalar","type":"String"},{"name":"created_at","kind":"scalar","type":"DateTime"},{"name":"last_login","kind":"scalar","type":"DateTime"},{"name":"sessions","kind":"object","type":"Sessions","relationName":"SessionsToUsers"},{"name":"roles","kind":"object","type":"Roles","relationName":"RolesToUsers"}],"dbName":"users"},"Sessions":{"fields":[{"name":"session_id","kind":"scalar","type":"String"},{"name":"created_at","kind":"scalar","type":"DateTime"},{"name":"last_accessed","kind":"scalar","type":"DateTime"},{"name":"session_key","kind":"scalar","type":"String"},{"name":"user_id","kind":"scalar","type":"String"},{"name":"user","kind":"object","type":"Users","relationName":"SessionsToUsers"}],"dbName":"sessions"}},"enums":{},"types":{}}');
|
|
47475
47278
|
config2.parameterizationSchema = {
|
|
47476
|
-
strings: JSON.parse('["where","orderBy","cursor","bag","permissions","tiddlers","recipes","template","_count","recipe_bags","recipe","tiddler_events","Bag.findUnique","Bag.findUniqueOrThrow","Bag.findFirst","Bag.findFirstOrThrow","Bag.findMany","data","Bag.createOne","Bag.createMany","Bag.createManyAndReturn","Bag.updateOne","Bag.updateMany","Bag.updateManyAndReturn","create","update","Bag.upsertOne","Bag.deleteOne","Bag.deleteMany","having","_min","_max","Bag.groupBy","Bag.aggregate","BagPermission.findUnique","BagPermission.findUniqueOrThrow","BagPermission.findFirst","BagPermission.findFirstOrThrow","BagPermission.findMany","BagPermission.createOne","BagPermission.createMany","BagPermission.createManyAndReturn","BagPermission.updateOne","BagPermission.updateMany","BagPermission.updateManyAndReturn","BagPermission.upsertOne","BagPermission.deleteOne","BagPermission.deleteMany","BagPermission.groupBy","BagPermission.aggregate","Tiddler.findUnique","Tiddler.findUniqueOrThrow","Tiddler.findFirst","Tiddler.findFirstOrThrow","Tiddler.findMany","Tiddler.createOne","Tiddler.createMany","Tiddler.createManyAndReturn","Tiddler.updateOne","Tiddler.updateMany","Tiddler.updateManyAndReturn","Tiddler.upsertOne","Tiddler.deleteOne","Tiddler.deleteMany","_avg","_sum","Tiddler.groupBy","Tiddler.aggregate","TiddlerEvent.findUnique","TiddlerEvent.findUniqueOrThrow","TiddlerEvent.findFirst","TiddlerEvent.findFirstOrThrow","TiddlerEvent.findMany","TiddlerEvent.createOne","TiddlerEvent.createMany","TiddlerEvent.createManyAndReturn","TiddlerEvent.updateOne","TiddlerEvent.updateMany","TiddlerEvent.updateManyAndReturn","TiddlerEvent.upsertOne","TiddlerEvent.deleteOne","TiddlerEvent.deleteMany","TiddlerEvent.groupBy","TiddlerEvent.aggregate","Template.findUnique","Template.findUniqueOrThrow","Template.findFirst","Template.findFirstOrThrow","Template.findMany","Template.createOne","Template.createMany","Template.createManyAndReturn","Template.updateOne","Template.updateMany","Template.updateManyAndReturn","Template.upsertOne","Template.deleteOne","Template.deleteMany","Template.groupBy","Template.aggregate","TemplatePermission.findUnique","TemplatePermission.findUniqueOrThrow","TemplatePermission.findFirst","TemplatePermission.findFirstOrThrow","TemplatePermission.findMany","TemplatePermission.createOne","TemplatePermission.createMany","TemplatePermission.createManyAndReturn","TemplatePermission.updateOne","TemplatePermission.updateMany","TemplatePermission.updateManyAndReturn","TemplatePermission.upsertOne","TemplatePermission.deleteOne","TemplatePermission.deleteMany","TemplatePermission.groupBy","TemplatePermission.aggregate","Recipe.findUnique","Recipe.findUniqueOrThrow","Recipe.findFirst","Recipe.findFirstOrThrow","Recipe.findMany","Recipe.createOne","Recipe.createMany","Recipe.createManyAndReturn","Recipe.updateOne","Recipe.updateMany","Recipe.updateManyAndReturn","Recipe.upsertOne","Recipe.deleteOne","Recipe.deleteMany","Recipe.groupBy","Recipe.aggregate","RecipePermission.findUnique","RecipePermission.findUniqueOrThrow","RecipePermission.findFirst","RecipePermission.findFirstOrThrow","RecipePermission.findMany","RecipePermission.createOne","RecipePermission.createMany","RecipePermission.createManyAndReturn","RecipePermission.updateOne","RecipePermission.updateMany","RecipePermission.updateManyAndReturn","RecipePermission.upsertOne","RecipePermission.deleteOne","RecipePermission.deleteMany","RecipePermission.groupBy","RecipePermission.aggregate","RecipeBag.findUnique","RecipeBag.findUniqueOrThrow","RecipeBag.findFirst","RecipeBag.findFirstOrThrow","RecipeBag.findMany","RecipeBag.createOne","RecipeBag.createMany","RecipeBag.createManyAndReturn","RecipeBag.updateOne","RecipeBag.updateMany","RecipeBag.updateManyAndReturn","RecipeBag.upsertOne","RecipeBag.deleteOne","RecipeBag.deleteMany","RecipeBag.groupBy","RecipeBag.aggregate","Settings.findUnique","Settings.findUniqueOrThrow","Settings.findFirst","Settings.findFirstOrThrow","Settings.findMany","Settings.createOne","Settings.createMany","Settings.createManyAndReturn","Settings.updateOne","Settings.updateMany","Settings.updateManyAndReturn","Settings.upsertOne","Settings.deleteOne","Settings.deleteMany","Settings.groupBy","Settings.aggregate","user","sessions","roles","users","Roles.findUnique","Roles.findUniqueOrThrow","Roles.findFirst","Roles.findFirstOrThrow","Roles.findMany","Roles.createOne","Roles.createMany","Roles.createManyAndReturn","Roles.updateOne","Roles.updateMany","Roles.updateManyAndReturn","Roles.upsertOne","Roles.deleteOne","Roles.deleteMany","Roles.groupBy","Roles.aggregate","Users.findUnique","Users.findUniqueOrThrow","Users.findFirst","Users.findFirstOrThrow","Users.findMany","Users.createOne","Users.createMany","Users.createManyAndReturn","Users.updateOne","Users.updateMany","Users.updateManyAndReturn","Users.upsertOne","Users.deleteOne","Users.deleteMany","Users.groupBy","Users.aggregate","Sessions.findUnique","Sessions.findUniqueOrThrow","Sessions.findFirst","Sessions.findFirstOrThrow","Sessions.findMany","Sessions.createOne","Sessions.createMany","Sessions.createManyAndReturn","Sessions.updateOne","Sessions.updateMany","Sessions.updateManyAndReturn","Sessions.upsertOne","Sessions.deleteOne","Sessions.deleteMany","Sessions.groupBy","Sessions.aggregate","AND","OR","NOT","session_id","created_at","last_accessed","session_key","user_id","equals","in","notIn","lt","lte","gt","gte","contains","startsWith","endsWith","not","username","email","password","resetCode","last_login","role_id","role_name","description","every","some","none","key","value","updated","recipe_id","bag_id","priority","is_writable","prefix","RecipePermissionLevel","level","id","slug","created","template_id","definition","plugins","compiledAt","string_contains","string_starts_with","string_ends_with","array_starts_with","array_ends_with","TemplatePermissionLevel","name","type","seq","title","TiddlerEventType","revision","fields","BagPermissionLevel","recipe_id_role_id","template_id_role_id","
|
|
47477
|
-
graph: "3QV00AEMBAAAnwMAIAUAAKADACAJAAChAwAgCwAAogMAIOgBAACeAwAw6QEAACkAEOoBAACeAwAwggIBAO4CACGIAkAA8gIAIZACAQAAAAGSAkAA8gIAIZ0CAQAAAAEBAAAAAQAgBwMAAKUDACDoAQAAuAMAMOkBAAADABDqAQAAuAMAMIACAQDuAgAhigIBAO4CACGPAgAAuQOlAiIBAwAApAUAIAgDAAClAwAg6AEAALgDADDpAQAAAwAQ6gEAALgDADCAAgEA7gIAIYoCAQDuAgAhjwIAALkDpQIiqQIAALcDACADAAAAAwAgAQAABAAwAgAABQAgCgMAAKUDACDoAQAAtQMAMOkBAAAHABDqAQAAtQMAMIgCQADyAgAhigIBAO4CACGSAkAA8gIAIaACAQDuAgAhogIEALYDACGjAgAAjgMAIAEDAACkBQAgCwMAAKUDACDoAQAAtQMAMOkBAAAHABDqAQAAtQMAMIgCQADyAgAhigIBAO4CACGSAkAA8gIAIaACAQDuAgAhogIEALYDACGjAgAAjgMAIKgCAAC0AwAgAwAAAAcAIAEAAAgAMAIAAAkAIAoDAAClAwAgCgAAqgMAIOgBAACyAwAw6QEAAAsAEOoBAACyAwAwiQIBAO4CACGKAgEA7gIAIYsCAgCmAwAhjAIgALMDACGNAgEA7gIAIQIDAACkBQAgCgAApQUAIAsDAAClAwAgCgAAqgMAIOgBAACyAwAw6QEAAAsAEOoBAACyAwAwiQIBAO4CACGKAgEA7gIAIYsCAgCmAwAhjAIgALMDACGNAgEA7gIAIacCAACxAwAgAwAAAAsAIAEAAAwAMAIAAA0AIA4EAACwAwAgBwAArgMAIAkAAKEDACDoAQAArwMAMOkBAAAPABDqAQAArwMAMIgCQADyAgAhkAIBAO4CACGRAgEA7gIAIZICQADyAgAhkwIBAO4CACGUAgAAjgMAIJUCAACOAwAglgJAAPICACEDBAAApwUAIAcAAKYFACAJAACiBQAgDgQAALADACAHAACuAwAgCQAAoQMAIOgBAACvAwAw6QEAAA8AEOoBAACvAwAwiAJAAPICACGQAgEAAAABkQIBAAAAAZICQADyAgAhkwIBAO4CACGUAgAAjgMAIJUCAACOAwAglgJAAPICACEDAAAADwAgAQAAEAAwAgAAEQAgBwcAAK4DACDoAQAArAMAMOkBAAATABDqAQAArAMAMIACAQDuAgAhjwIAAK0DnQIikwIBAO4CACEBBwAApgUAIAgHAACuAwAg6AEAAKwDADDpAQAAEwAQ6gEAAKwDADCAAgEA7gIAIY8CAACtA50CIpMCAQDuAgAhpgIAAKsDACADAAAAEwAgAQAAFAAwAgAAFQAgAQAAAA8AIAEAAAATACADAAAACwAgAQAADAAwAgAADQAgBwoAAKoDACDoAQAAqAMAMOkBAAAaABDqAQAAqAMAMIACAQDuAgAhiQIBAO4CACGPAgAAqQOPAiIBCgAApQUAIAgKAACqAwAg6AEAAKgDADDpAQAAGgAQ6gEAAKgDADCAAgEA7gIAIYkCAQDuAgAhjwIAAKkDjwIipQIAAKcDACADAAAAGgAgAQAAGwAwAgAAHAAgAQAAAAsAIAEAAAAaACAIAwAApQMAIOgBAACjAwAw6QEAACAAEOoBAACjAwAwigIBAO4CACGeAgAApAOiAiKfAgIApgMAIaACAQDuAgAhAQMAAKQFACAIAwAApQMAIOgBAACjAwAw6QEAACAAEOoBAACjAwAwigIBAO4CACGeAgAApAOiAiKfAgIAAAABoAIBAO4CACEDAAAAIAAgAQAAIQAwAgAAIgAgAQAAAAMAIAEAAAAHACABAAAACwAgAQAAACAAIAEAAAABACAMBAAAnwMAIAUAAKADACAJAAChAwAgCwAAogMAIOgBAACeAwAw6QEAACkAEOoBAACeAwAwggIBAO4CACGIAkAA8gIAIZACAQDuAgAhkgJAAPICACGdAgEA7gIAIQQEAACgBQAgBQAAoQUAIAkAAKIFACALAACjBQAgAwAAACkAIAEAACoAMAIAAAEAIAMAAAApACABAAAqADACAAABACADAAAAKQAgAQAAKgAwAgAAAQAgCQQAAJwFACAFAACdBQAgCQAAngUAIAsAAJ8FACCCAgEAAAABiAJAAAAAAZACAQAAAAGSAkAAAAABnQIBAAAAAQERAAAuACAFggIBAAAAAYgCQAAAAAGQAgEAAAABkgJAAAAAAZ0CAQAAAAEBEQAAMAAwAREAADAAMAkEAADrBAAgBQAA7AQAIAkAAO0EACALAADuBAAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQIAAAABACARAAAzACAFggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQIAAAApACARAAA1ACACAAAAKQAgEQAANQAgAwAAAAEAIBgAAC4AIBkAADMAIAEAAAABACABAAAAKQAgAwgAAOgEACAeAADqBAAgHwAA6QQAIAjoAQAAnQMAMOkBAAA8ABDqAQAAnQMAMIICAQDdAgAhiAJAAN4CACGQAgEA3QIAIZICQADeAgAhnQIBAN0CACEDAAAAKQAgAQAAOwAwHQAAPAAgAwAAACkAIAEAACoAMAIAAAEAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgBAMAAOcEACCAAgEAAAABigIBAAAAAY8CAAAApQICAREAAEQAIAOAAgEAAAABigIBAAAAAY8CAAAApQICAREAAEYAMAERAABGADAEAwAA5gQAIIACAQC-AwAhigIBAL4DACGPAgAA5QSlAiICAAAABQAgEQAASQAgA4ACAQC-AwAhigIBAL4DACGPAgAA5QSlAiICAAAAAwAgEQAASwAgAgAAAAMAIBEAAEsAIAMAAAAFACAYAABEACAZAABJACABAAAABQAgAQAAAAMAIAMIAADiBAAgHgAA5AQAIB8AAOMEACAG6AEAAJkDADDpAQAAUgAQ6gEAAJkDADCAAgEA3QIAIYoCAQDdAgAhjwIAAJoDpQIiAwAAAAMAIAEAAFEAMB0AAFIAIAMAAAADACABAAAEADACAAAFACABAAAACQAgAQAAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAcDAADhBAAgiAJAAAAAAYoCAQAAAAGSAkAAAAABoAIBAAAAAaICBAAAAAGjAoAAAAABAREAAFoAIAaIAkAAAAABigIBAAAAAZICQAAAAAGgAgEAAAABogIEAAAAAaMCgAAAAAEBEQAAXAAwAREAAFwAMAcDAADgBAAgiAJAAL8DACGKAgEAvgMAIZICQAC_AwAhoAIBAL4DACGiAgQA3wQAIaMCgAAAAAECAAAACQAgEQAAXwAgBogCQAC_AwAhigIBAL4DACGSAkAAvwMAIaACAQC-AwAhogIEAN8EACGjAoAAAAABAgAAAAcAIBEAAGEAIAIAAAAHACARAABhACADAAAACQAgGAAAWgAgGQAAXwAgAQAAAAkAIAEAAAAHACAFCAAA2gQAIB4AAN0EACAfAADcBAAgQAAA2wQAIEEAAN4EACAJ6AEAAJUDADDpAQAAaAAQ6gEAAJUDADCIAkAA3gIAIYoCAQDdAgAhkgJAAN4CACGgAgEA3QIAIaICBACWAwAhowIAAIYDACADAAAABwAgAQAAZwAwHQAAaAAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAAiACABAAAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgBQMAANkEACCKAgEAAAABngIAAACiAgKfAgIAAAABoAIBAAAAAQERAABwACAEigIBAAAAAZ4CAAAAogICnwICAAAAAaACAQAAAAEBEQAAcgAwAREAAHIAMAUDAADYBAAgigIBAL4DACGeAgAA1wSiAiKfAgIA_gMAIaACAQC-AwAhAgAAACIAIBEAAHUAIASKAgEAvgMAIZ4CAADXBKICIp8CAgD-AwAhoAIBAL4DACECAAAAIAAgEQAAdwAgAgAAACAAIBEAAHcAIAMAAAAiACAYAABwACAZAAB1ACABAAAAIgAgAQAAACAAIAUIAADSBAAgHgAA1QQAIB8AANQEACBAAADTBAAgQQAA1gQAIAfoAQAAkQMAMOkBAAB-ABDqAQAAkQMAMIoCAQDdAgAhngIAAJIDogIinwICAPsCACGgAgEA3QIAIQMAAAAgACABAAB9ADAdAAB-ACADAAAAIAAgAQAAIQAwAgAAIgAgCwQAAJADACAGAACPAwAg6AEAAI0DADDpAQAAhAEAEOoBAACNAwAwiAJAAPICACGQAgEAAAABkgJAAPICACGUAgAAjgMAIJ0CAQAAAAGeAgEA7gIAIQEAAACBAQAgAQAAAIEBACALBAAAkAMAIAYAAI8DACDoAQAAjQMAMOkBAACEAQAQ6gEAAI0DADCIAkAA8gIAIZACAQDuAgAhkgJAAPICACGUAgAAjgMAIJ0CAQDuAgAhngIBAO4CACECBAAA0QQAIAYAANAEACADAAAAhAEAIAEAAIUBADACAACBAQAgAwAAAIQBACABAACFAQAwAgAAgQEAIAMAAACEAQAgAQAAhQEAMAIAAIEBACAIBAAAzwQAIAYAAM4EACCIAkAAAAABkAIBAAAAAZICQAAAAAGUAoAAAAABnQIBAAAAAZ4CAQAAAAEBEQAAiQEAIAaIAkAAAAABkAIBAAAAAZICQAAAAAGUAoAAAAABnQIBAAAAAZ4CAQAAAAEBEQAAiwEAMAERAACLAQAwCAQAALUEACAGAAC0BAAgiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACECAAAAgQEAIBEAAI4BACAGiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACECAAAAhAEAIBEAAJABACACAAAAhAEAIBEAAJABACADAAAAgQEAIBgAAIkBACAZAACOAQAgAQAAAIEBACABAAAAhAEAIAMIAACxBAAgHgAAswQAIB8AALIEACAJ6AEAAIwDADDpAQAAlwEAEOoBAACMAwAwiAJAAN4CACGQAgEA3QIAIZICQADeAgAhlAIAAIYDACCdAgEA3QIAIZ4CAQDdAgAhAwAAAIQBACABAACWAQAwHQAAlwEAIAMAAACEAQAgAQAAhQEAMAIAAIEBACABAAAAFQAgAQAAABUAIAMAAAATACABAAAUADACAAAVACADAAAAEwAgAQAAFAAwAgAAFQAgAwAAABMAIAEAABQAMAIAABUAIAQHAACwBAAggAIBAAAAAY8CAAAAnQICkwIBAAAAAQERAACfAQAgA4ACAQAAAAGPAgAAAJ0CApMCAQAAAAEBEQAAoQEAMAERAAChAQAwBAcAAK8EACCAAgEAvgMAIY8CAACuBJ0CIpMCAQC-AwAhAgAAABUAIBEAAKQBACADgAIBAL4DACGPAgAArgSdAiKTAgEAvgMAIQIAAAATACARAACmAQAgAgAAABMAIBEAAKYBACADAAAAFQAgGAAAnwEAIBkAAKQBACABAAAAFQAgAQAAABMAIAMIAACrBAAgHgAArQQAIB8AAKwEACAG6AEAAIgDADDpAQAArQEAEOoBAACIAwAwgAIBAN0CACGPAgAAiQOdAiKTAgEA3QIAIQMAAAATACABAACsAQAwHQAArQEAIAMAAAATACABAAAUADACAAAVACABAAAAEQAgAQAAABEAIAMAAAAPACABAAAQADACAAARACADAAAADwAgAQAAEAAwAgAAEQAgAwAAAA8AIAEAABAAMAIAABEAIAsEAACqBAAgBwAAqAQAIAkAAKkEACCIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABkwIBAAAAAZQCgAAAAAGVAoAAAAABlgJAAAAAAQERAAC1AQAgCIgCQAAAAAGQAgEAAAABkQIBAAAAAZICQAAAAAGTAgEAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABAREAALcBADABEQAAtwEAMAsEAACPBAAgBwAAjQQAIAkAAI4EACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZMCAQC-AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQIAAAARACARAAC6AQAgCIgCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhkwIBAL4DACGUAoAAAAABlQKAAAAAAZYCQAC_AwAhAgAAAA8AIBEAALwBACACAAAADwAgEQAAvAEAIAMAAAARACAYAAC1AQAgGQAAugEAIAEAAAARACABAAAADwAgAwgAAIoEACAeAACMBAAgHwAAiwQAIAvoAQAAhQMAMOkBAADDAQAQ6gEAAIUDADCIAkAA3gIAIZACAQDdAgAhkQIBAN0CACGSAkAA3gIAIZMCAQDdAgAhlAIAAIYDACCVAgAAhgMAIJYCQADeAgAhAwAAAA8AIAEAAMIBADAdAADDAQAgAwAAAA8AIAEAABAAMAIAABEAIAEAAAAcACABAAAAHAAgAwAAABoAIAEAABsAMAIAABwAIAMAAAAaACABAAAbADACAAAcACADAAAAGgAgAQAAGwAwAgAAHAAgBAoAAIkEACCAAgEAAAABiQIBAAAAAY8CAAAAjwICAREAAMsBACADgAIBAAAAAYkCAQAAAAGPAgAAAI8CAgERAADNAQAwAREAAM0BADAECgAAiAQAIIACAQC-AwAhiQIBAL4DACGPAgAAhwSPAiICAAAAHAAgEQAA0AEAIAOAAgEAvgMAIYkCAQC-AwAhjwIAAIcEjwIiAgAAABoAIBEAANIBACACAAAAGgAgEQAA0gEAIAMAAAAcACAYAADLAQAgGQAA0AEAIAEAAAAcACABAAAAGgAgAwgAAIQEACAeAACGBAAgHwAAhQQAIAboAQAAgQMAMOkBAADZAQAQ6gEAAIEDADCAAgEA3QIAIYkCAQDdAgAhjwIAAIIDjwIiAwAAABoAIAEAANgBADAdAADZAQAgAwAAABoAIAEAABsAMAIAABwAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgBwMAAIMEACAKAACCBAAgiQIBAAAAAYoCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAEBEQAA4QEAIAWJAgEAAAABigIBAAAAAYsCAgAAAAGMAiAAAAABjQIBAAAAAQERAADjAQAwAREAAOMBADAHAwAAgQQAIAoAAIAEACCJAgEAvgMAIYoCAQC-AwAhiwICAP4DACGMAiAA_wMAIY0CAQC-AwAhAgAAAA0AIBEAAOYBACAFiQIBAL4DACGKAgEAvgMAIYsCAgD-AwAhjAIgAP8DACGNAgEAvgMAIQIAAAALACARAADoAQAgAgAAAAsAIBEAAOgBACADAAAADQAgGAAA4QEAIBkAAOYBACABAAAADQAgAQAAAAsAIAUIAAD5AwAgHgAA_AMAIB8AAPsDACBAAAD6AwAgQQAA_QMAIAjoAQAA-gIAMOkBAADvAQAQ6gEAAPoCADCJAgEA3QIAIYoCAQDdAgAhiwICAPsCACGMAiAA_AIAIY0CAQDdAgAhAwAAAAsAIAEAAO4BADAdAADvAQAgAwAAAAsAIAEAAAwAMAIAAA0AIAboAQAA-QIAMOkBAAD1AQAQ6gEAAPkCADCGAgEAAAABhwIBAO4CACGIAkAA8gIAIQEAAADyAQAgAQAAAPIBACAG6AEAAPkCADDpAQAA9QEAEOoBAAD5AgAwhgIBAO4CACGHAgEA7gIAIYgCQADyAgAhAAMAAAD1AQAgAQAA9gEAMAIAAPIBACADAAAA9QEAIAEAAPYBADACAADyAQAgAwAAAPUBACABAAD2AQAwAgAA8gEAIAOGAgEAAAABhwIBAAAAAYgCQAAAAAEBEQAA-gEAIAOGAgEAAAABhwIBAAAAAYgCQAAAAAEBEQAA_AEAMAERAAD8AQAwA4YCAQC-AwAhhwIBAL4DACGIAkAAvwMAIQIAAADyAQAgEQAA_wEAIAOGAgEAvgMAIYcCAQC-AwAhiAJAAL8DACECAAAA9QEAIBEAAIECACACAAAA9QEAIBEAAIECACADAAAA8gEAIBgAAPoBACAZAAD_AQAgAQAAAPIBACABAAAA9QEAIAMIAAD2AwAgHgAA-AMAIB8AAPcDACAG6AEAAPgCADDpAQAAiAIAEOoBAAD4AgAwhgIBAN0CACGHAgEA3QIAIYgCQADeAgAhAwAAAPUBACABAACHAgAwHQAAiAIAIAMAAAD1AQAgAQAA9gEAMAIAAPIBACAHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEAAAABgQIBAAAAAYICAQDvAgAhAQAAAIsCACAMtQEAAPYCACC2AQAA9wIAIOgBAAD0AgAw6QEAAI0CABDqAQAA9AIAMOwBQADyAgAh7wEBAO4CACH7AQEA7gIAIfwBAQDuAgAh_QEBAO4CACH-AQEA7wIAIf8BQAD1AgAhBLUBAAD0AwAgtgEAAPUDACD-AQAAugMAIP8BAAC6AwAgDLUBAAD2AgAgtgEAAPcCACDoAQAA9AIAMOkBAACNAgAQ6gEAAPQCADDsAUAA8gIAIe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQDuAgAh_gEBAAAAAf8BQAD1AgAhAwAAAI0CACABAACOAgAwAgAAjwIAIAm0AQAA8wIAIOgBAADxAgAw6QEAAJECABDqAQAA8QIAMOsBAQDuAgAh7AFAAPICACHtAUAA8gIAIe4BAQDvAgAh7wEBAO4CACECtAEAAPMDACDuAQAAugMAIAm0AQAA8wIAIOgBAADxAgAw6QEAAJECABDqAQAA8QIAMOsBAQAAAAHsAUAA8gIAIe0BQADyAgAh7gEBAO8CACHvAQEA7gIAIQMAAACRAgAgAQAAkgIAMAIAAJMCACAHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEA7gIAIYECAQDuAgAhggIBAO8CACECtwEAAPIDACCCAgAAugMAIAMAAACVAgAgAQAAlgIAMAIAAIsCACABAAAAkQIAIAEAAACVAgAgAQAAAI0CACABAAAAiwIAIAMAAACVAgAgAQAAlgIAMAIAAIsCACADAAAAlQIAIAEAAJYCADACAACLAgAgAwAAAJUCACABAACWAgAwAgAAiwIAIAS3AQAA8QMAIIACAQAAAAGBAgEAAAABggIBAAAAAQERAACfAgAgA4ACAQAAAAGBAgEAAAABggIBAAAAAQERAAChAgAwAREAAKECADAEtwEAAOUDACCAAgEAvgMAIYECAQC-AwAhggIBAMADACECAAAAiwIAIBEAAKQCACADgAIBAL4DACGBAgEAvgMAIYICAQDAAwAhAgAAAJUCACARAACmAgAgAgAAAJUCACARAACmAgAgAwAAAIsCACAYAACfAgAgGQAApAIAIAEAAACLAgAgAQAAAJUCACAECAAA4gMAIB4AAOQDACAfAADjAwAgggIAALoDACAG6AEAAOwCADDpAQAArQIAEOoBAADsAgAwgAIBAN0CACGBAgEA3QIAIYICAQDfAgAhAwAAAJUCACABAACsAgAwHQAArQIAIAMAAACVAgAgAQAAlgIAMAIAAIsCACABAAAAjwIAIAEAAACPAgAgAwAAAI0CACABAACOAgAwAgAAjwIAIAMAAACNAgAgAQAAjgIAMAIAAI8CACADAAAAjQIAIAEAAI4CADACAACPAgAgCbUBAADgAwAgtgEAAOEDACDsAUAAAAAB7wEBAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AUAAAAABAREAALUCACAH7AFAAAAAAe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wFAAAAAAQERAAC3AgAwAREAALcCADAJtQEAAMcDACC2AQAAyAMAIOwBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhAgAAAI8CACARAAC6AgAgB-wBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhAgAAAI0CACARAAC8AgAgAgAAAI0CACARAAC8AgAgAwAAAI8CACAYAAC1AgAgGQAAugIAIAEAAACPAgAgAQAAAI0CACAFCAAAwwMAIB4AAMUDACAfAADEAwAg_gEAALoDACD_AQAAugMAIAroAQAA6AIAMOkBAADDAgAQ6gEAAOgCADDsAUAA3gIAIe8BAQDdAgAh-wEBAN0CACH8AQEA3QIAIf0BAQDdAgAh_gEBAN8CACH_AUAA6QIAIQMAAACNAgAgAQAAwgIAMB0AAMMCACADAAAAjQIAIAEAAI4CADACAACPAgAgAQAAAJMCACABAAAAkwIAIAMAAACRAgAgAQAAkgIAMAIAAJMCACADAAAAkQIAIAEAAJICADACAACTAgAgAwAAAJECACABAACSAgAwAgAAkwIAIAa0AQAAwgMAIOsBAQAAAAHsAUAAAAAB7QFAAAAAAe4BAQAAAAHvAQEAAAABAREAAMsCACAF6wEBAAAAAewBQAAAAAHtAUAAAAAB7gEBAAAAAe8BAQAAAAEBEQAAzQIAMAERAADNAgAwBrQBAADBAwAg6wEBAL4DACHsAUAAvwMAIe0BQAC_AwAh7gEBAMADACHvAQEAvgMAIQIAAACTAgAgEQAA0AIAIAXrAQEAvgMAIewBQAC_AwAh7QFAAL8DACHuAQEAwAMAIe8BAQC-AwAhAgAAAJECACARAADSAgAgAgAAAJECACARAADSAgAgAwAAAJMCACAYAADLAgAgGQAA0AIAIAEAAACTAgAgAQAAAJECACAECAAAuwMAIB4AAL0DACAfAAC8AwAg7gEAALoDACAI6AEAANwCADDpAQAA2QIAEOoBAADcAgAw6wEBAN0CACHsAUAA3gIAIe0BQADeAgAh7gEBAN8CACHvAQEA3QIAIQMAAACRAgAgAQAA2AIAMB0AANkCACADAAAAkQIAIAEAAJICADACAACTAgAgCOgBAADcAgAw6QEAANkCABDqAQAA3AIAMOsBAQDdAgAh7AFAAN4CACHtAUAA3gIAIe4BAQDfAgAh7wEBAN0CACEOCAAA5AIAIB4AAOcCACAfAADnAgAg8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDmAgAhCwgAAOQCACAeAADlAgAgHwAA5QIAIPABQAAAAAHxAUAAAAAE8gFAAAAABPMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA4wIAIQ4IAADhAgAgHgAA4gIAIB8AAOICACDwAQEAAAAB8QEBAAAABfIBAQAAAAXzAQEAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAOACACEOCAAA4QIAIB4AAOICACAfAADiAgAg8AEBAAAAAfEBAQAAAAXyAQEAAAAF8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDgAgAhCPABAgAAAAHxAQIAAAAF8gECAAAABfMBAgAAAAH0AQIAAAAB9QECAAAAAfYBAgAAAAH6AQIA4QIAIQvwAQEAAAAB8QEBAAAABfIBAQAAAAXzAQEAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAOICACELCAAA5AIAIB4AAOUCACAfAADlAgAg8AFAAAAAAfEBQAAAAATyAUAAAAAE8wFAAAAAAfQBQAAAAAH1AUAAAAAB9gFAAAAAAfoBQADjAgAhCPABAgAAAAHxAQIAAAAE8gECAAAABPMBAgAAAAH0AQIAAAAB9QECAAAAAfYBAgAAAAH6AQIA5AIAIQjwAUAAAAAB8QFAAAAABPIBQAAAAATzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOUCACEOCAAA5AIAIB4AAOcCACAfAADnAgAg8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDmAgAhC_ABAQAAAAHxAQEAAAAE8gEBAAAABPMBAQAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQEA5wIAIQroAQAA6AIAMOkBAADDAgAQ6gEAAOgCADDsAUAA3gIAIe8BAQDdAgAh-wEBAN0CACH8AQEA3QIAIf0BAQDdAgAh_gEBAN8CACH_AUAA6QIAIQsIAADhAgAgHgAA6wIAIB8AAOsCACDwAUAAAAAB8QFAAAAABfIBQAAAAAXzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOoCACELCAAA4QIAIB4AAOsCACAfAADrAgAg8AFAAAAAAfEBQAAAAAXyAUAAAAAF8wFAAAAAAfQBQAAAAAH1AUAAAAAB9gFAAAAAAfoBQADqAgAhCPABQAAAAAHxAUAAAAAF8gFAAAAABfMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA6wIAIQboAQAA7AIAMOkBAACtAgAQ6gEAAOwCADCAAgEA3QIAIYECAQDdAgAhggIBAN8CACEHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEA7gIAIYECAQDuAgAhggIBAO8CACEL8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDnAgAhC_ABAQAAAAHxAQEAAAAF8gEBAAAABfMBAQAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQEA4gIAIQODAgAAjQIAIIQCAACNAgAghQIAAI0CACAJtAEAAPMCACDoAQAA8QIAMOkBAACRAgAQ6gEAAPECADDrAQEA7gIAIewBQADyAgAh7QFAAPICACHuAQEA7wIAIe8BAQDuAgAhCPABQAAAAAHxAUAAAAAE8gFAAAAABPMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA5QIAIQ61AQAA9gIAILYBAAD3AgAg6AEAAPQCADDpAQAAjQIAEOoBAAD0AgAw7AFAAPICACHvAQEA7gIAIfsBAQDuAgAh_AEBAO4CACH9AQEA7gIAIf4BAQDvAgAh_wFAAPUCACGqAgAAjQIAIKsCAACNAgAgDLUBAAD2AgAgtgEAAPcCACDoAQAA9AIAMOkBAACNAgAQ6gEAAPQCADDsAUAA8gIAIe8BAQDuAgAh-wEBAO4CACH8AQEA7gIAIf0BAQDuAgAh_gEBAO8CACH_AUAA9QIAIQjwAUAAAAAB8QFAAAAABfIBQAAAAAXzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOsCACEDgwIAAJECACCEAgAAkQIAIIUCAACRAgAgA4MCAACVAgAghAIAAJUCACCFAgAAlQIAIAboAQAA-AIAMOkBAACIAgAQ6gEAAPgCADCGAgEA3QIAIYcCAQDdAgAhiAJAAN4CACEG6AEAAPkCADDpAQAA9QEAEOoBAAD5AgAwhgIBAO4CACGHAgEA7gIAIYgCQADyAgAhCOgBAAD6AgAw6QEAAO8BABDqAQAA-gIAMIkCAQDdAgAhigIBAN0CACGLAgIA-wIAIYwCIAD8AgAhjQIBAN0CACENCAAA5AIAIB4AAOQCACAfAADkAgAgQAAAgAMAIEEAAOQCACDwAQIAAAAB8QECAAAABPIBAgAAAATzAQIAAAAB9AECAAAAAfUBAgAAAAH2AQIAAAAB-gECAP8CACEFCAAA5AIAIB4AAP4CACAfAAD-AgAg8AEgAAAAAfoBIAD9AgAhBQgAAOQCACAeAAD-AgAgHwAA_gIAIPABIAAAAAH6ASAA_QIAIQLwASAAAAAB-gEgAP4CACENCAAA5AIAIB4AAOQCACAfAADkAgAgQAAAgAMAIEEAAOQCACDwAQIAAAAB8QECAAAABPIBAgAAAATzAQIAAAAB9AECAAAAAfUBAgAAAAH2AQIAAAAB-gECAP8CACEI8AEIAAAAAfEBCAAAAATyAQgAAAAE8wEIAAAAAfQBCAAAAAH1AQgAAAAB9gEIAAAAAfoBCACAAwAhBugBAACBAwAw6QEAANkBABDqAQAAgQMAMIACAQDdAgAhiQIBAN0CACGPAgAAggOPAiIHCAAA5AIAIB4AAIQDACAfAACEAwAg8AEAAACPAgLxAQAAAI8CCPIBAAAAjwII-gEAAIMDjwIiBwgAAOQCACAeAACEAwAgHwAAhAMAIPABAAAAjwIC8QEAAACPAgjyAQAAAI8CCPoBAACDA48CIgTwAQAAAI8CAvEBAAAAjwII8gEAAACPAgj6AQAAhAOPAiIL6AEAAIUDADDpAQAAwwEAEOoBAACFAwAwiAJAAN4CACGQAgEA3QIAIZECAQDdAgAhkgJAAN4CACGTAgEA3QIAIZQCAACGAwAglQIAAIYDACCWAkAA3gIAIQoIAADkAgAgHgAAhwMAIB8AAIcDACDwAYAAAAAB-gGAAAAAAZcCAQAAAAGYAgEAAAABmQIBAAAAAZoCgAAAAAGbAoAAAAABB_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_AwAh7gEBAMADACEE6wEBAL4DACHsAUAAvwMAIe0BQAC_AwAh7gEBAMADACEE6wEBAAAAAewBQAAAAAHtAUAAAAAB7gEBAAAAAQQYAADUAwAwrAIAANUDADCxAgAA2AMAMLQCAADXAwAgAxgAAMkDADCsAgAAygMAMLECAADMAwAwAAAAChgAAOYDADAZAADqAwAwrAIAAOcDADCtAgAA6AMAMK4CAADpAwAwrwIAAOkDADCwAgAA6QMAMLECAADpAwAwsgIAAOsDADCzAgAA7AMAMAi1AQAA4AMAIOwBQAAAAAHvAQEAAAAB-wEBAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BQAAAAAECAAAAjwIAIBgAAPADACADAAAAjwIAIBgAAPADACAZAADvAwAgDLUBAAD2AgAgtgEAAPcCACDoAQAA9AIAMOkBAACNAgAQ6gEAAPQCADDsAUAA8gIAIe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQDuAgAh_gEBAAAAAf8BQAD1AgAhAgAAAI8CACARAADvAwAgAgAAAO0DACARAADuAwAgCugBAADsAwAw6QEAAO0DABDqAQAA7AMAMOwBQADyAgAh7wEBAO4CACH7AQEA7gIAIfwBAQDuAgAh_QEBAO4CACH-AQEA7wIAIf8BQAD1AgAhCugBAADsAwAw6QEAAO0DABDqAQAA7AMAMOwBQADyAgAh7wEBAO4CACH7AQEA7gIAIfwBAQDuAgAh_QEBAO4CACH-AQEA7wIAIf8BQAD1AgAhB-wBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhCLUBAADHAwAg7AFAAL8DACHvAQEAvgMAIfsBAQC-AwAh_AEBAL4DACH9AQEAvgMAIf4BAQDAAwAh_wFAAMYDACEItQEAAOADACDsAUAAAAAB7wEBAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AUAAAAABAxgAAOYDADCsAgAA5wMAMLECAADpAwAwAAS1AQAA9AMAILYBAAD1AwAg_gEAALoDACD_AQAAugMAIAAAAAAAAAAAAAAFrgICAAAAAbUCAgAAAAG2AgIAAAABtwICAAAAAbgCAgAAAAEBrgIgAAAAAQUYAADQBQAgGQAA1gUAIKwCAADRBQAgrQIAANUFACCxAgAAEQAgBRgAAM4FACAZAADTBQAgrAIAAM8FACCtAgAA0gUAILECAAABACADGAAA0AUAIKwCAADRBQAgsQIAABEAIAMYAADOBQAgrAIAAM8FACCxAgAAAQAgAAAAAa4CAAAAjwICBRgAAMkFACAZAADMBQAgrAIAAMoFACCtAgAAywUAILECAAARACADGAAAyQUAIKwCAADKBQAgsQIAABEAIAAAAAUYAADCBQAgGQAAxwUAIKwCAADDBQAgrQIAAMYFACCxAgAAgQEAIAsYAACcBAAwGQAAoQQAMKwCAACdBAAwrQIAAJ4EADCuAgAAoAQAMK8CAACgBAAwsAIAAKAEADCxAgAAoAQAMLICAACiBAAwswIAAKMEADC0AgAAnwQAIAsYAACQBAAwGQAAlQQAMKwCAACRBAAwrQIAAJIEADCuAgAAlAQAMK8CAACUBAAwsAIAAJQEADCxAgAAlAQAMLICAACWBAAwswIAAJcEADC0AgAAkwQAIAKAAgEAAAABjwIAAACPAgICAAAAHAAgGAAAmwQAIAMAAAAcACAYAACbBAAgGQAAmgQAIAERAADFBQAwCAoAAKoDACDoAQAAqAMAMOkBAAAaABDqAQAAqAMAMIACAQDuAgAhiQIBAO4CACGPAgAAqQOPAiKlAgAApwMAIAIAAAAcACARAACaBAAgAgAAAJgEACARAACZBAAgBugBAACXBAAw6QEAAJgEABDqAQAAlwQAMIACAQDuAgAhiQIBAO4CACGPAgAAqQOPAiIG6AEAAJcEADDpAQAAmAQAEOoBAACXBAAwgAIBAO4CACGJAgEA7gIAIY8CAACpA48CIgKAAgEAvgMAIY8CAACHBI8CIgKAAgEAvgMAIY8CAACHBI8CIgKAAgEAAAABjwIAAACPAgIFAwAAgwQAIIoCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAECAAAADQAgGAAApwQAIAMAAAANACAYAACnBAAgGQAApgQAIAERAADEBQAwCwMAAKUDACAKAACqAwAg6AEAALIDADDpAQAACwAQ6gEAALIDADCJAgEA7gIAIYoCAQDuAgAhiwICAKYDACGMAiAAswMAIY0CAQDuAgAhpwIAALEDACACAAAADQAgEQAApgQAIAIAAACkBAAgEQAApQQAIAjoAQAAowQAMOkBAACkBAAQ6gEAAKMEADCJAgEA7gIAIYoCAQDuAgAhiwICAKYDACGMAiAAswMAIY0CAQDuAgAhCOgBAACjBAAw6QEAAKQEABDqAQAAowQAMIkCAQDuAgAhigIBAO4CACGLAgIApgMAIYwCIACzAwAhjQIBAO4CACEEigIBAL4DACGLAgIA_gMAIYwCIAD_AwAhjQIBAL4DACEFAwAAgQQAIIoCAQC-AwAhiwICAP4DACGMAiAA_wMAIY0CAQC-AwAhBQMAAIMEACCKAgEAAAABiwICAAAAAYwCIAAAAAGNAgEAAAABAxgAAMIFACCsAgAAwwUAILECAACBAQAgBBgAAJwEADCsAgAAnQQAMLECAACgBAAwtAIAAJ8EACAEGAAAkAQAMKwCAACRBAAwsQIAAJQEADC0AgAAkwQAIAAAAAGuAgAAAJ0CAgUYAAC9BQAgGQAAwAUAIKwCAAC-BQAgrQIAAL8FACCxAgAAgQEAIAMYAAC9BQAgrAIAAL4FACCxAgAAgQEAIAAAAAsYAADCBAAwGQAAxwQAMKwCAADDBAAwrQIAAMQEADCuAgAAxgQAMK8CAADGBAAwsAIAAMYEADCxAgAAxgQAMLICAADIBAAwswIAAMkEADC0AgAAxQQAIAsYAAC2BAAwGQAAuwQAMKwCAAC3BAAwrQIAALgEADCuAgAAugQAMK8CAAC6BAAwsAIAALoEADCxAgAAugQAMLICAAC8BAAwswIAAL0EADC0AgAAuQQAIAKAAgEAAAABjwIAAACdAgICAAAAFQAgGAAAwQQAIAMAAAAVACAYAADBBAAgGQAAwAQAIAERAAC8BQAwCAcAAK4DACDoAQAArAMAMOkBAAATABDqAQAArAMAMIACAQDuAgAhjwIAAK0DnQIikwIBAO4CACGmAgAAqwMAIAIAAAAVACARAADABAAgAgAAAL4EACARAAC_BAAgBugBAAC9BAAw6QEAAL4EABDqAQAAvQQAMIACAQDuAgAhjwIAAK0DnQIikwIBAO4CACEG6AEAAL0EADDpAQAAvgQAEOoBAAC9BAAwgAIBAO4CACGPAgAArQOdAiKTAgEA7gIAIQKAAgEAvgMAIY8CAACuBJ0CIgKAAgEAvgMAIY8CAACuBJ0CIgKAAgEAAAABjwIAAACdAgIJBAAAqgQAIAkAAKkEACCIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABAgAAABEAIBgAAM0EACADAAAAEQAgGAAAzQQAIBkAAMwEACABEQAAuwUAMA4EAACwAwAgBwAArgMAIAkAAKEDACDoAQAArwMAMOkBAAAPABDqAQAArwMAMIgCQADyAgAhkAIBAAAAAZECAQAAAAGSAkAA8gIAIZMCAQDuAgAhlAIAAI4DACCVAgAAjgMAIJYCQADyAgAhAgAAABEAIBEAAMwEACACAAAAygQAIBEAAMsEACAL6AEAAMkEADDpAQAAygQAEOoBAADJBAAwiAJAAPICACGQAgEA7gIAIZECAQDuAgAhkgJAAPICACGTAgEA7gIAIZQCAACOAwAglQIAAI4DACCWAkAA8gIAIQvoAQAAyQQAMOkBAADKBAAQ6gEAAMkEADCIAkAA8gIAIZACAQDuAgAhkQIBAO4CACGSAkAA8gIAIZMCAQDuAgAhlAIAAI4DACCVAgAAjgMAIJYCQADyAgAhB4gCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQkEAACPBAAgCQAAjgQAIIgCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQkEAACqBAAgCQAAqQQAIIgCQAAAAAGQAgEAAAABkQIBAAAAAZICQAAAAAGUAoAAAAABlQKAAAAAAZYCQAAAAAEEGAAAwgQAMKwCAADDBAAwsQIAAMYEADC0AgAAxQQAIAQYAAC2BAAwrAIAALcEADCxAgAAugQAMLQCAAC5BAAgAAAAAAAAAAGuAgAAAKICAgUYAAC2BQAgGQAAuQUAIKwCAAC3BQAgrQIAALgFACCxAgAAAQAgAxgAALYFACCsAgAAtwUAILECAAABACAAAAAAAAWuAgQAAAABtQIEAAAAAbYCBAAAAAG3AgQAAAABuAIEAAAAAQUYAACxBQAgGQAAtAUAIKwCAACyBQAgrQIAALMFACCxAgAAAQAgAxgAALEFACCsAgAAsgUAILECAAABACAAAAABrgIAAAClAgIFGAAArAUAIBkAAK8FACCsAgAArQUAIK0CAACuBQAgsQIAAAEAIAMYAACsBQAgrAIAAK0FACCxAgAAAQAgAAAACxgAAJAFADAZAACVBQAwrAIAAJEFADCtAgAAkgUAMK4CAACUBQAwrwIAAJQFADCwAgAAlAUAMLECAACUBQAwsgIAAJYFADCzAgAAlwUAMLQCAACTBQAgCxgAAIQFADAZAACJBQAwrAIAAIUFADCtAgAAhgUAMK4CAACIBQAwrwIAAIgFADCwAgAAiAUAMLECAACIBQAwsgIAAIoFADCzAgAAiwUAMLQCAACHBQAgCxgAAPsEADAZAAD_BAAwrAIAAPwEADCtAgAA_QQAMK4CAACgBAAwrwIAAKAEADCwAgAAoAQAMLECAACgBAAwsgIAAIAFADCzAgAAowQAMLQCAAD-BAAgCxgAAO8EADAZAAD0BAAwrAIAAPAEADCtAgAA8QQAMK4CAADzBAAwrwIAAPMEADCwAgAA8wQAMLECAADzBAAwsgIAAPUEADCzAgAA9gQAMLQCAADyBAAgA54CAAAAogICnwICAAAAAaACAQAAAAECAAAAIgAgGAAA-gQAIAMAAAAiACAYAAD6BAAgGQAA-QQAIAERAACrBQAwCAMAAKUDACDoAQAAowMAMOkBAAAgABDqAQAAowMAMIoCAQDuAgAhngIAAKQDogIinwICAAAAAaACAQDuAgAhAgAAACIAIBEAAPkEACACAAAA9wQAIBEAAPgEACAH6AEAAPYEADDpAQAA9wQAEOoBAAD2BAAwigIBAO4CACGeAgAApAOiAiKfAgIApgMAIaACAQDuAgAhB-gBAAD2BAAw6QEAAPcEABDqAQAA9gQAMIoCAQDuAgAhngIAAKQDogIinwICAKYDACGgAgEA7gIAIQOeAgAA1wSiAiKfAgIA_gMAIaACAQC-AwAhA54CAADXBKICIp8CAgD-AwAhoAIBAL4DACEDngIAAACiAgKfAgIAAAABoAIBAAAAAQUKAACCBAAgiQIBAAAAAYsCAgAAAAGMAiAAAAABjQIBAAAAAQIAAAANACAYAACDBQAgAwAAAA0AIBgAAIMFACAZAACCBQAgAREAAKoFADACAAAADQAgEQAAggUAIAIAAACkBAAgEQAAgQUAIASJAgEAvgMAIYsCAgD-AwAhjAIgAP8DACGNAgEAvgMAIQUKAACABAAgiQIBAL4DACGLAgIA_gMAIYwCIAD_AwAhjQIBAL4DACEFCgAAggQAIIkCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAEFiAJAAAAAAZICQAAAAAGgAgEAAAABogIEAAAAAaMCgAAAAAECAAAACQAgGAAAjwUAIAMAAAAJACAYAACPBQAgGQAAjgUAIAERAACpBQAwCwMAAKUDACDoAQAAtQMAMOkBAAAHABDqAQAAtQMAMIgCQADyAgAhigIBAO4CACGSAkAA8gIAIaACAQDuAgAhogIEALYDACGjAgAAjgMAIKgCAAC0AwAgAgAAAAkAIBEAAI4FACACAAAAjAUAIBEAAI0FACAJ6AEAAIsFADDpAQAAjAUAEOoBAACLBQAwiAJAAPICACGKAgEA7gIAIZICQADyAgAhoAIBAO4CACGiAgQAtgMAIaMCAACOAwAgCegBAACLBQAw6QEAAIwFABDqAQAAiwUAMIgCQADyAgAhigIBAO4CACGSAkAA8gIAIaACAQDuAgAhogIEALYDACGjAgAAjgMAIAWIAkAAvwMAIZICQAC_AwAhoAIBAL4DACGiAgQA3wQAIaMCgAAAAAEFiAJAAL8DACGSAkAAvwMAIaACAQC-AwAhogIEAN8EACGjAoAAAAABBYgCQAAAAAGSAkAAAAABoAIBAAAAAaICBAAAAAGjAoAAAAABAoACAQAAAAGPAgAAAKUCAgIAAAAFACAYAACbBQAgAwAAAAUAIBgAAJsFACAZAACaBQAgAREAAKgFADAIAwAApQMAIOgBAAC4AwAw6QEAAAMAEOoBAAC4AwAwgAIBAO4CACGKAgEA7gIAIY8CAAC5A6UCIqkCAAC3AwAgAgAAAAUAIBEAAJoFACACAAAAmAUAIBEAAJkFACAG6AEAAJcFADDpAQAAmAUAEOoBAACXBQAwgAIBAO4CACGKAgEA7gIAIY8CAAC5A6UCIgboAQAAlwUAMOkBAACYBQAQ6gEAAJcFADCAAgEA7gIAIYoCAQDuAgAhjwIAALkDpQIiAoACAQC-AwAhjwIAAOUEpQIiAoACAQC-AwAhjwIAAOUEpQIiAoACAQAAAAGPAgAAAKUCAgQYAACQBQAwrAIAAJEFADCxAgAAlAUAMLQCAACTBQAgBBgAAIQFADCsAgAAhQUAMLECAACIBQAwtAIAAIcFACAEGAAA-wQAMKwCAAD8BAAwsQIAAKAEADC0AgAA_gQAIAQYAADvBAAwrAIAAPAEADCxAgAA8wQAMLQCAADyBAAgAAAAAAQEAACgBQAgBQAAoQUAIAkAAKIFACALAACjBQAgAwQAAKcFACAHAACmBQAgCQAAogUAIAIEAADRBAAgBgAA0AQAIAACgAIBAAAAAY8CAAAApQICBYgCQAAAAAGSAkAAAAABoAIBAAAAAaICBAAAAAGjAoAAAAABBIkCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAEDngIAAACiAgKfAgIAAAABoAIBAAAAAQgFAACdBQAgCQAAngUAIAsAAJ8FACCCAgEAAAABiAJAAAAAAZACAQAAAAGSAkAAAAABnQIBAAAAAQIAAAABACAYAACsBQAgAwAAACkAIBgAAKwFACAZAACwBQAgCgAAACkAIAUAAOwEACAJAADtBAAgCwAA7gQAIBEAALAFACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhCAUAAOwEACAJAADtBAAgCwAA7gQAIIICAQC-AwAhiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhnQIBAL4DACEIBAAAnAUAIAkAAJ4FACALAACfBQAgggIBAAAAAYgCQAAAAAGQAgEAAAABkgJAAAAAAZ0CAQAAAAECAAAAAQAgGAAAsQUAIAMAAAApACAYAACxBQAgGQAAtQUAIAoAAAApACAEAADrBAAgCQAA7QQAIAsAAO4EACARAAC1BQAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQgEAADrBAAgCQAA7QQAIAsAAO4EACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhCAQAAJwFACAFAACdBQAgCQAAngUAIIICAQAAAAGIAkAAAAABkAIBAAAAAZICQAAAAAGdAgEAAAABAgAAAAEAIBgAALYFACADAAAAKQAgGAAAtgUAIBkAALoFACAKAAAAKQAgBAAA6wQAIAUAAOwEACAJAADtBAAgEQAAugUAIIICAQC-AwAhiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhnQIBAL4DACEIBAAA6wQAIAUAAOwEACAJAADtBAAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQeIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABAoACAQAAAAGPAgAAAJ0CAgcGAADOBAAgiAJAAAAAAZACAQAAAAGSAkAAAAABlAKAAAAAAZ0CAQAAAAGeAgEAAAABAgAAAIEBACAYAAC9BQAgAwAAAIQBACAYAAC9BQAgGQAAwQUAIAkAAACEAQAgBgAAtAQAIBEAAMEFACCIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGUAoAAAAABnQIBAL4DACGeAgEAvgMAIQcGAAC0BAAgiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACEHBAAAzwQAIIgCQAAAAAGQAgEAAAABkgJAAAAAAZQCgAAAAAGdAgEAAAABngIBAAAAAQIAAACBAQAgGAAAwgUAIASKAgEAAAABiwICAAAAAYwCIAAAAAGNAgEAAAABAoACAQAAAAGPAgAAAI8CAgMAAACEAQAgGAAAwgUAIBkAAMgFACAJAAAAhAEAIAQAALUEACARAADIBQAgiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACEHBAAAtQQAIIgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZQCgAAAAAGdAgEAvgMAIZ4CAQC-AwAhCgcAAKgEACAJAACpBAAgiAJAAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAZMCAQAAAAGUAoAAAAABlQKAAAAAAZYCQAAAAAECAAAAEQAgGAAAyQUAIAMAAAAPACAYAADJBQAgGQAAzQUAIAwAAAAPACAHAACNBAAgCQAAjgQAIBEAAM0FACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZMCAQC-AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQoHAACNBAAgCQAAjgQAIIgCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhkwIBAL4DACGUAoAAAAABlQKAAAAAAZYCQAC_AwAhCAQAAJwFACAFAACdBQAgCwAAnwUAIIICAQAAAAGIAkAAAAABkAIBAAAAAZICQAAAAAGdAgEAAAABAgAAAAEAIBgAAM4FACAKBAAAqgQAIAcAAKgEACCIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABkwIBAAAAAZQCgAAAAAGVAoAAAAABlgJAAAAAAQIAAAARACAYAADQBQAgAwAAACkAIBgAAM4FACAZAADUBQAgCgAAACkAIAQAAOsEACAFAADsBAAgCwAA7gQAIBEAANQFACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhCAQAAOsEACAFAADsBAAgCwAA7gQAIIICAQC-AwAhiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhnQIBAL4DACEDAAAADwAgGAAA0AUAIBkAANcFACAMAAAADwAgBAAAjwQAIAcAAI0EACARAADXBQAgiAJAAL8DACGQAgEAvgMAIZECAQC-AwAhkgJAAL8DACGTAgEAvgMAIZQCgAAAAAGVAoAAAAABlgJAAL8DACEKBAAAjwQAIAcAAI0EACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZMCAQC-AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQTrAQEAAAAB7AFAAAAAAe0BQAAAAAHuAQEAAAABCLYBAADhAwAg7AFAAAAAAe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wFAAAAAAQIAAACPAgAgGAAA2QUAIAMAAACNAgAgGAAA2QUAIBkAAN0FACAKAAAAjQIAIBEAAN0FACC2AQAAyAMAIOwBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhCLYBAADIAwAg7AFAAL8DACHvAQEAvgMAIfsBAQC-AwAh_AEBAL4DACH9AQEAvgMAIf4BAQDAAwAh_wFAAMYDACEFBAYCBQoDCAAMCQ4ECyMLAQMAAQEDAAECAwABCgAFBAQdCQcABggACgkZBAMEFgcGEgUIAAgBBwAGAgQYAAYXAAEKAAUCBB8ACR4AAQMAAQQEJAAFJQAJJgALJwAAAAADCAARHgASHwATAAAAAwgAER4AEh8AEwEDAAEBAwABAwgAGB4AGR8AGgAAAAMIABgeABkfABoBAwABAQMAAQUIAB8eACIfACNAACBBACEAAAAAAAUIAB8eACIfACNAACBBACEBAwABAQMAAQUIACgeACsfACxAAClBACoAAAAAAAUIACgeACsfACxAAClBACoAAAMIADEeADIfADMAAAADCAAxHgAyHwAzAQcABgEHAAYDCAA4HgA5HwA6AAAAAwgAOB4AOR8AOgEHAAYBBwAGAwgAPx4AQB8AQQAAAAMIAD8eAEAfAEEBCgAFAQoABQMIAEYeAEcfAEgAAAADCABGHgBHHwBIAgMAAQoABQIDAAEKAAUFCABNHgBQHwBRQABOQQBPAAAAAAAFCABNHgBQHwBRQABOQQBPAAAAAwgAVx4AWB8AWQAAAAMIAFceAFgfAFkCCABftwGQAlwDCABetQGUAl22AZcCWwG0AQBcArUBmAIAtgGZAgABtwGaAgAAAAMIAGMeAGQfAGUAAAADCABjHgBkHwBlAAADCABqHgBrHwBsAAAAAwgAah4Aax8AbAG0AQBcAbQBAFwDCABxHgByHwBzAAAAAwgAcR4Ach8AcwwCAQ0oAQ4rAQ8sARAtARIvARMxDRQyDhU0ARY2DRc3Dxo4ARs5ARw6DSA9ECE-FCI_AiNAAiRBAiVCAiZDAidFAihHDSlIFSpKAitMDSxNFi1OAi5PAi9QDTBTFzFUGzJVAzNWAzRXAzVYAzZZAzdbAzhdDTleHDpgAztiDTxjHT1kAz5lAz9mDUJpHkNqJERrC0VsC0ZtC0duC0hvC0lxC0pzDUt0JUx2C014DU55Jk96C1B7C1F8DVJ_J1OAAS1UggEGVYMBBlaGAQZXhwEGWIgBBlmKAQZajAENW40BLlyPAQZdkQENXpIBL1-TAQZglAEGYZUBDWKYATBjmQE0ZJoBB2WbAQdmnAEHZ50BB2ieAQdpoAEHaqIBDWujATVspQEHbacBDW6oATZvqQEHcKoBB3GrAQ1yrgE3c68BO3SwAQV1sQEFdrIBBXezAQV4tAEFebYBBXq4AQ17uQE8fLsBBX29AQ1-vgE9f78BBYABwAEFgQHBAQ2CAcQBPoMBxQFChAHGAQmFAccBCYYByAEJhwHJAQmIAcoBCYkBzAEJigHOAQ2LAc8BQ4wB0QEJjQHTAQ2OAdQBRI8B1QEJkAHWAQmRAdcBDZIB2gFFkwHbAUmUAdwBBJUB3QEElgHeAQSXAd8BBJgB4AEEmQHiAQSaAeQBDZsB5QFKnAHnAQSdAekBDZ4B6gFLnwHrAQSgAewBBKEB7QENogHwAUyjAfEBUqQB8wFTpQH0AVOmAfcBU6cB-AFTqAH5AVOpAfsBU6oB_QENqwH-AVSsAYACU60BggINrgGDAlWvAYQCU7ABhQJTsQGGAg2yAYkCVrMBigJauAGMAlu5AZsCW7oBnAJbuwGdAlu8AZ4CW70BoAJbvgGiAg2_AaMCYMABpQJbwQGnAg3CAagCYcMBqQJbxAGqAlvFAasCDcYBrgJixwGvAmbIAbACXMkBsQJcygGyAlzLAbMCXMwBtAJczQG2AlzOAbgCDc8BuQJn0AG7AlzRAb0CDdIBvgJo0wG_AlzUAcACXNUBwQIN1gHEAmnXAcUCbdgBxgJd2QHHAl3aAcgCXdsByQJd3AHKAl3dAcwCXd4BzgIN3wHPAm7gAdECXeEB0wIN4gHUAm_jAdUCXeQB1gJd5QHXAg3mAdoCcOcB2wJ0"
|
|
47279
|
+
strings: JSON.parse('["where","orderBy","cursor","bag","permissions","tiddlers","recipes","template","_count","recipe_bags","recipe","tiddler_events","Bag.findUnique","Bag.findUniqueOrThrow","Bag.findFirst","Bag.findFirstOrThrow","Bag.findMany","data","Bag.createOne","Bag.createMany","Bag.createManyAndReturn","Bag.updateOne","Bag.updateMany","Bag.updateManyAndReturn","create","update","Bag.upsertOne","Bag.deleteOne","Bag.deleteMany","having","_min","_max","Bag.groupBy","Bag.aggregate","BagPermission.findUnique","BagPermission.findUniqueOrThrow","BagPermission.findFirst","BagPermission.findFirstOrThrow","BagPermission.findMany","BagPermission.createOne","BagPermission.createMany","BagPermission.createManyAndReturn","BagPermission.updateOne","BagPermission.updateMany","BagPermission.updateManyAndReturn","BagPermission.upsertOne","BagPermission.deleteOne","BagPermission.deleteMany","BagPermission.groupBy","BagPermission.aggregate","Tiddler.findUnique","Tiddler.findUniqueOrThrow","Tiddler.findFirst","Tiddler.findFirstOrThrow","Tiddler.findMany","Tiddler.createOne","Tiddler.createMany","Tiddler.createManyAndReturn","Tiddler.updateOne","Tiddler.updateMany","Tiddler.updateManyAndReturn","Tiddler.upsertOne","Tiddler.deleteOne","Tiddler.deleteMany","_avg","_sum","Tiddler.groupBy","Tiddler.aggregate","TiddlerEvent.findUnique","TiddlerEvent.findUniqueOrThrow","TiddlerEvent.findFirst","TiddlerEvent.findFirstOrThrow","TiddlerEvent.findMany","TiddlerEvent.createOne","TiddlerEvent.createMany","TiddlerEvent.createManyAndReturn","TiddlerEvent.updateOne","TiddlerEvent.updateMany","TiddlerEvent.updateManyAndReturn","TiddlerEvent.upsertOne","TiddlerEvent.deleteOne","TiddlerEvent.deleteMany","TiddlerEvent.groupBy","TiddlerEvent.aggregate","Template.findUnique","Template.findUniqueOrThrow","Template.findFirst","Template.findFirstOrThrow","Template.findMany","Template.createOne","Template.createMany","Template.createManyAndReturn","Template.updateOne","Template.updateMany","Template.updateManyAndReturn","Template.upsertOne","Template.deleteOne","Template.deleteMany","Template.groupBy","Template.aggregate","TemplatePermission.findUnique","TemplatePermission.findUniqueOrThrow","TemplatePermission.findFirst","TemplatePermission.findFirstOrThrow","TemplatePermission.findMany","TemplatePermission.createOne","TemplatePermission.createMany","TemplatePermission.createManyAndReturn","TemplatePermission.updateOne","TemplatePermission.updateMany","TemplatePermission.updateManyAndReturn","TemplatePermission.upsertOne","TemplatePermission.deleteOne","TemplatePermission.deleteMany","TemplatePermission.groupBy","TemplatePermission.aggregate","Recipe.findUnique","Recipe.findUniqueOrThrow","Recipe.findFirst","Recipe.findFirstOrThrow","Recipe.findMany","Recipe.createOne","Recipe.createMany","Recipe.createManyAndReturn","Recipe.updateOne","Recipe.updateMany","Recipe.updateManyAndReturn","Recipe.upsertOne","Recipe.deleteOne","Recipe.deleteMany","Recipe.groupBy","Recipe.aggregate","RecipePermission.findUnique","RecipePermission.findUniqueOrThrow","RecipePermission.findFirst","RecipePermission.findFirstOrThrow","RecipePermission.findMany","RecipePermission.createOne","RecipePermission.createMany","RecipePermission.createManyAndReturn","RecipePermission.updateOne","RecipePermission.updateMany","RecipePermission.updateManyAndReturn","RecipePermission.upsertOne","RecipePermission.deleteOne","RecipePermission.deleteMany","RecipePermission.groupBy","RecipePermission.aggregate","RecipeBag.findUnique","RecipeBag.findUniqueOrThrow","RecipeBag.findFirst","RecipeBag.findFirstOrThrow","RecipeBag.findMany","RecipeBag.createOne","RecipeBag.createMany","RecipeBag.createManyAndReturn","RecipeBag.updateOne","RecipeBag.updateMany","RecipeBag.updateManyAndReturn","RecipeBag.upsertOne","RecipeBag.deleteOne","RecipeBag.deleteMany","RecipeBag.groupBy","RecipeBag.aggregate","Settings.findUnique","Settings.findUniqueOrThrow","Settings.findFirst","Settings.findFirstOrThrow","Settings.findMany","Settings.createOne","Settings.createMany","Settings.createManyAndReturn","Settings.updateOne","Settings.updateMany","Settings.updateManyAndReturn","Settings.upsertOne","Settings.deleteOne","Settings.deleteMany","Settings.groupBy","Settings.aggregate","user","sessions","roles","users","Roles.findUnique","Roles.findUniqueOrThrow","Roles.findFirst","Roles.findFirstOrThrow","Roles.findMany","Roles.createOne","Roles.createMany","Roles.createManyAndReturn","Roles.updateOne","Roles.updateMany","Roles.updateManyAndReturn","Roles.upsertOne","Roles.deleteOne","Roles.deleteMany","Roles.groupBy","Roles.aggregate","Users.findUnique","Users.findUniqueOrThrow","Users.findFirst","Users.findFirstOrThrow","Users.findMany","Users.createOne","Users.createMany","Users.createManyAndReturn","Users.updateOne","Users.updateMany","Users.updateManyAndReturn","Users.upsertOne","Users.deleteOne","Users.deleteMany","Users.groupBy","Users.aggregate","Sessions.findUnique","Sessions.findUniqueOrThrow","Sessions.findFirst","Sessions.findFirstOrThrow","Sessions.findMany","Sessions.createOne","Sessions.createMany","Sessions.createManyAndReturn","Sessions.updateOne","Sessions.updateMany","Sessions.updateManyAndReturn","Sessions.upsertOne","Sessions.deleteOne","Sessions.deleteMany","Sessions.groupBy","Sessions.aggregate","AND","OR","NOT","session_id","created_at","last_accessed","session_key","user_id","equals","in","notIn","lt","lte","gt","gte","contains","startsWith","endsWith","not","username","email","password","resetCode","last_login","role_id","role_name","description","every","some","none","key","value","updated","recipe_id","bag_id","priority","is_writable","prefix","RecipePermissionLevel","level","id","slug","created","template_id","definition","plugins","compiledAt","string_contains","string_starts_with","string_ends_with","array_starts_with","array_ends_with","TemplatePermissionLevel","name","type","seq","title","TiddlerEventType","revision","fields","BagPermissionLevel","recipe_id_role_id","template_id_role_id","recipe_id_bag_id_is_writable_prefix","bag_id_title","bag_id_role_id","is","isNot","connectOrCreate","upsert","set","disconnect","delete","connect","updateMany","deleteMany","createMany","increment","decrement","multiply","divide"]'),
|
|
47280
|
+
graph: "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_AwAhoAIBAL4DACGiAgQA3wQAIaMCgAAAAAECAAAACQAgEQAAXwAgBogCQAC_AwAhigIBAL4DACGSAkAAvwMAIaACAQC-AwAhogIEAN8EACGjAoAAAAABAgAAAAcAIBEAAGEAIAIAAAAHACARAABhACADAAAACQAgGAAAWgAgGQAAXwAgAQAAAAkAIAEAAAAHACAFCAAA2gQAIB4AAN0EACAfAADcBAAgQAAA2wQAIEEAAN4EACAJ6AEAAJUDADDpAQAAaAAQ6gEAAJUDADCIAkAA3gIAIYoCAQDdAgAhkgJAAN4CACGgAgEA3QIAIaICBACWAwAhowIAAIYDACADAAAABwAgAQAAZwAwHQAAaAAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAAiACABAAAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgBQMAANkEACCKAgEAAAABngIAAACiAgKfAgIAAAABoAIBAAAAAQERAABwACAEigIBAAAAAZ4CAAAAogICnwICAAAAAaACAQAAAAEBEQAAcgAwAREAAHIAMAUDAADYBAAgigIBAL4DACGeAgAA1wSiAiKfAgIA_gMAIaACAQC-AwAhAgAAACIAIBEAAHUAIASKAgEAvgMAIZ4CAADXBKICIp8CAgD-AwAhoAIBAL4DACECAAAAIAAgEQAAdwAgAgAAACAAIBEAAHcAIAMAAAAiACAYAABwACAZAAB1ACABAAAAIgAgAQAAACAAIAUIAADSBAAgHgAA1QQAIB8AANQEACBAAADTBAAgQQAA1gQAIAfoAQAAkQMAMOkBAAB-ABDqAQAAkQMAMIoCAQDdAgAhngIAAJIDogIinwICAPsCACGgAgEA3QIAIQMAAAAgACABAAB9ADAdAAB-ACADAAAAIAAgAQAAIQAwAgAAIgAgCwQAAJADACAGAACPAwAg6AEAAI0DADDpAQAAhAEAEOoBAACNAwAwiAJAAPICACGQAgEAAAABkgJAAPICACGUAgAAjgMAIJ0CAQAAAAGeAgEA7gIAIQEAAACBAQAgAQAAAIEBACALBAAAkAMAIAYAAI8DACDoAQAAjQMAMOkBAACEAQAQ6gEAAI0DADCIAkAA8gIAIZACAQDuAgAhkgJAAPICACGUAgAAjgMAIJ0CAQDuAgAhngIBAO4CACECBAAA0QQAIAYAANAEACADAAAAhAEAIAEAAIUBADACAACBAQAgAwAAAIQBACABAACFAQAwAgAAgQEAIAMAAACEAQAgAQAAhQEAMAIAAIEBACAIBAAAzwQAIAYAAM4EACCIAkAAAAABkAIBAAAAAZICQAAAAAGUAoAAAAABnQIBAAAAAZ4CAQAAAAEBEQAAiQEAIAaIAkAAAAABkAIBAAAAAZICQAAAAAGUAoAAAAABnQIBAAAAAZ4CAQAAAAEBEQAAiwEAMAERAACLAQAwCAQAALUEACAGAAC0BAAgiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACECAAAAgQEAIBEAAI4BACAGiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACECAAAAhAEAIBEAAJABACACAAAAhAEAIBEAAJABACADAAAAgQEAIBgAAIkBACAZAACOAQAgAQAAAIEBACABAAAAhAEAIAMIAACxBAAgHgAAswQAIB8AALIEACAJ6AEAAIwDADDpAQAAlwEAEOoBAACMAwAwiAJAAN4CACGQAgEA3QIAIZICQADeAgAhlAIAAIYDACCdAgEA3QIAIZ4CAQDdAgAhAwAAAIQBACABAACWAQAwHQAAlwEAIAMAAACEAQAgAQAAhQEAMAIAAIEBACABAAAAFQAgAQAAABUAIAMAAAATACABAAAUADACAAAVACADAAAAEwAgAQAAFAAwAgAAFQAgAwAAABMAIAEAABQAMAIAABUAIAQHAACwBAAggAIBAAAAAY8CAAAAnQICkwIBAAAAAQERAACfAQAgA4ACAQAAAAGPAgAAAJ0CApMCAQAAAAEBEQAAoQEAMAERAAChAQAwBAcAAK8EACCAAgEAvgMAIY8CAACuBJ0CIpMCAQC-AwAhAgAAABUAIBEAAKQBACADgAIBAL4DACGPAgAArgSdAiKTAgEAvgMAIQIAAAATACARAACmAQAgAgAAABMAIBEAAKYBACADAAAAFQAgGAAAnwEAIBkAAKQBACABAAAAFQAgAQAAABMAIAMIAACrBAAgHgAArQQAIB8AAKwEACAG6AEAAIgDADDpAQAArQEAEOoBAACIAwAwgAIBAN0CACGPAgAAiQOdAiKTAgEA3QIAIQMAAAATACABAACsAQAwHQAArQEAIAMAAAATACABAAAUADACAAAVACABAAAAEQAgAQAAABEAIAMAAAAPACABAAAQADACAAARACADAAAADwAgAQAAEAAwAgAAEQAgAwAAAA8AIAEAABAAMAIAABEAIAsEAACqBAAgBwAAqAQAIAkAAKkEACCIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABkwIBAAAAAZQCgAAAAAGVAoAAAAABlgJAAAAAAQERAAC1AQAgCIgCQAAAAAGQAgEAAAABkQIBAAAAAZICQAAAAAGTAgEAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABAREAALcBADABEQAAtwEAMAsEAACPBAAgBwAAjQQAIAkAAI4EACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZMCAQC-AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQIAAAARACARAAC6AQAgCIgCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhkwIBAL4DACGUAoAAAAABlQKAAAAAAZYCQAC_AwAhAgAAAA8AIBEAALwBACACAAAADwAgEQAAvAEAIAMAAAARACAYAAC1AQAgGQAAugEAIAEAAAARACABAAAADwAgAwgAAIoEACAeAACMBAAgHwAAiwQAIAvoAQAAhQMAMOkBAADDAQAQ6gEAAIUDADCIAkAA3gIAIZACAQDdAgAhkQIBAN0CACGSAkAA3gIAIZMCAQDdAgAhlAIAAIYDACCVAgAAhgMAIJYCQADeAgAhAwAAAA8AIAEAAMIBADAdAADDAQAgAwAAAA8AIAEAABAAMAIAABEAIAEAAAAcACABAAAAHAAgAwAAABoAIAEAABsAMAIAABwAIAMAAAAaACABAAAbADACAAAcACADAAAAGgAgAQAAGwAwAgAAHAAgBAoAAIkEACCAAgEAAAABiQIBAAAAAY8CAAAAjwICAREAAMsBACADgAIBAAAAAYkCAQAAAAGPAgAAAI8CAgERAADNAQAwAREAAM0BADAECgAAiAQAIIACAQC-AwAhiQIBAL4DACGPAgAAhwSPAiICAAAAHAAgEQAA0AEAIAOAAgEAvgMAIYkCAQC-AwAhjwIAAIcEjwIiAgAAABoAIBEAANIBACACAAAAGgAgEQAA0gEAIAMAAAAcACAYAADLAQAgGQAA0AEAIAEAAAAcACABAAAAGgAgAwgAAIQEACAeAACGBAAgHwAAhQQAIAboAQAAgQMAMOkBAADZAQAQ6gEAAIEDADCAAgEA3QIAIYkCAQDdAgAhjwIAAIIDjwIiAwAAABoAIAEAANgBADAdAADZAQAgAwAAABoAIAEAABsAMAIAABwAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgBwMAAIMEACAKAACCBAAgiQIBAAAAAYoCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAEBEQAA4QEAIAWJAgEAAAABigIBAAAAAYsCAgAAAAGMAiAAAAABjQIBAAAAAQERAADjAQAwAREAAOMBADAHAwAAgQQAIAoAAIAEACCJAgEAvgMAIYoCAQC-AwAhiwICAP4DACGMAiAA_wMAIY0CAQC-AwAhAgAAAA0AIBEAAOYBACAFiQIBAL4DACGKAgEAvgMAIYsCAgD-AwAhjAIgAP8DACGNAgEAvgMAIQIAAAALACARAADoAQAgAgAAAAsAIBEAAOgBACADAAAADQAgGAAA4QEAIBkAAOYBACABAAAADQAgAQAAAAsAIAUIAAD5AwAgHgAA_AMAIB8AAPsDACBAAAD6AwAgQQAA_QMAIAjoAQAA-gIAMOkBAADvAQAQ6gEAAPoCADCJAgEA3QIAIYoCAQDdAgAhiwICAPsCACGMAiAA_AIAIY0CAQDdAgAhAwAAAAsAIAEAAO4BADAdAADvAQAgAwAAAAsAIAEAAAwAMAIAAA0AIAboAQAA-QIAMOkBAAD1AQAQ6gEAAPkCADCGAgEAAAABhwIBAO4CACGIAkAA8gIAIQEAAADyAQAgAQAAAPIBACAG6AEAAPkCADDpAQAA9QEAEOoBAAD5AgAwhgIBAO4CACGHAgEA7gIAIYgCQADyAgAhAAMAAAD1AQAgAQAA9gEAMAIAAPIBACADAAAA9QEAIAEAAPYBADACAADyAQAgAwAAAPUBACABAAD2AQAwAgAA8gEAIAOGAgEAAAABhwIBAAAAAYgCQAAAAAEBEQAA-gEAIAOGAgEAAAABhwIBAAAAAYgCQAAAAAEBEQAA_AEAMAERAAD8AQAwA4YCAQC-AwAhhwIBAL4DACGIAkAAvwMAIQIAAADyAQAgEQAA_wEAIAOGAgEAvgMAIYcCAQC-AwAhiAJAAL8DACECAAAA9QEAIBEAAIECACACAAAA9QEAIBEAAIECACADAAAA8gEAIBgAAPoBACAZAAD_AQAgAQAAAPIBACABAAAA9QEAIAMIAAD2AwAgHgAA-AMAIB8AAPcDACAG6AEAAPgCADDpAQAAiAIAEOoBAAD4AgAwhgIBAN0CACGHAgEA3QIAIYgCQADeAgAhAwAAAPUBACABAACHAgAwHQAAiAIAIAMAAAD1AQAgAQAA9gEAMAIAAPIBACAHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEAAAABgQIBAAAAAYICAQDvAgAhAQAAAIsCACAMtQEAAPYCACC2AQAA9wIAIOgBAAD0AgAw6QEAAI0CABDqAQAA9AIAMOwBQADyAgAh7wEBAO4CACH7AQEA7gIAIfwBAQDuAgAh_QEBAO4CACH-AQEA7wIAIf8BQAD1AgAhBLUBAAD0AwAgtgEAAPUDACD-AQAAugMAIP8BAAC6AwAgDLUBAAD2AgAgtgEAAPcCACDoAQAA9AIAMOkBAACNAgAQ6gEAAPQCADDsAUAA8gIAIe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQDuAgAh_gEBAAAAAf8BQAD1AgAhAwAAAI0CACABAACOAgAwAgAAjwIAIAm0AQAA8wIAIOgBAADxAgAw6QEAAJECABDqAQAA8QIAMOsBAQDuAgAh7AFAAPICACHtAUAA8gIAIe4BAQDvAgAh7wEBAO4CACECtAEAAPMDACDuAQAAugMAIAm0AQAA8wIAIOgBAADxAgAw6QEAAJECABDqAQAA8QIAMOsBAQAAAAHsAUAA8gIAIe0BQADyAgAh7gEBAO8CACHvAQEA7gIAIQMAAACRAgAgAQAAkgIAMAIAAJMCACAHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEA7gIAIYECAQDuAgAhggIBAO8CACECtwEAAPIDACCCAgAAugMAIAMAAACVAgAgAQAAlgIAMAIAAIsCACABAAAAkQIAIAEAAACVAgAgAQAAAI0CACABAAAAiwIAIAMAAACVAgAgAQAAlgIAMAIAAIsCACADAAAAlQIAIAEAAJYCADACAACLAgAgAwAAAJUCACABAACWAgAwAgAAiwIAIAS3AQAA8QMAIIACAQAAAAGBAgEAAAABggIBAAAAAQERAACfAgAgA4ACAQAAAAGBAgEAAAABggIBAAAAAQERAAChAgAwAREAAKECADAEtwEAAOUDACCAAgEAvgMAIYECAQC-AwAhggIBAMADACECAAAAiwIAIBEAAKQCACADgAIBAL4DACGBAgEAvgMAIYICAQDAAwAhAgAAAJUCACARAACmAgAgAgAAAJUCACARAACmAgAgAwAAAIsCACAYAACfAgAgGQAApAIAIAEAAACLAgAgAQAAAJUCACAECAAA4gMAIB4AAOQDACAfAADjAwAgggIAALoDACAG6AEAAOwCADDpAQAArQIAEOoBAADsAgAwgAIBAN0CACGBAgEA3QIAIYICAQDfAgAhAwAAAJUCACABAACsAgAwHQAArQIAIAMAAACVAgAgAQAAlgIAMAIAAIsCACABAAAAjwIAIAEAAACPAgAgAwAAAI0CACABAACOAgAwAgAAjwIAIAMAAACNAgAgAQAAjgIAMAIAAI8CACADAAAAjQIAIAEAAI4CADACAACPAgAgCbUBAADgAwAgtgEAAOEDACDsAUAAAAAB7wEBAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AUAAAAABAREAALUCACAH7AFAAAAAAe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wFAAAAAAQERAAC3AgAwAREAALcCADAJtQEAAMcDACC2AQAAyAMAIOwBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhAgAAAI8CACARAAC6AgAgB-wBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhAgAAAI0CACARAAC8AgAgAgAAAI0CACARAAC8AgAgAwAAAI8CACAYAAC1AgAgGQAAugIAIAEAAACPAgAgAQAAAI0CACAFCAAAwwMAIB4AAMUDACAfAADEAwAg_gEAALoDACD_AQAAugMAIAroAQAA6AIAMOkBAADDAgAQ6gEAAOgCADDsAUAA3gIAIe8BAQDdAgAh-wEBAN0CACH8AQEA3QIAIf0BAQDdAgAh_gEBAN8CACH_AUAA6QIAIQMAAACNAgAgAQAAwgIAMB0AAMMCACADAAAAjQIAIAEAAI4CADACAACPAgAgAQAAAJMCACABAAAAkwIAIAMAAACRAgAgAQAAkgIAMAIAAJMCACADAAAAkQIAIAEAAJICADACAACTAgAgAwAAAJECACABAACSAgAwAgAAkwIAIAa0AQAAwgMAIOsBAQAAAAHsAUAAAAAB7QFAAAAAAe4BAQAAAAHvAQEAAAABAREAAMsCACAF6wEBAAAAAewBQAAAAAHtAUAAAAAB7gEBAAAAAe8BAQAAAAEBEQAAzQIAMAERAADNAgAwBrQBAADBAwAg6wEBAL4DACHsAUAAvwMAIe0BQAC_AwAh7gEBAMADACHvAQEAvgMAIQIAAACTAgAgEQAA0AIAIAXrAQEAvgMAIewBQAC_AwAh7QFAAL8DACHuAQEAwAMAIe8BAQC-AwAhAgAAAJECACARAADSAgAgAgAAAJECACARAADSAgAgAwAAAJMCACAYAADLAgAgGQAA0AIAIAEAAACTAgAgAQAAAJECACAECAAAuwMAIB4AAL0DACAfAAC8AwAg7gEAALoDACAI6AEAANwCADDpAQAA2QIAEOoBAADcAgAw6wEBAN0CACHsAUAA3gIAIe0BQADeAgAh7gEBAN8CACHvAQEA3QIAIQMAAACRAgAgAQAA2AIAMB0AANkCACADAAAAkQIAIAEAAJICADACAACTAgAgCOgBAADcAgAw6QEAANkCABDqAQAA3AIAMOsBAQDdAgAh7AFAAN4CACHtAUAA3gIAIe4BAQDfAgAh7wEBAN0CACEOCAAA5AIAIB4AAOcCACAfAADnAgAg8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDmAgAhCwgAAOQCACAeAADlAgAgHwAA5QIAIPABQAAAAAHxAUAAAAAE8gFAAAAABPMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA4wIAIQ4IAADhAgAgHgAA4gIAIB8AAOICACDwAQEAAAAB8QEBAAAABfIBAQAAAAXzAQEAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAOACACEOCAAA4QIAIB4AAOICACAfAADiAgAg8AEBAAAAAfEBAQAAAAXyAQEAAAAF8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDgAgAhCPABAgAAAAHxAQIAAAAF8gECAAAABfMBAgAAAAH0AQIAAAAB9QECAAAAAfYBAgAAAAH6AQIA4QIAIQvwAQEAAAAB8QEBAAAABfIBAQAAAAXzAQEAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAOICACELCAAA5AIAIB4AAOUCACAfAADlAgAg8AFAAAAAAfEBQAAAAATyAUAAAAAE8wFAAAAAAfQBQAAAAAH1AUAAAAAB9gFAAAAAAfoBQADjAgAhCPABAgAAAAHxAQIAAAAE8gECAAAABPMBAgAAAAH0AQIAAAAB9QECAAAAAfYBAgAAAAH6AQIA5AIAIQjwAUAAAAAB8QFAAAAABPIBQAAAAATzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOUCACEOCAAA5AIAIB4AAOcCACAfAADnAgAg8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDmAgAhC_ABAQAAAAHxAQEAAAAE8gEBAAAABPMBAQAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQEA5wIAIQroAQAA6AIAMOkBAADDAgAQ6gEAAOgCADDsAUAA3gIAIe8BAQDdAgAh-wEBAN0CACH8AQEA3QIAIf0BAQDdAgAh_gEBAN8CACH_AUAA6QIAIQsIAADhAgAgHgAA6wIAIB8AAOsCACDwAUAAAAAB8QFAAAAABfIBQAAAAAXzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOoCACELCAAA4QIAIB4AAOsCACAfAADrAgAg8AFAAAAAAfEBQAAAAAXyAUAAAAAF8wFAAAAAAfQBQAAAAAH1AUAAAAAB9gFAAAAAAfoBQADqAgAhCPABQAAAAAHxAUAAAAAF8gFAAAAABfMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA6wIAIQboAQAA7AIAMOkBAACtAgAQ6gEAAOwCADCAAgEA3QIAIYECAQDdAgAhggIBAN8CACEHtwEAAPACACDoAQAA7QIAMOkBAACVAgAQ6gEAAO0CADCAAgEA7gIAIYECAQDuAgAhggIBAO8CACEL8AEBAAAAAfEBAQAAAATyAQEAAAAE8wEBAAAAAfQBAQAAAAH1AQEAAAAB9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQDnAgAhC_ABAQAAAAHxAQEAAAAF8gEBAAAABfMBAQAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQEA4gIAIQODAgAAjQIAIIQCAACNAgAghQIAAI0CACAJtAEAAPMCACDoAQAA8QIAMOkBAACRAgAQ6gEAAPECADDrAQEA7gIAIewBQADyAgAh7QFAAPICACHuAQEA7wIAIe8BAQDuAgAhCPABQAAAAAHxAUAAAAAE8gFAAAAABPMBQAAAAAH0AUAAAAAB9QFAAAAAAfYBQAAAAAH6AUAA5QIAIQ61AQAA9gIAILYBAAD3AgAg6AEAAPQCADDpAQAAjQIAEOoBAAD0AgAw7AFAAPICACHvAQEA7gIAIfsBAQDuAgAh_AEBAO4CACH9AQEA7gIAIf4BAQDvAgAh_wFAAPUCACGqAgAAjQIAIKsCAACNAgAgDLUBAAD2AgAgtgEAAPcCACDoAQAA9AIAMOkBAACNAgAQ6gEAAPQCADDsAUAA8gIAIe8BAQDuAgAh-wEBAO4CACH8AQEA7gIAIf0BAQDuAgAh_gEBAO8CACH_AUAA9QIAIQjwAUAAAAAB8QFAAAAABfIBQAAAAAXzAUAAAAAB9AFAAAAAAfUBQAAAAAH2AUAAAAAB-gFAAOsCACEDgwIAAJECACCEAgAAkQIAIIUCAACRAgAgA4MCAACVAgAghAIAAJUCACCFAgAAlQIAIAboAQAA-AIAMOkBAACIAgAQ6gEAAPgCADCGAgEA3QIAIYcCAQDdAgAhiAJAAN4CACEG6AEAAPkCADDpAQAA9QEAEOoBAAD5AgAwhgIBAO4CACGHAgEA7gIAIYgCQADyAgAhCOgBAAD6AgAw6QEAAO8BABDqAQAA-gIAMIkCAQDdAgAhigIBAN0CACGLAgIA-wIAIYwCIAD8AgAhjQIBAN0CACENCAAA5AIAIB4AAOQCACAfAADkAgAgQAAAgAMAIEEAAOQCACDwAQIAAAAB8QECAAAABPIBAgAAAATzAQIAAAAB9AECAAAAAfUBAgAAAAH2AQIAAAAB-gECAP8CACEFCAAA5AIAIB4AAP4CACAfAAD-AgAg8AEgAAAAAfoBIAD9AgAhBQgAAOQCACAeAAD-AgAgHwAA_gIAIPABIAAAAAH6ASAA_QIAIQLwASAAAAAB-gEgAP4CACENCAAA5AIAIB4AAOQCACAfAADkAgAgQAAAgAMAIEEAAOQCACDwAQIAAAAB8QECAAAABPIBAgAAAATzAQIAAAAB9AECAAAAAfUBAgAAAAH2AQIAAAAB-gECAP8CACEI8AEIAAAAAfEBCAAAAATyAQgAAAAE8wEIAAAAAfQBCAAAAAH1AQgAAAAB9gEIAAAAAfoBCACAAwAhBugBAACBAwAw6QEAANkBABDqAQAAgQMAMIACAQDdAgAhiQIBAN0CACGPAgAAggOPAiIHCAAA5AIAIB4AAIQDACAfAACEAwAg8AEAAACPAgLxAQAAAI8CCPIBAAAAjwII-gEAAIMDjwIiBwgAAOQCACAeAACEAwAgHwAAhAMAIPABAAAAjwIC8QEAAACPAgjyAQAAAI8CCPoBAACDA48CIgTwAQAAAI8CAvEBAAAAjwII8gEAAACPAgj6AQAAhAOPAiIL6AEAAIUDADDpAQAAwwEAEOoBAACFAwAwiAJAAN4CACGQAgEA3QIAIZECAQDdAgAhkgJAAN4CACGTAgEA3QIAIZQCAACGAwAglQIAAIYDACCWAkAA3gIAIQoIAADkAgAgHgAAhwMAIB8AAIcDACDwAYAAAAAB-gGAAAAAAZcCAQAAAAGYAgEAAAABmQIBAAAAAZoCgAAAAAGbAoAAAAABB_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_gIAIQKKAgEAAAABoAIBAAAAAQoDAAClAwAg6AEAALUDADDpAQAABwAQ6gEAALUDADCIAkAA8gIAIYoCAQDuAgAhkgJAAPICACGgAgEA7gIAIaICBAC2AwAhowIAAI4DACAI8AEEAAAAAfEBBAAAAATyAQQAAAAE8wEEAAAAAfQBBAAAAAH1AQQAAAAB9gEEAAAAAfoBBACYAwAhAoACAQAAAAGKAgEAAAABBwMAAKUDACDoAQAAuAMAMOkBAAADABDqAQAAuAMAMIACAQDuAgAhigIBAO4CACGPAgAAuQOlAiIE8AEAAAClAgLxAQAAAKUCCPIBAAAApQII-gEAAJwDpQIiAAAAAAGuAgEAAAABAa4CQAAAAAEBrgIBAAAAAQUYAADZBQAgGQAA3AUAIKwCAADaBQAgrQIAANsFACCxAgAAjwIAIAMYAADZBQAgrAIAANoFACCxAgAAjwIAIAAAAAGuAkAAAAABCxgAANQDADAZAADZAwAwrAIAANUDADCtAgAA1gMAMK4CAADYAwAwrwIAANgDADCwAgAA2AMAMLECAADYAwAwsgIAANoDADCzAgAA2wMAMLQCAADXAwAgChgAAMkDADAZAADNAwAwrAIAAMoDADCtAgAAywMAMK4CAADMAwAwrwIAAMwDADCwAgAAzAMAMLECAADMAwAwsgIAAM4DADCzAgAAzwMAMAOAAgEAAAABgQIBAAAAAYICAQAAAAECAAAAiwIAIBgAANMDACADAAAAiwIAIBgAANMDACAZAADSAwAgB7cBAADwAgAg6AEAAO0CADDpAQAAlQIAEOoBAADtAgAwgAIBAAAAAYECAQAAAAGCAgEA7wIAIQIAAACLAgAgEQAA0gMAIAIAAADQAwAgEQAA0QMAIAboAQAAzwMAMOkBAADQAwAQ6gEAAM8DADCAAgEA7gIAIYECAQDuAgAhggIBAO8CACEG6AEAAM8DADDpAQAA0AMAEOoBAADPAwAwgAIBAO4CACGBAgEA7gIAIYICAQDvAgAhA4ACAQC-AwAhgQIBAL4DACGCAgEAwAMAIQOAAgEAvgMAIYECAQC-AwAhggIBAMADACEDgAIBAAAAAYECAQAAAAGCAgEAAAABBOsBAQAAAAHsAUAAAAAB7QFAAAAAAe4BAQAAAAECAAAAkwIAIBgAAN8DACADAAAAkwIAIBgAAN8DACAZAADeAwAgAREAANgFADAJtAEAAPMCACDoAQAA8QIAMOkBAACRAgAQ6gEAAPECADDrAQEAAAAB7AFAAPICACHtAUAA8gIAIe4BAQDvAgAh7wEBAO4CACECAAAAkwIAIBEAAN4DACACAAAA3AMAIBEAAN0DACAI6AEAANsDADDpAQAA3AMAEOoBAADbAwAw6wEBAO4CACHsAUAA8gIAIe0BQADyAgAh7gEBAO8CACHvAQEA7gIAIQjoAQAA2wMAMOkBAADcAwAQ6gEAANsDADDrAQEA7gIAIewBQADyAgAh7QFAAPICACHuAQEA7wIAIe8BAQDuAgAhBOsBAQC-AwAh7AFAAL8DACHtAUAAvwMAIe4BAQDAAwAhBOsBAQC-AwAh7AFAAL8DACHtAUAAvwMAIe4BAQDAAwAhBOsBAQAAAAHsAUAAAAAB7QFAAAAAAe4BAQAAAAEEGAAA1AMAMKwCAADVAwAwsQIAANgDADC0AgAA1wMAIAMYAADJAwAwrAIAAMoDADCxAgAAzAMAMAAAAAoYAADmAwAwGQAA6gMAMKwCAADnAwAwrQIAAOgDADCuAgAA6QMAMK8CAADpAwAwsAIAAOkDADCxAgAA6QMAMLICAADrAwAwswIAAOwDADAItQEAAOADACDsAUAAAAAB7wEBAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AUAAAAABAgAAAI8CACAYAADwAwAgAwAAAI8CACAYAADwAwAgGQAA7wMAIAy1AQAA9gIAILYBAAD3AgAg6AEAAPQCADDpAQAAjQIAEOoBAAD0AgAw7AFAAPICACHvAQEAAAAB-wEBAAAAAfwBAQAAAAH9AQEA7gIAIf4BAQAAAAH_AUAA9QIAIQIAAACPAgAgEQAA7wMAIAIAAADtAwAgEQAA7gMAIAroAQAA7AMAMOkBAADtAwAQ6gEAAOwDADDsAUAA8gIAIe8BAQDuAgAh-wEBAO4CACH8AQEA7gIAIf0BAQDuAgAh_gEBAO8CACH_AUAA9QIAIQroAQAA7AMAMOkBAADtAwAQ6gEAAOwDADDsAUAA8gIAIe8BAQDuAgAh-wEBAO4CACH8AQEA7gIAIf0BAQDuAgAh_gEBAO8CACH_AUAA9QIAIQfsAUAAvwMAIe8BAQC-AwAh-wEBAL4DACH8AQEAvgMAIf0BAQC-AwAh_gEBAMADACH_AUAAxgMAIQi1AQAAxwMAIOwBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhCLUBAADgAwAg7AFAAAAAAe8BAQAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wFAAAAAAQMYAADmAwAwrAIAAOcDADCxAgAA6QMAMAAEtQEAAPQDACC2AQAA9QMAIP4BAAC6AwAg_wEAALoDACAAAAAAAAAAAAAABa4CAgAAAAG1AgIAAAABtgICAAAAAbcCAgAAAAG4AgIAAAABAa4CIAAAAAEFGAAA0AUAIBkAANYFACCsAgAA0QUAIK0CAADVBQAgsQIAABEAIAUYAADOBQAgGQAA0wUAIKwCAADPBQAgrQIAANIFACCxAgAAAQAgAxgAANAFACCsAgAA0QUAILECAAARACADGAAAzgUAIKwCAADPBQAgsQIAAAEAIAAAAAGuAgAAAI8CAgUYAADJBQAgGQAAzAUAIKwCAADKBQAgrQIAAMsFACCxAgAAEQAgAxgAAMkFACCsAgAAygUAILECAAARACAAAAAFGAAAwgUAIBkAAMcFACCsAgAAwwUAIK0CAADGBQAgsQIAAIEBACALGAAAnAQAMBkAAKEEADCsAgAAnQQAMK0CAACeBAAwrgIAAKAEADCvAgAAoAQAMLACAACgBAAwsQIAAKAEADCyAgAAogQAMLMCAACjBAAwtAIAAJ8EACALGAAAkAQAMBkAAJUEADCsAgAAkQQAMK0CAACSBAAwrgIAAJQEADCvAgAAlAQAMLACAACUBAAwsQIAAJQEADCyAgAAlgQAMLMCAACXBAAwtAIAAJMEACACgAIBAAAAAY8CAAAAjwICAgAAABwAIBgAAJsEACADAAAAHAAgGAAAmwQAIBkAAJoEACABEQAAxQUAMAgKAACqAwAg6AEAAKgDADDpAQAAGgAQ6gEAAKgDADCAAgEA7gIAIYkCAQDuAgAhjwIAAKkDjwIipQIAAKcDACACAAAAHAAgEQAAmgQAIAIAAACYBAAgEQAAmQQAIAboAQAAlwQAMOkBAACYBAAQ6gEAAJcEADCAAgEA7gIAIYkCAQDuAgAhjwIAAKkDjwIiBugBAACXBAAw6QEAAJgEABDqAQAAlwQAMIACAQDuAgAhiQIBAO4CACGPAgAAqQOPAiICgAIBAL4DACGPAgAAhwSPAiICgAIBAL4DACGPAgAAhwSPAiICgAIBAAAAAY8CAAAAjwICBQMAAIMEACCKAgEAAAABiwICAAAAAYwCIAAAAAGNAgEAAAABAgAAAA0AIBgAAKcEACADAAAADQAgGAAApwQAIBkAAKYEACABEQAAxAUAMAsDAAClAwAgCgAAqgMAIOgBAACyAwAw6QEAAAsAEOoBAACyAwAwiQIBAO4CACGKAgEA7gIAIYsCAgCmAwAhjAIgALMDACGNAgEA7gIAIacCAACxAwAgAgAAAA0AIBEAAKYEACACAAAApAQAIBEAAKUEACAI6AEAAKMEADDpAQAApAQAEOoBAACjBAAwiQIBAO4CACGKAgEA7gIAIYsCAgCmAwAhjAIgALMDACGNAgEA7gIAIQjoAQAAowQAMOkBAACkBAAQ6gEAAKMEADCJAgEA7gIAIYoCAQDuAgAhiwICAKYDACGMAiAAswMAIY0CAQDuAgAhBIoCAQC-AwAhiwICAP4DACGMAiAA_wMAIY0CAQC-AwAhBQMAAIEEACCKAgEAvgMAIYsCAgD-AwAhjAIgAP8DACGNAgEAvgMAIQUDAACDBAAgigIBAAAAAYsCAgAAAAGMAiAAAAABjQIBAAAAAQMYAADCBQAgrAIAAMMFACCxAgAAgQEAIAQYAACcBAAwrAIAAJ0EADCxAgAAoAQAMLQCAACfBAAgBBgAAJAEADCsAgAAkQQAMLECAACUBAAwtAIAAJMEACAAAAABrgIAAACdAgIFGAAAvQUAIBkAAMAFACCsAgAAvgUAIK0CAAC_BQAgsQIAAIEBACADGAAAvQUAIKwCAAC-BQAgsQIAAIEBACAAAAALGAAAwgQAMBkAAMcEADCsAgAAwwQAMK0CAADEBAAwrgIAAMYEADCvAgAAxgQAMLACAADGBAAwsQIAAMYEADCyAgAAyAQAMLMCAADJBAAwtAIAAMUEACALGAAAtgQAMBkAALsEADCsAgAAtwQAMK0CAAC4BAAwrgIAALoEADCvAgAAugQAMLACAAC6BAAwsQIAALoEADCyAgAAvAQAMLMCAAC9BAAwtAIAALkEACACgAIBAAAAAY8CAAAAnQICAgAAABUAIBgAAMEEACADAAAAFQAgGAAAwQQAIBkAAMAEACABEQAAvAUAMAgHAACuAwAg6AEAAKwDADDpAQAAEwAQ6gEAAKwDADCAAgEA7gIAIY8CAACtA50CIpMCAQDuAgAhpgIAAKsDACACAAAAFQAgEQAAwAQAIAIAAAC-BAAgEQAAvwQAIAboAQAAvQQAMOkBAAC-BAAQ6gEAAL0EADCAAgEA7gIAIY8CAACtA50CIpMCAQDuAgAhBugBAAC9BAAw6QEAAL4EABDqAQAAvQQAMIACAQDuAgAhjwIAAK0DnQIikwIBAO4CACECgAIBAL4DACGPAgAArgSdAiICgAIBAL4DACGPAgAArgSdAiICgAIBAAAAAY8CAAAAnQICCQQAAKoEACAJAACpBAAgiAJAAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAZQCgAAAAAGVAoAAAAABlgJAAAAAAQIAAAARACAYAADNBAAgAwAAABEAIBgAAM0EACAZAADMBAAgAREAALsFADAOBAAAsAMAIAcAAK4DACAJAAChAwAg6AEAAK8DADDpAQAADwAQ6gEAAK8DADCIAkAA8gIAIZACAQAAAAGRAgEAAAABkgJAAPICACGTAgEA7gIAIZQCAACOAwAglQIAAI4DACCWAkAA8gIAIQIAAAARACARAADMBAAgAgAAAMoEACARAADLBAAgC-gBAADJBAAw6QEAAMoEABDqAQAAyQQAMIgCQADyAgAhkAIBAO4CACGRAgEA7gIAIZICQADyAgAhkwIBAO4CACGUAgAAjgMAIJUCAACOAwAglgJAAPICACEL6AEAAMkEADDpAQAAygQAEOoBAADJBAAwiAJAAPICACGQAgEA7gIAIZECAQDuAgAhkgJAAPICACGTAgEA7gIAIZQCAACOAwAglQIAAI4DACCWAkAA8gIAIQeIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZQCgAAAAAGVAoAAAAABlgJAAL8DACEJBAAAjwQAIAkAAI4EACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZQCgAAAAAGVAoAAAAABlgJAAL8DACEJBAAAqgQAIAkAAKkEACCIAkAAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABBBgAAMIEADCsAgAAwwQAMLECAADGBAAwtAIAAMUEACAEGAAAtgQAMKwCAAC3BAAwsQIAALoEADC0AgAAuQQAIAAAAAAAAAABrgIAAACiAgIFGAAAtgUAIBkAALkFACCsAgAAtwUAIK0CAAC4BQAgsQIAAAEAIAMYAAC2BQAgrAIAALcFACCxAgAAAQAgAAAAAAAFrgIEAAAAAbUCBAAAAAG2AgQAAAABtwIEAAAAAbgCBAAAAAEFGAAAsQUAIBkAALQFACCsAgAAsgUAIK0CAACzBQAgsQIAAAEAIAMYAACxBQAgrAIAALIFACCxAgAAAQAgAAAAAa4CAAAApQICBRgAAKwFACAZAACvBQAgrAIAAK0FACCtAgAArgUAILECAAABACADGAAArAUAIKwCAACtBQAgsQIAAAEAIAAAAAsYAACQBQAwGQAAlQUAMKwCAACRBQAwrQIAAJIFADCuAgAAlAUAMK8CAACUBQAwsAIAAJQFADCxAgAAlAUAMLICAACWBQAwswIAAJcFADC0AgAAkwUAIAsYAACEBQAwGQAAiQUAMKwCAACFBQAwrQIAAIYFADCuAgAAiAUAMK8CAACIBQAwsAIAAIgFADCxAgAAiAUAMLICAACKBQAwswIAAIsFADC0AgAAhwUAIAsYAAD7BAAwGQAA_wQAMKwCAAD8BAAwrQIAAP0EADCuAgAAoAQAMK8CAACgBAAwsAIAAKAEADCxAgAAoAQAMLICAACABQAwswIAAKMEADC0AgAA_gQAIAsYAADvBAAwGQAA9AQAMKwCAADwBAAwrQIAAPEEADCuAgAA8wQAMK8CAADzBAAwsAIAAPMEADCxAgAA8wQAMLICAAD1BAAwswIAAPYEADC0AgAA8gQAIAOeAgAAAKICAp8CAgAAAAGgAgEAAAABAgAAACIAIBgAAPoEACADAAAAIgAgGAAA-gQAIBkAAPkEACABEQAAqwUAMAgDAAClAwAg6AEAAKMDADDpAQAAIAAQ6gEAAKMDADCKAgEA7gIAIZ4CAACkA6ICIp8CAgAAAAGgAgEA7gIAIQIAAAAiACARAAD5BAAgAgAAAPcEACARAAD4BAAgB-gBAAD2BAAw6QEAAPcEABDqAQAA9gQAMIoCAQDuAgAhngIAAKQDogIinwICAKYDACGgAgEA7gIAIQfoAQAA9gQAMOkBAAD3BAAQ6gEAAPYEADCKAgEA7gIAIZ4CAACkA6ICIp8CAgCmAwAhoAIBAO4CACEDngIAANcEogIinwICAP4DACGgAgEAvgMAIQOeAgAA1wSiAiKfAgIA_gMAIaACAQC-AwAhA54CAAAAogICnwICAAAAAaACAQAAAAEFCgAAggQAIIkCAQAAAAGLAgIAAAABjAIgAAAAAY0CAQAAAAECAAAADQAgGAAAgwUAIAMAAAANACAYAACDBQAgGQAAggUAIAERAACqBQAwAgAAAA0AIBEAAIIFACACAAAApAQAIBEAAIEFACAEiQIBAL4DACGLAgIA_gMAIYwCIAD_AwAhjQIBAL4DACEFCgAAgAQAIIkCAQC-AwAhiwICAP4DACGMAiAA_wMAIY0CAQC-AwAhBQoAAIIEACCJAgEAAAABiwICAAAAAYwCIAAAAAGNAgEAAAABBYgCQAAAAAGSAkAAAAABoAIBAAAAAaICBAAAAAGjAoAAAAABAgAAAAkAIBgAAI8FACADAAAACQAgGAAAjwUAIBkAAI4FACABEQAAqQUAMAsDAAClAwAg6AEAALUDADDpAQAABwAQ6gEAALUDADCIAkAA8gIAIYoCAQDuAgAhkgJAAPICACGgAgEA7gIAIaICBAC2AwAhowIAAI4DACCoAgAAtAMAIAIAAAAJACARAACOBQAgAgAAAIwFACARAACNBQAgCegBAACLBQAw6QEAAIwFABDqAQAAiwUAMIgCQADyAgAhigIBAO4CACGSAkAA8gIAIaACAQDuAgAhogIEALYDACGjAgAAjgMAIAnoAQAAiwUAMOkBAACMBQAQ6gEAAIsFADCIAkAA8gIAIYoCAQDuAgAhkgJAAPICACGgAgEA7gIAIaICBAC2AwAhowIAAI4DACAFiAJAAL8DACGSAkAAvwMAIaACAQC-AwAhogIEAN8EACGjAoAAAAABBYgCQAC_AwAhkgJAAL8DACGgAgEAvgMAIaICBADfBAAhowKAAAAAAQWIAkAAAAABkgJAAAAAAaACAQAAAAGiAgQAAAABowKAAAAAAQKAAgEAAAABjwIAAAClAgICAAAABQAgGAAAmwUAIAMAAAAFACAYAACbBQAgGQAAmgUAIAERAACoBQAwCAMAAKUDACDoAQAAuAMAMOkBAAADABDqAQAAuAMAMIACAQDuAgAhigIBAO4CACGPAgAAuQOlAiKpAgAAtwMAIAIAAAAFACARAACaBQAgAgAAAJgFACARAACZBQAgBugBAACXBQAw6QEAAJgFABDqAQAAlwUAMIACAQDuAgAhigIBAO4CACGPAgAAuQOlAiIG6AEAAJcFADDpAQAAmAUAEOoBAACXBQAwgAIBAO4CACGKAgEA7gIAIY8CAAC5A6UCIgKAAgEAvgMAIY8CAADlBKUCIgKAAgEAvgMAIY8CAADlBKUCIgKAAgEAAAABjwIAAAClAgIEGAAAkAUAMKwCAACRBQAwsQIAAJQFADC0AgAAkwUAIAQYAACEBQAwrAIAAIUFADCxAgAAiAUAMLQCAACHBQAgBBgAAPsEADCsAgAA_AQAMLECAACgBAAwtAIAAP4EACAEGAAA7wQAMKwCAADwBAAwsQIAAPMEADC0AgAA8gQAIAAAAAAEBAAAoAUAIAUAAKEFACAJAACiBQAgCwAAowUAIAMEAACnBQAgBwAApgUAIAkAAKIFACACBAAA0QQAIAYAANAEACAAAoACAQAAAAGPAgAAAKUCAgWIAkAAAAABkgJAAAAAAaACAQAAAAGiAgQAAAABowKAAAAAAQSJAgEAAAABiwICAAAAAYwCIAAAAAGNAgEAAAABA54CAAAAogICnwICAAAAAaACAQAAAAEIBQAAnQUAIAkAAJ4FACALAACfBQAgggIBAAAAAYgCQAAAAAGQAgEAAAABkgJAAAAAAZ0CAQAAAAECAAAAAQAgGAAArAUAIAMAAAApACAYAACsBQAgGQAAsAUAIAoAAAApACAFAADsBAAgCQAA7QQAIAsAAO4EACARAACwBQAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQgFAADsBAAgCQAA7QQAIAsAAO4EACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhCAQAAJwFACAJAACeBQAgCwAAnwUAIIICAQAAAAGIAkAAAAABkAIBAAAAAZICQAAAAAGdAgEAAAABAgAAAAEAIBgAALEFACADAAAAKQAgGAAAsQUAIBkAALUFACAKAAAAKQAgBAAA6wQAIAkAAO0EACALAADuBAAgEQAAtQUAIIICAQC-AwAhiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhnQIBAL4DACEIBAAA6wQAIAkAAO0EACALAADuBAAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQgEAACcBQAgBQAAnQUAIAkAAJ4FACCCAgEAAAABiAJAAAAAAZACAQAAAAGSAkAAAAABnQIBAAAAAQIAAAABACAYAAC2BQAgAwAAACkAIBgAALYFACAZAAC6BQAgCgAAACkAIAQAAOsEACAFAADsBAAgCQAA7QQAIBEAALoFACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhCAQAAOsEACAFAADsBAAgCQAA7QQAIIICAQC-AwAhiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhnQIBAL4DACEHiAJAAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAZQCgAAAAAGVAoAAAAABlgJAAAAAAQKAAgEAAAABjwIAAACdAgIHBgAAzgQAIIgCQAAAAAGQAgEAAAABkgJAAAAAAZQCgAAAAAGdAgEAAAABngIBAAAAAQIAAACBAQAgGAAAvQUAIAMAAACEAQAgGAAAvQUAIBkAAMEFACAJAAAAhAEAIAYAALQEACARAADBBQAgiAJAAL8DACGQAgEAvgMAIZICQAC_AwAhlAKAAAAAAZ0CAQC-AwAhngIBAL4DACEHBgAAtAQAIIgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZQCgAAAAAGdAgEAvgMAIZ4CAQC-AwAhBwQAAM8EACCIAkAAAAABkAIBAAAAAZICQAAAAAGUAoAAAAABnQIBAAAAAZ4CAQAAAAECAAAAgQEAIBgAAMIFACAEigIBAAAAAYsCAgAAAAGMAiAAAAABjQIBAAAAAQKAAgEAAAABjwIAAACPAgIDAAAAhAEAIBgAAMIFACAZAADIBQAgCQAAAIQBACAEAAC1BAAgEQAAyAUAIIgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZQCgAAAAAGdAgEAvgMAIZ4CAQC-AwAhBwQAALUEACCIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGUAoAAAAABnQIBAL4DACGeAgEAvgMAIQoHAACoBAAgCQAAqQQAIIgCQAAAAAGQAgEAAAABkQIBAAAAAZICQAAAAAGTAgEAAAABlAKAAAAAAZUCgAAAAAGWAkAAAAABAgAAABEAIBgAAMkFACADAAAADwAgGAAAyQUAIBkAAM0FACAMAAAADwAgBwAAjQQAIAkAAI4EACARAADNBQAgiAJAAL8DACGQAgEAvgMAIZECAQC-AwAhkgJAAL8DACGTAgEAvgMAIZQCgAAAAAGVAoAAAAABlgJAAL8DACEKBwAAjQQAIAkAAI4EACCIAkAAvwMAIZACAQC-AwAhkQIBAL4DACGSAkAAvwMAIZMCAQC-AwAhlAKAAAAAAZUCgAAAAAGWAkAAvwMAIQgEAACcBQAgBQAAnQUAIAsAAJ8FACCCAgEAAAABiAJAAAAAAZACAQAAAAGSAkAAAAABnQIBAAAAAQIAAAABACAYAADOBQAgCgQAAKoEACAHAACoBAAgiAJAAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAZMCAQAAAAGUAoAAAAABlQKAAAAAAZYCQAAAAAECAAAAEQAgGAAA0AUAIAMAAAApACAYAADOBQAgGQAA1AUAIAoAAAApACAEAADrBAAgBQAA7AQAIAsAAO4EACARAADUBQAgggIBAL4DACGIAkAAvwMAIZACAQC-AwAhkgJAAL8DACGdAgEAvgMAIQgEAADrBAAgBQAA7AQAIAsAAO4EACCCAgEAvgMAIYgCQAC_AwAhkAIBAL4DACGSAkAAvwMAIZ0CAQC-AwAhAwAAAA8AIBgAANAFACAZAADXBQAgDAAAAA8AIAQAAI8EACAHAACNBAAgEQAA1wUAIIgCQAC_AwAhkAIBAL4DACGRAgEAvgMAIZICQAC_AwAhkwIBAL4DACGUAoAAAAABlQKAAAAAAZYCQAC_AwAhCgQAAI8EACAHAACNBAAgiAJAAL8DACGQAgEAvgMAIZECAQC-AwAhkgJAAL8DACGTAgEAvgMAIZQCgAAAAAGVAoAAAAABlgJAAL8DACEE6wEBAAAAAewBQAAAAAHtAUAAAAAB7gEBAAAAAQi2AQAA4QMAIOwBQAAAAAHvAQEAAAAB-wEBAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BQAAAAAECAAAAjwIAIBgAANkFACADAAAAjQIAIBgAANkFACAZAADdBQAgCgAAAI0CACARAADdBQAgtgEAAMgDACDsAUAAvwMAIe8BAQC-AwAh-wEBAL4DACH8AQEAvgMAIf0BAQC-AwAh_gEBAMADACH_AUAAxgMAIQi2AQAAyAMAIOwBQAC_AwAh7wEBAL4DACH7AQEAvgMAIfwBAQC-AwAh_QEBAL4DACH-AQEAwAMAIf8BQADGAwAhBQQGAgUKAwgADAkOBAsjCwEDAAEBAwABAgMAAQoABQQEHQkHAAYIAAoJGQQDBBYHBhIFCAAIAQcABgIEGAAGFwABCgAFAgQfAAkeAAEDAAEEBCQABSUACSYACycAAAAAAwgAER4AEh8AEwAAAAMIABEeABIfABMBAwABAQMAAQMIABgeABkfABoAAAADCAAYHgAZHwAaAQMAAQEDAAEFCAAfHgAiHwAjQAAgQQAhAAAAAAAFCAAfHgAiHwAjQAAgQQAhAQMAAQEDAAEFCAAoHgArHwAsQAApQQAqAAAAAAAFCAAoHgArHwAsQAApQQAqAAADCAAxHgAyHwAzAAAAAwgAMR4AMh8AMwEHAAYBBwAGAwgAOB4AOR8AOgAAAAMIADgeADkfADoBBwAGAQcABgMIAD8eAEAfAEEAAAADCAA_HgBAHwBBAQoABQEKAAUDCABGHgBHHwBIAAAAAwgARh4ARx8ASAIDAAEKAAUCAwABCgAFBQgATR4AUB8AUUAATkEATwAAAAAABQgATR4AUB8AUUAATkEATwAAAAMIAFceAFgfAFkAAAADCABXHgBYHwBZAggAX7cBkAJcAwgAXrUBlAJdtgGXAlsBtAEAXAK1AZgCALYBmQIAAbcBmgIAAAADCABjHgBkHwBlAAAAAwgAYx4AZB8AZQAAAwgAah4Aax8AbAAAAAMIAGoeAGsfAGwBtAEAXAG0AQBcAwgAcR4Ach8AcwAAAAMIAHEeAHIfAHMMAgENKAEOKwEPLAEQLQESLwETMQ0UMg4VNAEWNg0XNw8aOAEbOQEcOg0gPRAhPhQiPwIjQAIkQQIlQgImQwInRQIoRw0pSBUqSgIrTA0sTRYtTgIuTwIvUA0wUxcxVBsyVQMzVgM0VwM1WAM2WQM3WwM4XQ05Xhw6YAM7Yg08Yx09ZAM-ZQM_Zg1CaR5DaiREawtFbAtGbQtHbgtIbwtJcQtKcw1LdCVMdgtNeA1OeSZPegtQewtRfA1SfydTgAEtVIIBBlWDAQZWhgEGV4cBBliIAQZZigEGWowBDVuNAS5cjwEGXZEBDV6SAS9fkwEGYJQBBmGVAQ1imAEwY5kBNGSaAQdlmwEHZpwBB2edAQdongEHaaABB2qiAQ1rowE1bKUBB22nAQ1uqAE2b6kBB3CqAQdxqwENcq4BN3OvATt0sAEFdbEBBXayAQV3swEFeLQBBXm2AQV6uAENe7kBPHy7AQV9vQENfr4BPX-_AQWAAcABBYEBwQENggHEAT6DAcUBQoQBxgEJhQHHAQmGAcgBCYcByQEJiAHKAQmJAcwBCYoBzgENiwHPAUOMAdEBCY0B0wENjgHUAUSPAdUBCZAB1gEJkQHXAQ2SAdoBRZMB2wFJlAHcAQSVAd0BBJYB3gEElwHfAQSYAeABBJkB4gEEmgHkAQ2bAeUBSpwB5wEEnQHpAQ2eAeoBS58B6wEEoAHsAQShAe0BDaIB8AFMowHxAVKkAfMBU6UB9AFTpgH3AVOnAfgBU6gB-QFTqQH7AVOqAf0BDasB_gFUrAGAAlOtAYICDa4BgwJVrwGEAlOwAYUCU7EBhgINsgGJAlazAYoCWrgBjAJbuQGbAlu6AZwCW7sBnQJbvAGeAlu9AaACW74BogINvwGjAmDAAaUCW8EBpwINwgGoAmHDAakCW8QBqgJbxQGrAg3GAa4CYscBrwJmyAGwAlzJAbECXMoBsgJcywGzAlzMAbQCXM0BtgJczgG4Ag3PAbkCZ9ABuwJc0QG9Ag3SAb4CaNMBvwJc1AHAAlzVAcECDdYBxAJp1wHFAm3YAcYCXdkBxwJd2gHIAl3bAckCXdwBygJd3QHMAl3eAc4CDd8BzwJu4AHRAl3hAdMCDeIB1AJv4wHVAl3kAdYCXeUB1wIN5gHaAnDnAdsCdA"
|
|
47478
47281
|
};
|
|
47479
47282
|
async function decodeBase64AsWasm(wasmBase64) {
|
|
47480
47283
|
const { Buffer: Buffer2 } = await import("buffer");
|
|
@@ -47534,8 +47337,8 @@ global.castPrismaField = (e) => e;
|
|
|
47534
47337
|
|
|
47535
47338
|
// packages/mws/src/startup.ts
|
|
47536
47339
|
var import_debug3 = __toESM(require_src(), 1);
|
|
47537
|
-
import { existsSync as
|
|
47538
|
-
import * as
|
|
47340
|
+
import { existsSync as existsSync8, mkdirSync as mkdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
47341
|
+
import * as path7 from "path";
|
|
47539
47342
|
|
|
47540
47343
|
// packages/mws/src/db/sqlite-adapter.ts
|
|
47541
47344
|
init_esm_shims();
|
|
@@ -47739,8 +47542,8 @@ __name(InsertStatement, "InsertStatement");
|
|
|
47739
47542
|
|
|
47740
47543
|
// packages/mws/src/plugin-cache/index.ts
|
|
47741
47544
|
init_esm_shims();
|
|
47742
|
-
import * as
|
|
47743
|
-
import * as
|
|
47545
|
+
import * as fs3 from "fs";
|
|
47546
|
+
import * as path6 from "path";
|
|
47744
47547
|
|
|
47745
47548
|
// packages/mws/src/plugin-cache/importPlugins.ts
|
|
47746
47549
|
init_esm_shims();
|
|
@@ -47754,7 +47557,7 @@ init_esm_shims();
|
|
|
47754
47557
|
|
|
47755
47558
|
// packages/mws/src/new-managers/RecipeIndexSender.ts
|
|
47756
47559
|
init_esm_shims();
|
|
47757
|
-
import {
|
|
47560
|
+
import { randomBytes as randomBytes3 } from "crypto";
|
|
47758
47561
|
import { createReadStream as createReadStream3 } from "fs";
|
|
47759
47562
|
import { readFile as readFile3 } from "fs/promises";
|
|
47760
47563
|
import { join as join5, resolve as resolve3 } from "path";
|
|
@@ -47778,6 +47581,7 @@ __name(thrower, "thrower");
|
|
|
47778
47581
|
|
|
47779
47582
|
// packages/mws/src/new-managers/RecipeResolver.ts
|
|
47780
47583
|
init_esm_shims();
|
|
47584
|
+
import { createHash as createHash3 } from "crypto";
|
|
47781
47585
|
|
|
47782
47586
|
// packages/admin-vanilla/src/definition/tabs.ts
|
|
47783
47587
|
init_esm_shims();
|
|
@@ -47831,7 +47635,7 @@ var fieldTypeZodShapes = {
|
|
|
47831
47635
|
"switch": v4_exports.boolean(),
|
|
47832
47636
|
"metadata-table": v4_exports.string().array()
|
|
47833
47637
|
};
|
|
47834
|
-
var writableRoutingDescription = "
|
|
47638
|
+
var writableRoutingDescription = "Set the title prefix for each bag you want to write to. Tiddlers are only read from the bag matching the prefix.";
|
|
47835
47639
|
var tabs = {
|
|
47836
47640
|
wikis: {
|
|
47837
47641
|
id: "wikis",
|
|
@@ -47857,8 +47661,8 @@ var tabs = {
|
|
|
47857
47661
|
{ key: "displayName", label: "Display name", type: "string", section: "authored", mode: "create edit" },
|
|
47858
47662
|
{ key: "description", label: "Description", type: "text", section: "authored", mode: "create edit" },
|
|
47859
47663
|
{ key: "templateName", label: "Template", type: "search", section: "authored", mode: "create" },
|
|
47860
|
-
{ key: "readonlyBags", label: "
|
|
47861
|
-
{ key: "plugins", label: "
|
|
47664
|
+
{ key: "readonlyBags", label: "Bag name", type: "search-multiselect", section: "authored", mode: "create edit" },
|
|
47665
|
+
{ key: "plugins", label: "Plugin name", type: "search-multiselect", section: "authored", mode: "create edit" },
|
|
47862
47666
|
{ key: "lastCompiledAt", label: "Compiled", type: "string", section: "runtime", mode: "server" },
|
|
47863
47667
|
{
|
|
47864
47668
|
key: "writablePrefixBags",
|
|
@@ -47893,9 +47697,17 @@ var tabs = {
|
|
|
47893
47697
|
architecture: "Read-only projection of the resolved plugin rows that will actually be used by the wiki page and preload path."
|
|
47894
47698
|
},
|
|
47895
47699
|
{
|
|
47896
|
-
key: "
|
|
47897
|
-
label: "
|
|
47898
|
-
type: "
|
|
47700
|
+
key: "recipeUsers",
|
|
47701
|
+
label: "Role name",
|
|
47702
|
+
type: "search-multiselect",
|
|
47703
|
+
section: "authored",
|
|
47704
|
+
mode: "create edit",
|
|
47705
|
+
architecture: "Edits permission rows on the wiki definition itself. These govern access to the wiki surface separately from bag-level read and write rights."
|
|
47706
|
+
},
|
|
47707
|
+
{
|
|
47708
|
+
key: "recipeAdmins",
|
|
47709
|
+
label: "Role name",
|
|
47710
|
+
type: "search-multiselect",
|
|
47899
47711
|
section: "authored",
|
|
47900
47712
|
mode: "create edit",
|
|
47901
47713
|
architecture: "Edits permission rows on the wiki definition itself. These govern access to the wiki surface separately from bag-level read and write rights."
|
|
@@ -47919,11 +47731,23 @@ var tabs = {
|
|
|
47919
47731
|
],
|
|
47920
47732
|
fieldGroups: {
|
|
47921
47733
|
authored: [
|
|
47922
|
-
{ title: "
|
|
47923
|
-
{
|
|
47924
|
-
|
|
47734
|
+
{ title: "Basic Info", keys: ["slug", "displayName", "description", "templateName"], width: fullWidth, layout: stackLayout },
|
|
47735
|
+
{
|
|
47736
|
+
title: "Writable bags",
|
|
47737
|
+
description: "Tiddlers are written to and read from the longest matching prefix; unmatched titles use the default bag.",
|
|
47738
|
+
keys: ["writablePrefixBags"],
|
|
47739
|
+
width: fullWidth
|
|
47740
|
+
},
|
|
47741
|
+
{
|
|
47742
|
+
title: "Readonly bags",
|
|
47743
|
+
description: "Checked when the tiddler is not in the writable bag matching the prefix.",
|
|
47744
|
+
keys: ["readonlyBags"],
|
|
47745
|
+
width: halfWidth
|
|
47746
|
+
},
|
|
47925
47747
|
{ title: "Plugins", description: "Add wiki-specific plugins on top of the template plugin set.", keys: ["plugins"], width: halfWidth },
|
|
47926
|
-
{ title: "
|
|
47748
|
+
{ title: "Recipe Users", description: "Users able to open this wiki, assuming they have read permission on every bag as well.", keys: ["recipeUsers"], width: halfWidth },
|
|
47749
|
+
{ title: "Recipe Admins", description: "Users able to make changes on this page.", keys: ["recipeAdmins"], width: halfWidth },
|
|
47750
|
+
{ title: "Access", description: "Controls who can edit the wiki settings.", keys: ["recipePermissions"], width: fullWidth }
|
|
47927
47751
|
],
|
|
47928
47752
|
runtime: [
|
|
47929
47753
|
// { title: "Computed Write Prefix", description: "", keys: ["effectiveWritableBags"], width: fullWidth },
|
|
@@ -47977,8 +47801,24 @@ var tabs = {
|
|
|
47977
47801
|
mode: "create edit",
|
|
47978
47802
|
architecture: "Edits the template-level prefix-to-bag routing table that wikis inherit first. Longest prefix wins, and the empty string row is the fallback write target when no wiki-level override matches."
|
|
47979
47803
|
},
|
|
47980
|
-
{ key: "readonlyBags", label: "
|
|
47981
|
-
{ key: "plugins", label: "
|
|
47804
|
+
{ key: "readonlyBags", label: "Bag name", type: "search-multiselect", section: "authored", mode: "create edit" },
|
|
47805
|
+
{ key: "plugins", label: "Plugin name", type: "search-multiselect", section: "authored", mode: "create edit" },
|
|
47806
|
+
{
|
|
47807
|
+
key: "templateUsers",
|
|
47808
|
+
label: "Role name",
|
|
47809
|
+
type: "search-multiselect",
|
|
47810
|
+
section: "authored",
|
|
47811
|
+
mode: "create edit",
|
|
47812
|
+
architecture: "Edits permission rows on the wiki definition itself. These govern access to the wiki surface separately from bag-level read and write rights."
|
|
47813
|
+
},
|
|
47814
|
+
{
|
|
47815
|
+
key: "templateAdmins",
|
|
47816
|
+
label: "Role name",
|
|
47817
|
+
type: "search-multiselect",
|
|
47818
|
+
section: "authored",
|
|
47819
|
+
mode: "create edit",
|
|
47820
|
+
architecture: "Edits permission rows on the wiki definition itself. These govern access to the wiki surface separately from bag-level read and write rights."
|
|
47821
|
+
},
|
|
47982
47822
|
{
|
|
47983
47823
|
key: "requiredPluginsEnabled",
|
|
47984
47824
|
label: "Include Required Plugins",
|
|
@@ -48011,14 +47851,6 @@ var tabs = {
|
|
|
48011
47851
|
mode: "create edit",
|
|
48012
47852
|
description: "TW5 version pinning."
|
|
48013
47853
|
},
|
|
48014
|
-
{
|
|
48015
|
-
key: "templatePermissions",
|
|
48016
|
-
label: "Template permissions",
|
|
48017
|
-
type: "permission-table",
|
|
48018
|
-
section: "authored",
|
|
48019
|
-
mode: "create edit",
|
|
48020
|
-
architecture: "Grants permission to view or change this template. Wikis using this template grant their roles an implicit view permission for the selected template."
|
|
48021
|
-
},
|
|
48022
47854
|
{
|
|
48023
47855
|
key: "customHtmlEnabled",
|
|
48024
47856
|
label: "Custom HTML shell",
|
|
@@ -48082,7 +47914,8 @@ var tabs = {
|
|
|
48082
47914
|
{ title: "Writable routing", description: writableRoutingDescription, keys: ["writablePrefixBags"], width: fullWidth },
|
|
48083
47915
|
{ title: "Bags", keys: ["readonlyBags"], width: halfWidth },
|
|
48084
47916
|
{ title: "Plugins", keys: ["plugins", "requiredPluginsEnabled", "externalPlugins"], width: halfWidth, layout: stackLayout },
|
|
48085
|
-
{ title: "
|
|
47917
|
+
{ title: "Template Users", description: "Users who can set this template on a recipe. This only applies to the user creating the recipe.", keys: ["templateUsers"], width: halfWidth },
|
|
47918
|
+
{ title: "Template Admins", description: "Users able to make changes on this page. This affects all recipes that use the template, regardless of any other permissions.", keys: ["templateAdmins"], width: halfWidth },
|
|
48086
47919
|
{ title: "Custom HTML shell", keys: ["htmlContent", "injectionArray", "injectionLocation"], headerFieldKey: "customHtmlEnabled", disabledWhenHeaderOff: true, width: fullWidth, layout: stackLayout }
|
|
48087
47920
|
],
|
|
48088
47921
|
runtime: [
|
|
@@ -48287,16 +48120,12 @@ __name(buildTabZodObject, "buildTabZodObject");
|
|
|
48287
48120
|
|
|
48288
48121
|
// packages/mws/src/new-managers/RecipeResolver.ts
|
|
48289
48122
|
var WRITE_LEVELS = ["B_write", "C_admin"];
|
|
48290
|
-
function inArray(b2, a) {
|
|
48291
|
-
return a.includes(b2);
|
|
48292
|
-
}
|
|
48293
|
-
__name(inArray, "inArray");
|
|
48294
48123
|
var RecipeResolver = class {
|
|
48295
48124
|
// #region constructor
|
|
48296
|
-
constructor(recipe, prisma,
|
|
48125
|
+
constructor(recipe, prisma, user) {
|
|
48297
48126
|
this.recipe = recipe;
|
|
48298
48127
|
this.prisma = prisma;
|
|
48299
|
-
this.
|
|
48128
|
+
this.user = user;
|
|
48300
48129
|
const writablePrefixBags = {};
|
|
48301
48130
|
for (const rb of recipe.recipe_bags) {
|
|
48302
48131
|
if (rb.is_writable) {
|
|
@@ -48308,7 +48137,7 @@ var RecipeResolver = class {
|
|
|
48308
48137
|
}
|
|
48309
48138
|
recipe;
|
|
48310
48139
|
prisma;
|
|
48311
|
-
|
|
48140
|
+
user;
|
|
48312
48141
|
static {
|
|
48313
48142
|
__name(this, "RecipeResolver");
|
|
48314
48143
|
}
|
|
@@ -48322,7 +48151,7 @@ var RecipeResolver = class {
|
|
|
48322
48151
|
* bag in the ordering (including empty ones). Admins bypass. Lacking any one
|
|
48323
48152
|
* yields a 403, not a filtered view.
|
|
48324
48153
|
*/
|
|
48325
|
-
static async assertRecipe({ state, recipe_slug
|
|
48154
|
+
static async assertRecipe({ state, recipe_slug }) {
|
|
48326
48155
|
const prisma = state.engine;
|
|
48327
48156
|
const isAdmin = state.user.isAdmin;
|
|
48328
48157
|
const role_ids = state.user.roles.map((r) => r.role_id);
|
|
@@ -48376,14 +48205,6 @@ var RecipeResolver = class {
|
|
|
48376
48205
|
const hasBagDeniedAccess = recipe.recipe_bags.find((recipeBag) => !recipeBag.bag.permissions.length);
|
|
48377
48206
|
if (!isAdmin && hasBagDeniedAccess)
|
|
48378
48207
|
throw new SendError("BAG_NO_READ_PERMISSION", 403, { bagName: hasBagDeniedAccess.bag_id });
|
|
48379
|
-
if (!isAdmin && needsWrite) {
|
|
48380
|
-
state.okUser();
|
|
48381
|
-
const hasWriteAccess = recipe.recipe_bags.filter((recipeBag) => recipeBag.is_writable).some(
|
|
48382
|
-
(recipeBag) => recipeBag.bag.permissions.some((permission) => inArray(permission.level, WRITE_LEVELS))
|
|
48383
|
-
);
|
|
48384
|
-
if (!hasWriteAccess)
|
|
48385
|
-
throw new SendError("BAG_NO_WRITE_PERMISSION", 403, { bagName: "" });
|
|
48386
|
-
}
|
|
48387
48208
|
return recipe;
|
|
48388
48209
|
}
|
|
48389
48210
|
readonlyBags;
|
|
@@ -48393,7 +48214,7 @@ var RecipeResolver = class {
|
|
|
48393
48214
|
}
|
|
48394
48215
|
/** Whether the requesting user may write to the given bag (uses already-fetched permissions). */
|
|
48395
48216
|
canWriteBag(rb) {
|
|
48396
|
-
if (this.isAdmin) return true;
|
|
48217
|
+
if (this.user.isAdmin && !rb.bag.permissions.find((e) => e.role_id === this.user.AdminRoleID)) return true;
|
|
48397
48218
|
return WRITE_LEVELS.includes(rb.bag.permissions[0]?.level ?? "");
|
|
48398
48219
|
}
|
|
48399
48220
|
/**
|
|
@@ -48487,9 +48308,11 @@ var RecipeResolver = class {
|
|
|
48487
48308
|
async saveTiddlers({ tiddlers }) {
|
|
48488
48309
|
return await Promise.all((tiddlers ?? []).map(async (fields) => {
|
|
48489
48310
|
const title = fields.title;
|
|
48490
|
-
if (!title)
|
|
48311
|
+
if (!title)
|
|
48312
|
+
throw new SendError("ARGUMENT_REQUIRED", 400, { name: "tiddlers.title" });
|
|
48491
48313
|
const bag = this.getWriteTarget({ title });
|
|
48492
|
-
if (!bag || !this.canWriteBag(bag))
|
|
48314
|
+
if (!bag || !this.canWriteBag(bag))
|
|
48315
|
+
throw new SendError("BAG_NO_WRITE_PERMISSION", 403, { bagName: bag?.bag.name ?? "" });
|
|
48493
48316
|
const tiddler = await new WikiStore(this.prisma).saveTiddler({
|
|
48494
48317
|
recipe_id: new IdString(this.recipe.id),
|
|
48495
48318
|
bag_id: new IdString(bag.bag_id),
|
|
@@ -48505,8 +48328,11 @@ var RecipeResolver = class {
|
|
|
48505
48328
|
//#region deleteTiddlers
|
|
48506
48329
|
async deleteTiddlers({ titles }) {
|
|
48507
48330
|
return await Promise.all((titles ?? []).map(async (title) => {
|
|
48331
|
+
if (!title)
|
|
48332
|
+
throw new SendError("ARGUMENT_REQUIRED", 400, { name: "titles.title" });
|
|
48508
48333
|
const bag = this.getWriteTarget({ title });
|
|
48509
|
-
if (!bag || !this.canWriteBag(bag))
|
|
48334
|
+
if (!bag || !this.canWriteBag(bag))
|
|
48335
|
+
throw new SendError("BAG_NO_WRITE_PERMISSION", 403, { bagName: bag?.bag.name ?? "" });
|
|
48510
48336
|
const event = await new WikiStore(this.prisma).deleteTiddler({
|
|
48511
48337
|
recipe_id: new IdString(this.recipe.id),
|
|
48512
48338
|
bag_id: new IdString(bag.bag_id),
|
|
@@ -48525,13 +48351,14 @@ var RecipeResolver = class {
|
|
|
48525
48351
|
const bagIds = this.recipe.recipe_bags.map((e) => e.bag_id);
|
|
48526
48352
|
const templateRow = await this.prisma.template.findUnique({ where: { id: this.recipe.template_id } });
|
|
48527
48353
|
if (!templateRow) throw new Error("template not found");
|
|
48528
|
-
const { customHtmlEnabled, injectionFunction, injectionLocation } = templateRow.definition;
|
|
48354
|
+
const { customHtmlEnabled, injectionFunction, injectionLocation, externalPlugins, externalStore } = templateRow.definition;
|
|
48529
48355
|
const template = {
|
|
48530
48356
|
...templateRow.definition,
|
|
48531
48357
|
name: templateRow.name,
|
|
48532
48358
|
injectionFunction: customHtmlEnabled ? injectionFunction : defaultPreloadFunction,
|
|
48533
48359
|
injectionLocation: customHtmlEnabled ? injectionLocation : "</head>"
|
|
48534
48360
|
};
|
|
48361
|
+
const injectDefault = !customHtmlEnabled && (externalPlugins || externalStore);
|
|
48535
48362
|
const bagTiddlers = includeTiddlers ? await this.prisma.bag.findMany({
|
|
48536
48363
|
where: { id: { in: bagIds } },
|
|
48537
48364
|
select: {
|
|
@@ -48542,7 +48369,27 @@ var RecipeResolver = class {
|
|
|
48542
48369
|
}
|
|
48543
48370
|
}
|
|
48544
48371
|
}) : [];
|
|
48545
|
-
|
|
48372
|
+
const lastEventId = String(maxSeq._max.seq ?? 0);
|
|
48373
|
+
const getIndexEtag = /* @__PURE__ */ __name((template2, pluginCache) => {
|
|
48374
|
+
const plugins = getPluginList(pluginCache);
|
|
48375
|
+
const hash2 = createHash3("md5");
|
|
48376
|
+
hash2.update(template2);
|
|
48377
|
+
hash2.update(this.recipe.recipe_bags.map((e) => e.bag.name).join(","));
|
|
48378
|
+
hash2.update(plugins.map((e) => pluginCache.pluginHashes(injectionFunction).get(e) ?? "").join(","));
|
|
48379
|
+
hash2.update(lastEventId);
|
|
48380
|
+
const contentDigest = hash2.digest("hex");
|
|
48381
|
+
return `"${contentDigest}"`;
|
|
48382
|
+
}, "getIndexEtag");
|
|
48383
|
+
const getPluginList = /* @__PURE__ */ __name((pluginCache) => {
|
|
48384
|
+
const { customHtmlEnabled: customHtmlEnabled2, requiredPluginsEnabled } = template;
|
|
48385
|
+
const plugins = [...(/* @__PURE__ */ new Set([
|
|
48386
|
+
...!customHtmlEnabled2 ? ["$:/core"] : [],
|
|
48387
|
+
...requiredPluginsEnabled ? pluginCache.requiredPlugins : [],
|
|
48388
|
+
...this.recipe.plugins
|
|
48389
|
+
])).values()];
|
|
48390
|
+
return plugins;
|
|
48391
|
+
}, "getPluginList");
|
|
48392
|
+
return { bagTiddlers, lastEventId, template, injectDefault, getIndexEtag, getPluginList };
|
|
48546
48393
|
}
|
|
48547
48394
|
};
|
|
48548
48395
|
var WikiStore = class {
|
|
@@ -48602,49 +48449,51 @@ var WikiStore = class {
|
|
|
48602
48449
|
};
|
|
48603
48450
|
|
|
48604
48451
|
// packages/mws/src/new-managers/RecipeIndexSender.ts
|
|
48605
|
-
async function
|
|
48452
|
+
async function serveWikiIndex(state, recipe_slug, type) {
|
|
48606
48453
|
const getData = /* @__PURE__ */ __name(async () => {
|
|
48607
48454
|
const recipe = await RecipeResolver.assertRecipe({
|
|
48608
48455
|
state,
|
|
48609
|
-
recipe_slug
|
|
48610
|
-
needsWrite: false
|
|
48456
|
+
recipe_slug
|
|
48611
48457
|
}).then((e) => {
|
|
48612
48458
|
state.asserted = true;
|
|
48613
48459
|
return e;
|
|
48614
48460
|
});
|
|
48615
48461
|
const skipBagTiddlers = state.method === "HEAD";
|
|
48616
48462
|
const index = await state.$transaction(async (prisma) => {
|
|
48617
|
-
return await new RecipeResolver(recipe, prisma, state.user
|
|
48463
|
+
return await new RecipeResolver(recipe, prisma, state.user).getIndexData(!skipBagTiddlers);
|
|
48618
48464
|
});
|
|
48619
|
-
|
|
48465
|
+
const etag = index.getIndexEtag("", state.pluginCache);
|
|
48466
|
+
return { recipe, index, etag };
|
|
48620
48467
|
}, "getData");
|
|
48621
48468
|
switch (type) {
|
|
48622
48469
|
case "index": {
|
|
48623
|
-
const { recipe, index } = await getData();
|
|
48624
|
-
|
|
48470
|
+
const { recipe, index, etag } = await getData();
|
|
48471
|
+
const template = index.template.customHtmlEnabled ? index.template.htmlContent : await readFile3(resolve3(state.config.cachePath, "tiddlywiki5.html"), "utf8");
|
|
48472
|
+
const plugins = index.getPluginList(state.pluginCache);
|
|
48473
|
+
await initPlugins(state.pluginCache, index.template.injectionFunction, plugins);
|
|
48474
|
+
return await new WikiIndexSender(
|
|
48475
|
+
state,
|
|
48625
48476
|
recipe,
|
|
48626
48477
|
index,
|
|
48627
|
-
|
|
48628
|
-
|
|
48629
|
-
|
|
48630
|
-
).serveIndexFile();
|
|
48478
|
+
etag,
|
|
48479
|
+
plugins
|
|
48480
|
+
).serveIndexFile(template);
|
|
48631
48481
|
}
|
|
48632
48482
|
case "store.json":
|
|
48633
48483
|
case "store.js": {
|
|
48634
|
-
const
|
|
48484
|
+
const { recipe, index, etag: newEtag } = await (async () => {
|
|
48635
48485
|
if (process.env.BUILD_FLAG_EXTERNAL_STORE) {
|
|
48636
48486
|
const key = state.headers.cookie.get("mws_index_cache");
|
|
48637
48487
|
const cached2 = IndexSender.storeCache.get(key) ?? await getData();
|
|
48638
48488
|
IndexSender.storeCache.delete(key);
|
|
48639
|
-
|
|
48640
|
-
return new StoreWriter(state, recipe, index, type);
|
|
48489
|
+
return cached2;
|
|
48641
48490
|
} else {
|
|
48642
|
-
|
|
48643
|
-
return new StoreWriter(state, recipe, index, type);
|
|
48491
|
+
return await getData();
|
|
48644
48492
|
}
|
|
48645
48493
|
})();
|
|
48646
|
-
|
|
48647
|
-
|
|
48494
|
+
const plugins = index.getPluginList(state.pluginCache);
|
|
48495
|
+
await initPlugins(state.pluginCache, index.template.injectionFunction, plugins);
|
|
48496
|
+
const store = new WikiStoreWriter(state, recipe, index, type, plugins);
|
|
48648
48497
|
const match2 = state.headers.ifNoneMatch.has(newEtag);
|
|
48649
48498
|
state.writeHead(match2 ? 304 : 200, {
|
|
48650
48499
|
etag: newEtag,
|
|
@@ -48670,94 +48519,29 @@ async function serveIndex2(state, recipe_slug, type) {
|
|
|
48670
48519
|
}
|
|
48671
48520
|
}
|
|
48672
48521
|
}
|
|
48673
|
-
__name(
|
|
48674
|
-
|
|
48675
|
-
|
|
48676
|
-
|
|
48677
|
-
|
|
48678
|
-
|
|
48679
|
-
|
|
48680
|
-
|
|
48681
|
-
|
|
48682
|
-
|
|
48683
|
-
lastEventId;
|
|
48684
|
-
template;
|
|
48685
|
-
static {
|
|
48686
|
-
__name(this, "StoreBase");
|
|
48687
|
-
}
|
|
48688
|
-
get injectionFunction() {
|
|
48689
|
-
return this.template.injectionFunction;
|
|
48690
|
-
}
|
|
48691
|
-
plugins = emptyArray;
|
|
48692
|
-
assertPlugins() {
|
|
48693
|
-
if (this.plugins === emptyArray)
|
|
48694
|
-
throw new Error("await this.init() first");
|
|
48695
|
-
}
|
|
48696
|
-
async init() {
|
|
48697
|
-
if (!this.injectionFunction) throw new Error("INJECTION_FUNCTION_FALSEY: injection function is falsey");
|
|
48698
|
-
const { customHtmlEnabled, requiredPluginsEnabled } = this.template;
|
|
48699
|
-
const plugins = [...(/* @__PURE__ */ new Set([
|
|
48700
|
-
...!customHtmlEnabled ? ["$:/core"] : [],
|
|
48701
|
-
...requiredPluginsEnabled ? this.pluginCache.requiredPlugins : [],
|
|
48702
|
-
...this.recipe.plugins
|
|
48703
|
-
])).values()];
|
|
48704
|
-
if (!this.pluginCache.cacheArrayStrings.includes(this.injectionFunction)) {
|
|
48705
|
-
await TiddlerHasher2.assertTitleHashes(this.pluginCache, this.injectionFunction, plugins);
|
|
48706
|
-
}
|
|
48707
|
-
plugins.forEach((e) => {
|
|
48708
|
-
if (!this.pluginCache.pluginFiles.has(e))
|
|
48709
|
-
console.log(`Recipe ${this.recipe.id} uses unknown plugin ${e}`);
|
|
48710
|
-
});
|
|
48711
|
-
this.plugins = plugins;
|
|
48712
|
-
}
|
|
48713
|
-
getEtag(template) {
|
|
48714
|
-
this.assertPlugins();
|
|
48715
|
-
const hash2 = createHash3("md5");
|
|
48716
|
-
hash2.update(template);
|
|
48717
|
-
hash2.update(this.recipe.recipe_bags.map((e) => e.bag.name).join(","));
|
|
48718
|
-
hash2.update(this.plugins.map((e) => this.pluginCache.pluginHashes(this.injectionFunction).get(e) ?? "").join(","));
|
|
48719
|
-
hash2.update(String(this.lastEventId ?? 0));
|
|
48720
|
-
const contentDigest = hash2.digest("hex");
|
|
48721
|
-
return `"${contentDigest}"`;
|
|
48522
|
+
__name(serveWikiIndex, "serveWikiIndex");
|
|
48523
|
+
async function serveDocsIndex(state, tiddlers, plugins, twVersion) {
|
|
48524
|
+
const template = await readFile3(resolve3(state.config.cachePath, "tiddlywiki5.html"), "utf8");
|
|
48525
|
+
await new DocsIndexSender(state, plugins, tiddlers, twVersion).serveIndexFile(template);
|
|
48526
|
+
}
|
|
48527
|
+
__name(serveDocsIndex, "serveDocsIndex");
|
|
48528
|
+
async function initPlugins(pluginCache, injectionFunction, plugins) {
|
|
48529
|
+
if (!injectionFunction) throw new Error("INJECTION_FUNCTION_FALSEY: injection function is falsey");
|
|
48530
|
+
if (!pluginCache.cacheArrayStrings.includes(injectionFunction)) {
|
|
48531
|
+
await TiddlerHasher2.assertTitleHashes(pluginCache, injectionFunction, plugins);
|
|
48722
48532
|
}
|
|
48723
|
-
|
|
48533
|
+
plugins.forEach((e) => {
|
|
48534
|
+
if (!pluginCache.pluginFiles.has(e))
|
|
48535
|
+
console.log(`Recipe uses unknown plugin ${e}`);
|
|
48536
|
+
});
|
|
48537
|
+
}
|
|
48538
|
+
__name(initPlugins, "initPlugins");
|
|
48724
48539
|
var emptyArray = Object.seal([]);
|
|
48725
|
-
var IndexSender = class _IndexSender
|
|
48726
|
-
constructor(recipe, index, state, enableExternalPlugins, enableExternalStore) {
|
|
48727
|
-
super(recipe, state.pluginCache, index.lastEventId, index.template);
|
|
48728
|
-
this.state = state;
|
|
48729
|
-
this.enableExternalPlugins = enableExternalPlugins;
|
|
48730
|
-
this.enableExternalStore = enableExternalStore;
|
|
48731
|
-
this.makeStoreWriter = () => {
|
|
48732
|
-
const writer = new StoreWriter(
|
|
48733
|
-
state,
|
|
48734
|
-
recipe,
|
|
48735
|
-
index,
|
|
48736
|
-
this.injectStore ? "store.js" : "store.json"
|
|
48737
|
-
);
|
|
48738
|
-
writer.plugins = this.plugins;
|
|
48739
|
-
return writer;
|
|
48740
|
-
};
|
|
48741
|
-
this.makeStoreData = () => ({ recipe, index });
|
|
48742
|
-
}
|
|
48743
|
-
state;
|
|
48744
|
-
enableExternalPlugins;
|
|
48745
|
-
enableExternalStore;
|
|
48540
|
+
var IndexSender = class _IndexSender {
|
|
48746
48541
|
static {
|
|
48747
48542
|
__name(this, "IndexSender");
|
|
48748
48543
|
}
|
|
48749
48544
|
static storeCache = /* @__PURE__ */ new Map();
|
|
48750
|
-
makeStoreWriter;
|
|
48751
|
-
makeStoreData;
|
|
48752
|
-
get injectStore() {
|
|
48753
|
-
return this.customHtmlEnabled;
|
|
48754
|
-
}
|
|
48755
|
-
get injectionLocation() {
|
|
48756
|
-
return this.template.injectionLocation;
|
|
48757
|
-
}
|
|
48758
|
-
get customHtmlEnabled() {
|
|
48759
|
-
return this.template.customHtmlEnabled;
|
|
48760
|
-
}
|
|
48761
48545
|
get pluginFiles() {
|
|
48762
48546
|
return this.state.pluginCache.pluginFiles;
|
|
48763
48547
|
}
|
|
@@ -48782,12 +48566,12 @@ var IndexSender = class _IndexSender extends StoreBase {
|
|
|
48782
48566
|
}
|
|
48783
48567
|
renderStoreTags(type) {
|
|
48784
48568
|
const pathPrefix = this.state.pathPrefix;
|
|
48785
|
-
const recipe = this.
|
|
48569
|
+
const recipe = this.recipeSlug;
|
|
48786
48570
|
switch (type) {
|
|
48787
48571
|
case "preload":
|
|
48788
|
-
return `<link rel="preload" href="${pathPrefix}/recipe/${
|
|
48572
|
+
return `<link rel="preload" href="${pathPrefix}/recipe/${this.recipeSlug}/store.js" as="script" crossorigin="anonymous" />`;
|
|
48789
48573
|
case "script":
|
|
48790
|
-
return `<script src="${pathPrefix}/recipe/${
|
|
48574
|
+
return `<script src="${pathPrefix}/recipe/${this.recipeSlug}/store.js" crossorigin="anonymous"></script>`;
|
|
48791
48575
|
default:
|
|
48792
48576
|
{
|
|
48793
48577
|
const exhaustive = type;
|
|
@@ -48795,9 +48579,7 @@ var IndexSender = class _IndexSender extends StoreBase {
|
|
|
48795
48579
|
throw new Error(`Unknown plugin tag type: ${type}`);
|
|
48796
48580
|
}
|
|
48797
48581
|
}
|
|
48798
|
-
async serveIndexFile() {
|
|
48799
|
-
if (this.plugins === emptyArray)
|
|
48800
|
-
await this.init();
|
|
48582
|
+
async serveIndexFile(template) {
|
|
48801
48583
|
if (this.enableExternalPlugins) {
|
|
48802
48584
|
this.state.writeEarlyHints({
|
|
48803
48585
|
link: this.plugins.map((e) => {
|
|
@@ -48806,13 +48588,11 @@ var IndexSender = class _IndexSender extends StoreBase {
|
|
|
48806
48588
|
})
|
|
48807
48589
|
});
|
|
48808
48590
|
}
|
|
48809
|
-
const
|
|
48810
|
-
const
|
|
48811
|
-
const match2 = this.state.headers.ifNoneMatch.has(newEtag);
|
|
48812
|
-
const writerCacheKey = randomBytes2(24).toString("base64url");
|
|
48591
|
+
const match2 = this.state.headers.ifNoneMatch.has(this.etag);
|
|
48592
|
+
const writerCacheKey = randomBytes3(24).toString("base64url");
|
|
48813
48593
|
this.state.writeHead(match2 ? 304 : 200, {
|
|
48814
48594
|
contentType: "text/html",
|
|
48815
|
-
etag:
|
|
48595
|
+
etag: this.etag,
|
|
48816
48596
|
cacheControl: "max-age=0, private, no-cache",
|
|
48817
48597
|
setCookie: {
|
|
48818
48598
|
name: "mws_index_cache",
|
|
@@ -48833,9 +48613,8 @@ var IndexSender = class _IndexSender extends StoreBase {
|
|
|
48833
48613
|
await this.state.write(this.renderPluginTags("preload", this.plugins));
|
|
48834
48614
|
if (this.enableExternalStore)
|
|
48835
48615
|
await this.state.write(this.renderStoreTags("preload"));
|
|
48836
|
-
if (this.
|
|
48837
|
-
|
|
48838
|
-
await this.state.write(`
|
|
48616
|
+
if (this.injectDefaultPreloadScript) {
|
|
48617
|
+
await this.state.write(`
|
|
48839
48618
|
<script>
|
|
48840
48619
|
window.$tw = window.$tw || Object.create(null);
|
|
48841
48620
|
$tw.preloadTiddlers = $tw.preloadTiddlers || [];
|
|
@@ -48889,12 +48668,163 @@ $tw.preloadTiddler = function(fields) {
|
|
|
48889
48668
|
}
|
|
48890
48669
|
return this.state.end();
|
|
48891
48670
|
}
|
|
48671
|
+
makeStoreData() {
|
|
48672
|
+
throw new Error("not implemented");
|
|
48673
|
+
}
|
|
48674
|
+
};
|
|
48675
|
+
var WikiIndexSender = class extends IndexSender {
|
|
48676
|
+
constructor(state, recipe, index, etag, plugins) {
|
|
48677
|
+
super();
|
|
48678
|
+
this.state = state;
|
|
48679
|
+
this.etag = etag;
|
|
48680
|
+
this.plugins = plugins;
|
|
48681
|
+
this.lastEventId = index.lastEventId;
|
|
48682
|
+
this.enableExternalPlugins = index.template.externalPlugins;
|
|
48683
|
+
this.enableExternalStore = index.template.externalStore;
|
|
48684
|
+
this.injectStore = index.template.customHtmlEnabled;
|
|
48685
|
+
this.injectionLocation = index.template.injectionLocation;
|
|
48686
|
+
this.injectionFunction = index.template.injectionFunction;
|
|
48687
|
+
this.customHtmlEnabled = index.template.customHtmlEnabled;
|
|
48688
|
+
this.injectDefaultPreloadScript = index.injectDefault;
|
|
48689
|
+
this.recipeSlug = encodeURIComponent(recipe.slug);
|
|
48690
|
+
this.wikiSlug = recipe.slug;
|
|
48691
|
+
this.pluginCache = state.pluginCache;
|
|
48692
|
+
this.makeStoreWriter = () => {
|
|
48693
|
+
return new WikiStoreWriter(
|
|
48694
|
+
state,
|
|
48695
|
+
recipe,
|
|
48696
|
+
index,
|
|
48697
|
+
this.injectStore ? "store.js" : "store.json",
|
|
48698
|
+
this.plugins
|
|
48699
|
+
);
|
|
48700
|
+
};
|
|
48701
|
+
}
|
|
48702
|
+
state;
|
|
48703
|
+
etag;
|
|
48704
|
+
plugins;
|
|
48705
|
+
static {
|
|
48706
|
+
__name(this, "WikiIndexSender");
|
|
48707
|
+
}
|
|
48708
|
+
lastEventId;
|
|
48709
|
+
enableExternalPlugins;
|
|
48710
|
+
enableExternalStore;
|
|
48711
|
+
injectStore;
|
|
48712
|
+
injectionLocation;
|
|
48713
|
+
customHtmlEnabled;
|
|
48714
|
+
injectDefaultPreloadScript;
|
|
48715
|
+
recipeSlug;
|
|
48716
|
+
wikiSlug;
|
|
48717
|
+
makeStoreWriter;
|
|
48718
|
+
injectionFunction;
|
|
48719
|
+
pluginCache;
|
|
48892
48720
|
};
|
|
48893
|
-
var
|
|
48894
|
-
constructor(state,
|
|
48895
|
-
super(
|
|
48721
|
+
var DocsIndexSender = class extends IndexSender {
|
|
48722
|
+
constructor(state, plugins, tiddlers, twVersion) {
|
|
48723
|
+
super();
|
|
48896
48724
|
this.state = state;
|
|
48725
|
+
this.plugins = plugins;
|
|
48726
|
+
this.pluginCache = state.pluginCache;
|
|
48727
|
+
this.injectDefaultPreloadScript = false;
|
|
48728
|
+
this.injectStore = false;
|
|
48729
|
+
this.injectionFunction = defaultPreloadFunction;
|
|
48730
|
+
this.etag = `"${twVersion}"`;
|
|
48731
|
+
this.lastEventId = "0";
|
|
48732
|
+
this.customHtmlEnabled = false;
|
|
48733
|
+
this.injectStore = false;
|
|
48734
|
+
this.injectDefaultPreloadScript = true;
|
|
48735
|
+
this.enableExternalPlugins = true;
|
|
48736
|
+
this.enableExternalStore = false;
|
|
48737
|
+
this.injectionLocation = "</head>";
|
|
48738
|
+
this.recipeSlug = void 0;
|
|
48739
|
+
this.wikiSlug = "";
|
|
48740
|
+
this.makeStoreWriter = () => new DocsStoreWriter(state, tiddlers, "store.json", plugins);
|
|
48741
|
+
}
|
|
48742
|
+
state;
|
|
48743
|
+
plugins;
|
|
48744
|
+
static {
|
|
48745
|
+
__name(this, "DocsIndexSender");
|
|
48746
|
+
}
|
|
48747
|
+
lastEventId;
|
|
48748
|
+
enableExternalPlugins;
|
|
48749
|
+
enableExternalStore;
|
|
48750
|
+
injectStore;
|
|
48751
|
+
injectionLocation;
|
|
48752
|
+
injectionFunction;
|
|
48753
|
+
customHtmlEnabled;
|
|
48754
|
+
injectDefaultPreloadScript;
|
|
48755
|
+
etag;
|
|
48756
|
+
recipeSlug;
|
|
48757
|
+
wikiSlug;
|
|
48758
|
+
makeStoreWriter;
|
|
48759
|
+
pluginCache;
|
|
48760
|
+
};
|
|
48761
|
+
var StoreWriter = class {
|
|
48762
|
+
static {
|
|
48763
|
+
__name(this, "StoreWriter");
|
|
48764
|
+
}
|
|
48765
|
+
get cachePath() {
|
|
48766
|
+
return this.state.pluginCache.cachePath;
|
|
48767
|
+
}
|
|
48768
|
+
get pluginFiles() {
|
|
48769
|
+
return this.state.pluginCache.pluginFiles;
|
|
48770
|
+
}
|
|
48771
|
+
writeTiddler = /* @__PURE__ */ __name(async (fields, last = false) => {
|
|
48772
|
+
await this.state.write(this.prefix + JSON.stringify(fields).replace(/</g, "\\u003c") + (last && this.dropLastSuffix ? "" : this.suffix));
|
|
48773
|
+
}, "writeTiddler");
|
|
48774
|
+
writePlugins = /* @__PURE__ */ __name(async () => {
|
|
48775
|
+
if (!this.externalPlugins) {
|
|
48776
|
+
const fileStreams = this.plugins.map(
|
|
48777
|
+
(e) => createReadStream3(join5(this.cachePath, this.pluginFiles.get(e), "plugin.json"))
|
|
48778
|
+
);
|
|
48779
|
+
for (const stream of fileStreams) {
|
|
48780
|
+
this.state.writeFast(this.prefix);
|
|
48781
|
+
await this.state.pipeFrom(stream);
|
|
48782
|
+
this.state.writeFast(this.suffix);
|
|
48783
|
+
}
|
|
48784
|
+
}
|
|
48785
|
+
}, "writePlugins");
|
|
48786
|
+
async writeFinalTiddlers(bagInfo, revisionInfo, keepLastSuffix) {
|
|
48787
|
+
await this.writeTiddler({
|
|
48788
|
+
title: "$:/state/multiwikiclient/tiddlers/bag",
|
|
48789
|
+
text: JSON.stringify(bagInfo),
|
|
48790
|
+
type: "application/json"
|
|
48791
|
+
});
|
|
48792
|
+
await this.writeTiddler({
|
|
48793
|
+
title: "$:/state/multiwikiclient/tiddlers/revision",
|
|
48794
|
+
text: JSON.stringify(revisionInfo),
|
|
48795
|
+
type: "application/json"
|
|
48796
|
+
});
|
|
48797
|
+
await this.writeTiddler({
|
|
48798
|
+
title: "$:/state/multiwikiclient/recipe/last_revision_id",
|
|
48799
|
+
text: this.lastEventId
|
|
48800
|
+
});
|
|
48801
|
+
await this.writeTiddler({
|
|
48802
|
+
title: "$:/config/multiwikiclient/recipe",
|
|
48803
|
+
text: this.recipeSlug
|
|
48804
|
+
});
|
|
48805
|
+
if (false) {
|
|
48806
|
+
await this.writeTiddler({
|
|
48807
|
+
title: "$:/state/multiwikiclient/dev-mode",
|
|
48808
|
+
text: "yes"
|
|
48809
|
+
});
|
|
48810
|
+
}
|
|
48811
|
+
await this.writeTiddler({
|
|
48812
|
+
title: "$:/config/multiwikiclient/host",
|
|
48813
|
+
text: "$protocol$//$host$" + this.state.pathPrefix + "/"
|
|
48814
|
+
}, !keepLastSuffix);
|
|
48815
|
+
}
|
|
48816
|
+
};
|
|
48817
|
+
var WikiStoreWriter = class extends StoreWriter {
|
|
48818
|
+
constructor(state, recipe, index, format, plugins) {
|
|
48819
|
+
super();
|
|
48820
|
+
this.state = state;
|
|
48821
|
+
this.recipe = recipe;
|
|
48822
|
+
this.plugins = plugins;
|
|
48897
48823
|
this.bagTiddlers = index.bagTiddlers;
|
|
48824
|
+
this.injectionFunction = index.template.injectionFunction;
|
|
48825
|
+
this.externalPlugins = index.template.externalPlugins;
|
|
48826
|
+
this.lastEventId = index.lastEventId;
|
|
48827
|
+
this.recipeSlug = recipe.slug;
|
|
48898
48828
|
switch (format) {
|
|
48899
48829
|
case "store.js":
|
|
48900
48830
|
this.prefix = this.injectionFunction + "(";
|
|
@@ -48909,32 +48839,22 @@ var StoreWriter = class extends StoreBase {
|
|
|
48909
48839
|
}
|
|
48910
48840
|
}
|
|
48911
48841
|
state;
|
|
48842
|
+
recipe;
|
|
48843
|
+
plugins;
|
|
48912
48844
|
static {
|
|
48913
|
-
__name(this, "
|
|
48845
|
+
__name(this, "WikiStoreWriter");
|
|
48914
48846
|
}
|
|
48915
|
-
dropLastSuffix;
|
|
48916
48847
|
prefix;
|
|
48917
48848
|
suffix;
|
|
48849
|
+
lastEventId;
|
|
48850
|
+
recipeSlug;
|
|
48851
|
+
dropLastSuffix;
|
|
48852
|
+
externalPlugins;
|
|
48918
48853
|
bagTiddlers;
|
|
48919
|
-
|
|
48920
|
-
return this.state.pluginCache.cachePath;
|
|
48921
|
-
}
|
|
48922
|
-
get pluginFiles() {
|
|
48923
|
-
return this.state.pluginCache.pluginFiles;
|
|
48924
|
-
}
|
|
48854
|
+
injectionFunction;
|
|
48925
48855
|
async writeStore(keepLastSuffix) {
|
|
48926
|
-
|
|
48927
|
-
|
|
48928
|
-
for (const stream of fileStreams) {
|
|
48929
|
-
this.state.writeFast(this.prefix);
|
|
48930
|
-
await this.state.pipeFrom(stream);
|
|
48931
|
-
this.state.writeFast(this.suffix);
|
|
48932
|
-
}
|
|
48933
|
-
}
|
|
48934
|
-
const writeTiddler = /* @__PURE__ */ __name(async (fields, last = false) => {
|
|
48935
|
-
await this.state.write(this.prefix + JSON.stringify(fields).replace(/</g, "\\u003c") + (last && this.dropLastSuffix ? "" : this.suffix));
|
|
48936
|
-
}, "writeTiddler");
|
|
48937
|
-
const r = new RecipeResolver(this.recipe, null, this.state.user.isAdmin);
|
|
48856
|
+
await this.writePlugins();
|
|
48857
|
+
const r = new RecipeResolver(this.recipe, null, this.state.user);
|
|
48938
48858
|
const titleBags = /* @__PURE__ */ new Map();
|
|
48939
48859
|
const bagsMap = /* @__PURE__ */ new Map();
|
|
48940
48860
|
for (const row of this.bagTiddlers) {
|
|
@@ -48952,37 +48872,55 @@ var StoreWriter = class extends StoreBase {
|
|
|
48952
48872
|
const tiddler = bagsMap.get(info7.readFromBag.bag_id).get(title);
|
|
48953
48873
|
bagInfo[title] = info7.readFromBag.bag.name;
|
|
48954
48874
|
revisionInfo[title] = tiddler.revision.toString();
|
|
48955
|
-
await writeTiddler(tiddler.fields);
|
|
48875
|
+
await this.writeTiddler(tiddler.fields);
|
|
48956
48876
|
}
|
|
48957
|
-
|
|
48958
|
-
|
|
48959
|
-
|
|
48960
|
-
|
|
48961
|
-
|
|
48962
|
-
|
|
48963
|
-
|
|
48964
|
-
|
|
48965
|
-
|
|
48966
|
-
|
|
48967
|
-
|
|
48968
|
-
|
|
48969
|
-
|
|
48970
|
-
|
|
48971
|
-
|
|
48972
|
-
|
|
48973
|
-
|
|
48974
|
-
|
|
48975
|
-
|
|
48976
|
-
|
|
48977
|
-
|
|
48978
|
-
|
|
48979
|
-
|
|
48980
|
-
|
|
48877
|
+
await this.writeFinalTiddlers(bagInfo, revisionInfo, keepLastSuffix);
|
|
48878
|
+
}
|
|
48879
|
+
};
|
|
48880
|
+
var DocsStoreWriter = class extends StoreWriter {
|
|
48881
|
+
constructor(state, tiddlers, format, plugins) {
|
|
48882
|
+
super();
|
|
48883
|
+
this.state = state;
|
|
48884
|
+
this.tiddlers = tiddlers;
|
|
48885
|
+
this.plugins = plugins;
|
|
48886
|
+
this.injectionFunction = defaultPreloadFunction;
|
|
48887
|
+
this.externalPlugins = true;
|
|
48888
|
+
this.lastEventId = "0";
|
|
48889
|
+
this.recipeSlug = "tw5.com";
|
|
48890
|
+
switch (format) {
|
|
48891
|
+
case "store.js":
|
|
48892
|
+
this.prefix = this.injectionFunction + "(";
|
|
48893
|
+
this.suffix = ");\n";
|
|
48894
|
+
this.dropLastSuffix = false;
|
|
48895
|
+
break;
|
|
48896
|
+
case "store.json":
|
|
48897
|
+
this.prefix = "";
|
|
48898
|
+
this.suffix = ",\n";
|
|
48899
|
+
this.dropLastSuffix = true;
|
|
48900
|
+
break;
|
|
48981
48901
|
}
|
|
48982
|
-
|
|
48983
|
-
|
|
48984
|
-
|
|
48985
|
-
|
|
48902
|
+
}
|
|
48903
|
+
state;
|
|
48904
|
+
tiddlers;
|
|
48905
|
+
plugins;
|
|
48906
|
+
static {
|
|
48907
|
+
__name(this, "DocsStoreWriter");
|
|
48908
|
+
}
|
|
48909
|
+
prefix;
|
|
48910
|
+
suffix;
|
|
48911
|
+
lastEventId;
|
|
48912
|
+
recipeSlug;
|
|
48913
|
+
dropLastSuffix;
|
|
48914
|
+
externalPlugins;
|
|
48915
|
+
injectionFunction;
|
|
48916
|
+
async writeStore(keepLastSuffix) {
|
|
48917
|
+
await this.writePlugins();
|
|
48918
|
+
for (const fields of this.tiddlers) {
|
|
48919
|
+
await this.writeTiddler(fields);
|
|
48920
|
+
}
|
|
48921
|
+
const bagInfo = {};
|
|
48922
|
+
const revisionInfo = {};
|
|
48923
|
+
await this.writeFinalTiddlers(bagInfo, revisionInfo, keepLastSuffix);
|
|
48986
48924
|
}
|
|
48987
48925
|
};
|
|
48988
48926
|
|
|
@@ -49406,7 +49344,7 @@ var RecipeImportWriter = class extends PerClassImportWriter {
|
|
|
49406
49344
|
bagName: e,
|
|
49407
49345
|
isWritable: false,
|
|
49408
49346
|
priority: i + writablePrefixBags.length,
|
|
49409
|
-
prefix: ""
|
|
49347
|
+
prefix: "" + i
|
|
49410
49348
|
}))
|
|
49411
49349
|
]
|
|
49412
49350
|
};
|
|
@@ -49469,7 +49407,10 @@ var RecipeDataAdapter = class extends TabDataAdapter {
|
|
|
49469
49407
|
authoredDefinition,
|
|
49470
49408
|
template.definition
|
|
49471
49409
|
);
|
|
49472
|
-
const recipePermissions = normalizePermissions(
|
|
49410
|
+
const recipePermissions = normalizePermissions([
|
|
49411
|
+
...data.recipeUsers.map((e) => ({ level: "A_read", role: e })),
|
|
49412
|
+
...data.recipeAdmins.map((e) => ({ level: "B_write", role: e }))
|
|
49413
|
+
]);
|
|
49473
49414
|
const roles = await getRolesMapper(prisma, recipePermissions.map((row) => row.role));
|
|
49474
49415
|
const [[id, lastCompiledAt]] = await importer.upsert([{
|
|
49475
49416
|
slug: data.slug,
|
|
@@ -49504,10 +49445,12 @@ var RecipeDataAdapter = class extends TabDataAdapter {
|
|
|
49504
49445
|
slug,
|
|
49505
49446
|
templateName,
|
|
49506
49447
|
lastCompiledAt: lastCompiledAt.toISOString(),
|
|
49507
|
-
recipePermissions,
|
|
49448
|
+
// recipePermissions,
|
|
49508
49449
|
effectiveWritableBags,
|
|
49509
49450
|
effectiveReadonlyBags,
|
|
49510
|
-
effectivePluginSet
|
|
49451
|
+
effectivePluginSet,
|
|
49452
|
+
recipeAdmins: recipePermissions.filter((e) => e.level === "B_write").map((e) => e.role),
|
|
49453
|
+
recipeUsers: recipePermissions.filter((e) => e.level === "A_read").map((e) => e.role)
|
|
49511
49454
|
};
|
|
49512
49455
|
}
|
|
49513
49456
|
async getList(prisma, roles) {
|
|
@@ -49568,7 +49511,11 @@ var TemplateDataAdapter = class extends TabDataAdapter {
|
|
|
49568
49511
|
async saveRow(prisma, data) {
|
|
49569
49512
|
const importer = new TemplateImportWriter(prisma, false);
|
|
49570
49513
|
await importer.checkExisting(data.id, data.name, this.user);
|
|
49571
|
-
const
|
|
49514
|
+
const templatePermissions = [
|
|
49515
|
+
...data.templateUsers.map((e) => ({ level: "A_read", role: e })),
|
|
49516
|
+
...data.templateAdmins.map((e) => ({ level: "B_write", role: e }))
|
|
49517
|
+
];
|
|
49518
|
+
const roleIds = await getRolesMapper(prisma, templatePermissions.map((row) => row.role));
|
|
49572
49519
|
let template;
|
|
49573
49520
|
const isDefault = data.name === DEFAULT_TEMPLATE;
|
|
49574
49521
|
if (isDefault) {
|
|
@@ -49581,7 +49528,7 @@ var TemplateDataAdapter = class extends TabDataAdapter {
|
|
|
49581
49528
|
externalPlugins: data.externalPlugins,
|
|
49582
49529
|
externalStore: data.externalStore
|
|
49583
49530
|
},
|
|
49584
|
-
permissions:
|
|
49531
|
+
permissions: templatePermissions.map((e) => ({ level: e.level, role_id: roleIds(e.role) }))
|
|
49585
49532
|
};
|
|
49586
49533
|
} else {
|
|
49587
49534
|
template = {
|
|
@@ -49601,7 +49548,7 @@ var TemplateDataAdapter = class extends TabDataAdapter {
|
|
|
49601
49548
|
injectionFunction: data.injectionFunction,
|
|
49602
49549
|
injectionLocation: data.injectionLocation
|
|
49603
49550
|
},
|
|
49604
|
-
permissions:
|
|
49551
|
+
permissions: templatePermissions.map((e) => ({ level: e.level, role_id: roleIds(e.role) }))
|
|
49605
49552
|
};
|
|
49606
49553
|
}
|
|
49607
49554
|
const [{ id: template_id, updated }] = await importer.upsert([template]);
|
|
@@ -49629,17 +49576,14 @@ var TemplateDataAdapter = class extends TabDataAdapter {
|
|
|
49629
49576
|
}]);
|
|
49630
49577
|
}
|
|
49631
49578
|
}
|
|
49632
|
-
const roleNames = await new RoleImportWriter(prisma, false).getIdMapper();
|
|
49633
49579
|
return {
|
|
49634
49580
|
...template.definition,
|
|
49635
49581
|
id: new IdString(template_id),
|
|
49636
49582
|
name: data.name,
|
|
49637
49583
|
type: "simpleV1",
|
|
49638
49584
|
lastUpdatedAt: updated.toISOString(),
|
|
49639
|
-
|
|
49640
|
-
|
|
49641
|
-
role: roleNames(e.role_id)
|
|
49642
|
-
}))
|
|
49585
|
+
templateAdmins: templatePermissions.filter((e) => e.level === "B_write").map((e) => e.role),
|
|
49586
|
+
templateUsers: templatePermissions.filter((e) => e.level === "A_read").map((e) => e.role)
|
|
49643
49587
|
};
|
|
49644
49588
|
}
|
|
49645
49589
|
async getList(prisma, roles) {
|
|
@@ -49673,10 +49617,8 @@ var TemplateDataAdapter = class extends TabDataAdapter {
|
|
|
49673
49617
|
name: template.name,
|
|
49674
49618
|
type: "simpleV1",
|
|
49675
49619
|
lastUpdatedAt: template.updated.toISOString(),
|
|
49676
|
-
|
|
49677
|
-
|
|
49678
|
-
role: roles(new IdString(e.role_id))
|
|
49679
|
-
}))
|
|
49620
|
+
templateAdmins: template.permissions.filter((e) => e.level === "B_write").map((e) => roles(new IdString(e.role_id))),
|
|
49621
|
+
templateUsers: template.permissions.filter((e) => e.level === "A_read").map((e) => roles(new IdString(e.role_id)))
|
|
49680
49622
|
};
|
|
49681
49623
|
});
|
|
49682
49624
|
}
|
|
@@ -49916,14 +49858,13 @@ var RecipeStatus = zodRoute({
|
|
|
49916
49858
|
state.assertWikiReferer(recipe_slug);
|
|
49917
49859
|
const recipe = await RecipeResolver.assertRecipe({
|
|
49918
49860
|
state,
|
|
49919
|
-
recipe_slug
|
|
49920
|
-
needsWrite: false
|
|
49861
|
+
recipe_slug
|
|
49921
49862
|
}).then((e) => {
|
|
49922
49863
|
state.asserted = true;
|
|
49923
49864
|
return e;
|
|
49924
49865
|
});
|
|
49925
49866
|
return await state.$transaction(async (prisma) => {
|
|
49926
|
-
const r = new RecipeResolver(recipe, prisma, state.user
|
|
49867
|
+
const r = new RecipeResolver(recipe, prisma, state.user);
|
|
49927
49868
|
const { isAdmin, user_id, username, isLoggedIn } = state.user;
|
|
49928
49869
|
return {
|
|
49929
49870
|
isAdmin,
|
|
@@ -49955,14 +49896,13 @@ var TiddlerList = zodRoute({
|
|
|
49955
49896
|
state.assertWikiReferer(recipe_slug);
|
|
49956
49897
|
const recipe = await RecipeResolver.assertRecipe({
|
|
49957
49898
|
state,
|
|
49958
|
-
recipe_slug
|
|
49959
|
-
needsWrite: false
|
|
49899
|
+
recipe_slug
|
|
49960
49900
|
}).then((e) => {
|
|
49961
49901
|
state.asserted = true;
|
|
49962
49902
|
return e;
|
|
49963
49903
|
});
|
|
49964
49904
|
return await state.$transaction(async (prisma) => {
|
|
49965
|
-
const r = new RecipeResolver(recipe, prisma, state.user
|
|
49905
|
+
const r = new RecipeResolver(recipe, prisma, state.user);
|
|
49966
49906
|
return await r.listTiddlers();
|
|
49967
49907
|
});
|
|
49968
49908
|
}, "inner")
|
|
@@ -49979,7 +49919,7 @@ var RecipeStoreJS = zodRoute({
|
|
|
49979
49919
|
inner: /* @__PURE__ */ __name(async (state) => {
|
|
49980
49920
|
const { recipe_slug } = state.pathParams;
|
|
49981
49921
|
state.assertWikiReferer(recipe_slug);
|
|
49982
|
-
throw await
|
|
49922
|
+
throw await serveWikiIndex(state, recipe_slug, "store.js");
|
|
49983
49923
|
}, "inner")
|
|
49984
49924
|
});
|
|
49985
49925
|
var RecipeStoreJSON = zodRoute({
|
|
@@ -49994,7 +49934,7 @@ var RecipeStoreJSON = zodRoute({
|
|
|
49994
49934
|
inner: /* @__PURE__ */ __name(async (state) => {
|
|
49995
49935
|
const { recipe_slug } = state.pathParams;
|
|
49996
49936
|
state.assertWikiReferer(recipe_slug);
|
|
49997
|
-
throw await
|
|
49937
|
+
throw await serveWikiIndex(state, recipe_slug, "store.json");
|
|
49998
49938
|
}, "inner")
|
|
49999
49939
|
});
|
|
50000
49940
|
var RecipeUpdates = zodRoute({
|
|
@@ -50011,14 +49951,13 @@ var RecipeUpdates = zodRoute({
|
|
|
50011
49951
|
state.assertWikiReferer(recipe_slug);
|
|
50012
49952
|
const recipe = await RecipeResolver.assertRecipe({
|
|
50013
49953
|
state,
|
|
50014
|
-
recipe_slug
|
|
50015
|
-
needsWrite: false
|
|
49954
|
+
recipe_slug
|
|
50016
49955
|
}).then((e) => {
|
|
50017
49956
|
state.asserted = true;
|
|
50018
49957
|
return e;
|
|
50019
49958
|
});
|
|
50020
49959
|
return await state.$transaction(async (prisma) => {
|
|
50021
|
-
const r = new RecipeResolver(recipe, prisma, state.user
|
|
49960
|
+
const r = new RecipeResolver(recipe, prisma, state.user);
|
|
50022
49961
|
const bagIDMap = new Map(recipe.recipe_bags.map((b2) => [b2.bag_id, b2]));
|
|
50023
49962
|
const since = Number(state.query.get("since")) || 0;
|
|
50024
49963
|
const events = await prisma.tiddlerEvent.findMany({
|
|
@@ -50064,14 +50003,13 @@ var TiddlerBatch = zodRoute({
|
|
|
50064
50003
|
state.assertWikiReferer(recipe_slug);
|
|
50065
50004
|
const recipe = await RecipeResolver.assertRecipe({
|
|
50066
50005
|
state,
|
|
50067
|
-
recipe_slug
|
|
50068
|
-
needsWrite: op !== "list" && op !== "read"
|
|
50006
|
+
recipe_slug
|
|
50069
50007
|
}).then((e) => {
|
|
50070
50008
|
state.asserted = true;
|
|
50071
50009
|
return e;
|
|
50072
50010
|
});
|
|
50073
50011
|
return await state.$transaction(async (prisma) => {
|
|
50074
|
-
const r = new RecipeResolver(recipe, prisma, state.user
|
|
50012
|
+
const r = new RecipeResolver(recipe, prisma, state.user);
|
|
50075
50013
|
if (op === "list") {
|
|
50076
50014
|
return await r.listTiddlers();
|
|
50077
50015
|
}
|
|
@@ -50108,13 +50046,23 @@ serverEvents.on("mws.routes", (root) => {
|
|
|
50108
50046
|
const parent = root.defineRoute({
|
|
50109
50047
|
method: [],
|
|
50110
50048
|
denyFinal: true,
|
|
50111
|
-
path: new RegExp(`^(?=/recipe/|/wiki/|/admin/|/api/)`)
|
|
50049
|
+
path: new RegExp(`^(?=/recipe/|/wiki/|/admin/|/api/|/tw5/)`)
|
|
50112
50050
|
}, async (state) => {
|
|
50113
50051
|
});
|
|
50114
50052
|
Object.entries(ApiRoutes).forEach(([key, val]) => {
|
|
50115
50053
|
if (!val) return;
|
|
50116
50054
|
defineZodRoute(parent, key, val);
|
|
50117
50055
|
});
|
|
50056
|
+
parent.defineRoute({
|
|
50057
|
+
method: ["GET", "HEAD", "OPTIONS"],
|
|
50058
|
+
path: new RegExp(`^/tw5/$`),
|
|
50059
|
+
bodyFormat: "ignore"
|
|
50060
|
+
}, async (state) => {
|
|
50061
|
+
if (state.method === "OPTIONS")
|
|
50062
|
+
return state.sendEmpty(405);
|
|
50063
|
+
const { plugins, tiddlers, version: version2 } = state.pluginCache.tw5Docs;
|
|
50064
|
+
return await serveDocsIndex(state, tiddlers, plugins, version2);
|
|
50065
|
+
});
|
|
50118
50066
|
parent.defineRoute({
|
|
50119
50067
|
method: ["GET", "HEAD", "OPTIONS"],
|
|
50120
50068
|
path: new RegExp(`^/wiki/(?<recipe_slug>[^/]+)$`),
|
|
@@ -50127,7 +50075,7 @@ serverEvents.on("mws.routes", (root) => {
|
|
|
50127
50075
|
}), new Error());
|
|
50128
50076
|
const { recipe_slug } = state.pathParams;
|
|
50129
50077
|
state.assertWikiReferer(recipe_slug);
|
|
50130
|
-
return await
|
|
50078
|
+
return await serveWikiIndex(state, recipe_slug, "index");
|
|
50131
50079
|
}, async (state, e) => {
|
|
50132
50080
|
if (state.headersSent) {
|
|
50133
50081
|
console.log(e.stack + "\nCaptured by:\n" + new Error("").stack?.split("\n").slice(1).join("\n"));
|
|
@@ -50214,7 +50162,8 @@ serverEvents.on("mws.routes", (root, config3) => {
|
|
|
50214
50162
|
}
|
|
50215
50163
|
});
|
|
50216
50164
|
});
|
|
50217
|
-
async function importPlugins(
|
|
50165
|
+
async function importPlugins(cacheFolder, type, $tw, mwsVersion, arrayStrings) {
|
|
50166
|
+
const twFolder = path4.join($tw.boot.corePath, "..");
|
|
50218
50167
|
const readLevel = /* @__PURE__ */ __name((d) => {
|
|
50219
50168
|
return fs.readdirSync(path4.join(twFolder, d)).filter((e) => !$tw.boot.excludeRegExp.test(e)).map((e) => path4.join(d, e));
|
|
50220
50169
|
}, "readLevel");
|
|
@@ -50229,7 +50178,8 @@ async function importPlugins(twFolder, cacheFolder, type, $tw, mwsVersion, array
|
|
|
50229
50178
|
"core"
|
|
50230
50179
|
].map((e) => {
|
|
50231
50180
|
const oldPath = path4.join(twFolder, e);
|
|
50232
|
-
const
|
|
50181
|
+
const pluginCode = path4.relative(twFolder, oldPath);
|
|
50182
|
+
const relativePluginPath = path4.join("tiddlywiki", $tw.version, pluginCode);
|
|
50233
50183
|
return [oldPath, relativePluginPath];
|
|
50234
50184
|
});
|
|
50235
50185
|
const mwsRelative = `mws/${mwsVersion}/client`;
|
|
@@ -50298,9 +50248,9 @@ async function importPlugins(twFolder, cacheFolder, type, $tw, mwsVersion, array
|
|
|
50298
50248
|
}
|
|
50299
50249
|
return hash2;
|
|
50300
50250
|
}));
|
|
50301
|
-
tiddlerFiles.set(plugin.title, relativePluginPath);
|
|
50251
|
+
tiddlerFiles.set(plugin.title, relativePluginPath.replaceAll("\\", "/"));
|
|
50302
50252
|
pluginsList.push({
|
|
50303
|
-
path: relativePluginPath,
|
|
50253
|
+
path: relativePluginPath.replaceAll("\\", "/"),
|
|
50304
50254
|
hashes,
|
|
50305
50255
|
name: plugin.name,
|
|
50306
50256
|
description: plugin.description,
|
|
@@ -50423,7 +50373,7 @@ async function bootTiddlyWiki(wikiPath, TiddlyWiki) {
|
|
|
50423
50373
|
wikiPath
|
|
50424
50374
|
// this should be inert
|
|
50425
50375
|
];
|
|
50426
|
-
await new Promise((
|
|
50376
|
+
await new Promise((resolve11) => $tw.boot.boot(resolve11));
|
|
50427
50377
|
ok2(!$tw.boot.tasks.readBrowserTiddlers, "TiddlyWiki boot thinks we're in a browser");
|
|
50428
50378
|
const titles = $tw.wiki.filterTiddlers("[all[shadows]is[system]type[application/javascript]library[yes]]");
|
|
50429
50379
|
titles.forEach((title) => {
|
|
@@ -50435,18 +50385,96 @@ __name(bootTiddlyWiki, "bootTiddlyWiki");
|
|
|
50435
50385
|
|
|
50436
50386
|
// packages/mws/src/plugin-cache/index.ts
|
|
50437
50387
|
import { Debug as Debug4 } from "@prisma/client/runtime/client";
|
|
50388
|
+
|
|
50389
|
+
// packages/mws/src/plugin-cache/importEditions.ts
|
|
50390
|
+
init_esm_shims();
|
|
50391
|
+
import * as path5 from "path";
|
|
50392
|
+
import * as fs2 from "fs";
|
|
50393
|
+
function loadWikiTiddlers($tw, wikiPath, parentPaths) {
|
|
50394
|
+
const bags = [];
|
|
50395
|
+
const wikiInfoPath = path5.resolve(wikiPath, $tw.config.wikiInfo);
|
|
50396
|
+
let wikiInfo;
|
|
50397
|
+
if (fs2.existsSync(wikiInfoPath)) {
|
|
50398
|
+
wikiInfo = $tw.utils.parseJSONSafe(fs2.readFileSync(wikiInfoPath, "utf8"), function() {
|
|
50399
|
+
return null;
|
|
50400
|
+
});
|
|
50401
|
+
}
|
|
50402
|
+
const tiddlersFromPath = [];
|
|
50403
|
+
const pluginNamesTW5 = [];
|
|
50404
|
+
if (!wikiInfo) return [];
|
|
50405
|
+
if (wikiInfo.includeWikis) {
|
|
50406
|
+
parentPaths = parentPaths.slice(0);
|
|
50407
|
+
parentPaths.push(wikiPath);
|
|
50408
|
+
$tw.utils.each(wikiInfo.includeWikis, function(info7) {
|
|
50409
|
+
if (typeof info7 === "string") {
|
|
50410
|
+
info7 = { path: info7 };
|
|
50411
|
+
}
|
|
50412
|
+
var resolvedIncludedWikiPath = path5.resolve(wikiPath, info7.path);
|
|
50413
|
+
if (parentPaths.indexOf(resolvedIncludedWikiPath) === -1) {
|
|
50414
|
+
bags.push(...loadWikiTiddlers($tw, resolvedIncludedWikiPath, parentPaths));
|
|
50415
|
+
} else {
|
|
50416
|
+
$tw.utils.error("Cannot recursively include wiki " + resolvedIncludedWikiPath);
|
|
50417
|
+
}
|
|
50418
|
+
});
|
|
50419
|
+
}
|
|
50420
|
+
const twFolder = path5.join($tw.boot.corePath, "..");
|
|
50421
|
+
const extraPlugins = [];
|
|
50422
|
+
const loadPlugins = /* @__PURE__ */ __name((plugins, libraryPath, envVar) => {
|
|
50423
|
+
$tw.utils.each(plugins, function(pluginName) {
|
|
50424
|
+
const pluginPaths = $tw.getLibraryItemSearchPaths(libraryPath, envVar);
|
|
50425
|
+
const pluginPath = $tw.findLibraryItem(pluginName, pluginPaths);
|
|
50426
|
+
if (!pluginPath) return;
|
|
50427
|
+
const relPath = path5.relative(twFolder, pluginPath);
|
|
50428
|
+
if (relPath.startsWith("..")) extraPlugins.push(pluginPath);
|
|
50429
|
+
else pluginNamesTW5.push(relPath);
|
|
50430
|
+
});
|
|
50431
|
+
}, "loadPlugins");
|
|
50432
|
+
loadPlugins(wikiInfo.plugins, $tw.config.pluginsPath, $tw.config.pluginsEnvVar);
|
|
50433
|
+
loadPlugins(wikiInfo.themes, $tw.config.themesPath, $tw.config.themesEnvVar);
|
|
50434
|
+
loadPlugins(wikiInfo.languages, $tw.config.languagesPath, $tw.config.languagesEnvVar);
|
|
50435
|
+
const tiddler_files_path = path5.resolve(wikiPath, $tw.config.wikiTiddlersSubDir);
|
|
50436
|
+
tiddlersFromPath.push(...$tw.loadTiddlersFromPath(path5.resolve(tiddler_files_path)).map((e) => e.tiddlers).flat());
|
|
50437
|
+
const loadWikiPlugins = /* @__PURE__ */ __name((wikiPluginsPath) => {
|
|
50438
|
+
if (fs2.existsSync(wikiPluginsPath)) {
|
|
50439
|
+
var pluginFolders = fs2.readdirSync(wikiPluginsPath);
|
|
50440
|
+
for (var t = 0; t < pluginFolders.length; t++) {
|
|
50441
|
+
extraPlugins.push(path5.resolve(wikiPluginsPath, "./" + pluginFolders[t]));
|
|
50442
|
+
}
|
|
50443
|
+
}
|
|
50444
|
+
}, "loadWikiPlugins");
|
|
50445
|
+
loadWikiPlugins(path5.resolve(wikiPath, $tw.config.wikiPluginsSubDir));
|
|
50446
|
+
loadWikiPlugins(path5.resolve(wikiPath, $tw.config.wikiThemesSubDir));
|
|
50447
|
+
loadWikiPlugins(path5.resolve(wikiPath, $tw.config.wikiLanguagesSubDir));
|
|
50448
|
+
extraPlugins.forEach((e) => {
|
|
50449
|
+
const plugin = $tw.loadPluginFolder(e);
|
|
50450
|
+
if (!plugin) {
|
|
50451
|
+
console.log(`No plugin found at ${e}`);
|
|
50452
|
+
} else if (!plugin.title) {
|
|
50453
|
+
console.log(`Found a valid plugin at ${e} but it doesn't have a title.`);
|
|
50454
|
+
} else {
|
|
50455
|
+
console.log(`Loading plugin ${e} into bag since it isn't a TiddlyWiki plugin`);
|
|
50456
|
+
tiddlersFromPath.push(plugin);
|
|
50457
|
+
}
|
|
50458
|
+
return void 0;
|
|
50459
|
+
});
|
|
50460
|
+
return [...bags, { tiddlers: tiddlersFromPath, plugins: pluginNamesTW5, wikiFolder: wikiPath }];
|
|
50461
|
+
}
|
|
50462
|
+
__name(loadWikiTiddlers, "loadWikiTiddlers");
|
|
50463
|
+
|
|
50464
|
+
// packages/mws/src/plugin-cache/index.ts
|
|
50438
50465
|
var debug2 = Debug4("mws:cache");
|
|
50439
|
-
async function
|
|
50440
|
-
if (!
|
|
50466
|
+
async function getTW5Paths(wikiPath) {
|
|
50467
|
+
if (!fs3.existsSync(path6.resolve(wikiPath, "tw5"))) {
|
|
50441
50468
|
throw new Error("You need to run update-tiddlywiki first");
|
|
50442
50469
|
}
|
|
50443
|
-
const folders = (await Promise.all((await readdir3(
|
|
50444
|
-
const s3 = await stat2(
|
|
50470
|
+
const folders = (await Promise.all((await readdir3(path6.resolve(wikiPath, "tw5"))).map(async (e) => {
|
|
50471
|
+
const s3 = await stat2(path6.resolve(wikiPath, "tw5", e));
|
|
50445
50472
|
if (!s3.isDirectory()) return;
|
|
50446
|
-
const t = /^tw5-5\.([0-9]+)\.([0-9]+)(.*)/.exec(
|
|
50473
|
+
const t = /^tw5-5\.([0-9]+)\.([0-9]+)(.*)/.exec(e);
|
|
50447
50474
|
if (!t) return;
|
|
50448
50475
|
const [, minor, patch, extra] = t;
|
|
50449
|
-
|
|
50476
|
+
const name = `tw5-5.${minor}.${patch}${extra}`;
|
|
50477
|
+
return { minor, patch, extra, name };
|
|
50450
50478
|
}))).filter(truthy).sort((a, b2) => {
|
|
50451
50479
|
return +a.minor - +b2.minor || +a.patch - +b2.patch || a.extra.localeCompare(b2.extra);
|
|
50452
50480
|
});
|
|
@@ -50454,36 +50482,37 @@ async function getTW5Path(wikiPath) {
|
|
|
50454
50482
|
throw new Error("No valid tiddlywiki folder found");
|
|
50455
50483
|
}
|
|
50456
50484
|
await writeFile2(
|
|
50457
|
-
|
|
50458
|
-
folders.map((
|
|
50485
|
+
path6.resolve(wikiPath, "tw5", "versions.txt"),
|
|
50486
|
+
folders.map((e) => `tw5-5.${e.minor}.${e.patch}${e.extra}`).join("\n")
|
|
50459
50487
|
);
|
|
50460
|
-
|
|
50461
|
-
return path5.resolve(wikiPath, "tw5", `tw5-5.${e.minor}.${e.patch}${e.extra}`);
|
|
50488
|
+
return folders;
|
|
50462
50489
|
}
|
|
50463
|
-
__name(
|
|
50490
|
+
__name(getTW5Paths, "getTW5Paths");
|
|
50464
50491
|
async function bootDefaultTiddlyWiki(wikiPath) {
|
|
50465
|
-
const
|
|
50492
|
+
const e = (await getTW5Paths(wikiPath)).pop();
|
|
50493
|
+
const twPath = path6.resolve(wikiPath, "tw5", `tw5-5.${e.minor}.${e.patch}${e.extra}`);
|
|
50494
|
+
const { TiddlyWiki } = __require(path6.resolve(twPath, "boot/boot.js"));
|
|
50466
50495
|
return await bootTiddlyWiki(wikiPath, TiddlyWiki);
|
|
50467
50496
|
}
|
|
50468
50497
|
__name(bootDefaultTiddlyWiki, "bootDefaultTiddlyWiki");
|
|
50469
50498
|
async function startupCache(wikiPath, cacheArrayStrings) {
|
|
50470
|
-
const cachePath =
|
|
50471
|
-
|
|
50472
|
-
const
|
|
50473
|
-
const pkg = JSON.parse(fs2.readFileSync(dist_resolve("../package.json"), "utf8"));
|
|
50499
|
+
const cachePath = path6.resolve(wikiPath, "cache");
|
|
50500
|
+
fs3.mkdirSync(cachePath, { recursive: true });
|
|
50501
|
+
const pkg = JSON.parse(fs3.readFileSync(dist_resolve("../package.json"), "utf8"));
|
|
50474
50502
|
Object.seal(cacheArrayStrings);
|
|
50503
|
+
const $tw = await bootDefaultTiddlyWiki(wikiPath);
|
|
50475
50504
|
const {
|
|
50476
50505
|
tiddlerFiles: pluginFiles,
|
|
50477
50506
|
tiddlerHashes: pluginHashes,
|
|
50478
50507
|
pluginsList
|
|
50479
50508
|
} = await importPlugins(
|
|
50480
|
-
path5.join($tw.boot.corePath, ".."),
|
|
50481
50509
|
cachePath,
|
|
50482
50510
|
"client",
|
|
50483
50511
|
$tw,
|
|
50484
50512
|
pkg.version,
|
|
50485
50513
|
cacheArrayStrings
|
|
50486
50514
|
);
|
|
50515
|
+
const tw5Docs = loadWikiTiddlers($tw, path6.resolve($tw.boot.corePath, "../editions/tw5.com"), []);
|
|
50487
50516
|
const requiredPlugins = [
|
|
50488
50517
|
"$:/plugins/mws/client",
|
|
50489
50518
|
"$:/themes/tiddlywiki/snowwhite",
|
|
@@ -50497,15 +50526,16 @@ async function startupCache(wikiPath, cacheArrayStrings) {
|
|
|
50497
50526
|
saveTiddlerFilter: "$:/SplashScreen"
|
|
50498
50527
|
}
|
|
50499
50528
|
});
|
|
50500
|
-
const filepath =
|
|
50501
|
-
|
|
50529
|
+
const filepath = path6.resolve(cachePath, "tiddlywiki5.html");
|
|
50530
|
+
fs3.writeFileSync(filepath, result);
|
|
50531
|
+
const filePlugins = new Map([...pluginFiles.entries()].map((e) => e.reverse()));
|
|
50502
50532
|
return {
|
|
50503
50533
|
/** `(arrayString: string): TiddlerHasher;` */
|
|
50504
50534
|
pluginHashes,
|
|
50505
50535
|
/** Map of "title" to `relative("/wiki/cache", dirname("plugin.json"))`. Reverse of filePlugins. */
|
|
50506
50536
|
pluginFiles,
|
|
50507
50537
|
/** Map of `relative("/wiki/cache", dirname("plugin.json"))` to "title". Reverse of pluginFiles. */
|
|
50508
|
-
filePlugins
|
|
50538
|
+
filePlugins,
|
|
50509
50539
|
/** List of plugins saved in the cache. */
|
|
50510
50540
|
pluginsList,
|
|
50511
50541
|
/** List of plugins generally required to make MWS work. */
|
|
@@ -50513,7 +50543,17 @@ async function startupCache(wikiPath, cacheArrayStrings) {
|
|
|
50513
50543
|
/** The actual path of "/wiki/cache" */
|
|
50514
50544
|
cachePath,
|
|
50515
50545
|
/** Template "preloadFunction" values which are gzipped at startup and saved to disk to save CPU cycles per request. */
|
|
50516
|
-
cacheArrayStrings
|
|
50546
|
+
cacheArrayStrings,
|
|
50547
|
+
tw5Docs: {
|
|
50548
|
+
plugins: [
|
|
50549
|
+
"$:/core",
|
|
50550
|
+
...tw5Docs[0].plugins.map(
|
|
50551
|
+
(folder) => filePlugins.get(path6.join("tiddlywiki", $tw.version, folder).replaceAll("\\", "/")) ?? thrower(new Error("couldn't find the tw5 plugin " + folder))
|
|
50552
|
+
)
|
|
50553
|
+
],
|
|
50554
|
+
tiddlers: tw5Docs[0].tiddlers,
|
|
50555
|
+
version: $tw.version
|
|
50556
|
+
}
|
|
50517
50557
|
};
|
|
50518
50558
|
}
|
|
50519
50559
|
__name(startupCache, "startupCache");
|
|
@@ -50521,7 +50561,7 @@ __name(startupCache, "startupCache");
|
|
|
50521
50561
|
// packages/mws/src/services/PasswordService.ts
|
|
50522
50562
|
init_esm_shims();
|
|
50523
50563
|
import * as opaque from "@serenity-kit/opaque";
|
|
50524
|
-
import { randomBytes as
|
|
50564
|
+
import { randomBytes as randomBytes4 } from "crypto";
|
|
50525
50565
|
import { ok as ok3 } from "assert";
|
|
50526
50566
|
async function createPasswordService(serverSetup) {
|
|
50527
50567
|
await opaque.ready;
|
|
@@ -50577,7 +50617,7 @@ async function createPasswordService(serverSetup) {
|
|
|
50577
50617
|
async function startLoginSession(stater) {
|
|
50578
50618
|
let loginSession;
|
|
50579
50619
|
do {
|
|
50580
|
-
loginSession =
|
|
50620
|
+
loginSession = randomBytes4(16).toString("base64url");
|
|
50581
50621
|
} while (serverState.has(loginSession));
|
|
50582
50622
|
serverState.set(loginSession, stater);
|
|
50583
50623
|
return loginSession;
|
|
@@ -50603,22 +50643,22 @@ __name(createPasswordService, "createPasswordService");
|
|
|
50603
50643
|
// packages/mws/src/startup.ts
|
|
50604
50644
|
import * as opaque2 from "@serenity-kit/opaque";
|
|
50605
50645
|
serverEvents.on("cli.execute.before", async (name, params, options, instance) => {
|
|
50606
|
-
const wikiPath =
|
|
50607
|
-
if (!
|
|
50646
|
+
const wikiPath = path7.resolve(process.cwd());
|
|
50647
|
+
if (!existsSync8(wikiPath)) throw "The wiki path does not exist";
|
|
50608
50648
|
if (is(instance, name === "update-tiddlywiki")) {
|
|
50609
50649
|
instance.wikiPath = wikiPath;
|
|
50610
50650
|
return;
|
|
50611
50651
|
}
|
|
50612
|
-
const cachePath =
|
|
50652
|
+
const cachePath = path7.resolve(wikiPath, "cache");
|
|
50613
50653
|
const passwordService = await createPasswordService(readPasswordMasterKey(wikiPath));
|
|
50614
50654
|
const cacheArrayStrings = [defaultPreloadFunction];
|
|
50615
50655
|
await serverEvents.emitAsync("mws.cache.init.before", { cacheArrayStrings });
|
|
50616
50656
|
const cache = await startupCache(wikiPath, cacheArrayStrings);
|
|
50617
50657
|
await serverEvents.emitAsync("mws.cache.init.after", { cache });
|
|
50618
|
-
const storePath =
|
|
50658
|
+
const storePath = path7.resolve(wikiPath, "store");
|
|
50619
50659
|
mkdirSync3(storePath, { recursive: true });
|
|
50620
|
-
const databasePath =
|
|
50621
|
-
writeFileSync4(
|
|
50660
|
+
const databasePath = path7.resolve(storePath, "database.sqlite");
|
|
50661
|
+
writeFileSync4(path7.join(storePath, "KEEP_ALL_THESE_FILES.txt"), [
|
|
50622
50662
|
"It is incredibly important that you do not delete any files ",
|
|
50623
50663
|
"in the store folder, as they are all part of the sqlite database. ",
|
|
50624
50664
|
"If you delete any of them, you will definitely lose data. ",
|
|
@@ -50645,12 +50685,12 @@ serverEvents.on("cli.execute.before", async (name, params, options, instance) =>
|
|
|
50645
50685
|
instance.$tw = $tw;
|
|
50646
50686
|
});
|
|
50647
50687
|
function readPasswordMasterKey(wikiPath) {
|
|
50648
|
-
const passwordKeyFile =
|
|
50649
|
-
if (typeof passwordKeyFile === "string" && passwordKeyFile && !
|
|
50688
|
+
const passwordKeyFile = path7.join(wikiPath, "passwords.key");
|
|
50689
|
+
if (typeof passwordKeyFile === "string" && passwordKeyFile && !existsSync8(passwordKeyFile)) {
|
|
50650
50690
|
writeFileSync4(passwordKeyFile, opaque2.server.createSetup());
|
|
50651
50691
|
console.log("Password master key created at", passwordKeyFile);
|
|
50652
50692
|
}
|
|
50653
|
-
return
|
|
50693
|
+
return readFileSync5(passwordKeyFile, "utf8").trim();
|
|
50654
50694
|
}
|
|
50655
50695
|
__name(readPasswordMasterKey, "readPasswordMasterKey");
|
|
50656
50696
|
Router.allowedRequestedWithHeaders.TiddlyWiki = true;
|
|
@@ -50804,12 +50844,11 @@ var ListenCommand = class extends BaseCommand {
|
|
|
50804
50844
|
|
|
50805
50845
|
// packages/mws/src/new-commands/init-store.ts
|
|
50806
50846
|
init_esm_shims();
|
|
50807
|
-
import { resolve as
|
|
50847
|
+
import { resolve as resolve9 } from "path";
|
|
50808
50848
|
|
|
50809
50849
|
// packages/mws/src/new-commands/load-wiki-folder.ts
|
|
50810
50850
|
init_esm_shims();
|
|
50811
|
-
import * as
|
|
50812
|
-
import * as path7 from "path";
|
|
50851
|
+
import * as path8 from "path";
|
|
50813
50852
|
serverEvents.on("cli.register", (commands) => {
|
|
50814
50853
|
commands[info2.name] = { info: info2, Command: LoadWikiFolderCommand };
|
|
50815
50854
|
});
|
|
@@ -50851,15 +50890,15 @@ var LoadWikiFolderCommand = class extends BaseCommand {
|
|
|
50851
50890
|
const skipExisting = !!this.options["skip-existing"];
|
|
50852
50891
|
const recipeName = this.options["recipe-name"][0];
|
|
50853
50892
|
const recipeDescription = this.options["recipe-description"][0];
|
|
50854
|
-
const bagNameRoot =
|
|
50855
|
-
const bagNamePrefix =
|
|
50893
|
+
const bagNameRoot = path8.resolve(this.options["bag-relative-root"]?.[0] ?? ".");
|
|
50894
|
+
const bagNamePrefix = path8.resolve(this.options["bag-name-prefix"]?.[0] ?? ".");
|
|
50856
50895
|
const bagDescription = this.options["bag-description"][0];
|
|
50857
50896
|
const ownerRoles = (this.options["owner-roles"] ?? []).map((role) => role);
|
|
50858
50897
|
if (!templateName) {
|
|
50859
50898
|
throw new Error(`Template ${templateName} does not exist.`);
|
|
50860
50899
|
}
|
|
50861
50900
|
const { pluginTitles, bags } = loadWikiFolder({
|
|
50862
|
-
wikiPath:
|
|
50901
|
+
wikiPath: path8.resolve(this.params[0]),
|
|
50863
50902
|
cache: this.config.pluginCache,
|
|
50864
50903
|
$tw: this.$tw,
|
|
50865
50904
|
bagNameRoot,
|
|
@@ -50928,7 +50967,9 @@ var LoadWikiFolderCommand = class extends BaseCommand {
|
|
|
50928
50967
|
prefix: row.prefix,
|
|
50929
50968
|
bagName: row.bagName
|
|
50930
50969
|
})),
|
|
50931
|
-
recipePermissions: ownerRoles.map(
|
|
50970
|
+
// recipePermissions: ownerRoles.map(role => ({ level: "B_write", role })),4
|
|
50971
|
+
recipeAdmins: ownerRoles,
|
|
50972
|
+
recipeUsers: []
|
|
50932
50973
|
});
|
|
50933
50974
|
}
|
|
50934
50975
|
}
|
|
@@ -50957,8 +50998,8 @@ function loadWikiFolder({ $tw, cache, wikiPath, bagNameRoot, bagNamePrefix }) {
|
|
|
50957
50998
|
const pluginTitles = /* @__PURE__ */ new Set();
|
|
50958
50999
|
for (const bag of bags) {
|
|
50959
51000
|
for (const folder of bag.plugins) {
|
|
50960
|
-
const plugin = cache.filePlugins.get(
|
|
50961
|
-
if (!plugin) console.log(`STOCK_PLUGIN_MISSING: Folder ${bag.wikiFolder} needs ${folder}.`);
|
|
51001
|
+
const plugin = cache.filePlugins.get(path8.join("tiddlywiki", $tw.version, folder).replaceAll("\\", "/"));
|
|
51002
|
+
if (!plugin) console.log(`STOCK_PLUGIN_MISSING: Folder ${bag.wikiFolder} needs ${folder.replaceAll("\\", "/")}.`);
|
|
50962
51003
|
else pluginTitles.add(plugin);
|
|
50963
51004
|
}
|
|
50964
51005
|
}
|
|
@@ -50966,81 +51007,11 @@ function loadWikiFolder({ $tw, cache, wikiPath, bagNameRoot, bagNamePrefix }) {
|
|
|
50966
51007
|
pluginTitles: Array.from(pluginTitles),
|
|
50967
51008
|
bags: bags.map((bag) => ({
|
|
50968
51009
|
...bag,
|
|
50969
|
-
bagName:
|
|
51010
|
+
bagName: path8.relative(bagNameRoot, bag.wikiFolder)
|
|
50970
51011
|
}))
|
|
50971
51012
|
};
|
|
50972
51013
|
}
|
|
50973
51014
|
__name(loadWikiFolder, "loadWikiFolder");
|
|
50974
|
-
function loadWikiTiddlers($tw, wikiPath, parentPaths) {
|
|
50975
|
-
const bags = [];
|
|
50976
|
-
const wikiInfoPath = path7.resolve(wikiPath, $tw.config.wikiInfo);
|
|
50977
|
-
let wikiInfo;
|
|
50978
|
-
if (fs3.existsSync(wikiInfoPath)) {
|
|
50979
|
-
wikiInfo = $tw.utils.parseJSONSafe(fs3.readFileSync(wikiInfoPath, "utf8"), function() {
|
|
50980
|
-
return null;
|
|
50981
|
-
});
|
|
50982
|
-
}
|
|
50983
|
-
const tiddlersFromPath = [];
|
|
50984
|
-
const pluginNamesTW5 = [];
|
|
50985
|
-
if (!wikiInfo) return [];
|
|
50986
|
-
if (wikiInfo.includeWikis) {
|
|
50987
|
-
parentPaths = parentPaths.slice(0);
|
|
50988
|
-
parentPaths.push(wikiPath);
|
|
50989
|
-
$tw.utils.each(wikiInfo.includeWikis, function(info7) {
|
|
50990
|
-
if (typeof info7 === "string") {
|
|
50991
|
-
info7 = { path: info7 };
|
|
50992
|
-
}
|
|
50993
|
-
var resolvedIncludedWikiPath = path7.resolve(wikiPath, info7.path);
|
|
50994
|
-
if (parentPaths.indexOf(resolvedIncludedWikiPath) === -1) {
|
|
50995
|
-
bags.push(...loadWikiTiddlers($tw, resolvedIncludedWikiPath, parentPaths));
|
|
50996
|
-
} else {
|
|
50997
|
-
$tw.utils.error("Cannot recursively include wiki " + resolvedIncludedWikiPath);
|
|
50998
|
-
}
|
|
50999
|
-
});
|
|
51000
|
-
}
|
|
51001
|
-
const twFolder = path7.join($tw.boot.corePath, "..");
|
|
51002
|
-
const extraPlugins = [];
|
|
51003
|
-
const loadPlugins = /* @__PURE__ */ __name((plugins, libraryPath, envVar) => {
|
|
51004
|
-
$tw.utils.each(plugins, function(pluginName) {
|
|
51005
|
-
const pluginPaths = $tw.getLibraryItemSearchPaths(libraryPath, envVar);
|
|
51006
|
-
const pluginPath = $tw.findLibraryItem(pluginName, pluginPaths);
|
|
51007
|
-
if (!pluginPath) return;
|
|
51008
|
-
const relPath = path7.relative(twFolder, pluginPath);
|
|
51009
|
-
if (relPath.startsWith("..")) extraPlugins.push(pluginPath);
|
|
51010
|
-
else pluginNamesTW5.push(relPath);
|
|
51011
|
-
});
|
|
51012
|
-
}, "loadPlugins");
|
|
51013
|
-
loadPlugins(wikiInfo.plugins, $tw.config.pluginsPath, $tw.config.pluginsEnvVar);
|
|
51014
|
-
loadPlugins(wikiInfo.themes, $tw.config.themesPath, $tw.config.themesEnvVar);
|
|
51015
|
-
loadPlugins(wikiInfo.languages, $tw.config.languagesPath, $tw.config.languagesEnvVar);
|
|
51016
|
-
const tiddler_files_path = path7.resolve(wikiPath, $tw.config.wikiTiddlersSubDir);
|
|
51017
|
-
tiddlersFromPath.push(...$tw.loadTiddlersFromPath(path7.resolve(tiddler_files_path)).map((e) => e.tiddlers).flat());
|
|
51018
|
-
const loadWikiPlugins = /* @__PURE__ */ __name((wikiPluginsPath) => {
|
|
51019
|
-
if (fs3.existsSync(wikiPluginsPath)) {
|
|
51020
|
-
var pluginFolders = fs3.readdirSync(wikiPluginsPath);
|
|
51021
|
-
for (var t = 0; t < pluginFolders.length; t++) {
|
|
51022
|
-
extraPlugins.push(path7.resolve(wikiPluginsPath, "./" + pluginFolders[t]));
|
|
51023
|
-
}
|
|
51024
|
-
}
|
|
51025
|
-
}, "loadWikiPlugins");
|
|
51026
|
-
loadWikiPlugins(path7.resolve(wikiPath, $tw.config.wikiPluginsSubDir));
|
|
51027
|
-
loadWikiPlugins(path7.resolve(wikiPath, $tw.config.wikiThemesSubDir));
|
|
51028
|
-
loadWikiPlugins(path7.resolve(wikiPath, $tw.config.wikiLanguagesSubDir));
|
|
51029
|
-
extraPlugins.forEach((e) => {
|
|
51030
|
-
const plugin = $tw.loadPluginFolder(e);
|
|
51031
|
-
if (!plugin) {
|
|
51032
|
-
console.log(`No plugin found at ${e}`);
|
|
51033
|
-
} else if (!plugin.title) {
|
|
51034
|
-
console.log(`Found a valid plugin at ${e} but it doesn't have a title.`);
|
|
51035
|
-
} else {
|
|
51036
|
-
console.log(`Loading plugin ${e} into bag since it isn't a TiddlyWiki plugin`);
|
|
51037
|
-
tiddlersFromPath.push(plugin);
|
|
51038
|
-
}
|
|
51039
|
-
return void 0;
|
|
51040
|
-
});
|
|
51041
|
-
return [...bags, { tiddlers: tiddlersFromPath, plugins: pluginNamesTW5, wikiFolder: wikiPath }];
|
|
51042
|
-
}
|
|
51043
|
-
__name(loadWikiTiddlers, "loadWikiTiddlers");
|
|
51044
51015
|
|
|
51045
51016
|
// packages/mws/src/new-commands/init-store.ts
|
|
51046
51017
|
serverEvents.on("cli.register", (commands) => {
|
|
@@ -51100,9 +51071,9 @@ var InitStoreCommand = class extends BaseCommand {
|
|
|
51100
51071
|
});
|
|
51101
51072
|
});
|
|
51102
51073
|
console.log("Default user created with username 'admin' and password '1234'. Please change this password after logging in.");
|
|
51103
|
-
const tweditions =
|
|
51104
|
-
const runner = /* @__PURE__ */ __name(async (
|
|
51105
|
-
const command = new LoadWikiFolderCommand([
|
|
51074
|
+
const tweditions = resolve9((await getTW5Paths(this.config.wikiPath)).pop().name, "editions");
|
|
51075
|
+
const runner = /* @__PURE__ */ __name(async (path10, bagName, bagDesc, recName, recDesc) => {
|
|
51076
|
+
const command = new LoadWikiFolderCommand([path10], {
|
|
51106
51077
|
"bag-relative-root": [dist_resolve("..")],
|
|
51107
51078
|
"bag-description": [bagDesc],
|
|
51108
51079
|
"recipe-name": [recName],
|
|
@@ -51121,27 +51092,6 @@ var InitStoreCommand = class extends BaseCommand {
|
|
|
51121
51092
|
"mws-docs",
|
|
51122
51093
|
"MWS Documentation from https://mws.tiddlywiki.com"
|
|
51123
51094
|
);
|
|
51124
|
-
await runner(
|
|
51125
|
-
resolve8(tweditions, "tw5.com"),
|
|
51126
|
-
"docs",
|
|
51127
|
-
"TiddlyWiki Documentation from https://tiddlywiki.com",
|
|
51128
|
-
"docs",
|
|
51129
|
-
"TiddlyWiki Documentation from https://tiddlywiki.com"
|
|
51130
|
-
);
|
|
51131
|
-
await runner(
|
|
51132
|
-
resolve8(tweditions, "dev"),
|
|
51133
|
-
"dev",
|
|
51134
|
-
"TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev",
|
|
51135
|
-
"dev-docs",
|
|
51136
|
-
"TiddlyWiki Developer Documentation from https://tiddlywiki.com/dev"
|
|
51137
|
-
);
|
|
51138
|
-
await runner(
|
|
51139
|
-
resolve8(tweditions, "tour"),
|
|
51140
|
-
"tour",
|
|
51141
|
-
"TiddlyWiki Interactive Tour from https://tiddlywiki.com",
|
|
51142
|
-
"tour",
|
|
51143
|
-
"TiddlyWiki Interactive Tour from https://tiddlywiki.com"
|
|
51144
|
-
);
|
|
51145
51095
|
this.config.setupRequired = false;
|
|
51146
51096
|
}
|
|
51147
51097
|
};
|
|
@@ -51192,7 +51142,7 @@ var TestsCompleteCommand = class extends BaseCommand {
|
|
|
51192
51142
|
init_esm_shims();
|
|
51193
51143
|
import { createReadStream as createReadStream5, createWriteStream as createWriteStream2, existsSync as existsSync9 } from "fs";
|
|
51194
51144
|
import { mkdir as mkdir2, readFile as readFile5, rm as rm2, writeFile as writeFile3, rename } from "fs/promises";
|
|
51195
|
-
import * as
|
|
51145
|
+
import * as path9 from "path";
|
|
51196
51146
|
import { Writable as Writable2 } from "stream";
|
|
51197
51147
|
import { pipeline as pipeline2 } from "stream/promises";
|
|
51198
51148
|
import { createGunzip } from "zlib";
|
|
@@ -54337,17 +54287,17 @@ var UpdateTiddlyWiki = class {
|
|
|
54337
54287
|
}
|
|
54338
54288
|
async getLatestTiddlyWiki(wikiPath) {
|
|
54339
54289
|
if (!wikiPath) throw new Error("wikiPath is required");
|
|
54340
|
-
await mkdir2(
|
|
54290
|
+
await mkdir2(path9.resolve(wikiPath, "tw5"), { recursive: true });
|
|
54341
54291
|
let tarballPath;
|
|
54342
54292
|
if (this.manualTarball) {
|
|
54343
|
-
tarballPath =
|
|
54293
|
+
tarballPath = path9.resolve(this.manualTarball);
|
|
54344
54294
|
console.log("Extracting TiddlyWiki manually");
|
|
54345
54295
|
} else {
|
|
54346
54296
|
console.log("Fetching latest TiddlyWiki info...");
|
|
54347
54297
|
const tw5Info = await this.getTiddlyWikiNPM(wikiPath);
|
|
54348
54298
|
const latest = tw5Info["dist-tags"].latest;
|
|
54349
54299
|
const latestInfo = tw5Info.versions[latest];
|
|
54350
|
-
tarballPath =
|
|
54300
|
+
tarballPath = path9.resolve(wikiPath, "tw5", "tw5-" + latest + ".tgz");
|
|
54351
54301
|
if (!existsSync9(tarballPath)) {
|
|
54352
54302
|
console.log("Fetching TiddlyWiki", latest, "tarball...");
|
|
54353
54303
|
const download = await fetch(latestInfo.dist.tarball);
|
|
@@ -54356,7 +54306,7 @@ var UpdateTiddlyWiki = class {
|
|
|
54356
54306
|
console.log("TiddlyWiki download complete");
|
|
54357
54307
|
}
|
|
54358
54308
|
const filenames = [];
|
|
54359
|
-
const extractFolder =
|
|
54309
|
+
const extractFolder = path9.resolve(wikiPath, "tw5", "tw5-extract");
|
|
54360
54310
|
await rm2(extractFolder, { recursive: true, force: true });
|
|
54361
54311
|
await mkdir2(extractFolder, { recursive: true });
|
|
54362
54312
|
await pipeline2(
|
|
@@ -54368,17 +54318,17 @@ var UpdateTiddlyWiki = class {
|
|
|
54368
54318
|
})
|
|
54369
54319
|
);
|
|
54370
54320
|
const prefix = this.findPrefix(filenames, []);
|
|
54371
|
-
const extractFolder2 =
|
|
54372
|
-
const { version: version2 } = JSON.parse(await readFile5(
|
|
54373
|
-
const newFolder =
|
|
54321
|
+
const extractFolder2 = path9.resolve(wikiPath, "tw5", "tw5-extract", ...prefix);
|
|
54322
|
+
const { version: version2 } = JSON.parse(await readFile5(path9.resolve(extractFolder2, "package.json"), "utf8"));
|
|
54323
|
+
const newFolder = path9.resolve(wikiPath, "tw5", "tw5-" + version2);
|
|
54374
54324
|
if (existsSync9(newFolder))
|
|
54375
54325
|
throw "the tw5/tw5-" + version2 + " folder already exists, the tarball was successfully extracted to tw5/tw5-extract.";
|
|
54376
54326
|
await rename(extractFolder2, newFolder);
|
|
54377
54327
|
await rm2(extractFolder, { recursive: true, force: true });
|
|
54378
|
-
console.log("Tiddlywiki extracted to",
|
|
54328
|
+
console.log("Tiddlywiki extracted to", path9.relative(wikiPath, newFolder));
|
|
54379
54329
|
}
|
|
54380
54330
|
async getTiddlyWikiNPM(wikiPath) {
|
|
54381
|
-
const registryFile =
|
|
54331
|
+
const registryFile = path9.resolve(wikiPath, "tw5", "tw5-registry.json");
|
|
54382
54332
|
const tw5info = existsSync9(registryFile) ? JSON.parse(await readFile5(registryFile, "utf8")) : void 0;
|
|
54383
54333
|
const res = await fetch(this.registryUrl, {
|
|
54384
54334
|
headers: tw5info ? {
|
|
@@ -54393,7 +54343,7 @@ var UpdateTiddlyWiki = class {
|
|
|
54393
54343
|
const newJson = await res.json();
|
|
54394
54344
|
newJson._etag = res.headers.get("if-none-match");
|
|
54395
54345
|
newJson._modified = res.headers.get("if-modified-since");
|
|
54396
|
-
await writeFile3(
|
|
54346
|
+
await writeFile3(path9.resolve(wikiPath, "tw5", "tw5-registry.json"), JSON.stringify(newJson, null, 2));
|
|
54397
54347
|
return newJson;
|
|
54398
54348
|
}
|
|
54399
54349
|
}
|