@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/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 path9 = __require("path");
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 = path9.resolve(baseDir, baseName);
2210
+ const localBin = path10.resolve(baseDir, baseName);
2211
2211
  if (fs5.existsSync(localBin)) return localBin;
2212
- if (sourceExt.includes(path9.extname(baseName))) return void 0;
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 = path9.resolve(
2232
- path9.dirname(resolvedScriptPath),
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 = path9.basename(
2239
+ const legacyName = path10.basename(
2240
2240
  this._scriptPath,
2241
- path9.extname(this._scriptPath)
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(path9.extname(executableFile));
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 = path9.basename(filename, path9.extname(filename));
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(path10) {
3115
- if (path10 === void 0) return this._executableDir;
3116
- this._executableDir = path10;
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(resolve10, reject) {
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: resolve10
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(resolve10, reject) {
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 resolve10(value);
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(resolve10) {
6394
- resolve10(value);
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(resolve10, reject) {
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 ? resolve10(result.value) : adopt(result.value).then(fulfilled, rejected);
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(resolve10, reject) {
6502
- v2 = o[n](v2), settle(resolve10, reject, v2.done, v2.value);
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(resolve10, reject, d, v2) {
6507
+ function settle(resolve11, reject, d, v2) {
6508
6508
  Promise.resolve(v2).then(function(v3) {
6509
- resolve10({ value: v3, done: d });
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(resolve10, reject) {
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
- resolve10(_value);
7181
+ resolve11(_value);
7182
7182
  } else if (hasConfig) {
7183
- resolve10(config3.defaultValue);
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(resolve10, reject) {
7207
+ return new Promise(function(resolve11, reject) {
7208
7208
  var subscriber = new Subscriber_1.SafeSubscriber({
7209
7209
  next: /* @__PURE__ */ __name(function(value) {
7210
- resolve10(value);
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
- resolve10(config3.defaultValue);
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(path9) {
21892
- if (!path9 || typeof path9 !== "string") {
21891
+ function lookup(path10) {
21892
+ if (!path10 || typeof path10 !== "string") {
21893
21893
  return false;
21894
21894
  }
21895
- var extension2 = extname2("x." + path9).toLowerCase().substr(1);
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((resolve10, reject) => {
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
- resolve10(buffer);
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((resolve10) => setTimeout(resolve10));
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((resolve10) => {
24510
+ return new Promise((resolve11) => {
24511
24511
  waiterMap.set(request, {
24512
- resolve: resolve10,
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((resolve10) => {
24673
- this.server.close(resolve10);
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, path9) {
25783
- if (!path9)
25782
+ function getElementAtPath(obj, path10) {
25783
+ if (!path10)
25784
25784
  return obj;
25785
- return path9.reduce((acc, key) => acc?.[key], obj);
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(path9, issues) {
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(path9);
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, path9 = []) => {
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 = [...path9, ...issue2.path];
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 path9 = _path.map((seg) => typeof seg === "object" ? seg.key : seg);
26441
- for (const seg of path9) {
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 path9 = ref.slice(1).split("/").filter(Boolean);
38856
- if (path9.length === 0) {
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 (path9[0] === defsKey) {
38861
- const key = path9[1];
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((path9) => {
42672
+ var getStats = /* @__PURE__ */ __name((path10) => {
42673
42673
  let stats;
42674
42674
  try {
42675
- stats = statSync(path9);
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 path9 = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename);
42710
- let stats = getStats(path9);
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
- path9 = join(path9, indexFile);
42714
- stats = getStats(path9);
42713
+ path10 = join(path10, indexFile);
42714
+ stats = getStats(path10);
42715
42715
  }
42716
42716
  if (!stats) {
42717
- await options.onNotFound?.(path9, c);
42717
+ await options.onNotFound?.(path10, c);
42718
42718
  return next();
42719
42719
  }
42720
- const mimeType = getMimeType(path9);
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(path9 + ENCODINGS[encoding]);
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
- path9 = path9 + ENCODINGS[encoding];
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(path9)), 200);
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(path9, {
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?.(path9, c);
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((path9) => {
42785
- const paths = path9.split("/");
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: path9 } = extractGroupsFromPath(routePath);
42793
- const paths = splitPath(path9);
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((path9) => {
42796
+ var extractGroupsFromPath = /* @__PURE__ */ __name((path10) => {
42797
42797
  const groups = [];
42798
- path9 = path9.replace(/\{[^}]+\}/g, (match2, index) => {
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: path9 };
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 path9 = url2.slice(start, end);
42861
- return tryDecodeURI2(path9.includes("%25") ? path9.replace(/%25/g, "%2525") : path9);
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((path9) => {
42879
- if (path9.charCodeAt(path9.length - 1) !== 63 || !path9.includes(":")) {
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 = path9.split("/");
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 (path9, c) => {
43319
+ onNotFound: /* @__PURE__ */ __name(async (path10, c) => {
43320
43320
  if (options.on404)
43321
- await options.on404(path9, this);
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((resolve10, reject) => {
43549
+ return new Promise((resolve11, reject) => {
43550
43550
  const unpipe = /* @__PURE__ */ __name(() => {
43551
43551
  to2.off("error", error48);
43552
- resolve10();
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((resolve10, reject) => {
43564
+ await new Promise((resolve11, reject) => {
43565
43565
  const onDrain = /* @__PURE__ */ __name(() => {
43566
43566
  writer.off("error", onError);
43567
- resolve10();
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, path9 = "/", matchResult = [[]]) {
43764
+ constructor(request, path10 = "/", matchResult = [[]]) {
43765
43765
  this.raw = request;
43766
- this.path = path9;
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, path9, ...handlers) => {
44531
- for (const p2 of [path9].flat()) {
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(path9, app) {
44589
- const subApp = this.basePath(path9);
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(path9) {
44615
+ basePath(path10) {
44616
44616
  const subApp = this.#clone();
44617
- subApp._basePath = mergePath(this._basePath, path9);
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(path9, applicationHandler, options) {
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, path9);
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(path9, "*"), handler);
44733
+ this.#addRoute(METHOD_NAME_ALL, mergePath(path10, "*"), handler);
44734
44734
  return this;
44735
44735
  }
44736
- #addRoute(method, path9, handler, baseRoutePath) {
44736
+ #addRoute(method, path10, handler, baseRoutePath) {
44737
44737
  method = method.toUpperCase();
44738
- path9 = mergePath(this._basePath, path9);
44738
+ path10 = mergePath(this._basePath, path10);
44739
44739
  const r = {
44740
44740
  basePath: baseRoutePath !== void 0 ? mergePath(this._basePath, baseRoutePath) : this._basePath,
44741
- path: path9,
44741
+ path: path10,
44742
44742
  method,
44743
44743
  handler
44744
44744
  };
44745
- this.router.add(method, path9, [handler, r]);
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 path9 = this.getPath(request, { env: env3 });
44759
- const matchResult = this.router.match(method, path9);
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: path9,
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, path9) {
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, path9);
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(path9, index, pathErrorCheckOnly) {
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
- path9 = path9.replace(/\{[^}]+\}/g, (m2) => {
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 = path9.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
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(path9) {
45065
- return wildcardRegExpCache[path9] ??= new RegExp(
45066
- path9 === "*" ? "" : `^${path9.replace(
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, path9, handlers] = routesWithStaticPathFlag[i];
45090
+ const [pathErrorCheckOnly, path10, handlers] = routesWithStaticPathFlag[i];
45091
45091
  if (pathErrorCheckOnly) {
45092
- staticMap[path9] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];
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(path9, j2, pathErrorCheckOnly);
45098
+ paramAssoc = trie.insert(path10, j2, pathErrorCheckOnly);
45099
45099
  } catch (e) {
45100
- throw e === PATH_ERROR ? new UnsupportedPathError(path9) : e;
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, path9) {
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(path9)) {
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, path9, handler) {
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 (path9 === "/*") {
45174
- path9 = "*";
45173
+ if (path10 === "/*") {
45174
+ path10 = "*";
45175
45175
  }
45176
- const paramCount = (path9.match(/\/:/g) || []).length;
45177
- if (/\*$/.test(path9)) {
45178
- const re2 = buildWildcardRegExp(path9);
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][path9] ||= findMiddleware(middleware[m2], path9) || findMiddleware(middleware[METHOD_NAME_ALL], path9) || [];
45181
+ middleware[m2][path10] ||= findMiddleware(middleware[m2], path10) || findMiddleware(middleware[METHOD_NAME_ALL], path10) || [];
45182
45182
  });
45183
45183
  } else {
45184
- middleware[method][path9] ||= findMiddleware(middleware[method], path9) || findMiddleware(middleware[METHOD_NAME_ALL], path9) || [];
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(path9) || [path9];
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((path9) => [path9, r[method][path9]]) : [];
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((path9) => [path9, r[METHOD_NAME_ALL][path9]])
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, path9, handler) {
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, path9, handler]);
45269
+ this.#routes.push([method, path10, handler]);
45270
45270
  }
45271
- match(method, path9) {
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, path9);
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, path9, handler) {
45346
+ insert(method, path10, handler) {
45347
45347
  this.#order = ++this.#order;
45348
45348
  let curNode = this;
45349
- const parts = splitRoutingPath(path9);
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, path9) {
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(path9);
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 = path9[0] === "/" ? 1 : 0;
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 = path9.substring(partOffsets[i]);
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, path9, handler) {
45508
- const results = checkOptionalParameter(path9);
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, path9, handler);
45515
+ this.#node.insert(method, path10, handler);
45516
45516
  }
45517
- match(method, path9) {
45518
- return this.#node.search(method, path9);
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 resolve10;
46023
+ let resolve11;
46023
46024
  const prom = new Promise((r) => {
46024
- resolve10 = r;
46025
+ resolve11 = r;
46025
46026
  });
46026
- this.handleHonoRequest(c, resolve10, next).catch((err) => {
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 resolve10(c.redirect(err2.details.location));
46032
- return resolve10(c.text(JSON.stringify(err2), err2.status, {
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, resolve10, next) {
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, resolve10);
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
- return match2.route.catchHandler(state, e);
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(path9, key, keyReplacer) {
46224
- if (!path9.startsWith("/")) throw new Error(`Path ${path9} must start with a forward slash`);
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 (path9 !== path9.trim()) throw new Error(`Path ${path9} must not have leading and trailing white space or line terminator characters`);
46227
- const parts = path9.split("/");
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 ${path9} has an empty part at index ${i}`);
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 && !path9.endsWith("/") ? `(?<${name}>.+)` : `(?<${name}>[^/]+)`;
46238
- }).join("/") + (path9.endsWith("/") ? "(?=/)" : "$");
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: path9,
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 path9 === "string" ? buildPathRegex(path9, key, keyReplacer ?? "") : path9;
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(path9, zodRequest, preflight, inner) {
46526
+ function zodSession(path10, zodRequest, preflight, inner) {
46523
46527
  return {
46524
46528
  ...zodRoute({
46525
46529
  method: ["POST"],
46526
- path: path9,
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: path9
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((resolve10) => setTimeout(resolve10, this.minIntervalMs));
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": `datasource db {
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","recipe_id_bag_id_prefix","bag_id_title","bag_id_role_id","is","isNot","connectOrCreate","upsert","set","disconnect","delete","connect","updateMany","deleteMany","createMany","increment","decrement","multiply","divide"]'),
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_ABgAAAAAH6AYAAAAABlwIBAAAAAZgCAQAAAAGZAgEAAAABmgKAAAAAAZsCgAAAAAEG6AEAAIgDADDpAQAArQEAEOoBAACIAwAwgAIBAN0CACGPAgAAiQOdAiKTAgEA3QIAIQcIAADkAgAgHgAAiwMAIB8AAIsDACDwAQAAAJ0CAvEBAAAAnQII8gEAAACdAgj6AQAAigOdAiIHCAAA5AIAIB4AAIsDACAfAACLAwAg8AEAAACdAgLxAQAAAJ0CCPIBAAAAnQII-gEAAIoDnQIiBPABAAAAnQIC8QEAAACdAgjyAQAAAJ0CCPoBAACLA50CIgnoAQAAjAMAMOkBAACXAQAQ6gEAAIwDADCIAkAA3gIAIZACAQDdAgAhkgJAAN4CACGUAgAAhgMAIJ0CAQDdAgAhngIBAN0CACELBAAAkAMAIAYAAI8DACDoAQAAjQMAMOkBAACEAQAQ6gEAAI0DADCIAkAA8gIAIZACAQDuAgAhkgJAAPICACGUAgAAjgMAIJ0CAQDuAgAhngIBAO4CACEH8AGAAAAAAfoBgAAAAAGXAgEAAAABmAIBAAAAAZkCAQAAAAGaAoAAAAABmwKAAAAAAQODAgAADwAghAIAAA8AIIUCAAAPACADgwIAABMAIIQCAAATACCFAgAAEwAgB-gBAACRAwAw6QEAAH4AEOoBAACRAwAwigIBAN0CACGeAgAAkgOiAiKfAgIA-wIAIaACAQDdAgAhBwgAAOQCACAeAACUAwAgHwAAlAMAIPABAAAAogIC8QEAAACiAgjyAQAAAKICCPoBAACTA6ICIgcIAADkAgAgHgAAlAMAIB8AAJQDACDwAQAAAKICAvEBAAAAogII8gEAAACiAgj6AQAAkwOiAiIE8AEAAACiAgLxAQAAAKICCPIBAAAAogII-gEAAJQDogIiCegBAACVAwAw6QEAAGgAEOoBAACVAwAwiAJAAN4CACGKAgEA3QIAIZICQADeAgAhoAIBAN0CACGiAgQAlgMAIaMCAACGAwAgDQgAAOQCACAeAACYAwAgHwAAmAMAIEAAAIADACBBAACYAwAg8AEEAAAAAfEBBAAAAATyAQQAAAAE8wEEAAAAAfQBBAAAAAH1AQQAAAAB9gEEAAAAAfoBBACXAwAhDQgAAOQCACAeAACYAwAgHwAAmAMAIEAAAIADACBBAACYAwAg8AEEAAAAAfEBBAAAAATyAQQAAAAE8wEEAAAAAfQBBAAAAAH1AQQAAAAB9gEEAAAAAfoBBACXAwAhCPABBAAAAAHxAQQAAAAE8gEEAAAABPMBBAAAAAH0AQQAAAAB9QEEAAAAAfYBBAAAAAH6AQQAmAMAIQboAQAAmQMAMOkBAABSABDqAQAAmQMAMIACAQDdAgAhigIBAN0CACGPAgAAmgOlAiIHCAAA5AIAIB4AAJwDACAfAACcAwAg8AEAAAClAgLxAQAAAKUCCPIBAAAApQII-gEAAJsDpQIiBwgAAOQCACAeAACcAwAgHwAAnAMAIPABAAAApQIC8QEAAAClAgjyAQAAAKUCCPoBAACbA6UCIgTwAQAAAKUCAvEBAAAApQII8gEAAAClAgj6AQAAnAOlAiII6AEAAJ0DADDpAQAAPAAQ6gEAAJ0DADCCAgEA3QIAIYgCQADeAgAhkAIBAN0CACGSAkAA3gIAIZ0CAQDdAgAhDAQAAJ8DACAFAACgAwAgCQAAoQMAIAsAAKIDACDoAQAAngMAMOkBAAApABDqAQAAngMAMIICAQDuAgAhiAJAAPICACGQAgEA7gIAIZICQADyAgAhnQIBAO4CACEDgwIAAAMAIIQCAAADACCFAgAAAwAgA4MCAAAHACCEAgAABwAghQIAAAcAIAODAgAACwAghAIAAAsAIIUCAAALACADgwIAACAAIIQCAAAgACCFAgAAIAAgCAMAAKUDACDoAQAAowMAMOkBAAAgABDqAQAAowMAMIoCAQDuAgAhngIAAKQDogIinwICAKYDACGgAgEA7gIAIQTwAQAAAKICAvEBAAAAogII8gEAAACiAgj6AQAAlAOiAiIOBAAAnwMAIAUAAKADACAJAAChAwAgCwAAogMAIOgBAACeAwAw6QEAACkAEOoBAACeAwAwggIBAO4CACGIAkAA8gIAIZACAQDuAgAhkgJAAPICACGdAgEA7gIAIaoCAAApACCrAgAAKQAgCPABAgAAAAHxAQIAAAAE8gECAAAABPMBAgAAAAH0AQIAAAAB9QECAAAAAfYBAgAAAAH6AQIA5AIAIQKAAgEAAAABiQIBAAAAAQcKAACqAwAg6AEAAKgDADDpAQAAGgAQ6gEAAKgDADCAAgEA7gIAIYkCAQDuAgAhjwIAAKkDjwIiBPABAAAAjwIC8QEAAACPAgjyAQAAAI8CCPoBAACEA48CIhAEAACwAwAgBwAArgMAIAkAAKEDACDoAQAArwMAMOkBAAAPABDqAQAArwMAMIgCQADyAgAhkAIBAO4CACGRAgEA7gIAIZICQADyAgAhkwIBAO4CACGUAgAAjgMAIJUCAACOAwAglgJAAPICACGqAgAADwAgqwIAAA8AIAKAAgEAAAABkwIBAAAAAQcHAACuAwAg6AEAAKwDADDpAQAAEwAQ6gEAAKwDADCAAgEA7gIAIY8CAACtA50CIpMCAQDuAgAhBPABAAAAnQIC8QEAAACdAgjyAQAAAJ0CCPoBAACLA50CIg0EAACQAwAgBgAAjwMAIOgBAACNAwAw6QEAAIQBABDqAQAAjQMAMIgCQADyAgAhkAIBAO4CACGSAkAA8gIAIZQCAACOAwAgnQIBAO4CACGeAgEA7gIAIaoCAACEAQAgqwIAAIQBACAOBAAAsAMAIAcAAK4DACAJAAChAwAg6AEAAK8DADDpAQAADwAQ6gEAAK8DADCIAkAA8gIAIZACAQDuAgAhkQIBAO4CACGSAkAA8gIAIZMCAQDuAgAhlAIAAI4DACCVAgAAjgMAIJYCQADyAgAhA4MCAAAaACCEAgAAGgAghQIAABoAIASJAgEAAAABigIBAAAAAYwCIAAAAAGNAgEAAAABCgMAAKUDACAKAACqAwAg6AEAALIDADDpAQAACwAQ6gEAALIDADCJAgEA7gIAIYoCAQDuAgAhiwICAKYDACGMAiAAswMAIY0CAQDuAgAhAvABIAAAAAH6ASAA_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 existsSync7, mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "fs";
47538
- import * as path6 from "path";
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 fs2 from "fs";
47743
- import * as path5 from "path";
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 { createHash as createHash3, randomBytes as randomBytes2 } from "crypto";
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 = "Define the write targets for title prefixes. The resolver matches prefixes from longest to shortest, so most specific prefix gets the tiddler. A tiddler will first be read from the single writable bag it matches, then from readonly bags, other writable bags are ignored. The default bag catches any titles that don't match a prefix. ";
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: "Readonly bags", type: "search-multiselect", section: "authored", mode: "create edit" },
47861
- { key: "plugins", label: "Plugins", type: "search-multiselect", section: "authored", mode: "create edit" },
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: "recipePermissions",
47897
- label: "Recipe permissions",
47898
- type: "permission-table",
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: "Wiki identity", description: "Name the wiki, describe it, and choose the template that provides its base routing model.", keys: ["slug", "displayName", "description", "templateName"], width: fullWidth, layout: stackLayout },
47923
- { title: "Writable routing", description: writableRoutingDescription, keys: ["writablePrefixBags"], width: fullWidth },
47924
- { title: "Bags", description: "Add wiki-specific readonly bags on top of anything inherited from the template.", keys: ["readonlyBags"], width: halfWidth },
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: "Access", description: "Control who can access the wiki surface itself. Bag access is handled separately on the participating bags.", keys: ["recipePermissions"], width: fullWidth }
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: "Readonly bags", type: "search-multiselect", section: "authored", mode: "create edit" },
47981
- { key: "plugins", label: "Plugins", type: "search-multiselect", section: "authored", mode: "create edit" },
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: "Permissions", description: "Permissions for who can edit or use this template. Access to the template is required to apply it to a recipe, but not required to use that recipe.", keys: ["templatePermissions"], width: fullWidth, layout: stackLayout },
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, isAdmin) {
48125
+ constructor(recipe, prisma, user) {
48297
48126
  this.recipe = recipe;
48298
48127
  this.prisma = prisma;
48299
- this.isAdmin = isAdmin;
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
- isAdmin;
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, needsWrite }) {
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) throw "tiddler must have a 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)) throw "write not permitted";
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)) throw "write not permitted";
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
- return { bagTiddlers, lastEventId: String(maxSeq._max.seq ?? 0), template };
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 serveIndex2(state, recipe_slug, type) {
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.isAdmin).getIndexData(!skipBagTiddlers);
48463
+ return await new RecipeResolver(recipe, prisma, state.user).getIndexData(!skipBagTiddlers);
48618
48464
  });
48619
- return { recipe, index };
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
- return await new IndexSender(
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
- state,
48628
- index.template.externalPlugins,
48629
- index.template.externalStore
48630
- ).serveIndexFile();
48478
+ etag,
48479
+ plugins
48480
+ ).serveIndexFile(template);
48631
48481
  }
48632
48482
  case "store.json":
48633
48483
  case "store.js": {
48634
- const store = await (async () => {
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
- const { recipe, index } = cached2;
48640
- return new StoreWriter(state, recipe, index, type);
48489
+ return cached2;
48641
48490
  } else {
48642
- const { recipe, index } = await getData();
48643
- return new StoreWriter(state, recipe, index, type);
48491
+ return await getData();
48644
48492
  }
48645
48493
  })();
48646
- await store.init();
48647
- const newEtag = store.getEtag("");
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(serveIndex2, "serveIndex");
48674
- var StoreBase = class {
48675
- constructor(recipe, pluginCache, lastEventId, template) {
48676
- this.recipe = recipe;
48677
- this.pluginCache = pluginCache;
48678
- this.lastEventId = lastEventId;
48679
- this.template = template;
48680
- }
48681
- recipe;
48682
- pluginCache;
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 extends StoreBase {
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.recipe.slug;
48569
+ const recipe = this.recipeSlug;
48786
48570
  switch (type) {
48787
48571
  case "preload":
48788
- return `<link rel="preload" href="${pathPrefix}/recipe/${encodeURIComponent(recipe)}/store.js" as="script" crossorigin="anonymous" />`;
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/${encodeURIComponent(recipe)}/store.js" crossorigin="anonymous"></script>`;
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 template = this.customHtmlEnabled ? this.template.htmlContent : await readFile3(resolve3(this.state.config.cachePath, "tiddlywiki5.html"), "utf8");
48810
- const newEtag = this.getEtag(template);
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: newEtag,
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.enableExternalPlugins || this.enableExternalStore || this.injectStore) {
48837
- if (!this.customHtmlEnabled)
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 StoreWriter = class extends StoreBase {
48894
- constructor(state, recipe, index, format) {
48895
- super(recipe, state.pluginCache, index.lastEventId, index.template);
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, "StoreWriter");
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
- get cachePath() {
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
- if (!this.template.externalPlugins) {
48927
- const fileStreams = this.plugins.map((e) => createReadStream3(join5(this.cachePath, this.pluginFiles.get(e), "plugin.json")));
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
- const lastRevisionId = String(this.lastEventId ?? 0);
48958
- await writeTiddler({
48959
- title: "$:/state/multiwikiclient/tiddlers/bag",
48960
- text: JSON.stringify(bagInfo),
48961
- type: "application/json"
48962
- });
48963
- await writeTiddler({
48964
- title: "$:/state/multiwikiclient/tiddlers/revision",
48965
- text: JSON.stringify(revisionInfo),
48966
- type: "application/json"
48967
- });
48968
- await writeTiddler({
48969
- title: "$:/state/multiwikiclient/recipe/last_revision_id",
48970
- text: lastRevisionId
48971
- });
48972
- await writeTiddler({
48973
- title: "$:/config/multiwikiclient/recipe",
48974
- text: this.recipe.slug
48975
- });
48976
- if (false) {
48977
- await writeTiddler({
48978
- title: "$:/state/multiwikiclient/dev-mode",
48979
- text: "yes"
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
- await writeTiddler({
48983
- title: "$:/config/multiwikiclient/host",
48984
- text: "$protocol$//$host$" + this.state.pathPrefix + "/"
48985
- }, !keepLastSuffix);
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(data.recipePermissions);
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 roleIds = await getRolesMapper(prisma, data.templatePermissions.map((row) => row.role));
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: data.templatePermissions.map((e) => ({ level: e.level, role_id: roleIds(e.role) }))
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: data.templatePermissions.map((e) => ({ level: e.level, role_id: roleIds(e.role) }))
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
- templatePermissions: template.permissions.map((e) => ({
49640
- level: e.level,
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
- templatePermissions: template.permissions.map((e) => ({
49677
- level: e.level,
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.isAdmin);
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.isAdmin);
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 serveIndex2(state, recipe_slug, "store.js");
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 serveIndex2(state, recipe_slug, "store.json");
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.isAdmin);
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.isAdmin);
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 serveIndex2(state, recipe_slug, "index");
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(twFolder, cacheFolder, type, $tw, mwsVersion, arrayStrings) {
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 relativePluginPath = path4.join("tiddlywiki", $tw.version, path4.relative(twFolder, oldPath));
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((resolve10) => $tw.boot.boot(resolve10));
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 getTW5Path(wikiPath) {
50440
- if (!fs2.existsSync(path5.resolve(wikiPath, "tw5"))) {
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(path5.resolve(wikiPath, "tw5"))).map(async (e2) => {
50444
- const s3 = await stat2(path5.resolve(wikiPath, "tw5", e2));
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(e2);
50473
+ const t = /^tw5-5\.([0-9]+)\.([0-9]+)(.*)/.exec(e);
50447
50474
  if (!t) return;
50448
50475
  const [, minor, patch, extra] = t;
50449
- return { minor, patch, extra };
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
- path5.resolve(wikiPath, "tw5", "versions.txt"),
50458
- folders.map((e2) => `tw5-5.${e2.minor}.${e2.patch}${e2.extra}`).join("\n")
50485
+ path6.resolve(wikiPath, "tw5", "versions.txt"),
50486
+ folders.map((e) => `tw5-5.${e.minor}.${e.patch}${e.extra}`).join("\n")
50459
50487
  );
50460
- const e = folders.pop();
50461
- return path5.resolve(wikiPath, "tw5", `tw5-5.${e.minor}.${e.patch}${e.extra}`);
50488
+ return folders;
50462
50489
  }
50463
- __name(getTW5Path, "getTW5Path");
50490
+ __name(getTW5Paths, "getTW5Paths");
50464
50491
  async function bootDefaultTiddlyWiki(wikiPath) {
50465
- const { TiddlyWiki } = __require(path5.resolve(await getTW5Path(wikiPath), "boot/boot.js"));
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 = path5.resolve(wikiPath, "cache");
50471
- fs2.mkdirSync(cachePath, { recursive: true });
50472
- const $tw = await bootDefaultTiddlyWiki(wikiPath);
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 = path5.resolve(cachePath, "tiddlywiki5.html");
50501
- fs2.writeFileSync(filepath, result);
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: new Map([...pluginFiles.entries()].map((e) => e.reverse())),
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 randomBytes3 } from "crypto";
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 = randomBytes3(16).toString("base64url");
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 = path6.resolve(process.cwd());
50607
- if (!existsSync7(wikiPath)) throw "The wiki path does not exist";
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 = path6.resolve(wikiPath, "cache");
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 = path6.resolve(wikiPath, "store");
50658
+ const storePath = path7.resolve(wikiPath, "store");
50619
50659
  mkdirSync3(storePath, { recursive: true });
50620
- const databasePath = path6.resolve(storePath, "database.sqlite");
50621
- writeFileSync4(path6.join(storePath, "KEEP_ALL_THESE_FILES.txt"), [
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 = path6.join(wikiPath, "passwords.key");
50649
- if (typeof passwordKeyFile === "string" && passwordKeyFile && !existsSync7(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 readFileSync4(passwordKeyFile, "utf8").trim();
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 resolve8 } from "path";
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 fs3 from "fs";
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 = path7.resolve(this.options["bag-relative-root"]?.[0] ?? ".");
50855
- const bagNamePrefix = path7.resolve(this.options["bag-name-prefix"]?.[0] ?? ".");
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: path7.resolve(this.params[0]),
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((role) => ({ level: "B_write", role }))
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(path7.join("tiddlywiki", $tw.version, folder));
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: path7.relative(bagNameRoot, bag.wikiFolder)
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 = resolve8(await getTW5Path(this.config.wikiPath), "editions");
51104
- const runner = /* @__PURE__ */ __name(async (path9, bagName, bagDesc, recName, recDesc) => {
51105
- const command = new LoadWikiFolderCommand([path9], {
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 path8 from "path";
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(path8.resolve(wikiPath, "tw5"), { recursive: true });
54290
+ await mkdir2(path9.resolve(wikiPath, "tw5"), { recursive: true });
54341
54291
  let tarballPath;
54342
54292
  if (this.manualTarball) {
54343
- tarballPath = path8.resolve(this.manualTarball);
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 = path8.resolve(wikiPath, "tw5", "tw5-" + latest + ".tgz");
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 = path8.resolve(wikiPath, "tw5", "tw5-extract");
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 = path8.resolve(wikiPath, "tw5", "tw5-extract", ...prefix);
54372
- const { version: version2 } = JSON.parse(await readFile5(path8.resolve(extractFolder2, "package.json"), "utf8"));
54373
- const newFolder = path8.resolve(wikiPath, "tw5", "tw5-" + version2);
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", path8.relative(wikiPath, newFolder));
54328
+ console.log("Tiddlywiki extracted to", path9.relative(wikiPath, newFolder));
54379
54329
  }
54380
54330
  async getTiddlyWikiNPM(wikiPath) {
54381
- const registryFile = path8.resolve(wikiPath, "tw5", "tw5-registry.json");
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(path8.resolve(wikiPath, "tw5", "tw5-registry.json"), JSON.stringify(newJson, null, 2));
54346
+ await writeFile3(path9.resolve(wikiPath, "tw5", "tw5-registry.json"), JSON.stringify(newJson, null, 2));
54397
54347
  return newJson;
54398
54348
  }
54399
54349
  }