@beiguancyc/parse-server 9.9.0-ruixiang.1 → 9.10.0-ruixiang.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,6 +73,11 @@ A big _thank you_ 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
73
73
  - [Restricting File URL Domains](#restricting-file-url-domains)
74
74
  - [Idempotency Enforcement](#idempotency-enforcement)
75
75
  - [Installations](#installations)
76
+ - [Options](#options)
77
+ - [`duplicateDeviceTokenActionEnforceAuth`](#duplicatedevicetokenactionenforceauth)
78
+ - [`duplicateDeviceTokenAction`](#duplicatedevicetokenaction)
79
+ - [`duplicateDeviceTokenMergePriority`](#duplicatedevicetokenmergepriority)
80
+ - [Configuration example](#configuration-example)
76
81
  - [Localization](#localization)
77
82
  - [Pages](#pages)
78
83
  - [Localization with Directory Structure](#localization-with-directory-structure)
@@ -314,7 +319,7 @@ The client keys used with Parse are no longer necessary with Parse Server. If yo
314
319
 
315
320
  ## Route Allow List
316
321
 
317
- The `routeAllowList` option restricts which API routes are accessible to external clients. When set, all external requests are denied by default unless the route matches one of the configured regex patterns. This is useful for apps where all logic runs in Cloud Code and clients should not access the API directly.
322
+ The `routeAllowList` option restricts which REST API routes are accessible to external clients. When set, all external REST API requests are denied by default unless the route matches one of the configured regex patterns. This is useful for apps where all logic runs in Cloud Code and clients should not access the REST API directly.
318
323
 
319
324
  Internal calls from Cloud Code, Cloud Jobs, and triggers are not affected. Master key and maintenance key requests bypass the restriction.
320
325
 
@@ -334,7 +339,7 @@ const server = ParseServer({
334
339
 
335
340
  Each entry is a regex pattern matched against the normalized route identifier. Patterns are auto-anchored with `^` and `$` for full-match semantics. For example, `classes/Chat` matches only `classes/Chat`, not `classes/ChatRoom`. Use `classes/Chat.*` to match both.
336
341
 
337
- Setting an empty array `[]` blocks all external non-master-key requests (full lockdown). Not setting the option preserves current behavior (all routes accessible).
342
+ Setting an empty array `[]` blocks all external non-master-key REST API requests (full lockdown of REST API routes). Not setting the option preserves current behavior (all routes accessible).
338
343
 
339
344
  ### Covered Routes
340
345
 
@@ -395,6 +400,9 @@ The following table lists all route groups covered by `routeAllowList` with exam
395
400
  > [!NOTE]
396
401
  > File routes are not covered by `routeAllowList`. File upload access is controlled via the `fileUpload` option. File download and metadata access is controlled via the `fileDownload` option.
397
402
 
403
+ > [!NOTE]
404
+ > The GraphQL API is not covered by `routeAllowList`. `routeAllowList` gates the REST API per route, while every GraphQL operation is transported over a single endpoint with the operation, target class, and field set encoded in the request body — so per-route allow-list semantics do not compose with it.
405
+
398
406
  ## Email Verification and Password Reset
399
407
 
400
408
  Verifying user email addresses and enabling password reset via email requires an email adapter. There are many email adapters provided and maintained by the community. The following is an example configuration with an example email adapter. See the [Parse Server Options][server-options] for more details and a full list of available options.
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ exports.setupFilesLink = setupFilesLink;
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+
11
+ /**
12
+ * When filesAdapter.options.filesLinkTarget is set, create a symlink at
13
+ * files/{filesSubDirectory} -> filesLinkTarget before the FS adapter starts.
14
+ * This lets multiple Parse instances use distinct link names under files/
15
+ * without changing @parse/fs-files-adapter.
16
+ *
17
+ * @param {Object} filesAdapter parse-server filesAdapter config (module/class form with options)
18
+ */
19
+ function setupFilesLink(filesAdapter) {
20
+ if (!filesAdapter || typeof filesAdapter !== 'object' || !filesAdapter.options) {
21
+ return;
22
+ }
23
+ const {
24
+ filesLinkTarget,
25
+ filesSubDirectory
26
+ } = filesAdapter.options;
27
+ if (filesLinkTarget === undefined || filesLinkTarget === null || filesLinkTarget === '') {
28
+ return;
29
+ }
30
+ if (!filesSubDirectory) {
31
+ throw new Error('filesAdapter.options.filesSubDirectory is required when filesLinkTarget is set.');
32
+ }
33
+ const targetPath = path.resolve(String(filesLinkTarget));
34
+ const linkPath = path.join('files', filesSubDirectory);
35
+ const linkParent = path.dirname(linkPath);
36
+ fs.mkdirSync(targetPath, {
37
+ recursive: true
38
+ });
39
+ fs.mkdirSync(linkParent, {
40
+ recursive: true
41
+ });
42
+ let linkStat;
43
+ try {
44
+ linkStat = fs.lstatSync(linkPath);
45
+ } catch (err) {
46
+ if (err.code === 'ENOENT') {
47
+ createSymlink(targetPath, linkPath);
48
+ return;
49
+ }
50
+ throw err;
51
+ }
52
+ if (linkStat.isSymbolicLink() || isWindowsJunction(linkPath, linkStat)) {
53
+ const currentTarget = path.resolve(path.dirname(linkPath), fs.readlinkSync(linkPath));
54
+ if (pathsEqual(currentTarget, targetPath)) {
55
+ return;
56
+ }
57
+ throw new Error(`files link "${linkPath}" already points to "${currentTarget}", expected "${targetPath}".`);
58
+ }
59
+ throw new Error(`Cannot create files link at "${linkPath}": path already exists and is not a symlink.`);
60
+ }
61
+ function createSymlink(targetPath, linkPath) {
62
+ // junction on Windows avoids elevated privileges required for directory symlinks
63
+ const type = process.platform === 'win32' ? 'junction' : 'dir';
64
+ fs.symlinkSync(targetPath, linkPath, type);
65
+ }
66
+ function isWindowsJunction(linkPath, linkStat) {
67
+ // Directory junctions may not always report as symbolic links; readlink is definitive.
68
+ if (process.platform !== 'win32' || !linkStat.isDirectory()) {
69
+ return false;
70
+ }
71
+ try {
72
+ fs.readlinkSync(linkPath);
73
+ return true;
74
+ } catch {
75
+ return false;
76
+ }
77
+ }
78
+ function pathsEqual(a, b) {
79
+ if (process.platform === 'win32') {
80
+ return a.toLowerCase() === b.toLowerCase();
81
+ }
82
+ return a === b;
83
+ }
84
+ var _default = exports.default = setupFilesLink;
85
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJzZXR1cEZpbGVzTGluayIsImZzIiwicmVxdWlyZSIsInBhdGgiLCJmaWxlc0FkYXB0ZXIiLCJvcHRpb25zIiwiZmlsZXNMaW5rVGFyZ2V0IiwiZmlsZXNTdWJEaXJlY3RvcnkiLCJ1bmRlZmluZWQiLCJFcnJvciIsInRhcmdldFBhdGgiLCJyZXNvbHZlIiwiU3RyaW5nIiwibGlua1BhdGgiLCJqb2luIiwibGlua1BhcmVudCIsImRpcm5hbWUiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJsaW5rU3RhdCIsImxzdGF0U3luYyIsImVyciIsImNvZGUiLCJjcmVhdGVTeW1saW5rIiwiaXNTeW1ib2xpY0xpbmsiLCJpc1dpbmRvd3NKdW5jdGlvbiIsImN1cnJlbnRUYXJnZXQiLCJyZWFkbGlua1N5bmMiLCJwYXRoc0VxdWFsIiwidHlwZSIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN5bWxpbmtTeW5jIiwiaXNEaXJlY3RvcnkiLCJhIiwiYiIsInRvTG93ZXJDYXNlIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvc2V0dXBGaWxlc0xpbmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vKipcbiAqIFdoZW4gZmlsZXNBZGFwdGVyLm9wdGlvbnMuZmlsZXNMaW5rVGFyZ2V0IGlzIHNldCwgY3JlYXRlIGEgc3ltbGluayBhdFxuICogZmlsZXMve2ZpbGVzU3ViRGlyZWN0b3J5fSAtPiBmaWxlc0xpbmtUYXJnZXQgYmVmb3JlIHRoZSBGUyBhZGFwdGVyIHN0YXJ0cy5cbiAqIFRoaXMgbGV0cyBtdWx0aXBsZSBQYXJzZSBpbnN0YW5jZXMgdXNlIGRpc3RpbmN0IGxpbmsgbmFtZXMgdW5kZXIgZmlsZXMvXG4gKiB3aXRob3V0IGNoYW5naW5nIEBwYXJzZS9mcy1maWxlcy1hZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlc0FkYXB0ZXIgcGFyc2Utc2VydmVyIGZpbGVzQWRhcHRlciBjb25maWcgKG1vZHVsZS9jbGFzcyBmb3JtIHdpdGggb3B0aW9ucylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRmlsZXNMaW5rKGZpbGVzQWRhcHRlcikge1xuICBpZiAoIWZpbGVzQWRhcHRlciB8fCB0eXBlb2YgZmlsZXNBZGFwdGVyICE9PSAnb2JqZWN0JyB8fCAhZmlsZXNBZGFwdGVyLm9wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IGZpbGVzTGlua1RhcmdldCwgZmlsZXNTdWJEaXJlY3RvcnkgfSA9IGZpbGVzQWRhcHRlci5vcHRpb25zO1xuICBpZiAoZmlsZXNMaW5rVGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgZmlsZXNMaW5rVGFyZ2V0ID09PSBudWxsIHx8IGZpbGVzTGlua1RhcmdldCA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWZpbGVzU3ViRGlyZWN0b3J5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpbGVzQWRhcHRlci5vcHRpb25zLmZpbGVzU3ViRGlyZWN0b3J5IGlzIHJlcXVpcmVkIHdoZW4gZmlsZXNMaW5rVGFyZ2V0IGlzIHNldC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUoU3RyaW5nKGZpbGVzTGlua1RhcmdldCkpO1xuICBjb25zdCBsaW5rUGF0aCA9IHBhdGguam9pbignZmlsZXMnLCBmaWxlc1N1YkRpcmVjdG9yeSk7XG4gIGNvbnN0IGxpbmtQYXJlbnQgPSBwYXRoLmRpcm5hbWUobGlua1BhdGgpO1xuXG4gIGZzLm1rZGlyU3luYyh0YXJnZXRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMubWtkaXJTeW5jKGxpbmtQYXJlbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGxldCBsaW5rU3RhdDtcbiAgdHJ5IHtcbiAgICBsaW5rU3RhdCA9IGZzLmxzdGF0U3luYyhsaW5rUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIGNyZWF0ZVN5bWxpbmsodGFyZ2V0UGF0aCwgbGlua1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAobGlua1N0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCBpc1dpbmRvd3NKdW5jdGlvbihsaW5rUGF0aCwgbGlua1N0YXQpKSB7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUobGlua1BhdGgpLCBmcy5yZWFkbGlua1N5bmMobGlua1BhdGgpKTtcbiAgICBpZiAocGF0aHNFcXVhbChjdXJyZW50VGFyZ2V0LCB0YXJnZXRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZmlsZXMgbGluayBcIiR7bGlua1BhdGh9XCIgYWxyZWFkeSBwb2ludHMgdG8gXCIke2N1cnJlbnRUYXJnZXR9XCIsIGV4cGVjdGVkIFwiJHt0YXJnZXRQYXRofVwiLmBcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY3JlYXRlIGZpbGVzIGxpbmsgYXQgXCIke2xpbmtQYXRofVwiOiBwYXRoIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBub3QgYSBzeW1saW5rLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ltbGluayh0YXJnZXRQYXRoLCBsaW5rUGF0aCkge1xuICAvLyBqdW5jdGlvbiBvbiBXaW5kb3dzIGF2b2lkcyBlbGV2YXRlZCBwcml2aWxlZ2VzIHJlcXVpcmVkIGZvciBkaXJlY3Rvcnkgc3ltbGlua3NcbiAgY29uc3QgdHlwZSA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnanVuY3Rpb24nIDogJ2Rpcic7XG4gIGZzLnN5bWxpbmtTeW5jKHRhcmdldFBhdGgsIGxpbmtQYXRoLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dzSnVuY3Rpb24obGlua1BhdGgsIGxpbmtTdGF0KSB7XG4gIC8vIERpcmVjdG9yeSBqdW5jdGlvbnMgbWF5IG5vdCBhbHdheXMgcmVwb3J0IGFzIHN5bWJvbGljIGxpbmtzOyByZWFkbGluayBpcyBkZWZpbml0aXZlLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJyB8fCAhbGlua1N0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGZzLnJlYWRsaW5rU3luYyhsaW5rUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoc0VxdWFsKGEsIGIpIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpID09PSBiLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwRmlsZXNMaW5rO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUFDQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQSxDQUFBRSxPQUFBO0FBQUFGLE9BQUEsQ0FBQUcsY0FBQSxHQUFBQSxjQUFBO0FBRWIsTUFBTUMsRUFBRSxHQUFHQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLGNBQWNBLENBQUNJLFlBQVksRUFBRTtFQUMzQyxJQUFJLENBQUNBLFlBQVksSUFBSSxPQUFPQSxZQUFZLEtBQUssUUFBUSxJQUFJLENBQUNBLFlBQVksQ0FBQ0MsT0FBTyxFQUFFO0lBQzlFO0VBQ0Y7RUFFQSxNQUFNO0lBQUVDLGVBQWU7SUFBRUM7RUFBa0IsQ0FBQyxHQUFHSCxZQUFZLENBQUNDLE9BQU87RUFDbkUsSUFBSUMsZUFBZSxLQUFLRSxTQUFTLElBQUlGLGVBQWUsS0FBSyxJQUFJLElBQUlBLGVBQWUsS0FBSyxFQUFFLEVBQUU7SUFDdkY7RUFDRjtFQUVBLElBQUksQ0FBQ0MsaUJBQWlCLEVBQUU7SUFDdEIsTUFBTSxJQUFJRSxLQUFLLENBQ2IsaUZBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTUMsVUFBVSxHQUFHUCxJQUFJLENBQUNRLE9BQU8sQ0FBQ0MsTUFBTSxDQUFDTixlQUFlLENBQUMsQ0FBQztFQUN4RCxNQUFNTyxRQUFRLEdBQUdWLElBQUksQ0FBQ1csSUFBSSxDQUFDLE9BQU8sRUFBRVAsaUJBQWlCLENBQUM7RUFDdEQsTUFBTVEsVUFBVSxHQUFHWixJQUFJLENBQUNhLE9BQU8sQ0FBQ0gsUUFBUSxDQUFDO0VBRXpDWixFQUFFLENBQUNnQixTQUFTLENBQUNQLFVBQVUsRUFBRTtJQUFFUSxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDN0NqQixFQUFFLENBQUNnQixTQUFTLENBQUNGLFVBQVUsRUFBRTtJQUFFRyxTQUFTLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFFN0MsSUFBSUMsUUFBUTtFQUNaLElBQUk7SUFDRkEsUUFBUSxHQUFHbEIsRUFBRSxDQUFDbUIsU0FBUyxDQUFDUCxRQUFRLENBQUM7RUFDbkMsQ0FBQyxDQUFDLE9BQU9RLEdBQUcsRUFBRTtJQUNaLElBQUlBLEdBQUcsQ0FBQ0MsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUN6QkMsYUFBYSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsQ0FBQztNQUNuQztJQUNGO0lBQ0EsTUFBTVEsR0FBRztFQUNYO0VBRUEsSUFBSUYsUUFBUSxDQUFDSyxjQUFjLENBQUMsQ0FBQyxJQUFJQyxpQkFBaUIsQ0FBQ1osUUFBUSxFQUFFTSxRQUFRLENBQUMsRUFBRTtJQUN0RSxNQUFNTyxhQUFhLEdBQUd2QixJQUFJLENBQUNRLE9BQU8sQ0FBQ1IsSUFBSSxDQUFDYSxPQUFPLENBQUNILFFBQVEsQ0FBQyxFQUFFWixFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQyxDQUFDO0lBQ3JGLElBQUllLFVBQVUsQ0FBQ0YsYUFBYSxFQUFFaEIsVUFBVSxDQUFDLEVBQUU7TUFDekM7SUFDRjtJQUNBLE1BQU0sSUFBSUQsS0FBSyxDQUNiLGVBQWVJLFFBQVEsd0JBQXdCYSxhQUFhLGdCQUFnQmhCLFVBQVUsSUFDeEYsQ0FBQztFQUNIO0VBRUEsTUFBTSxJQUFJRCxLQUFLLENBQ2IsZ0NBQWdDSSxRQUFRLDhDQUMxQyxDQUFDO0FBQ0g7QUFFQSxTQUFTVSxhQUFhQSxDQUFDYixVQUFVLEVBQUVHLFFBQVEsRUFBRTtFQUMzQztFQUNBLE1BQU1nQixJQUFJLEdBQUdDLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sR0FBRyxVQUFVLEdBQUcsS0FBSztFQUM5RDlCLEVBQUUsQ0FBQytCLFdBQVcsQ0FBQ3RCLFVBQVUsRUFBRUcsUUFBUSxFQUFFZ0IsSUFBSSxDQUFDO0FBQzVDO0FBRUEsU0FBU0osaUJBQWlCQSxDQUFDWixRQUFRLEVBQUVNLFFBQVEsRUFBRTtFQUM3QztFQUNBLElBQUlXLE9BQU8sQ0FBQ0MsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDWixRQUFRLENBQUNjLFdBQVcsQ0FBQyxDQUFDLEVBQUU7SUFDM0QsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJO0lBQ0ZoQyxFQUFFLENBQUMwQixZQUFZLENBQUNkLFFBQVEsQ0FBQztJQUN6QixPQUFPLElBQUk7RUFDYixDQUFDLENBQUMsTUFBTTtJQUNOLE9BQU8sS0FBSztFQUNkO0FBQ0Y7QUFFQSxTQUFTZSxVQUFVQSxDQUFDTSxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN4QixJQUFJTCxPQUFPLENBQUNDLFFBQVEsS0FBSyxPQUFPLEVBQUU7SUFDaEMsT0FBT0csQ0FBQyxDQUFDRSxXQUFXLENBQUMsQ0FBQyxLQUFLRCxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDO0VBQzVDO0VBQ0EsT0FBT0YsQ0FBQyxLQUFLQyxDQUFDO0FBQ2hCO0FBQUMsSUFBQUUsUUFBQSxHQUFBeEMsT0FBQSxDQUFBRSxPQUFBLEdBRWNDLGNBQWMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -4,8 +4,47 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ exports.findGeoIndexField = findGeoIndexField;
7
8
  const mongodb = require('mongodb');
8
9
  const Collection = mongodb.Collection;
10
+
11
+ // Query operators that require a geospatial index and therefore trigger
12
+ // on-demand `2d` index creation. `$geoWithin` / `$geoIntersects` are intentionally
13
+ // excluded: they can run as a collection scan and never raise a "no index" error.
14
+ const GEO_INDEX_QUERY_OPERATORS = ['$nearSphere', '$near', '$geoNear'];
15
+
16
+ // Find the field in a Mongo query document that is constrained by a geo operator
17
+ // requiring a geospatial index. Returns the field name (e.g. 'location'), or
18
+ // undefined if none is found. Used as the reliable source of truth for on-demand
19
+ // geo index creation, since the MongoDB error message that used to carry the field
20
+ // name (`... field=<name> ...`) was dropped in MongoDB 8.3+.
21
+ //
22
+ // A geo-near expression must be top-level or inside `$and`: MongoDB rejects it inside
23
+ // `$or` / `$nor` ("geo $near must be top-level expr") and forbids more than one per
24
+ // query ("Too many geoNear expressions"). So there is at most one field to find, and
25
+ // `$and` is the only combinator we need to recurse into.
26
+ function findGeoIndexField(query) {
27
+ if (!query || typeof query !== 'object') {
28
+ return undefined;
29
+ }
30
+ for (const field of Object.keys(query)) {
31
+ const value = query[field];
32
+ // Recurse into `$and`, which holds an array of sub-queries.
33
+ if (field === '$and' && Array.isArray(value)) {
34
+ for (const subQuery of value) {
35
+ const found = findGeoIndexField(subQuery);
36
+ if (found) {
37
+ return found;
38
+ }
39
+ }
40
+ continue;
41
+ }
42
+ if (value && typeof value === 'object' && GEO_INDEX_QUERY_OPERATORS.some(op => Object.prototype.hasOwnProperty.call(value, op))) {
43
+ return field;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
9
48
  class MongoCollection {
10
49
  constructor(mongoCollection) {
11
50
  this._mongoCollection = mongoCollection;
@@ -53,8 +92,12 @@ class MongoCollection {
53
92
  if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
54
93
  throw error;
55
94
  }
56
- // Figure out what key needs an index
57
- const key = error.message.match(/field=([A-Za-z_0-9]+) /)[1];
95
+ // Figure out which field needs a geo index.
96
+ // Older MongoDB embeds the field name in the error message (`... field=<name> ...`);
97
+ // MongoDB 8.3+ shortened the message to `unable to find index for $geoNear query`
98
+ // and no longer includes it, so fall back to reading the field from the query itself.
99
+ const messageMatch = error.message.match(/field=([A-Za-z_0-9]+) /);
100
+ const key = messageMatch && messageMatch[1] || findGeoIndexField(query);
58
101
  if (!key) {
59
102
  throw error;
60
103
  }
@@ -209,4 +252,4 @@ class MongoCollection {
209
252
  }
210
253
  }
211
254
  exports.default = MongoCollection;
212
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm1vbmdvQ29sbGVjdGlvbiIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kIiwicXVlcnkiLCJza2lwIiwibGltaXQiLCJzb3J0Iiwia2V5cyIsIm1heFRpbWVNUyIsImJhdGNoU2l6ZSIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImV4cGxhaW4iLCJjb21tZW50IiwiJHNjb3JlIiwic2NvcmUiLCIkbWV0YSIsIl9yYXdGaW5kIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJtZXNzYWdlIiwibWF0Y2giLCJrZXkiLCJpbmRleCIsImNyZWF0ZUluZGV4IiwidGhlbiIsImNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbiIsImxvY2FsZSIsInN0cmVuZ3RoIiwiZmluZE9wZXJhdGlvbiIsInByb2plY3QiLCJjb2xsYXRpb24iLCJ0b0FycmF5IiwiY291bnQiLCJPYmplY3QiLCJsZW5ndGgiLCJlc3RpbWF0ZWREb2N1bWVudENvdW50IiwiY291bnRPcGVyYXRpb24iLCJjb3VudERvY3VtZW50cyIsImRpc3RpbmN0IiwiZmllbGQiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImluc2VydE9uZSIsIm9iamVjdCIsInNlc3Npb24iLCJ1cHNlcnRPbmUiLCJ1cGRhdGUiLCJ1cGRhdGVPbmUiLCJ1cHNlcnQiLCJ1cGRhdGVNYW55IiwiZGVsZXRlTWFueSIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImluZGV4UmVxdWVzdCIsInVuaXF1ZSIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJkcm9wIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb0NvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbmNvbnN0IENvbGxlY3Rpb24gPSBtb25nb2RiLkNvbGxlY3Rpb247XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vbmdvQ29sbGVjdGlvbiB7XG4gIF9tb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IobW9uZ29Db2xsZWN0aW9uOiBDb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uID0gbW9uZ29Db2xsZWN0aW9uO1xuICB9XG5cbiAgLy8gRG9lcyBhIGZpbmQgd2l0aCBcInNtYXJ0IGluZGV4aW5nXCIuXG4gIC8vIEN1cnJlbnRseSB0aGlzIGp1c3QgbWVhbnMsIGlmIGl0IG5lZWRzIGEgZ2VvaW5kZXggYW5kIHRoZXJlIGlzXG4gIC8vIG5vbmUsIHRoZW4gYnVpbGQgdGhlIGdlb2luZGV4LlxuICAvLyBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGEgbG90IGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgYSBnb29kXG4gIC8vIGlkZWEuIE9yIGV2ZW4gaWYgdGhpcyBiZWhhdmlvciBpcyBhIGdvb2QgaWRlYS5cbiAgZmluZChcbiAgICBxdWVyeSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBTdXBwb3J0IGZvciBGdWxsIFRleHQgU2VhcmNoIC0gJHRleHRcbiAgICBpZiAoa2V5cyAmJiBrZXlzLiRzY29yZSkge1xuICAgICAgZGVsZXRlIGtleXMuJHNjb3JlO1xuICAgICAga2V5cy5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBrZXkgbmVlZHMgYW4gaW5kZXhcbiAgICAgIGNvbnN0IGtleSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2ZpZWxkPShbQS1aYS16XzAtOV0rKSAvKVsxXTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXRpb24gdG8gc3VwcG9ydCBjYXNlIGluc2Vuc2l0aXZlIHF1ZXJpZXNcbiAgICovXG4gIHN0YXRpYyBjYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgbG9jYWxlOiAnZW5fVVMnLCBzdHJlbmd0aDogMiB9O1xuICB9XG5cbiAgX3Jhd0ZpbmQoXG4gICAgcXVlcnksXG4gICAge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICBiYXRjaFNpemUsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgICAgY29tbWVudCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgICBiYXRjaFNpemUsXG4gICAgfSk7XG5cbiAgICBpZiAoa2V5cykge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24ucHJvamVjdChrZXlzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5jb2xsYXRpb24oTW9uZ29Db2xsZWN0aW9uLmNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbigpKTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZU1TKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5tYXhUaW1lTVMobWF4VGltZU1TKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwbGFpbiA/IGZpbmRPcGVyYXRpb24uZXhwbGFpbihleHBsYWluKSA6IGZpbmRPcGVyYXRpb24udG9BcnJheSgpO1xuICB9XG5cbiAgY291bnQocXVlcnksIHsgc2tpcCwgbGltaXQsIHNvcnQsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNvbW1lbnQgfSA9IHt9KSB7XG4gICAgLy8gSWYgcXVlcnkgaXMgZW1wdHksIHRoZW4gdXNlIGVzdGltYXRlZERvY3VtZW50Q291bnQgaW5zdGVhZC5cbiAgICAvLyBUaGlzIGlzIGR1ZSB0byBjb3VudERvY3VtZW50cyBwZXJmb3JtaW5nIGEgc2NhbixcbiAgICAvLyB3aGljaCBncmVhdGx5IGluY3JlYXNlcyBleGVjdXRpb24gdGltZSB3aGVuIGJlaW5nIHJ1biBvbiBsYXJnZSBjb2xsZWN0aW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbW9uZ29vc2UvaXNzdWVzLzY3MTMgZm9yIG1vcmUgaW5mbyByZWdhcmRpbmcgdGhpcyBwcm9ibGVtLlxuICAgIGlmICh0eXBlb2YgcXVlcnkgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmVzdGltYXRlZERvY3VtZW50Q291bnQoe1xuICAgICAgICBtYXhUaW1lTVMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudE9wZXJhdGlvbiA9IHRoaXMuX21vbmdvQ29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnRPcGVyYXRpb247XG4gIH1cblxuICBkaXN0aW5jdChmaWVsZCwgcXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRpc3RpbmN0KGZpZWxkLCBxdWVyeSk7XG4gIH1cblxuICBhZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb25cbiAgICAgIC5hZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4UmVxdWVzdCwge1xuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgIHNwYXJzZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsT0FBTyxHQUFHQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLE1BQU1DLFVBQVUsR0FBR0YsT0FBTyxDQUFDRSxVQUFVO0FBRXRCLE1BQU1DLGVBQWUsQ0FBQztFQUduQ0MsV0FBV0EsQ0FBQ0MsZUFBMkIsRUFBRTtJQUN2QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHRCxlQUFlO0VBQ3pDOztF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
255
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJHRU9fSU5ERVhfUVVFUllfT1BFUkFUT1JTIiwiZmluZEdlb0luZGV4RmllbGQiLCJxdWVyeSIsInVuZGVmaW5lZCIsImZpZWxkIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwiQXJyYXkiLCJpc0FycmF5Iiwic3ViUXVlcnkiLCJmb3VuZCIsInNvbWUiLCJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk1vbmdvQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwibW9uZ29Db2xsZWN0aW9uIiwiX21vbmdvQ29sbGVjdGlvbiIsImZpbmQiLCJza2lwIiwibGltaXQiLCJzb3J0IiwibWF4VGltZU1TIiwiYmF0Y2hTaXplIiwicmVhZFByZWZlcmVuY2UiLCJoaW50IiwiY2FzZUluc2Vuc2l0aXZlIiwiZXhwbGFpbiIsImNvbW1lbnQiLCIkc2NvcmUiLCJzY29yZSIsIiRtZXRhIiwiX3Jhd0ZpbmQiLCJjYXRjaCIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJtYXRjaCIsIm1lc3NhZ2VNYXRjaCIsImtleSIsImluZGV4IiwiY3JlYXRlSW5kZXgiLCJ0aGVuIiwiY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uIiwibG9jYWxlIiwic3RyZW5ndGgiLCJmaW5kT3BlcmF0aW9uIiwicHJvamVjdCIsImNvbGxhdGlvbiIsInRvQXJyYXkiLCJjb3VudCIsImxlbmd0aCIsImVzdGltYXRlZERvY3VtZW50Q291bnQiLCJjb3VudE9wZXJhdGlvbiIsImNvdW50RG9jdW1lbnRzIiwiZGlzdGluY3QiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImluc2VydE9uZSIsIm9iamVjdCIsInNlc3Npb24iLCJ1cHNlcnRPbmUiLCJ1cGRhdGUiLCJ1cGRhdGVPbmUiLCJ1cHNlcnQiLCJ1cGRhdGVNYW55IiwiZGVsZXRlTWFueSIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImluZGV4UmVxdWVzdCIsInVuaXF1ZSIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJkcm9wIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb0NvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbmNvbnN0IENvbGxlY3Rpb24gPSBtb25nb2RiLkNvbGxlY3Rpb247XG5cbi8vIFF1ZXJ5IG9wZXJhdG9ycyB0aGF0IHJlcXVpcmUgYSBnZW9zcGF0aWFsIGluZGV4IGFuZCB0aGVyZWZvcmUgdHJpZ2dlclxuLy8gb24tZGVtYW5kIGAyZGAgaW5kZXggY3JlYXRpb24uIGAkZ2VvV2l0aGluYCAvIGAkZ2VvSW50ZXJzZWN0c2AgYXJlIGludGVudGlvbmFsbHlcbi8vIGV4Y2x1ZGVkOiB0aGV5IGNhbiBydW4gYXMgYSBjb2xsZWN0aW9uIHNjYW4gYW5kIG5ldmVyIHJhaXNlIGEgXCJubyBpbmRleFwiIGVycm9yLlxuY29uc3QgR0VPX0lOREVYX1FVRVJZX09QRVJBVE9SUyA9IFsnJG5lYXJTcGhlcmUnLCAnJG5lYXInLCAnJGdlb05lYXInXTtcblxuLy8gRmluZCB0aGUgZmllbGQgaW4gYSBNb25nbyBxdWVyeSBkb2N1bWVudCB0aGF0IGlzIGNvbnN0cmFpbmVkIGJ5IGEgZ2VvIG9wZXJhdG9yXG4vLyByZXF1aXJpbmcgYSBnZW9zcGF0aWFsIGluZGV4LiBSZXR1cm5zIHRoZSBmaWVsZCBuYW1lIChlLmcuICdsb2NhdGlvbicpLCBvclxuLy8gdW5kZWZpbmVkIGlmIG5vbmUgaXMgZm91bmQuIFVzZWQgYXMgdGhlIHJlbGlhYmxlIHNvdXJjZSBvZiB0cnV0aCBmb3Igb24tZGVtYW5kXG4vLyBnZW8gaW5kZXggY3JlYXRpb24sIHNpbmNlIHRoZSBNb25nb0RCIGVycm9yIG1lc3NhZ2UgdGhhdCB1c2VkIHRvIGNhcnJ5IHRoZSBmaWVsZFxuLy8gbmFtZSAoYC4uLiBmaWVsZD08bmFtZT4gLi4uYCkgd2FzIGRyb3BwZWQgaW4gTW9uZ29EQiA4LjMrLlxuLy9cbi8vIEEgZ2VvLW5lYXIgZXhwcmVzc2lvbiBtdXN0IGJlIHRvcC1sZXZlbCBvciBpbnNpZGUgYCRhbmRgOiBNb25nb0RCIHJlamVjdHMgaXQgaW5zaWRlXG4vLyBgJG9yYCAvIGAkbm9yYCAoXCJnZW8gJG5lYXIgbXVzdCBiZSB0b3AtbGV2ZWwgZXhwclwiKSBhbmQgZm9yYmlkcyBtb3JlIHRoYW4gb25lIHBlclxuLy8gcXVlcnkgKFwiVG9vIG1hbnkgZ2VvTmVhciBleHByZXNzaW9uc1wiKS4gU28gdGhlcmUgaXMgYXQgbW9zdCBvbmUgZmllbGQgdG8gZmluZCwgYW5kXG4vLyBgJGFuZGAgaXMgdGhlIG9ubHkgY29tYmluYXRvciB3ZSBuZWVkIHRvIHJlY3Vyc2UgaW50by5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kR2VvSW5kZXhGaWVsZChxdWVyeSkge1xuICBpZiAoIXF1ZXJ5IHx8IHR5cGVvZiBxdWVyeSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMocXVlcnkpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBxdWVyeVtmaWVsZF07XG4gICAgLy8gUmVjdXJzZSBpbnRvIGAkYW5kYCwgd2hpY2ggaG9sZHMgYW4gYXJyYXkgb2Ygc3ViLXF1ZXJpZXMuXG4gICAgaWYgKGZpZWxkID09PSAnJGFuZCcgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3Qgc3ViUXVlcnkgb2YgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBmaW5kR2VvSW5kZXhGaWVsZChzdWJRdWVyeSk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICBHRU9fSU5ERVhfUVVFUllfT1BFUkFUT1JTLnNvbWUob3AgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBvcCkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vbmdvQ29sbGVjdGlvbiB7XG4gIF9tb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IobW9uZ29Db2xsZWN0aW9uOiBDb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uID0gbW9uZ29Db2xsZWN0aW9uO1xuICB9XG5cbiAgLy8gRG9lcyBhIGZpbmQgd2l0aCBcInNtYXJ0IGluZGV4aW5nXCIuXG4gIC8vIEN1cnJlbnRseSB0aGlzIGp1c3QgbWVhbnMsIGlmIGl0IG5lZWRzIGEgZ2VvaW5kZXggYW5kIHRoZXJlIGlzXG4gIC8vIG5vbmUsIHRoZW4gYnVpbGQgdGhlIGdlb2luZGV4LlxuICAvLyBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGEgbG90IGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgYSBnb29kXG4gIC8vIGlkZWEuIE9yIGV2ZW4gaWYgdGhpcyBiZWhhdmlvciBpcyBhIGdvb2QgaWRlYS5cbiAgZmluZChcbiAgICBxdWVyeSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBTdXBwb3J0IGZvciBGdWxsIFRleHQgU2VhcmNoIC0gJHRleHRcbiAgICBpZiAoa2V5cyAmJiBrZXlzLiRzY29yZSkge1xuICAgICAgZGVsZXRlIGtleXMuJHNjb3JlO1xuICAgICAga2V5cy5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgbmVlZHMgYSBnZW8gaW5kZXguXG4gICAgICAvLyBPbGRlciBNb25nb0RCIGVtYmVkcyB0aGUgZmllbGQgbmFtZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSAoYC4uLiBmaWVsZD08bmFtZT4gLi4uYCk7XG4gICAgICAvLyBNb25nb0RCIDguMysgc2hvcnRlbmVkIHRoZSBtZXNzYWdlIHRvIGB1bmFibGUgdG8gZmluZCBpbmRleCBmb3IgJGdlb05lYXIgcXVlcnlgXG4gICAgICAvLyBhbmQgbm8gbG9uZ2VyIGluY2x1ZGVzIGl0LCBzbyBmYWxsIGJhY2sgdG8gcmVhZGluZyB0aGUgZmllbGQgZnJvbSB0aGUgcXVlcnkgaXRzZWxmLlxuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvZmllbGQ9KFtBLVphLXpfMC05XSspIC8pO1xuICAgICAgY29uc3Qga2V5ID0gKG1lc3NhZ2VNYXRjaCAmJiBtZXNzYWdlTWF0Y2hbMV0pIHx8IGZpbmRHZW9JbmRleEZpZWxkKHF1ZXJ5KTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIGJhdGNoU2l6ZSxcbiAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsYXRpb24gdG8gc3VwcG9ydCBjYXNlIGluc2Vuc2l0aXZlIHF1ZXJpZXNcbiAgICovXG4gIHN0YXRpYyBjYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgbG9jYWxlOiAnZW5fVVMnLCBzdHJlbmd0aDogMiB9O1xuICB9XG5cbiAgX3Jhd0ZpbmQoXG4gICAgcXVlcnksXG4gICAge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICBiYXRjaFNpemUsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgICAgY29tbWVudCxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgICBiYXRjaFNpemUsXG4gICAgfSk7XG5cbiAgICBpZiAoa2V5cykge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24ucHJvamVjdChrZXlzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5jb2xsYXRpb24oTW9uZ29Db2xsZWN0aW9uLmNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbigpKTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGltZU1TKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5tYXhUaW1lTVMobWF4VGltZU1TKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwbGFpbiA/IGZpbmRPcGVyYXRpb24uZXhwbGFpbihleHBsYWluKSA6IGZpbmRPcGVyYXRpb24udG9BcnJheSgpO1xuICB9XG5cbiAgY291bnQocXVlcnksIHsgc2tpcCwgbGltaXQsIHNvcnQsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNvbW1lbnQgfSA9IHt9KSB7XG4gICAgLy8gSWYgcXVlcnkgaXMgZW1wdHksIHRoZW4gdXNlIGVzdGltYXRlZERvY3VtZW50Q291bnQgaW5zdGVhZC5cbiAgICAvLyBUaGlzIGlzIGR1ZSB0byBjb3VudERvY3VtZW50cyBwZXJmb3JtaW5nIGEgc2NhbixcbiAgICAvLyB3aGljaCBncmVhdGx5IGluY3JlYXNlcyBleGVjdXRpb24gdGltZSB3aGVuIGJlaW5nIHJ1biBvbiBsYXJnZSBjb2xsZWN0aW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0F1dG9tYXR0aWMvbW9uZ29vc2UvaXNzdWVzLzY3MTMgZm9yIG1vcmUgaW5mbyByZWdhcmRpbmcgdGhpcyBwcm9ibGVtLlxuICAgIGlmICh0eXBlb2YgcXVlcnkgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmVzdGltYXRlZERvY3VtZW50Q291bnQoe1xuICAgICAgICBtYXhUaW1lTVMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudE9wZXJhdGlvbiA9IHRoaXMuX21vbmdvQ29sbGVjdGlvbi5jb3VudERvY3VtZW50cyhxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnRPcGVyYXRpb247XG4gIH1cblxuICBkaXN0aW5jdChmaWVsZCwgcXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRpc3RpbmN0KGZpZWxkLCBxdWVyeSk7XG4gIH1cblxuICBhZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb25cbiAgICAgIC5hZ2dyZWdhdGUocGlwZWxpbmUsIHsgbWF4VGltZU1TLCBiYXRjaFNpemUsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4UmVxdWVzdCwge1xuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgIHNwYXJzZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNsQyxNQUFNQyxVQUFVLEdBQUdGLE9BQU8sQ0FBQ0UsVUFBVTs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQzs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxpQkFBaUJBLENBQUNDLEtBQUssRUFBRTtFQUN2QyxJQUFJLENBQUNBLEtBQUssSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQ3ZDLE9BQU9DLFNBQVM7RUFDbEI7RUFDQSxLQUFLLE1BQU1DLEtBQUssSUFBSUMsTUFBTSxDQUFDQyxJQUFJLENBQUNKLEtBQUssQ0FBQyxFQUFFO0lBQ3RDLE1BQU1LLEtBQUssR0FBR0wsS0FBSyxDQUFDRSxLQUFLLENBQUM7SUFDMUI7SUFDQSxJQUFJQSxLQUFLLEtBQUssTUFBTSxJQUFJSSxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDNUMsS0FBSyxNQUFNRyxRQUFRLElBQUlILEtBQUssRUFBRTtRQUM1QixNQUFNSSxLQUFLLEdBQUdWLGlCQUFpQixDQUFD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