velocious 1.0.519 → 1.0.521

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +36 -0
  2. package/build/background-jobs/json-socket.js +12 -0
  3. package/build/background-jobs/main.js +78 -23
  4. package/build/background-jobs/store.js +127 -5
  5. package/build/background-jobs/types.js +4 -2
  6. package/build/background-jobs/worker.js +113 -23
  7. package/build/configuration-types.js +29 -6
  8. package/build/configuration.js +1 -1
  9. package/build/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
  10. package/build/jobs/prune-terminal-background-jobs.js +67 -0
  11. package/build/src/background-jobs/json-socket.d.ts +12 -0
  12. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  13. package/build/src/background-jobs/json-socket.js +13 -1
  14. package/build/src/background-jobs/main.d.ts +18 -9
  15. package/build/src/background-jobs/main.d.ts.map +1 -1
  16. package/build/src/background-jobs/main.js +73 -26
  17. package/build/src/background-jobs/store.d.ts +30 -0
  18. package/build/src/background-jobs/store.d.ts.map +1 -1
  19. package/build/src/background-jobs/store.js +110 -5
  20. package/build/src/background-jobs/types.d.ts +14 -3
  21. package/build/src/background-jobs/types.d.ts.map +1 -1
  22. package/build/src/background-jobs/types.js +5 -3
  23. package/build/src/background-jobs/worker.d.ts +55 -7
  24. package/build/src/background-jobs/worker.d.ts.map +1 -1
  25. package/build/src/background-jobs/worker.js +108 -22
  26. package/build/src/configuration-types.d.ts +71 -11
  27. package/build/src/configuration-types.d.ts.map +1 -1
  28. package/build/src/configuration-types.js +30 -7
  29. package/build/src/configuration.d.ts +4 -2
  30. package/build/src/configuration.d.ts.map +1 -1
  31. package/build/src/configuration.js +2 -2
  32. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +2 -2
  33. package/build/src/jobs/prune-terminal-background-jobs.d.ts +23 -0
  34. package/build/src/jobs/prune-terminal-background-jobs.d.ts.map +1 -0
  35. package/build/src/jobs/prune-terminal-background-jobs.js +61 -0
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/background-jobs/json-socket.js +12 -0
  39. package/src/background-jobs/main.js +78 -23
  40. package/src/background-jobs/store.js +127 -5
  41. package/src/background-jobs/types.js +4 -2
  42. package/src/background-jobs/worker.js +113 -23
  43. package/src/configuration-types.js +29 -6
  44. package/src/configuration.js +1 -1
  45. package/src/environment-handlers/node/cli/commands/generate/base-models.js +1 -1
  46. package/src/jobs/prune-terminal-background-jobs.js +67 -0
@@ -22,7 +22,7 @@ const jsDocTypeByColumnType = {
22
22
  float: "number",
23
23
  int: "number",
24
24
  integer: "number",
25
- json: "Record<string, ?>",
25
+ json: "Record<string, unknown>",
26
26
  longtext: "string",
27
27
  mediumtext: "string",
28
28
  numeric: "number",
@@ -432,4 +432,4 @@ export default class DbGenerateModel extends BaseCommand {
432
432
  return nestedWriteAttributes;
433
433
  }
434
434
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxnQkFBZ0IsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN6RSxPQUFPLFVBQVUsTUFBTSxxQ0FBcUMsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxtQkFBbUIsTUFBTSw0QkFBNEIsQ0FBQTtBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxNQUFNLDhCQUE4QixHQUFHLGdDQUFnQyxDQUFBO0FBRXZFOzs7R0FHRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsR0FBRyxFQUFFLFFBQVE7SUFDYixJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxRQUFRO0lBQ2QsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixJQUFJLEVBQUUsTUFBTTtJQUNaLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLEtBQUssRUFBRSxRQUFRO0lBQ2YsR0FBRyxFQUFFLFFBQVE7SUFDYixPQUFPLEVBQUUsUUFBUTtJQUNqQixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxRQUFRO0lBQ2QsNkJBQTZCLEVBQUUsTUFBTTtJQUNyQyxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFR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Q0FBQTtZQUN4RyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFBO1lBQ3pILE1BQU0sVUFBVSxHQUFHLGFBQWEsbUJBQW1CLFNBQVMsbUJBQW1CLEdBQUcsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQTtZQUU3SyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLFlBQVksRUFBRSxHQUFHLGdCQUFnQixZQUFZO2dCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUNqRixnQkFBZ0I7YUFDakIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELE9BQU8scUJBQXFCLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBkZWJ1cnJDb2x1bW5OYW1lIGZyb20gXCIuLi8uLi8uLi8uLi8uLi91dGlscy9kZWJ1cnItY29sdW1uLW5hbWUuanNcIlxuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3V0aWxzL2ZpbGUtZXhpc3RzLmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGdlbmVyYXRlZEZpbGVCYW5uZXIgZnJvbSBcIi4vZ2VuZXJhdGVkLWZpbGUtYmFubmVyLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG5jb25zdCBCQVNFX01PREVMU19SRUdFTkVSQVRFX0NPTU1BTkQgPSBcInZlbG9jaW91cyBnZW5lcmF0ZTpiYXNlLW1vZGVsc1wiXG5cbi8qKlxuICogTWFwcyBhbiBlZmZlY3RpdmUgY29sdW1uIHR5cGUgdG8gdGhlIEpTRG9jIHR5cGUgdXNlZCBpbiBnZW5lcmF0ZWQgYmFzZSBtb2RlbHMuXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuY29uc3QganNEb2NUeXBlQnlDb2x1bW5UeXBlID0ge1xuICBiaWdpbnQ6IFwibnVtYmVyXCIsXG4gIGJpdDogXCJudW1iZXJcIixcbiAgYmxvYjogXCJzdHJpbmdcIixcbiAgYm9vbGVhbjogXCJib29sZWFuXCIsXG4gIGNoYXI6IFwic3RyaW5nXCIsXG4gIFwiY2hhcmFjdGVyIHZhcnlpbmdcIjogXCJzdHJpbmdcIixcbiAgZGF0ZTogXCJEYXRlXCIsXG4gIGRhdGV0aW1lOiBcIkRhdGVcIixcbiAgZGVjaW1hbDogXCJudW1iZXJcIixcbiAgZmxvYXQ6IFwibnVtYmVyXCIsXG4gIGludDogXCJudW1iZXJcIixcbiAgaW50ZWdlcjogXCJudW1iZXJcIixcbiAganNvbjogXCJSZWNvcmQ8c3RyaW5nLCA/PlwiLFxuICBsb25ndGV4dDogXCJzdHJpbmdcIixcbiAgbWVkaXVtdGV4dDogXCJzdHJpbmdcIixcbiAgbnVtZXJpYzogXCJudW1iZXJcIixcbiAgbnZhcmNoYXI6IFwic3RyaW5nXCIsXG4gIHNtYWxsaW50OiBcIm51bWJlclwiLFxuICB0ZXh0OiBcInN0cmluZ1wiLFxuICBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiOiBcIkRhdGVcIixcbiAgdGlueWludDogXCJudW1iZXJcIixcbiAgdGlueXRleHQ6IFwic3RyaW5nXCIsXG4gIHV1aWQ6IFwic3RyaW5nXCIsXG4gIHZhcmNoYXI6IFwic3RyaW5nXCJcbn1cblxuLyoqIEVmZmVjdGl2ZSBjb2x1bW4gdHlwZXMgd2hvc2UgZ2VuZXJhdGVkIHNldHRlciBhZGRpdGlvbmFsbHkgYWNjZXB0cyBhIHN0cmluZy4gKi9cbmNvbnN0IHNldHRlclN0cmluZ0lucHV0Q29sdW1uVHlwZXMgPSBuZXcgU2V0KFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXSlcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBiYXNlLW1vZGVsIHJlbGF0aW9uc2hpcCBtZXRob2QuXG4gKiBAcGFyYW0ge3thYnN0cmFjdD86IGJvb2xlYW4sIGJvZHk6IHN0cmluZywgbmFtZTogc3RyaW5nLCBwYXJhbT86IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30sIHJldHVybnM6IHN0cmluZ319IGFyZ3MgLSBNZXRob2QgcGFydHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEdlbmVyYXRlZCBtZXRob2Qgc291cmNlLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRSZWxhdGlvbnNoaXBNZXRob2Qoe2Fic3RyYWN0ID0gZmFsc2UsIGJvZHksIG5hbWUsIHBhcmFtLCByZXR1cm5zfSkge1xuICBsZXQgZmlsZUNvbnRlbnQgPSBcIiAgLyoqXFxuXCJcblxuICBpZiAoYWJzdHJhY3QpIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICBpZiAocGFyYW0pIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtwYXJhbS50eXBlfX0gJHtwYXJhbS5uYW1lfVxcbmBcbiAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7cmV0dXJuc319XFxuYFxuICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgZmlsZUNvbnRlbnQgKz0gYCAgJHtuYW1lfSgke3BhcmFtID8gcGFyYW0ubmFtZSA6IFwiXCJ9KSB7ICR7Ym9keX0gfVxcbmBcblxuICByZXR1cm4gZmlsZUNvbnRlbnRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZU1vZGVsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmluaXRpYWxpemVNb2RlbHMoKVxuXG4gICAgY29uc3QgZW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKClcblxuICAgIGNvbnN0IHJvb3REaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgY29uc3QgbW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsc2BcbiAgICBjb25zdCBiYXNlTW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsLWJhc2VzYFxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgYWxsb3dNaXNzaW5nVGFibGVzID0gQm9vbGVhbih0aGlzLnByb2Nlc3NBcmdzPy5pbmNsdWRlcyhcIi0tYWxsb3ctbWlzc2luZy10YWJsZXNcIikpXG4gICAgbGV0IGRldk1vZGUgPSBmYWxzZVxuXG4gICAgaWYgKGJhc2VNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvbW9kZWwtYmFzZXNcIikpIHtcbiAgICAgIGRldk1vZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmaWxlRXhpc3RzKGJhc2VNb2RlbHNEaXIpKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihiYXNlTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG5cbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXMoZmFsc2UpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiR2VuZXJhdGUgYmFzZSBtb2RlbHNcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiBtb2RlbENsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzTmFtZV1cbiAgICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5nZXRUYWJsZUJ5TmFtZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpLCB7dGhyb3dFcnJvcjogIWFsbG93TWlzc2luZ1RhYmxlc30pXG5cbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBpbmcgYmFzZSBtb2RlbCBmb3IgJyR7bW9kZWxDbGFzcy5uYW1lfSc6IHRhYmxlICcke21vZGVsQ2xhc3MudGFibGVOYW1lKCl9JyB3YXMgbm90IGZvdW5kICgtLWFsbG93LW1pc3NpbmctdGFibGVzKS4gS2VlcGluZyBhbnkgZXhpc3RpbmcgYmFzZSBtb2RlbC5gKVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKG1vZGVsQ2xhc3NOYW1lKVxuICAgICAgICBjb25zdCBtb2RlbE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IG1vZGVsQmFzZUZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gYCR7YmFzZU1vZGVsc0Rpcn0vJHttb2RlbEJhc2VGaWxlTmFtZX1gXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvbW9kZWwtYmFzZXMvJHttb2RlbEJhc2VGaWxlTmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoID0gYCR7bW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgbGV0IHNvdXJjZU1vZGVsRmlsZVBhdGhcblxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZUNvbnRlbnQgPSBnZW5lcmF0ZWRGaWxlQmFubmVyKEJBU0VfTU9ERUxTX1JFR0VORVJBVEVfQ09NTUFORClcbiAgICAgICAgbGV0IHZlbG9jaW91c1BhdGhcblxuICAgICAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcIi4uLy4uLy4uLy4uL3NyY1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVsb2Npb3VzUGF0aCA9IFwidmVsb2Npb3VzL2J1aWxkL3NyY1wiXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5zID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpXG4gICAgICAgIGNvbnN0IHdyaXRlQXR0cmlidXRlVHlwZU5hbWUgPSBgJHttb2RlbE5hbWVDYW1lbGl6ZWR9V3JpdGVBdHRyaWJ1dGVzYFxuICAgICAgICBjb25zdCBiZWxvbmdzVG9Xcml0ZUF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLmJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbHNEaXJ9KVxuICAgICAgICBjb25zdCBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXMgPSB0aGlzLm5lc3RlZFdyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzfSlcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IERhdGFiYXNlUmVjb3JkIGZyb20gXCIke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXFxuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgJHttb2RlbE5hbWVDYW1lbGl6ZWR9IHJlY29yZHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHt3cml0ZUF0dHJpYnV0ZVR5cGVOYW1lfVxcbmBcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGRlYnVycmVkQ29sdW1uTmFtZSA9IGRlYnVyckNvbHVtbk5hbWUoY29sdW1uLmdldE5hbWUoKSlcbiAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShkZWJ1cnJlZENvbHVtbk5hbWUsIHRydWUpXG4gICAgICAgICAgY29uc3Qgc2V0dGVySnNkb2NUeXBlID0gdGhpcy5qc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcylcblxuICAgICAgICAgIGlmIChzZXR0ZXJKc2RvY1R5cGUpIHtcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7c2V0dGVySnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19IFske2NhbWVsaXplZENvbHVtbk5hbWV9XSAtIFZhbHVlIGZvciB0aGUgJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfSBhdHRyaWJ1dGUuXFxuYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlIG9mIGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlcykge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlUeXBlfX0gWyR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlOYW1lfV0gLSBSZWxhdGVkICR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucmVsYXRpb25zaGlwTmFtZX0gcmVjb3JkLlxcbmBcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZFdyaXRlQXR0cmlidXRlIG9mIG5lc3RlZFdyaXRlQXR0cmlidXRlcykge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7bmVzdGVkV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlUeXBlfX0gWyR7bmVzdGVkV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlOYW1lfV0gLSBOZXN0ZWQgJHtuZXN0ZWRXcml0ZUF0dHJpYnV0ZS5yZWxhdGlvbnNoaXBOYW1lfSBhdHRyaWJ1dGVzLlxcbmBcbiAgICAgICAgfVxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblxcblwiXG5cbiAgICAgICAgY29uc3QgaGFzTWFueVJlbGF0aW9uRmlsZVBhdGggPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5zdGFuY2UtcmVsYXRpb25zaGlwcy9oYXMtbWFueS5qc2BcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgLyoqIEBhdWdtZW50cyB7RGF0YWJhc2VSZWNvcmQ8JHt3cml0ZUF0dHJpYnV0ZVR5cGVOYW1lfT59ICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgY2xhc3MgJHttb2RlbE5hbWVDYW1lbGl6ZWR9QmFzZSBleHRlbmRzIERhdGFiYXNlUmVjb3JkIHtcXG5gXG5cbiAgICAgIC8vIC0tLSBnZXRNb2RlbENsYXNzKCkgb3ZlcnJpZGUgKGZpeGVzIHBvbHltb3JwaGljIHR5cGluZyBpbiBKUy9KU0RvYykgLS0tXG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgLy8gTW9kZWwgZmlsZSBleGlzdHMgKGUuZy4gc3JjL21vZGVscy90aWNrZXQuanMpIOKGkiByZXR1cm4gdHlwZW9mIFRpY2tldFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8vIEB0cy1pZ25vcmUgLSBvdmVycmlkZSBuYXJyb3dzIHJldHVybiB0eXBlIGZvciBiZXR0ZXIgSW50ZWxsaVNlbnNlIGluIGdlbmVyYXRlZCBtb2RlbCBiYXNlc1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGdldE1vZGVsQ2xhc3MoKSB7IHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9ICovICh0aGlzLmNvbnN0cnVjdG9yKSB9XFxuXFxuYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gbW9kZWwgZmlsZSB5ZXQg4oaSIGZhbGwgYmFjayB0byB0eXBlb2YgVGlja2V0QmFzZVxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3R5cGVvZiAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlfVxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvLyBAdHMtaWdub3JlIC0gb3ZlcnJpZGUgbmFycm93cyByZXR1cm4gdHlwZSBmb3IgYmV0dGVyIEludGVsbGlTZW5zZSBpbiBnZW5lcmF0ZWQgbW9kZWwgYmFzZXNcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBnZXRNb2RlbENsYXNzKCkgeyByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgJHttb2RlbE5hbWVDYW1lbGl6ZWR9QmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpIH1cXG5cXG5gXG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2RzQ291bnQgPSAwXG5cbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZGVidXJyZWRDb2x1bW5OYW1lID0gZGVidXJyQ29sdW1uTmFtZShjb2x1bW4uZ2V0TmFtZSgpKVxuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShkZWJ1cnJlZENvbHVtbk5hbWUsIHRydWUpXG4gICAgICAgIGNvbnN0IGNhbWVsaXplZENvbHVtbk5hbWVCaWdGaXJzdCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZGVidXJyZWRDb2x1bW5OYW1lKVxuICAgICAgICBjb25zdCBqc2RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZyb21Db2x1bW4oY29sdW1uLCBtb2RlbENsYXNzKVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzZG9jVHlwZSkge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske2pzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSB7IHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIpIH1cXG5cXG5gXG5cbiAgICAgICAgY29uc3Qgc2V0dGVySnNkb2NUeXBlID0gdGhpcy5qc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcylcblxuICAgICAgICBpZiAoc2V0dGVySnNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlckpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0Q29sdW1uQXR0cmlidXRlKFwiJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfVwiLCBuZXdWYWx1ZSkgfVxcblxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtib29sZWFufVxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBoYXMke2NhbWVsaXplZENvbHVtbk5hbWVCaWdGaXJzdH0oKSB7IHJldHVybiB0aGlzLl9oYXNBdHRyaWJ1dGUodGhpcy4ke2NhbWVsaXplZENvbHVtbk5hbWV9KCkpIH1cXG5gXG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbENsYXNzLCBcIl90cmFuc2xhdGlvbnNcIikgJiYgbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zICYmIE9iamVjdC5rZXlzKG1vZGVsQ2xhc3MuX3RyYW5zbGF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBUcmFuc2xhdGlvbkNsYXNzID0gbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25Db2x1bW5zID0gVHJhbnNsYXRpb25DbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgbmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUobmFtZSlcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0cmFuc2xhdGlvbkNvbHVtbnMuZmluZCgodHJhbnNsYXRpb25Db2x1bW4pID0+IHRyYW5zbGF0aW9uQ29sdW1uLmdldE5hbWUoKSA9PT0gbmFtZVVuZGVyc2NvcmUpXG4gICAgICAgICAgbGV0IHRyYW5zbGF0aW9uSnNkb2NUeXBlXG5cbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbkpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIFRyYW5zbGF0aW9uQ2xhc3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyYW5zbGF0aW9uSnNkb2NUeXBlICYmIGNvbHVtbikge1xuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke25hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpKSA/PyBudWxsIH1cXG5gXG4gICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgIGNvbnN0IGhhc05hbWUgPSBgaGFzJHtpbmZsZWN0aW9uLmNhbWVsaXplKG5hbWUpfWBcbiAgICAgICAgICBjb25zdCBzZXR0ZXJOYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShuYW1lKX1gXG4gICAgICAgICAgY29uc3Qgc2V0dGVyUGFyYW1UeXBlID0gdHJhbnNsYXRpb25Kc2RvY1R5cGUgfHwgXCI/XCJcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQGFic3RyYWN0XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtib29sZWFufVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2hhc05hbWV9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIke2hhc05hbWV9IG5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtzZXR0ZXJQYXJhbVR5cGV9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtzZXR0ZXJOYW1lfShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0VHJhbnNsYXRlZEF0dHJpYnV0ZShcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpLCBuZXdWYWx1ZSkgfVxcbmBcbiAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbGVNZXRob2ROYW1lID0gYCR7bmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUobG9jYWxlKX1gXG5cbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbkpzZG9jVHlwZSAmJiBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3RyYW5zbGF0aW9uSnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtsb2NhbGVNZXRob2ROYW1lfSgpIHsgcmV0dXJuIHRoaXMuX2dldFRyYW5zbGF0ZWRBdHRyaWJ1dGVXaXRoRmFsbGJhY2soXCIke25hbWV9XCIsIFwiJHtsb2NhbGV9XCIpID8/IG51bGwgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZVNldHRlck5hbWUgPSBgJHtzZXR0ZXJOYW1lfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGUpfWBcblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlclBhcmFtVHlwZX19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3ZvaWR9XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZVNldHRlck5hbWV9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRUcmFuc2xhdGVkQXR0cmlidXRlKFwiJHtuYW1lfVwiLCBcIiR7bG9jYWxlfVwiLCBuZXdWYWx1ZSkgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZUhhc05hbWUgPSBgaGFzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGxvY2FsZU1ldGhvZE5hbWUpfWBcblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQGFic3RyYWN0XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2Jvb2xlYW59XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZUhhc05hbWV9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIke2xvY2FsZUhhc05hbWV9IG5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzKCkpIHtcbiAgICAgICAgbGV0IGJhc2VGaWxlUGF0aCwgYmFzZUZ1bGxGaWxlUGF0aCwgZmlsZU5hbWUsIGZ1bGxGaWxlUGF0aFxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgICAgIGZpbGVOYW1lID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0nIG9uICcke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9JyBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcblxuICAgICAgICAgIGZpbGVOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuICAgICAgICAgIGZ1bGxGaWxlUGF0aCA9IGBzcmMvbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIGJhc2VGaWxlUGF0aCA9IGAuLi9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICBiYXNlRnVsbEZpbGVQYXRoID0gYHNyYy9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJiZWxvbmdzVG9cIiB8fCByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzT25lXCIpIHtcbiAgICAgICAgICBsZXQgbW9kZWxGaWxlUGF0aFxuXG4gICAgICAgICAgaWYgKGZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBgLi4vbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGJhc2VGdWxsRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBtb2RlbEZpbGVQYXRoID0gYmFzZUZpbGVQYXRoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthdHRyaWJ1dGVzXVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KGF0dHJpYnV0ZXMpIHsgdm9pZCBhdHRyaWJ1dGVzOyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0IHwgdW5kZWZpbmVkPn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfU9yTG9hZCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fSAqLyAodGhpcy5yZWxhdGlvbnNoaXBPckxvYWQoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIsIHtwcmVsb2FkVHJhbnNsYXRpb25zOiB0cnVlfSkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9IG5ld01vZGVsXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt2b2lkfVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KG5ld01vZGVsKSB7IHZvaWQgbmV3TW9kZWw7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgICBsZXQgcmVjb3JkSW1wb3J0XG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VGdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhiYXNlRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWNvcmRJbXBvcnQgPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiJHtoYXNNYW55UmVsYXRpb25GaWxlUGF0aH1cIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0LCB0eXBlb2YgaW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1Mb2FkZWQoKSB7IHJldHVybiAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBnZW5lcmF0ZWRSZWxhdGlvbnNoaXBNZXRob2Qoe1xuICAgICAgICAgICAgYWJzdHJhY3Q6IHRydWUsXG4gICAgICAgICAgICBib2R5OiBcInRocm93IG5ldyBFcnJvcihcXFwiTm90IGltcGxlbWVudGVkXFxcIilcIixcbiAgICAgICAgICAgIG5hbWU6IGBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfWAsXG4gICAgICAgICAgICByZXR1cm5zOiBgUHJvbWlzZTxBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD4+YFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gZ2VuZXJhdGVkUmVsYXRpb25zaGlwTWV0aG9kKHtcbiAgICAgICAgICAgIGJvZHk6IGByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPEFycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pj59ICovICh0aGlzLnJlbGF0aW9uc2hpcE9yTG9hZChcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikpYCxcbiAgICAgICAgICAgIG5hbWU6IGAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9T3JMb2FkYCxcbiAgICAgICAgICAgIHJldHVybnM6IGBQcm9taXNlPEFycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pj5gXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gbmV3TW9kZWxzXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0obmV3TW9kZWxzKSB7IHZvaWQgbmV3TW9kZWxzOyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJ9XFxuXCJcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUobW9kZWxQYXRoLCBmaWxlQ29udGVudClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKGVuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgdHlwZSBmcm9tIGNvbHVtbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBvd25pbmcgdGhlIGNvbHVtbiAoZm9yIGRlY2xhcmVkIGF0dHJpYnV0ZSBjYXN0cykuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGpzIGRvYyB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCB0eXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbi5nZXROYW1lKCkpXG4gICAgY29uc3QganNEb2NUeXBlID0gdHlwZSA/IGpzRG9jVHlwZUJ5Q29sdW1uVHlwZVt0eXBlXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFqc0RvY1R5cGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gY29sdW1uIHR5cGU6ICR7dHlwZX1gKVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHNldHRlciB0eXBlIGZyb20gY29sdW1uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIG93bmluZyB0aGUgY29sdW1uIChmb3IgZGVjbGFyZWQgYXR0cmlidXRlIGNhc3RzKS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUganMgZG9jIHNldHRlciB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NTZXR0ZXJUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCB0eXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbi5nZXROYW1lKCkpXG5cbiAgICBpZiAodHlwZSAmJiBzZXR0ZXJTdHJpbmdJbnB1dENvbHVtblR5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZSB8IHN0cmluZ1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBiZWxvbmdzIHRvIHdyaXRlIGF0dHJpYnV0ZXMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbHNEaXIgLSBTb3VyY2UgbW9kZWxzIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e3Byb3BlcnR5TmFtZTogc3RyaW5nLCBwcm9wZXJ0eVR5cGU6IHN0cmluZywgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nfT4+fSAtIEJlbG9uZ3MtdG8gd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIGFzeW5jIGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbHNEaXJ9KSB7XG4gICAgY29uc3Qgd3JpdGVBdHRyaWJ1dGVzID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwcygpKSB7XG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcbiAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkgY29udGludWVcblxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfScgb24gJyR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbEZpbGVOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxQYXRoID0gYCR7bW9kZWxzRGlyfS8ke3RhcmdldE1vZGVsRmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW1wb3J0UGF0aCA9IGF3YWl0IGZpbGVFeGlzdHModGFyZ2V0TW9kZWxQYXRoKSA/IGAuLi9tb2RlbHMvJHt0YXJnZXRNb2RlbEZpbGVOYW1lfS5qc2AgOiBgLi8ke3RhcmdldE1vZGVsRmlsZU5hbWV9LmpzYFxuXG4gICAgICB3cml0ZUF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSxcbiAgICAgICAgcHJvcGVydHlUeXBlOiBgaW1wb3J0KFwiJHt0YXJnZXRJbXBvcnRQYXRofVwiKS5kZWZhdWx0YCxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXN0ZWQgd3JpdGUgYXR0cmlidXRlcyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7cHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VHlwZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzfSkge1xuICAgIGNvbnN0IGFjY2VwdGVkTmVzdGVkQXR0cmlidXRlcyA9IG1vZGVsQ2xhc3MuX2FjY2VwdGVkTmVzdGVkQXR0cmlidXRlcyB8fCB7fVxuICAgIGNvbnN0IG5lc3RlZFdyaXRlQXR0cmlidXRlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoYWNjZXB0ZWROZXN0ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBvbiAnJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG5cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsRmlsZU5hbWUgPSBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGFyZ2V0TW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSkpXG4gICAgICBjb25zdCB0YXJnZXRXcml0ZVR5cGVOYW1lID0gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZSh0YXJnZXRNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSl9V3JpdGVBdHRyaWJ1dGVzYFxuICAgICAgY29uc3QgbmVzdGVkVHlwZSA9IGBpbXBvcnQoXCIuLyR7dGFyZ2V0TW9kZWxGaWxlTmFtZX0uanNcIikuJHt0YXJnZXRXcml0ZVR5cGVOYW1lfSR7YWNjZXB0ZWROZXN0ZWRBdHRyaWJ1dGVzW3JlbGF0aW9uc2hpcE5hbWVdPy5hbGxvd0Rlc3Ryb3kgPyBcIiAmIHtfZGVzdHJveT86IGJvb2xlYW59XCIgOiBcIlwifWBcblxuICAgICAgbmVzdGVkV3JpdGVBdHRyaWJ1dGVzLnB1c2goe1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IGAke3JlbGF0aW9uc2hpcE5hbWV9QXR0cmlidXRlc2AsXG4gICAgICAgIHByb3BlcnR5VHlwZTogcmVsYXRpb25zaGlwVHlwZSA9PSBcImhhc01hbnlcIiA/IGBBcnJheTwke25lc3RlZFR5cGV9PmAgOiBuZXN0ZWRUeXBlLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXNcbiAgfVxufVxuIl19
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxnQkFBZ0IsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN6RSxPQUFPLFVBQVUsTUFBTSxxQ0FBcUMsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxtQkFBbUIsTUFBTSw0QkFBNEIsQ0FBQTtBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxNQUFNLDhCQUE4QixHQUFHLGdDQUFnQyxDQUFBO0FBRXZFOzs7R0FHRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsR0FBRyxFQUFFLFFBQVE7SUFDYixJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUksRUFBRSxRQUFRO0lBQ2QsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixJQUFJLEVBQUUsTUFBTTtJQUNaLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLEtBQUssRUFBRSxRQUFRO0lBQ2YsR0FBRyxFQUFFLFFBQVE7SUFDYixPQUFPLEVBQUUsUUFBUTtJQUNqQixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxRQUFRO0lBQ2QsNkJBQTZCLEVBQUUsTUFBTTtJQUNyQyxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFR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Q0FBQTtZQUN4RyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFBO1lBQ3pILE1BQU0sVUFBVSxHQUFHLGFBQWEsbUJBQW1CLFNBQVMsbUJBQW1CLEdBQUcsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQTtZQUU3SyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLFlBQVksRUFBRSxHQUFHLGdCQUFnQixZQUFZO2dCQUM3QyxZQUFZLEVBQUUsZ0JBQWdCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUNqRixnQkFBZ0I7YUFDakIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELE9BQU8scUJBQXFCLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBkZWJ1cnJDb2x1bW5OYW1lIGZyb20gXCIuLi8uLi8uLi8uLi8uLi91dGlscy9kZWJ1cnItY29sdW1uLW5hbWUuanNcIlxuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3V0aWxzL2ZpbGUtZXhpc3RzLmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IGdlbmVyYXRlZEZpbGVCYW5uZXIgZnJvbSBcIi4vZ2VuZXJhdGVkLWZpbGUtYmFubmVyLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG5jb25zdCBCQVNFX01PREVMU19SRUdFTkVSQVRFX0NPTU1BTkQgPSBcInZlbG9jaW91cyBnZW5lcmF0ZTpiYXNlLW1vZGVsc1wiXG5cbi8qKlxuICogTWFwcyBhbiBlZmZlY3RpdmUgY29sdW1uIHR5cGUgdG8gdGhlIEpTRG9jIHR5cGUgdXNlZCBpbiBnZW5lcmF0ZWQgYmFzZSBtb2RlbHMuXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuY29uc3QganNEb2NUeXBlQnlDb2x1bW5UeXBlID0ge1xuICBiaWdpbnQ6IFwibnVtYmVyXCIsXG4gIGJpdDogXCJudW1iZXJcIixcbiAgYmxvYjogXCJzdHJpbmdcIixcbiAgYm9vbGVhbjogXCJib29sZWFuXCIsXG4gIGNoYXI6IFwic3RyaW5nXCIsXG4gIFwiY2hhcmFjdGVyIHZhcnlpbmdcIjogXCJzdHJpbmdcIixcbiAgZGF0ZTogXCJEYXRlXCIsXG4gIGRhdGV0aW1lOiBcIkRhdGVcIixcbiAgZGVjaW1hbDogXCJudW1iZXJcIixcbiAgZmxvYXQ6IFwibnVtYmVyXCIsXG4gIGludDogXCJudW1iZXJcIixcbiAgaW50ZWdlcjogXCJudW1iZXJcIixcbiAganNvbjogXCJSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlwiLFxuICBsb25ndGV4dDogXCJzdHJpbmdcIixcbiAgbWVkaXVtdGV4dDogXCJzdHJpbmdcIixcbiAgbnVtZXJpYzogXCJudW1iZXJcIixcbiAgbnZhcmNoYXI6IFwic3RyaW5nXCIsXG4gIHNtYWxsaW50OiBcIm51bWJlclwiLFxuICB0ZXh0OiBcInN0cmluZ1wiLFxuICBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiOiBcIkRhdGVcIixcbiAgdGlueWludDogXCJudW1iZXJcIixcbiAgdGlueXRleHQ6IFwic3RyaW5nXCIsXG4gIHV1aWQ6IFwic3RyaW5nXCIsXG4gIHZhcmNoYXI6IFwic3RyaW5nXCJcbn1cblxuLyoqIEVmZmVjdGl2ZSBjb2x1bW4gdHlwZXMgd2hvc2UgZ2VuZXJhdGVkIHNldHRlciBhZGRpdGlvbmFsbHkgYWNjZXB0cyBhIHN0cmluZy4gKi9cbmNvbnN0IHNldHRlclN0cmluZ0lucHV0Q29sdW1uVHlwZXMgPSBuZXcgU2V0KFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXSlcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBiYXNlLW1vZGVsIHJlbGF0aW9uc2hpcCBtZXRob2QuXG4gKiBAcGFyYW0ge3thYnN0cmFjdD86IGJvb2xlYW4sIGJvZHk6IHN0cmluZywgbmFtZTogc3RyaW5nLCBwYXJhbT86IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30sIHJldHVybnM6IHN0cmluZ319IGFyZ3MgLSBNZXRob2QgcGFydHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEdlbmVyYXRlZCBtZXRob2Qgc291cmNlLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRSZWxhdGlvbnNoaXBNZXRob2Qoe2Fic3RyYWN0ID0gZmFsc2UsIGJvZHksIG5hbWUsIHBhcmFtLCByZXR1cm5zfSkge1xuICBsZXQgZmlsZUNvbnRlbnQgPSBcIiAgLyoqXFxuXCJcblxuICBpZiAoYWJzdHJhY3QpIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICBpZiAocGFyYW0pIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtwYXJhbS50eXBlfX0gJHtwYXJhbS5uYW1lfVxcbmBcbiAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7cmV0dXJuc319XFxuYFxuICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgZmlsZUNvbnRlbnQgKz0gYCAgJHtuYW1lfSgke3BhcmFtID8gcGFyYW0ubmFtZSA6IFwiXCJ9KSB7ICR7Ym9keX0gfVxcbmBcblxuICByZXR1cm4gZmlsZUNvbnRlbnRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZU1vZGVsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmluaXRpYWxpemVNb2RlbHMoKVxuXG4gICAgY29uc3QgZW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKClcblxuICAgIGNvbnN0IHJvb3REaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgY29uc3QgbW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsc2BcbiAgICBjb25zdCBiYXNlTW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsLWJhc2VzYFxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgYWxsb3dNaXNzaW5nVGFibGVzID0gQm9vbGVhbih0aGlzLnByb2Nlc3NBcmdzPy5pbmNsdWRlcyhcIi0tYWxsb3ctbWlzc2luZy10YWJsZXNcIikpXG4gICAgbGV0IGRldk1vZGUgPSBmYWxzZVxuXG4gICAgaWYgKGJhc2VNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvbW9kZWwtYmFzZXNcIikpIHtcbiAgICAgIGRldk1vZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmaWxlRXhpc3RzKGJhc2VNb2RlbHNEaXIpKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihiYXNlTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG5cbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXMoZmFsc2UpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiR2VuZXJhdGUgYmFzZSBtb2RlbHNcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiBtb2RlbENsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzTmFtZV1cbiAgICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5nZXRUYWJsZUJ5TmFtZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpLCB7dGhyb3dFcnJvcjogIWFsbG93TWlzc2luZ1RhYmxlc30pXG5cbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBpbmcgYmFzZSBtb2RlbCBmb3IgJyR7bW9kZWxDbGFzcy5uYW1lfSc6IHRhYmxlICcke21vZGVsQ2xhc3MudGFibGVOYW1lKCl9JyB3YXMgbm90IGZvdW5kICgtLWFsbG93LW1pc3NpbmctdGFibGVzKS4gS2VlcGluZyBhbnkgZXhpc3RpbmcgYmFzZSBtb2RlbC5gKVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKG1vZGVsQ2xhc3NOYW1lKVxuICAgICAgICBjb25zdCBtb2RlbE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IG1vZGVsQmFzZUZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gYCR7YmFzZU1vZGVsc0Rpcn0vJHttb2RlbEJhc2VGaWxlTmFtZX1gXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvbW9kZWwtYmFzZXMvJHttb2RlbEJhc2VGaWxlTmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoID0gYCR7bW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgbGV0IHNvdXJjZU1vZGVsRmlsZVBhdGhcblxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZUNvbnRlbnQgPSBnZW5lcmF0ZWRGaWxlQmFubmVyKEJBU0VfTU9ERUxTX1JFR0VORVJBVEVfQ09NTUFORClcbiAgICAgICAgbGV0IHZlbG9jaW91c1BhdGhcblxuICAgICAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcIi4uLy4uLy4uLy4uL3NyY1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVsb2Npb3VzUGF0aCA9IFwidmVsb2Npb3VzL2J1aWxkL3NyY1wiXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5zID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1ucygpXG4gICAgICAgIGNvbnN0IHdyaXRlQXR0cmlidXRlVHlwZU5hbWUgPSBgJHttb2RlbE5hbWVDYW1lbGl6ZWR9V3JpdGVBdHRyaWJ1dGVzYFxuICAgICAgICBjb25zdCBiZWxvbmdzVG9Xcml0ZUF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLmJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbHNEaXJ9KVxuICAgICAgICBjb25zdCBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXMgPSB0aGlzLm5lc3RlZFdyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzfSlcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IERhdGFiYXNlUmVjb3JkIGZyb20gXCIke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXFxuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgJHttb2RlbE5hbWVDYW1lbGl6ZWR9IHJlY29yZHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHt3cml0ZUF0dHJpYnV0ZVR5cGVOYW1lfVxcbmBcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGRlYnVycmVkQ29sdW1uTmFtZSA9IGRlYnVyckNvbHVtbk5hbWUoY29sdW1uLmdldE5hbWUoKSlcbiAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShkZWJ1cnJlZENvbHVtbk5hbWUsIHRydWUpXG4gICAgICAgICAgY29uc3Qgc2V0dGVySnNkb2NUeXBlID0gdGhpcy5qc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcylcblxuICAgICAgICAgIGlmIChzZXR0ZXJKc2RvY1R5cGUpIHtcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7c2V0dGVySnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19IFske2NhbWVsaXplZENvbHVtbk5hbWV9XSAtIFZhbHVlIGZvciB0aGUgJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfSBhdHRyaWJ1dGUuXFxuYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlIG9mIGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlcykge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlUeXBlfX0gWyR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlOYW1lfV0gLSBSZWxhdGVkICR7YmVsb25nc1RvV3JpdGVBdHRyaWJ1dGUucmVsYXRpb25zaGlwTmFtZX0gcmVjb3JkLlxcbmBcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZFdyaXRlQXR0cmlidXRlIG9mIG5lc3RlZFdyaXRlQXR0cmlidXRlcykge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7bmVzdGVkV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlUeXBlfX0gWyR7bmVzdGVkV3JpdGVBdHRyaWJ1dGUucHJvcGVydHlOYW1lfV0gLSBOZXN0ZWQgJHtuZXN0ZWRXcml0ZUF0dHJpYnV0ZS5yZWxhdGlvbnNoaXBOYW1lfSBhdHRyaWJ1dGVzLlxcbmBcbiAgICAgICAgfVxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblxcblwiXG5cbiAgICAgICAgY29uc3QgaGFzTWFueVJlbGF0aW9uRmlsZVBhdGggPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5zdGFuY2UtcmVsYXRpb25zaGlwcy9oYXMtbWFueS5qc2BcblxuICAgICAgICBmaWxlQ29udGVudCArPSBgLyoqIEBhdWdtZW50cyB7RGF0YWJhc2VSZWNvcmQ8JHt3cml0ZUF0dHJpYnV0ZVR5cGVOYW1lfT59ICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgY2xhc3MgJHttb2RlbE5hbWVDYW1lbGl6ZWR9QmFzZSBleHRlbmRzIERhdGFiYXNlUmVjb3JkIHtcXG5gXG5cbiAgICAgIC8vIC0tLSBnZXRNb2RlbENsYXNzKCkgb3ZlcnJpZGUgKGZpeGVzIHBvbHltb3JwaGljIHR5cGluZyBpbiBKUy9KU0RvYykgLS0tXG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgLy8gTW9kZWwgZmlsZSBleGlzdHMgKGUuZy4gc3JjL21vZGVscy90aWNrZXQuanMpIOKGkiByZXR1cm4gdHlwZW9mIFRpY2tldFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8vIEB0cy1pZ25vcmUgLSBvdmVycmlkZSBuYXJyb3dzIHJldHVybiB0eXBlIGZvciBiZXR0ZXIgSW50ZWxsaVNlbnNlIGluIGdlbmVyYXRlZCBtb2RlbCBiYXNlc1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGdldE1vZGVsQ2xhc3MoKSB7IHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9ICovICh0aGlzLmNvbnN0cnVjdG9yKSB9XFxuXFxuYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gbW9kZWwgZmlsZSB5ZXQg4oaSIGZhbGwgYmFjayB0byB0eXBlb2YgVGlja2V0QmFzZVxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3R5cGVvZiAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlfVxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvLyBAdHMtaWdub3JlIC0gb3ZlcnJpZGUgbmFycm93cyByZXR1cm4gdHlwZSBmb3IgYmV0dGVyIEludGVsbGlTZW5zZSBpbiBnZW5lcmF0ZWQgbW9kZWwgYmFzZXNcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBnZXRNb2RlbENsYXNzKCkgeyByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgJHttb2RlbE5hbWVDYW1lbGl6ZWR9QmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpIH1cXG5cXG5gXG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2RzQ291bnQgPSAwXG5cbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZGVidXJyZWRDb2x1bW5OYW1lID0gZGVidXJyQ29sdW1uTmFtZShjb2x1bW4uZ2V0TmFtZSgpKVxuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShkZWJ1cnJlZENvbHVtbk5hbWUsIHRydWUpXG4gICAgICAgIGNvbnN0IGNhbWVsaXplZENvbHVtbk5hbWVCaWdGaXJzdCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZGVidXJyZWRDb2x1bW5OYW1lKVxuICAgICAgICBjb25zdCBqc2RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZyb21Db2x1bW4oY29sdW1uLCBtb2RlbENsYXNzKVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzZG9jVHlwZSkge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske2pzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSB7IHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIpIH1cXG5cXG5gXG5cbiAgICAgICAgY29uc3Qgc2V0dGVySnNkb2NUeXBlID0gdGhpcy5qc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcylcblxuICAgICAgICBpZiAoc2V0dGVySnNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlckpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0Q29sdW1uQXR0cmlidXRlKFwiJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfVwiLCBuZXdWYWx1ZSkgfVxcblxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtib29sZWFufVxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBoYXMke2NhbWVsaXplZENvbHVtbk5hbWVCaWdGaXJzdH0oKSB7IHJldHVybiB0aGlzLl9oYXNBdHRyaWJ1dGUodGhpcy4ke2NhbWVsaXplZENvbHVtbk5hbWV9KCkpIH1cXG5gXG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbENsYXNzLCBcIl90cmFuc2xhdGlvbnNcIikgJiYgbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zICYmIE9iamVjdC5rZXlzKG1vZGVsQ2xhc3MuX3RyYW5zbGF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBUcmFuc2xhdGlvbkNsYXNzID0gbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25Db2x1bW5zID0gVHJhbnNsYXRpb25DbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgbmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUobmFtZSlcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0cmFuc2xhdGlvbkNvbHVtbnMuZmluZCgodHJhbnNsYXRpb25Db2x1bW4pID0+IHRyYW5zbGF0aW9uQ29sdW1uLmdldE5hbWUoKSA9PT0gbmFtZVVuZGVyc2NvcmUpXG4gICAgICAgICAgbGV0IHRyYW5zbGF0aW9uSnNkb2NUeXBlXG5cbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbkpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIFRyYW5zbGF0aW9uQ2xhc3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyYW5zbGF0aW9uSnNkb2NUeXBlICYmIGNvbHVtbikge1xuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke25hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpKSA/PyBudWxsIH1cXG5gXG4gICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgIGNvbnN0IGhhc05hbWUgPSBgaGFzJHtpbmZsZWN0aW9uLmNhbWVsaXplKG5hbWUpfWBcbiAgICAgICAgICBjb25zdCBzZXR0ZXJOYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShuYW1lKX1gXG4gICAgICAgICAgY29uc3Qgc2V0dGVyUGFyYW1UeXBlID0gdHJhbnNsYXRpb25Kc2RvY1R5cGUgfHwgXCI/XCJcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQGFic3RyYWN0XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtib29sZWFufVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2hhc05hbWV9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIke2hhc05hbWV9IG5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtzZXR0ZXJQYXJhbVR5cGV9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtzZXR0ZXJOYW1lfShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0VHJhbnNsYXRlZEF0dHJpYnV0ZShcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpLCBuZXdWYWx1ZSkgfVxcbmBcbiAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbGVNZXRob2ROYW1lID0gYCR7bmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUobG9jYWxlKX1gXG5cbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbkpzZG9jVHlwZSAmJiBjb2x1bW4pIHtcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3RyYW5zbGF0aW9uSnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtsb2NhbGVNZXRob2ROYW1lfSgpIHsgcmV0dXJuIHRoaXMuX2dldFRyYW5zbGF0ZWRBdHRyaWJ1dGVXaXRoRmFsbGJhY2soXCIke25hbWV9XCIsIFwiJHtsb2NhbGV9XCIpID8/IG51bGwgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZVNldHRlck5hbWUgPSBgJHtzZXR0ZXJOYW1lfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGUpfWBcblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlclBhcmFtVHlwZX19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3ZvaWR9XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZVNldHRlck5hbWV9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRUcmFuc2xhdGVkQXR0cmlidXRlKFwiJHtuYW1lfVwiLCBcIiR7bG9jYWxlfVwiLCBuZXdWYWx1ZSkgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZUhhc05hbWUgPSBgaGFzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGxvY2FsZU1ldGhvZE5hbWUpfWBcblxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQGFic3RyYWN0XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2Jvb2xlYW59XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZUhhc05hbWV9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIke2xvY2FsZUhhc05hbWV9IG5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzKCkpIHtcbiAgICAgICAgbGV0IGJhc2VGaWxlUGF0aCwgYmFzZUZ1bGxGaWxlUGF0aCwgZmlsZU5hbWUsIGZ1bGxGaWxlUGF0aFxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgICAgIGZpbGVOYW1lID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0nIG9uICcke21vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9JyBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcblxuICAgICAgICAgIGZpbGVOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuICAgICAgICAgIGZ1bGxGaWxlUGF0aCA9IGBzcmMvbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIGJhc2VGaWxlUGF0aCA9IGAuLi9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICBiYXNlRnVsbEZpbGVQYXRoID0gYHNyYy9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJiZWxvbmdzVG9cIiB8fCByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzT25lXCIpIHtcbiAgICAgICAgICBsZXQgbW9kZWxGaWxlUGF0aFxuXG4gICAgICAgICAgaWYgKGZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBgLi4vbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGJhc2VGdWxsRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBtb2RlbEZpbGVQYXRoID0gYmFzZUZpbGVQYXRoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthdHRyaWJ1dGVzXVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KGF0dHJpYnV0ZXMpIHsgdm9pZCBhdHRyaWJ1dGVzOyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0IHwgdW5kZWZpbmVkPn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfU9yTG9hZCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fSAqLyAodGhpcy5yZWxhdGlvbnNoaXBPckxvYWQoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIsIHtwcmVsb2FkVHJhbnNsYXRpb25zOiB0cnVlfSkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9IG5ld01vZGVsXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt2b2lkfVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KG5ld01vZGVsKSB7IHZvaWQgbmV3TW9kZWw7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgICBsZXQgcmVjb3JkSW1wb3J0XG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VGdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhiYXNlRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWNvcmRJbXBvcnQgPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiJHtoYXNNYW55UmVsYXRpb25GaWxlUGF0aH1cIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0LCB0eXBlb2YgaW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1Mb2FkZWQoKSB7IHJldHVybiAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBnZW5lcmF0ZWRSZWxhdGlvbnNoaXBNZXRob2Qoe1xuICAgICAgICAgICAgYWJzdHJhY3Q6IHRydWUsXG4gICAgICAgICAgICBib2R5OiBcInRocm93IG5ldyBFcnJvcihcXFwiTm90IGltcGxlbWVudGVkXFxcIilcIixcbiAgICAgICAgICAgIG5hbWU6IGBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfWAsXG4gICAgICAgICAgICByZXR1cm5zOiBgUHJvbWlzZTxBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD4+YFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gZ2VuZXJhdGVkUmVsYXRpb25zaGlwTWV0aG9kKHtcbiAgICAgICAgICAgIGJvZHk6IGByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPEFycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pj59ICovICh0aGlzLnJlbGF0aW9uc2hpcE9yTG9hZChcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikpYCxcbiAgICAgICAgICAgIG5hbWU6IGAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9T3JMb2FkYCxcbiAgICAgICAgICAgIHJldHVybnM6IGBQcm9taXNlPEFycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pj5gXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gbmV3TW9kZWxzXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0obmV3TW9kZWxzKSB7IHZvaWQgbmV3TW9kZWxzOyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJ9XFxuXCJcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUobW9kZWxQYXRoLCBmaWxlQ29udGVudClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKGVuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgdHlwZSBmcm9tIGNvbHVtbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBvd25pbmcgdGhlIGNvbHVtbiAoZm9yIGRlY2xhcmVkIGF0dHJpYnV0ZSBjYXN0cykuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGpzIGRvYyB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCB0eXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbi5nZXROYW1lKCkpXG4gICAgY29uc3QganNEb2NUeXBlID0gdHlwZSA/IGpzRG9jVHlwZUJ5Q29sdW1uVHlwZVt0eXBlXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFqc0RvY1R5cGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gY29sdW1uIHR5cGU6ICR7dHlwZX1gKVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHNldHRlciB0eXBlIGZyb20gY29sdW1uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIG93bmluZyB0aGUgY29sdW1uIChmb3IgZGVjbGFyZWQgYXR0cmlidXRlIGNhc3RzKS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUganMgZG9jIHNldHRlciB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NTZXR0ZXJUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCB0eXBlID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5UeXBlQnlOYW1lKGNvbHVtbi5nZXROYW1lKCkpXG5cbiAgICBpZiAodHlwZSAmJiBzZXR0ZXJTdHJpbmdJbnB1dENvbHVtblR5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZSB8IHN0cmluZ1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBiZWxvbmdzIHRvIHdyaXRlIGF0dHJpYnV0ZXMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbHNEaXIgLSBTb3VyY2UgbW9kZWxzIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e3Byb3BlcnR5TmFtZTogc3RyaW5nLCBwcm9wZXJ0eVR5cGU6IHN0cmluZywgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nfT4+fSAtIEJlbG9uZ3MtdG8gd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIGFzeW5jIGJlbG9uZ3NUb1dyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbHNEaXJ9KSB7XG4gICAgY29uc3Qgd3JpdGVBdHRyaWJ1dGVzID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwcygpKSB7XG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcbiAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkgY29udGludWVcblxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfScgb24gJyR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbEZpbGVOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldE1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkpKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxQYXRoID0gYCR7bW9kZWxzRGlyfS8ke3RhcmdldE1vZGVsRmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW1wb3J0UGF0aCA9IGF3YWl0IGZpbGVFeGlzdHModGFyZ2V0TW9kZWxQYXRoKSA/IGAuLi9tb2RlbHMvJHt0YXJnZXRNb2RlbEZpbGVOYW1lfS5qc2AgOiBgLi8ke3RhcmdldE1vZGVsRmlsZU5hbWV9LmpzYFxuXG4gICAgICB3cml0ZUF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5TmFtZTogcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSxcbiAgICAgICAgcHJvcGVydHlUeXBlOiBgaW1wb3J0KFwiJHt0YXJnZXRJbXBvcnRQYXRofVwiKS5kZWZhdWx0YCxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogcmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gd3JpdGVBdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXN0ZWQgd3JpdGUgYXR0cmlidXRlcyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7cHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VHlwZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlQXR0cmlidXRlc0Zvck1vZGVsKHttb2RlbENsYXNzfSkge1xuICAgIGNvbnN0IGFjY2VwdGVkTmVzdGVkQXR0cmlidXRlcyA9IG1vZGVsQ2xhc3MuX2FjY2VwdGVkTmVzdGVkQXR0cmlidXRlcyB8fCB7fVxuICAgIGNvbnN0IG5lc3RlZFdyaXRlQXR0cmlidXRlcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoYWNjZXB0ZWROZXN0ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBvbiAnJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG5cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsRmlsZU5hbWUgPSBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGFyZ2V0TW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSkpXG4gICAgICBjb25zdCB0YXJnZXRXcml0ZVR5cGVOYW1lID0gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZSh0YXJnZXRNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSl9V3JpdGVBdHRyaWJ1dGVzYFxuICAgICAgY29uc3QgbmVzdGVkVHlwZSA9IGBpbXBvcnQoXCIuLyR7dGFyZ2V0TW9kZWxGaWxlTmFtZX0uanNcIikuJHt0YXJnZXRXcml0ZVR5cGVOYW1lfSR7YWNjZXB0ZWROZXN0ZWRBdHRyaWJ1dGVzW3JlbGF0aW9uc2hpcE5hbWVdPy5hbGxvd0Rlc3Ryb3kgPyBcIiAmIHtfZGVzdHJveT86IGJvb2xlYW59XCIgOiBcIlwifWBcblxuICAgICAgbmVzdGVkV3JpdGVBdHRyaWJ1dGVzLnB1c2goe1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IGAke3JlbGF0aW9uc2hpcE5hbWV9QXR0cmlidXRlc2AsXG4gICAgICAgIHByb3BlcnR5VHlwZTogcmVsYXRpb25zaGlwVHlwZSA9PSBcImhhc01hbnlcIiA/IGBBcnJheTwke25lc3RlZFR5cGV9PmAgOiBuZXN0ZWRUeXBlLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXNcbiAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Built-in job that prunes terminal `background_jobs` rows past their retention
3
+ * window so the table does not grow unbounded. The main process registers this
4
+ * on the normal background-jobs scheduler when `backgroundJobs.retention` is
5
+ * enabled, so it runs as an ordinary scheduled/queued job — visible in the job
6
+ * tables and dispatched to a worker — rather than a hidden in-process timer.
7
+ * @augments {VelociousJob<[]>}
8
+ */
9
+ export default class PruneTerminalBackgroundJobsJob extends VelociousJob<[]> {
10
+ /**
11
+ * Builds the scheduler configuration for this job from a resolved retention
12
+ * config, or returns `null` when retention is fully disabled (nothing to
13
+ * prune, so nothing to schedule). `maxConcurrency: 1` keeps runs from
14
+ * overlapping, and `deduplicateWhileQueued` stops the interval scheduler from
15
+ * piling up redundant queued rows when a prune is slow or no worker is free.
16
+ * @param {import("../configuration-types.js").ResolvedBackgroundJobsRetentionConfiguration} retention - Resolved retention config.
17
+ * @returns {import("../configuration-types.js").ScheduledBackgroundJobConfiguration | null} - Scheduler config for the prune job, or null when retention is disabled.
18
+ */
19
+ static scheduleConfiguration(retention: import("../configuration-types.js").ResolvedBackgroundJobsRetentionConfiguration): import("../configuration-types.js").ScheduledBackgroundJobConfiguration | null;
20
+ constructor();
21
+ }
22
+ import VelociousJob from "../background-jobs/job.js";
23
+ //# sourceMappingURL=prune-terminal-background-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune-terminal-background-jobs.d.ts","sourceRoot":"","sources":["../../../src/jobs/prune-terminal-background-jobs.js"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH;IAaE;;;;;;;;OAQG;IACH,wCAHW,OAAO,2BAA2B,EAAE,4CAA4C,GAC9E,OAAO,2BAA2B,EAAE,mCAAmC,GAAG,IAAI,CAe1F;;CAiBF;yBA9DwB,2BAA2B"}
@@ -0,0 +1,61 @@
1
+ // @ts-check
2
+ import BackgroundJobsStore from "../background-jobs/store.js";
3
+ import Configuration from "../configuration.js";
4
+ import VelociousJob from "../background-jobs/job.js";
5
+ /**
6
+ * Built-in job that prunes terminal `background_jobs` rows past their retention
7
+ * window so the table does not grow unbounded. The main process registers this
8
+ * on the normal background-jobs scheduler when `backgroundJobs.retention` is
9
+ * enabled, so it runs as an ordinary scheduled/queued job — visible in the job
10
+ * tables and dispatched to a worker — rather than a hidden in-process timer.
11
+ * @augments {VelociousJob<[]>}
12
+ */
13
+ export default class PruneTerminalBackgroundJobsJob extends VelociousJob {
14
+ /**
15
+ * Reserved job name that an application job cannot shadow. The registry loads
16
+ * app `src/jobs` first and skips duplicate built-in names, so if this used the
17
+ * default class-name identity an app class named `PruneTerminalBackgroundJobsJob`
18
+ * would be dispatched instead. A `:`-namespaced name can never collide with a
19
+ * default (class-name) identity, since class names cannot contain `:`.
20
+ * @returns {string} - Reserved job name.
21
+ */
22
+ static jobName() {
23
+ return "velocious:prune-terminal-background-jobs";
24
+ }
25
+ /**
26
+ * Builds the scheduler configuration for this job from a resolved retention
27
+ * config, or returns `null` when retention is fully disabled (nothing to
28
+ * prune, so nothing to schedule). `maxConcurrency: 1` keeps runs from
29
+ * overlapping, and `deduplicateWhileQueued` stops the interval scheduler from
30
+ * piling up redundant queued rows when a prune is slow or no worker is free.
31
+ * @param {import("../configuration-types.js").ResolvedBackgroundJobsRetentionConfiguration} retention - Resolved retention config.
32
+ * @returns {import("../configuration-types.js").ScheduledBackgroundJobConfiguration | null} - Scheduler config for the prune job, or null when retention is disabled.
33
+ */
34
+ static scheduleConfiguration(retention) {
35
+ const prunesCompleted = typeof retention.completedTtlMs === "number" && retention.completedTtlMs > 0;
36
+ const prunesFailed = typeof retention.failedTtlMs === "number" && retention.failedTtlMs > 0;
37
+ if (!prunesCompleted && !prunesFailed) {
38
+ return null;
39
+ }
40
+ return {
41
+ class: this,
42
+ every: retention.sweepIntervalMs,
43
+ options: { concurrencyKey: "velocious-prune-terminal-background-jobs", maxConcurrency: 1, deduplicateWhileQueued: true }
44
+ };
45
+ }
46
+ /**
47
+ * Prunes terminal job rows past their retention window.
48
+ * @returns {Promise<void>}
49
+ */
50
+ async perform() {
51
+ const configuration = Configuration.current();
52
+ const config = configuration.getBackgroundJobsConfig();
53
+ const store = new BackgroundJobsStore({ configuration, databaseIdentifier: config.databaseIdentifier });
54
+ await store.pruneTerminalJobs({
55
+ completedTtlMs: config.retention.completedTtlMs,
56
+ failedTtlMs: config.retention.failedTtlMs,
57
+ batchSize: config.retention.batchSize
58
+ });
59
+ }
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtdGVybWluYWwtYmFja2dyb3VuZC1qb2JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2pvYnMvcHJ1bmUtdGVybWluYWwtYmFja2dyb3VuZC1qb2JzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLG1CQUFtQixNQUFNLDZCQUE2QixDQUFBO0FBQzdELE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBRXBEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDhCQUErQixTQUFRLFlBQVk7SUFDdEU7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTywwQ0FBMEMsQ0FBQTtJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUztRQUNwQyxNQUFNLGVBQWUsR0FBRyxPQUFPLFNBQVMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFBO1FBQ3BHLE1BQU0sWUFBWSxHQUFHLE9BQU8sU0FBUyxDQUFDLFdBQVcsS0FBSyxRQUFRLElBQUksU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUE7UUFFM0YsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSTtZQUNYLEtBQUssRUFBRSxTQUFTLENBQUMsZUFBZTtZQUNoQyxPQUFPLEVBQUUsRUFBQyxjQUFjLEVBQUUsMENBQTBDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUM7U0FDdkgsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFtQixDQUFDLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBQyxDQUFDLENBQUE7UUFFckcsTUFBTSxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDNUIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYztZQUMvQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXO1lBQ3pDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVM7U0FDdEMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1N0b3JlIGZyb20gXCIuLi9iYWNrZ3JvdW5kLWpvYnMvc3RvcmUuanNcIlxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IFZlbG9jaW91c0pvYiBmcm9tIFwiLi4vYmFja2dyb3VuZC1qb2JzL2pvYi5qc1wiXG5cbi8qKlxuICogQnVpbHQtaW4gam9iIHRoYXQgcHJ1bmVzIHRlcm1pbmFsIGBiYWNrZ3JvdW5kX2pvYnNgIHJvd3MgcGFzdCB0aGVpciByZXRlbnRpb25cbiAqIHdpbmRvdyBzbyB0aGUgdGFibGUgZG9lcyBub3QgZ3JvdyB1bmJvdW5kZWQuIFRoZSBtYWluIHByb2Nlc3MgcmVnaXN0ZXJzIHRoaXNcbiAqIG9uIHRoZSBub3JtYWwgYmFja2dyb3VuZC1qb2JzIHNjaGVkdWxlciB3aGVuIGBiYWNrZ3JvdW5kSm9icy5yZXRlbnRpb25gIGlzXG4gKiBlbmFibGVkLCBzbyBpdCBydW5zIGFzIGFuIG9yZGluYXJ5IHNjaGVkdWxlZC9xdWV1ZWQgam9iIOKAlCB2aXNpYmxlIGluIHRoZSBqb2JcbiAqIHRhYmxlcyBhbmQgZGlzcGF0Y2hlZCB0byBhIHdvcmtlciDigJQgcmF0aGVyIHRoYW4gYSBoaWRkZW4gaW4tcHJvY2VzcyB0aW1lci5cbiAqIEBhdWdtZW50cyB7VmVsb2Npb3VzSm9iPFtdPn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJ1bmVUZXJtaW5hbEJhY2tncm91bmRKb2JzSm9iIGV4dGVuZHMgVmVsb2Npb3VzSm9iIHtcbiAgLyoqXG4gICAqIFJlc2VydmVkIGpvYiBuYW1lIHRoYXQgYW4gYXBwbGljYXRpb24gam9iIGNhbm5vdCBzaGFkb3cuIFRoZSByZWdpc3RyeSBsb2Fkc1xuICAgKiBhcHAgYHNyYy9qb2JzYCBmaXJzdCBhbmQgc2tpcHMgZHVwbGljYXRlIGJ1aWx0LWluIG5hbWVzLCBzbyBpZiB0aGlzIHVzZWQgdGhlXG4gICAqIGRlZmF1bHQgY2xhc3MtbmFtZSBpZGVudGl0eSBhbiBhcHAgY2xhc3MgbmFtZWQgYFBydW5lVGVybWluYWxCYWNrZ3JvdW5kSm9ic0pvYmBcbiAgICogd291bGQgYmUgZGlzcGF0Y2hlZCBpbnN0ZWFkLiBBIGA6YC1uYW1lc3BhY2VkIG5hbWUgY2FuIG5ldmVyIGNvbGxpZGUgd2l0aCBhXG4gICAqIGRlZmF1bHQgKGNsYXNzLW5hbWUpIGlkZW50aXR5LCBzaW5jZSBjbGFzcyBuYW1lcyBjYW5ub3QgY29udGFpbiBgOmAuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVzZXJ2ZWQgam9iIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgam9iTmFtZSgpIHtcbiAgICByZXR1cm4gXCJ2ZWxvY2lvdXM6cHJ1bmUtdGVybWluYWwtYmFja2dyb3VuZC1qb2JzXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHNjaGVkdWxlciBjb25maWd1cmF0aW9uIGZvciB0aGlzIGpvYiBmcm9tIGEgcmVzb2x2ZWQgcmV0ZW50aW9uXG4gICAqIGNvbmZpZywgb3IgcmV0dXJucyBgbnVsbGAgd2hlbiByZXRlbnRpb24gaXMgZnVsbHkgZGlzYWJsZWQgKG5vdGhpbmcgdG9cbiAgICogcHJ1bmUsIHNvIG5vdGhpbmcgdG8gc2NoZWR1bGUpLiBgbWF4Q29uY3VycmVuY3k6IDFgIGtlZXBzIHJ1bnMgZnJvbVxuICAgKiBvdmVybGFwcGluZywgYW5kIGBkZWR1cGxpY2F0ZVdoaWxlUXVldWVkYCBzdG9wcyB0aGUgaW50ZXJ2YWwgc2NoZWR1bGVyIGZyb21cbiAgICogcGlsaW5nIHVwIHJlZHVuZGFudCBxdWV1ZWQgcm93cyB3aGVuIGEgcHJ1bmUgaXMgc2xvdyBvciBubyB3b3JrZXIgaXMgZnJlZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJlc29sdmVkQmFja2dyb3VuZEpvYnNSZXRlbnRpb25Db25maWd1cmF0aW9ufSByZXRlbnRpb24gLSBSZXNvbHZlZCByZXRlbnRpb24gY29uZmlnLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbiB8IG51bGx9IC0gU2NoZWR1bGVyIGNvbmZpZyBmb3IgdGhlIHBydW5lIGpvYiwgb3IgbnVsbCB3aGVuIHJldGVudGlvbiBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHN0YXRpYyBzY2hlZHVsZUNvbmZpZ3VyYXRpb24ocmV0ZW50aW9uKSB7XG4gICAgY29uc3QgcHJ1bmVzQ29tcGxldGVkID0gdHlwZW9mIHJldGVudGlvbi5jb21wbGV0ZWRUdGxNcyA9PT0gXCJudW1iZXJcIiAmJiByZXRlbnRpb24uY29tcGxldGVkVHRsTXMgPiAwXG4gICAgY29uc3QgcHJ1bmVzRmFpbGVkID0gdHlwZW9mIHJldGVudGlvbi5mYWlsZWRUdGxNcyA9PT0gXCJudW1iZXJcIiAmJiByZXRlbnRpb24uZmFpbGVkVHRsTXMgPiAwXG5cbiAgICBpZiAoIXBydW5lc0NvbXBsZXRlZCAmJiAhcHJ1bmVzRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjbGFzczogdGhpcyxcbiAgICAgIGV2ZXJ5OiByZXRlbnRpb24uc3dlZXBJbnRlcnZhbE1zLFxuICAgICAgb3B0aW9uczoge2NvbmN1cnJlbmN5S2V5OiBcInZlbG9jaW91cy1wcnVuZS10ZXJtaW5hbC1iYWNrZ3JvdW5kLWpvYnNcIiwgbWF4Q29uY3VycmVuY3k6IDEsIGRlZHVwbGljYXRlV2hpbGVRdWV1ZWQ6IHRydWV9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBydW5lcyB0ZXJtaW5hbCBqb2Igcm93cyBwYXN0IHRoZWlyIHJldGVudGlvbiB3aW5kb3cuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbi5jdXJyZW50KClcbiAgICBjb25zdCBjb25maWcgPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBCYWNrZ3JvdW5kSm9ic1N0b3JlKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXI6IGNvbmZpZy5kYXRhYmFzZUlkZW50aWZpZXJ9KVxuXG4gICAgYXdhaXQgc3RvcmUucHJ1bmVUZXJtaW5hbEpvYnMoe1xuICAgICAgY29tcGxldGVkVHRsTXM6IGNvbmZpZy5yZXRlbnRpb24uY29tcGxldGVkVHRsTXMsXG4gICAgICBmYWlsZWRUdGxNczogY29uZmlnLnJldGVudGlvbi5mYWlsZWRUdGxNcyxcbiAgICAgIGJhdGNoU2l6ZTogY29uZmlnLnJldGVudGlvbi5iYXRjaFNpemVcbiAgICB9KVxuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/record-changes.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/drop.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/advisory-lock-runner.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/column-types.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/live-query.js","../src/database/migrations-ledger.js","../src/database/migrator.js","../src/database/record-changes.js","../src/database/use-database.js","../src/database/use-live-query.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/auditing.js","../src/database/record/counter-cache-magnitude.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/validation-messages.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/length.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/database/tenants/data-copier.js","../src/database/tenants/schema-cloner.js","../src/database/tenants/tenant-table-plan.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/jobs/prune-terminal-background-jobs.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/packages/velocious-package.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/api-manifest/controller.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/conflict-strategy.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/sync/peer-mutation-bundle.js","../src/sync/query-scope.js","../src/sync/server-change-feed.js","../src/sync/server-sequence-allocator.js","../src/sync/stable-json.js","../src/sync/sync-api-client-types.js","../src/sync/sync-api-client.js","../src/sync/sync-api-controller.js","../src/sync/sync-change-fanout.js","../src/sync/sync-channel-name.js","../src/sync/sync-client-registry.js","../src/sync/sync-client-types.js","../src/sync/sync-client.js","../src/sync/sync-envelope-replay-service.js","../src/sync/sync-model-change-feed-service.js","../src/sync/sync-publish-suppression.js","../src/sync/sync-publisher-types.js","../src/sync/sync-publisher.js","../src/sync/sync-realtime-bridge.js","../src/sync/sync-replay-upsert-applier.js","../src/sync/sync-resource-base.js","../src/sync/sync-scope-attributes.js","../src/sync/sync-scope-store.js","../src/sync/sync-websocket-channel.js","../src/tenants/default-tenant-database-provisioning.js","../src/tenants/tenant-iterator.js","../src/tenants/tenant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.519",
6
+ "version": "1.0.521",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -30,6 +30,18 @@ export default class JsonSocket extends EventEmitter {
30
30
  * Narrows the runtime value to the documented type.
31
31
  * @type {boolean} */
32
32
  this.acceptsInlineJobs = true
33
+ /**
34
+ * Whether this worker advertised heartbeat support in its hello. Only
35
+ * heartbeat-capable workers are subject to the main's stale-liveness
36
+ * eviction; a legacy worker (e.g. mid rolling deploy) is exempt so its
37
+ * active leases are not released while it is still running them.
38
+ * @type {boolean} */
39
+ this.supportsHeartbeat = false
40
+ /**
41
+ * Last time (ms) the main saw any message from this worker socket; used by
42
+ * the main's liveness sweep to drop a wedged/silent worker.
43
+ * @type {number | undefined} */
44
+ this.lastSeenAt = undefined
33
45
  this.buffer = ""
34
46
  this.socket.setEncoding("utf8")
35
47
  this.socket.on("data", (chunk) => this._onData(String(chunk)))