obsidian-dev-utils 88.2.0 → 88.4.0

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 (97) hide show
  1. package/CHANGELOG.md +22 -4
  2. package/dist/lib/cjs/__merged.cjs +27 -1
  3. package/dist/lib/cjs/__merged.d.cts +8 -4
  4. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  5. package/dist/lib/cjs/html-element.cjs +7 -1
  6. package/dist/lib/cjs/html-element.d.cts +12 -0
  7. package/dist/lib/cjs/obsidian/attachment-path.cjs +10 -5
  8. package/dist/lib/cjs/obsidian/attachment-path.d.cts +11 -1
  9. package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
  10. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  11. package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +159 -0
  12. package/dist/lib/cjs/obsidian/components/pointer-position-component.d.cts +29 -0
  13. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +35 -5
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +7 -0
  15. package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
  16. package/dist/lib/cjs/obsidian/css-class.d.cts +4 -0
  17. package/dist/lib/cjs/obsidian/file-system.cjs +20 -1
  18. package/dist/lib/cjs/obsidian/file-system.d.cts +25 -0
  19. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
  20. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
  21. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
  22. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  23. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  24. package/dist/lib/cjs/obsidian/link-update-progress.cjs +124 -0
  25. package/dist/lib/cjs/obsidian/link-update-progress.d.cts +32 -0
  26. package/dist/lib/cjs/obsidian/link.cjs +11 -2
  27. package/dist/lib/cjs/obsidian/link.d.cts +6 -0
  28. package/dist/lib/cjs/obsidian/path-settings.cjs +19 -5
  29. package/dist/lib/cjs/obsidian/path-settings.d.cts +13 -1
  30. package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +175 -0
  31. package/dist/lib/cjs/obsidian/popovers/field-popover.d.cts +75 -0
  32. package/dist/lib/cjs/obsidian/popovers/index.cjs +152 -0
  33. package/dist/lib/cjs/obsidian/popovers/index.d.cts +4 -0
  34. package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +178 -0
  35. package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +67 -0
  36. package/dist/lib/cjs/obsidian/popovers/popover.cjs +221 -0
  37. package/dist/lib/cjs/obsidian/popovers/popover.d.cts +78 -0
  38. package/dist/lib/cjs/obsidian/resource-lock.cjs +6 -1
  39. package/dist/lib/cjs/obsidian/resource-lock.d.cts +15 -0
  40. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  41. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  42. package/dist/lib/cjs/script-utils/version.cjs +11 -2
  43. package/dist/lib/cjs/script-utils/version.d.cts +14 -0
  44. package/dist/lib/esm/__merged.d.mts +8 -4
  45. package/dist/lib/esm/__merged.mjs +28 -2
  46. package/dist/lib/esm/generated-during-build.mjs +2 -2
  47. package/dist/lib/esm/html-element.d.mts +12 -0
  48. package/dist/lib/esm/html-element.mjs +6 -1
  49. package/dist/lib/esm/obsidian/attachment-path.d.mts +11 -1
  50. package/dist/lib/esm/obsidian/attachment-path.mjs +11 -5
  51. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  52. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  53. package/dist/lib/esm/obsidian/components/pointer-position-component.d.mts +29 -0
  54. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +51 -0
  55. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +7 -0
  56. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +35 -5
  57. package/dist/lib/esm/obsidian/css-class.d.mts +4 -0
  58. package/dist/lib/esm/obsidian/css-class.mjs +2 -1
  59. package/dist/lib/esm/obsidian/file-system.d.mts +25 -0
  60. package/dist/lib/esm/obsidian/file-system.mjs +20 -1
  61. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
  62. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
  63. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
  64. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  65. package/dist/lib/esm/obsidian/index.mjs +5 -1
  66. package/dist/lib/esm/obsidian/link-update-progress.d.mts +32 -0
  67. package/dist/lib/esm/obsidian/link-update-progress.mjs +24 -0
  68. package/dist/lib/esm/obsidian/link.d.mts +6 -0
  69. package/dist/lib/esm/obsidian/link.mjs +11 -2
  70. package/dist/lib/esm/obsidian/path-settings.d.mts +13 -1
  71. package/dist/lib/esm/obsidian/path-settings.mjs +18 -4
  72. package/dist/lib/esm/obsidian/popovers/field-popover.d.mts +75 -0
  73. package/dist/lib/esm/obsidian/popovers/field-popover.mjs +70 -0
  74. package/dist/lib/esm/obsidian/popovers/index.d.mts +4 -0
  75. package/dist/lib/esm/obsidian/popovers/index.mjs +32 -0
  76. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +67 -0
  77. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +67 -0
  78. package/dist/lib/esm/obsidian/popovers/popover.d.mts +78 -0
  79. package/dist/lib/esm/obsidian/popovers/popover.mjs +113 -0
  80. package/dist/lib/esm/obsidian/resource-lock.d.mts +15 -0
  81. package/dist/lib/esm/obsidian/resource-lock.mjs +5 -1
  82. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  83. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  84. package/dist/lib/esm/script-utils/version.d.mts +14 -0
  85. package/dist/lib/esm/script-utils/version.mjs +10 -2
  86. package/dist/styles.css +25 -1
  87. package/obsidian/components/pointer-position-component/package.json +6 -0
  88. package/obsidian/link-update-progress/package.json +6 -0
  89. package/obsidian/popovers/field-popover/package.json +6 -0
  90. package/obsidian/popovers/index/package.json +6 -0
  91. package/obsidian/popovers/package.json +6 -0
  92. package/obsidian/popovers/popover/package.json +6 -0
  93. package/obsidian/popovers/popover-anchor/package.json +6 -0
  94. package/package.json +43 -17
  95. package/patches/brace-expansion-callable/package.json +8 -0
  96. package/dist/dev/main.js +0 -37725
  97. package/dist/dev/manifest.json +0 -9
@@ -131,6 +131,7 @@ __export(html_element_exports, {
131
131
  createSpanAsync: () => createSpanAsync,
132
132
  createSvgAsync: () => createSvgAsync,
133
133
  ensureLoaded: () => ensureLoaded,
134
+ getDocumentWindow: () => getDocumentWindow,
134
135
  getZIndex: () => getZIndex,
135
136
  isElementVisibleInOffsetParent: () => isElementVisibleInOffsetParent,
136
137
  isLoaded: () => isLoaded,
@@ -140,6 +141,7 @@ __export(html_element_exports, {
140
141
  });
141
142
  module.exports = __toCommonJS(html_element_exports);
142
143
  var import_disposable = require('./disposable.cjs');
144
+ var import_type_guards = require('./type-guards.cjs');
143
145
  const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
144
146
  async function createDivAsync(o, callback) {
145
147
  const div = createHtmlElement("div", o);
@@ -180,6 +182,9 @@ async function ensureLoaded(el) {
180
182
  }
181
183
  await Promise.all(getLoadableElements(el).map(ensureLoaded));
182
184
  }
185
+ function getDocumentWindow(doc) {
186
+ return (0, import_type_guards.ensureNonNullable)(doc.defaultView, "The document has no window");
187
+ }
183
188
  function getZIndex(el) {
184
189
  let el2 = el;
185
190
  while (el2) {
@@ -370,6 +375,7 @@ function setElementText(el, text) {
370
375
  createSpanAsync,
371
376
  createSvgAsync,
372
377
  ensureLoaded,
378
+ getDocumentWindow,
373
379
  getZIndex,
374
380
  isElementVisibleInOffsetParent,
375
381
  isLoaded,
@@ -377,4 +383,4 @@ function setElementText(el, text) {
377
383
  toPx,
378
384
  waitUntilConnected
379
385
  });
380
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9ic2lkaWFuLXJ1bnRpbWUtYWdub3N0aWMgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIEhUTUwgZWxlbWVudHMuXG4gKlxuICogU2V2ZXJhbCBoZWxwZXJzIGhlcmUgbWlycm9yIGJlaGF2aW9yIHRoYXQgdGhlIE9ic2lkaWFuIHJ1bnRpbWUgaW5qZWN0cyBvbnRvIHRoZSBET00gcHJvdG90eXBlc1xuICogKGBjcmVhdGVFbGAvYGNyZWF0ZURpdmAvYGNyZWF0ZVNwYW5gL2BjcmVhdGVTdmdgL2BjcmVhdGVGcmFnbWVudGAsIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCxcbiAqIGBFbGVtZW50LnByb3RvdHlwZS5zZXRUZXh0YC9gc2V0QXR0cnNgKS4gVG8gc3RheSBpbmRlcGVuZGVudCBvZiB0aGUgT2JzaWRpYW4gcnVudGltZSwgdGhhdCBiZWhhdmlvclxuICogaXMgcmVpbXBsZW1lbnRlZCBoZXJlIGluIHN0YW5kYXJkIERPTSwgcG9ydGVkIGZyb20gT2JzaWRpYW4ncyBvd24gaW1wbGVtZW50YXRpb24gaW5cbiAqIGBvYnNpZGlhbi5hc2FyL2VuaGFuY2UuanNgLiBTZWUgdGhlIGBvYnNpZGlhbi12ZXJzaW9uc2AgcHJvamVjdDsgcmV2YWxpZGF0ZSB0aGUgcG9ydCB3aGVuIE9ic2lkaWFuXG4gKiBjaGFuZ2VzIGBlbmhhbmNlLmpzYCAodGhlcmUgaXMgYSByZW1pbmRlciBpbiBgQ0xBVURFLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbi8qKlxuICogQSBIVE1MIGVsZW1lbnQgdGhhdCBjYW4gYmUgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgY2hlY2tWYWxpZGl0eSgpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICovXG4gIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3I6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIG1lc3NhZ2Ugb2YgdGhlIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXYgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGRpdiBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZGl2LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGl2QXN5bmMoXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxEaXZFbGVtZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4pOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50PiB7XG4gIGNvbnN0IGRpdiA9IGNyZWF0ZUh0bWxFbGVtZW50KCdkaXYnLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihkaXYpO1xuICByZXR1cm4gZGl2O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWxlbWVudCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAdHlwZVBhcmFtIEsgLSBUaGUgdGFnIG5hbWUga2V5IGZyb20gYEhUTUxFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBlbGVtZW50LlxuICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jY3JlYXRlRWx9IChvciBjcmVhdGVTdmcsIGNvcnJlc3BvbmRpbmdseSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbEFzeW5jPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KFxuICB0YWc6IEssXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3QgZWwgPSBjcmVhdGVIdG1sRWxlbWVudCh0YWcsIG8pO1xuICBhd2FpdCBjYWxsYmFjaz8uKGVsKTtcbiAgcmV0dXJuIGVsO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBEb2N1bWVudEZyYWdtZW50IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIERvY3VtZW50RnJhZ21lbnQgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIERvY3VtZW50RnJhZ21lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudEFzeW5jKGNhbGxiYWNrPzogKGVsOiBEb2N1bWVudEZyYWdtZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTxEb2N1bWVudEZyYWdtZW50PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3ByZWZlci1jcmVhdGUtZWwgLS0gQWdub3N0aWMgbW9kdWxlLlxuICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihmcmFnbWVudCk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3BhbiBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgc3BhbiBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc3Bhbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNwYW5Bc3luYyhcbiAgbz86IERvbUVsZW1lbnRJbmZvIHwgc3RyaW5nLFxuICBjYWxsYmFjaz86IChlbDogSFRNTFNwYW5FbGVtZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4pOiBQcm9taXNlPEhUTUxTcGFuRWxlbWVudD4ge1xuICBjb25zdCBzcGFuID0gY3JlYXRlSHRtbEVsZW1lbnQoJ3NwYW4nLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihzcGFuKTtcbiAgcmV0dXJuIHNwYW47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN2ZyBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAdHlwZVBhcmFtIEsgLSBUaGUgdGFnIG5hbWUga2V5IGZyb20gYFNWR0VsZW1lbnRUYWdOYW1lTWFwYC5cbiAqIEBwYXJhbSB0YWcgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIHN2ZyB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbyAtIFRoZSBzdmcgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBzdmcgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHN2Zy5cbiAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI2NyZWF0ZVN2Z30gKG9yIGNyZWF0ZUVsLCBjb3JyZXNwb25kaW5nbHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3ZnQXN5bmM8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPihcbiAgdGFnOiBLLFxuICBvPzogc3RyaW5nIHwgU3ZnRWxlbWVudEluZm8sXG4gIGNhbGxiYWNrPzogKGVsOiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxTVkdFbGVtZW50VGFnTmFtZU1hcFtLXT4ge1xuICBjb25zdCBzdmcgPSBjcmVhdGVTdmdFbGVtZW50KHRhZywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3ZnKTtcbiAgcmV0dXJuIHN2Zztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGVuc3VyZSBpcyBsb2FkZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaXMgbG9hZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTG9hZGVkKGVsOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpc0xvYWRlZChlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbCk7XG4gIGlmIChcbiAgICBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MQm9keUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEltYWdlRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MSUZyYW1lRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MRW1iZWRFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxMaW5rRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MT2JqZWN0RWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MU3R5bGVFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxUcmFja0VsZW1lbnQpXG4gICkge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVzb2x2ZSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlc29sdmUpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKGdldExvYWRhYmxlRWxlbWVudHMoZWwpLm1hcChlbnN1cmVMb2FkZWQpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB6LWluZGV4IG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGdldCB0aGUgei1pbmRleCBvZi5cbiAqIEByZXR1cm5zIFRoZSB6LWluZGV4IG9mIHRoZSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0WkluZGV4KGVsOiBFbGVtZW50KTogbnVtYmVyIHtcbiAgbGV0IGVsMjogRWxlbWVudCB8IG51bGwgPSBlbDtcblxuICB3aGlsZSAoZWwyKSB7XG4gICAgY29uc3QgekluZGV4U3RyID0gZ2V0Q29tcHV0ZWRTdHlsZShlbDIpLnpJbmRleDtcbiAgICBjb25zdCB6SW5kZXggPSBOdW1iZXIucGFyc2VJbnQoekluZGV4U3RyLCAxMCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oekluZGV4KSkge1xuICAgICAgcmV0dXJuIHpJbmRleDtcbiAgICB9XG4gICAgZWwyID0gZWwyLnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgb2Zmc2V0IHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSBvZmZzZXQgcGFyZW50LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGVJbk9mZnNldFBhcmVudChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50RWwgPSBlbC5vZmZzZXRQYXJlbnQ7XG4gIGlmICghcGFyZW50RWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgcGFyZW50RWxSZWN0ID0gcGFyZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgcmV0dXJuIChcbiAgICBwYXJlbnRFbFJlY3QudG9wIDw9IGVsUmVjdC50b3BcbiAgICAmJiBlbFJlY3QuYm90dG9tIDw9IHBhcmVudEVsUmVjdC5ib3R0b21cbiAgICAmJiBwYXJlbnRFbFJlY3QubGVmdCA8PSBlbFJlY3QubGVmdFxuICAgICYmIGVsUmVjdC5yaWdodCA8PSBwYXJlbnRFbFJlY3QucmlnaHRcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIGxvYWRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRlZChlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB3aW4gPSBnZXROb2RlV2luZG93KGVsKTtcblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEJvZHlFbGVtZW50KSkge1xuICAgIGNvbnN0IHJlYWR5U3RhdGUgPSBlbC5vd25lckRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScgfHwgcmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJztcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MSW1hZ2VFbGVtZW50KSkge1xuICAgIHJldHVybiBlbC5jb21wbGV0ZSAmJiBlbC5uYXR1cmFsV2lkdGggPiAwO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxJRnJhbWVFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsLmNvbnRlbnREb2N1bWVudDtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MRW1iZWRFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsLmdldFNWR0RvY3VtZW50KCk7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTExpbmtFbGVtZW50KSkge1xuICAgIHJldHVybiBlbC5yZWwgPT09ICdzdHlsZXNoZWV0JyA/IGVsLnNoZWV0ICE9PSBudWxsIDogdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MT2JqZWN0RWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5jb250ZW50RG9jdW1lbnQgfHwgISFlbC5nZXRTVkdEb2N1bWVudCgpO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxTY3JpcHRFbGVtZW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxTdHlsZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWwuc2hlZXQ7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTFRyYWNrRWxlbWVudCkpIHtcbiAgICBjb25zdCBSRUFEWV9TVEFURV9MT0FERUQgPSAyO1xuICAgIHJldHVybiBlbC5yZWFkeVN0YXRlID09PSBSRUFEWV9TVEFURV9MT0FERUQ7XG4gIH1cblxuICByZXR1cm4gZ2V0TG9hZGFibGVFbGVtZW50cyhlbCkuZXZlcnkoaXNMb2FkZWQpO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGFuY2VzdG9yIG5vZGVzIG9mIHRoZSBnaXZlbiBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkIHRoZSBldmVudCBsaXN0ZW5lciB0by5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25BbmNlc3RvclNjcm9sbE9yUmVzaXplKG5vZGU6IE5vZGUsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3cobm9kZSk7XG4gIGNvbnN0IGFuY2VzdG9yczogRXZlbnRUYXJnZXRbXSA9IFtdO1xuICBhbmNlc3RvcnMucHVzaChub2RlLm93bmVyRG9jdW1lbnQgPz8gd2luLmRvY3VtZW50KTtcbiAgYW5jZXN0b3JzLnB1c2god2luKTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gbm9kZTtcblxuICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICBhbmNlc3RvcnMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICB9XG5cbiAgbGV0IGlzRXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGNhbGxiYWNrU21vb3RoLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBhbmNlc3RvciBvZiBhbmNlc3RvcnMpIHtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNhbGxiYWNrU21vb3RoKCk6IHZvaWQge1xuICAgIGlmIChpc0V2ZW50VHJpZ2dlcmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXNFdmVudFRyaWdnZXJlZCA9IHRydWU7XG5cbiAgICB3aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0V2ZW50VHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZyB3aXRoICdweCcgYXBwZW5kZWQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIG51bWJlciBhcyBhIHN0cmluZyB3aXRoICdweCcgYXBwZW5kZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1B4KHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U3RyaW5nKHZhbHVlKX1weGA7XG59XG5cbi8qKlxuICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gKlxuICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRVbnRpbENvbm5lY3RlZChlbDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4ncyBgZWwub25Ob2RlSW5zZXJ0ZWRgIHVzZXMgYSBgbm9kZS1pbnNlcnRlZGAgQ1NTIGtleWZyYW1lIGZyb20gT2JzaWRpYW4ncyBzdHlsZXNoZWV0LlxuICAgIC8vIFRoZSBhZ25vc3RpYyBlcXVpdmFsZW50IGluc3RlYWQgb2JzZXJ2ZXMgdGhlIGVsZW1lbnQncyBkb2N1bWVudCBmb3IgaXQgYmVjb21pbmcgY29ubmVjdGVkLlxuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBlbC5vd25lckRvY3VtZW50O1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IChnZXROb2RlV2luZG93KGVsKSkuTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShvd25lckRvY3VtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXBwbGllcyB0aGUgZWxlbWVudC10eXBlLWFnbm9zdGljIHN1YnNldCBvZiB7QGxpbmsgRG9tRWxlbWVudEluZm99IHRoYXQgT2JzaWRpYW4ncyBgY3JlYXRlRWxgXG4gKiBzdXBwb3J0cyBcdTIwMTQgYGNsc2AsIGB0ZXh0YCwgYGF0dHJgLCBgdGl0bGVgLCBhbmQgYHBhcmVudGAvYHByZXBlbmRgLiBUaGUgZWxlbWVudC10eXBlLXNwZWNpZmljXG4gKiBmaWVsZHMgKGB2YWx1ZWAsIGB0eXBlYCwgYHBsYWNlaG9sZGVyYCwgYGhyZWZgKSBhbmQgdGhlIGBvbipgIGV2ZW50LWhhbmRsZXIga2V5cyBhcmUgaW50ZW50aW9uYWxseVxuICogTk9UIHBvcnRlZCAobm8gaW50ZXJuYWwgY2FsbGVyIG5lZWRzIHRoZW0pOyBleHRlbmQgdGhpcyBpZiBhIGNvbnN1bWVyIGRvZXMgXHUyMDE0IGFuZCByZXZhbGlkYXRlIGFnYWluc3RcbiAqIGBlbmhhbmNlLmpzYCAoc2VlIHRoZSBgQGZpbGVgIG5vdGUgYW5kIGBDTEFVREUubWRgKS5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBhcHBseSB0aGUgaW5mbyB0by5cbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mbyAob3IgYSBiYXJlIGNsYXNzIHN0cmluZykuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RG9tRWxlbWVudEluZm8oZWw6IEhUTUxFbGVtZW50LCBvOiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjb25zdCBpbmZvOiBEb21FbGVtZW50SW5mbyA9IHR5cGVvZiBvID09PSAnc3RyaW5nJyA/IHsgY2xzOiBvIH0gOiBvID8/IHt9O1xuXG4gIGlmIChpbmZvLmNscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZWwuY2xhc3NOYW1lID0gQXJyYXkuaXNBcnJheShpbmZvLmNscykgPyBpbmZvLmNscy5qb2luKCcgJykgOiBpbmZvLmNscztcbiAgfVxuICBpZiAoaW5mby50ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZXRFbGVtZW50VGV4dChlbCwgaW5mby50ZXh0KTtcbiAgfVxuICBpZiAoaW5mby5hdHRyKSB7XG4gICAgc2V0RWxlbWVudEF0dHJzKGVsLCBpbmZvLmF0dHIpO1xuICB9XG4gIGlmIChpbmZvLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbC50aXRsZSA9IGluZm8udGl0bGU7XG4gIH1cbiAgaW5zZXJ0SW50b1BhcmVudChlbCwgaW5mbyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxFbGVtZW50PEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KHRhZzogSywgbz86IERvbUVsZW1lbnRJbmZvIHwgc3RyaW5nKTogSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWNyZWF0ZS1lbCAtLSBBZ25vc3RpYyBtb2R1bGUuXG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICBhcHBseURvbUVsZW1lbnRJbmZvKGVsLCBvKTtcbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdmdFbGVtZW50PEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLLCBvPzogc3RyaW5nIHwgU3ZnRWxlbWVudEluZm8pOiBTVkdFbGVtZW50VGFnTmFtZU1hcFtLXSB7XG4gIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCB0YWcpO1xuICBjb25zdCBpbmZvOiBTdmdFbGVtZW50SW5mbyA9IHR5cGVvZiBvID09PSAnc3RyaW5nJyA/IHsgY2xzOiBvIH0gOiBvID8/IHt9O1xuXG4gIGlmIChpbmZvLmNscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5mby5jbHMpKSB7XG4gICAgICBzdmcuY2xhc3NMaXN0LmFkZCguLi5pbmZvLmNscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN2Zy5jbGFzc0xpc3QuYWRkKGluZm8uY2xzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGluZm8uYXR0cikge1xuICAgIHNldEVsZW1lbnRBdHRycyhzdmcsIGluZm8uYXR0cik7XG4gIH1cbiAgaW5zZXJ0SW50b1BhcmVudChzdmcsIGluZm8pO1xuICByZXR1cm4gc3ZnO1xufVxuXG5mdW5jdGlvbiBnZXRMb2FkYWJsZUVsZW1lbnRzKGVsOiBFbGVtZW50KTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oZWwucXVlcnlTZWxlY3RvckFsbCgnYm9keSwgaW1nLCBpZnJhbWUsIGVtYmVkLCBsaW5rLCBvYmplY3QsIHNjcmlwdCwgc3R5bGUsIHRyYWNrJykpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9uby1nbG9iYWwtdGhpcyAtLSBUeXBlLW9ubHk6IHRoZSByZXNvbHZlZCB3aW5kb3cgbmVlZHMgdGhlIGdsb2JhbCBET00gY29uc3RydWN0b3IgdHlwaW5ncy5cbmZ1bmN0aW9uIGdldE5vZGVXaW5kb3cobm9kZTogTm9kZSk6IHR5cGVvZiBnbG9iYWxUaGlzICYgV2luZG93IHtcbiAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudD8uZGVmYXVsdFZpZXcgPz8gd2luZG93O1xufVxuXG5mdW5jdGlvbiBpbnNlcnRJbnRvUGFyZW50KGVsOiBFbGVtZW50LCBpbmZvOiBEb21FbGVtZW50SW5mbyB8IFN2Z0VsZW1lbnRJbmZvKTogdm9pZCB7XG4gIGlmICghaW5mby5wYXJlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGluZm8ucHJlcGVuZCkge1xuICAgIGluZm8ucGFyZW50Lmluc2VydEJlZm9yZShlbCwgaW5mby5wYXJlbnQuZmlyc3RDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgaW5mby5wYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5zdGFuY2VPZjxUIGV4dGVuZHMgTm9kZT4obm9kZTogTm9kZSwgY3RvcjogYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBuZXZlcltdKSA9PiBUKTogbm9kZSBpcyBUIHtcbiAgLy8gQWdub3N0aWMgcmVpbXBsZW1lbnRhdGlvbiBvZiBPYnNpZGlhbidzIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCAoZW5oYW5jZS5qcykuXG4gIC8vIFRoZSBjYWxsZXIgcmVzb2x2ZXMgYGN0b3JgIGluIHRoZSBub2RlJ3Mgb3duIHJlYWxtICh2aWEgYGdldE5vZGVXaW5kb3dgKSwga2VlcGluZyBpdCBjcm9zcy13aW5kb3cgc2FmZS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWluc3RhbmNlb2YgLS0gVGhpcyBJUyB0aGUgYWdub3N0aWMgYC5pbnN0YW5jZU9mYCByZXBsYWNlbWVudC5cbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBjdG9yO1xufVxuXG5mdW5jdGlvbiBzZXRFbGVtZW50QXR0cnMoZWw6IEVsZW1lbnQsIGF0dHI6IE5vbk51bGxhYmxlPERvbUVsZW1lbnRJbmZvWydhdHRyJ10+KTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUobmFtZSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEVsZW1lbnRUZXh0KGVsOiBIVE1MRWxlbWVudCwgdGV4dDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAodGV4dCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICBlbC5yZXBsYWNlQ2hpbGRyZW4odGV4dCk7XG4gIH0gZWxzZSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsd0JBQW1D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
386
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9ic2lkaWFuLXJ1bnRpbWUtYWdub3N0aWMgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIEhUTUwgZWxlbWVudHMuXG4gKlxuICogU2V2ZXJhbCBoZWxwZXJzIGhlcmUgbWlycm9yIGJlaGF2aW9yIHRoYXQgdGhlIE9ic2lkaWFuIHJ1bnRpbWUgaW5qZWN0cyBvbnRvIHRoZSBET00gcHJvdG90eXBlc1xuICogKGBjcmVhdGVFbGAvYGNyZWF0ZURpdmAvYGNyZWF0ZVNwYW5gL2BjcmVhdGVTdmdgL2BjcmVhdGVGcmFnbWVudGAsIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCxcbiAqIGBFbGVtZW50LnByb3RvdHlwZS5zZXRUZXh0YC9gc2V0QXR0cnNgKS4gVG8gc3RheSBpbmRlcGVuZGVudCBvZiB0aGUgT2JzaWRpYW4gcnVudGltZSwgdGhhdCBiZWhhdmlvclxuICogaXMgcmVpbXBsZW1lbnRlZCBoZXJlIGluIHN0YW5kYXJkIERPTSwgcG9ydGVkIGZyb20gT2JzaWRpYW4ncyBvd24gaW1wbGVtZW50YXRpb24gaW5cbiAqIGBvYnNpZGlhbi5hc2FyL2VuaGFuY2UuanNgLiBTZWUgdGhlIGBvYnNpZGlhbi12ZXJzaW9uc2AgcHJvamVjdDsgcmV2YWxpZGF0ZSB0aGUgcG9ydCB3aGVuIE9ic2lkaWFuXG4gKiBjaGFuZ2VzIGBlbmhhbmNlLmpzYCAodGhlcmUgaXMgYSByZW1pbmRlciBpbiBgQ0xBVURFLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbmNvbnN0IFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vKipcbiAqIEEgSFRNTCBlbGVtZW50IHRoYXQgY2FuIGJlIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvKipcbiAgICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGNoZWNrVmFsaWRpdHkoKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVwb3J0cyB0aGUgdmFsaWRpdHkgb2YgdGhlIGVsZW1lbnQuXG4gICAqL1xuICByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2Ugb24gdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHNldCBvbiB0aGUgZWxlbWVudC5cbiAgICovXG4gIHNldEN1c3RvbVZhbGlkaXR5KGVycm9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciBtZXNzYWdlIG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGl2IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBkaXYgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpdi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURpdkFzeW5jKFxuICBvPzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsOiBIVE1MRGl2RWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICBjb25zdCBkaXYgPSBjcmVhdGVIdG1sRWxlbWVudCgnZGl2Jywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZGl2KTtcbiAgcmV0dXJuIGRpdjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBIVE1MRWxlbWVudFRhZ05hbWVNYXBgLlxuICogQHBhcmFtIHRhZyAtIFRoZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZWxlbWVudC5cbiAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI2NyZWF0ZUVsfSAob3IgY3JlYXRlU3ZnLCBjb3JyZXNwb25kaW5nbHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRWxBc3luYzxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPihcbiAgdGFnOiBLLFxuICBvPzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10pID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8SFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tdPiB7XG4gIGNvbnN0IGVsID0gY3JlYXRlSHRtbEVsZW1lbnQodGFnLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihlbCk7XG4gIHJldHVybiBlbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgRG9jdW1lbnRGcmFnbWVudCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBEb2N1bWVudEZyYWdtZW50IGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBEb2N1bWVudEZyYWdtZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRBc3luYyhjYWxsYmFjaz86IChlbDogRG9jdW1lbnRGcmFnbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8RG9jdW1lbnRGcmFnbWVudD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItY3JlYXRlLWVsIC0tIEFnbm9zdGljIG1vZHVsZS5cbiAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZnJhZ21lbnQpO1xuICByZXR1cm4gZnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNwYW4gYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHNwYW4gaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNwYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTcGFuQXN5bmMoXG4gIG8/OiBEb21FbGVtZW50SW5mbyB8IHN0cmluZyxcbiAgY2FsbGJhY2s/OiAoZWw6IEhUTUxTcGFuRWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MU3BhbkVsZW1lbnQ+IHtcbiAgY29uc3Qgc3BhbiA9IGNyZWF0ZUh0bWxFbGVtZW50KCdzcGFuJywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3Bhbik7XG4gIHJldHVybiBzcGFuO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdmcgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBTVkdFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBzdmcgdG8gY3JlYXRlLlxuICogQHBhcmFtIG8gLSBUaGUgc3ZnIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgc3ZnIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdmcuXG4gKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNjcmVhdGVTdmd9IChvciBjcmVhdGVFbCwgY29ycmVzcG9uZGluZ2x5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN2Z0FzeW5jPEsgZXh0ZW5kcyBrZXlvZiBTVkdFbGVtZW50VGFnTmFtZU1hcD4oXG4gIHRhZzogSyxcbiAgbz86IHN0cmluZyB8IFN2Z0VsZW1lbnRJbmZvLFxuICBjYWxsYmFjaz86IChlbDogU1ZHRWxlbWVudFRhZ05hbWVNYXBbS10pID0+IFByb21pc2FibGU8dm9pZD5cbik6IFByb21pc2U8U1ZHRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3Qgc3ZnID0gY3JlYXRlU3ZnRWxlbWVudCh0YWcsIG8pO1xuICBhd2FpdCBjYWxsYmFjaz8uKHN2Zyk7XG4gIHJldHVybiBzdmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBlbnN1cmUgaXMgbG9hZGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGlzIGxvYWRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChlbDogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNMb2FkZWQoZWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3coZWwpO1xuICBpZiAoXG4gICAgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEJvZHlFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxJbWFnZUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTEVtYmVkRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MTGlua0VsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTE9iamVjdEVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTFN0eWxlRWxlbWVudClcbiAgICB8fCBpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MVHJhY2tFbGVtZW50KVxuICApIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmUpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChnZXRMb2FkYWJsZUVsZW1lbnRzKGVsKS5tYXAoZW5zdXJlTG9hZGVkKSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgd2luZG93IGEgZG9jdW1lbnQgYmVsb25ncyB0by5cbiAqXG4gKiBBIGRvY3VtZW50IGlzIHRoZSBvbmUgbm9kZSB3aG9zZSBgb3duZXJEb2N1bWVudGAgaXMgYG51bGxgLCBzbyB0aGUgYG93bmVyRG9jdW1lbnRgLWNoYXNpbmcgbG9va3VwXG4gKiB1c2VkIGZvciBvcmRpbmFyeSBub2RlcyByZXNvbHZlcyBhIGRvY3VtZW50IHRvIHRoZSB3cm9uZyB3aW5kb3cuIFJlYWRpbmcgYGRlZmF1bHRWaWV3YCBvZmYgdGhlXG4gKiBkb2N1bWVudCBpdHNlbGYgaXMgd2hhdCBrZWVwcyBhIHBvcC1vdXQgd2luZG93J3MgY29vcmRpbmF0ZXMgbWVhc3VyZWQgYWdhaW5zdCB0aGF0IHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHRvIGdldCB0aGUgd2luZG93IG9mLlxuICogQHJldHVybnMgVGhlIHdpbmRvdyB0aGUgZG9jdW1lbnQgYmVsb25ncyB0by5cbiAqIEB0aHJvd3MgQW4ge0BsaW5rIEVycm9yfSBpZiB0aGUgZG9jdW1lbnQgaXMgZGV0YWNoZWQgYW5kIHRoZXJlZm9yZSBoYXMgbm8gd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRXaW5kb3coZG9jOiBEb2N1bWVudCk6IFdpbmRvdyB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShkb2MuZGVmYXVsdFZpZXcsICdUaGUgZG9jdW1lbnQgaGFzIG5vIHdpbmRvdycpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHotaW5kZXggb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB6LWluZGV4IG9mLlxuICogQHJldHVybnMgVGhlIHotaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRaSW5kZXgoZWw6IEVsZW1lbnQpOiBudW1iZXIge1xuICBsZXQgZWwyOiBFbGVtZW50IHwgbnVsbCA9IGVsO1xuXG4gIHdoaWxlIChlbDIpIHtcbiAgICBjb25zdCB6SW5kZXhTdHIgPSBnZXRDb21wdXRlZFN0eWxlKGVsMikuekluZGV4O1xuICAgIGNvbnN0IHpJbmRleCA9IE51bWJlci5wYXJzZUludCh6SW5kZXhTdHIsIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc05hTih6SW5kZXgpKSB7XG4gICAgICByZXR1cm4gekluZGV4O1xuICAgIH1cbiAgICBlbDIgPSBlbDIucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSBvZmZzZXQgcGFyZW50LlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIG9mZnNldCBwYXJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50VmlzaWJsZUluT2Zmc2V0UGFyZW50KGVsOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJlbnRFbCA9IGVsLm9mZnNldFBhcmVudDtcbiAgaWYgKCFwYXJlbnRFbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBwYXJlbnRFbFJlY3QgPSBwYXJlbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gKFxuICAgIHBhcmVudEVsUmVjdC50b3AgPD0gZWxSZWN0LnRvcFxuICAgICYmIGVsUmVjdC5ib3R0b20gPD0gcGFyZW50RWxSZWN0LmJvdHRvbVxuICAgICYmIHBhcmVudEVsUmVjdC5sZWZ0IDw9IGVsUmVjdC5sZWZ0XG4gICAgJiYgZWxSZWN0LnJpZ2h0IDw9IHBhcmVudEVsUmVjdC5yaWdodFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZWxlbWVudCBpcyBsb2FkZWQuXG4gKlxuICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgaXMgbG9hZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTG9hZGVkKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3coZWwpO1xuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MQm9keUVsZW1lbnQpKSB7XG4gICAgY29uc3QgcmVhZHlTdGF0ZSA9IGVsLm93bmVyRG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gcmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJyB8fCByZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxJbWFnZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsLmNvbXBsZXRlICYmIGVsLm5hdHVyYWxXaWR0aCA+IDA7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTElGcmFtZUVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWwuY29udGVudERvY3VtZW50O1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxFbWJlZEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWwuZ2V0U1ZHRG9jdW1lbnQoKTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MTGlua0VsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsLnJlbCA9PT0gJ3N0eWxlc2hlZXQnID8gZWwuc2hlZXQgIT09IG51bGwgOiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbCwgd2luLkhUTUxPYmplY3RFbGVtZW50KSkge1xuICAgIHJldHVybiAhIWVsLmNvbnRlbnREb2N1bWVudCB8fCAhIWVsLmdldFNWR0RvY3VtZW50KCk7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTFNjcmlwdEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsLCB3aW4uSFRNTFN0eWxlRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbC5zaGVldDtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWwsIHdpbi5IVE1MVHJhY2tFbGVtZW50KSkge1xuICAgIGNvbnN0IFJFQURZX1NUQVRFX0xPQURFRCA9IDI7XG4gICAgcmV0dXJuIGVsLnJlYWR5U3RhdGUgPT09IFJFQURZX1NUQVRFX0xPQURFRDtcbiAgfVxuXG4gIHJldHVybiBnZXRMb2FkYWJsZUVsZW1lbnRzKGVsKS5ldmVyeShpc0xvYWRlZCk7XG59XG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgYW5jZXN0b3Igbm9kZXMgb2YgdGhlIGdpdmVuIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBhZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFuY2VzdG9yU2Nyb2xsT3JSZXNpemUobm9kZTogTm9kZSwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBEaXNwb3NhYmxlIHtcbiAgY29uc3Qgd2luID0gZ2V0Tm9kZVdpbmRvdyhub2RlKTtcbiAgY29uc3QgYW5jZXN0b3JzOiBFdmVudFRhcmdldFtdID0gW107XG4gIGFuY2VzdG9ycy5wdXNoKG5vZGUub3duZXJEb2N1bWVudCA/PyB3aW4uZG9jdW1lbnQpO1xuICBhbmNlc3RvcnMucHVzaCh3aW4pO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSBub2RlO1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGFuY2VzdG9ycy5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICBsZXQgaXNFdmVudFRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2tTbW9vdGgoKTogdm9pZCB7XG4gICAgaWYgKGlzRXZlbnRUcmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc0V2ZW50VHJpZ2dlcmVkID0gdHJ1ZTtcblxuICAgIHdpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHgodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfXB4YDtcbn1cblxuLyoqXG4gKiBXYWl0cyB1bnRpbCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsQ29ubmVjdGVkKGVsOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbidzIGBlbC5vbk5vZGVJbnNlcnRlZGAgdXNlcyBhIGBub2RlLWluc2VydGVkYCBDU1Mga2V5ZnJhbWUgZnJvbSBPYnNpZGlhbidzIHN0eWxlc2hlZXQuXG4gICAgLy8gVGhlIGFnbm9zdGljIGVxdWl2YWxlbnQgaW5zdGVhZCBvYnNlcnZlcyB0aGUgZWxlbWVudCdzIGRvY3VtZW50IGZvciBpdCBiZWNvbWluZyBjb25uZWN0ZWQuXG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgKGdldE5vZGVXaW5kb3coZWwpKS5NdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmIChlbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG93bmVyRG9jdW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBlbGVtZW50LXR5cGUtYWdub3N0aWMgc3Vic2V0IG9mIHtAbGluayBEb21FbGVtZW50SW5mb30gdGhhdCBPYnNpZGlhbidzIGBjcmVhdGVFbGBcbiAqIHN1cHBvcnRzIFx1MjAxNCBgY2xzYCwgYHRleHRgLCBgYXR0cmAsIGB0aXRsZWAsIGFuZCBgcGFyZW50YC9gcHJlcGVuZGAuIFRoZSBlbGVtZW50LXR5cGUtc3BlY2lmaWNcbiAqIGZpZWxkcyAoYHZhbHVlYCwgYHR5cGVgLCBgcGxhY2Vob2xkZXJgLCBgaHJlZmApIGFuZCB0aGUgYG9uKmAgZXZlbnQtaGFuZGxlciBrZXlzIGFyZSBpbnRlbnRpb25hbGx5XG4gKiBOT1QgcG9ydGVkIChubyBpbnRlcm5hbCBjYWxsZXIgbmVlZHMgdGhlbSk7IGV4dGVuZCB0aGlzIGlmIGEgY29uc3VtZXIgZG9lcyBcdTIwMTQgYW5kIHJldmFsaWRhdGUgYWdhaW5zdFxuICogYGVuaGFuY2UuanNgIChzZWUgdGhlIGBAZmlsZWAgbm90ZSBhbmQgYENMQVVERS5tZGApLlxuICpcbiAqIEBwYXJhbSBlbCAtIFRoZSBlbGVtZW50IHRvIGFwcGx5IHRoZSBpbmZvIHRvLlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvIChvciBhIGJhcmUgY2xhc3Mgc3RyaW5nKS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlEb21FbGVtZW50SW5mbyhlbDogSFRNTEVsZW1lbnQsIG86IERvbUVsZW1lbnRJbmZvIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGluZm86IERvbUVsZW1lbnRJbmZvID0gdHlwZW9mIG8gPT09ICdzdHJpbmcnID8geyBjbHM6IG8gfSA6IG8gPz8ge307XG5cbiAgaWYgKGluZm8uY2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbC5jbGFzc05hbWUgPSBBcnJheS5pc0FycmF5KGluZm8uY2xzKSA/IGluZm8uY2xzLmpvaW4oJyAnKSA6IGluZm8uY2xzO1xuICB9XG4gIGlmIChpbmZvLnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHNldEVsZW1lbnRUZXh0KGVsLCBpbmZvLnRleHQpO1xuICB9XG4gIGlmIChpbmZvLmF0dHIpIHtcbiAgICBzZXRFbGVtZW50QXR0cnMoZWwsIGluZm8uYXR0cik7XG4gIH1cbiAgaWYgKGluZm8udGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGVsLnRpdGxlID0gaW5mby50aXRsZTtcbiAgfVxuICBpbnNlcnRJbnRvUGFyZW50KGVsLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHRtbEVsZW1lbnQ8SyBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLLCBvPzogRG9tRWxlbWVudEluZm8gfCBzdHJpbmcpOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItY3JlYXRlLWVsIC0tIEFnbm9zdGljIG1vZHVsZS5cbiAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGFwcGx5RG9tRWxlbWVudEluZm8oZWwsIG8pO1xuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN2Z0VsZW1lbnQ8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIG8/OiBzdHJpbmcgfCBTdmdFbGVtZW50SW5mbyk6IFNWR0VsZW1lbnRUYWdOYW1lTWFwW0tdIHtcbiAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OQU1FU1BBQ0UsIHRhZyk7XG4gIGNvbnN0IGluZm86IFN2Z0VsZW1lbnRJbmZvID0gdHlwZW9mIG8gPT09ICdzdHJpbmcnID8geyBjbHM6IG8gfSA6IG8gPz8ge307XG5cbiAgaWYgKGluZm8uY2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbmZvLmNscykpIHtcbiAgICAgIHN2Zy5jbGFzc0xpc3QuYWRkKC4uLmluZm8uY2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3ZnLmNsYXNzTGlzdC5hZGQoaW5mby5jbHMpO1xuICAgIH1cbiAgfVxuICBpZiAoaW5mby5hdHRyKSB7XG4gICAgc2V0RWxlbWVudEF0dHJzKHN2ZywgaW5mby5hdHRyKTtcbiAgfVxuICBpbnNlcnRJbnRvUGFyZW50KHN2ZywgaW5mbyk7XG4gIHJldHVybiBzdmc7XG59XG5cbmZ1bmN0aW9uIGdldExvYWRhYmxlRWxlbWVudHMoZWw6IEVsZW1lbnQpOiBFbGVtZW50W10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5LCBpbWcsIGlmcmFtZSwgZW1iZWQsIGxpbmssIG9iamVjdCwgc2NyaXB0LCBzdHlsZSwgdHJhY2snKSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzIC0tIFR5cGUtb25seTogdGhlIHJlc29sdmVkIHdpbmRvdyBuZWVkcyB0aGUgZ2xvYmFsIERPTSBjb25zdHJ1Y3RvciB0eXBpbmdzLlxuZnVuY3Rpb24gZ2V0Tm9kZVdpbmRvdyhub2RlOiBOb2RlKTogdHlwZW9mIGdsb2JhbFRoaXMgJiBXaW5kb3cge1xuICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50Py5kZWZhdWx0VmlldyA/PyB3aW5kb3c7XG59XG5cbmZ1bmN0aW9uIGluc2VydEludG9QYXJlbnQoZWw6IEVsZW1lbnQsIGluZm86IERvbUVsZW1lbnRJbmZvIHwgU3ZnRWxlbWVudEluZm8pOiB2b2lkIHtcbiAgaWYgKCFpbmZvLnBhcmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5mby5wcmVwZW5kKSB7XG4gICAgaW5mby5wYXJlbnQuaW5zZXJ0QmVmb3JlKGVsLCBpbmZvLnBhcmVudC5maXJzdENoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBpbmZvLnBhcmVudC5hcHBlbmRDaGlsZChlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbnN0YW5jZU9mPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBOb2RlLCBjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IG5ldmVyW10pID0+IFQpOiBub2RlIGlzIFQge1xuICAvLyBBZ25vc3RpYyByZWltcGxlbWVudGF0aW9uIG9mIE9ic2lkaWFuJ3MgYE5vZGUucHJvdG90eXBlLmluc3RhbmNlT2ZgIChlbmhhbmNlLmpzKS5cbiAgLy8gVGhlIGNhbGxlciByZXNvbHZlcyBgY3RvcmAgaW4gdGhlIG5vZGUncyBvd24gcmVhbG0gKHZpYSBgZ2V0Tm9kZVdpbmRvd2ApLCBrZWVwaW5nIGl0IGNyb3NzLXdpbmRvdyBzYWZlLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItaW5zdGFuY2VvZiAtLSBUaGlzIElTIHRoZSBhZ25vc3RpYyBgLmluc3RhbmNlT2ZgIHJlcGxhY2VtZW50LlxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGN0b3I7XG59XG5cbmZ1bmN0aW9uIHNldEVsZW1lbnRBdHRycyhlbDogRWxlbWVudCwgYXR0cjogTm9uTnVsbGFibGU8RG9tRWxlbWVudEluZm9bJ2F0dHInXT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHIpKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RWxlbWVudFRleHQoZWw6IEhUTUxFbGVtZW50LCB0ZXh0OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogdm9pZCB7XG4gIGlmICh0ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgIGVsLnJlcGxhY2VDaGlsZHJlbih0ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLHdCQUFtQztBQUNuQyx5QkFBa0M7QUFFbEMsTUFBTSxnQkFBZ0I7QUFzQ3RCLGVBQXNCLGVBQ3BCLEdBQ0EsVUFDeUI7QUFDekIsUUFBTSxNQUFNLGtCQUFrQixPQUFPLENBQUM7QUFDdEMsUUFBTSxXQUFXLEdBQUc7QUFDcEIsU0FBTztBQUNUO0FBWUEsZUFBc0IsY0FDcEIsS0FDQSxH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
@@ -89,6 +89,18 @@ export declare function createSvgAsync<K extends keyof SVGElementTagNameMap>(tag
89
89
  * @returns A {@link Promise} that resolves when the element is loaded.
90
90
  */
91
91
  export declare function ensureLoaded(el: Element): Promise<void>;
92
+ /**
93
+ * Gets the window a document belongs to.
94
+ *
95
+ * A document is the one node whose `ownerDocument` is `null`, so the `ownerDocument`-chasing lookup
96
+ * used for ordinary nodes resolves a document to the wrong window. Reading `defaultView` off the
97
+ * document itself is what keeps a pop-out window's coordinates measured against that window.
98
+ *
99
+ * @param doc - The document to get the window of.
100
+ * @returns The window the document belongs to.
101
+ * @throws An {@link Error} if the document is detached and therefore has no window.
102
+ */
103
+ export declare function getDocumentWindow(doc: Document): Window;
92
104
  /**
93
105
  * Gets the z-index of the given element.
94
106
  *
@@ -210,7 +210,11 @@ async function getAvailablePathForAttachments(params) {
210
210
  prefix: "./",
211
211
  str: attachmentFolderPath
212
212
  }) : null;
213
- const noteFileOrNull = (0, import_file_system.getFileOrNull)({ app, pathOrFile: notePathOrFile });
213
+ const noteFileOrNull = notePathOrFile === null ? null : (0, import_file_system.getFile)({
214
+ app,
215
+ pathOrFile: notePathOrFile,
216
+ shouldIncludeNonExisting: true
217
+ });
214
218
  if (isCurrentFolder) {
215
219
  attachmentFolderPath = noteFileOrNull ? noteFileOrNull.parent?.path ?? "" : "";
216
220
  } else if (relativePath) {
@@ -219,10 +223,11 @@ async function getAvailablePathForAttachments(params) {
219
223
  attachmentFolderPath = (0, import_string.normalizeString)(normalizeSlashes(attachmentFolderPath));
220
224
  const attachmentFileBaseName = (0, import_string.normalizeString)(normalizeSlashes(params.attachmentFileBaseName));
221
225
  let folder = (0, import_file_system.getFolderOrNull)({ app, isCaseInsensitive: true, pathOrFolder: attachmentFolderPath });
222
- if (!folder && relativePath) {
223
- folder = shouldSkipMissingAttachmentFolderCreation ? (0, import_file_system.getFolder)({ app, pathOrFolder: attachmentFolderPath, shouldIncludeNonExisting: true }) : await app.vault.createFolder(attachmentFolderPath);
226
+ if (!folder && relativePath && !shouldSkipMissingAttachmentFolderCreation) {
227
+ folder = await app.vault.createFolder(attachmentFolderPath);
224
228
  }
225
- const prefix = folder?.getParentPrefix() ?? "";
229
+ folder ??= (0, import_file_system.getFolder)({ app, pathOrFolder: attachmentFolderPath, shouldIncludeNonExisting: true });
230
+ const prefix = folder.getParentPrefix();
226
231
  return shouldSkipDuplicateCheck ? (0, import_path.makeFileName)({
227
232
  fileBaseName: prefix + attachmentFileBaseName,
228
233
  fileExtension: attachmentFileExtension
@@ -308,4 +313,4 @@ function normalizeSlashes(path) {
308
313
  hasOwnAttachmentFolder,
309
314
  isAtProperAttachmentPath
310
315
  });
311
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2F0dGFjaG1lbnQtcGF0aC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRmlsZVN0YXRzLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogQSBjb250ZXh0IGZvciBhbiBhdHRhY2htZW50IHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIEF0dGFjaG1lbnRQYXRoQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgZGVsZXRlIG5vdGUuXG4gICAqL1xuICBEZWxldGVOb3RlID0gJ0RlbGV0ZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgcmVuYW1lIG5vdGUuXG4gICAqL1xuICBSZW5hbWVOb3RlID0gJ1JlbmFtZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGNvbnRleHQuXG4gICAqL1xuICBVbmtub3duID0gJ1Vua25vd24nXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZXh0ZW5kZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGblBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGJhc2UgbmFtZSBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGF0cyBvZiB0aGUgYXR0YWNobWVudCBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVTdGF0cz86IEZpbGVTdGF0cyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9yIGZpbGUgb2YgdGhlIG9sZCBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvciBmaWxlIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogTGF6aWx5IHJlYWRzIHRoZSBjb250ZW50IG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqXG4gICAqIFRoZSBjb250ZW50IGlzIHJlYWQgb24gZGVtYW5kIG9ubHkgd2hlbiBhIGNvbnN1bWVyIGFjdHVhbGx5IG5lZWRzIHRoZSBieXRlcyAoZS5nLiBhIHRlbXBsYXRlXG4gICAqIHRva2VuIHRoYXQgZW1iZWRzIHRoZW0pLiBGb3IgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIG5vdGhpbmcgcHVsbHMgdGhlIGJ5dGVzLCBzbyB0aGUgcG90ZW50aWFsbHlcbiAgICogZXhwZW5zaXZlIChzaXplLXByb3BvcnRpb25hbCkgYHJlYWRCaW5hcnlgIG5ldmVyIHJ1bnMuIENvbnN1bWVycyB0aGF0IG1heSBjYWxsIHRoaXMgbW9yZSB0aGFuXG4gICAqIG9uY2Ugc2hvdWxkIG1lbW9pemUgdGhlIGZpcnN0IGNhbGwuIGBudWxsYCB3aGVuIHRoZXJlIGlzIG5vIGF0dGFjaG1lbnQgZmlsZSB0byByZWFkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqL1xuICByZWFkb25seSByZWFkQXR0YWNobWVudEZpbGVDb250ZW50OiAoKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj4pIHwgbnVsbDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZ2VuZXJhdGVkIGF0dGFjaG1lbnQgZmlsZSBuYW1lIGJlIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwR2VuZXJhdGVkQXR0YWNobWVudEZpbGVOYW1lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIG1pc3NpbmcgYXR0YWNobWVudCBmb2xkZXIgY3JlYXRpb24gYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHtAbGluayBWYXVsdC5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHN9IGV4dGVuZGVkIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm5FeHRlbmRlZCBleHRlbmRzIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0ZuIHtcbiAgLyoqXG4gICAqIEdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgd2l0aCBhZGRpdGlvbmFsIHBhcmFtcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMuXG4gICAqL1xuICBleHRlbmRlZChwYXJhbXM6IEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm5QYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbnR5cGUgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm4gPSBWYXVsdFsnZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzJ107XG5cbi8qKlxuICogRHVtbXkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX1BBVEggPSAnX19EVU1NWV9fJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXR0YWNobWVudEZpbGVQYXRoIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3dufVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IEF0dGFjaG1lbnRQYXRoQ29udGV4dDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGhhc093bkF0dGFjaG1lbnRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc093bkF0dGFjaG1lbnRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNBdFByb3BlckF0dGFjaG1lbnRQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmaWxlIHBhdGggZm9yIGFuIGF0dGFjaG1lbnQgd2l0aGluIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZpbGUgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aChwYXJhbXM6IEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudFBhdGggfSk7XG5cbiAgY29uc3QgZXh0ZW5kZWRGbiA9IChhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGFzIFBhcnRpYWw8R2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm5FeHRlbmRlZD4pLmV4dGVuZGVkO1xuICBpZiAoZXh0ZW5kZWRGbikge1xuICAgIHJldHVybiBleHRlbmRlZEZuKHtcbiAgICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogYXR0YWNobWVudEZpbGVFeHRlbnNpb24uc2xpY2UoMSksXG4gICAgICBhdHRhY2htZW50RmlsZVN0YXRzOiBhdHRhY2htZW50RmlsZT8uc3RhdCxcbiAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgbm90ZVBhdGhPckZpbGUsXG4gICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogcGFyYW1zLm9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHBhcmFtcy5vbGROb3RlUGF0aE9yRmlsZSxcbiAgICAgIHJlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQ6IGF0dGFjaG1lbnRGaWxlID8gKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+IGFwcC52YXVsdC5yZWFkQmluYXJ5KGF0dGFjaG1lbnRGaWxlKSA6IG51bGwsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2ssXG4gICAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbjogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyh7XG4gICAgYXBwLFxuICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLnNsaWNlKDEpLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjayxcbiAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbjogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGggZm9yIGEgZ2l2ZW4gbm90ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZvbGRlciBwYXRoIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHBhcmFtczogR2V0QXR0YWNobWVudEZvbGRlclBhdGhQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRleHQgPSBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bixcbiAgICBub3RlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICByZXR1cm4gcGFyZW50Rm9sZGVyUGF0aChcbiAgICBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgYXBwLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IERVTU1ZX1BBVEgsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhwYXJhbXM6IEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb24sXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrLFxuICAgIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGFwcC52YXVsdC5nZXRDb25maWcoJ2F0dGFjaG1lbnRGb2xkZXJQYXRoJykgYXMgc3RyaW5nO1xuICBjb25zdCBpc0N1cnJlbnRGb2xkZXIgPSBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4nIHx8IGF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLi8nO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBhdHRhY2htZW50Rm9sZGVyUGF0aC5zdGFydHNXaXRoKCcuLycpXG4gICAgPyB0cmltU3RhcnQoe1xuICAgICAgcHJlZml4OiAnLi8nLFxuICAgICAgc3RyOiBhdHRhY2htZW50Rm9sZGVyUGF0aFxuICAgIH0pXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IG5vdGVGaWxlT3JOdWxsID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogbm90ZVBhdGhPckZpbGUgfSk7XG5cbiAgaWYgKGlzQ3VycmVudEZvbGRlcikge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm90ZUZpbGVPck51bGwgPyBub3RlRmlsZU9yTnVsbC5wYXJlbnQ/LnBhdGggPz8gJycgOiAnJztcbiAgfSBlbHNlIGlmIChyZWxhdGl2ZVBhdGgpIHtcbiAgICBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IChub3RlRmlsZU9yTnVsbCA/IG5vdGVGaWxlT3JOdWxsLnBhcmVudD8uZ2V0UGFyZW50UHJlZml4KCkgPz8gJycgOiAnJykgKyByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IG5vcm1hbGl6ZVN0cmluZyhub3JtYWxpemVTbGFzaGVzKGF0dGFjaG1lbnRGb2xkZXJQYXRoKSk7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUgPSBub3JtYWxpemVTdHJpbmcobm9ybWFsaXplU2xhc2hlcyhwYXJhbXMuYXR0YWNobWVudEZpbGVCYXNlTmFtZSkpO1xuXG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHAsIGlzQ2FzZUluc2Vuc2l0aXZlOiB0cnVlLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gIGlmICghZm9sZGVyICYmIHJlbGF0aXZlUGF0aCkge1xuICAgIGZvbGRlciA9IHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uXG4gICAgICA/IGdldEZvbGRlcih7IGFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pXG4gICAgICA6IGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIoYXR0YWNobWVudEZvbGRlclBhdGgpO1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gZm9sZGVyPy5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJztcbiAgcmV0dXJuIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICAgID8gbWFrZUZpbGVOYW1lKHtcbiAgICAgIGZpbGVCYXNlTmFtZTogcHJlZml4ICsgYXR0YWNobWVudEZpbGVCYXNlTmFtZSxcbiAgICAgIGZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uXG4gICAgfSlcbiAgICA6IGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBub3RlIGhhcyBpdHMgb3duIGF0dGFjaG1lbnQgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaGFzIG93biBhdHRhY2htZW50IGZvbGRlciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc093bkF0dGFjaG1lbnRGb2xkZXIocGFyYW1zOiBIYXNPd25BdHRhY2htZW50Rm9sZGVyUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGV4dCA9IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3duLFxuICAgIHBhdGhcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IHBhdGhcbiAgfSk7XG4gIGNvbnN0IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IGpvaW4oZGlybmFtZShwYXRoKSwgYCR7RFVNTVlfUEFUSH0uJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gKVxuICB9KTtcbiAgcmV0dXJuIGF0dGFjaG1lbnRGb2xkZXJQYXRoICE9PSBkdW1teUF0dGFjaG1lbnRGb2xkZXJQYXRoO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGF0dGFjaG1lbnQgYWxyZWFkeSBzaXRzIGF0IGl0cyBwcm9wZXIgYXR0YWNobWVudCBwYXRoLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQncyBjdXJyZW50IHBhdGggaXMsIHdpdGhpbiBpdHMgcHJvcGVyIGF0dGFjaG1lbnQgZm9sZGVyLCBlaXRoZXIgdGhlIHByb3BlclxuICogYmFzZSBuYW1lIG9yIHRoZSBwcm9wZXIgYmFzZSBuYW1lIHBsdXMgYW4gT2JzaWRpYW4gZGVkdXBsaWNhdGlvbiBzdWZmaXggKGEgc3BhY2UgZm9sbG93ZWQgYnkgZGlnaXRzLCBlLmcuXG4gKiBgaW1nIDFgKSB3aXRoIHRoZSBzYW1lIGV4dGVuc2lvbi4gVGhlIHByb3BlciBwYXRoIGlzIGNvbXB1dGVkIHZpYSB7QGxpbmsgZ2V0QXR0YWNobWVudEZpbGVQYXRofSB3aXRoXG4gKiB7QGxpbmsgR2V0QXR0YWNobWVudEZpbGVQYXRoUGFyYW1zLnNob3VsZFNraXBEdXBsaWNhdGVDaGVja30gc2V0IHRvIGB0cnVlYCAodGhlIHRhcmdldCBiZWZvcmUgYW55XG4gKiBkZWR1cGxpY2F0aW9uIHN1ZmZpeCksIGFuZCB0aGUgY29tcGFyaXNvbiByZXNwZWN0cyB0aGUgZmlsZSBzeXN0ZW0gY2FzZS1zZW5zaXRpdml0eSBmbGFnXG4gKiAoYGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZWApIHRoYXQgYGdldFNhZmVSZW5hbWVQYXRoYCB1c2VzLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNhbGxlciByZWNvZ25pemUgYSBkZWR1cGxpY2F0aW9uLXBhcmtlZCBhdHRhY2htZW50IGFzIGFscmVhZHktY29sbGVjdGVkLCBzbyBhIFwibmVlZHMgbW92ZT9cIlxuICogZGVjaXNpb24gbWFkZSBhZ2FpbnN0IHRoZSBkZWR1cGxpY2F0aW9uLWZyZWUgcHJvcGVyIHBhdGggY29udmVyZ2VzIGluc3RlYWQgb2YgcmUtc2NoZWR1bGluZyB0aGUgZmlsZSBmb3JldmVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaXMgYXQgcHJvcGVyIGF0dGFjaG1lbnQgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSBhdCBpdHMgcHJvcGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0F0UHJvcGVyQXR0YWNobWVudFBhdGgocGFyYW1zOiBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBjdXJyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBhdHRhY2htZW50UGF0aE9yRmlsZSk7XG4gIGNvbnN0IHByb3BlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgIGFwcCxcbiAgICBjb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgaXNJbnNlbnNpdGl2ZSA9IGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZTtcblxuICBmdW5jdGlvbiBmb2xkKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0luc2Vuc2l0aXZlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICB9XG5cbiAgaWYgKGZvbGQoZGlybmFtZShjdXJyZW50UGF0aCkpICE9PSBmb2xkKGRpcm5hbWUocHJvcGVyUGF0aCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4dGVuc2lvbiA9IGV4dG5hbWUoY3VycmVudFBhdGgpO1xuICBjb25zdCBwcm9wZXJFeHRlbnNpb24gPSBleHRuYW1lKHByb3BlclBhdGgpO1xuICBpZiAoZm9sZChjdXJyZW50RXh0ZW5zaW9uKSAhPT0gZm9sZChwcm9wZXJFeHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEJhc2VOYW1lID0gYmFzZW5hbWUoY3VycmVudFBhdGgsIGN1cnJlbnRFeHRlbnNpb24pO1xuICBjb25zdCBwcm9wZXJCYXNlTmFtZSA9IGJhc2VuYW1lKHByb3BlclBhdGgsIHByb3BlckV4dGVuc2lvbik7XG5cbiAgaWYgKGZvbGQoY3VycmVudEJhc2VOYW1lKSA9PT0gZm9sZChwcm9wZXJCYXNlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25QcmVmaXggPSBgJHtwcm9wZXJCYXNlTmFtZX0gYDtcbiAgaWYgKCFmb2xkKGN1cnJlbnRCYXNlTmFtZSkuc3RhcnRzV2l0aChmb2xkKGRlZHVwbGljYXRpb25QcmVmaXgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25TdWZmaXggPSBjdXJyZW50QmFzZU5hbWUuc2xpY2UoZGVkdXBsaWNhdGlvblByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gL15cXGQrJC8udGVzdChkZWR1cGxpY2F0aW9uU3VmZml4KTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCBieSBjb21iaW5pbmcgbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTbGFzaGVzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHBhdGggPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJy8nLFxuICAgIHNlYXJjaFZhbHVlOiAvKD86W1xcXFwvXSkrL2csXG4gICAgc3RyOiBwYXRoXG4gIH0pO1xuICBwYXRoID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLyt8XFwvKyQvZyxcbiAgICBzdHI6IHBhdGhcbiAgfSk7XG4gIHJldHVybiBwYXRoIHx8ICcvJztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBLDZCQUdPO0FBSVAsa0JBTU87QUFDUCxvQkFJTztBQUNQLHlCQU1PO0FBS0EsSUFBSyx3QkFBTCxrQkFBS0EsMkJBQUw7QUFJTCxFQUFBQSx1QkFBQSxnQkFBYTtBQUtiLEVBQUFBLHVC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
316
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2F0dGFjaG1lbnQtcGF0aC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRmlsZVN0YXRzLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogQSBjb250ZXh0IGZvciBhbiBhdHRhY2htZW50IHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIEF0dGFjaG1lbnRQYXRoQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgZGVsZXRlIG5vdGUuXG4gICAqL1xuICBEZWxldGVOb3RlID0gJ0RlbGV0ZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgcmVuYW1lIG5vdGUuXG4gICAqL1xuICBSZW5hbWVOb3RlID0gJ1JlbmFtZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGNvbnRleHQuXG4gICAqL1xuICBVbmtub3duID0gJ1Vua25vd24nXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZXh0ZW5kZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGblBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGJhc2UgbmFtZSBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGF0cyBvZiB0aGUgYXR0YWNobWVudCBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVTdGF0cz86IEZpbGVTdGF0cyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9yIGZpbGUgb2YgdGhlIG9sZCBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvciBmaWxlIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogTGF6aWx5IHJlYWRzIHRoZSBjb250ZW50IG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqXG4gICAqIFRoZSBjb250ZW50IGlzIHJlYWQgb24gZGVtYW5kIG9ubHkgd2hlbiBhIGNvbnN1bWVyIGFjdHVhbGx5IG5lZWRzIHRoZSBieXRlcyAoZS5nLiBhIHRlbXBsYXRlXG4gICAqIHRva2VuIHRoYXQgZW1iZWRzIHRoZW0pLiBGb3IgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIG5vdGhpbmcgcHVsbHMgdGhlIGJ5dGVzLCBzbyB0aGUgcG90ZW50aWFsbHlcbiAgICogZXhwZW5zaXZlIChzaXplLXByb3BvcnRpb25hbCkgYHJlYWRCaW5hcnlgIG5ldmVyIHJ1bnMuIENvbnN1bWVycyB0aGF0IG1heSBjYWxsIHRoaXMgbW9yZSB0aGFuXG4gICAqIG9uY2Ugc2hvdWxkIG1lbW9pemUgdGhlIGZpcnN0IGNhbGwuIGBudWxsYCB3aGVuIHRoZXJlIGlzIG5vIGF0dGFjaG1lbnQgZmlsZSB0byByZWFkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqL1xuICByZWFkb25seSByZWFkQXR0YWNobWVudEZpbGVDb250ZW50OiAoKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj4pIHwgbnVsbDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZ2VuZXJhdGVkIGF0dGFjaG1lbnQgZmlsZSBuYW1lIGJlIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwR2VuZXJhdGVkQXR0YWNobWVudEZpbGVOYW1lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIG1pc3NpbmcgYXR0YWNobWVudCBmb2xkZXIgY3JlYXRpb24gYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIHtAbGluayBWYXVsdC5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHN9IGV4dGVuZGVkIHdyYXBwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm5FeHRlbmRlZCBleHRlbmRzIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0ZuIHtcbiAgLyoqXG4gICAqIEdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgd2l0aCBhZGRpdGlvbmFsIHBhcmFtcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMuXG4gICAqL1xuICBleHRlbmRlZChwYXJhbXM6IEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRm5QYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbnR5cGUgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm4gPSBWYXVsdFsnZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzJ107XG5cbi8qKlxuICogRHVtbXkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX1BBVEggPSAnX19EVU1NWV9fJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXR0YWNobWVudEZpbGVQYXRoIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3dufVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IEF0dGFjaG1lbnRQYXRoQ29udGV4dDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGhhc093bkF0dGFjaG1lbnRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc093bkF0dGFjaG1lbnRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNBdFByb3BlckF0dGFjaG1lbnRQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmaWxlIHBhdGggZm9yIGFuIGF0dGFjaG1lbnQgd2l0aGluIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZpbGUgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aChwYXJhbXM6IEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudFBhdGggfSk7XG5cbiAgY29uc3QgZXh0ZW5kZWRGbiA9IChhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGFzIFBhcnRpYWw8R2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm5FeHRlbmRlZD4pLmV4dGVuZGVkO1xuICBpZiAoZXh0ZW5kZWRGbikge1xuICAgIHJldHVybiBleHRlbmRlZEZuKHtcbiAgICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogYXR0YWNobWVudEZpbGVFeHRlbnNpb24uc2xpY2UoMSksXG4gICAgICBhdHRhY2htZW50RmlsZVN0YXRzOiBhdHRhY2htZW50RmlsZT8uc3RhdCxcbiAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgbm90ZVBhdGhPckZpbGUsXG4gICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogcGFyYW1zLm9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHBhcmFtcy5vbGROb3RlUGF0aE9yRmlsZSxcbiAgICAgIHJlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQ6IGF0dGFjaG1lbnRGaWxlID8gKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+IGFwcC52YXVsdC5yZWFkQmluYXJ5KGF0dGFjaG1lbnRGaWxlKSA6IG51bGwsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2ssXG4gICAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbjogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyh7XG4gICAgYXBwLFxuICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLnNsaWNlKDEpLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjayxcbiAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbjogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGggZm9yIGEgZ2l2ZW4gbm90ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZvbGRlciBwYXRoIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHBhcmFtczogR2V0QXR0YWNobWVudEZvbGRlclBhdGhQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRleHQgPSBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bixcbiAgICBub3RlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICByZXR1cm4gcGFyZW50Rm9sZGVyUGF0aChcbiAgICBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgYXBwLFxuICAgICAgY29udGV4dCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IERVTU1ZX1BBVEgsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhwYXJhbXM6IEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb24sXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrLFxuICAgIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGFwcC52YXVsdC5nZXRDb25maWcoJ2F0dGFjaG1lbnRGb2xkZXJQYXRoJykgYXMgc3RyaW5nO1xuICBjb25zdCBpc0N1cnJlbnRGb2xkZXIgPSBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4nIHx8IGF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLi8nO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBhdHRhY2htZW50Rm9sZGVyUGF0aC5zdGFydHNXaXRoKCcuLycpXG4gICAgPyB0cmltU3RhcnQoe1xuICAgICAgcHJlZml4OiAnLi8nLFxuICAgICAgc3RyOiBhdHRhY2htZW50Rm9sZGVyUGF0aFxuICAgIH0pXG4gICAgOiBudWxsO1xuXG4gIC8vIEEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCAoYSByZW5hbWUgdGFyZ2V0LCBhIGR1bW15IHNpYmxpbmcpIHN0aWxsIGJlbG9uZ3MgdG8gaXRzIG93biBmb2xkZXIuXG4gIC8vIE1hdGVyaWFsaXppbmcgaXQgZnJvbSBpdHMgcGF0aCBrZWVwcyB0aGF0IGZvbGRlciwgd2hlcmUgYSB2YXVsdCBsb29rdXAgd291bGQgZmFsbCBiYWNrIHRvIHRoZSByb290LlxuICAvLyBPbmx5IGFuIGV4cGxpY2l0bHkgbm90ZS1sZXNzIGF0dGFjaG1lbnQgcmVzb2x2ZXMgdG8gdGhlIHZhdWx0IHJvb3QuXG4gIGNvbnN0IG5vdGVGaWxlT3JOdWxsID0gbm90ZVBhdGhPckZpbGUgPT09IG51bGxcbiAgICA/IG51bGxcbiAgICA6IGdldEZpbGUoe1xuICAgICAgYXBwLFxuICAgICAgcGF0aE9yRmlsZTogbm90ZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICB9KTtcblxuICBpZiAoaXNDdXJyZW50Rm9sZGVyKSB7XG4gICAgYXR0YWNobWVudEZvbGRlclBhdGggPSBub3RlRmlsZU9yTnVsbCA/IG5vdGVGaWxlT3JOdWxsLnBhcmVudD8ucGF0aCA/PyAnJyA6ICcnO1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aCkge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gKG5vdGVGaWxlT3JOdWxsID8gbm90ZUZpbGVPck51bGwucGFyZW50Py5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJyA6ICcnKSArIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm9ybWFsaXplU3RyaW5nKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZvbGRlclBhdGgpKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IG5vcm1hbGl6ZVN0cmluZyhub3JtYWxpemVTbGFzaGVzKHBhcmFtcy5hdHRhY2htZW50RmlsZUJhc2VOYW1lKSk7XG5cbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgaXNDYXNlSW5zZW5zaXRpdmU6IHRydWUsIHBhdGhPckZvbGRlcjogYXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgaWYgKCFmb2xkZXIgJiYgcmVsYXRpdmVQYXRoICYmICFzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbikge1xuICAgIGZvbGRlciA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIoYXR0YWNobWVudEZvbGRlclBhdGgpO1xuICB9XG5cbiAgLy8gQSBmb2xkZXIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQgc3RpbGwgb3ducyB0aGUgYXR0YWNobWVudCBwYXRoLlxuICAvLyBSZXNvbHZpbmcgaXQgYXMgYSBub24tZXhpc3RpbmcgZm9sZGVyIHN0b3BzIHRoZSBhbnN3ZXIgZnJvbSBjb2xsYXBzaW5nIHRvIHRoZSB2YXVsdCByb290LlxuICBmb2xkZXIgPz89IGdldEZvbGRlcih7IGFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHByZWZpeCA9IGZvbGRlci5nZXRQYXJlbnRQcmVmaXgoKTtcbiAgcmV0dXJuIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICAgID8gbWFrZUZpbGVOYW1lKHtcbiAgICAgIGZpbGVCYXNlTmFtZTogcHJlZml4ICsgYXR0YWNobWVudEZpbGVCYXNlTmFtZSxcbiAgICAgIGZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uXG4gICAgfSlcbiAgICA6IGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vdGUncyBhdHRhY2htZW50IGZvbGRlciBpcyBzcGVjaWZpYyB0byB0aGF0IG5vdGUgcmF0aGVyIHRoYW4gc2hhcmVkIHdpdGggaXRzIHNpYmxpbmdzLlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgZGVyaXZlZCBieSBjb21wYXJpbmcgdGhlIG5vdGUncyBhdHRhY2htZW50IGZvbGRlciB3aXRoIHRoZSBvbmUgYSBzYW1lLWZvbGRlciBzaWJsaW5nIG5vdGVcbiAqIHdvdWxkIGdldDogdGhleSBkaWZmZXIgb25seSB3aGVuIHRoZSBmb2xkZXIgZGVwZW5kcyBvbiB0aGUgbm90ZSdzIE5BTUUuIEV2ZXJ5IGJ1aWx0LWluXG4gKiBgYXR0YWNobWVudEZvbGRlclBhdGhgIG1vZGUgXHUyMDE0IHRoZSB2YXVsdCByb290LCBhIGZpeGVkIGZvbGRlciwgdGhlIG5vdGUncyBvd24gZm9sZGVyIChgLi9gKSwgYSBzdWJmb2xkZXIgb2ZcbiAqIHRoZSBub3RlJ3MgZm9sZGVyIChgLi9zdWJgKSBcdTIwMTQgaXMgc2hhcmVkIGJ5IGV2ZXJ5IG5vdGUgaW4gdGhhdCBmb2xkZXIsIHNvIGl0IGFuc3dlcnMgYGZhbHNlYDsgYHRydWVgIGFyaXNlc1xuICogZnJvbSBhIHtAbGluayBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNGbkV4dGVuZGVkLmV4dGVuZGVkfSBvdmVycmlkZSB0aGF0IGRlcml2ZXMgdGhlIGZvbGRlciBmcm9tIHRoZVxuICogbm90ZSdzIG5hbWUgKHdoYXQgYW4gYXR0YWNobWVudC1sb2NhdGlvbiBwbHVnaW4gcHJvZHVjZXMpLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRpc3RpbmN0aW9uIGEgY2FsbGVyIG5lZWRzIGJlZm9yZSBzd2VlcGluZyBhbiBhdHRhY2htZW50IGZvbGRlciB3aG9sZXNhbGU6IG9ubHkgYVxuICogbm90ZS1zcGVjaWZpYyBmb2xkZXIgY2FuIGJlIHRyZWF0ZWQgYXMgYmVsb25naW5nIHRvIHRoZSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaGFzIG93biBhdHRhY2htZW50IGZvbGRlciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc093bkF0dGFjaG1lbnRGb2xkZXIocGFyYW1zOiBIYXNPd25BdHRhY2htZW50Rm9sZGVyUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGV4dCA9IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3duLFxuICAgIHBhdGhcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IHBhdGhcbiAgfSk7XG4gIGNvbnN0IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IGpvaW4oZGlybmFtZShwYXRoKSwgYCR7RFVNTVlfUEFUSH0uJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gKVxuICB9KTtcbiAgcmV0dXJuIGF0dGFjaG1lbnRGb2xkZXJQYXRoICE9PSBkdW1teUF0dGFjaG1lbnRGb2xkZXJQYXRoO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGF0dGFjaG1lbnQgYWxyZWFkeSBzaXRzIGF0IGl0cyBwcm9wZXIgYXR0YWNobWVudCBwYXRoLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQncyBjdXJyZW50IHBhdGggaXMsIHdpdGhpbiBpdHMgcHJvcGVyIGF0dGFjaG1lbnQgZm9sZGVyLCBlaXRoZXIgdGhlIHByb3BlclxuICogYmFzZSBuYW1lIG9yIHRoZSBwcm9wZXIgYmFzZSBuYW1lIHBsdXMgYW4gT2JzaWRpYW4gZGVkdXBsaWNhdGlvbiBzdWZmaXggKGEgc3BhY2UgZm9sbG93ZWQgYnkgZGlnaXRzLCBlLmcuXG4gKiBgaW1nIDFgKSB3aXRoIHRoZSBzYW1lIGV4dGVuc2lvbi4gVGhlIHByb3BlciBwYXRoIGlzIGNvbXB1dGVkIHZpYSB7QGxpbmsgZ2V0QXR0YWNobWVudEZpbGVQYXRofSB3aXRoXG4gKiB7QGxpbmsgR2V0QXR0YWNobWVudEZpbGVQYXRoUGFyYW1zLnNob3VsZFNraXBEdXBsaWNhdGVDaGVja30gc2V0IHRvIGB0cnVlYCAodGhlIHRhcmdldCBiZWZvcmUgYW55XG4gKiBkZWR1cGxpY2F0aW9uIHN1ZmZpeCksIGFuZCB0aGUgY29tcGFyaXNvbiByZXNwZWN0cyB0aGUgZmlsZSBzeXN0ZW0gY2FzZS1zZW5zaXRpdml0eSBmbGFnXG4gKiAoYGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZWApIHRoYXQgYGdldFNhZmVSZW5hbWVQYXRoYCB1c2VzLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNhbGxlciByZWNvZ25pemUgYSBkZWR1cGxpY2F0aW9uLXBhcmtlZCBhdHRhY2htZW50IGFzIGFscmVhZHktY29sbGVjdGVkLCBzbyBhIFwibmVlZHMgbW92ZT9cIlxuICogZGVjaXNpb24gbWFkZSBhZ2FpbnN0IHRoZSBkZWR1cGxpY2F0aW9uLWZyZWUgcHJvcGVyIHBhdGggY29udmVyZ2VzIGluc3RlYWQgb2YgcmUtc2NoZWR1bGluZyB0aGUgZmlsZSBmb3JldmVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaXMgYXQgcHJvcGVyIGF0dGFjaG1lbnQgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSBhdCBpdHMgcHJvcGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0F0UHJvcGVyQXR0YWNobWVudFBhdGgocGFyYW1zOiBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBjdXJyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBhdHRhY2htZW50UGF0aE9yRmlsZSk7XG4gIGNvbnN0IHByb3BlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgIGFwcCxcbiAgICBjb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgaXNJbnNlbnNpdGl2ZSA9IGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZTtcblxuICBmdW5jdGlvbiBmb2xkKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0luc2Vuc2l0aXZlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICB9XG5cbiAgaWYgKGZvbGQoZGlybmFtZShjdXJyZW50UGF0aCkpICE9PSBmb2xkKGRpcm5hbWUocHJvcGVyUGF0aCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4dGVuc2lvbiA9IGV4dG5hbWUoY3VycmVudFBhdGgpO1xuICBjb25zdCBwcm9wZXJFeHRlbnNpb24gPSBleHRuYW1lKHByb3BlclBhdGgpO1xuICBpZiAoZm9sZChjdXJyZW50RXh0ZW5zaW9uKSAhPT0gZm9sZChwcm9wZXJFeHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEJhc2VOYW1lID0gYmFzZW5hbWUoY3VycmVudFBhdGgsIGN1cnJlbnRFeHRlbnNpb24pO1xuICBjb25zdCBwcm9wZXJCYXNlTmFtZSA9IGJhc2VuYW1lKHByb3BlclBhdGgsIHByb3BlckV4dGVuc2lvbik7XG5cbiAgaWYgKGZvbGQoY3VycmVudEJhc2VOYW1lKSA9PT0gZm9sZChwcm9wZXJCYXNlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25QcmVmaXggPSBgJHtwcm9wZXJCYXNlTmFtZX0gYDtcbiAgaWYgKCFmb2xkKGN1cnJlbnRCYXNlTmFtZSkuc3RhcnRzV2l0aChmb2xkKGRlZHVwbGljYXRpb25QcmVmaXgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25TdWZmaXggPSBjdXJyZW50QmFzZU5hbWUuc2xpY2UoZGVkdXBsaWNhdGlvblByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gL15cXGQrJC8udGVzdChkZWR1cGxpY2F0aW9uU3VmZml4KTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCBieSBjb21iaW5pbmcgbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIHNsYXNoIGFuZCByZW1vdmluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTbGFzaGVzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHBhdGggPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJy8nLFxuICAgIHNlYXJjaFZhbHVlOiAvKD86W1xcXFwvXSkrL2csXG4gICAgc3RyOiBwYXRoXG4gIH0pO1xuICBwYXRoID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLyt8XFwvKyQvZyxcbiAgICBzdHI6IHBhdGhcbiAgfSk7XG4gIHJldHVybiBwYXRoIHx8ICcvJztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
@@ -241,7 +241,17 @@ export declare function getAttachmentFolderPath(params: GetAttachmentFolderPathP
241
241
  */
242
242
  export declare function getAvailablePathForAttachments(params: GetAvailablePathForAttachmentsParams): Promise<string>;
243
243
  /**
244
- * Checks if a note has its own attachment folder.
244
+ * Checks whether a note's attachment folder is specific to that note rather than shared with its siblings.
245
+ *
246
+ * The answer is derived by comparing the note's attachment folder with the one a same-folder sibling note
247
+ * would get: they differ only when the folder depends on the note's NAME. Every built-in
248
+ * `attachmentFolderPath` mode — the vault root, a fixed folder, the note's own folder (`./`), a subfolder of
249
+ * the note's folder (`./sub`) — is shared by every note in that folder, so it answers `false`; `true` arises
250
+ * from a {@link GetAvailablePathForAttachmentsFnExtended.extended} override that derives the folder from the
251
+ * note's name (what an attachment-location plugin produces).
252
+ *
253
+ * This is the distinction a caller needs before sweeping an attachment folder wholesale: only a
254
+ * note-specific folder can be treated as belonging to the note.
245
255
  *
246
256
  * @param params - Parameters for the has own attachment folder function.
247
257
  * @returns A {@link Promise} that resolves to a boolean indicating whether the note has its own attachment folder.
@@ -152,6 +152,7 @@ __export(components_exports, {
152
152
  "plugin-notice-component": () => plugin_notice_component,
153
153
  "plugin-settings-component": () => plugin_settings_component,
154
154
  "plugin-settings-tab-component": () => plugin_settings_tab_component,
155
+ "pointer-position-component": () => pointer_position_component,
155
156
  "registry-component": () => registry_component,
156
157
  "rename-delete-handler-component": () => rename_delete_handler_component
157
158
  });
@@ -173,6 +174,7 @@ var plugin_context_component = __toESM(__extractDefault(require('./plugin-contex
173
174
  var plugin_notice_component = __toESM(__extractDefault(require('./plugin-notice-component.cjs')), 1);
174
175
  var plugin_settings_component = __toESM(__extractDefault(require('./plugin-settings-component.cjs')), 1);
175
176
  var plugin_settings_tab_component = __toESM(__extractDefault(require('./plugin-settings-tab-component.cjs')), 1);
177
+ var pointer_position_component = __toESM(__extractDefault(require('./pointer-position-component.cjs')), 1);
176
178
  var registry_component = __toESM(__extractDefault(require('./registry-component.cjs')), 1);
177
179
  var rename_delete_handler_component = __toESM(__extractDefault(require('./rename-delete-handler-component.cjs')), 1);
178
180
  // Annotate the CommonJS export names for ESM import in node:
@@ -194,7 +196,8 @@ var rename_delete_handler_component = __toESM(__extractDefault(require('./rename
194
196
  "plugin-notice-component": null,
195
197
  "plugin-settings-component": null,
196
198
  "plugin-settings-tab-component": null,
199
+ "pointer-position-component": null,
197
200
  "registry-component": null,
198
201
  "rename-delete-handler-component": null
199
202
  });
200
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdkaXNwb3NhYmxlLWNvbXBvbmVudCcgZnJvbSAnLi9kaXNwb3NhYmxlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQnIGZyb20gJy4vZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50JyBmcm9tICcuL2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdsYXlvdXQtcmVhZHktY29tcG9uZW50JyBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCcgZnJvbSAnLi9tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21vbmtleS1hcm91bmQtY29tcG9uZW50JyBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dC1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVnaXN0cnktY29tcG9uZW50JyBmcm9tICcuL3JlZ2lzdHJ5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxrQ0FBQUE7QUFBQSxFQUFBLHFDQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLCtDQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLDhCQUFBQztBQUFBLEVBQUEsb0NBQUFDO0FBQUEsRUFBQSx5REFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsd0NBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLGtDQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSxtQ0FBQUM7QUFBQSxFQUFBLHVDQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSx5Q0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQWxCLHlCQUEwQztBQUMxQyxJQUFBQyw4QkFBK0M7QUFDL0MsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyx3Q0FBeUQ7QUFDekQsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMsa0RBQW1FO0FBQ25FLElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxpQ0FBa0Q7QUFDbEQsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsNEJBQTZDO0FBQzdDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsa0NBQW1EOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1zaWduYWwtY29tcG9uZW50IiwgImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsICJhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCIsICJhc3luYy1ldmVudHMtY29tcG9uZW50IiwgImNhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQiLCAiY29tcG9uZW50LWV4IiwgImNvbnNvbGUtZGVidWctY29tcG9uZW50IiwgImRpc3Bvc2FibGUtY29tcG9uZW50IiwgImVtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50IiwgImdlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50IiwgImxheW91dC1yZWFkeS1jb21wb25lbnQiLCAibWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwgIm1vbmtleS1hcm91bmQtY29tcG9uZW50IiwgInBsdWdpbi1jb250ZXh0LWNvbXBvbmVudCIsICJwbHVnaW4tbm90aWNlLWNvbXBvbmVudCIsICJwbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50IiwgInBsdWdpbi1zZXR0aW5ncy10YWItY29tcG9uZW50IiwgInJlZ2lzdHJ5LWNvbXBvbmVudCIsICJyZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50Il0KfQo=
203
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdkaXNwb3NhYmxlLWNvbXBvbmVudCcgZnJvbSAnLi9kaXNwb3NhYmxlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQnIGZyb20gJy4vZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50JyBmcm9tICcuL2dlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdsYXlvdXQtcmVhZHktY29tcG9uZW50JyBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCcgZnJvbSAnLi9tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ21vbmtleS1hcm91bmQtY29tcG9uZW50JyBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dC1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQnIGZyb20gJy4vcG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlZ2lzdHJ5LWNvbXBvbmVudCcgZnJvbSAnLi9yZWdpc3RyeS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUEsa0NBQUFBO0FBQUEsRUFBQSxxQ0FBQUM7QUFBQSxFQUFBLHVDQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUEsRUFBQSwrQ0FBQUM7QUFBQSxFQUFBLHNCQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEseURBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLHdDQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSxrQ0FBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsbUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSx5Q0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQW5CLHlCQUEwQztBQUMxQyxJQUFBQyw4QkFBK0M7QUFDL0MsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyx3Q0FBeUQ7QUFDekQsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMsa0RBQW1FO0FBQ25FLElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxpQ0FBa0Q7QUFDbEQsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsNEJBQTZDO0FBQzdDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLGtDQUFtRDsiLAogICJuYW1lcyI6IFsiYWJvcnQtc2lnbmFsLWNvbXBvbmVudCIsICJhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQiLCAiYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQiLCAiYXN5bmMtZXZlbnRzLWNvbXBvbmVudCIsICJjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50IiwgImNvbXBvbmVudC1leCIsICJjb25zb2xlLWRlYnVnLWNvbXBvbmVudCIsICJkaXNwb3NhYmxlLWNvbXBvbmVudCIsICJlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCIsICJnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCIsICJsYXlvdXQtcmVhZHktY29tcG9uZW50IiwgIm1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsICJtb25rZXktYXJvdW5kLWNvbXBvbmVudCIsICJwbHVnaW4tY29udGV4dC1jb21wb25lbnQiLCAicGx1Z2luLW5vdGljZS1jb21wb25lbnQiLCAicGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCIsICJwbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudCIsICJwb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudCIsICJyZWdpc3RyeS1jb21wb25lbnQiLCAicmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCJdCn0K
@@ -16,5 +16,6 @@ export * as 'plugin-context-component' from './plugin-context-component.cjs';
16
16
  export * as 'plugin-notice-component' from './plugin-notice-component.cjs';
17
17
  export * as 'plugin-settings-component' from './plugin-settings-component.cjs';
18
18
  export * as 'plugin-settings-tab-component' from './plugin-settings-tab-component.cjs';
19
+ export * as 'pointer-position-component' from './pointer-position-component.cjs';
19
20
  export * as 'registry-component' from './registry-component.cjs';
20
21
  export * as 'rename-delete-handler-component' from './rename-delete-handler-component.cjs';
@@ -0,0 +1,159 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initCjs() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ const globalThisRecord = globalThis;
9
+ globalThisRecord['__name'] ??= name;
10
+ const originalRequire = require;
11
+ if (originalRequire && !originalRequire.__isPatched) {
12
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
+ require = Object.assign(
14
+ (id) => requirePatched(id),
15
+ originalRequire,
16
+ {
17
+ __isPatched: true
18
+ }
19
+ );
20
+ }
21
+
22
+ const newFuncs = {
23
+ __extractDefault() {
24
+ return extractDefault;
25
+ },
26
+ process() {
27
+ const browserProcess = {
28
+ browser: true,
29
+ cwd() {
30
+ return '/';
31
+ },
32
+ env: {},
33
+ platform: 'android'
34
+ };
35
+ return browserProcess;
36
+ }
37
+ };
38
+
39
+ for (const key of Object.keys(newFuncs)) {
40
+ globalThisRecord[key] ??= newFuncs[key]?.();
41
+ }
42
+
43
+ function name(obj) {
44
+ return obj;
45
+ }
46
+
47
+ function extractDefault(module) {
48
+ return module && module.__esModule && 'default' in module ? module.default : module;
49
+ }
50
+
51
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
+ 'obsidian',
53
+ '@codemirror/autocomplete',
54
+ '@codemirror/collab',
55
+ '@codemirror/commands',
56
+ '@codemirror/language',
57
+ '@codemirror/lint',
58
+ '@codemirror/search',
59
+ '@codemirror/state',
60
+ '@codemirror/text',
61
+ '@codemirror/view',
62
+ '@lezer/common',
63
+ '@lezer/lr',
64
+ '@lezer/highlight'];
65
+
66
+
67
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
+ '@codemirror/closebrackets',
69
+ '@codemirror/comment',
70
+ '@codemirror/fold',
71
+ '@codemirror/gutter',
72
+ '@codemirror/highlight',
73
+ '@codemirror/history',
74
+ '@codemirror/matchbrackets',
75
+ '@codemirror/panel',
76
+ '@codemirror/rangeset',
77
+ '@codemirror/rectangular-selection',
78
+ '@codemirror/stream-parser',
79
+ '@codemirror/tooltip'];
80
+
81
+
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+
87
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
+ if (globalThis.app.isMobile) {
89
+ if (id === 'process' || id === 'node:process') {
90
+ // eslint-disable-next-line no-console -- Valid usage.
91
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
+ return globalThis.process;
94
+ }
95
+ } else {
96
+ const module = originalRequire?.(id);
97
+ if (module) {
98
+ return extractDefault(module);
99
+ }
100
+ }
101
+
102
+ // eslint-disable-next-line no-console -- Valid usage.
103
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
+ return {};
105
+ }
106
+ })();
107
+
108
+ "use strict";
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
113
+ var __export = (target, all) => {
114
+ for (var name in all)
115
+ __defProp(target, name, { get: all[name], enumerable: true });
116
+ };
117
+ var __copyProps = (to, from, except, desc) => {
118
+ if (from && typeof from === "object" || typeof from === "function") {
119
+ for (let key of __getOwnPropNames(from))
120
+ if (!__hasOwnProp.call(to, key) && key !== except)
121
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
+ }
123
+ return to;
124
+ };
125
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
+ var pointer_position_component_exports = {};
127
+ __export(pointer_position_component_exports, {
128
+ PointerPositionComponent: () => PointerPositionComponent
129
+ });
130
+ module.exports = __toCommonJS(pointer_position_component_exports);
131
+ var import_popover_anchor = require('../popovers/popover-anchor.cjs');
132
+ var import_all_windows_event_component = require('./all-windows-event-component.cjs');
133
+ class PointerPositionComponent extends import_all_windows_event_component.AllWindowsEventComponent {
134
+ lastAnchor = null;
135
+ /**
136
+ * The anchor for the last pointer gesture.
137
+ *
138
+ * @returns The anchor, or `null` when no pointer gesture has happened yet.
139
+ */
140
+ getLastPointerAnchor() {
141
+ return this.lastAnchor;
142
+ }
143
+ /**
144
+ * Starts recording pointer gestures in every window.
145
+ */
146
+ onload() {
147
+ super.onload();
148
+ this.registerAllWindowsHandler((win) => {
149
+ this.registerDomEvent(win.document, "pointerdown", (evt) => {
150
+ this.lastAnchor = (0, import_popover_anchor.createAnchorFromPoint)(evt.clientX, evt.clientY, win.document);
151
+ }, { capture: true });
152
+ });
153
+ }
154
+ }
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ PointerPositionComponent
158
+ });
159
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZW1lbWJlcnMgd2hlcmUgdGhlIGxhc3QgcG9pbnRlciBnZXN0dXJlIGhhcHBlbmVkLCBzbyBVSSBjYW4gYmUgYW5jaG9yZWQgdGhlcmUuXG4gKlxuICogQSBjb250ZXh0IG1lbnUgaXMgdGhlIHJlYXNvbiB0aGlzIGV4aXN0czogT2JzaWRpYW4ncyBgZmlsZS1tZW51YCAvIGB1cmwtbWVudWAgZXZlbnRzIGNhcnJ5IHRoZVxuICogdGFyZ2V0IGZpbGUgb3IgdXJsIGJ1dCBubyBldmVudCBhbmQgbm8gRE9NIGVsZW1lbnQsIGFuZCBieSB0aGUgdGltZSBhIG1lbnUgaXRlbSdzIGNhbGxiYWNrIHJ1bnMgdGhlXG4gKiBtZW51IGlzIGNsb3NpbmcgXHUyMDE0IHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBtZWFzdXJlLiBUaGUgcmlnaHQtY2xpY2sgKG9yIGxvbmctcHJlc3MpIHRoYXQgcmFpc2VkXG4gKiB0aGUgbWVudSBpcywgaG93ZXZlciwgZXhhY3RseSB3aGVyZSB0aGUgdXNlciBpcyBsb29raW5nLCBhbmQgaXQgYWx3YXlzIHByZWNlZGVzIHRoZSBtZW51LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUG9wb3ZlckFuY2hvciB9IGZyb20gJy4uL3BvcG92ZXJzL3BvcG92ZXItYW5jaG9yLnRzJztcblxuaW1wb3J0IHsgY3JlYXRlQW5jaG9yRnJvbVBvaW50IH0gZnJvbSAnLi4vcG9wb3ZlcnMvcG9wb3Zlci1hbmNob3IudHMnO1xuaW1wb3J0IHsgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFJlY29yZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IHBvaW50ZXIgZ2VzdHVyZSBpbiBhbnkgd2luZG93LlxuICovXG5leHBvcnQgY2xhc3MgUG9pbnRlclBvc2l0aW9uQ29tcG9uZW50IGV4dGVuZHMgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBsYXN0QW5jaG9yOiBudWxsIHwgUG9wb3ZlckFuY2hvciA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgZm9yIHRoZSBsYXN0IHBvaW50ZXIgZ2VzdHVyZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGFuY2hvciwgb3IgYG51bGxgIHdoZW4gbm8gcG9pbnRlciBnZXN0dXJlIGhhcyBoYXBwZW5lZCB5ZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TGFzdFBvaW50ZXJBbmNob3IoKTogbnVsbCB8IFBvcG92ZXJBbmNob3Ige1xuICAgIHJldHVybiB0aGlzLmxhc3RBbmNob3I7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHJlY29yZGluZyBwb2ludGVyIGdlc3R1cmVzIGluIGV2ZXJ5IHdpbmRvdy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvKlxuICAgICAqIFJlZ2lzdGVyZWQgcGVyIHdpbmRvdyByYXRoZXIgdGhhbiB0aHJvdWdoIGByZWdpc3RlckFsbERvY3VtZW50c0RvbUV2ZW50YCBzbyB0aGUgZG9jdW1lbnQgaXNcbiAgICAgKiB0YWtlbiBmcm9tIHRoZSB3aW5kb3cgdGhlIGxpc3RlbmVyIGJlbG9uZ3MgdG8uIERlcml2aW5nIGl0IGZyb20gdGhlIGV2ZW50IHRhcmdldCBpbnN0ZWFkIHdvdWxkXG4gICAgICogYWRkIGEgYnJhbmNoIHRoYXQgYSBkb2N1bWVudC1sZXZlbCBsaXN0ZW5lciBjYW4gbmV2ZXIgdGFrZS5cbiAgICAgKlxuICAgICAqIGBwb2ludGVyZG93bmAgcmF0aGVyIHRoYW4gYGNsaWNrYCAvIGBjb250ZXh0bWVudWA6IGl0IGZpcmVzIGZvciBldmVyeSBidXR0b24gYW5kIGZvciB0b3VjaCwgc29cbiAgICAgKiBvbmUgbGlzdGVuZXIgY292ZXJzIGEgZGVza3RvcCByaWdodC1jbGljayBhbmQgYSBtb2JpbGUgbG9uZy1wcmVzcyBhbGlrZSwgYW5kIGl0IGFsd2F5cyBydW5zXG4gICAgICogYmVmb3JlIHRoZSBtZW51IG9wZW5zLlxuICAgICAqL1xuICAgIHRoaXMucmVnaXN0ZXJBbGxXaW5kb3dzSGFuZGxlcigod2luKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRG9tRXZlbnQod2luLmRvY3VtZW50LCAncG9pbnRlcmRvd24nLCAoZXZ0KSA9PiB7XG4gICAgICAgIHRoaXMubGFzdEFuY2hvciA9IGNyZWF0ZUFuY2hvckZyb21Qb2ludChldnQuY2xpZW50WCwgZXZ0LmNsaWVudFksIHdpbi5kb2N1bWVudCk7XG4gICAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBLDRCQUFzQztBQUN0Qyx5Q0FBeUM7QUFLbEMsTUFBTSxpQ0FBaUMsNERBQXlCO0FBQUEsRUFDN0QsYUFBbUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPcEMsdUJBQTZDO0FBQ2xELFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQVdiLFNBQUssMEJBQTBCLENBQUMsUUFBUTtBQUN0QyxXQUFLLGlCQUFpQixJQUFJLFVBQVUsZUFBZSxDQUFDLFFBQVE7QUFDMUQsYUFBSyxpQkFBYSw2Q0FBc0IsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFFBQVE7QUFBQSxNQUNoRixHQUFHLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxJQUN0QixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,29 @@
1
+ /// <reference path="../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Remembers where the last pointer gesture happened, so UI can be anchored there.
6
+ *
7
+ * A context menu is the reason this exists: Obsidian's `file-menu` / `url-menu` events carry the
8
+ * target file or url but no event and no DOM element, and by the time a menu item's callback runs the
9
+ * menu is closing — so there is nothing left to measure. The right-click (or long-press) that raised
10
+ * the menu is, however, exactly where the user is looking, and it always precedes the menu.
11
+ */
12
+ import type { PopoverAnchor } from '../popovers/popover-anchor.cjs';
13
+ import { AllWindowsEventComponent } from './all-windows-event-component.cjs';
14
+ /**
15
+ * Records the position of the last pointer gesture in any window.
16
+ */
17
+ export declare class PointerPositionComponent extends AllWindowsEventComponent {
18
+ private lastAnchor;
19
+ /**
20
+ * The anchor for the last pointer gesture.
21
+ *
22
+ * @returns The anchor, or `null` when no pointer gesture has happened yet.
23
+ */
24
+ getLastPointerAnchor(): null | PopoverAnchor;
25
+ /**
26
+ * Starts recording pointer gestures in every window.
27
+ */
28
+ onload(): void;
29
+ }