obsidian-dev-utils 84.6.1 → 85.0.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 (216) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/dev/main.js +32688 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/async-events.cjs +4 -1
  5. package/dist/lib/cjs/async-events.d.cts +4 -1
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/active-file-provider.cjs +1 -1
  8. package/dist/lib/cjs/obsidian/active-file-provider.d.cts +1 -1
  9. package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +1 -1
  10. package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +1 -1
  11. package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +1 -1
  13. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +16 -1
  14. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +20 -5
  15. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +6 -3
  16. package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
  17. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +7 -1
  18. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.d.cts +8 -2
  19. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +183 -0
  20. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
  21. package/dist/lib/cjs/obsidian/command-registrar.cjs +1 -1
  22. package/dist/lib/cjs/obsidian/command-registrar.d.cts +1 -1
  23. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +1 -1
  24. package/dist/lib/cjs/obsidian/components/abort-signal-component.d.cts +1 -1
  25. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +1 -1
  26. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +1 -1
  27. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +1 -1
  28. package/dist/lib/cjs/obsidian/components/async-error-handler-component.d.cts +1 -1
  29. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +7 -1
  30. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +9 -2
  31. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +1 -1
  32. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +1 -1
  33. package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +1 -1
  34. package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +1 -1
  35. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +4 -1
  36. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.d.cts +4 -1
  37. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +1 -1
  38. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +1 -1
  39. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +1 -1
  40. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +1 -1
  41. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +7 -1
  42. package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +8 -2
  43. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +1 -1
  44. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +1 -1
  45. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +13 -4
  46. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +12 -3
  47. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +7 -1
  48. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +8 -2
  49. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +29 -8
  50. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +34 -7
  51. package/dist/lib/cjs/obsidian/data-handler.cjs +1 -1
  52. package/dist/lib/cjs/obsidian/data-handler.d.cts +1 -1
  53. package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +1 -1
  54. package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +1 -1
  55. package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +1 -1
  56. package/dist/lib/cjs/obsidian/editor-suggest-registrar.d.cts +1 -1
  57. package/dist/lib/cjs/obsidian/extensions-registrar.cjs +1 -1
  58. package/dist/lib/cjs/obsidian/extensions-registrar.d.cts +1 -1
  59. package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +1 -1
  60. package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +1 -1
  61. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  62. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  63. package/dist/lib/cjs/obsidian/link.cjs +79 -244
  64. package/dist/lib/cjs/obsidian/link.d.cts +82 -148
  65. package/dist/lib/cjs/obsidian/loop.cjs +2 -2
  66. package/dist/lib/cjs/obsidian/loop.d.cts +17 -3
  67. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +4 -1
  68. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +4 -1
  69. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +1 -1
  70. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +1 -1
  71. package/dist/lib/cjs/obsidian/metadata-cache.cjs +141 -43
  72. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +171 -9
  73. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +7 -4
  74. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +8 -1
  75. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +4 -1
  76. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +4 -1
  77. package/dist/lib/cjs/obsidian/parse-link.cjs +476 -0
  78. package/dist/lib/cjs/obsidian/parse-link.d.cts +268 -0
  79. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +1 -1
  80. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +1 -1
  81. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +1 -1
  82. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +1 -1
  83. package/dist/lib/cjs/obsidian/resource-lock.cjs +155 -20
  84. package/dist/lib/cjs/obsidian/resource-lock.d.cts +93 -22
  85. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +1 -1
  86. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +1 -1
  87. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -16
  88. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +17 -5
  89. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +4 -1
  90. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +5 -2
  91. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +11 -2
  92. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +12 -3
  93. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +8 -2
  94. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +9 -3
  95. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +8 -2
  96. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +9 -2
  97. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +1 -1
  98. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +1 -1
  99. package/dist/lib/cjs/obsidian/vault-transaction.cjs +4 -1
  100. package/dist/lib/cjs/obsidian/vault-transaction.d.cts +4 -1
  101. package/dist/lib/cjs/obsidian/vault.cjs +2 -2
  102. package/dist/lib/cjs/obsidian/view-registrar.cjs +1 -1
  103. package/dist/lib/cjs/obsidian/view-registrar.d.cts +1 -1
  104. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +4 -2
  105. package/dist/lib/cjs/transformers/group-transformer.cjs +1 -1
  106. package/dist/lib/cjs/transformers/group-transformer.d.cts +1 -1
  107. package/dist/lib/cjs/url.cjs +14 -3
  108. package/dist/lib/cjs/url.d.cts +15 -0
  109. package/dist/lib/esm/async-events.d.mts +4 -1
  110. package/dist/lib/esm/async-events.mjs +4 -1
  111. package/dist/lib/esm/generated-during-build.mjs +1 -1
  112. package/dist/lib/esm/obsidian/active-file-provider.d.mts +1 -1
  113. package/dist/lib/esm/obsidian/active-file-provider.mjs +1 -1
  114. package/dist/lib/esm/obsidian/bases-view-registrar.d.mts +1 -1
  115. package/dist/lib/esm/obsidian/bases-view-registrar.mjs +1 -1
  116. package/dist/lib/esm/obsidian/case-insensitive-file-index.d.mts +1 -1
  117. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +1 -1
  118. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +20 -5
  119. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +16 -1
  120. package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
  121. package/dist/lib/esm/obsidian/command-handlers/index.mjs +4 -2
  122. package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.d.mts +8 -2
  123. package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.mjs +7 -1
  124. package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
  125. package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.mjs +75 -0
  126. package/dist/lib/esm/obsidian/command-registrar.d.mts +1 -1
  127. package/dist/lib/esm/obsidian/command-registrar.mjs +1 -1
  128. package/dist/lib/esm/obsidian/components/abort-signal-component.d.mts +1 -1
  129. package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +1 -1
  130. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +1 -1
  131. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
  132. package/dist/lib/esm/obsidian/components/async-error-handler-component.d.mts +1 -1
  133. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +1 -1
  134. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.d.mts +9 -2
  135. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.mjs +7 -1
  136. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +1 -1
  137. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +1 -1
  138. package/dist/lib/esm/obsidian/components/embed-extensions-component.d.mts +1 -1
  139. package/dist/lib/esm/obsidian/components/embed-extensions-component.mjs +1 -1
  140. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.d.mts +4 -1
  141. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.mjs +4 -1
  142. package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +1 -1
  143. package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +1 -1
  144. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +1 -1
  145. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +1 -1
  146. package/dist/lib/esm/obsidian/components/plugin-context-component.d.mts +8 -2
  147. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +7 -1
  148. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +1 -1
  149. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +1 -1
  150. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +12 -3
  151. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +13 -4
  152. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.d.mts +8 -2
  153. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +7 -1
  154. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +34 -7
  155. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +30 -9
  156. package/dist/lib/esm/obsidian/data-handler.d.mts +1 -1
  157. package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
  158. package/dist/lib/esm/obsidian/editor-extension-registrar.d.mts +1 -1
  159. package/dist/lib/esm/obsidian/editor-extension-registrar.mjs +1 -1
  160. package/dist/lib/esm/obsidian/editor-suggest-registrar.d.mts +1 -1
  161. package/dist/lib/esm/obsidian/editor-suggest-registrar.mjs +1 -1
  162. package/dist/lib/esm/obsidian/extensions-registrar.d.mts +1 -1
  163. package/dist/lib/esm/obsidian/extensions-registrar.mjs +1 -1
  164. package/dist/lib/esm/obsidian/hover-link-source-registrar.d.mts +1 -1
  165. package/dist/lib/esm/obsidian/hover-link-source-registrar.mjs +1 -1
  166. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  167. package/dist/lib/esm/obsidian/index.mjs +3 -1
  168. package/dist/lib/esm/obsidian/link.d.mts +82 -148
  169. package/dist/lib/esm/obsidian/link.mjs +76 -222
  170. package/dist/lib/esm/obsidian/loop.d.mts +17 -3
  171. package/dist/lib/esm/obsidian/loop.mjs +2 -2
  172. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +4 -1
  173. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +4 -1
  174. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +1 -1
  175. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +1 -1
  176. package/dist/lib/esm/obsidian/metadata-cache.d.mts +171 -9
  177. package/dist/lib/esm/obsidian/metadata-cache.mjs +142 -42
  178. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +8 -1
  179. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +7 -4
  180. package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.d.mts +4 -1
  181. package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.mjs +4 -1
  182. package/dist/lib/esm/obsidian/parse-link.d.mts +268 -0
  183. package/dist/lib/esm/obsidian/parse-link.mjs +353 -0
  184. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +1 -1
  185. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +1 -1
  186. package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.d.mts +1 -1
  187. package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.mjs +1 -1
  188. package/dist/lib/esm/obsidian/resource-lock.d.mts +93 -22
  189. package/dist/lib/esm/obsidian/resource-lock.mjs +155 -20
  190. package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +1 -1
  191. package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
  192. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +17 -5
  193. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +28 -16
  194. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +5 -2
  195. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +4 -1
  196. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +12 -3
  197. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +11 -2
  198. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +9 -3
  199. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +8 -2
  200. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +9 -2
  201. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -2
  202. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +1 -1
  203. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +1 -1
  204. package/dist/lib/esm/obsidian/vault-transaction.d.mts +4 -1
  205. package/dist/lib/esm/obsidian/vault-transaction.mjs +4 -1
  206. package/dist/lib/esm/obsidian/vault.mjs +2 -2
  207. package/dist/lib/esm/obsidian/view-registrar.d.mts +1 -1
  208. package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
  209. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +4 -2
  210. package/dist/lib/esm/transformers/group-transformer.d.mts +1 -1
  211. package/dist/lib/esm/transformers/group-transformer.mjs +1 -1
  212. package/dist/lib/esm/url.d.mts +15 -0
  213. package/dist/lib/esm/url.mjs +11 -2
  214. package/obsidian/command-handlers/unlock-active-note-command-handler/package.json +6 -0
  215. package/obsidian/parse-link/package.json +6 -0
  216. package/package.json +3 -3
@@ -0,0 +1,476 @@
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 __create = Object.create;
110
+ var __defProp = Object.defineProperty;
111
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
112
+ var __getOwnPropNames = Object.getOwnPropertyNames;
113
+ var __getProtoOf = Object.getPrototypeOf;
114
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
115
+ var __export = (target, all) => {
116
+ for (var name in all)
117
+ __defProp(target, name, { get: all[name], enumerable: true });
118
+ };
119
+ var __copyProps = (to, from, except, desc) => {
120
+ if (from && typeof from === "object" || typeof from === "function") {
121
+ for (let key of __getOwnPropNames(from))
122
+ if (!__hasOwnProp.call(to, key) && key !== except)
123
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
124
+ }
125
+ return to;
126
+ };
127
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
128
+ // If the importer is in node compatibility mode or this is not an ESM
129
+ // file that has been converted to a CommonJS file using a Babel-
130
+ // compatible transform (i.e. "__esModule" has not been set), then set
131
+ // "default" to the CommonJS "module.exports" for node compatibility.
132
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
133
+ mod
134
+ ));
135
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
136
+ var parse_link_exports = {};
137
+ __export(parse_link_exports, {
138
+ encodeUrl: () => encodeUrl,
139
+ escapeAlias: () => escapeAlias,
140
+ isParseLinkFrontmatterReference: () => isParseLinkFrontmatterReference,
141
+ isParseLinkReference: () => isParseLinkReference,
142
+ parseFrontmatterLinks: () => parseFrontmatterLinks,
143
+ parseLink: () => parseLink,
144
+ parseLinks: () => parseLinks,
145
+ toParseLinkReference: () => toParseLinkReference,
146
+ unescapeAlias: () => unescapeAlias
147
+ });
148
+ module.exports = __toCommonJS(parse_link_exports);
149
+ var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
150
+ var import_remark = require('remark');
151
+ var import_remark_parse = __toESM(__extractDefault(require('remark-parse')), 1);
152
+ var import_remark_wiki_link = require('remark-wiki-link');
153
+ var import_unist_util_visit = require('unist-util-visit');
154
+ var import_object_utils = require('../object-utils.cjs');
155
+ var import_string = require('../string.cjs');
156
+ var import_type_guards = require('../type-guards.cjs');
157
+ var import_url = require('../url.cjs');
158
+ const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
159
+ const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
160
+ const WIKILINK_DIVIDER = "|";
161
+ class FrontmatterLinksParser {
162
+ frontmatterExternalLinks = [];
163
+ multiValueFrontmatterExternalLinks = [];
164
+ multiValueFrontmatterLinks = [];
165
+ parse(frontmatter) {
166
+ this.parseValue(frontmatter, "");
167
+ return {
168
+ frontmatterExternalLinks: this.frontmatterExternalLinks,
169
+ multiValueFrontmatterExternalLinks: this.multiValueFrontmatterExternalLinks,
170
+ multiValueFrontmatterLinks: this.multiValueFrontmatterLinks
171
+ };
172
+ }
173
+ categorize(params) {
174
+ const { isSingleLink, key, parseLinkResult, value } = params;
175
+ if (!parseLinkResult.isExternal && isSingleLink) {
176
+ return;
177
+ }
178
+ const reference = {
179
+ displayText: parseLinkResult.alias ?? parseLinkResult.url,
180
+ key,
181
+ link: parseLinkResult.url,
182
+ original: value,
183
+ parseLinkResult
184
+ };
185
+ if (isSingleLink) {
186
+ this.frontmatterExternalLinks.push(reference);
187
+ return;
188
+ }
189
+ const referenceWithOffsets = {
190
+ ...reference,
191
+ endOffset: parseLinkResult.endOffset,
192
+ startOffset: parseLinkResult.startOffset
193
+ };
194
+ if (parseLinkResult.isExternal) {
195
+ this.multiValueFrontmatterExternalLinks.push(referenceWithOffsets);
196
+ } else {
197
+ this.multiValueFrontmatterLinks.push(referenceWithOffsets);
198
+ }
199
+ }
200
+ parseValue(value, key) {
201
+ if (typeof value === "string") {
202
+ const parseLinkResults = parseLinks(value);
203
+ const isSingleLink = parseLinkResults[0]?.raw === value;
204
+ for (const parseLinkResult of parseLinkResults) {
205
+ this.categorize({ isSingleLink, key, parseLinkResult, value });
206
+ }
207
+ return;
208
+ }
209
+ if (typeof value !== "object" || value === null) {
210
+ return;
211
+ }
212
+ for (const [childKey, childValue] of Object.entries(value)) {
213
+ this.parseValue(childValue, key ? `${key}.${childKey}` : childKey);
214
+ }
215
+ }
216
+ }
217
+ function encodeUrl(url) {
218
+ return (0, import_string.replaceAll)({
219
+ replacer: ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol),
220
+ searchValue: SPECIAL_LINK_SYMBOLS_REGEXP,
221
+ str: url
222
+ });
223
+ }
224
+ function escapeAlias(alias) {
225
+ return (0, import_string.replaceAll)({
226
+ replacer: "\\$&",
227
+ searchValue: SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX,
228
+ str: alias
229
+ });
230
+ }
231
+ function isParseLinkFrontmatterReference(reference) {
232
+ return (0, import_implementations.isFrontmatterLinkCache)(reference) && "parseLinkResult" in reference;
233
+ }
234
+ function isParseLinkReference(reference) {
235
+ return "parseLinkResult" in reference;
236
+ }
237
+ function parseFrontmatterLinks(frontmatter) {
238
+ return new FrontmatterLinksParser().parse(frontmatter);
239
+ }
240
+ function parseLink(str) {
241
+ const links = parseLinks(str);
242
+ return links[0]?.raw === str ? links[0] : null;
243
+ }
244
+ function parseLinks(str) {
245
+ const embedSymbolOffsets = /* @__PURE__ */ new Set();
246
+ const EMBED_LINK_PREFIX = "![";
247
+ const NO_EMBED_LINK_PREFIX = "@[";
248
+ const DUMMY_CHARACTER = "@";
249
+ const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g;
250
+ const noInsideEmbedsLinksStr = (0, import_string.replaceAll)({
251
+ replacer: ({ capturedGroupArgs: [linkAlias = "", link = ""] }) => {
252
+ const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
253
+ return `[${dummyAlias}](${link})`;
254
+ },
255
+ searchValue: EMBED_INSIDE_LINK_REG_EXP,
256
+ str
257
+ });
258
+ const noEmbedStr = (0, import_string.replaceAll)({
259
+ replacer: (args) => {
260
+ embedSymbolOffsets.add(args.offset);
261
+ return NO_EMBED_LINK_PREFIX;
262
+ },
263
+ searchValue: EMBED_LINK_PREFIX,
264
+ str: noInsideEmbedsLinksStr
265
+ });
266
+ const processor = (0, import_remark.remark)().use(import_remark_parse.default).use(import_remark_wiki_link.wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
267
+ const root = processor.parse(noEmbedStr);
268
+ const links = [];
269
+ const textLinks = [];
270
+ (0, import_unist_util_visit.visit)(root, (node) => {
271
+ let link;
272
+ switch (node.type) {
273
+ case "link":
274
+ link = parseLinkNode(node, str);
275
+ break;
276
+ case "wikiLink":
277
+ link = parseWikilinkNode(node, str);
278
+ break;
279
+ default:
280
+ return;
281
+ }
282
+ if (embedSymbolOffsets.has(link.startOffset - 1)) {
283
+ link = {
284
+ ...link,
285
+ isEmbed: true,
286
+ raw: `!${link.raw}`,
287
+ startOffset: link.startOffset - 1
288
+ };
289
+ }
290
+ links.push(link);
291
+ });
292
+ links.sort((a, b) => a.startOffset - b.startOffset);
293
+ let textStartOffset = 0;
294
+ for (const link of links) {
295
+ extractTextLinks({
296
+ endOffset: link.startOffset - 1,
297
+ startOffset: textStartOffset,
298
+ str,
299
+ textLinks
300
+ });
301
+ textStartOffset = link.endOffset + 1;
302
+ }
303
+ extractTextLinks({
304
+ endOffset: str.length - 1,
305
+ startOffset: textStartOffset,
306
+ str,
307
+ textLinks
308
+ });
309
+ links.push(...textLinks);
310
+ links.sort((a, b) => a.startOffset - b.startOffset);
311
+ return links;
312
+ }
313
+ function toParseLinkReference(params) {
314
+ const { content, parseLinkResult } = params;
315
+ const reference = {
316
+ link: parseLinkResult.url,
317
+ original: parseLinkResult.raw,
318
+ parseLinkResult,
319
+ position: {
320
+ end: offsetToLoc(content, parseLinkResult.endOffset),
321
+ start: offsetToLoc(content, parseLinkResult.startOffset)
322
+ }
323
+ };
324
+ if (parseLinkResult.alias !== void 0) {
325
+ reference.displayText = parseLinkResult.alias;
326
+ }
327
+ return reference;
328
+ }
329
+ function unescapeAlias(escapedAlias) {
330
+ return (0, import_string.replaceAll)({
331
+ replacer: ({ capturedGroupArgs: [backslashes = "", specialChar = ""] }) => {
332
+ const ESCAPED_BACKSLASH_LENGTH = 2;
333
+ const backslashCount = backslashes.length;
334
+ const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH);
335
+ return "\\".repeat(keepCount) + specialChar;
336
+ },
337
+ searchValue: /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g,
338
+ str: escapedAlias
339
+ });
340
+ }
341
+ function decodeUrlSafely(params) {
342
+ const { hasAngleBrackets, isExternal, url } = params;
343
+ if ((isExternal || hasAngleBrackets) && !(0, import_url.isFileUrl)(url)) {
344
+ return url;
345
+ }
346
+ try {
347
+ return decodeURIComponent(url);
348
+ } catch (error) {
349
+ console.error(`Failed to decode URL ${url}`, error);
350
+ return url;
351
+ }
352
+ }
353
+ function extractAlias(params) {
354
+ const { aliasEndOffset, aliasStartOffset, str } = params;
355
+ return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0;
356
+ }
357
+ function extractTextLinks(params) {
358
+ const { endOffset, startOffset, str, textLinks } = params;
359
+ if (startOffset > endOffset) {
360
+ return;
361
+ }
362
+ const textPart = str.slice(startOffset, endOffset + 1);
363
+ (0, import_string.replaceAll)({
364
+ replacer: ({ capturedGroupArgs: [rawUrl = ""], offset }) => {
365
+ if (!(0, import_url.isUrl)(rawUrl)) {
366
+ return;
367
+ }
368
+ const url = decodeUrlSafely({
369
+ hasAngleBrackets: false,
370
+ isExternal: true,
371
+ url: rawUrl
372
+ });
373
+ textLinks.push({
374
+ encodedUrl: encodeUrl(url),
375
+ endOffset: startOffset + offset + rawUrl.length,
376
+ hasAngleBrackets: false,
377
+ isEmbed: false,
378
+ isExternal: true,
379
+ isFileUrl: (0, import_url.isFileUrl)(url),
380
+ isWikilink: false,
381
+ raw: rawUrl,
382
+ startOffset: startOffset + offset,
383
+ url
384
+ });
385
+ },
386
+ searchValue: /(?<Url>\S+)/g,
387
+ str: textPart
388
+ });
389
+ }
390
+ function getRawLink(node, str) {
391
+ const pos = (0, import_type_guards.ensureNonNullable)(node.position);
392
+ return str.slice(pos.start.offset, pos.end.offset);
393
+ }
394
+ function hasAngleBracketsInLink(params) {
395
+ const { raw, rawUrl } = params;
396
+ const OPEN_ANGLE_BRACKET = "<";
397
+ return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
398
+ }
399
+ function offsetToLoc(content, offset) {
400
+ const precedingContent = content.slice(0, offset);
401
+ const line = (precedingContent.match(/\n/g) ?? []).length;
402
+ const lastNewlineOffset = precedingContent.lastIndexOf("\n");
403
+ return {
404
+ col: offset - (lastNewlineOffset + 1),
405
+ line,
406
+ offset
407
+ };
408
+ }
409
+ function parseLinkNode(node, str) {
410
+ const LINK_ALIAS_SUFFIX = "](";
411
+ const LINK_SUFFIX = ")";
412
+ const raw = getRawLink(node, str);
413
+ const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1;
414
+ const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1;
415
+ const position = (0, import_type_guards.ensureNonNullable)(node.position);
416
+ const nodeEndOffset = (0, import_type_guards.ensureNonNullable)(position.end.offset);
417
+ const nodeStartOffset = (0, import_type_guards.ensureNonNullable)(position.start.offset);
418
+ const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, nodeEndOffset - LINK_SUFFIX.length);
419
+ const hasAngleBrackets = hasAngleBracketsInLink({
420
+ raw,
421
+ rawUrl
422
+ });
423
+ const isExternal = (0, import_url.isUrl)(node.url);
424
+ const url = decodeUrlSafely({
425
+ hasAngleBrackets,
426
+ isExternal,
427
+ url: node.url
428
+ });
429
+ const alias = extractAlias({
430
+ aliasEndOffset: aliasNodeEndOffset,
431
+ aliasStartOffset: aliasNodeStartOffset,
432
+ str
433
+ });
434
+ return (0, import_object_utils.normalizeOptionalProperties)({
435
+ alias,
436
+ encodedUrl: isExternal ? encodeUrl(url) : void 0,
437
+ endOffset: nodeEndOffset,
438
+ hasAngleBrackets,
439
+ isEmbed: false,
440
+ isExternal,
441
+ isFileUrl: (0, import_url.isFileUrl)(url),
442
+ isWikilink: false,
443
+ raw,
444
+ startOffset: nodeStartOffset,
445
+ title: node.title ?? void 0,
446
+ unescapedAlias: alias === void 0 ? void 0 : unescapeAlias(alias),
447
+ url
448
+ });
449
+ }
450
+ function parseWikilinkNode(node, str) {
451
+ const position = (0, import_type_guards.ensureNonNullable)(node.position);
452
+ return (0, import_object_utils.normalizeOptionalProperties)({
453
+ alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
454
+ endOffset: (0, import_type_guards.ensureNonNullable)(position.end.offset),
455
+ isEmbed: false,
456
+ isExternal: false,
457
+ isFileUrl: false,
458
+ isWikilink: true,
459
+ raw: getRawLink(node, str),
460
+ startOffset: (0, import_type_guards.ensureNonNullable)(position.start.offset),
461
+ url: node.value
462
+ });
463
+ }
464
+ // Annotate the CommonJS export names for ESM import in node:
465
+ 0 && (module.exports = {
466
+ encodeUrl,
467
+ escapeAlias,
468
+ isParseLinkFrontmatterReference,
469
+ isParseLinkReference,
470
+ parseFrontmatterLinks,
471
+ parseLink,
472
+ parseLinks,
473
+ toParseLinkReference,
474
+ unescapeAlias
475
+ });
476
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BhcnNlLWxpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIHBhcnNpbmcgbWFya2Rvd24gYW5kIHdpa2kgbGlua3MgaW50byBzdHJ1Y3R1cmVkIGRhdGEsIGFuZCBmb3JcbiAqIGVzY2FwaW5nLCB1bmVzY2FwaW5nLCBhbmQgZW5jb2RpbmcgbGluayBjb21wb25lbnRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTGluayB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB0eXBlIHtcbiAgRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIExvYyxcbiAgUmVmZXJlbmNlLFxuICBSZWZlcmVuY2VDYWNoZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IE5vZGUgfSBmcm9tICd1bmlzdCc7XG5cbmltcG9ydCB7IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIGlzRmlsZVVybCxcbiAgaXNVcmxcbn0gZnJvbSAnLi4vdXJsLnRzJztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBUaGUgcmVndWxhciBleHByZXNzaW9uIGlzIHdyaXR0ZW4gdG8gY2FwdHVyZSBjb250cm9sIGNoYXJhY3RlcnMuXG5jb25zdCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAgPSAvW1xcXFxcXHgwMFxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGIF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbWFya2Rvd24gbGluayBzeW1ib2xzLlxuICovXG5jb25zdCBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCA9IC9bXFxcXFtcXF08Pl8qfj1gJF0vZztcblxuY29uc3QgV0lLSUxJTktfRElWSURFUiA9ICd8JztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmtzIGZyb20gYSBub3RlJ3MgZnJvbnRtYXR0ZXIgdmlhIHtAbGluayBwYXJzZUZyb250bWF0dGVyTGlua3N9LiBJbnRlcm5hbFxuICogc2luZ2xlLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWVzIGFyZSBvbWl0dGVkLCBhcyBPYnNpZGlhbiBuYXRpdmVseSBjYWNoZXMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUZyb250bWF0dGVyTGlua3NSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBGcm9udG1hdHRlckxpbmtDYWNoZX0gZm9yIGEgbGluayBwYXJzZWQgZnJvbSBhIHNpbmdsZS1saW5rIGZyb250bWF0dGVyIHZhbHVlIHZpYVxuICoge0BsaW5rIHBhcnNlTGlua3N9LiBJdCBjYXJyaWVzIHRoZSBmdWxsIHtAbGluayBQYXJzZUxpbmtSZXN1bHR9IHNvIGNvbnN1bWVycyBjYW4gaW5zcGVjdCB0aGUgcGFyc2VcbiAqIGRldGFpbHMgd2l0aG91dCByZS1wYXJzaW5nIHRoZSBsaW5rLiBVc2UgdGhpcyB3aGVuIHRoZSB3aG9sZSBmcm9udG1hdHRlciB2YWx1ZSBpcyBhIHNpbmdsZSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlIGV4dGVuZHMgRnJvbnRtYXR0ZXJMaW5rQ2FjaGUge1xuICAvKipcbiAgICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VMaW5rUmVzdWx0OiBQYXJzZUxpbmtSZXN1bHQ7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2V9IGZvciBhIGxpbmsgcGFyc2VkIGZyb20gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlIHZpYVxuICoge0BsaW5rIHBhcnNlTGlua3N9LCBhZGRpdGlvbmFsbHkgY2FycnlpbmcgdGhlIG9mZnNldHMgb2YgdGhlIGxpbmsgd2l0aGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS4gVXNlXG4gKiB0aGlzIHdoZW4gdGhlIGZyb250bWF0dGVyIHZhbHVlIGhvbGRzIG11bHRpcGxlIGxpbmtzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMgZXh0ZW5kcyBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBmcm9udG1hdHRlciB2YWx1ZS5cbiAgICovXG4gIGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgZnJvbnRtYXR0ZXIgdmFsdWUuXG4gICAqL1xuICBzdGFydE9mZnNldDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIFJlZmVyZW5jZUNhY2hlfSBmb3IgYSBsaW5rIHBhcnNlZCBmcm9tIGNvbnRlbnQgdmlhIHtAbGluayBwYXJzZUxpbmtzfS4gSXQgY2FycmllcyB0aGUgZnVsbFxuICoge0BsaW5rIFBhcnNlTGlua1Jlc3VsdH0gc28gY29uc3VtZXJzIGNhbiBpbnNwZWN0IHRoZSBwYXJzZSBkZXRhaWxzIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2VDYWNoZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+IFxcKmFsaWFzXFwqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuY29kZWQgVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXSg8bGluayB3aXRoIHNwYWNlLm1kPikgLT4gbGluayUyMHdpdGglMjBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGVuY29kZWRVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGhhcyBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsubWQ+KSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiAhW1thbGlhc11dIC0+IHRydWVcbiAgICogW1thbGlhc11dIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShodHRwczovL2V4YW1wbGUuY29tKSAtPiB0cnVlXG4gICAqIFthbGlhc10oZmlsZS5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSBgZmlsZTovL2AgVVJMLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShmaWxlOi8vL0M6L3gudHh0KSAtPiB0cnVlXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0ZpbGVVcmw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1thbGlhc11dIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmF3IGxpbmsgdGV4dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gW2FsaWFzXShsaW5rLm1kKVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHJhdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQgXCJ0aXRsZVwiKSAtPiB0aXRsZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiB1bmVzY2FwZWQgYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+ICphbGlhcypcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1bmVzY2FwZWRBbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rJTIwd2l0aCUyMHNwYWNlLm1kKSAtPiBsaW5rIHdpdGggc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB0b1BhcnNlTGlua1JlZmVyZW5jZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdGhlIHBhcnNlZCBsaW5rJ3Mgb2Zmc2V0cyBpbmRleCBpbnRvLiBVc2VkIHRvIGNvbXB1dGUgdGhlIGxpbmUgYW5kIGNvbHVtbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnNlZCBsaW5rIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBwYXJzZUxpbmtSZXN1bHQ6IFBhcnNlTGlua1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBGcm9udG1hdHRlckxpbmtzUGFyc2VyLmNhdGVnb3JpemV9LlxuICovXG5pbnRlcmZhY2UgQ2F0ZWdvcml6ZUZyb250bWF0dGVyTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3aG9sZSBmcm9udG1hdHRlciB2YWx1ZSBpcyBhIHNpbmdsZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVMaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHBhdGggb2YgdGhlIGZyb250bWF0dGVyIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnNlTGlua1Jlc3VsdDogUGFyc2VMaW5rUmVzdWx0O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJvbnRtYXR0ZXIgdmFsdWUgdGhlIGxpbmsgd2FzIHBhcnNlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBkZWNvZGVVcmxTYWZlbHl9LlxuICovXG5pbnRlcmZhY2UgRGVjb2RlVXJsU2FmZWx5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0FuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqL1xuICByZWFkb25seSBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIFVSTCB0byBkZWNvZGUuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBleHRyYWN0QWxpYXN9LlxuICovXG5pbnRlcmZhY2UgRXh0cmFjdEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc0VuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgYWxpYXMgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzU3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgYWxpYXMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHN0cjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGV4dHJhY3RUZXh0TGlua3N9LlxuICovXG5pbnRlcmZhY2UgRXh0cmFjdFRleHRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IHBhcnQgaW4gdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyB0byBleHRyYWN0IHRoZSB0ZXh0IGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzdHI6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHBhcnNlZCBsaW5rcyB0byBhcHBlbmQgdGhlIGV4dHJhY3RlZCB0ZXh0IGxpbmtzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEhhc0FuZ2xlQnJhY2tldHNJbkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmF3IFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHJhd1VybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIGRhdGE6IFdpa2lMaW5rTm9kZURhdGE7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGVEYXRhIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBhbGlhczogc3RyaW5nO1xufVxuXG5jbGFzcyBGcm9udG1hdHRlckxpbmtzUGFyc2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmcm9udG1hdHRlckV4dGVybmFsTGlua3M6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rczogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0c1tdID0gW107XG5cbiAgcHVibGljIHBhcnNlKGZyb250bWF0dGVyOiB1bmtub3duKTogUGFyc2VGcm9udG1hdHRlckxpbmtzUmVzdWx0IHtcbiAgICB0aGlzLnBhcnNlVmFsdWUoZnJvbnRtYXR0ZXIsICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRoaXMubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIG11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzOiB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0ZWdvcml6ZShwYXJhbXM6IENhdGVnb3JpemVGcm9udG1hdHRlckxpbmtQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGlzU2luZ2xlTGluaywga2V5LCBwYXJzZUxpbmtSZXN1bHQsIHZhbHVlIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBpc1NpbmdsZUxpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWZlcmVuY2U6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlID0ge1xuICAgICAgZGlzcGxheVRleHQ6IHBhcnNlTGlua1Jlc3VsdC5hbGlhcyA/PyBwYXJzZUxpbmtSZXN1bHQudXJsLFxuICAgICAga2V5LFxuICAgICAgbGluazogcGFyc2VMaW5rUmVzdWx0LnVybCxcbiAgICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICAgIHBhcnNlTGlua1Jlc3VsdFxuICAgIH07XG5cbiAgICBpZiAoaXNTaW5nbGVMaW5rKSB7XG4gICAgICB0aGlzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVmZXJlbmNlV2l0aE9mZnNldHM6IFBhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlV2l0aE9mZnNldHMgPSB7XG4gICAgICAuLi5yZWZlcmVuY2UsXG4gICAgICBlbmRPZmZzZXQ6IHBhcnNlTGlua1Jlc3VsdC5lbmRPZmZzZXQsXG4gICAgICBzdGFydE9mZnNldDogcGFyc2VMaW5rUmVzdWx0LnN0YXJ0T2Zmc2V0XG4gICAgfTtcblxuICAgIGlmIChwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgdGhpcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLnB1c2gocmVmZXJlbmNlV2l0aE9mZnNldHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0cyA9IHBhcnNlTGlua3ModmFsdWUpO1xuICAgICAgY29uc3QgaXNTaW5nbGVMaW5rID0gcGFyc2VMaW5rUmVzdWx0c1swXT8ucmF3ID09PSB2YWx1ZTtcbiAgICAgIGZvciAoY29uc3QgcGFyc2VMaW5rUmVzdWx0IG9mIHBhcnNlTGlua1Jlc3VsdHMpIHtcbiAgICAgICAgdGhpcy5jYXRlZ29yaXplKHsgaXNTaW5nbGVMaW5rLCBrZXksIHBhcnNlTGlua1Jlc3VsdCwgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjaGlsZEtleSwgY2hpbGRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgR2VuZXJpY09iamVjdCkpIHtcbiAgICAgIHRoaXMucGFyc2VWYWx1ZShjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIGVuY29kZS5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsXG4gICAgc3RyOiB1cmxcbiAgfSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICdcXFxcJCYnLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCxcbiAgICBzdHI6IGFsaWFzXG4gIH0pO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0uXG4gKlxuICogQHBhcmFtIHJlZmVyZW5jZSAtIFRoZSByZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZX0sIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSB7XG4gIHJldHVybiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHJlZmVyZW5jZSkgJiYgJ3BhcnNlTGlua1Jlc3VsdCcgaW4gcmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlZmVyZW5jZSBpcyBhIHtAbGluayBQYXJzZUxpbmtSZWZlcmVuY2V9LlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2UgaXMgYSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNlTGlua1JlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHJlZmVyZW5jZSBpcyBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICByZXR1cm4gJ3BhcnNlTGlua1Jlc3VsdCcgaW4gcmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbGlua3MgZnJvbSBhIG5vdGUncyBmcm9udG1hdHRlci4gRWFjaCBzdHJpbmcgdmFsdWUgaXMgcGFyc2VkIHZpYSB7QGxpbmsgcGFyc2VMaW5rc306IGEgdmFsdWVcbiAqIHRoYXQgaXMgYSBzaW5nbGUgbGluayB5aWVsZHMgYW4gZW50cnkgd2l0aG91dCBvZmZzZXRzLCBhbmQgYSB2YWx1ZSB0aGF0IGhvbGRzIG11bHRpcGxlIGxpbmtzIHlpZWxkc1xuICogb2Zmc2V0LWNhcnJ5aW5nIGVudHJpZXMuIEludGVybmFsIHNpbmdsZS1saW5rIHZhbHVlcyBhcmUgb21pdHRlZCwgYXMgT2JzaWRpYW4gbmF0aXZlbHkgY2FjaGVzIHRoZW0uXG4gKlxuICogQHBhcmFtIGZyb250bWF0dGVyIC0gVGhlIGZyb250bWF0dGVyIHRvIHBhcnNlIChhIHZhbHVlLCBvYmplY3QsIG9yIGFycmF5KS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZnJvbnRtYXR0ZXIgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZyb250bWF0dGVyTGlua3MoZnJvbnRtYXR0ZXI6IHVua25vd24pOiBQYXJzZUZyb250bWF0dGVyTGlua3NSZXN1bHQge1xuICByZXR1cm4gbmV3IEZyb250bWF0dGVyTGlua3NQYXJzZXIoKS5wYXJzZShmcm9udG1hdHRlcik7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBsaW5rcyA9IHBhcnNlTGlua3Moc3RyKTtcbiAgcmV0dXJuIGxpbmtzWzBdPy5yYXcgPT09IHN0ciA/IGxpbmtzWzBdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYWxsIGxpbmtzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJ0BbJztcbiAgY29uc3QgRFVNTVlfQ0hBUkFDVEVSID0gJ0AnO1xuXG4gIGNvbnN0IEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAgPSAvXFxbKD88TGlua0FsaWFzPiFcXFsuKj9cXF1cXCguKz9cXCkpXFxdXFwoKD88TGluaz4uKz8pXFwpL2c7XG4gIGNvbnN0IG5vSW5zaWRlRW1iZWRzTGlua3NTdHIgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtsaW5rQWxpYXMgPSAnJywgbGluayA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBkdW1teUFsaWFzID0gRFVNTVlfQ0hBUkFDVEVSLnJlcGVhdChsaW5rQWxpYXMubGVuZ3RoKTtcbiAgICAgIHJldHVybiBgWyR7ZHVtbXlBbGlhc31dKCR7bGlua30pYDtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQLFxuICAgIHN0clxuICB9KTtcblxuICBjb25zdCBub0VtYmVkU3RyID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6IChhcmdzKSA9PiB7XG4gICAgICBlbWJlZFN5bWJvbE9mZnNldHMuYWRkKGFyZ3Mub2Zmc2V0KTtcbiAgICAgIHJldHVybiBOT19FTUJFRF9MSU5LX1BSRUZJWDtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiBFTUJFRF9MSU5LX1BSRUZJWCxcbiAgICBzdHI6IG5vSW5zaWRlRW1iZWRzTGlua3NTdHJcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHIpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG5cbiAgdmlzaXQocm9vdCwgKG5vZGU6IE5vZGUpID0+IHtcbiAgICBsZXQgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIC4uLmxpbmssXG4gICAgICAgIGlzRW1iZWQ6IHRydWUsXG4gICAgICAgIHJhdzogYCEke2xpbmsucmF3fWAsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMVxuICAgICAgfTtcbiAgICB9XG4gICAgbGlua3MucHVzaChsaW5rKTtcbiAgfSk7XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIGxldCB0ZXh0U3RhcnRPZmZzZXQgPSAwO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgICAgZW5kT2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMSxcbiAgICAgIHN0YXJ0T2Zmc2V0OiB0ZXh0U3RhcnRPZmZzZXQsXG4gICAgICBzdHIsXG4gICAgICB0ZXh0TGlua3NcbiAgICB9KTtcbiAgICB0ZXh0U3RhcnRPZmZzZXQgPSBsaW5rLmVuZE9mZnNldCArIDE7XG4gIH1cblxuICBleHRyYWN0VGV4dExpbmtzKHtcbiAgICBlbmRPZmZzZXQ6IHN0ci5sZW5ndGggLSAxLFxuICAgIHN0YXJ0T2Zmc2V0OiB0ZXh0U3RhcnRPZmZzZXQsXG4gICAgc3RyLFxuICAgIHRleHRMaW5rc1xuICB9KTtcblxuICBsaW5rcy5wdXNoKC4uLnRleHRMaW5rcyk7XG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgUGFyc2VMaW5rUmVzdWx0fSBpbnRvIGEge0BsaW5rIFBhcnNlTGlua1JlZmVyZW5jZX0gc28gaXQgY2FuIGZsb3cgdGhyb3VnaCB0aGVcbiAqIHJlZmVyZW5jZS1iYXNlZCBmaWxlLWNoYW5nZSBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHdyYXBwaW5nIHRoZSBwYXJzZWQgbGluay5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGFyc2VMaW5rUmVmZXJlbmNlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGFyc2VMaW5rUmVmZXJlbmNlKHBhcmFtczogVG9QYXJzZUxpbmtSZWZlcmVuY2VQYXJhbXMpOiBQYXJzZUxpbmtSZWZlcmVuY2Uge1xuICBjb25zdCB7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9ID0gcGFyYW1zO1xuICBjb25zdCByZWZlcmVuY2U6IFBhcnNlTGlua1JlZmVyZW5jZSA9IHtcbiAgICBsaW5rOiBwYXJzZUxpbmtSZXN1bHQudXJsLFxuICAgIG9yaWdpbmFsOiBwYXJzZUxpbmtSZXN1bHQucmF3LFxuICAgIHBhcnNlTGlua1Jlc3VsdCxcbiAgICBwb3NpdGlvbjoge1xuICAgICAgZW5kOiBvZmZzZXRUb0xvYyhjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQuZW5kT2Zmc2V0KSxcbiAgICAgIHN0YXJ0OiBvZmZzZXRUb0xvYyhjb250ZW50LCBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQpXG4gICAgfVxuICB9O1xuXG4gIGlmIChwYXJzZUxpbmtSZXN1bHQuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlZmVyZW5jZS5kaXNwbGF5VGV4dCA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgfVxuXG4gIHJldHVybiByZWZlcmVuY2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtiYWNrc2xhc2hlcyA9ICcnLCBzcGVjaWFsQ2hhciA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEggPSAyO1xuICAgICAgY29uc3QgYmFja3NsYXNoQ291bnQgPSBiYWNrc2xhc2hlcy5sZW5ndGg7XG4gICAgICBjb25zdCBrZWVwQ291bnQgPSBNYXRoLmZsb29yKGJhY2tzbGFzaENvdW50IC8gRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIKTtcbiAgICAgIHJldHVybiAnXFxcXCcucmVwZWF0KGtlZXBDb3VudCkgKyBzcGVjaWFsQ2hhcjtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgIHN0cjogZXNjYXBlZEFsaWFzXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVVcmxTYWZlbHkocGFyYW1zOiBEZWNvZGVVcmxTYWZlbHlQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGhhc0FuZ2xlQnJhY2tldHMsIGlzRXh0ZXJuYWwsIHVybCB9ID0gcGFyYW1zO1xuICAvLyBgZmlsZTovL2AgVVJMcyBhcmUgZXh0ZXJuYWwsIGJ1dCB0aGVpciBwZXJjZW50LWVuY29kaW5nIGlzIHB1cmVseSBjb3NtZXRpYywgc28gZGVjb2RlIHRoZW0gbGlrZVxuICAvLyBJbnRlcm5hbCBsaW5rcy4gRXZlcnkgb3RoZXIgZXh0ZXJuYWwgVVJMIGlzIGxlZnQgdW50b3VjaGVkIChpdHMgZW5jb2RpbmcgbWF5IGJlIHNpZ25pZmljYW50KS5cbiAgaWYgKChpc0V4dGVybmFsIHx8IGhhc0FuZ2xlQnJhY2tldHMpICYmICFpc0ZpbGVVcmwodXJsKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWxpYXMocGFyYW1zOiBFeHRyYWN0QWxpYXNQYXJhbXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGFsaWFzRW5kT2Zmc2V0LCBhbGlhc1N0YXJ0T2Zmc2V0LCBzdHIgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGFsaWFzU3RhcnRPZmZzZXQgPCBhbGlhc0VuZE9mZnNldFxuICAgID8gc3RyLnNsaWNlKGFsaWFzU3RhcnRPZmZzZXQsIGFsaWFzRW5kT2Zmc2V0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHBhcmFtczogRXh0cmFjdFRleHRMaW5rc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGVuZE9mZnNldCwgc3RhcnRPZmZzZXQsIHN0ciwgdGV4dExpbmtzIH0gPSBwYXJhbXM7XG4gIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRleHRQYXJ0ID0gc3RyLnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgKyAxKTtcbiAgcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbcmF3VXJsID0gJyddLCBvZmZzZXQgfSkgPT4ge1xuICAgICAgaWYgKCFpc1VybChyYXdVcmwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGVjb2RlIGJhcmUgYGZpbGU6Ly9gIFVSTHMgbGlrZSB0aGUgYnJhY2tldGVkIHBhdGggKGBwYXJzZUxpbmtOb2RlYCkgZG9lcy5cbiAgICAgIC8vIE9mZnNldHMgYW5kIGByYXdgIHN0YXkgYmFzZWQgb24gdGhlIG9yaWdpbmFsIChwb3NzaWJseSBwZXJjZW50LWVuY29kZWQpIHRleHQuXG4gICAgICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkoe1xuICAgICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgdXJsOiByYXdVcmxcbiAgICAgIH0pO1xuICAgICAgdGV4dExpbmtzLnB1c2goe1xuICAgICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCArIHJhd1VybC5sZW5ndGgsXG4gICAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNGaWxlVXJsOiBpc0ZpbGVVcmwodXJsKSxcbiAgICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICAgIHJhdzogcmF3VXJsLFxuICAgICAgICBzdGFydE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQsXG4gICAgICAgIHVybFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogLyg/PFVybD5cXFMrKS9nLFxuICAgIHN0cjogdGV4dFBhcnRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0xpbmsobm9kZTogTm9kZSwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3MgPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHN0ci5zbGljZShwb3Muc3RhcnQub2Zmc2V0LCBwb3MuZW5kLm9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocGFyYW1zOiBIYXNBbmdsZUJyYWNrZXRzSW5MaW5rUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgcmF3LCByYXdVcmwgfSA9IHBhcmFtcztcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRUb0xvYyhjb250ZW50OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKTogTG9jIHtcbiAgY29uc3QgcHJlY2VkaW5nQ29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgb2Zmc2V0KTtcbiAgY29uc3QgbGluZSA9IChwcmVjZWRpbmdDb250ZW50Lm1hdGNoKC9cXG4vZykgPz8gW10pLmxlbmd0aDtcbiAgY29uc3QgbGFzdE5ld2xpbmVPZmZzZXQgPSBwcmVjZWRpbmdDb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nKTtcbiAgcmV0dXJuIHtcbiAgICBjb2w6IG9mZnNldCAtIChsYXN0TmV3bGluZU9mZnNldCArIDEpLFxuICAgIGxpbmUsXG4gICAgb2Zmc2V0XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGlua05vZGUobm9kZTogTGluaywgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0ID0gbm9kZS5jaGlsZHJlblswXT8ucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAxO1xuICBjb25zdCBhbGlhc05vZGVFbmRPZmZzZXQgPSBub2RlLmNoaWxkcmVuLmF0KC0xKT8ucG9zaXRpb24/LmVuZC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgY29uc3Qgbm9kZUVuZE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICBjb25zdCBub2RlU3RhcnRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpO1xuICBjb25zdCByYXdVcmwgPSBzdHIuc2xpY2UoYWxpYXNOb2RlRW5kT2Zmc2V0ICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCBub2RlRW5kT2Zmc2V0IC0gTElOS19TVUZGSVgubGVuZ3RoKTtcbiAgY29uc3QgaGFzQW5nbGVCcmFja2V0cyA9IGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsoe1xuICAgIHJhdyxcbiAgICByYXdVcmxcbiAgfSk7XG4gIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc1VybChub2RlLnVybCk7XG4gIGNvbnN0IHVybCA9IGRlY29kZVVybFNhZmVseSh7XG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0V4dGVybmFsLFxuICAgIHVybDogbm9kZS51cmxcbiAgfSk7XG4gIGNvbnN0IGFsaWFzID0gZXh0cmFjdEFsaWFzKHtcbiAgICBhbGlhc0VuZE9mZnNldDogYWxpYXNOb2RlRW5kT2Zmc2V0LFxuICAgIGFsaWFzU3RhcnRPZmZzZXQ6IGFsaWFzTm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHN0clxuICB9KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhcyxcbiAgICBlbmNvZGVkVXJsOiBpc0V4dGVybmFsID8gZW5jb2RlVXJsKHVybCkgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlRW5kT2Zmc2V0LFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc0ZpbGVVcmw6IGlzRmlsZVVybCh1cmwpLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHJhdyxcbiAgICBzdGFydE9mZnNldDogbm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1bmVzY2FwZWRBbGlhczogYWxpYXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVuZXNjYXBlQWxpYXMoYWxpYXMpLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXaWtpbGlua05vZGUobm9kZTogV2lraUxpbmtOb2RlLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IHN0ci5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzRmlsZVVybDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgc3RyKSxcbiAgICBzdGFydE9mZnNldDogZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KSxcbiAgICB1cmw6IG5vZGUudmFsdWVcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQSw2QkFBdUM7QUFDdkMsb0JBQXVCO0FBQ3ZCLDBCQUF3QjtBQUN4Qiw4QkFBK0I7QUFDL0IsOEJBQXNCO0FBSXRCLDBCQUE0QztBQUM1QyxvQkFBMkI7QUFDM0IseUJBQWtDO0FBQ2xDLGlCQUdPO0FBTVAsTUFBTSw4QkFBOEI7QUFLcEMsTUFBTSxzQ0FBc0M7QUFFNUMsTUFBTSxtQkFBbUI7QUFrVXpCLE1BQU0sdUJBQXVCO0FBQUEsRUFDViwyQkFBNEQsQ0FBQztBQUFBLEVBQzdELHFDQUFpRixDQUFDO0FBQUEsRUFDbEYsNkJBQXlFLENBQUM7QUFBQSxFQUVwRixNQUFNLGFBQW1EO0FBQzlELFNBQUssV0FBVyxhQUFhLEVBQUU7QUFDL0IsV0FBTztBQUFBLE1BQ0wsMEJBQTBCLEtBQUs7QUFBQSxNQUMvQixvQ0FBb0MsS0FBSztBQUFBLE1BQ3pDLDRCQUE0QixLQUFLO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQUEsRUFFUSxXQUFXLFFBQStDO0FBQ2hFLFVBQU0sRUFBRSxjQUFjLEtBQUssaUJBQWlCLE1BQU0sSUFBSTtBQUN0RCxRQUFJLENBQUMsZ0JBQWdCLGNBQWMsY0FBYztBQUMvQztBQUFBLElBQ0Y7QUFFQSxVQUFNLFlBQTJDO0FBQUEsTUFDL0MsYUFBYSxnQkFBZ0IsU0FBUyxnQkFBZ0I7QUFBQSxNQUN0RDtBQUFBLE1BQ0EsTUFBTSxnQkFBZ0I7QUFBQSxNQUN0QixVQUFVO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFFQSxRQUFJLGNBQWM7QUFDaEIsV0FBSyx5QkFBeUIsS0FBSyxTQUFTO0FBQzVDO0FBQUEsSUFDRjtBQUVBLFVBQU0sdUJBQWlFO0FBQUEsTUFDckUsR0FBRztBQUFBLE1BQ0gsV0FBVyxnQkFBZ0I7QUFBQSxNQUMzQixhQUFhLGdCQUFnQjtBQUFBLElBQy9CO0FBRUEsUUFBSSxnQkFBZ0IsWUFBWTtBQUM5QixXQUFLLG1DQUFtQyxLQUFLLG9CQUFvQjtBQUFBLElBQ25FLE9BQU87QUFDTCxXQUFLLDJCQUEyQixLQUFLLG9CQUFvQjtBQUFBLElBQzNEO0FBQUEsRUFDRjtBQUFBLEVBRVEsV0FBVyxPQUFnQixLQUFtQjtBQUNwRCxRQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFlBQU0sbUJBQW1CLFdBQVcsS0FBSztBQUN6QyxZQUFNLGVBQWUsaUJBQWlCLENBQUMsR0FBRyxRQUFRO0FBQ2xELGlCQUFXLG1CQUFtQixrQkFBa0I7QUFDOUMsYUFBSyxXQUFXLEVBQUUsY0FBYyxLQUFLLGlCQUFpQixNQUFNLENBQUM7QUFBQSxNQUMvRDtBQUNBO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxVQUFVLFlBQVksVUFBVSxNQUFNO0FBQy9DO0FBQUEsSUFDRjtBQUVBLGVBQVcsQ0FBQyxVQUFVLFVBQVUsS0FBSyxPQUFPLFFBQVEsS0FBc0IsR0FBRztBQUMzRSxXQUFLLFdBQVcsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsS0FBSyxRQUFRO0FBQUEsSUFDbkU7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLFVBQVUsS0FBcUI7QUFDN0MsYUFBTywwQkFBVztBQUFBLElBQ2hCLFVBQVUsQ0FBQyxFQUFFLFdBQVcsa0JBQWtCLE1BQU0sbUJBQW1CLGlCQUFpQjtBQUFBLElBQ3BGLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDSDtBQWFPLFNBQVMsWUFBWSxPQUF1QjtBQUNqRCxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNIO0FBUU8sU0FBUyxnQ0FBZ0MsV0FBa0U7QUFDaEgsYUFBTywrQ0FBdUIsU0FBUyxLQUFLLHFCQUFxQjtBQUNuRTtBQVFPLFNBQVMscUJBQXFCLFdBQXVEO0FBQzFGLFNBQU8scUJBQXFCO0FBQzlCO0FBVU8sU0FBUyxzQkFBc0IsYUFBbUQ7QUFDdkYsU0FBTyxJQUFJLHVCQUF1QixFQUFFLE1BQU0sV0FBVztBQUN2RDtBQVFPLFNBQVMsVUFBVSxLQUFxQztBQUM3RCxRQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzVCLFNBQU8sTUFBTSxDQUFDLEdBQUcsUUFBUSxNQUFNLE1BQU0sQ0FBQyxJQUFJO0FBQzVDO0FBUU8sU0FBUyxXQUFXLEtBQWdDO0FBQ3pELFFBQU0scUJBQXFCLG9CQUFJLElBQVk7QUFFM0MsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSx1QkFBdUI7QUFDN0IsUUFBTSxrQkFBa0I7QUFFeEIsUUFBTSw0QkFBNEI7QUFDbEMsUUFBTSw2QkFBeUIsMEJBQVc7QUFBQSxJQUN4QyxVQUFVLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxZQUFZLElBQUksT0FBTyxFQUFFLEVBQUUsTUFBTTtBQUNoRSxZQUFNLGFBQWEsZ0JBQWdCLE9BQU8sVUFBVSxNQUFNO0FBQzFELGFBQU8sSUFBSSxVQUFVLEtBQUssSUFBSTtBQUFBLElBQ2hDO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYjtBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0saUJBQWEsMEJBQVc7QUFBQSxJQUM1QixVQUFVLENBQUMsU0FBUztBQUNsQix5QkFBbUIsSUFBSSxLQUFLLE1BQU07QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFFRCxRQUFNLGdCQUFZLHNCQUFPLEVBQUUsSUFBSSxvQkFBQUEsT0FBVyxFQUFFLElBQUksd0NBQWdCLEVBQUUsY0FBYyxpQkFBaUIsQ0FBQztBQUNsRyxRQUFNLE9BQU8sVUFBVSxNQUFNLFVBQVU7QUFFdkMsUUFBTSxRQUEyQixDQUFDO0FBQ2xDLFFBQU0sWUFBK0IsQ0FBQztBQUV0QyxxQ0FBTSxNQUFNLENBQUMsU0FBZTtBQUMxQixRQUFJO0FBQ0osWUFBUSxLQUFLLE1BQU07QUFBQSxNQUNqQixLQUFLO0FBQ0gsZUFBTyxjQUFjLE1BQWMsR0FBRztBQUN0QztBQUFBLE1BQ0YsS0FBSztBQUNILGVBQU8sa0JBQWtCLE1BQXNCLEdBQUc7QUFDbEQ7QUFBQSxNQUNGO0FBQ0U7QUFBQSxJQUNKO0FBRUEsUUFBSSxtQkFBbUIsSUFBSSxLQUFLLGNBQWMsQ0FBQyxHQUFHO0FBQ2hELGFBQU87QUFBQSxRQUNMLEdBQUc7QUFBQSxRQUNILFNBQVM7QUFBQSxRQUNULEtBQUssSUFBSSxLQUFLLEdBQUc7QUFBQSxRQUNqQixhQUFhLEtBQUssY0FBYztBQUFBLE1BQ2xDO0FBQUEsSUFDRjtBQUNBLFVBQU0sS0FBSyxJQUFJO0FBQUEsRUFDakIsQ0FBQztBQUVELFFBQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBRWxELE1BQUksa0JBQWtCO0FBRXRCLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLHFCQUFpQjtBQUFBLE1BQ2YsV0FBVyxLQUFLLGNBQWM7QUFBQSxNQUM5QixhQUFhO0FBQUEsTUFDYjtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFDRCxzQkFBa0IsS0FBSyxZQUFZO0FBQUEsRUFDckM7QUFFQSxtQkFBaUI7QUFBQSxJQUNmLFdBQVcsSUFBSSxTQUFTO0FBQUEsSUFDeEIsYUFBYTtBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBRUQsUUFBTSxLQUFLLEdBQUcsU0FBUztBQUN2QixRQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVztBQUVsRCxTQUFPO0FBQ1Q7QUFTTyxTQUFTLHFCQUFxQixRQUF3RDtBQUMzRixRQUFNLEVBQUUsU0FBUyxnQkFBZ0IsSUFBSTtBQUNyQyxRQUFNLFlBQWdDO0FBQUEsSUFDcEMsTUFBTSxnQkFBZ0I7QUFBQSxJQUN0QixVQUFVLGdCQUFnQjtBQUFBLElBQzFCO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixLQUFLLFlBQVksU0FBUyxnQkFBZ0IsU0FBUztBQUFBLE1BQ25ELE9BQU8sWUFBWSxTQUFTLGdCQUFnQixXQUFXO0FBQUEsSUFDekQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsVUFBVSxRQUFXO0FBQ3ZDLGNBQVUsY0FBYyxnQkFBZ0I7QUFBQSxFQUMxQztBQUVBLFNBQU87QUFDVDtBQWFPLFNBQVMsY0FBYyxjQUE4QjtBQUMxRCxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsY0FBYyxJQUFJLGNBQWMsRUFBRSxFQUFFLE1BQU07QUFDekUsWUFBTSwyQkFBMkI7QUFDakMsWUFBTSxpQkFBaUIsWUFBWTtBQUNuQyxZQUFNLFlBQVksS0FBSyxNQUFNLGlCQUFpQix3QkFBd0I7QUFDdEUsYUFBTyxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbEM7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDSDtBQUVBLFNBQVMsZ0JBQWdCLFFBQXVDO0FBQzlELFFBQU0sRUFBRSxrQkFBa0IsWUFBWSxJQUFJLElBQUk7QUFHOUMsT0FBSyxjQUFjLHFCQUFxQixLQUFDLHNCQUFVLEdBQUcsR0FBRztBQUN2RCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixXQUFPLG1CQUFtQixHQUFHO0FBQUEsRUFDL0IsU0FBUyxPQUFPO0FBQ2QsWUFBUSxNQUFNLHdCQUF3QixHQUFHLElBQUksS0FBSztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyxhQUFhLFFBQWdEO0FBQ3BFLFFBQU0sRUFBRSxnQkFBZ0Isa0JBQWtCLElBQUksSUFBSTtBQUNsRCxTQUFPLG1CQUFtQixpQkFDdEIsSUFBSSxNQUFNLGtCQUFrQixjQUFjLElBQzFDO0FBQ047QUFFQSxTQUFTLGlCQUFpQixRQUFzQztBQUM5RCxRQUFNLEVBQUUsV0FBVyxhQUFhLEtBQUssVUFBVSxJQUFJO0FBQ25ELE1BQUksY0FBYyxXQUFXO0FBQzNCO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVyxJQUFJLE1BQU0sYUFBYSxZQUFZLENBQUM7QUFDckQsZ0NBQVc7QUFBQSxJQUNULFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxHQUFHLE9BQU8sTUFBTTtBQUMxRCxVQUFJLEtBQUMsa0JBQU0sTUFBTSxHQUFHO0FBQ2xCO0FBQUEsTUFDRjtBQUlBLFlBQU0sTUFBTSxnQkFBZ0I7QUFBQSxRQUMxQixrQkFBa0I7QUFBQSxRQUNsQixZQUFZO0FBQUEsUUFDWixLQUFLO0FBQUEsTUFDUCxDQUFDO0FBQ0QsZ0JBQVUsS0FBSztBQUFBLFFBQ2IsWUFBWSxVQUFVLEdBQUc7QUFBQSxRQUN6QixXQUFXLGNBQWMsU0FBUyxPQUFPO0FBQUEsUUFDekMsa0JBQWtCO0FBQUEsUUFDbEIsU0FBUztBQUFBLFFBQ1QsWUFBWTtBQUFBLFFBQ1osZUFBVyxzQkFBVSxHQUFHO0FBQUEsUUFDeEIsWUFBWTtBQUFBLFFBQ1osS0FBSztBQUFBLFFBQ0wsYUFBYSxjQUFjO0FBQUEsUUFDM0I7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7QUFFQSxTQUFTLFdBQVcsTUFBWSxLQUFxQjtBQUNuRCxRQUFNLFVBQU0sc0NBQWtCLEtBQUssUUFBUTtBQUMzQyxTQUFPLElBQUksTUFBTSxJQUFJLE1BQU0sUUFBUSxJQUFJLElBQUksTUFBTTtBQUNuRDtBQUVBLFNBQVMsdUJBQXVCLFFBQStDO0FBQzdFLFFBQU0sRUFBRSxLQUFLLE9BQU8sSUFBSTtBQUN4QixRQUFNLHFCQUFxQjtBQUMzQixTQUFPLElBQUksV0FBVyxrQkFBa0IsS0FBSyxPQUFPLFdBQVcsa0JBQWtCO0FBQ25GO0FBRUEsU0FBUyxZQUFZLFNBQWlCLFFBQXFCO0FBQ3pELFFBQU0sbUJBQW1CLFFBQVEsTUFBTSxHQUFHLE1BQU07QUFDaEQsUUFBTSxRQUFRLGlCQUFpQixNQUFNLEtBQUssS0FBSyxDQUFDLEdBQUc7QUFDbkQsUUFBTSxvQkFBb0IsaUJBQWlCLFlBQVksSUFBSTtBQUMzRCxTQUFPO0FBQUEsSUFDTCxLQUFLLFVBQVUsb0JBQW9CO0FBQUEsSUFDbkM7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxjQUFjLE1BQVksS0FBOEI7QUFDL0QsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sTUFBTSxXQUFXLE1BQU0sR0FBRztBQUNoQyxRQUFNLHVCQUF1QixLQUFLLFNBQVMsQ0FBQyxHQUFHLFVBQVUsTUFBTSxVQUFVO0FBQ3pFLFFBQU0scUJBQXFCLEtBQUssU0FBUyxHQUFHLEVBQUUsR0FBRyxVQUFVLElBQUksVUFBVTtBQUN6RSxRQUFNLGVBQVcsc0NBQWtCLEtBQUssUUFBUTtBQUNoRCxRQUFNLG9CQUFnQixzQ0FBa0IsU0FBUyxJQUFJLE1BQU07QUFDM0QsUUFBTSxzQkFBa0Isc0NBQWtCLFNBQVMsTUFBTSxNQUFNO0FBQy9ELFFBQU0sU0FBUyxJQUFJLE1BQU0scUJBQXFCLGtCQUFrQixRQUFRLGdCQUFnQixZQUFZLE1BQU07QUFDMUcsUUFBTSxtQkFBbUIsdUJBQXVCO0FBQUEsSUFDOUM7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0QsUUFBTSxpQkFBYSxrQkFBTSxLQUFLLEdBQUc7QUFDakMsUUFBTSxNQUFNLGdCQUFnQjtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLElBQ0EsS0FBSyxLQUFLO0FBQUEsRUFDWixDQUFDO0FBQ0QsUUFBTSxRQUFRLGFBQWE7QUFBQSxJQUN6QixnQkFBZ0I7QUFBQSxJQUNoQixrQkFBa0I7QUFBQSxJQUNsQjtBQUFBLEVBQ0YsQ0FBQztBQUNELGFBQU8saURBQTZDO0FBQUEsSUFDbEQ7QUFBQSxJQUNBLFlBQVksYUFBYSxVQUFVLEdBQUcsSUFBSTtBQUFBLElBQzFDLFdBQVc7QUFBQSxJQUNYO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsZUFBVyxzQkFBVSxHQUFHO0FBQUEsSUFDeEIsWUFBWTtBQUFBLElBQ1o7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiLE9BQU8sS0FBSyxTQUFTO0FBQUEsSUFDckIsZ0JBQWdCLFVBQVUsU0FBWSxTQUFZLGNBQWMsS0FBSztBQUFBLElBQ3JFO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxTQUFTLGtCQUFrQixNQUFvQixLQUE4QjtBQUMzRSxRQUFNLGVBQVcsc0NBQWtCLEtBQUssUUFBUTtBQUNoRCxhQUFPLGlEQUE2QztBQUFBLElBQ2xELE9BQU8sSUFBSSxTQUFTLGdCQUFnQixJQUFJLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDMUQsZUFBVyxzQ0FBa0IsU0FBUyxJQUFJLE1BQU07QUFBQSxJQUNoRCxTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUEsSUFDWixXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixLQUFLLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDekIsaUJBQWEsc0NBQWtCLFNBQVMsTUFBTSxNQUFNO0FBQUEsSUFDcEQsS0FBSyxLQUFLO0FBQUEsRUFDWixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInJlbWFya1BhcnNlIl0KfQo=