@mnaoumov/typescript-dev-toolkit 1.1.0 → 1.2.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 (147) hide show
  1. package/dist/lib/cjs/build.cjs +2 -24
  2. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +2 -24
  3. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +1 -56
  4. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +4 -25
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +6 -61
  6. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +129 -27
  7. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +3 -1
  8. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +3 -25
  9. package/dist/lib/cjs/bundlers/index.cjs +2 -57
  10. package/dist/lib/cjs/check-project-types.cjs +3 -25
  11. package/dist/lib/cjs/cli-utils.cjs +3 -25
  12. package/dist/lib/cjs/code-generator.cjs +1 -56
  13. package/dist/lib/cjs/commitlint-config.cjs +2 -24
  14. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +1 -56
  15. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +1 -56
  16. package/dist/lib/cjs/env-toggle.cjs +3 -25
  17. package/dist/lib/cjs/exec.cjs +3 -25
  18. package/dist/lib/cjs/exec.d.cts +1 -0
  19. package/dist/lib/cjs/forbidden-patterns.cjs +3 -25
  20. package/dist/lib/cjs/formatters/dprint.cjs +2 -24
  21. package/dist/lib/cjs/formatters/index.cjs +2 -57
  22. package/dist/lib/cjs/fs.cjs +2 -24
  23. package/dist/lib/cjs/fs.d.cts +1 -0
  24. package/dist/lib/cjs/gate.cjs +1 -56
  25. package/dist/lib/cjs/git.cjs +1 -56
  26. package/dist/lib/cjs/index.cjs +31 -86
  27. package/dist/lib/cjs/json.cjs +2 -24
  28. package/dist/lib/cjs/library-build.cjs +92 -34
  29. package/dist/lib/cjs/library-build.d.cts +10 -4
  30. package/dist/lib/cjs/library-references.d.cts +0 -3
  31. package/dist/lib/cjs/linters/cspell-content.cjs +2 -24
  32. package/dist/lib/cjs/linters/cspell.cjs +1 -56
  33. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +1 -56
  34. package/dist/lib/cjs/linters/eslint-config.cjs +8 -30
  35. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +1 -56
  36. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +1 -56
  37. package/dist/lib/cjs/linters/eslint-rules/index.cjs +13 -68
  38. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +2 -24
  39. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +2 -24
  40. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +2 -24
  41. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +2 -24
  42. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +1 -56
  43. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +1 -56
  44. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +2 -24
  45. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +2 -24
  46. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +2 -24
  47. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +1 -56
  48. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +2 -24
  49. package/dist/lib/cjs/linters/eslint.cjs +2 -24
  50. package/dist/lib/cjs/linters/index.cjs +15 -70
  51. package/dist/lib/cjs/linters/lint-ignores.cjs +2 -24
  52. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +3 -25
  53. package/dist/lib/cjs/linters/markdownlint-content.cjs +2 -24
  54. package/dist/lib/cjs/linters/markdownlint-ignores.cjs +1 -56
  55. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +2 -57
  56. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +1 -56
  57. package/dist/lib/cjs/linters/markdownlint.cjs +2 -24
  58. package/dist/lib/cjs/linters/over-exposure.cjs +2 -24
  59. package/dist/lib/cjs/nano-staged-config.cjs +2 -57
  60. package/dist/lib/cjs/npm-publish.cjs +1 -56
  61. package/dist/lib/cjs/npm-run.cjs +2 -24
  62. package/dist/lib/cjs/npm.cjs +2 -24
  63. package/dist/lib/cjs/package-lock-integrity.cjs +1 -56
  64. package/dist/lib/cjs/package-manager.cjs +3 -25
  65. package/dist/lib/cjs/released-issues.cjs +2 -24
  66. package/dist/lib/cjs/repo-paths.cjs +1 -56
  67. package/dist/lib/cjs/root.cjs +2 -24
  68. package/dist/lib/cjs/test-runners/index.cjs +3 -58
  69. package/dist/lib/cjs/test-runners/vitest-config.cjs +1 -56
  70. package/dist/lib/cjs/test-runners/vitest.cjs +1 -56
  71. package/dist/lib/cjs/validate-declarations.cjs +2 -24
  72. package/dist/lib/cjs/version.cjs +2 -24
  73. package/dist/lib/cjs/version.d.cts +1 -0
  74. package/dist/lib/esm/build.mjs +2 -11
  75. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +2 -11
  76. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +1 -43
  77. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +4 -12
  78. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +1 -43
  79. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +3 -1
  80. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +154 -14
  81. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +2 -11
  82. package/dist/lib/esm/bundlers/index.mjs +1 -43
  83. package/dist/lib/esm/check-project-types.mjs +2 -11
  84. package/dist/lib/esm/cli-utils.mjs +2 -11
  85. package/dist/lib/esm/code-generator.mjs +1 -43
  86. package/dist/lib/esm/commitlint-config.mjs +2 -11
  87. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +1 -43
  88. package/dist/lib/esm/commitlint-spellcheck-header.mjs +1 -43
  89. package/dist/lib/esm/env-toggle.mjs +2 -11
  90. package/dist/lib/esm/exec.d.mts +1 -0
  91. package/dist/lib/esm/exec.mjs +2 -11
  92. package/dist/lib/esm/forbidden-patterns.mjs +2 -11
  93. package/dist/lib/esm/formatters/dprint.mjs +2 -11
  94. package/dist/lib/esm/formatters/index.mjs +1 -43
  95. package/dist/lib/esm/fs.d.mts +1 -0
  96. package/dist/lib/esm/fs.mjs +2 -11
  97. package/dist/lib/esm/gate.mjs +1 -43
  98. package/dist/lib/esm/git.mjs +1 -43
  99. package/dist/lib/esm/index.mjs +1 -43
  100. package/dist/lib/esm/json.mjs +2 -11
  101. package/dist/lib/esm/library-build.d.mts +10 -4
  102. package/dist/lib/esm/library-build.mjs +101 -21
  103. package/dist/lib/esm/library-references.d.mts +0 -3
  104. package/dist/lib/esm/linters/cspell-content.mjs +2 -11
  105. package/dist/lib/esm/linters/cspell.mjs +1 -43
  106. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +1 -43
  107. package/dist/lib/esm/linters/eslint-config.mjs +2 -11
  108. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +1 -43
  109. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +1 -43
  110. package/dist/lib/esm/linters/eslint-rules/index.mjs +1 -43
  111. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +2 -11
  112. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +2 -11
  113. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +2 -11
  114. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +2 -11
  115. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +1 -43
  116. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +1 -43
  117. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +2 -11
  118. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +2 -11
  119. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +2 -11
  120. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +1 -43
  121. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +2 -11
  122. package/dist/lib/esm/linters/eslint.mjs +2 -11
  123. package/dist/lib/esm/linters/index.mjs +1 -43
  124. package/dist/lib/esm/linters/lint-ignores.mjs +2 -11
  125. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +2 -11
  126. package/dist/lib/esm/linters/markdownlint-content.mjs +2 -11
  127. package/dist/lib/esm/linters/markdownlint-ignores.mjs +1 -43
  128. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +1 -43
  129. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +1 -43
  130. package/dist/lib/esm/linters/markdownlint.mjs +2 -11
  131. package/dist/lib/esm/linters/over-exposure.mjs +2 -11
  132. package/dist/lib/esm/nano-staged-config.mjs +1 -43
  133. package/dist/lib/esm/npm-publish.mjs +1 -43
  134. package/dist/lib/esm/npm-run.mjs +2 -11
  135. package/dist/lib/esm/npm.mjs +2 -11
  136. package/dist/lib/esm/package-lock-integrity.mjs +1 -43
  137. package/dist/lib/esm/package-manager.mjs +2 -11
  138. package/dist/lib/esm/released-issues.mjs +2 -11
  139. package/dist/lib/esm/repo-paths.mjs +1 -43
  140. package/dist/lib/esm/root.mjs +2 -11
  141. package/dist/lib/esm/test-runners/index.mjs +1 -43
  142. package/dist/lib/esm/test-runners/vitest-config.mjs +1 -43
  143. package/dist/lib/esm/test-runners/vitest.mjs +1 -43
  144. package/dist/lib/esm/validate-declarations.mjs +2 -11
  145. package/dist/lib/esm/version.d.mts +1 -0
  146. package/dist/lib/esm/version.mjs +2 -11
  147. package/package.json +1 -1
@@ -2,13 +2,7 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
- symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
- }
11
-
12
6
  function ensureBrowserProcess() {
13
7
  const browserProcess = {
14
8
  browser: true,
@@ -39,10 +33,7 @@ function ensureBrowserProcess() {
39
33
  existingProcessRecord['browser'] = true;
40
34
  }
41
35
 
42
- (function initEsm() {
43
- ensureDisposeSymbols();
44
- ensureBrowserProcess();
45
- })();
36
+ ensureBrowserProcess();
46
37
  })();
47
38
 
48
39
  import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
@@ -720,4 +711,4 @@ export {
720
711
  updateVersionInFiles,
721
712
  validate
722
713
  };
723
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHsgbGludE1hcmtkb3duQ29udGVudCB9IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsZXMgdG8gYXR0YWNoIHRvIHRoZSBHaXRIdWIgcmVsZWFzZS4gU2VlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UmVsZWFzZUFzc2V0UGF0aHM/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmdbXT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZUdpdEh1YlJlbGVhc2U/OiAobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30gXHUyMDE0IGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC4gU2VlXG4gICAqIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiBhbnkgZmlsZSBiZXlvbmQgYHBhY2thZ2UuanNvbmAgYW5kIHRoZSBsb2NrZmlsZXMsIG9uY2UgdGhlIG5ldyB2ZXJzaW9uIGlzIGtub3duIGFuZFxuICAgKiBiZWZvcmUgdGhlIHJlbGVhc2UgY29tbWl0IGlzIG1hZGUuIEFuIE9ic2lkaWFuIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgYHZlcnNpb25zLmpzb25gIGFyZSB0aGUgY2FzZSB0aGlzXG4gICAqIGV4aXN0cyBmb3IuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHZlcnNpb24gYmVpbmcgcmVsZWFzZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVWZXJzaW9uSW5FeHRyYUZpbGVzPzogKChuZXdWZXJzaW9uOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb3dlc3QgYnVtcCBhIHJhbmdlIG9mIGNvbW1pdHMgbWF5IGJlIHB1Ymxpc2hlZCB1bmRlciwgYW5kIHRoZSBjb21taXRzIHRoYXQgZm9yY2UgaXQuXG4gKi9cbmludGVyZmFjZSBCdW1wRmxvb3Ige1xuICAvKipcbiAgICogVGhlIGNvbW1pdHMgd2hvc2UgQ29udmVudGlvbmFsLUNvbW1pdHMgbWFya2VycyBmb3JjZSB7QGxpbmsgbGV2ZWx9LCBpbiB0aGUgb3JkZXIgYGdpdCBsb2dgIHJlcG9ydGVkIHRoZW0uXG4gICAqIEVtcHR5IHdoZW4gbm90aGluZyBmb3JjZXMgYW55dGhpbmcsIHdoaWNoIGlzIHRoZSBvcmRpbmFyeSBjYXNlIGZvciBhIHJhbmdlIG9mIGBmaXhgZXMgYW5kIGBjaG9yZWBzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2luZ0NvbW1pdHM6IHJlYWRvbmx5IEZvcmNpbmdDb21taXRbXTtcblxuICAvKipcbiAgICogVGhlIGxvd2VzdCB7QGxpbmsgQnVtcExldmVsfSB0aGUgcmFuZ2UgbWF5IHNoaXAgYXMuXG4gICAqL1xuICByZWFkb25seSBsZXZlbDogQnVtcExldmVsO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHRvQnVtcEZsb29yRXJyb3J9IG5lZWRzIGJleW9uZCB0aGUge0BsaW5rIEJ1bXBGbG9vcn0gaXRzZWxmIHRvIHNheSB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHdoYXRcbiAqIHRoYXQgd291bGQgaGF2ZSBzaGlwcGVkIGFzLlxuICovXG5pbnRlcmZhY2UgQnVtcEZsb29yUmVmdXNhbENvbnRleHQge1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHJlbGVhc2UgdGFnIHRoZSByYW5nZSB3YXMgbWVhc3VyZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3RUYWc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdGhlIHJlcXVlc3RlZCBidW1wIHdvdWxkIGhhdmUgcHJvZHVjZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgQnVtcExldmVsfSB7QGxpbmsgbmV3VmVyc2lvbn0gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHtAbGluayBsYXN0VGFnfS5cbiAgICovXG4gIHJlYWRvbmx5IHRha2VuTGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdGhlIHJlbGVhc2Ugd2FzIGFza2VkIGZvciwgdmVyYmF0aW0gXHUyMDE0IHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgdHlwZSBvciBhbiBleHBsaWNpdFxuICAgKiB2ZXJzaW9uIGFzIG9mdGVuIGFzIGl0IGlzIGEgcGxhaW4gYHBhdGNoYCwgYW5kIGlzIHRoZXJlZm9yZSB3b3J0aCBxdW90aW5nIGJhY2sgcmF0aGVyIHRoYW4gaW5mZXJyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGhyZWUgcmVsZWFzZSBsaW5lcyBhIGJ1bXAgY2FuIG1vdmUsIG9yZGVyZWQgYnkge0BsaW5rIGlzQnVtcExldmVsQXRMZWFzdH0uXG4gKlxuICogQSBwcmUtcmVsZWFzZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlc2U6IGBwcmVtYWpvcmAgbW92ZXMgdGhlIG1ham9yIGxpbmUgYW5kIGBwcmVyZWxlYXNlYCBtb3ZlcyB3aGljaGV2ZXJcbiAqIGxpbmUgYW4gZWFybGllciBwcmUtcmVsZWFzZSBhbHJlYWR5IGNob3NlLCBzbyB3aGF0IGEgcHJlLXJlbGVhc2UgZGlkIGlzIHJlYWQgb2ZmIHRoZSByZXN1bHRpbmcgdmVyc2lvblxuICogcmF0aGVyIHRoYW4gb2ZmIGl0cyB0eXBlLiBTZWUge0BsaW5rIHRvRWZmZWN0aXZlQnVtcExldmVsfS5cbiAqL1xudHlwZSBCdW1wTGV2ZWwgPSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvciB8IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG5cbi8qKlxuICogT25lIGZpbmRpbmcgcmVwb3J0ZWQgb3ZlciB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgc2VjdGlvbiwgdGFnZ2VkIHdpdGggdGhlIG5wbSBzY3JpcHQgd2hvc2UgY2hlY2sgcHJvZHVjZWQgaXQuXG4gKlxuICogVGhlIHRhZyBpcyB3aGF0IGxldHMgb25lIG1lc3NhZ2UgbmFtZSBgbGludDptZGAsIGBzcGVsbGNoZWNrYCBvciBib3RoLCB0cnV0aGZ1bGx5LiBCb3RoIGNoZWNrcyBydW4gb3ZlclxuICogZXZlcnkgc2V0dGxlLCBzbyBhbiBhdXRob3Igd2hvIGhhcyB0byBmaXggYSBoYXJkLXdyYXBwZWQgbGluZSBhbmQgYSBjb2luZWQgd29yZCBmaXhlcyB0aGVtIGluIE9ORSByb3VuZCBvZlxuICogdGhlIHJldmlldyByYXRoZXIgdGhhbiBiZWluZyBzZW50IGJhY2sgdHdpY2UuXG4gKi9cbmludGVyZmFjZSBDaGFuZ2Vsb2dGaW5kaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBucG0gc2NyaXB0IHRoYXQgd291bGQgaGF2ZSByZXBvcnRlZCB0aGlzIG9uIHRoZSBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBzY3JpcHROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRlZCBsaW5lLCBleGFjdGx5IGFzIHRoYXQgc2NyaXB0J3Mgb3duIG91dHB1dCB3b3VsZCBoYXZlIGNhcnJpZWQgaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGNvbW1pdCB0aGF0IGZvcmNlcyBhIHtAbGluayBCdW1wRmxvb3J9LCByZW5kZXJlZCBpbnRvIHRoZSByZWZ1c2FsIHNvIHRoZSBhdXRob3IgY2FuIGdvIGFuZCBsb29rIGF0IGl0LlxuICovXG5pbnRlcmZhY2UgRm9yY2luZ0NvbW1pdCB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gdGhpcyBvbmUgY29tbWl0IGZvcmNlcyBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogV2hhdCBpbiB0aGUgY29tbWl0IGZvcmNlZCBpdCBcdTIwMTQgdGhlIGAhYCBtYXJrZXIsIHRoZSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyLCBvciB0aGUgYGZlYXRgIHR5cGUgXHUyMDE0IG5hbWVkXG4gICAqIHNvIGEgcmVhZGVyIGNhbiB0ZWxsIGEgZGVsaWJlcmF0ZSBicmVha2luZyBtYXJrZXIgZnJvbSBhIGZvb3RlciBzb21lYm9keSB3cm90ZSBpbiBwYXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGNvbW1pdCBoYXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlciwgaW4gYm90aCBzcGVsbGluZ3MgQ29udmVudGlvbmFsIENvbW1pdHMgYWxsb3dzLlxuICpcbiAqIE1hdGNoZWQgcGVyIGxpbmUgKGBtYCkgcmF0aGVyIHRoYW4gYWdhaW5zdCB0aGUgd2hvbGUgbWVzc2FnZSwgYmVjYXVzZSBhIGZvb3RlciBzaXRzIGF0IHRoZSBib3R0b20gb2YgdGhlXG4gKiBib2R5LiBJdCBpcyB0aGUgaGFsZiBvZiB0aGUgYnJlYWtpbmctY2hhbmdlIHNpZ25hbCB0aGF0IHtAbGluayBNRVJHRV9TVUJKRUNUX1JFR19FWFB9J3Mgc2libGluZyByZXdyaXRlXG4gKiBjYW5ub3QgY2Fycnk6IGB0b0NoYW5nZWxvZ0VudHJ5YCBsaWZ0cyBvbmx5IHRoZSBtZXJnZSBib2R5J3MgZmlyc3QgbGluZSBvbnRvIHRoZSBtZXJnZSBzdWJqZWN0LCBzbyBhIGZvb3RlclxuICogd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgbmV2ZXIgcmVhY2hlcyB0aGUgZmlyc3QtcGFyZW50IGhpc3RvcnkgYXQgYWxsLiBUaGF0IGlzIHdoeVxuICoge0BsaW5rIGdldEJ1bXBGbG9vcn0gcmVhZHMgZXZlcnkgY29tbWl0IGluIHRoZSByYW5nZSByYXRoZXIgdGhhbiBvbmx5IHRoZSBmaXJzdC1wYXJlbnQgb25lcy5cbiAqL1xuY29uc3QgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQID0gL15CUkVBS0lOR1sgLV1DSEFOR0U6L207XG5cbi8qKlxuICogVGhlIG1hcmtlciBuYW1lcyBhIHtAbGluayBGb3JjaW5nQ29tbWl0fSBjYXJyaWVzLCBhbmQgdGhlcmVmb3JlIHdoYXQgdGhlIHJlZnVzYWwgbWVzc2FnZSBzYXlzIGZvcmNlZCB0aGVcbiAqIGZsb29yLiBUaGV5IGFyZSBzcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZWR1Y2VkIHRvIHRoZSBsZXZlbCBhbG9uZSwgYmVjYXVzZSBgZmVhdCFgIGFuZCBhIGBCUkVBS0lORyBDSEFOR0U6YFxuICogZm9vdGVyIGJ1cmllZCBpbiBhIGJvZHkgYXJlIHZlcnkgZGlmZmVyZW50IHRoaW5ncyB0byBiZSB0b2xkIGFib3V0LlxuICovXG5jb25zdCBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUiA9ICdhIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBCUkVBS0lOR19NQVJLRVIgPSAndGhlIGAhYCBicmVha2luZyBtYXJrZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBGRUFUX1RZUEVfTUFSS0VSID0gJ2EgYGZlYXRgIHR5cGUnO1xuXG4vKipcbiAqIEEgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdDogYSB0eXBlLCBhbiBvcHRpb25hbCBzY29wZSwgYW4gb3B0aW9uYWwgYCFgLCB0aGVuIHRoZSBjb2xvbi5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgdG9sZXJhbnQgb2YgYSBzdWJqZWN0IHRoYXQgaXMgbm90IG9uZSBhdCBhbGwgXHUyMDE0IGFuIHVucGFyc2FibGUgc3ViamVjdCBzaW1wbHkgY29uc3RyYWluc1xuICogbm90aGluZywgd2hpY2ggaXMgdGhlIHNhbWUgYW5zd2VyIGEgYGNob3JlOmAgZ2l2ZXMuIFRoaXMgZ2F0ZSBleGlzdHMgdG8gY2F0Y2ggYSBidW1wIHRoYXQgaXMgdG9vIExPVywgc29cbiAqIGZhaWxpbmcgdG8gcmVjb2duaXplIGEgc3ViamVjdCBjYW4gb25seSB1bmRlci1jb25zdHJhaW4sIG5ldmVyIHJlZnVzZSBhIHJlbGVhc2UgdGhhdCBzaG91bGQgaGF2ZSBzaGlwcGVkLlxuICovXG5jb25zdCBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUCA9IC9eKD88dHlwZT5bYS16XSspKD86XFwoW14oKV0qXFwpKT8oPzxicmVha2luZz4hKT86XFxzL2k7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcHJlLXJlbGVhc2UgaWRlbnRpZmllciB1c2VkIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9ucy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUkVJRCA9ICdiZXRhJztcblxuLyoqXG4gKiBUaGUgQ29udmVudGlvbmFsLUNvbW1pdHMgdHlwZSB0aGF0IGZvcmNlcyBhIG1pbm9yLlxuICovXG5jb25zdCBGRUFUX1RZUEUgPSAnZmVhdCc7XG5cbi8qKlxuICogVGhlIG5wbSBzY3JpcHRzIHdob3NlIGNoZWNrcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgaXMgaGVsZCB0bywgbmFtZWQgaW4gdGhlIG1lc3NhZ2VzIHNvIGEgcmVhZGVyIGtub3dzIHdoaWNoXG4gKiBnYXRlIHRoZXkgYXJlIGxvb2tpbmcgYXQgXHUyMDE0IGFuZCBrbm93cyB0aGF0IGZpeGluZyBpdCBoZXJlIGlzIHRoZSBzYW1lIGZpeCBhcyBmaXhpbmcgaXQgb24gdGhlIGJyYW5jaC5cbiAqL1xuY29uc3QgTElOVF9NRF9TQ1JJUFRfTkFNRSA9ICdsaW50Om1kJztcblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBhIGNvbW1pdCBoYXNoIHRoZSBidW1wLWZsb29yIHJlZnVzYWwgcHJpbnRzLiBMb25nIGVub3VnaCB0byBwYXN0ZSBpbnRvIGBnaXQgc2hvd2AsIHNob3J0IGVub3VnaFxuICogdGhhdCBhIGxpc3Qgb2YgdGhlbSBzdGF5cyByZWFkYWJsZS5cbiAqL1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogU2VlIHtAbGluayBMSU5UX01EX1NDUklQVF9OQU1FfS5cbiAqL1xuY29uc3QgU1BFTExDSEVDS19TQ1JJUFRfTkFNRSA9ICdzcGVsbGNoZWNrJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGYsIHJhdGhlciB0aGFuIG9uZSBhbiBhdXRob3IgY2hvc2UuXG4gKlxuICogRXZlcnkgZGVmYXVsdCBnaXQgcHJvZHVjZXMgb3BlbnMgd2l0aCBgTWVyZ2VgIGFuZCBhIHdvcmQgYm91bmRhcnkgXHUyMDE0IGBNZXJnZSBicmFuY2ggJ3gnYCxcbiAqIGBNZXJnZSBicmFuY2hlcyAneCcgYW5kICd5J2AsIGBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICd4J2AsIGBNZXJnZSBwdWxsIHJlcXVlc3QgIzEgZnJvbSB5YCxcbiAqIGBNZXJnZSB0YWcgJ3gnYCwgYE1lcmdlIGNvbW1pdCAnYWJjJ2AgXHUyMDE0IHdoaWNoIGlzIHdoYXQgdGhlIG9wdGlvbmFsIGFsdGVybmF0aW9uIGFuZCB0aGUgdHJhaWxpbmcgYFxcYmAgY292ZXJcbiAqIGJldHdlZW4gdGhlbS4gQmVpbmcgdGhhdCBicm9hZCBjb3N0cyBub3RoaW5nIGhlcmU6IGV2ZXJ5IGNoYW5nZWxvZyBlbnRyeSBpbiB0aGlzIHdvcmtzcGFjZSBpcyBhXG4gKiBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0LCBhbmQgdGhvc2Ugb3BlbiB3aXRoIGEgdHlwZSAoYGZlYXRgLCBgZml4YCwgYGNob3JlYCwgXHUyMDI2KSwgbmV2ZXIgd2l0aCBgTWVyZ2VgLlxuICpcbiAqIE9ORSBwYXR0ZXJuIGRyaXZlcyBib3RoIGhhbHZlcyBvZiB0aGUgZ3VhcmQsIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGFwYXJ0OiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gcmV3cml0ZXNcbiAqIGEgY29tbWl0IHdob3NlIHN1YmplY3QgbWF0Y2hlcyBpdCwgYW5kIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IHJlZnVzZXMgYSBjaGFuZ2Vsb2cgbGluZVxuICogdGhhdCBzdGlsbCBkb2VzLiBUaGUgcmVmdXNhbCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgZm9yIGEgbWVyZ2UgdGhlIHJld3JpdGUgaGFkIG5vdGhpbmcgdG8gd29yayB3aXRoLlxuICovXG5jb25zdCBNRVJHRV9TVUJKRUNUX1JFR19FWFAgPSAvXk1lcmdlKD86IGJyYW5jaHwgcmVtb3RlLXRyYWNraW5nfCBwdWxsIHJlcXVlc3QpP1xcYi87XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlcyBhIGNhbGxlciBuYW1lcyBkaXJlY3RseSwga2V5ZWQgYnkgdGhlaXIgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgdHdvIGBnZXRWZXJzaW9uVXBkYXRlVHlwZWAgZGVyaXZlcy5cbiAqL1xuY29uc3QgTkFNRURfVkVSU0lPTl9VUERBVEVfVFlQRVMgPSBuZXcgTWFwPHN0cmluZywgVmVyc2lvblVwZGF0ZVR5cGU+KFtcbiAgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZU1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZVxuXS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0eXBlXSkpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5JywgLi4uKHNob3VsZFZlcmlmeUNvbW1pdCA/IFtdIDogWyctLW5vLXZlcmlmeSddKV07XG5cbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYWRkJywgJy0tYWxsJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChjb21taXRBcmd1bWVudHMsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIEdpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9naXQtc2NtLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4sIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHVuY29tbWl0dGVkIGNoYW5nZXMuXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHMgYW55IGJhcmUgYGh0dHAocyk6Ly9gIFVSTCBpbiB0aGUgZ2l2ZW4gdGV4dCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgc28gdGhhdCB0ZXh0IGVtaXR0ZWRcbiAqIGludG8gYSBNYXJrZG93biBkb2N1bWVudCAoc3VjaCBhcyBhIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgYnVsbGV0KSBwYXNzZXMgbWFya2Rvd25saW50J3NcbiAqIGBNRDAzNC9uby1iYXJlLXVybHNgIHJ1bGUgd2hpbGUgc3RpbGwgcmVuZGVyaW5nIGFzIGEgY2xpY2thYmxlIGF1dG9saW5rIG9uIEdpdEh1Yi5cbiAqXG4gKiBVUkxzIHRoYXQgYXJlIGFscmVhZHkgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgb3IgdGhhdCBmb3JtIHRoZSB0YXJnZXQgb2YgYSBNYXJrZG93blxuICogbGluayAoYFt0ZXh0XSh1cmwpYCkgYXJlIGxlZnQgdW50b3VjaGVkLCBzbyB0aGUgZnVuY3Rpb24gaXMgc2FmZSB0byBydW4gcmVwZWF0ZWRseS4gVHJhaWxpbmdcbiAqIHNlbnRlbmNlIHB1bmN0dWF0aW9uIChgLmAsIGAsYCwgYDtgLCBgOmAsIGAhYCwgYD9gKSBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXRzIHNvIGl0IGRvZXNcbiAqIG5vdCBiZWNvbWUgcGFydCBvZiB0aGUgbGluay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHBvc3NpYmx5IGNvbnRhaW5pbmcgYmFyZSBVUkxzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBldmVyeSBiYXJlIFVSTCB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b2xpbmtCYXJlVXJscyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC8oPzwhWzxbKF0paHR0cHM/OlxcL1xcL1teXFxzPD4pXFxdXSsvZywgKHVybCkgPT4ge1xuICAgIGNvbnN0IHRyYWlsaW5nUHVuY3R1YXRpb24gPSAvWy4sOzohP10rJC8uZXhlYyh1cmwpPy5bMF0gPz8gJyc7XG4gICAgY29uc3QgYmFyZVVybCA9IHVybC5zbGljZSgwLCB1cmwubGVuZ3RoIC0gdHJhaWxpbmdQdW5jdHVhdGlvbi5sZW5ndGgpO1xuICAgIHJldHVybiBgPCR7YmFyZVVybH0+JHt0cmFpbGluZ1B1bmN0dWF0aW9ufWA7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyB2ZXJzaW9uIHN0cmluZyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZCB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFVzZXMgdGhlIGBzZW12ZXJgIHBhY2thZ2UgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLCBzdXBwb3J0aW5nIGFsbCBucG0gaW5jcmVtZW50IHR5cGVzOlxuICogYG1ham9yYCwgYG1pbm9yYCwgYHBhdGNoYCwgYHByZW1ham9yYCwgYHByZW1pbm9yYCwgYHByZXBhdGNoYCwgYW5kIGBwcmVyZWxlYXNlYC5cbiAqIFByZS1yZWxlYXNlIHZlcnNpb25zIHVzZSB0aGUgYGJldGFgIGlkZW50aWZpZXIgYnkgZGVmYXVsdCAoZS5nLiwgYDEuMi40LWJldGEuMGApLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIG9yIGFuIGV4cGxpY2l0IHZlcnNpb24gc3RyaW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHZlcnNpb24gc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGludmFsaWQgb3IgdGhlIGluY3JlbWVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHZlcnNpb25UeXBlID0gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAodmVyc2lvblR5cGUgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCkge1xuICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbiA/PyAnJztcblxuICBjb25zdCByZWxlYXNlVHlwZSA9IHZlcnNpb25UeXBlIGFzIFJlbGVhc2VUeXBlO1xuICBjb25zdCBpc1ByZVJlbGVhc2VUeXBlID0gcmVsZWFzZVR5cGUuc3RhcnRzV2l0aCgncHJlJyk7XG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBpc1ByZVJlbGVhc2VUeXBlXG4gICAgPyBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlLCBERUZBVUxUX1BSRUlEKVxuICAgIDogaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld1ZlcnNpb24sIGBGYWlsZWQgdG8gaW5jcmVtZW50IHZlcnNpb24gZnJvbSAnJHtjdXJyZW50VmVyc2lvbn0nIHdpdGggdHlwZSAnJHt2ZXJzaW9uVHlwZX0nYCk7XG5cbiAgcmV0dXJuIG5ld1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHZlcnNpb24gZnJvbSB0aGUgY2hhbmdlbG9nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSByZWxlYXNlIG5vdGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbik7XG4gIGxldCByZWxlYXNlTm90ZXMgPSBzZWN0aW9uID8gYCR7c2VjdGlvbn1cXG5cXG5gIDogJyc7XG5cbiAgY29uc3QgdGFnT3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHRhZ3MgPSB0YWdPdXRwdXQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gdGFnc1sxXTtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAudXJsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNoYW5nZXNVcmwgPSBwcmV2aW91c1ZlcnNpb24gPyBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gIDogYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IG5hbWVkVmVyc2lvblVwZGF0ZVR5cGUgPSBOQU1FRF9WRVJTSU9OX1VQREFURV9UWVBFUy5nZXQodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAobmFtZWRWZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIHJldHVybiBuYW1lZFZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgcmV0dXJuIC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSA/IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCA6IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG59XG5cbi8qKlxuICogUHVzaGVzIGNvbW1pdHMgYW5kIHRhZ3MgdG8gdGhlIHJlbW90ZSBHaXQgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHB1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0UHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgcHVzaCAtLWZvbGxvdy10YWdzIC0tZm9yY2UnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogVGhlIGZsYWdzIHtAbGluayBwYXJzZVZlcnNpb25Bcmd1bWVudHN9IHJlY29nbml6ZXMsIGluIHRoZSBzaGFwZSBOb2RlJ3MgYHBhcnNlQXJnc2AgdGFrZXMuIEV4cG9ydGVkIHNvIGEgd3JhcHBlclxuICogdGhhdCBhZGRzIGZsYWdzIG9mIGl0cyBvd24gY2FuIHBhcnNlIHRoZW0gYWxsIGluIG9uZSBwYXNzIGFuZCBzdGlsbCByZWFkIHRoZXNlIHRocm91Z2hcbiAqIHtAbGluayB0b1VwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OUyA9IHtcbiAgJ2NoYW5nZWxvZy1maWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8taXNzdWUtY2xvc2luZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxufSBhcyBjb25zdCBzYXRpc2ZpZXMgTm9uTnVsbGFibGU8UGFyc2VBcmdzQ29uZmlnWydvcHRpb25zJ10+O1xuXG4vKipcbiAqIFRoZSB2YWx1ZXMgYHBhcnNlQXJnc2AgcmVwb3J0cyBmb3Ige0BsaW5rIFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU30uXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25Bcmd1bWVudFZhbHVlcyA9IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJnczxWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZz4+Wyd2YWx1ZXMnXTtcblxuLyoqXG4gKiBUaGUgYHBhcnNlQXJnc2AgY29uZmlndXJhdGlvbiB7QGxpbmsgVmVyc2lvbkFyZ3VtZW50VmFsdWVzfSBpcyBkZXJpdmVkIGZyb20uXG4gKi9cbmludGVyZmFjZSBWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjb2duaXplZCBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IHR5cGVvZiBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlM7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHZlcnNpb24gaXMgYSBwcmUtcmVsZWFzZSwgc3VjaCBhcyBgMS4yLjQtYmV0YS4wYC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxuICogQHJldHVybnMgV2hldGhlciBpdCBjYXJyaWVzIGEgcHJlLXJlbGVhc2UgcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlUmVsZWFzZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByZXJlbGVhc2UodmVyc2lvbikgIT09IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBhIHZlcnNpb24gdXBkYXRlIGludG8gYSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZFxuICoge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqXG4gKiBFYWNoIGJlaGF2aW9yIGlzIGVuYWJsZWQgYnkgZGVmYXVsdDsgdGhlIGNvcnJlc3BvbmRpbmcgYC0tbm8tKmAgZmxhZyB0dXJucyBpdCBvZmYuIGAtLWNoYW5nZWxvZy1maWxlYCB0YWtlcyBhXG4gKiB2YWx1ZSBpbnN0ZWFkIGFuZCBoYXMgbm8gZGVmYXVsdC4gUmVjb2duaXplZCBmbGFnczpcbiAqIC0gYC0tY2hhbmdlbG9nLWZpbGU9PHBhdGg+YCBcdTIwMTQgdXNlIHRoaXMgZmlsZSdzIGNvbnRlbnRzIGFzIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uIGluc3RlYWQgb2ZcbiAqICAgdGhlIGNvbW1pdC1kZXJpdmVkIGJ1bGxldHMsIGFuZCBza2lwIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgZW50aXJlbHkuXG4gKiAtIGAtLW5vLWJ1aWxkYCBcdTIwMTQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCBcdTIwMTQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2AgXHUyMDE0IHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIFx1MjAxNCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1pc3N1ZS1jbG9zaW5nYCBcdTIwMTQgZG8gbm90IGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzKSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIENyZWF0ZXMgdGhlIHJlbGVhc2UgYW5kIGF0dGFjaGVzIHRoZSBmaWxlcyB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zLmdldFJlbGVhc2VBc3NldFBhdGhzfSBuYW1lcy5cbiAqXG4gKiBPbmNlIHRoZSByZWxlYXNlIGV4aXN0cywgdGhlIGlzc3VlcyBpdCBjYXJyaWVzIGFyZSBjbG9zZWQgd2l0aCBhIGxpbmsgdG8gaXQgKHNlZSB7QGxpbmsgY2xvc2VSZWxlYXNlZElzc3Vlc30pLFxuICogdW5sZXNzIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30gaXMgYGZhbHNlYC4gQSBmYWlsdXJlIHRoZXJlIGlzIHJlcG9ydGVkIGFuZFxuICogZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZSwgd2hpY2ggaXMgYWxyZWFkeSBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGxldCBmaWxlUGF0aHMgPSBhd2FpdCBnZXRSZWxlYXNlQXNzZXRQYXRocygpO1xuICBmaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGZpbGVQYXRoIH0pKSk7XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAnZ2gnLFxuICAgICdyZWxlYXNlJyxcbiAgICAnY3JlYXRlJyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIC4uLmZpbGVQYXRocyxcbiAgICAnLS10aXRsZScsXG4gICAgYHYke25ld1ZlcnNpb259YCxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoIXNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGNsb3NlUmVsZWFzZWRJc3N1ZXMoeyBuZXdWZXJzaW9uIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgVGhlICR7bmV3VmVyc2lvbn0gcmVsZWFzZSBpcyBwdWJsaXNoZWQsIGJ1dCBjbG9zaW5nIHRoZSBpc3N1ZXMgaXQgY2FycmllcyBmYWlsZWQ6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbi8qKlxuICogTWFwcyB0aGUgdmFsdWVzIGBwYXJzZUFyZ3NgIHJlcG9ydHMgZm9yIHtAbGluayBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlN9IG9udG8ge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzOiBWZXJzaW9uQXJndW1lbnRWYWx1ZXMpOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGg6IHZhbHVlc1snY2hhbmdlbG9nLWZpbGUnXSxcbiAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM6ICEodmFsdWVzWyduby1pc3N1ZS1jbG9zaW5nJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2c6ICEodmFsdWVzWyduby1jaGFuZ2Vsb2ctZWRpdGluZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0OiAhKHZhbHVlc1snbm8tY29tbWl0LXZlcmlmaWNhdGlvbiddID8/IGZhbHNlKVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSByZXZpZXcgaGFwcGVucyBvbiBhIHNjcmF0Y2ggY29weSBpbiB0aGUgT1MgdGVtcG9yYXJ5IGZvbGRlciwgYW5kIHRoZSByZXBvc2l0b3J5J3Mgb3duXG4gKiBgQ0hBTkdFTE9HLm1kYCBpcyB3cml0dGVuIG9ubHkgb25jZSB0aGUgcmV2aWV3IGlzIG92ZXIgXHUyMDE0IHNvIGludGVycnVwdGluZyB0aGUgcmV2aWV3IGxlYXZlcyB0aGVcbiAqIHJlcG9zaXRvcnkgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjaGFuZ2Vsb2cgcmV2aWV3IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGFuZ2Vsb2cgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgb3B0aW9ucykpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldywgaWYgb25lIGlzIGR1ZSwgY2FuIGFjdHVhbGx5IGJlIGFuc3dlcmVkLlxuICogNC4gVmVyaWZpZXMgdGhhdCB0aGUgYnVtcCBpcyBub3QgbG93ZXIgdGhhbiB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcgZm9yY2UgaXQgdG8gYmUuXG4gKiA1LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDYuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDcuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDguIFNldHRsZXMgdGhlIGNoYW5nZWxvZyBcdTIwMTQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqICAgIFRoZSBzZXR0bGVkIHRleHQgaXMgbGludGVkIGhlcmUgdG9vOiBgbGludDptZGAgcmFuIGluIHN0ZXAgNiwgYmVmb3JlIGEgY2hhcmFjdGVyIG9mIGl0IGV4aXN0ZWQuXG4gKiA5LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgKGFuZCBpbiB3aGF0ZXZlciB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnMudXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc30gYWRkcyksIHRoZW5cbiAqICAgIHdyaXRlcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cuXG4gKiAxMC4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTEuIFByZXBhcmVzIGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqIDEyLiBDbG9zZXMgdGhlIGlzc3VlcyB0aGUgcmVsZWFzZSBjYXJyaWVzLCB3aXRoIGEgbGluayB0byBpdC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIGdldFJlbGVhc2VBc3NldFBhdGhzLFxuICAgIHByZXBhcmVHaXRIdWJSZWxlYXNlLFxuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzID0gdHJ1ZSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUsXG4gICAgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCBhc3NlcnRHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk7XG4gIC8vIENoZWNrZWQgaGVyZSwgYmVmb3JlIHRoZSBjaGVja3MgYW5kIHRoZSBidWlsZCwgcmF0aGVyIHRoYW4gYXQgdGhlIGNoYW5nZWxvZyBzdGVwIGl0c2VsZjogYSBub24taW50ZXJhY3RpdmVcbiAgLy8gY2FsbGVyIGxlYXJucyBpbiBzZWNvbmRzIGluc3RlYWQgb2YgcGF5aW5nIGZvciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGFuZCBvbmx5IHRoZW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yXG4gIC8vIHdpbmRvdyBub2JvZHkgd2lsbCBldmVyIGNsb3NlLlxuICBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbi4gRGVsaWJlcmF0ZWx5IE5PVCB1bmRlciBgc2hvdWxkUnVuQ2hlY2tzYDogdGhhdCBmbGFnIGJ1eXMgYSBmYXN0IHJlbGVhc2UgYnlcbiAgLy8gc2tpcHBpbmcgdGhlIFZFUklGSUNBVElPTiBvZiB0aGUgY29kZSwgYW5kIHRoaXMgaXMgYSBjb3JyZWN0bmVzcyBnYXRlIG9uIHRoZSByZWxlYXNlIGl0c2VsZiBcdTIwMTQgdGhlIGJ1bXBcbiAgLy8gYSBgLS1uby1jaGVja3NgIHJlbGVhc2Ugc2hpcHMgaXMgYXMgcHVibGljLCBhbmQgYXMgdW5maXhhYmxlIGFmdGVyd2FyZHMsIGFzIGFueSBvdGhlci5cbiAgYXdhaXQgYXNzZXJ0VmVyc2lvblVwZGF0ZVR5cGVNZWV0c0J1bXBGbG9vcih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGFzc2VydEdpdFJlcG9DbGVhbigpO1xuICB9XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIHByZWZsaWdodCBJUyBgbnBtIHJ1biBnYXRlYCwgbm90IGEgY29weSBvZiBpdDogYSBjaGVjayBhZGRlZCB0byB0aGUgZ2F0ZSBpcyByZWFjaGFibGVcbiAgLy8gZnJvbSB0aGUgYnJhbmNoIGFuZCBmcm9tIHRoZSByZWxlYXNlIGJ5IGNvbnN0cnVjdGlvbiwgaW5zdGVhZCBvZiBieSB0d28gbGlzdHMgaGFwcGVuaW5nIHRvIGFncmVlLlxuICAvLyBUaGUgY2xlYW4tcmVwbyBhc3NlcnRpb24gYWJvdmUgc3RheXMgaGVyZSwgYmVjYXVzZSB0aGUgZ2F0ZSBpcyBydW4gb24gYSBkaXJ0eSB0cmVlIG9uIHB1cnBvc2UuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBhd2FpdCBnYXRlKHtcbiAgICBzaG91bGRCdWlsZCxcbiAgICBzaG91bGRSdW5DaGVja3MsXG4gICAgc2hvdWxkUnVuSW50ZWdyYXRpb25UZXN0czogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgLy8gVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhXG4gIC8vIGh1bWFuLiBJbnRlcnJ1cHRpbmcgaXQgdGhlcmVmb3JlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIHByaXN0aW5lIGFuZCB0aGUgd2hvbGUgcmVsZWFzZSByZS1ydW5uYWJsZSxcbiAgLy8gaW5zdGVhZCBvZiBzdHJhbmRpbmcgYSBidW1wZWQtYnV0LXVuY29tbWl0dGVkIHRyZWUgdGhhdCBgYXNzZXJ0R2l0UmVwb0NsZWFuYCB0aGVuIHJlZnVzZXMgdG8gcmUtcmVsZWFzZS5cbiAgY29uc3QgbmV3Q2hhbmdlTG9nID0gYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZ1xuICB9KTtcblxuICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlcz8uKG5ld1ZlcnNpb24pO1xuXG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZyk7XG4gIGF3YWl0IGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb24sIHsgc2hvdWxkVmVyaWZ5Q29tbWl0IH0pO1xuICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbik7XG5cbiAgaWYgKCFzaG91bGRSZWxlYXNlKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKSgnU2tpcHBpbmcgZ2l0IHB1c2ggYW5kIEdpdEh1YiByZWxlYXNlICgtLW5vLXJlbGVhc2UpLiBUaGUgdmVyc2lvbiBidW1wLCBjaGFuZ2Vsb2csIGNvbW1pdCwgYW5kIHRhZyBoYXZlIGJlZW4gY3JlYXRlZCBsb2NhbGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGdpdFB1c2goKTtcbiAgYXdhaXQgcHJlcGFyZUdpdEh1YlJlbGVhc2U/LihuZXdWZXJzaW9uKTtcbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgeyBnZXRSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIGBwYWNrYWdlLmpzb25gIGFuZCwgd2hlcmUgdGhleSBleGlzdCwgYHBhY2thZ2UtbG9jay5qc29uYCBhbmQgYG5wbS1zaHJpbmt3cmFwLmpzb25gLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIG1hdGNoZXMgb25lIG9mIHRoZSBtYWludGFpbmVyJ3Mgb3duIHVucHVibGlzaGVkIGZvcmJpZGRlbiBwYXR0ZXJucy5cbiAqXG4gKiBFdmVyeSBjb21taXQgc3ViamVjdCBzaW5jZSB0aGUgbGFzdCB0YWcgc2hpcHMgdmVyYmF0aW0gaW50byB0aGUgbmV3IHNlY3Rpb24sIHNvIGEgc3ViamVjdCB0aGF0IGNhcnJpZXNcbiAqIHZvY2FidWxhcnkgcHJpdmF0ZSB0byB0aGUgbWFpbnRhaW5lciBcdTIwMTQgYW4gaW50ZXJuYWwgdHJhY2tlciBpZCwgYSBwcml2YXRlIHByb2plY3Qgc2hvcnQgbmFtZSBcdTIwMTQgbGFuZHMgaW4gYVxuICogY2hlY2tlZC1pbiwgcHVibGlzaGVkIGZpbGUgaW5zaWRlIHRoZSByZWxlYXNlIGNvbW1pdCwgd2hlcmUgbm90aGluZyBldmVyIGxvb2tzIGF0IGl0IGFnYWluLiBUaGUgbGlzdCBvZiB3aGF0XG4gKiBjb3VudHMgYXMgcHJpdmF0ZSBjYW5ub3QgbGl2ZSBpbiB0aGlzIGxpYnJhcnkgb3IgaW4gdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBwdWJsaXNoaW5nIHRoZSB2ZXJ5IHRoaW5nIGl0XG4gKiBwcm90ZWN0cywgc28gaXQgY29tZXMgZnJvbSB0aGUgZmlsZSB7QGxpbmsgRk9SQklEREVOX1BBVFRFUk5TX0ZJTEVfRU5WX1ZBUklBQkxFfSBuYW1lcywgYW5kIHRoaXMgaXMgYSBuby1vcFxuICogd2hlcmV2ZXIgdGhhdCBpcyBub3QgY29uZmlndXJlZC5cbiAqXG4gKiBMaWtlIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9LCBvbmx5IHRoZSBzZWN0aW9uIGJlaW5nIHB1Ymxpc2hlZCBpcyBzY2FubmVkLCBhbmQgdGhlIHRocm93XG4gKiBjb21lcyBiZWZvcmUgYW55dGhpbmcgaXMgd3JpdHRlbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgcmVhZEZvcmJpZGRlblBhdHRlcm5zKCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMoZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbiksIHBhdHRlcm5zKTtcblxuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IG1hdGNoZXMgYSBwYXR0ZXJuIGZyb20gdGhlIGZpbGVgXG4gICAgICArIGAgJHtGT1JCSURERU5fUEFUVEVSTlNfRklMRV9FTlZfVkFSSUFCTEV9IG5hbWVzOlxcbmBcbiAgICAgICsgYCR7bWF0Y2hlcy5tYXAoKHsgbGluZSwgbWF0Y2ggfSkgPT4gYCR7bGluZX0gICAgPC0gJHttYXRjaH1gKS5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdOb3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LiBTdXBwbHkgcmVsZWFzZSBub3RlcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZyB3aXRob3V0IGl0LCB3aXRoJ1xuICAgICAgKyAnIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAsIG9yIHJlbW92ZSBpdCBhdCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCBhbmQgcmUtcnVuIHRoZSByZWxlYXNlLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIHN0aWxsIGNhcnJpZXMgYW4gZW50cnkgdGhhdCByZWFkcyBhcyBhIG1lcmdlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZi5cbiAqXG4gKiBUaGUgY29udmVudGlvbiB0aGlzIGVuZm9yY2VzIGlzIHRoYXQgYSBub24tZmYgbWVyZ2UgdGFrZXMgdGhlIHNhbWUgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdCBhcyB0aGUgYnJhbmNoXG4gKiBjb21taXQgaXQgbGFuZHMuIE5vdGhpbmcgdXNlZCB0byBob2xkIGl0OiBmb3IgYSBub24tZmYgbWVyZ2UgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgaXMgdGhlIG1lcmdlIGNvbW1pdCwgc28gYVxuICogZGVmYXVsdCBzdWJqZWN0IHNoaXBzIHZlcmJhdGltLCBwdWJsaXNoaW5nIGEgYmFyZSBicmFuY2ggbmFtZSAoYE1lcmdlIGJyYW5jaCAnZml4LXRoZS10aGluZydgKSBhcyBhIGNoYW5nZWxvZ1xuICogZW50cnkgXHUyMDE0IHdoaWNoIHNheXMgbm90aGluZyBhYm91dCB3aGF0IGNoYW5nZWQsIGFuZCBvbiBhIGJyYW5jaCBuYW1lZCBhZnRlciBhIHByaXZhdGUgdHJhY2tlciBpdGVtIGRlY29kZXMgdG9cbiAqIG5vdGhpbmcgYXQgYWxsIGZvciBhIHJlYWRlci4gVGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgdGhlIGRlIGZhY3RvIGNhdGNoLCBhbmQgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgLCB0aGVcbiAqIGZsYWcgYW4gdW5hdHRlbmRlZCByZWxlYXNlIGFjdHVhbGx5IHVzZXMsIHNraXBzIGl0OyBvbmUgc3dlZXAgYWNyb3NzIHRoaXMgd29ya3NwYWNlIGZvdW5kIHR3ZWx2ZSBzdWNoXG4gKiBwdWJsaXNoZWQgZW50cmllcyBpbiBhIHNpbmdsZSByZXBvc2l0b3J5LlxuICpcbiAqIE9ubHkgdGhlIHNlY3Rpb24gYmVpbmcgcHVibGlzaGVkIGlzIHNjYW5uZWQsIHNvIGFuIGVudHJ5IGFscmVhZHkgc2hpcHBlZCB1bmRlciBhbiBvbGRlciB2ZXJzaW9uIGNhbm5vdCBibG9ja1xuICogZXZlcnkgZnV0dXJlIHJlbGVhc2UuIHtAbGluayB0b0NoYW5nZWxvZ0VudHJ5fSBoYXMgYWxyZWFkeSByZXdyaXR0ZW4gZXZlcnkgbWVyZ2UgdGhhdCBoYWQgYSBib2R5IHRvIHJld3JpdGVcbiAqIGZyb20sIHNvIHdoYXQgcmVhY2hlcyBoZXJlIGlzIGEgbWVyZ2Ugd2hvc2UgYXV0aG9yIHdyb3RlIG5vdGhpbmcgYXQgYWxsIFx1MjAxNCB3aGljaCBubyByZXdyaXRlIGNhbiBpbnZlbnQsIGFuZFxuICogd2hpY2ggaXMgdGhlcmVmb3JlIHdvcnRoIHN0b3BwaW5nIHRoZSByZWxlYXNlIGZvci5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgQlVMTEVUX1JFR19FWFAgPSAvXi0gLztcbiAgY29uc3Qgb2ZmZW5kaW5nRW50cmllcyA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUC50ZXN0KGxpbmUucmVwbGFjZShCVUxMRVRfUkVHX0VYUCwgJycpKSk7XG5cbiAgaWYgKG9mZmVuZGluZ0VudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBjYXJyaWVzIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOlxcbmBcbiAgICAgICsgYCR7b2ZmZW5kaW5nRW50cmllcy5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdTdWNoIGFuIGVudHJ5IHB1Ymxpc2hlcyBhIGJyYW5jaCBuYW1lIGluc3RlYWQgb2Ygc2F5aW5nIHdoYXQgc2hpcHBlZC4gR2l2ZSB0aGUgbWVyZ2UgY29tbWl0IHRoZSBzYW1lJ1xuICAgICAgKyAnIHN1YmplY3QgYXMgdGhlIGJyYW5jaCBjb21taXQgaXQgbGFuZHMgKGBnaXQgY29tbWl0IC0tYW1lbmRgIG9uIHRoZSBtZXJnZSwgdGhlbiByZS1ydW4gdGhlIHJlbGVhc2UpLCBvcidcbiAgICAgICsgJyBzdXBwbHkgdGhlIHJlbGVhc2Ugbm90ZXMgeW91cnNlbGYgd2l0aCBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgcmVsZWFzZSB0aGF0IHdvdWxkIGhhdmUgdG8gc3RvcCBhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyB3aXRoIG5vYm9keSB0aGVyZSB0b1xuICogZmluaXNoIGl0LiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHNvIHRoZSByZWZ1c2FsIGNvc3RzIHNlY29uZHMsIG5vdCB0aGUgd2hvbGUgY2hlY2stYW5kLWJ1aWxkIGdhdGUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpcyBtZWFudCB0byBiZSByZXZpZXdlZCBpbnRlcmFjdGl2ZWx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaG91bGRFZGl0Q2hhbmdlbG9nOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkIHx8ICFzaG91bGRFZGl0Q2hhbmdlbG9nIHx8IHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ1RoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IG5lZWRzIGEgdGVybWluYWwsIGFuZCB0aGlzIHByb2Nlc3MgaGFzIG5vbmUsIHNvIHRoZSByZWxlYXNlIHdvdWxkIGJsb2NrIGZvcmV2ZXIuJ1xuICAgICAgKyAnIFBhc3MgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIHRvIGFjY2VwdCB0aGUnXG4gICAgICArICcgY2hhbmdlbG9nIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMgYXMgaXMuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSByZWxlYXNlIHdob3NlIGJ1bXAgaXMgTE9XRVIgdGhhbiB0aGUgY29tbWl0cyBpdCBpcyBhYm91dCB0byBwdWJsaXNoIGZvcmNlIGl0IHRvIGJlLlxuICpcbiAqIFRoZSBydWxlIHRoaXMgZW5mb3JjZXMgaXMgb2xkIGFuZCB3YXMgd3JpdHRlbiBkb3duIGFmdGVyIGA5Ni41LjFgIHNoaXBwZWQgc2l4IHVucmVsZWFzZWQgYGZlYXQ6YCBjb21taXRzIGFzXG4gKiBhIHBhdGNoOiBjaG9vc2UgdGhlIGJ1bXAgZnJvbSB0aGUgd2hvbGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3QgdGFnLCBuZXZlciBmcm9tIHRoZSBjaGFuZ2UgeW91IGhhcHBlbiB0byBiZVxuICogd29ya2luZyBvbi4gSXQgZGlkIG5vdCBob2xkIFx1MjAxNCBgMTA1LjEuMGAgb2YgdGhpcyBsaWJyYXJ5IGlzIGEgTUlOT1IgY2FycnlpbmcgYGZlYXQodml0ZXN0LWNvbmZpZykhYCwgc28gZXZlcnlcbiAqIGNvbnN1bWVyIG9uIGEgY2FyZXQgcmFuZ2UgdG9vayBhIGJyZWFraW5nIGNoYW5nZSB3aXRoIG5vIHZlcnNpb24gc2lnbmFsIFx1MjAxNCBhbmQgaXQgY291bGQgbm90IGhvbGQsIGJlY2F1c2UgaXRcbiAqIGFza2VkIGEgaHVtYW4gdG8gc2NhbiBhIHJhbmdlIGFuZCB0aGVuIHR5cGUgYSBidW1wIHRoYXQgbm90aGluZyBjb21wYXJlZCBhZ2FpbnN0IHdoYXQgdGhlIHNjYW4gd291bGQgaGF2ZVxuICogZm91bmQuIFRoaXMgaXMgdGhhdCBjb21wYXJpc29uLCBhdCB0aGUgb25lIG1vbWVudCB0aGUgcnVsZSBpcyBiZWluZyBicm9rZW4uXG4gKlxuICogSXQgcmVmdXNlcyBvbmx5IGEgYnVtcCB0aGF0IGlzIHRvbyBMT1cuIEEgZGVsaWJlcmF0ZWx5IGhpZ2hlciBvbmUgXHUyMDE0IGEgbWFqb3IgY3V0IHRvIHNpZ25hbCBhIGJyZWFrIGxhdGUsIGFcbiAqIG1pbm9yIGZvciBhIHJhbmdlIG9mIHB1cmUgYGZpeGBlcyBcdTIwMTQgcGFzc2VzIHVudG91Y2hlZCwgYW5kIHRoZXJlIGlzIG5vIGZsYWcgdG8gc3dpdGNoIHRoZSBnYXRlIG9mZjogYW5cbiAqIG9wdC1vdXQgaXMgd2hhdCBnZXRzIHJlYWNoZWQgZm9yIHJlZmxleGl2ZWx5LCBhbmQgdGhlIGxlZ2l0aW1hdGUgZXNjYXBlIChidW1wIGhpZ2hlcikgYWxyZWFkeSBleGlzdHMuXG4gKlxuICogQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCByYXRoZXIgdGhhbiBhdCB0aGUgYnVtcCBpdHNlbGYsIHNvIGEgcmVmdXNhbCBjb3N0cyBzZWNvbmRzIGluc3RlYWQgb2YgdGhlIHdob2xlXG4gKiBjaGVjay1hbmQtYnVpbGQgZ2F0ZSwgYW5kIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB3aGVuIGl0IHRocm93cy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0aGUgcmVsZWFzZSB3YXMgYXNrZWQgZm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRWZXJzaW9uVXBkYXRlVHlwZU1lZXRzQnVtcEZsb29yKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgY29uc3QgbGFzdFRhZyA9IGF3YWl0IHJlc29sdmVMYXN0UmVsZWFzZWRUYWcoYXdhaXQgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXMoKSk7XG5cbiAgLy8gTm8gYmFzZWxpbmUsIG5vIHJhbmdlLCBubyBmbG9vci4gVGhpcyBpcyBhIGZpcnN0IHJlbGVhc2UsIG9yIG9uZSB3aG9zZSBwcmV2aW91cyB0YWcgd2FzIGRlbGV0ZWQgXHUyMDE0IHRoZVxuICAvLyBjaGFuZ2Vsb2cgc3RlcCBmYWxscyBiYWNrIHRvIHRoZSBmdWxsIGhpc3RvcnkgdGhlcmUsIGFuZCBkZXJpdmluZyBhIGZsb29yIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBvZiBhIHJlcG9cbiAgLy8gYWJvdXQgdG8gY3V0IGAxLjAuMGAgd291bGQgcmVmdXNlIGl0IG92ZXIgY29tbWl0cyB0aGF0IHByZWRhdGUgdGhlIGNvbmNlcHQgb2YgYSBwdWJsaXNoZWQgc3VyZmFjZS5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKCdObyBwcmV2aW91cyByZWxlYXNlIHRhZyByZXNvbHZlZCwgc28gdGhlIGJ1bXAgZmxvb3IgaXMgbm90IGRlcml2ZWQuIFRoZSBidW1wIGlzIHRha2VuIGFzIGdpdmVuLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ1bXBGbG9vciA9IGF3YWl0IGdldEJ1bXBGbG9vcihgJHtsYXN0VGFnfS4uSEVBRGApO1xuICBjb25zdCBmbG9vckxldmVsID0gYnVtcEZsb29yLmxldmVsO1xuICBpZiAoZmxvb3JMZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGNvbnN0IHRha2VuTGV2ZWwgPSB0b0VmZmVjdGl2ZUJ1bXBMZXZlbChsYXN0VGFnLCBuZXdWZXJzaW9uKTtcblxuICAvLyBBbiB1bnBhcnNhYmxlIGJhc2VsaW5lIG9yIHRhcmdldCBpcyBub3QgdGhpcyBnYXRlJ3MgYnVzaW5lc3MgdG8gZmFpbCBhIHJlbGVhc2Ugb3Zlci4gSXQgY2FuIG9ubHkgaGFwcGVuXG4gIC8vIGZvciBhIHRhZyB0aGF0IGlzIG5vdCBhIHZlcnNpb24gYXQgYWxsLCB3aGljaCBldmVyeSBvdGhlciBzdGVwIGhlcmUgd291bGQgaGF2ZSBpdHMgb3duIHRyb3VibGUgd2l0aC5cbiAgaWYgKCF0YWtlbkxldmVsKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKGBDb3VsZCBub3QgY29tcGFyZSAnJHtuZXdWZXJzaW9ufScgYWdhaW5zdCB0aGUgcHJldmlvdXMgdGFnICcke2xhc3RUYWd9Jywgc28gdGhlIGJ1bXAgZmxvb3IgaXMgbm90IGVuZm9yY2VkLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0J1bXBMZXZlbEF0TGVhc3QodGFrZW5MZXZlbCwgZmxvb3JMZXZlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyB0b0J1bXBGbG9vckVycm9yKGJ1bXBGbG9vciwge1xuICAgIGxhc3RUYWcsXG4gICAgbmV3VmVyc2lvbixcbiAgICB0YWtlbkxldmVsLFxuICAgIHZlcnNpb25VcGRhdGVUeXBlXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiBcdTIwMTQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBsb3dlc3QgYnVtcCBhIGNvbW1pdCByYW5nZSBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBmcm9tIHRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIHRoZVxuICogY29tbWl0cyBpbiBpdCBjYXJyeS5cbiAqXG4gKiBBIGAhYCBiZWZvcmUgdGhlIHN1YmplY3QncyBjb2xvbiwgb3IgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgLyBgQlJFQUtJTkctQ0hBTkdFOmAgZm9vdGVyLCBmb3JjZXMgYSBtYWpvcjsgYVxuICogYGZlYXRgIHR5cGUgZm9yY2VzIGEgbWlub3I7IGV2ZXJ5dGhpbmcgZWxzZSBcdTIwMTQgYGZpeGAsIGBjaG9yZWAsIGBkb2NzYCwgYHJlZmFjdG9yYCwgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IFx1MjAxNFxuICogY29uc3RyYWlucyBub3RoaW5nIGFuZCB5aWVsZHMgYSBwYXRjaCBmbG9vciwgd2hpY2ggaXMgbm8gY29uc3RyYWludCBhdCBhbGwuXG4gKlxuICogKipFdmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIGlzIHJlYWQsIGRlbGliZXJhdGVseSBOT1Qgb25seSB0aGUgZmlyc3QtcGFyZW50IG9uZXMqKiwgd2hpY2ggaXMgd2hlcmUgdGhpc1xuICogZGlmZmVycyBmcm9tIHRoZSBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIG92ZXIgdGhlIHNhbWUgcmFuZ2UuIFRoZSBjaGFuZ2Vsb2cgaXMgZmlyc3QtcGFyZW50IGJlY2F1c2UgaXQgcHVibGlzaGVzXG4gKiBvbmUgbGluZSBwZXIgbGFuZGVkIGNoYW5nZTsgYSBicmVha2luZyBjaGFuZ2UgaXMgYnJlYWtpbmcgd2hpY2hldmVyIHBhcmVudCBpdCBhcnJpdmVkIG9uLiBDb25jcmV0ZWx5LFxuICoge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGxpZnRzIG9ubHkgdGhlIEZJUlNUIGxpbmUgb2YgYSBtZXJnZSBib2R5IG9udG8gYSBkZWZhdWx0IG1lcmdlIHN1YmplY3QsIHNvIGFcbiAqIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIgd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgaXMgaW52aXNpYmxlIHRvIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSBcdTIwMTQgYW5kIGEgZm9vdGVyXG4gKiBpcyB0aGUgb25lIGJyZWFraW5nIHNpZ25hbCBDb252ZW50aW9uYWwgQ29tbWl0cyBwdXRzIGluIHRoZSBib2R5IHJhdGhlciB0aGFuIHRoZSBzdWJqZWN0LiBUaGUgY29zdCBvZlxuICogcmVhZGluZyBldmVyeXRoaW5nIGlzIG92ZXItZGV0ZWN0aW9uOiBhIGJyYW5jaCB3aG9zZSBicmVha2luZyBjb21taXQgd2FzIHJld29ya2VkIGludG8gYSBub24tYnJlYWtpbmcgbWVyZ2VcbiAqIHN0aWxsIGZvcmNlcyBhIG1ham9yLiBUaGF0IGRpcmVjdGlvbiBpcyBzYWZlIFx1MjAxNCBhbiBvdmVyLWJ1bXAgY29zdHMgYSBjb25zdW1lciBub3RoaW5nIGFuZCB0aGUgbWVzc2FnZSBuYW1lc1xuICogdGhlIGNvbW1pdCBzbyB0aGUgYXV0aG9yIGNhbiBzZWUgZXhhY3RseSB3aGljaCBvbmUgXHUyMDE0IGFuZCB0aGUgb3RoZXIgZGlyZWN0aW9uIGlzIHRoZSBkZWZlY3QgdGhpcyBleGlzdHMgZm9yLlxuICpcbiAqIEBwYXJhbSBjb21taXRSYW5nZSAtIFRoZSBnaXQgcmV2aXNpb24gcmFuZ2UgdG8gc2NhbiwgZS5nLiBgMTA1LjIuMC4uSEVBRGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgQnVtcEZsb29yfSB0aGUgcmFuZ2UgZm9yY2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCdW1wRmxvb3IoY29tbWl0UmFuZ2U6IHN0cmluZyk6IFByb21pc2U8QnVtcEZsb29yPiB7XG4gIC8vIGAlSCVuJUJgIHB1dHMgdGhlIGhhc2ggb24gaXRzIG93biBmaXJzdCBsaW5lIGFuZCB0aGUgZnVsbCBtZXNzYWdlIHVuZGVyIGl0LCBhbmQgYC16YCBzZXBhcmF0ZXMgdGhlXG4gIC8vIGNvbW1pdHMgd2l0aCBOVUwgXHUyMDE0IHNvIG5vdGhpbmcgaW4gYSBjb21taXQgbWVzc2FnZSBjYW4gYmUgbWlzdGFrZW4gZm9yIGEgcmVjb3JkIGJvdW5kYXJ5LlxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnbG9nJywgY29tbWl0UmFuZ2UsICctLWZvcm1hdD0lSCVuJUInLCAnLXonXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGZvcmNpbmdDb21taXRzID0gb3V0cHV0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gdG9Gb3JjaW5nQ29tbWl0KHJlY29yZCkpXG4gICAgLmZpbHRlcigoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdCAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JjaW5nQ29tbWl0cyxcbiAgICBsZXZlbDogdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzKVxuICB9O1xufVxuXG4vKipcbiAqIFJ1bnMgYGxpbnQ6bWRgJ3MgYW5kIGBzcGVsbGNoZWNrYCdzIGNoZWNrcyBvdmVyIHRoZSBORVcgc2VjdGlvbiBvZiBhIGNvbXBvc2VkIGNoYW5nZWxvZywgYmVmb3JlIGFueSBvZiBpdFxuICogcmVhY2hlcyB0aGUgcmVwb3NpdG9yeS5cbiAqXG4gKiBPbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyBjaGVja2VkLCBhbmQgZGVsaWJlcmF0ZWx5IHNvLiBUaGUgaG9uZXN0IGNoZWNrIGlzIHRoZSB3aG9sZSBmaWxlLCBidXQgaXQgZmFpbHMgYVxuICogcmVsZWFzZSBvbiBhIGRlZmVjdCBpbiBhIHNlY3Rpb24gc29tZWJvZHkgc2hpcHBlZCB5ZWFycyBhZ28gXHUyMDE0IHdoaWNoIGlzIGEgcmVsZWFzZSBub2JvZHkgY2FuIGN1dCB3aXRob3V0XG4gKiBmaXJzdCBmaXhpbmcgaGlzdG9yeSwgYW5kIGlzIGV4YWN0bHkgaG93IGEgY2hhbmdlbG9nIGRlZmVjdCBiZWNvbWVzIGEgcGVybWFuZW50IGJsb2NrZXIgaW5zdGVhZCBvZiBhXG4gKiB0d28tbWludXRlIGZpeC4gVGhhdCBpcyBub3QgaHlwb3RoZXRpY2FsIGZvciB0aGUgc3BlbGxpbmcgaGFsZiBpbiBwYXJ0aWN1bGFyOiBpdCBpcyB0aGUgc3RhdGUgZml2ZVxuICogcmVwb3NpdG9yaWVzIGluIHRoaXMgd29ya3NwYWNlIGFyZSBpbiwgZWFjaCB3aXRoIGEgY29pbmVkIHdvcmQgYWxyZWFkeSBwdWJsaXNoZWQgaW4gYW4gb2xkIHNlY3Rpb24uIFRoZSBuZXdcbiAqIHNlY3Rpb24gaXMgdGhlIG9ubHkgcGFydCB0aGlzIHJlbGVhc2UgaXMgcmVzcG9uc2libGUgZm9yLlxuICpcbiAqIEJPVEggY2hlY2tzIHJ1biBvdmVyIGV2ZXJ5IHNldHRsZSwgYW5kIG5laXRoZXIgc2hvcnQtY2lyY3VpdHMgdGhlIG90aGVyLiBBbiBhdXRob3Igd2hvIGhhcyBhIGhhcmQtd3JhcHBlZFxuICogbGluZSBhbmQgYSBjb2luZWQgd29yZCBpcyB0b2xkIGFib3V0IGJvdGggYXQgb25jZSwgaW4gb25lIHJvdW5kIG9mIHRoZSByZXZpZXcsIHJhdGhlciB0aGFuIGZpeGluZyBvbmUgYW5kXG4gKiBiZWluZyBzZW50IGJhY2sgZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBFYWNoIGhhbGYgcnVucyBvbmx5IHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgdGhlIHNjcmlwdCBpdCBzdGFuZHMgZm9yLCBqdXN0IGFzIHtAbGluayBnYXRlfSBydW5zIHRoYXQgc2NyaXB0XG4gKiBvbmx5IHdoZXJlIGl0IGlzIGRlZmluZWQuIEEgcHJvamVjdCB3aXRoIG5vIGBzcGVsbGNoZWNrYCBoYXMgbm8gc3BlbGxpbmcgY29uZmlndXJhdGlvbiBlaXRoZXIsIHNvIGBjc3BlbGxgIHdvdWxkXG4gKiBqdWRnZSBpdHMgcmVsZWFzZSBub3RlcyBhZ2FpbnN0IHRoZSBzdG9jayBkaWN0aW9uYXJpZXMgYWxvbmUgYW5kIHJlZnVzZSB0aGUgcmVsZWFzZSBvdmVyIHRoZSBwbHVnaW4ncyBvd24gbmFtZTpcbiAqIGEgY2hlY2sgdGhlIHByb2plY3QgbmV2ZXIgYWRvcHRlZCwgZW5mb3JjZWQgb25seSBhdCByZWxlYXNlIHRpbWUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbmRpbmdzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3MoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPENoYW5nZWxvZ0ZpbmRpbmdbXT4ge1xuICBjb25zdCBjb250ZW50ID0gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSk7XG5cbiAgY29uc3QgbWFya2Rvd25saW50RmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhMSU5UX01EX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgbGludE1hcmtkb3duQ29udGVudCh7XG4gICAgICBjb250ZW50LFxuICAgICAgZmlsZVBhdGhcbiAgICB9KVxuICAgIDogW107XG4gIGNvbnN0IHNwZWxsaW5nRmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhTUEVMTENIRUNLX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgc3BlbGxjaGVja0NvbnRlbnQoe1xuICAgICAgY29udGVudCxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICA6IFtdO1xuXG4gIHJldHVybiBbXG4gICAgLi4ubWFya2Rvd25saW50RmluZGluZ3MubWFwKCh0ZXh0KSA9PiAoe1xuICAgICAgc2NyaXB0TmFtZTogTElOVF9NRF9TQ1JJUFRfTkFNRSxcbiAgICAgIHRleHRcbiAgICB9KSksXG4gICAgLi4uc3BlbGxpbmdGaW5kaW5ncy5tYXAoKHRleHQpID0+ICh7XG4gICAgICBzY3JpcHROYW1lOiBTUEVMTENIRUNLX1NDUklQVF9OQU1FLFxuICAgICAgdGV4dFxuICAgIH0pKVxuICBdO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZWxlYXNlIGFzc2V0czogdGhlIHByb2plY3QncyBgbnBtIHBhY2tgIHRhcmJhbGwsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2AuXG4gKlxuICogQHJldHVybnMgVGhlIGFzc2V0IHBhdGhzLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXROcG1QYWNrUmVsZWFzZUFzc2V0UGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXN1bHRPdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWyducG0nLCAncGFjaycsICctLXBhY2stZGVzdGluYXRpb24nLCBSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlTnBtUGFja091dHB1dChyZXN1bHRPdXRwdXQpO1xuICByZXR1cm4gW1xuICAgIGpvaW4oUmVwb1BhdGhzLkRpc3QsIHJlc3VsdC5maWxlbmFtZSksXG4gICAgam9pbihSZXBvUGF0aHMuRGlzdCwgUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgYnVtcCByZWFjaGVzIGEgZmxvb3IuXG4gKlxuICogU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gZ2l2ZW4gbnVtZXJpYyByYW5rcywgYmVjYXVzZSB0aHJlZSBsZXZlbHMgZG8gbm90IG5lZWQgYW4gb3JkZXJpbmcgc2NoZW1lIGFuZCBhXG4gKiBgMiA+PSAzYCBpbiBhIHJlbGVhc2UgZ2F0ZSBpcyBvbmUgdHJhbnNwb3NpdGlvbiBhd2F5IGZyb20gc2lsZW50bHkgcGFzc2luZyBldmVyeXRoaW5nLiBgZmxvb3JMZXZlbGAgZXhjbHVkZXNcbiAqIHtAbGluayBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaH0gZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyBub3QgdGVzdGVkIGZvcjogYSBwYXRjaCBmbG9vciBpcyBubyBmbG9vciwgYW5kIGl0c1xuICogb25seSBjYWxsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlbiBcdTIwMTQgYSBicmFuY2ggdGhhdCBjYW4gb25seSBldmVyIGFuc3dlciBgdHJ1ZWAgaXMgb25lIG5vYm9keSByZWFkcyBhbmRcbiAqIG5vdGhpbmcgY292ZXJzLlxuICpcbiAqIEBwYXJhbSBsZXZlbCAtIFRoZSB7QGxpbmsgQnVtcExldmVsfSBhY3R1YWxseSB0YWtlbi5cbiAqIEBwYXJhbSBmbG9vckxldmVsIC0gVGhlIHtAbGluayBCdW1wTGV2ZWx9IHJlcXVpcmVkLlxuICogQHJldHVybnMgV2hldGhlciBgbGV2ZWxgIGlzIGF0IGxlYXN0IGBmbG9vckxldmVsYC5cbiAqL1xuZnVuY3Rpb24gaXNCdW1wTGV2ZWxBdExlYXN0KGxldmVsOiBCdW1wTGV2ZWwsIGZsb29yTGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZsb29yTGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yXG4gICAgPyBsZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3JcbiAgICA6IGxldmVsICE9PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2luZ2xlIHBhY2sgcmVzdWx0IGZyb20gdGhlIG91dHB1dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgdGhpcyBtb3JlIHRoYW4gYSBgSlNPTi5wYXJzZSgpYC4gVGhlIHBheWxvYWQgaXMgUFJFQ0VERUQgb24gc3Rkb3V0IGJ5IHdoYXRldmVyIHRoZVxuICogYHByZXBhcmVgIHNjcmlwdCBwcmludGVkICh0aGUgYG5wbSBub3RpY2VgIGxpbmVzIGdvIHRvIHN0ZGVyciwgbm90IGhlcmUpLCBzbyBpdHMgc3RhcnQgaGFzIHRvIGJlIGZvdW5kIFx1MjAxNFxuICogYW5kIGl0IGlzIGZvdW5kIGJ5IHBhcnNpbmcgZnJvbSBlYWNoIGNhbmRpZGF0ZSBzdGFydCByYXRoZXIgdGhhbiBieSBtYXRjaGluZyBhIGxpdGVyYWwsIGJlY2F1c2UgdGhlXG4gKiBwcmVmaXggbWF5IGl0c2VsZiBjb250YWluIGEgYnJhY2UuIEFuZCB0aGUgcGF5bG9hZCdzIFNIQVBFIGRlcGVuZHMgb24gdGhlIG5wbSBtYWpvcjogbnBtIDExIGFuZCBlYXJsaWVyXG4gKiBlbWl0IGFuIGFycmF5IG9mIHBhY2sgcmVzdWx0cywgbnBtIDEyIGVtaXRzIGFuIG9iamVjdCBrZXllZCBieSBwYWNrYWdlIG5hbWUuIEJvdGggYXJlIGFjY2VwdGVkOyBzY2FubmluZ1xuICogZm9yIHRoZSBhcnJheSdzIGxpdGVyYWwgb3BlbmluZyBpcyB3aGF0IGJyb2tlIGV2ZXJ5IHJlbGVhc2Ugb24gbnBtIDEyLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgc3Rkb3V0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICogQHJldHVybnMgVGhlIHtAbGluayBOcG1QYWNrUmVzdWx0fSBkZXNjcmliaW5nIHRoZSBwYWNrZWQgdGFyYmFsbC5cbiAqIEB0aHJvd3MgSWYgdGhlIG91dHB1dCBob2xkcyBubyBwYXJzYWJsZSBKU09OIHBheWxvYWQsIG9yIHRoZSBwYXlsb2FkIGhvbGRzIG5vIHBhY2sgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZU5wbVBhY2tPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBOcG1QYWNrUmVzdWx0IHtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwoL1tbe10vZykpIHtcbiAgICBsZXQgcGF5bG9hZDogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShvdXRwdXQuc2xpY2UobWF0Y2guaW5kZXgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCBhcyBOcG1QYWNrUmVzdWx0W10gOiBPYmplY3QudmFsdWVzKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgTnBtUGFja1Jlc3VsdD4pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbMF07XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwYWNrIHJlc3VsdCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIEpTT04gcGF5bG9hZCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIGZ1bGwgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgXHUyMDE0IGluY2x1ZGluZyB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCB3aGVuIG9uZSBpcyBkdWUgXHUyMDE0XG4gKiBXSVRIT1VUIHRvdWNoaW5nIHRoZSByZXBvc2l0b3J5LiBOb3RoaW5nIGhlcmUgd3JpdGVzIGludG8gdGhlIHJlcG8sIHNvIGFuIGludGVycnVwdCBhbnl3aGVyZSBpbiB0aGVcbiAqIHJldmlldyB3aW5kb3cgKHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc3BsaXQpIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGV4YWN0bHkgYXMgaXQgd2FzLlxuICpcbiAqIFRoZSBzZXR0bGVkIGNvbnRlbnQgaXMgaGFuZGVkIHRvIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGJlZm9yZSBpdCBpcyByZXR1cm5lZCwgd2hpY2ggaXNcbiAqIGhvdyB0aGF0IGd1YXJkIHJlYWNoZXMgZXZlcnkgY2FsbGVyIGFuZCBldmVyeSBwYXRoIFx1MjAxNCByZXZpZXdlZCBvciBub3QsIGNvbW1pdC1kZXJpdmVkIG9yIHByZXBhcmVkIFx1MjAxNCBmcm9tIGFcbiAqIHNpbmdsZSBzaXRlLlxuICpcbiAqIEl0IGlzIGFsc28gd2hlcmUgdGhlIG5ldyBzZWN0aW9uIGlzIExJTlRFRCBhbmQgU1BFTExDSEVDS0VELCBmb3IgdGhlIHNhbWUgcmVhc29uIGFuZCBvbmUgdGhlIHJlbGVhc2Unc1xuICogb3JkZXJpbmcgZm9yY2VzOiB0aGUgcmVsZWFzZSdzIG9ubHkgYGxpbnQ6bWRgIGFuZCBgc3BlbGxjaGVja2AgcnVuIGluIHRoZSBnYXRlLCB3aGljaCBpcyBvdmVyIGJlZm9yZSB0aGlzXG4gKiB0ZXh0IGV4aXN0cywgc28gZXZlcnkgY2hhcmFjdGVyIG9mIGEgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIHVzZWQgdG8gZW50ZXIgdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIG9ubHlcbiAqIGNoZWNrcyB0aGF0IGNvdWxkIGhhdmUgbG9va2VkIGF0IGl0LiBUaGUgZ2VuZXJhdG9yJ3Mgb3duIGJ1bGxldHMgY2Fubm90IGZhaWwgdGhlbSBcdTIwMTQgdGhleSBhcmUgb25lXG4gKiBgdG9GaXJzdExpbmVgIHBlciBjb21taXQgXHUyMDE0IGJ1dCB0aGUgdHdvIHBhdGhzIGEgaHVtYW4gb3IgYW4gYWdlbnQgd3JpdGVzLCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGFuZFxuICogYC0tY2hhbmdlbG9nLWZpbGVgLCBhcmUgZXhhY3RseSB0aGUgcGF0aHMgdGhhdCBjYXJyeSBwcm9zZS4gQSBkZWZlY3QgdGhlcmUgZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZTogaXRcbiAqIGxhbmRzIG9uIHRoZSBkZWZhdWx0IGJyYW5jaCBpbnNpZGUgdGhlIGBjaG9yZTogcmVsZWFzZWAgY29tbWl0LCBhbmQgdHVybnMgdGhlIE5FWFQgZ2F0ZSByZWQsIG9uIGEgYnJhbmNoXG4gKiBiZWxvbmdpbmcgdG8gc29tZWJvZHkgd2hvIGRpZCBub3Qgd3JpdGUgaXQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB3aGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gYXdhaXQgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXMoKTtcblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKTtcbiAgICBjb25zdCBjb21taXRSYW5nZSA9IGxhc3RUYWcgPyBgJHtsYXN0VGFnfS4uSEVBRGAgOiAnSEVBRCc7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHJpbmcgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXMgPSBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9DaGFuZ2Vsb2dFbnRyeShjb21taXRNZXNzYWdlKSk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgLSAke2F1dG9saW5rQmFyZVVybHMobWVzc2FnZSl9XFxuYDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJlcGFyZWROb3RlcyA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7cmVwbGFjZUFsbCh7ICRzdHJpbmc6IHByZXBhcmVkTm90ZXMsIHJlcGxhY2VyOiAnXFxuJywgc2VhcmNoVmFsdWU6ICdcXHJcXG4nIH0pLnRyaW0oKX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVwYXJlZCBub3RlcyBhcmUgYWxyZWFkeSB0aGUgcmV2aWV3ZWQgdGV4dCwgc28gdGhleSBuZXZlciBvcGVuIGFuIGVkaXRvciwgd2hhdGV2ZXIgYHNob3VsZEVkaXRDaGFuZ2Vsb2dgIHNheXMuXG4gIGNvbnN0IGlzUmV2aWV3RHVlID0gY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCAmJiBzaG91bGRFZGl0Q2hhbmdlbG9nO1xuICBsZXQgc2V0dGxlZENoYW5nZUxvZyA9IG5ld0NoYW5nZUxvZztcbiAgbGV0IGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10gPSBbXTtcblxuICAvLyBUaGUgY2hlY2tzIHJ1biBvbiB0aGUgU0VUVExFRCB0ZXh0LCBzbyB0aGUgcmV2aWV3IHNpdHMgaW5zaWRlIHRoZSBsb29wIHJhdGhlciB0aGFuIGJlZm9yZSBpdDogdGhlIGF1dGhvciBpc1xuICAvLyBzdGlsbCBzaXR0aW5nIGF0IHRoZSBlZGl0b3IsIHNvIHRoZXkgYXJlIGhhbmRlZCB0aGUgZmluZGluZ3MgYW5kIHRoZSBzYW1lIHNjcmF0Y2ggY29weSBiYWNrLiBBIHJldmlldyB0aGF0XG4gIC8vIHJldHVybnMgYnl0ZS1pZGVudGljYWwgdGV4dCBpcyB0aGUgYXV0aG9yIGRlY2xpbmluZyB0byBmaXggdGhlbSwgd2hpY2ggZW5kcyB0aGUgbG9vcCBpbnN0ZWFkIG9mIHJlb3BlbmluZ1xuICAvLyBmb3IgZXZlci4gVGhlcmUgaXMgbm9ib2R5IHRvIGhhbmQgYSBmaW5kaW5nIHRvIG9uIHRoZSBvdGhlciBwYXRocywgc28gdGhvc2UgdGhyb3cgb24gdGhlIGZpcnN0IG9uZS5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpc1Jldmlld0R1ZSkge1xuICAgICAgY29uc3QgcmV2aWV3ZWRDaGFuZ2VMb2cgPSBhd2FpdCByZXZpZXdDaGFuZ2Vsb2coc2V0dGxlZENoYW5nZUxvZywgZmluZGluZ3MpO1xuICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDAgJiYgcmV2aWV3ZWRDaGFuZ2VMb2cgPT09IHNldHRsZWRDaGFuZ2VMb2cpIHtcbiAgICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGxlZENoYW5nZUxvZyA9IHJldmlld2VkQ2hhbmdlTG9nO1xuICAgIH1cblxuICAgIGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKHNldHRsZWRDaGFuZ2VMb2csIG5ld1ZlcnNpb24pO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICghaXNSZXZpZXdEdWUpIHtcbiAgICAgIHRocm93IHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5ncywgbmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGxhc3QgdGhpbmcgdGhlIGNvbXBvc2l0aW9uIGRvZXMsIGFuZCB0aGF0IHBsYWNlbWVudCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoaXMgT05FIHNpdGUgc2VlcyB0aGVcbiAgLy8gY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgdGhlIHByZXBhcmVkIG5vdGVzIGFuZCB3aGF0ZXZlciBhIHJldmlldyBsZWZ0IGJlaGluZCwgc28gdGhlIGd1YXJkIHJ1bnMgd2hldGhlciBvciBub3RcbiAgLy8gdGhlIGludGVyYWN0aXZlIHJldmlldyBkb2VzIFx1MjAxNCBhbmQgdGhlIHJldmlldyBpcyBwcmVjaXNlbHkgd2hhdCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Agc2tpcHMuIE5vdGhpbmcgaGFzIGJlZW5cbiAgLy8gd3JpdHRlbiB0byB0aGUgcmVwb3NpdG9yeSB5ZXQgZWl0aGVyLCBzbyB0aGUgdGhyb3cgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIHJldHVybiBzZXR0bGVkQ2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIGBDSEFOR0VMT0cubWRgIGFuZCByZXR1cm5zIGV2ZXJ5dGhpbmcgYmVsb3cgaXRzIGAjIENIQU5HRUxPR2AgaGVhZGVyIFx1MjAxNCBzbyB0aGUgZmlyc3QgbGluZSBpcyB0aGVcbiAqIG5ld2VzdCBgIyMgPHZlcnNpb24+YCBoZWFkaW5nLCB3aGljaCBpcyB3aGF0IG5hbWVzIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGluZXMsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHJlcG9zaXRvcnkgaGFzIG5vIGNoYW5nZWxvZ1xuICogeWV0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIG9mIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24gXHUyMDE0IHRoZSBiYXNlbGluZSBib3RoIHRoZSBjaGFuZ2Vsb2cgcmFuZ2UgYW5kIHRoZSBidW1wIGZsb29yIGFyZVxuICogbWVhc3VyZWQgZnJvbSwgZGVyaXZlZCBvbmNlIGhlcmUgc28gdGhvc2UgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGljaCBjb21taXRzIGFyZSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQSBoZWFkaW5nIGlzIG5vdCBhIHRhZy4gQSBoYW5kLXdyaXR0ZW4gYCMjIDAuMC4wYCBwbGFjZWhvbGRlciBpbiBhIG5ldmVyLXRhZ2dlZCByZXBvLCBvciBhIHRhZyBkZWxldGVkIGFmdGVyXG4gKiB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIFx1MjAxNCBhbmQgaXQgdXNlZCB0byByZWFjaCBpdCBhdCB0aGVcbiAqIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhZCBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gbm8gYmFzZWxpbmVcbiAqIG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIGNoYW5nZWxvZyByZXZpZXcgaXMgZXhhY3RseSB3aGVyZSBhblxuICogb3Zlci1pbmNsdWRlZCByYW5nZSBnZXRzIHRyaW1tZWQsIGFuZCB0aGUgYnVtcCBmbG9vciBkZWNsaW5lcyB0byBkZXJpdmUgYW55dGhpbmcgYXQgYWxsIHdpdGhvdXQgYSBiYXNlbGluZS5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyAtIFRoZSBsaW5lcyB7QGxpbmsgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXN9IHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFnIG5hbWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gcmVzb2x2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgfSk7XG5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMYXN0VGFnID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuXG4gIGlmICghcmVzb2x2ZWRMYXN0VGFnKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gc3RhcnRzIGF0ICcjIyAke2xhc3RUYWd9JywgYnV0IG5vIHN1Y2ggdGFnIGV4aXN0cy4gR2VuZXJhdGluZyB0aGUgY2hhbmdlbG9nIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBpbnN0ZWFkLmBcbiAgICApO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBsYXN0VGFnO1xufVxuXG4vKipcbiAqIEhhbmRzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgdG8gdGhlIHVzZXIgZm9yIHJldmlldyBvbiBhIHNjcmF0Y2ggY29weSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBhbmRcbiAqIHJldHVybnMgd2hhdGV2ZXIgdGhleSBsZWZ0IGJlaGluZC4gVGhlIHNjcmF0Y2ggZm9sZGVyIGlzIHJlbW92ZWQgZXZlbiB3aGVuIHRoZSByZXZpZXcgZmFpbHMuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIGhhbmQgb3ZlciBmb3IgcmV2aWV3LlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRoZSBwcmV2aW91cyByb3VuZCBvZiB0aGlzIHJldmlldyBsZWZ0IHVuZml4ZWQsIHByaW50ZWQgYWJvdmUgdGhlIHByb21wdCBzb1xuICogdGhlIGF1dGhvciBzZWVzIHdoYXQgaGFzIHRvIGNoYW5nZS4gRW1wdHkgb24gdGhlIGZpcnN0IHJvdW5kLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV2aWV3ZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV2aWV3Q2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nLCBmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NyYXRjaEZvbGRlciA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgJ2NoYW5nZWxvZy0nKSk7XG4gIGNvbnN0IHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoID0gam9pbihzY3JhdGNoRm9sZGVyLCBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY29kZVZlcnNpb24gPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2NvZGUgLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKFxuICAgICAgICBgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGRvZXMgbm90IHBhc3MgJHt0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzKX0geWV0OlxcbiR7dG9GaW5kaW5nTGluZXMoZmluZGluZ3MpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvZGVWZXJzaW9uKSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoYFBsZWFzZSB1cGRhdGUgdGhlICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBDbG9zZSBWaXN1YWwgU3R1ZGlvIENvZGUgd2hlbiB5b3UgYXJlIGRvbmUuLi5gKTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2NvZGUnLCAnLXcnLCBzY3JhdGNoQ2hhbmdlbG9nUGF0aF0sIHtcbiAgICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoJ0NvdWxkIG5vdCBmaW5kIFZpc3VhbCBTdHVkaW8gQ29kZSBpbiB5b3VyIFBBVEguIFVzaW5nIGNvbnNvbGUgbW9kZSBpbnN0ZWFkLicpO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbihcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgdGhlICR7c2NyYXRjaENoYW5nZWxvZ1BhdGh9IGZpbGUuIFByZXNzIEVudGVyIHdoZW4geW91IGFyZSBkb25lLi4uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVhZEZpbGUoc2NyYXRjaENoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2hGb2xkZXIsIHtcbiAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIHRoYXQgcmVmdXNlcyBhIGJ1bXAgbG93ZXIgdGhhbiB0aGUgcmFuZ2UgZm9yY2VzLlxuICpcbiAqIEl0IG5hbWVzIGV2ZXJ5IGZvcmNpbmcgY29tbWl0IHdpdGggaXRzIHNob3J0IGhhc2gsIGl0cyBzdWJqZWN0IGFuZCBXSElDSCBtYXJrZXIgZm9yY2VkIGl0LCBiZWNhdXNlIHRoZVxuICogcmVtZWR5IGRlcGVuZHMgb24gdGhhdDogYSBgZmVhdCFgIGlzIGEgZGVsaWJlcmF0ZSBicmVhayBzb21lYm9keSB0eXBlZCwgd2hpbGUgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyXG4gKiBzaXRzIGluIGEgYm9keSBub2JvZHkgcmUtcmVhZHMgYW5kIGlzIGV4YWN0bHkgdGhlIHRoaW5nIHRoaXMgZ2F0ZSBleGlzdHMgdG8gc3VyZmFjZS4gVGhlIGluc3RydWN0aW9uIGlzIHRvXG4gKiB0YWtlIHRoZSBoaWdoZXIgYnVtcCwgbm90IHRvIGVkaXQgdGhlIGNvbW1pdHMgXHUyMDE0IGhpc3RvcnkgdGhhdCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRlZmF1bHQgYnJhbmNoIGlzIHdoYXQgYVxuICogcmVsZWFzZSBwdWJsaXNoZXMsIGFuZCByZXdyaXRpbmcgaXQgdG8gZG9kZ2UgYSB2ZXJzaW9uIHNpZ25hbCBpcyB0aGUgZGVmZWN0IG9uZSBsZXZlbCB1cC5cbiAqXG4gKiBAcGFyYW0gYnVtcEZsb29yIC0gVGhlIGRlcml2ZWQge0BsaW5rIEJ1bXBGbG9vcn0uXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSB7QGxpbmsgQnVtcEZsb29yUmVmdXNhbENvbnRleHR9IGRlc2NyaWJpbmcgd2hhdCB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgVGhlIGVycm9yIHRvIHRocm93LlxuICovXG5mdW5jdGlvbiB0b0J1bXBGbG9vckVycm9yKGJ1bXBGbG9vcjogQnVtcEZsb29yLCBjb250ZXh0OiBCdW1wRmxvb3JSZWZ1c2FsQ29udGV4dCk6IEVycm9yIHtcbiAgY29uc3QgZm9yY2luZ0xpbmVzID0gYnVtcEZsb29yLmZvcmNpbmdDb21taXRzXG4gICAgLm1hcCgoZm9yY2luZ0NvbW1pdCkgPT4gYCAgJHtmb3JjaW5nQ29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0gICR7Zm9yY2luZ0NvbW1pdC5zdWJqZWN0fSAgKCR7Zm9yY2luZ0NvbW1pdC5tYXJrZXJ9KWApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYFRoZSBjb21taXRzIHNpbmNlICR7Y29udGV4dC5sYXN0VGFnfSBmb3JjZSBhdCBsZWFzdCBhICR7YnVtcEZsb29yLmxldmVsfSByZWxlYXNlLCBidXQgJyR7Y29udGV4dC52ZXJzaW9uVXBkYXRlVHlwZX0nIHdvdWxkIHB1Ymxpc2hgXG4gICAgICArIGAgJHtjb250ZXh0Lm5ld1ZlcnNpb259LCB3aGljaCBpcyBhICR7Y29udGV4dC50YWtlbkxldmVsfS5cXG5gXG4gICAgICArIGAke2ZvcmNpbmdMaW5lc31cXG5gXG4gICAgICArICdBIHJlbGVhc2UgcHVibGlzaGVzIGV2ZXJ5IGNvbW1pdCBzaW5jZSB0aGUgbGFzdCB0YWcsIG5vdCB0aGUgY2hhbmdlIHlvdSBoYXBwZW4gdG8gYmUgd29ya2luZyBvbiwgc28gdGhlJ1xuICAgICAgKyAnIGJ1bXAgaGFzIHRvIGFuc3dlciBmb3IgYWxsIG9mIHRoZW0uIFJlLXJ1biB0aGUgcmVsZWFzZSB3aXRoIGEnXG4gICAgICArIGAgJHtidW1wRmxvb3IubGV2ZWx9IGJ1bXAgXHUyMDE0IGEgaGlnaGVyIG9uZSBpcyBhbHdheXMgYWNjZXB0ZWQsIGFuZCBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBUdXJucyBvbmUgZnVsbCBjb21taXQgbWVzc2FnZSAoYGdpdCBsb2cgLS1mb3JtYXQ9JUJgKSBpbnRvIHRoZSBjaGFuZ2Vsb2cgbGluZSBpdCBzaG91bGQgY29udHJpYnV0ZS5cbiAqXG4gKiBOb3JtYWxseSB0aGF0IGlzIHRoZSBzdWJqZWN0LiBUaGUgZXhjZXB0aW9uIGlzIGEgbWVyZ2Ugd2hvc2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOiBmb3IgYSBub24tZmYgbWVyZ2VcbiAqIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IElTIHRoZSBtZXJnZSBjb21taXQsIHNvIGl0cyBzdWJqZWN0IGlzIHdoYXQgc2hpcHMsIGFuZCBhIGRlZmF1bHQgb25lIHB1Ymxpc2hlcyBhXG4gKiBwcml2YXRlIGJyYW5jaCBuYW1lIGFzIGEgY2hhbmdlbG9nIGVudHJ5LiBUaGUgbWVzc2FnZSB0aGUgYXV0aG9yIGFjdHVhbGx5IHdyb3RlIGlzIHVzdWFsbHkgc3RpbGwgdGhlcmUgXHUyMDE0XG4gKiBvbmUgbGluZSBiZWxvdywgYXMgdGhlIG1lcmdlIGJvZHkgXHUyMDE0IHNvIGl0IGlzIGxpZnRlZCBvdXQgcmF0aGVyIHRoYW4gZGlzY2FyZGVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBlZGl0IGFcbiAqIGh1bWFuIG1ha2VzIGJ5IGhhbmQgYXQgdGhlIHJldmlldyBzdGVwLiBBIG1lcmdlIHdpdGggbm8gYm9keSBoYXMgbm90aGluZyB0byBsaWZ0IGFuZCBrZWVwcyBpdHMgc3ViamVjdDtcbiAqIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGlzIHdoYXQgc3RvcHMgdGhhdCBvbmUgZnJvbSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIGNvbW1pdE1lc3NhZ2UgLSBUaGUgZnVsbCBjb21taXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIFRoZSBjaGFuZ2Vsb2cgbGluZSBmb3IgdGhhdCBjb21taXQuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nRW50cnkoY29tbWl0TWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjb21taXRNZXNzYWdlLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzdWJqZWN0ID0gbGluZXNbMF0gPz8gJyc7XG4gIHJldHVybiBNRVJHRV9TVUJKRUNUX1JFR19FWFAudGVzdChzdWJqZWN0KSA/IGxpbmVzWzFdID8/IHN1YmplY3QgOiBzdWJqZWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXJyb3IgdGhhdCBzdG9wcyBhIHJlbGVhc2Ugd2hvc2UgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIGRvZXMgbm90IHBhc3MgYGxpbnQ6bWRgIG9yIGBzcGVsbGNoZWNrYC5cbiAqXG4gKiBJdCBpcyB0aHJvd24gZnJvbSB0aGUgY29tcG9zaXRpb24gc3RlcCwgd2hpY2ggaXMgQkVGT1JFIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSByZWNvdmVyeSBpdCBkZXNjcmliZXMgaXNcbiAqIHRoZSB3aG9sZSByZWNvdmVyeTogdGhlcmUgaXMgbm90aGluZyB0byByZXZlcnQsIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5zIGZyb20gdGhlIHRvcC5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MsIGFzIHtAbGluayBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3N9IGNvbGxlY3RlZCB0aGVtLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIHdhcyBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUgZXJyb3IgdG8gdGhyb3cuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdLCB2ZXJzaW9uOiBzdHJpbmcpOiBFcnJvciB7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gdG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5ncyk7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGRvZXMgbm90IHBhc3MgJHtzY3JpcHROYW1lc306XFxuYFxuICAgICAgKyBgJHt0b0ZpbmRpbmdMaW5lcyhmaW5kaW5ncyl9XFxuYFxuICAgICAgKyAnVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIGJlZm9yZSBpdCBpcyB3cml0dGVuLCBzbyB0aGlzIHN0b3BzIHRoZSByZWxlYXNlIHdpdGggdGhlIHJlcG9zaXRvcnkgdW50b3VjaGVkJ1xuICAgICAgKyAnIGFuZCBub3RoaW5nIHRvIHJldmVydC4gVGhlIGxpbmUgbnVtYmVycyBhcmUgdGhlIG9uZXMgdGhlIHdyaXR0ZW4gZmlsZSB3b3VsZCBoYXZlIGhhZC4gRml4IHRoZSByZWxlYXNlJ1xuICAgICAgKyAnIG5vdGVzIFx1MjAxNCBpbiB0aGUgcHJlcGFyZWQgbm90ZXMgZmlsZSwgb3IgaW4gdGhlIGNvbW1pdCBtZXNzYWdlcyB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20gXHUyMDE0IG9yLCBmb3IgYSB3b3JkJ1xuICAgICAgKyAnIHRoaXMgcHJvamVjdCByZWFsbHkgZG9lcyB1c2UsIGFkZCBpdCB0byB0aGUgcHJvamVjdFxcJ3MgYGNzcGVsbGAgY29uZmlndXJhdGlvbiwgYW5kIHJlLXJ1biB0aGUgcmVsZWFzZS4nXG4gICAgICArICcgUmVsZWFzaW5nIGFueXdheSB3b3VsZCBsYW5kIHRoZSBkZWZlY3Qgb24gdGhlIGRlZmF1bHQgYnJhbmNoIGluc2lkZSB0aGUgcmVsZWFzZSBjb21taXQsIHdoZXJlIHRoZSBuZXh0J1xuICAgICAgKyBgICR7c2NyaXB0TmFtZXN9IG9uIGFueW9uZSdzIGJyYW5jaCByZXBvcnRzIGl0LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBvbmUgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uIGluIHRoZSBtaW5pbWFsIGRvY3VtZW50IHRoZSBjaGVja3MgYXJlIGhhbmRlZC5cbiAqXG4gKiBUaGUgc2VjdGlvbiBnb2VzIGluc2lkZSBhIGRvY3VtZW50IHJhdGhlciB0aGFuIG9uIGl0cyBvd24sIHNvIHRoZSBoZWFkaW5nIGFuZCBsaXN0IHJ1bGVzIHNlZSB0aGVcbiAqIGNvbnRleHQgdGhleSBuZWVkIChhIGRvY3VtZW50IHdob3NlIGZpcnN0IGxpbmUgaXMgYSBsaXN0IGl0ZW0gaXMgYSBkaWZmZXJlbnQgZG9jdW1lbnQpLiBUaGUgbGluZSBudW1iZXJzIGFcbiAqIGZpbmRpbmcgcmVwb3J0cyBhcmUgdGhlbiB0aGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAncyBvd24sIHdoaWNoIGlzIG5vdCBhIGNvaW5jaWRlbmNlIGFuZCBpcyB3b3J0aCBrZWVwaW5nOlxuICogYSBzZWN0aW9uIGlzIFBSRVBFTkRFRCwgc28gdGhpcyBkb2N1bWVudCBpcyBjaGFyYWN0ZXItZm9yLWNoYXJhY3RlciB0aGUgaGVhZCBvZiB0aGUgZmlsZSBhYm91dCB0byBiZSB3cml0dGVuLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUgbWluaW1hbCBkb2N1bWVudCB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoZWFkaW5nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHt2ZXJzaW9ufWA7XG4gIGNvbnN0IHNlY3Rpb24gPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKTtcbiAgLy8gQW4gZW1wdHkgc2VjdGlvbiBpcyBhIHJlYWwgc2hhcGUgXHUyMDE0IGEgcmVsZWFzZSB3aXRoIG5vIGNvbW1pdHMgdG8gZGVzY3JpYmUsIG9yIHByZXBhcmVkIG5vdGVzIHRoYXQgYXJlIGFuXG4gIC8vIGVtcHR5IGZpbGUgXHUyMDE0IGFuZCBhcHBlbmRpbmcgYSBibGFuayBib2R5IHRvIHRoZSBoZWFkaW5nIHdvdWxkIHJlcG9ydCBhIGRlZmVjdCB0aGlzIHJlbGVhc2UgZGlkIG5vdCBjb21taXQuXG4gIHJldHVybiBzZWN0aW9uID09PSAnJyA/IGAke2hlYWRpbmd9XFxuYCA6IGAke2hlYWRpbmd9XFxuXFxuJHtzZWN0aW9ufVxcbmA7XG59XG5cbi8qKlxuICogUmVhZHMgb2ZmIHdoaWNoIHJlbGVhc2UgbGluZSBhIHZlcnNpb24gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZSBpdCBpcyBiZWluZyBjdXQgZnJvbS5cbiAqXG4gKiBUaGlzIGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSByZXF1ZXN0ZWQgdHlwZSBvbiBwdXJwb3NlLCBiZWNhdXNlIHRoZSB0eXBlIGRvZXMgbm90IGFsd2F5cyBzYXkuXG4gKiBgcHJlcmVsZWFzZWAgYWR2YW5jZXMgd2hpY2hldmVyIGxpbmUgYW4gZWFybGllciBgcHJlbWFqb3JgIG9yIGBwcmVtaW5vcmAgYWxyZWFkeSBjaG9zZSwgYW5kIGFuIGV4cGxpY2l0XG4gKiBgeC55LnpgIHNheXMgbm90aGluZyBhdCBhbGwgdW50aWwgaXQgaXMgY29tcGFyZWQuIFRha2luZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHJlc3VsdGluZyB2ZXJzaW9uIGFuc3dlcnMgYWxsXG4gKiBvZiB0aGVtIHdpdGggb25lIHJ1bGUgXHUyMDE0IGFuZCBpdCBhbnN3ZXJzIHRoZW0gdGhlIHdheSBhIGNvbnN1bWVyJ3MgY2FyZXQgcmFuZ2Ugc2VlcyBpdCwgd2hpY2ggaXMgdGhlIG9ubHlcbiAqIHJlYWRpbmcgdGhhdCBtYXR0ZXJzIGZvciBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICpcbiAqIEBwYXJhbSBiYXNlVmVyc2lvbiAtIFRoZSBwcmV2aW91cyByZWxlYXNlZCB2ZXJzaW9uLlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEJ1bXBMZXZlbH0sIG9yIGBudWxsYCB3aGVuIGVpdGhlciB2ZXJzaW9uIGlzIG5vdCBwYXJzYWJsZSBhcyBzZW12ZXIuXG4gKi9cbmZ1bmN0aW9uIHRvRWZmZWN0aXZlQnVtcExldmVsKGJhc2VWZXJzaW9uOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZyk6IEJ1bXBMZXZlbCB8IG51bGwge1xuICBjb25zdCBiYXNlID0gcGFyc2UoYmFzZVZlcnNpb24pO1xuICBjb25zdCBuZXh0ID0gcGFyc2UobmV3VmVyc2lvbik7XG4gIGlmICghYmFzZSB8fCAhbmV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5leHQubWFqb3IgPiBiYXNlLm1ham9yKSB7XG4gICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yO1xuICB9XG5cbiAgcmV0dXJuIG5leHQubWlub3IgPiBiYXNlLm1pbm9yID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgbnBtIHNjcmlwdHMgdGhhdCBhY3R1YWxseSByZXBvcnRlZCBzb21ldGhpbmcsIGluIHRoZSBvcmRlciB0aGV5IHJhbi5cbiAqXG4gKiBOYW1pbmcgYm90aCB1bmNvbmRpdGlvbmFsbHkgd291bGQgYmUgdGhlIGVhc3kgdmVyc2lvbiBhbmQgd291bGQgYmUgYSBsaWUgaGFsZiB0aGUgdGltZTogYSByZWxlYXNlIHN0b3BwZWQgYnlcbiAqIGEgY29pbmVkIHdvcmQgd291bGQgdGVsbCBpdHMgYXV0aG9yIHRvIGdvIGFuZCBsb29rIGF0IGBsaW50Om1kYCwgd2hpY2ggcGFzc2VkLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBuYW1lIHRoZSBzY3JpcHRzIG9mLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBuYW1lcywgam9pbmVkIGZvciBwcm9zZSBcdTIwMTQgYGxpbnQ6bWRgLCBgc3BlbGxjaGVja2AsIG9yIGBsaW50Om1kIGFuZCBzcGVsbGNoZWNrYC5cbiAqL1xuZnVuY3Rpb24gdG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBbTElOVF9NRF9TQ1JJUFRfTkFNRSwgU1BFTExDSEVDS19TQ1JJUFRfTkFNRV0uZmlsdGVyKChzY3JpcHROYW1lKSA9PiBmaW5kaW5ncy5zb21lKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNjcmlwdE5hbWUgPT09IHNjcmlwdE5hbWUpKTtcbiAgcmV0dXJuIHNjcmlwdE5hbWVzLmpvaW4oJyBhbmQgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgZmluZGluZ3MgZm9yIGEgbWVzc2FnZSwgZWFjaCBsaW5lIHRhZ2dlZCB3aXRoIHRoZSBzY3JpcHQgdGhhdCByZXBvcnRlZCBpdC5cbiAqXG4gKiBUaGUgdGFnIGlzIG5vdCBkZWNvcmF0aW9uOiB0aGUgdHdvIHRvb2xzJyBvdXRwdXQgc2hhcGVzIGFyZSBzaW1pbGFyIGVub3VnaCB0byBiZSBtaXN0YWtlbiBmb3IgZWFjaCBvdGhlcixcbiAqIGFuZCB0aGUgZml4IGZvciBvbmUgaXMgbm90IHRoZSBmaXggZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdG8gcmVuZGVyLlxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIGxpbmVzLCBvbmUgZmluZGluZyBwZXIgbGluZS5cbiAqL1xuZnVuY3Rpb24gdG9GaW5kaW5nTGluZXMoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBmaW5kaW5ncy5tYXAoKGZpbmRpbmcpID0+IGBbJHtmaW5kaW5nLnNjcmlwdE5hbWV9XSAke2ZpbmRpbmcudGV4dH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmaWVzIG9uZSBgZ2l0IGxvZyAtLWZvcm1hdD0lSCVuJUIgLXpgIHJlY29yZCBpbnRvIHRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0gaXQgaXMsIG9yIGBudWxsYCB3aGVuIGl0XG4gKiBmb3JjZXMgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gcmVjb3JkIC0gT25lIE5VTC1kZWxpbWl0ZWQgcmVjb3JkOiB0aGUgZnVsbCBoYXNoIG9uIHRoZSBmaXJzdCBsaW5lLCB0aGUgZnVsbCBjb21taXQgbWVzc2FnZSBiZWxvdyBpdC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0sIG9yIGBudWxsYCBmb3IgYSByZWNvcmQgdGhhdCBjb25zdHJhaW5zIG5vdGhpbmcgb3IgaXMgbm90IGEgcmVjb3JkIGF0IGFsbFxuICogKHRoZSB0cmFpbGluZyBlbXB0eSBzdHJpbmcgYC16YCBvdXRwdXQgZW5kcyB3aXRoLCBhbW9uZyBvdGhlcnMpLlxuICovXG5mdW5jdGlvbiB0b0ZvcmNpbmdDb21taXQocmVjb3JkOiBzdHJpbmcpOiBGb3JjaW5nQ29tbWl0IHwgbnVsbCB7XG4gIC8vIFRoZSB0cmFpbGluZyBlbXB0eSByZWNvcmQgYC16YCBsZWF2ZXMgaGFzIG5vIGhhc2gsIGFuZCBhIHJlY29yZCB3aXRoIG5vIGxpbmUgdW5kZXIgdGhlIGhhc2ggaXMgbm90IG9uZVxuICAvLyB0aGlzIGNhbiBjbGFzc2lmeS4gQm90aCBhcmUgdGhlIHNhbWUgbm9uLWFuc3dlci5cbiAgY29uc3QgW3NoYSwgc3ViamVjdExpbmUsIC4uLmJvZHlMaW5lc10gPSByZWNvcmQuc3BsaXQoJ1xcbicpO1xuICBpZiAoIXNoYSB8fCBzdWJqZWN0TGluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdExpbmUudHJpbSgpO1xuICBjb25zdCBib2R5ID0gYm9keUxpbmVzLmpvaW4oJ1xcbicpO1xuICBjb25zdCBzdWJqZWN0TWF0Y2ggPSBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUC5leGVjKHN1YmplY3QpO1xuXG4gIGlmIChzdWJqZWN0TWF0Y2g/Lmdyb3Vwcz8uWydicmVha2luZyddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcixcbiAgICAgIG1hcmtlcjogQlJFQUtJTkdfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH07XG4gIH1cblxuICBpZiAoQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQLnRlc3QoYm9keSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICAgICAgbWFya2VyOiBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN1YmplY3RNYXRjaD8uZ3JvdXBzPy5bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gRkVBVF9UWVBFXG4gICAgPyB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IsXG4gICAgICBtYXJrZXI6IEZFQVRfVFlQRV9NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIHRoZSBjb21taXRzIHRoYXQgZm9yY2Ugc29tZXRoaW5nIHRvIHRoZSBvbmUgZmxvb3IgdGhlIHJhbmdlIGFzIGEgd2hvbGUgaGFzIHRvIGNsZWFyLlxuICpcbiAqIEBwYXJhbSBmb3JjaW5nQ29tbWl0cyAtIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH1zIGZvdW5kIGluIHRoZSByYW5nZS5cbiAqIEByZXR1cm5zIFRoZSBoaWdoZXN0IHtAbGluayBCdW1wTGV2ZWx9IGFueSBvZiB0aGVtIGZvcmNlcywgb3Ige0BsaW5rIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNofSBcdTIwMTQgbm9cbiAqIGNvbnN0cmFpbnQgXHUyMDE0IHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHRvSGlnaGVzdEJ1bXBMZXZlbChmb3JjaW5nQ29tbWl0czogcmVhZG9ubHkgRm9yY2luZ0NvbW1pdFtdKTogQnVtcExldmVsIHtcbiAgaWYgKGZvcmNpbmdDb21taXRzLnNvbWUoKGZvcmNpbmdDb21taXQpID0+IGZvcmNpbmdDb21taXQubGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yKSkge1xuICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcjtcbiAgfVxuXG4gIHJldHVybiBmb3JjaW5nQ29tbWl0cy5sZW5ndGggPiAwID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyBpbnRvIHRoZSByZXBvc2l0b3J5LiBEZWxpYmVyYXRlbHkgdGhlIGxhc3QgdGhpbmcgdGhlIGNoYW5nZWxvZyBzdGVwIGRvZXMsXG4gKiBzbyBub3RoaW5nIGxhbmRzIG9uIGRpc2sgdW50aWwgdGhlIGNvbnRlbnQgaXMgc2V0dGxlZC5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byB3cml0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlbG9nIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlRmlsZShyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KSwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTZSUCxNQUFNLGlDQUFpQztBQU92QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGtCQUFrQjtBQUt4QixNQUFNLG1CQUFtQjtBQVN6QixNQUFNLHNDQUFzQztBQUs1QyxNQUFNLGdCQUFnQjtBQUt0QixNQUFNLFlBQVk7QUFNbEIsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSxtQkFBbUI7QUFLekIsTUFBTSx5QkFBeUI7QUFlL0IsTUFBTSx3QkFBd0I7QUFPdkIsSUFBSyxvQkFBTCxrQkFBS0EsdUJBQUw7QUFD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QSxTQUFTLG9CQUFvQixVQUFzQztBQUNqRSxRQUFNLGNBQWMsQ0FBQyxxQkFBcUIsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGVBQWUsU0FBUyxLQUFLLENBQUMsWUFBWSxRQUFRLGVBQWUsVUFBVSxDQUFDO0FBQ3RKLFNBQU8sWUFBWSxLQUFLLE9BQU87QUFDakM7QUFXQSxTQUFTLGVBQWUsVUFBc0M7QUFDNUQsU0FBTyxTQUFTLElBQUksQ0FBQyxZQUFZLElBQUksUUFBUSxVQUFVLEtBQUssUUFBUSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDdkY7QUFVQSxTQUFTLGdCQUFnQixRQUFzQztBQUc3RCxRQUFNLENBQUMsS0FBSyxhQUFhLEdBQUcsU0FBUyxJQUFJLE9BQU8sTUFBTSxJQUFJO0FBQzFELE1BQUksQ0FBQyxPQUFPLGdCQUFnQixRQUFXO0FBQ3JDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLFlBQVksS0FBSztBQUNqQyxRQUFNLE9BQU8sVUFBVSxLQUFLLElBQUk7QUFDaEMsUUFBTSxlQUFlLG9DQUFvQyxLQUFLLE9BQU87QUFFckUsTUFBSSxjQUFjLFNBQVMsVUFBVSxHQUFHO0FBQ3RDLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSwrQkFBK0IsS0FBSyxJQUFJLEdBQUc7QUFDN0MsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGNBQWMsU0FBUyxNQUFNLEdBQUcsWUFBWSxNQUFNLFlBQ3JEO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0U7QUFDTjtBQVNBLFNBQVMsbUJBQW1CLGdCQUFxRDtBQUMvRSxNQUFJLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFVBQVUsbUJBQXVCLEdBQUc7QUFDM0YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsU0FBUyxJQUFJLHNCQUEwQjtBQUMvRDtBQVNBLGVBQWUsZUFBZSxjQUFxQztBQUNqRSxRQUFNLFVBQVUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFHLGNBQWMsT0FBTztBQUNqRzsiLAogICJuYW1lcyI6IFsiVmVyc2lvblVwZGF0ZVR5cGUiXQp9Cg==
714
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHsgbGludE1hcmtkb3duQ29udGVudCB9IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsZXMgdG8gYXR0YWNoIHRvIHRoZSBHaXRIdWIgcmVsZWFzZS4gU2VlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UmVsZWFzZUFzc2V0UGF0aHM/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmdbXT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZUdpdEh1YlJlbGVhc2U/OiAobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30g4oCUIGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC4gU2VlXG4gICAqIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyDigJQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiBhbnkgZmlsZSBiZXlvbmQgYHBhY2thZ2UuanNvbmAgYW5kIHRoZSBsb2NrZmlsZXMsIG9uY2UgdGhlIG5ldyB2ZXJzaW9uIGlzIGtub3duIGFuZFxuICAgKiBiZWZvcmUgdGhlIHJlbGVhc2UgY29tbWl0IGlzIG1hZGUuIEFuIE9ic2lkaWFuIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgYHZlcnNpb25zLmpzb25gIGFyZSB0aGUgY2FzZSB0aGlzXG4gICAqIGV4aXN0cyBmb3IuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHZlcnNpb24gYmVpbmcgcmVsZWFzZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVWZXJzaW9uSW5FeHRyYUZpbGVzPzogKChuZXdWZXJzaW9uOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb3dlc3QgYnVtcCBhIHJhbmdlIG9mIGNvbW1pdHMgbWF5IGJlIHB1Ymxpc2hlZCB1bmRlciwgYW5kIHRoZSBjb21taXRzIHRoYXQgZm9yY2UgaXQuXG4gKi9cbmludGVyZmFjZSBCdW1wRmxvb3Ige1xuICAvKipcbiAgICogVGhlIGNvbW1pdHMgd2hvc2UgQ29udmVudGlvbmFsLUNvbW1pdHMgbWFya2VycyBmb3JjZSB7QGxpbmsgbGV2ZWx9LCBpbiB0aGUgb3JkZXIgYGdpdCBsb2dgIHJlcG9ydGVkIHRoZW0uXG4gICAqIEVtcHR5IHdoZW4gbm90aGluZyBmb3JjZXMgYW55dGhpbmcsIHdoaWNoIGlzIHRoZSBvcmRpbmFyeSBjYXNlIGZvciBhIHJhbmdlIG9mIGBmaXhgZXMgYW5kIGBjaG9yZWBzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2luZ0NvbW1pdHM6IHJlYWRvbmx5IEZvcmNpbmdDb21taXRbXTtcblxuICAvKipcbiAgICogVGhlIGxvd2VzdCB7QGxpbmsgQnVtcExldmVsfSB0aGUgcmFuZ2UgbWF5IHNoaXAgYXMuXG4gICAqL1xuICByZWFkb25seSBsZXZlbDogQnVtcExldmVsO1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHRvQnVtcEZsb29yRXJyb3J9IG5lZWRzIGJleW9uZCB0aGUge0BsaW5rIEJ1bXBGbG9vcn0gaXRzZWxmIHRvIHNheSB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHdoYXRcbiAqIHRoYXQgd291bGQgaGF2ZSBzaGlwcGVkIGFzLlxuICovXG5pbnRlcmZhY2UgQnVtcEZsb29yUmVmdXNhbENvbnRleHQge1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHJlbGVhc2UgdGFnIHRoZSByYW5nZSB3YXMgbWVhc3VyZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3RUYWc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdGhlIHJlcXVlc3RlZCBidW1wIHdvdWxkIGhhdmUgcHJvZHVjZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgQnVtcExldmVsfSB7QGxpbmsgbmV3VmVyc2lvbn0gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHtAbGluayBsYXN0VGFnfS5cbiAgICovXG4gIHJlYWRvbmx5IHRha2VuTGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdGhlIHJlbGVhc2Ugd2FzIGFza2VkIGZvciwgdmVyYmF0aW0g4oCUIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgdHlwZSBvciBhbiBleHBsaWNpdFxuICAgKiB2ZXJzaW9uIGFzIG9mdGVuIGFzIGl0IGlzIGEgcGxhaW4gYHBhdGNoYCwgYW5kIGlzIHRoZXJlZm9yZSB3b3J0aCBxdW90aW5nIGJhY2sgcmF0aGVyIHRoYW4gaW5mZXJyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGhyZWUgcmVsZWFzZSBsaW5lcyBhIGJ1bXAgY2FuIG1vdmUsIG9yZGVyZWQgYnkge0BsaW5rIGlzQnVtcExldmVsQXRMZWFzdH0uXG4gKlxuICogQSBwcmUtcmVsZWFzZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlc2U6IGBwcmVtYWpvcmAgbW92ZXMgdGhlIG1ham9yIGxpbmUgYW5kIGBwcmVyZWxlYXNlYCBtb3ZlcyB3aGljaGV2ZXJcbiAqIGxpbmUgYW4gZWFybGllciBwcmUtcmVsZWFzZSBhbHJlYWR5IGNob3NlLCBzbyB3aGF0IGEgcHJlLXJlbGVhc2UgZGlkIGlzIHJlYWQgb2ZmIHRoZSByZXN1bHRpbmcgdmVyc2lvblxuICogcmF0aGVyIHRoYW4gb2ZmIGl0cyB0eXBlLiBTZWUge0BsaW5rIHRvRWZmZWN0aXZlQnVtcExldmVsfS5cbiAqL1xudHlwZSBCdW1wTGV2ZWwgPSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvciB8IFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2g7XG5cbi8qKlxuICogT25lIGZpbmRpbmcgcmVwb3J0ZWQgb3ZlciB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgc2VjdGlvbiwgdGFnZ2VkIHdpdGggdGhlIG5wbSBzY3JpcHQgd2hvc2UgY2hlY2sgcHJvZHVjZWQgaXQuXG4gKlxuICogVGhlIHRhZyBpcyB3aGF0IGxldHMgb25lIG1lc3NhZ2UgbmFtZSBgbGludDptZGAsIGBzcGVsbGNoZWNrYCBvciBib3RoLCB0cnV0aGZ1bGx5LiBCb3RoIGNoZWNrcyBydW4gb3ZlclxuICogZXZlcnkgc2V0dGxlLCBzbyBhbiBhdXRob3Igd2hvIGhhcyB0byBmaXggYSBoYXJkLXdyYXBwZWQgbGluZSBhbmQgYSBjb2luZWQgd29yZCBmaXhlcyB0aGVtIGluIE9ORSByb3VuZCBvZlxuICogdGhlIHJldmlldyByYXRoZXIgdGhhbiBiZWluZyBzZW50IGJhY2sgdHdpY2UuXG4gKi9cbmludGVyZmFjZSBDaGFuZ2Vsb2dGaW5kaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBucG0gc2NyaXB0IHRoYXQgd291bGQgaGF2ZSByZXBvcnRlZCB0aGlzIG9uIHRoZSBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBzY3JpcHROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRlZCBsaW5lLCBleGFjdGx5IGFzIHRoYXQgc2NyaXB0J3Mgb3duIG91dHB1dCB3b3VsZCBoYXZlIGNhcnJpZWQgaXQuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGNvbW1pdCB0aGF0IGZvcmNlcyBhIHtAbGluayBCdW1wRmxvb3J9LCByZW5kZXJlZCBpbnRvIHRoZSByZWZ1c2FsIHNvIHRoZSBhdXRob3IgY2FuIGdvIGFuZCBsb29rIGF0IGl0LlxuICovXG5pbnRlcmZhY2UgRm9yY2luZ0NvbW1pdCB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gdGhpcyBvbmUgY29tbWl0IGZvcmNlcyBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw6IEJ1bXBMZXZlbDtcblxuICAvKipcbiAgICogV2hhdCBpbiB0aGUgY29tbWl0IGZvcmNlZCBpdCDigJQgdGhlIGAhYCBtYXJrZXIsIHRoZSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyLCBvciB0aGUgYGZlYXRgIHR5cGUg4oCUIG5hbWVkXG4gICAqIHNvIGEgcmVhZGVyIGNhbiB0ZWxsIGEgZGVsaWJlcmF0ZSBicmVha2luZyBtYXJrZXIgZnJvbSBhIGZvb3RlciBzb21lYm9keSB3cm90ZSBpbiBwYXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGNvbW1pdCBoYXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlciwgaW4gYm90aCBzcGVsbGluZ3MgQ29udmVudGlvbmFsIENvbW1pdHMgYWxsb3dzLlxuICpcbiAqIE1hdGNoZWQgcGVyIGxpbmUgKGBtYCkgcmF0aGVyIHRoYW4gYWdhaW5zdCB0aGUgd2hvbGUgbWVzc2FnZSwgYmVjYXVzZSBhIGZvb3RlciBzaXRzIGF0IHRoZSBib3R0b20gb2YgdGhlXG4gKiBib2R5LiBJdCBpcyB0aGUgaGFsZiBvZiB0aGUgYnJlYWtpbmctY2hhbmdlIHNpZ25hbCB0aGF0IHtAbGluayBNRVJHRV9TVUJKRUNUX1JFR19FWFB9J3Mgc2libGluZyByZXdyaXRlXG4gKiBjYW5ub3QgY2Fycnk6IGB0b0NoYW5nZWxvZ0VudHJ5YCBsaWZ0cyBvbmx5IHRoZSBtZXJnZSBib2R5J3MgZmlyc3QgbGluZSBvbnRvIHRoZSBtZXJnZSBzdWJqZWN0LCBzbyBhIGZvb3RlclxuICogd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgbmV2ZXIgcmVhY2hlcyB0aGUgZmlyc3QtcGFyZW50IGhpc3RvcnkgYXQgYWxsLiBUaGF0IGlzIHdoeVxuICoge0BsaW5rIGdldEJ1bXBGbG9vcn0gcmVhZHMgZXZlcnkgY29tbWl0IGluIHRoZSByYW5nZSByYXRoZXIgdGhhbiBvbmx5IHRoZSBmaXJzdC1wYXJlbnQgb25lcy5cbiAqL1xuY29uc3QgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQID0gL15CUkVBS0lOR1sgLV1DSEFOR0U6L207XG5cbi8qKlxuICogVGhlIG1hcmtlciBuYW1lcyBhIHtAbGluayBGb3JjaW5nQ29tbWl0fSBjYXJyaWVzLCBhbmQgdGhlcmVmb3JlIHdoYXQgdGhlIHJlZnVzYWwgbWVzc2FnZSBzYXlzIGZvcmNlZCB0aGVcbiAqIGZsb29yLiBUaGV5IGFyZSBzcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZWR1Y2VkIHRvIHRoZSBsZXZlbCBhbG9uZSwgYmVjYXVzZSBgZmVhdCFgIGFuZCBhIGBCUkVBS0lORyBDSEFOR0U6YFxuICogZm9vdGVyIGJ1cmllZCBpbiBhIGJvZHkgYXJlIHZlcnkgZGlmZmVyZW50IHRoaW5ncyB0byBiZSB0b2xkIGFib3V0LlxuICovXG5jb25zdCBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUiA9ICdhIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBCUkVBS0lOR19NQVJLRVIgPSAndGhlIGAhYCBicmVha2luZyBtYXJrZXInO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9NQVJLRVJ9LlxuICovXG5jb25zdCBGRUFUX1RZUEVfTUFSS0VSID0gJ2EgYGZlYXRgIHR5cGUnO1xuXG4vKipcbiAqIEEgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdDogYSB0eXBlLCBhbiBvcHRpb25hbCBzY29wZSwgYW4gb3B0aW9uYWwgYCFgLCB0aGVuIHRoZSBjb2xvbi5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgdG9sZXJhbnQgb2YgYSBzdWJqZWN0IHRoYXQgaXMgbm90IG9uZSBhdCBhbGwg4oCUIGFuIHVucGFyc2FibGUgc3ViamVjdCBzaW1wbHkgY29uc3RyYWluc1xuICogbm90aGluZywgd2hpY2ggaXMgdGhlIHNhbWUgYW5zd2VyIGEgYGNob3JlOmAgZ2l2ZXMuIFRoaXMgZ2F0ZSBleGlzdHMgdG8gY2F0Y2ggYSBidW1wIHRoYXQgaXMgdG9vIExPVywgc29cbiAqIGZhaWxpbmcgdG8gcmVjb2duaXplIGEgc3ViamVjdCBjYW4gb25seSB1bmRlci1jb25zdHJhaW4sIG5ldmVyIHJlZnVzZSBhIHJlbGVhc2UgdGhhdCBzaG91bGQgaGF2ZSBzaGlwcGVkLlxuICovXG5jb25zdCBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUCA9IC9eKD88dHlwZT5bYS16XSspKD86XFwoW14oKV0qXFwpKT8oPzxicmVha2luZz4hKT86XFxzL2k7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcHJlLXJlbGVhc2UgaWRlbnRpZmllciB1c2VkIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9ucy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUkVJRCA9ICdiZXRhJztcblxuLyoqXG4gKiBUaGUgQ29udmVudGlvbmFsLUNvbW1pdHMgdHlwZSB0aGF0IGZvcmNlcyBhIG1pbm9yLlxuICovXG5jb25zdCBGRUFUX1RZUEUgPSAnZmVhdCc7XG5cbi8qKlxuICogVGhlIG5wbSBzY3JpcHRzIHdob3NlIGNoZWNrcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgaXMgaGVsZCB0bywgbmFtZWQgaW4gdGhlIG1lc3NhZ2VzIHNvIGEgcmVhZGVyIGtub3dzIHdoaWNoXG4gKiBnYXRlIHRoZXkgYXJlIGxvb2tpbmcgYXQg4oCUIGFuZCBrbm93cyB0aGF0IGZpeGluZyBpdCBoZXJlIGlzIHRoZSBzYW1lIGZpeCBhcyBmaXhpbmcgaXQgb24gdGhlIGJyYW5jaC5cbiAqL1xuY29uc3QgTElOVF9NRF9TQ1JJUFRfTkFNRSA9ICdsaW50Om1kJztcblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBhIGNvbW1pdCBoYXNoIHRoZSBidW1wLWZsb29yIHJlZnVzYWwgcHJpbnRzLiBMb25nIGVub3VnaCB0byBwYXN0ZSBpbnRvIGBnaXQgc2hvd2AsIHNob3J0IGVub3VnaFxuICogdGhhdCBhIGxpc3Qgb2YgdGhlbSBzdGF5cyByZWFkYWJsZS5cbiAqL1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogU2VlIHtAbGluayBMSU5UX01EX1NDUklQVF9OQU1FfS5cbiAqL1xuY29uc3QgU1BFTExDSEVDS19TQ1JJUFRfTkFNRSA9ICdzcGVsbGNoZWNrJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGYsIHJhdGhlciB0aGFuIG9uZSBhbiBhdXRob3IgY2hvc2UuXG4gKlxuICogRXZlcnkgZGVmYXVsdCBnaXQgcHJvZHVjZXMgb3BlbnMgd2l0aCBgTWVyZ2VgIGFuZCBhIHdvcmQgYm91bmRhcnkg4oCUIGBNZXJnZSBicmFuY2ggJ3gnYCxcbiAqIGBNZXJnZSBicmFuY2hlcyAneCcgYW5kICd5J2AsIGBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICd4J2AsIGBNZXJnZSBwdWxsIHJlcXVlc3QgIzEgZnJvbSB5YCxcbiAqIGBNZXJnZSB0YWcgJ3gnYCwgYE1lcmdlIGNvbW1pdCAnYWJjJ2Ag4oCUIHdoaWNoIGlzIHdoYXQgdGhlIG9wdGlvbmFsIGFsdGVybmF0aW9uIGFuZCB0aGUgdHJhaWxpbmcgYFxcYmAgY292ZXJcbiAqIGJldHdlZW4gdGhlbS4gQmVpbmcgdGhhdCBicm9hZCBjb3N0cyBub3RoaW5nIGhlcmU6IGV2ZXJ5IGNoYW5nZWxvZyBlbnRyeSBpbiB0aGlzIHdvcmtzcGFjZSBpcyBhXG4gKiBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0LCBhbmQgdGhvc2Ugb3BlbiB3aXRoIGEgdHlwZSAoYGZlYXRgLCBgZml4YCwgYGNob3JlYCwg4oCmKSwgbmV2ZXIgd2l0aCBgTWVyZ2VgLlxuICpcbiAqIE9ORSBwYXR0ZXJuIGRyaXZlcyBib3RoIGhhbHZlcyBvZiB0aGUgZ3VhcmQsIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGFwYXJ0OiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gcmV3cml0ZXNcbiAqIGEgY29tbWl0IHdob3NlIHN1YmplY3QgbWF0Y2hlcyBpdCwgYW5kIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IHJlZnVzZXMgYSBjaGFuZ2Vsb2cgbGluZVxuICogdGhhdCBzdGlsbCBkb2VzLiBUaGUgcmVmdXNhbCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgZm9yIGEgbWVyZ2UgdGhlIHJld3JpdGUgaGFkIG5vdGhpbmcgdG8gd29yayB3aXRoLlxuICovXG5jb25zdCBNRVJHRV9TVUJKRUNUX1JFR19FWFAgPSAvXk1lcmdlKD86IGJyYW5jaHwgcmVtb3RlLXRyYWNraW5nfCBwdWxsIHJlcXVlc3QpP1xcYi87XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlcyBhIGNhbGxlciBuYW1lcyBkaXJlY3RseSwga2V5ZWQgYnkgdGhlaXIgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgdHdvIGBnZXRWZXJzaW9uVXBkYXRlVHlwZWAgZGVyaXZlcy5cbiAqL1xuY29uc3QgTkFNRURfVkVSU0lPTl9VUERBVEVfVFlQRVMgPSBuZXcgTWFwPHN0cmluZywgVmVyc2lvblVwZGF0ZVR5cGU+KFtcbiAgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZU1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZVxuXS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0eXBlXSkpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5JywgLi4uKHNob3VsZFZlcmlmeUNvbW1pdCA/IFtdIDogWyctLW5vLXZlcmlmeSddKV07XG5cbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYWRkJywgJy0tYWxsJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChjb21taXRBcmd1bWVudHMsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIEdpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9naXQtc2NtLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4sIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHVuY29tbWl0dGVkIGNoYW5nZXMuXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHMgYW55IGJhcmUgYGh0dHAocyk6Ly9gIFVSTCBpbiB0aGUgZ2l2ZW4gdGV4dCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgc28gdGhhdCB0ZXh0IGVtaXR0ZWRcbiAqIGludG8gYSBNYXJrZG93biBkb2N1bWVudCAoc3VjaCBhcyBhIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgYnVsbGV0KSBwYXNzZXMgbWFya2Rvd25saW50J3NcbiAqIGBNRDAzNC9uby1iYXJlLXVybHNgIHJ1bGUgd2hpbGUgc3RpbGwgcmVuZGVyaW5nIGFzIGEgY2xpY2thYmxlIGF1dG9saW5rIG9uIEdpdEh1Yi5cbiAqXG4gKiBVUkxzIHRoYXQgYXJlIGFscmVhZHkgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgb3IgdGhhdCBmb3JtIHRoZSB0YXJnZXQgb2YgYSBNYXJrZG93blxuICogbGluayAoYFt0ZXh0XSh1cmwpYCkgYXJlIGxlZnQgdW50b3VjaGVkLCBzbyB0aGUgZnVuY3Rpb24gaXMgc2FmZSB0byBydW4gcmVwZWF0ZWRseS4gVHJhaWxpbmdcbiAqIHNlbnRlbmNlIHB1bmN0dWF0aW9uIChgLmAsIGAsYCwgYDtgLCBgOmAsIGAhYCwgYD9gKSBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXRzIHNvIGl0IGRvZXNcbiAqIG5vdCBiZWNvbWUgcGFydCBvZiB0aGUgbGluay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHBvc3NpYmx5IGNvbnRhaW5pbmcgYmFyZSBVUkxzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBldmVyeSBiYXJlIFVSTCB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b2xpbmtCYXJlVXJscyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC8oPzwhWzxbKF0paHR0cHM/OlxcL1xcL1teXFxzPD4pXFxdXSsvZywgKHVybCkgPT4ge1xuICAgIGNvbnN0IHRyYWlsaW5nUHVuY3R1YXRpb24gPSAvWy4sOzohP10rJC8uZXhlYyh1cmwpPy5bMF0gPz8gJyc7XG4gICAgY29uc3QgYmFyZVVybCA9IHVybC5zbGljZSgwLCB1cmwubGVuZ3RoIC0gdHJhaWxpbmdQdW5jdHVhdGlvbi5sZW5ndGgpO1xuICAgIHJldHVybiBgPCR7YmFyZVVybH0+JHt0cmFpbGluZ1B1bmN0dWF0aW9ufWA7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyB2ZXJzaW9uIHN0cmluZyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZCB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFVzZXMgdGhlIGBzZW12ZXJgIHBhY2thZ2UgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLCBzdXBwb3J0aW5nIGFsbCBucG0gaW5jcmVtZW50IHR5cGVzOlxuICogYG1ham9yYCwgYG1pbm9yYCwgYHBhdGNoYCwgYHByZW1ham9yYCwgYHByZW1pbm9yYCwgYHByZXBhdGNoYCwgYW5kIGBwcmVyZWxlYXNlYC5cbiAqIFByZS1yZWxlYXNlIHZlcnNpb25zIHVzZSB0aGUgYGJldGFgIGlkZW50aWZpZXIgYnkgZGVmYXVsdCAoZS5nLiwgYDEuMi40LWJldGEuMGApLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIG9yIGFuIGV4cGxpY2l0IHZlcnNpb24gc3RyaW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHZlcnNpb24gc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGludmFsaWQgb3IgdGhlIGluY3JlbWVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHZlcnNpb25UeXBlID0gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAodmVyc2lvblR5cGUgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCkge1xuICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbiA/PyAnJztcblxuICBjb25zdCByZWxlYXNlVHlwZSA9IHZlcnNpb25UeXBlIGFzIFJlbGVhc2VUeXBlO1xuICBjb25zdCBpc1ByZVJlbGVhc2VUeXBlID0gcmVsZWFzZVR5cGUuc3RhcnRzV2l0aCgncHJlJyk7XG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBpc1ByZVJlbGVhc2VUeXBlXG4gICAgPyBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlLCBERUZBVUxUX1BSRUlEKVxuICAgIDogaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld1ZlcnNpb24sIGBGYWlsZWQgdG8gaW5jcmVtZW50IHZlcnNpb24gZnJvbSAnJHtjdXJyZW50VmVyc2lvbn0nIHdpdGggdHlwZSAnJHt2ZXJzaW9uVHlwZX0nYCk7XG5cbiAgcmV0dXJuIG5ld1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHZlcnNpb24gZnJvbSB0aGUgY2hhbmdlbG9nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSByZWxlYXNlIG5vdGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbik7XG4gIGxldCByZWxlYXNlTm90ZXMgPSBzZWN0aW9uID8gYCR7c2VjdGlvbn1cXG5cXG5gIDogJyc7XG5cbiAgY29uc3QgdGFnT3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHRhZ3MgPSB0YWdPdXRwdXQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gdGFnc1sxXTtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAudXJsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNoYW5nZXNVcmwgPSBwcmV2aW91c1ZlcnNpb24gPyBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gIDogYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IG5hbWVkVmVyc2lvblVwZGF0ZVR5cGUgPSBOQU1FRF9WRVJTSU9OX1VQREFURV9UWVBFUy5nZXQodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAobmFtZWRWZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIHJldHVybiBuYW1lZFZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgcmV0dXJuIC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSA/IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCA6IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG59XG5cbi8qKlxuICogUHVzaGVzIGNvbW1pdHMgYW5kIHRhZ3MgdG8gdGhlIHJlbW90ZSBHaXQgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHB1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0UHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgcHVzaCAtLWZvbGxvdy10YWdzIC0tZm9yY2UnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogVGhlIGZsYWdzIHtAbGluayBwYXJzZVZlcnNpb25Bcmd1bWVudHN9IHJlY29nbml6ZXMsIGluIHRoZSBzaGFwZSBOb2RlJ3MgYHBhcnNlQXJnc2AgdGFrZXMuIEV4cG9ydGVkIHNvIGEgd3JhcHBlclxuICogdGhhdCBhZGRzIGZsYWdzIG9mIGl0cyBvd24gY2FuIHBhcnNlIHRoZW0gYWxsIGluIG9uZSBwYXNzIGFuZCBzdGlsbCByZWFkIHRoZXNlIHRocm91Z2hcbiAqIHtAbGluayB0b1VwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OUyA9IHtcbiAgJ2NoYW5nZWxvZy1maWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8taXNzdWUtY2xvc2luZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxufSBhcyBjb25zdCBzYXRpc2ZpZXMgTm9uTnVsbGFibGU8UGFyc2VBcmdzQ29uZmlnWydvcHRpb25zJ10+O1xuXG4vKipcbiAqIFRoZSB2YWx1ZXMgYHBhcnNlQXJnc2AgcmVwb3J0cyBmb3Ige0BsaW5rIFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU30uXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25Bcmd1bWVudFZhbHVlcyA9IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJnczxWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZz4+Wyd2YWx1ZXMnXTtcblxuLyoqXG4gKiBUaGUgYHBhcnNlQXJnc2AgY29uZmlndXJhdGlvbiB7QGxpbmsgVmVyc2lvbkFyZ3VtZW50VmFsdWVzfSBpcyBkZXJpdmVkIGZyb20uXG4gKi9cbmludGVyZmFjZSBWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjb2duaXplZCBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IHR5cGVvZiBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlM7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHZlcnNpb24gaXMgYSBwcmUtcmVsZWFzZSwgc3VjaCBhcyBgMS4yLjQtYmV0YS4wYC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxuICogQHJldHVybnMgV2hldGhlciBpdCBjYXJyaWVzIGEgcHJlLXJlbGVhc2UgcGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlUmVsZWFzZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByZXJlbGVhc2UodmVyc2lvbikgIT09IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBhIHZlcnNpb24gdXBkYXRlIGludG8gYSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZFxuICoge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqXG4gKiBFYWNoIGJlaGF2aW9yIGlzIGVuYWJsZWQgYnkgZGVmYXVsdDsgdGhlIGNvcnJlc3BvbmRpbmcgYC0tbm8tKmAgZmxhZyB0dXJucyBpdCBvZmYuIGAtLWNoYW5nZWxvZy1maWxlYCB0YWtlcyBhXG4gKiB2YWx1ZSBpbnN0ZWFkIGFuZCBoYXMgbm8gZGVmYXVsdC4gUmVjb2duaXplZCBmbGFnczpcbiAqIC0gYC0tY2hhbmdlbG9nLWZpbGU9PHBhdGg+YCDigJQgdXNlIHRoaXMgZmlsZSdzIGNvbnRlbnRzIGFzIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uIGluc3RlYWQgb2ZcbiAqICAgdGhlIGNvbW1pdC1kZXJpdmVkIGJ1bGxldHMsIGFuZCBza2lwIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgZW50aXJlbHkuXG4gKiAtIGAtLW5vLWJ1aWxkYCDigJQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCDigJQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2Ag4oCUIHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIOKAlCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1pc3N1ZS1jbG9zaW5nYCDigJQgZG8gbm90IGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAg4oCUIHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzKSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIENyZWF0ZXMgdGhlIHJlbGVhc2UgYW5kIGF0dGFjaGVzIHRoZSBmaWxlcyB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zLmdldFJlbGVhc2VBc3NldFBhdGhzfSBuYW1lcy5cbiAqXG4gKiBPbmNlIHRoZSByZWxlYXNlIGV4aXN0cywgdGhlIGlzc3VlcyBpdCBjYXJyaWVzIGFyZSBjbG9zZWQgd2l0aCBhIGxpbmsgdG8gaXQgKHNlZSB7QGxpbmsgY2xvc2VSZWxlYXNlZElzc3Vlc30pLFxuICogdW5sZXNzIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30gaXMgYGZhbHNlYC4gQSBmYWlsdXJlIHRoZXJlIGlzIHJlcG9ydGVkIGFuZFxuICogZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZSwgd2hpY2ggaXMgYWxyZWFkeSBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGxldCBmaWxlUGF0aHMgPSBhd2FpdCBnZXRSZWxlYXNlQXNzZXRQYXRocygpO1xuICBmaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGZpbGVQYXRoIH0pKSk7XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAnZ2gnLFxuICAgICdyZWxlYXNlJyxcbiAgICAnY3JlYXRlJyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIC4uLmZpbGVQYXRocyxcbiAgICAnLS10aXRsZScsXG4gICAgYHYke25ld1ZlcnNpb259YCxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoIXNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGNsb3NlUmVsZWFzZWRJc3N1ZXMoeyBuZXdWZXJzaW9uIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgVGhlICR7bmV3VmVyc2lvbn0gcmVsZWFzZSBpcyBwdWJsaXNoZWQsIGJ1dCBjbG9zaW5nIHRoZSBpc3N1ZXMgaXQgY2FycmllcyBmYWlsZWQ6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbi8qKlxuICogTWFwcyB0aGUgdmFsdWVzIGBwYXJzZUFyZ3NgIHJlcG9ydHMgZm9yIHtAbGluayBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlN9IG9udG8ge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzOiBWZXJzaW9uQXJndW1lbnRWYWx1ZXMpOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGg6IHZhbHVlc1snY2hhbmdlbG9nLWZpbGUnXSxcbiAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM6ICEodmFsdWVzWyduby1pc3N1ZS1jbG9zaW5nJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2c6ICEodmFsdWVzWyduby1jaGFuZ2Vsb2ctZWRpdGluZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0OiAhKHZhbHVlc1snbm8tY29tbWl0LXZlcmlmaWNhdGlvbiddID8/IGZhbHNlKVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSByZXZpZXcgaGFwcGVucyBvbiBhIHNjcmF0Y2ggY29weSBpbiB0aGUgT1MgdGVtcG9yYXJ5IGZvbGRlciwgYW5kIHRoZSByZXBvc2l0b3J5J3Mgb3duXG4gKiBgQ0hBTkdFTE9HLm1kYCBpcyB3cml0dGVuIG9ubHkgb25jZSB0aGUgcmV2aWV3IGlzIG92ZXIg4oCUIHNvIGludGVycnVwdGluZyB0aGUgcmV2aWV3IGxlYXZlcyB0aGVcbiAqIHJlcG9zaXRvcnkgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjaGFuZ2Vsb2cgcmV2aWV3IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGFuZ2Vsb2cgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgb3B0aW9ucykpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldywgaWYgb25lIGlzIGR1ZSwgY2FuIGFjdHVhbGx5IGJlIGFuc3dlcmVkLlxuICogNC4gVmVyaWZpZXMgdGhhdCB0aGUgYnVtcCBpcyBub3QgbG93ZXIgdGhhbiB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcgZm9yY2UgaXQgdG8gYmUuXG4gKiA1LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDYuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDcuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDguIFNldHRsZXMgdGhlIGNoYW5nZWxvZyDigJQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqICAgIFRoZSBzZXR0bGVkIHRleHQgaXMgbGludGVkIGhlcmUgdG9vOiBgbGludDptZGAgcmFuIGluIHN0ZXAgNiwgYmVmb3JlIGEgY2hhcmFjdGVyIG9mIGl0IGV4aXN0ZWQuXG4gKiA5LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgKGFuZCBpbiB3aGF0ZXZlciB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnMudXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc30gYWRkcyksIHRoZW5cbiAqICAgIHdyaXRlcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cuXG4gKiAxMC4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTEuIFByZXBhcmVzIGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqIDEyLiBDbG9zZXMgdGhlIGlzc3VlcyB0aGUgcmVsZWFzZSBjYXJyaWVzLCB3aXRoIGEgbGluayB0byBpdC5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIGdldFJlbGVhc2VBc3NldFBhdGhzLFxuICAgIHByZXBhcmVHaXRIdWJSZWxlYXNlLFxuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzID0gdHJ1ZSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUsXG4gICAgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCBhc3NlcnRHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk7XG4gIC8vIENoZWNrZWQgaGVyZSwgYmVmb3JlIHRoZSBjaGVja3MgYW5kIHRoZSBidWlsZCwgcmF0aGVyIHRoYW4gYXQgdGhlIGNoYW5nZWxvZyBzdGVwIGl0c2VsZjogYSBub24taW50ZXJhY3RpdmVcbiAgLy8gY2FsbGVyIGxlYXJucyBpbiBzZWNvbmRzIGluc3RlYWQgb2YgcGF5aW5nIGZvciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGFuZCBvbmx5IHRoZW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yXG4gIC8vIHdpbmRvdyBub2JvZHkgd2lsbCBldmVyIGNsb3NlLlxuICBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbi4gRGVsaWJlcmF0ZWx5IE5PVCB1bmRlciBgc2hvdWxkUnVuQ2hlY2tzYDogdGhhdCBmbGFnIGJ1eXMgYSBmYXN0IHJlbGVhc2UgYnlcbiAgLy8gc2tpcHBpbmcgdGhlIFZFUklGSUNBVElPTiBvZiB0aGUgY29kZSwgYW5kIHRoaXMgaXMgYSBjb3JyZWN0bmVzcyBnYXRlIG9uIHRoZSByZWxlYXNlIGl0c2VsZiDigJQgdGhlIGJ1bXBcbiAgLy8gYSBgLS1uby1jaGVja3NgIHJlbGVhc2Ugc2hpcHMgaXMgYXMgcHVibGljLCBhbmQgYXMgdW5maXhhYmxlIGFmdGVyd2FyZHMsIGFzIGFueSBvdGhlci5cbiAgYXdhaXQgYXNzZXJ0VmVyc2lvblVwZGF0ZVR5cGVNZWV0c0J1bXBGbG9vcih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGFzc2VydEdpdFJlcG9DbGVhbigpO1xuICB9XG5cbiAgLy8gVGhlIHJlc3Qgb2YgdGhlIHByZWZsaWdodCBJUyBgbnBtIHJ1biBnYXRlYCwgbm90IGEgY29weSBvZiBpdDogYSBjaGVjayBhZGRlZCB0byB0aGUgZ2F0ZSBpcyByZWFjaGFibGVcbiAgLy8gZnJvbSB0aGUgYnJhbmNoIGFuZCBmcm9tIHRoZSByZWxlYXNlIGJ5IGNvbnN0cnVjdGlvbiwgaW5zdGVhZCBvZiBieSB0d28gbGlzdHMgaGFwcGVuaW5nIHRvIGFncmVlLlxuICAvLyBUaGUgY2xlYW4tcmVwbyBhc3NlcnRpb24gYWJvdmUgc3RheXMgaGVyZSwgYmVjYXVzZSB0aGUgZ2F0ZSBpcyBydW4gb24gYSBkaXJ0eSB0cmVlIG9uIHB1cnBvc2UuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAg4oCUIHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBhd2FpdCBnYXRlKHtcbiAgICBzaG91bGRCdWlsZCxcbiAgICBzaG91bGRSdW5DaGVja3MsXG4gICAgc2hvdWxkUnVuSW50ZWdyYXRpb25UZXN0czogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG5cbiAgLy8gVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhXG4gIC8vIGh1bWFuLiBJbnRlcnJ1cHRpbmcgaXQgdGhlcmVmb3JlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIHByaXN0aW5lIGFuZCB0aGUgd2hvbGUgcmVsZWFzZSByZS1ydW5uYWJsZSxcbiAgLy8gaW5zdGVhZCBvZiBzdHJhbmRpbmcgYSBidW1wZWQtYnV0LXVuY29tbWl0dGVkIHRyZWUgdGhhdCBgYXNzZXJ0R2l0UmVwb0NsZWFuYCB0aGVuIHJlZnVzZXMgdG8gcmUtcmVsZWFzZS5cbiAgY29uc3QgbmV3Q2hhbmdlTG9nID0gYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZ1xuICB9KTtcblxuICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlcz8uKG5ld1ZlcnNpb24pO1xuXG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZyk7XG4gIGF3YWl0IGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb24sIHsgc2hvdWxkVmVyaWZ5Q29tbWl0IH0pO1xuICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbik7XG5cbiAgaWYgKCFzaG91bGRSZWxlYXNlKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKSgnU2tpcHBpbmcgZ2l0IHB1c2ggYW5kIEdpdEh1YiByZWxlYXNlICgtLW5vLXJlbGVhc2UpLiBUaGUgdmVyc2lvbiBidW1wLCBjaGFuZ2Vsb2csIGNvbW1pdCwgYW5kIHRhZyBoYXZlIGJlZW4gY3JlYXRlZCBsb2NhbGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGdpdFB1c2goKTtcbiAgYXdhaXQgcHJlcGFyZUdpdEh1YlJlbGVhc2U/LihuZXdWZXJzaW9uKTtcbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgeyBnZXRSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIGBwYWNrYWdlLmpzb25gIGFuZCwgd2hlcmUgdGhleSBleGlzdCwgYHBhY2thZ2UtbG9jay5qc29uYCBhbmQgYG5wbS1zaHJpbmt3cmFwLmpzb25gLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIG1hdGNoZXMgb25lIG9mIHRoZSBtYWludGFpbmVyJ3Mgb3duIHVucHVibGlzaGVkIGZvcmJpZGRlbiBwYXR0ZXJucy5cbiAqXG4gKiBFdmVyeSBjb21taXQgc3ViamVjdCBzaW5jZSB0aGUgbGFzdCB0YWcgc2hpcHMgdmVyYmF0aW0gaW50byB0aGUgbmV3IHNlY3Rpb24sIHNvIGEgc3ViamVjdCB0aGF0IGNhcnJpZXNcbiAqIHZvY2FidWxhcnkgcHJpdmF0ZSB0byB0aGUgbWFpbnRhaW5lciDigJQgYW4gaW50ZXJuYWwgdHJhY2tlciBpZCwgYSBwcml2YXRlIHByb2plY3Qgc2hvcnQgbmFtZSDigJQgbGFuZHMgaW4gYVxuICogY2hlY2tlZC1pbiwgcHVibGlzaGVkIGZpbGUgaW5zaWRlIHRoZSByZWxlYXNlIGNvbW1pdCwgd2hlcmUgbm90aGluZyBldmVyIGxvb2tzIGF0IGl0IGFnYWluLiBUaGUgbGlzdCBvZiB3aGF0XG4gKiBjb3VudHMgYXMgcHJpdmF0ZSBjYW5ub3QgbGl2ZSBpbiB0aGlzIGxpYnJhcnkgb3IgaW4gdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBwdWJsaXNoaW5nIHRoZSB2ZXJ5IHRoaW5nIGl0XG4gKiBwcm90ZWN0cywgc28gaXQgY29tZXMgZnJvbSB0aGUgZmlsZSB7QGxpbmsgRk9SQklEREVOX1BBVFRFUk5TX0ZJTEVfRU5WX1ZBUklBQkxFfSBuYW1lcywgYW5kIHRoaXMgaXMgYSBuby1vcFxuICogd2hlcmV2ZXIgdGhhdCBpcyBub3QgY29uZmlndXJlZC5cbiAqXG4gKiBMaWtlIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9LCBvbmx5IHRoZSBzZWN0aW9uIGJlaW5nIHB1Ymxpc2hlZCBpcyBzY2FubmVkLCBhbmQgdGhlIHRocm93XG4gKiBjb21lcyBiZWZvcmUgYW55dGhpbmcgaXMgd3JpdHRlbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgcmVhZEZvcmJpZGRlblBhdHRlcm5zKCk7XG4gIGNvbnN0IG1hdGNoZXMgPSBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMoZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbiksIHBhdHRlcm5zKTtcblxuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IG1hdGNoZXMgYSBwYXR0ZXJuIGZyb20gdGhlIGZpbGVgXG4gICAgICArIGAgJHtGT1JCSURERU5fUEFUVEVSTlNfRklMRV9FTlZfVkFSSUFCTEV9IG5hbWVzOlxcbmBcbiAgICAgICsgYCR7bWF0Y2hlcy5tYXAoKHsgbGluZSwgbWF0Y2ggfSkgPT4gYCR7bGluZX0gICAgPC0gJHttYXRjaH1gKS5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdOb3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LiBTdXBwbHkgcmVsZWFzZSBub3RlcyB0aGF0IHNheSB0aGUgc2FtZSB0aGluZyB3aXRob3V0IGl0LCB3aXRoJ1xuICAgICAgKyAnIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAsIG9yIHJlbW92ZSBpdCBhdCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCBhbmQgcmUtcnVuIHRoZSByZWxlYXNlLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY2hhbmdlbG9nIHdob3NlIE5FVyBzZWN0aW9uIHN0aWxsIGNhcnJpZXMgYW4gZW50cnkgdGhhdCByZWFkcyBhcyBhIG1lcmdlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZi5cbiAqXG4gKiBUaGUgY29udmVudGlvbiB0aGlzIGVuZm9yY2VzIGlzIHRoYXQgYSBub24tZmYgbWVyZ2UgdGFrZXMgdGhlIHNhbWUgQ29udmVudGlvbmFsLUNvbW1pdHMgc3ViamVjdCBhcyB0aGUgYnJhbmNoXG4gKiBjb21taXQgaXQgbGFuZHMuIE5vdGhpbmcgdXNlZCB0byBob2xkIGl0OiBmb3IgYSBub24tZmYgbWVyZ2UgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgaXMgdGhlIG1lcmdlIGNvbW1pdCwgc28gYVxuICogZGVmYXVsdCBzdWJqZWN0IHNoaXBzIHZlcmJhdGltLCBwdWJsaXNoaW5nIGEgYmFyZSBicmFuY2ggbmFtZSAoYE1lcmdlIGJyYW5jaCAnZml4LXRoZS10aGluZydgKSBhcyBhIGNoYW5nZWxvZ1xuICogZW50cnkg4oCUIHdoaWNoIHNheXMgbm90aGluZyBhYm91dCB3aGF0IGNoYW5nZWQsIGFuZCBvbiBhIGJyYW5jaCBuYW1lZCBhZnRlciBhIHByaXZhdGUgdHJhY2tlciBpdGVtIGRlY29kZXMgdG9cbiAqIG5vdGhpbmcgYXQgYWxsIGZvciBhIHJlYWRlci4gVGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgdGhlIGRlIGZhY3RvIGNhdGNoLCBhbmQgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgLCB0aGVcbiAqIGZsYWcgYW4gdW5hdHRlbmRlZCByZWxlYXNlIGFjdHVhbGx5IHVzZXMsIHNraXBzIGl0OyBvbmUgc3dlZXAgYWNyb3NzIHRoaXMgd29ya3NwYWNlIGZvdW5kIHR3ZWx2ZSBzdWNoXG4gKiBwdWJsaXNoZWQgZW50cmllcyBpbiBhIHNpbmdsZSByZXBvc2l0b3J5LlxuICpcbiAqIE9ubHkgdGhlIHNlY3Rpb24gYmVpbmcgcHVibGlzaGVkIGlzIHNjYW5uZWQsIHNvIGFuIGVudHJ5IGFscmVhZHkgc2hpcHBlZCB1bmRlciBhbiBvbGRlciB2ZXJzaW9uIGNhbm5vdCBibG9ja1xuICogZXZlcnkgZnV0dXJlIHJlbGVhc2UuIHtAbGluayB0b0NoYW5nZWxvZ0VudHJ5fSBoYXMgYWxyZWFkeSByZXdyaXR0ZW4gZXZlcnkgbWVyZ2UgdGhhdCBoYWQgYSBib2R5IHRvIHJld3JpdGVcbiAqIGZyb20sIHNvIHdoYXQgcmVhY2hlcyBoZXJlIGlzIGEgbWVyZ2Ugd2hvc2UgYXV0aG9yIHdyb3RlIG5vdGhpbmcgYXQgYWxsIOKAlCB3aGljaCBubyByZXdyaXRlIGNhbiBpbnZlbnQsIGFuZFxuICogd2hpY2ggaXMgdGhlcmVmb3JlIHdvcnRoIHN0b3BwaW5nIHRoZSByZWxlYXNlIGZvci5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgQlVMTEVUX1JFR19FWFAgPSAvXi0gLztcbiAgY29uc3Qgb2ZmZW5kaW5nRW50cmllcyA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUC50ZXN0KGxpbmUucmVwbGFjZShCVUxMRVRfUkVHX0VYUCwgJycpKSk7XG5cbiAgaWYgKG9mZmVuZGluZ0VudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBjYXJyaWVzIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOlxcbmBcbiAgICAgICsgYCR7b2ZmZW5kaW5nRW50cmllcy5qb2luKCdcXG4nKX1cXG5gXG4gICAgICArICdTdWNoIGFuIGVudHJ5IHB1Ymxpc2hlcyBhIGJyYW5jaCBuYW1lIGluc3RlYWQgb2Ygc2F5aW5nIHdoYXQgc2hpcHBlZC4gR2l2ZSB0aGUgbWVyZ2UgY29tbWl0IHRoZSBzYW1lJ1xuICAgICAgKyAnIHN1YmplY3QgYXMgdGhlIGJyYW5jaCBjb21taXQgaXQgbGFuZHMgKGBnaXQgY29tbWl0IC0tYW1lbmRgIG9uIHRoZSBtZXJnZSwgdGhlbiByZS1ydW4gdGhlIHJlbGVhc2UpLCBvcidcbiAgICAgICsgJyBzdXBwbHkgdGhlIHJlbGVhc2Ugbm90ZXMgeW91cnNlbGYgd2l0aCBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gLidcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgcmVsZWFzZSB0aGF0IHdvdWxkIGhhdmUgdG8gc3RvcCBhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyB3aXRoIG5vYm9keSB0aGVyZSB0b1xuICogZmluaXNoIGl0LiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHNvIHRoZSByZWZ1c2FsIGNvc3RzIHNlY29uZHMsIG5vdCB0aGUgd2hvbGUgY2hlY2stYW5kLWJ1aWxkIGdhdGUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpcyBtZWFudCB0byBiZSByZXZpZXdlZCBpbnRlcmFjdGl2ZWx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaG91bGRFZGl0Q2hhbmdlbG9nOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkIHx8ICFzaG91bGRFZGl0Q2hhbmdlbG9nIHx8IHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ1RoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IG5lZWRzIGEgdGVybWluYWwsIGFuZCB0aGlzIHByb2Nlc3MgaGFzIG5vbmUsIHNvIHRoZSByZWxlYXNlIHdvdWxkIGJsb2NrIGZvcmV2ZXIuJ1xuICAgICAgKyAnIFBhc3MgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIHRvIGFjY2VwdCB0aGUnXG4gICAgICArICcgY2hhbmdlbG9nIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMgYXMgaXMuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSByZWxlYXNlIHdob3NlIGJ1bXAgaXMgTE9XRVIgdGhhbiB0aGUgY29tbWl0cyBpdCBpcyBhYm91dCB0byBwdWJsaXNoIGZvcmNlIGl0IHRvIGJlLlxuICpcbiAqIFRoZSBydWxlIHRoaXMgZW5mb3JjZXMgaXMgb2xkIGFuZCB3YXMgd3JpdHRlbiBkb3duIGFmdGVyIGA5Ni41LjFgIHNoaXBwZWQgc2l4IHVucmVsZWFzZWQgYGZlYXQ6YCBjb21taXRzIGFzXG4gKiBhIHBhdGNoOiBjaG9vc2UgdGhlIGJ1bXAgZnJvbSB0aGUgd2hvbGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3QgdGFnLCBuZXZlciBmcm9tIHRoZSBjaGFuZ2UgeW91IGhhcHBlbiB0byBiZVxuICogd29ya2luZyBvbi4gSXQgZGlkIG5vdCBob2xkIOKAlCBgMTA1LjEuMGAgb2YgdGhpcyBsaWJyYXJ5IGlzIGEgTUlOT1IgY2FycnlpbmcgYGZlYXQodml0ZXN0LWNvbmZpZykhYCwgc28gZXZlcnlcbiAqIGNvbnN1bWVyIG9uIGEgY2FyZXQgcmFuZ2UgdG9vayBhIGJyZWFraW5nIGNoYW5nZSB3aXRoIG5vIHZlcnNpb24gc2lnbmFsIOKAlCBhbmQgaXQgY291bGQgbm90IGhvbGQsIGJlY2F1c2UgaXRcbiAqIGFza2VkIGEgaHVtYW4gdG8gc2NhbiBhIHJhbmdlIGFuZCB0aGVuIHR5cGUgYSBidW1wIHRoYXQgbm90aGluZyBjb21wYXJlZCBhZ2FpbnN0IHdoYXQgdGhlIHNjYW4gd291bGQgaGF2ZVxuICogZm91bmQuIFRoaXMgaXMgdGhhdCBjb21wYXJpc29uLCBhdCB0aGUgb25lIG1vbWVudCB0aGUgcnVsZSBpcyBiZWluZyBicm9rZW4uXG4gKlxuICogSXQgcmVmdXNlcyBvbmx5IGEgYnVtcCB0aGF0IGlzIHRvbyBMT1cuIEEgZGVsaWJlcmF0ZWx5IGhpZ2hlciBvbmUg4oCUIGEgbWFqb3IgY3V0IHRvIHNpZ25hbCBhIGJyZWFrIGxhdGUsIGFcbiAqIG1pbm9yIGZvciBhIHJhbmdlIG9mIHB1cmUgYGZpeGBlcyDigJQgcGFzc2VzIHVudG91Y2hlZCwgYW5kIHRoZXJlIGlzIG5vIGZsYWcgdG8gc3dpdGNoIHRoZSBnYXRlIG9mZjogYW5cbiAqIG9wdC1vdXQgaXMgd2hhdCBnZXRzIHJlYWNoZWQgZm9yIHJlZmxleGl2ZWx5LCBhbmQgdGhlIGxlZ2l0aW1hdGUgZXNjYXBlIChidW1wIGhpZ2hlcikgYWxyZWFkeSBleGlzdHMuXG4gKlxuICogQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCByYXRoZXIgdGhhbiBhdCB0aGUgYnVtcCBpdHNlbGYsIHNvIGEgcmVmdXNhbCBjb3N0cyBzZWNvbmRzIGluc3RlYWQgb2YgdGhlIHdob2xlXG4gKiBjaGVjay1hbmQtYnVpbGQgZ2F0ZSwgYW5kIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB3aGVuIGl0IHRocm93cy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0aGUgcmVsZWFzZSB3YXMgYXNrZWQgZm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRWZXJzaW9uVXBkYXRlVHlwZU1lZXRzQnVtcEZsb29yKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgY29uc3QgbGFzdFRhZyA9IGF3YWl0IHJlc29sdmVMYXN0UmVsZWFzZWRUYWcoYXdhaXQgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXMoKSk7XG5cbiAgLy8gTm8gYmFzZWxpbmUsIG5vIHJhbmdlLCBubyBmbG9vci4gVGhpcyBpcyBhIGZpcnN0IHJlbGVhc2UsIG9yIG9uZSB3aG9zZSBwcmV2aW91cyB0YWcgd2FzIGRlbGV0ZWQg4oCUIHRoZVxuICAvLyBjaGFuZ2Vsb2cgc3RlcCBmYWxscyBiYWNrIHRvIHRoZSBmdWxsIGhpc3RvcnkgdGhlcmUsIGFuZCBkZXJpdmluZyBhIGZsb29yIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBvZiBhIHJlcG9cbiAgLy8gYWJvdXQgdG8gY3V0IGAxLjAuMGAgd291bGQgcmVmdXNlIGl0IG92ZXIgY29tbWl0cyB0aGF0IHByZWRhdGUgdGhlIGNvbmNlcHQgb2YgYSBwdWJsaXNoZWQgc3VyZmFjZS5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKCdObyBwcmV2aW91cyByZWxlYXNlIHRhZyByZXNvbHZlZCwgc28gdGhlIGJ1bXAgZmxvb3IgaXMgbm90IGRlcml2ZWQuIFRoZSBidW1wIGlzIHRha2VuIGFzIGdpdmVuLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJ1bXBGbG9vciA9IGF3YWl0IGdldEJ1bXBGbG9vcihgJHtsYXN0VGFnfS4uSEVBRGApO1xuICBjb25zdCBmbG9vckxldmVsID0gYnVtcEZsb29yLmxldmVsO1xuICBpZiAoZmxvb3JMZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGNvbnN0IHRha2VuTGV2ZWwgPSB0b0VmZmVjdGl2ZUJ1bXBMZXZlbChsYXN0VGFnLCBuZXdWZXJzaW9uKTtcblxuICAvLyBBbiB1bnBhcnNhYmxlIGJhc2VsaW5lIG9yIHRhcmdldCBpcyBub3QgdGhpcyBnYXRlJ3MgYnVzaW5lc3MgdG8gZmFpbCBhIHJlbGVhc2Ugb3Zlci4gSXQgY2FuIG9ubHkgaGFwcGVuXG4gIC8vIGZvciBhIHRhZyB0aGF0IGlzIG5vdCBhIHZlcnNpb24gYXQgYWxsLCB3aGljaCBldmVyeSBvdGhlciBzdGVwIGhlcmUgd291bGQgaGF2ZSBpdHMgb3duIHRyb3VibGUgd2l0aC5cbiAgaWYgKCF0YWtlbkxldmVsKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKGBDb3VsZCBub3QgY29tcGFyZSAnJHtuZXdWZXJzaW9ufScgYWdhaW5zdCB0aGUgcHJldmlvdXMgdGFnICcke2xhc3RUYWd9Jywgc28gdGhlIGJ1bXAgZmxvb3IgaXMgbm90IGVuZm9yY2VkLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0J1bXBMZXZlbEF0TGVhc3QodGFrZW5MZXZlbCwgZmxvb3JMZXZlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyB0b0J1bXBGbG9vckVycm9yKGJ1bXBGbG9vciwge1xuICAgIGxhc3RUYWcsXG4gICAgbmV3VmVyc2lvbixcbiAgICB0YWtlbkxldmVsLFxuICAgIHZlcnNpb25VcGRhdGVUeXBlXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiDigJQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBsb3dlc3QgYnVtcCBhIGNvbW1pdCByYW5nZSBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBmcm9tIHRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIHRoZVxuICogY29tbWl0cyBpbiBpdCBjYXJyeS5cbiAqXG4gKiBBIGAhYCBiZWZvcmUgdGhlIHN1YmplY3QncyBjb2xvbiwgb3IgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgLyBgQlJFQUtJTkctQ0hBTkdFOmAgZm9vdGVyLCBmb3JjZXMgYSBtYWpvcjsgYVxuICogYGZlYXRgIHR5cGUgZm9yY2VzIGEgbWlub3I7IGV2ZXJ5dGhpbmcgZWxzZSDigJQgYGZpeGAsIGBjaG9yZWAsIGBkb2NzYCwgYHJlZmFjdG9yYCwgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IOKAlFxuICogY29uc3RyYWlucyBub3RoaW5nIGFuZCB5aWVsZHMgYSBwYXRjaCBmbG9vciwgd2hpY2ggaXMgbm8gY29uc3RyYWludCBhdCBhbGwuXG4gKlxuICogKipFdmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIGlzIHJlYWQsIGRlbGliZXJhdGVseSBOT1Qgb25seSB0aGUgZmlyc3QtcGFyZW50IG9uZXMqKiwgd2hpY2ggaXMgd2hlcmUgdGhpc1xuICogZGlmZmVycyBmcm9tIHRoZSBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIG92ZXIgdGhlIHNhbWUgcmFuZ2UuIFRoZSBjaGFuZ2Vsb2cgaXMgZmlyc3QtcGFyZW50IGJlY2F1c2UgaXQgcHVibGlzaGVzXG4gKiBvbmUgbGluZSBwZXIgbGFuZGVkIGNoYW5nZTsgYSBicmVha2luZyBjaGFuZ2UgaXMgYnJlYWtpbmcgd2hpY2hldmVyIHBhcmVudCBpdCBhcnJpdmVkIG9uLiBDb25jcmV0ZWx5LFxuICoge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGxpZnRzIG9ubHkgdGhlIEZJUlNUIGxpbmUgb2YgYSBtZXJnZSBib2R5IG9udG8gYSBkZWZhdWx0IG1lcmdlIHN1YmplY3QsIHNvIGFcbiAqIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIgd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgaXMgaW52aXNpYmxlIHRvIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSDigJQgYW5kIGEgZm9vdGVyXG4gKiBpcyB0aGUgb25lIGJyZWFraW5nIHNpZ25hbCBDb252ZW50aW9uYWwgQ29tbWl0cyBwdXRzIGluIHRoZSBib2R5IHJhdGhlciB0aGFuIHRoZSBzdWJqZWN0LiBUaGUgY29zdCBvZlxuICogcmVhZGluZyBldmVyeXRoaW5nIGlzIG92ZXItZGV0ZWN0aW9uOiBhIGJyYW5jaCB3aG9zZSBicmVha2luZyBjb21taXQgd2FzIHJld29ya2VkIGludG8gYSBub24tYnJlYWtpbmcgbWVyZ2VcbiAqIHN0aWxsIGZvcmNlcyBhIG1ham9yLiBUaGF0IGRpcmVjdGlvbiBpcyBzYWZlIOKAlCBhbiBvdmVyLWJ1bXAgY29zdHMgYSBjb25zdW1lciBub3RoaW5nIGFuZCB0aGUgbWVzc2FnZSBuYW1lc1xuICogdGhlIGNvbW1pdCBzbyB0aGUgYXV0aG9yIGNhbiBzZWUgZXhhY3RseSB3aGljaCBvbmUg4oCUIGFuZCB0aGUgb3RoZXIgZGlyZWN0aW9uIGlzIHRoZSBkZWZlY3QgdGhpcyBleGlzdHMgZm9yLlxuICpcbiAqIEBwYXJhbSBjb21taXRSYW5nZSAtIFRoZSBnaXQgcmV2aXNpb24gcmFuZ2UgdG8gc2NhbiwgZS5nLiBgMTA1LjIuMC4uSEVBRGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgQnVtcEZsb29yfSB0aGUgcmFuZ2UgZm9yY2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCdW1wRmxvb3IoY29tbWl0UmFuZ2U6IHN0cmluZyk6IFByb21pc2U8QnVtcEZsb29yPiB7XG4gIC8vIGAlSCVuJUJgIHB1dHMgdGhlIGhhc2ggb24gaXRzIG93biBmaXJzdCBsaW5lIGFuZCB0aGUgZnVsbCBtZXNzYWdlIHVuZGVyIGl0LCBhbmQgYC16YCBzZXBhcmF0ZXMgdGhlXG4gIC8vIGNvbW1pdHMgd2l0aCBOVUwg4oCUIHNvIG5vdGhpbmcgaW4gYSBjb21taXQgbWVzc2FnZSBjYW4gYmUgbWlzdGFrZW4gZm9yIGEgcmVjb3JkIGJvdW5kYXJ5LlxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnbG9nJywgY29tbWl0UmFuZ2UsICctLWZvcm1hdD0lSCVuJUInLCAnLXonXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGZvcmNpbmdDb21taXRzID0gb3V0cHV0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gdG9Gb3JjaW5nQ29tbWl0KHJlY29yZCkpXG4gICAgLmZpbHRlcigoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdCAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JjaW5nQ29tbWl0cyxcbiAgICBsZXZlbDogdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzKVxuICB9O1xufVxuXG4vKipcbiAqIFJ1bnMgYGxpbnQ6bWRgJ3MgYW5kIGBzcGVsbGNoZWNrYCdzIGNoZWNrcyBvdmVyIHRoZSBORVcgc2VjdGlvbiBvZiBhIGNvbXBvc2VkIGNoYW5nZWxvZywgYmVmb3JlIGFueSBvZiBpdFxuICogcmVhY2hlcyB0aGUgcmVwb3NpdG9yeS5cbiAqXG4gKiBPbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyBjaGVja2VkLCBhbmQgZGVsaWJlcmF0ZWx5IHNvLiBUaGUgaG9uZXN0IGNoZWNrIGlzIHRoZSB3aG9sZSBmaWxlLCBidXQgaXQgZmFpbHMgYVxuICogcmVsZWFzZSBvbiBhIGRlZmVjdCBpbiBhIHNlY3Rpb24gc29tZWJvZHkgc2hpcHBlZCB5ZWFycyBhZ28g4oCUIHdoaWNoIGlzIGEgcmVsZWFzZSBub2JvZHkgY2FuIGN1dCB3aXRob3V0XG4gKiBmaXJzdCBmaXhpbmcgaGlzdG9yeSwgYW5kIGlzIGV4YWN0bHkgaG93IGEgY2hhbmdlbG9nIGRlZmVjdCBiZWNvbWVzIGEgcGVybWFuZW50IGJsb2NrZXIgaW5zdGVhZCBvZiBhXG4gKiB0d28tbWludXRlIGZpeC4gVGhhdCBpcyBub3QgaHlwb3RoZXRpY2FsIGZvciB0aGUgc3BlbGxpbmcgaGFsZiBpbiBwYXJ0aWN1bGFyOiBpdCBpcyB0aGUgc3RhdGUgZml2ZVxuICogcmVwb3NpdG9yaWVzIGluIHRoaXMgd29ya3NwYWNlIGFyZSBpbiwgZWFjaCB3aXRoIGEgY29pbmVkIHdvcmQgYWxyZWFkeSBwdWJsaXNoZWQgaW4gYW4gb2xkIHNlY3Rpb24uIFRoZSBuZXdcbiAqIHNlY3Rpb24gaXMgdGhlIG9ubHkgcGFydCB0aGlzIHJlbGVhc2UgaXMgcmVzcG9uc2libGUgZm9yLlxuICpcbiAqIEJPVEggY2hlY2tzIHJ1biBvdmVyIGV2ZXJ5IHNldHRsZSwgYW5kIG5laXRoZXIgc2hvcnQtY2lyY3VpdHMgdGhlIG90aGVyLiBBbiBhdXRob3Igd2hvIGhhcyBhIGhhcmQtd3JhcHBlZFxuICogbGluZSBhbmQgYSBjb2luZWQgd29yZCBpcyB0b2xkIGFib3V0IGJvdGggYXQgb25jZSwgaW4gb25lIHJvdW5kIG9mIHRoZSByZXZpZXcsIHJhdGhlciB0aGFuIGZpeGluZyBvbmUgYW5kXG4gKiBiZWluZyBzZW50IGJhY2sgZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBFYWNoIGhhbGYgcnVucyBvbmx5IHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgdGhlIHNjcmlwdCBpdCBzdGFuZHMgZm9yLCBqdXN0IGFzIHtAbGluayBnYXRlfSBydW5zIHRoYXQgc2NyaXB0XG4gKiBvbmx5IHdoZXJlIGl0IGlzIGRlZmluZWQuIEEgcHJvamVjdCB3aXRoIG5vIGBzcGVsbGNoZWNrYCBoYXMgbm8gc3BlbGxpbmcgY29uZmlndXJhdGlvbiBlaXRoZXIsIHNvIGBjc3BlbGxgIHdvdWxkXG4gKiBqdWRnZSBpdHMgcmVsZWFzZSBub3RlcyBhZ2FpbnN0IHRoZSBzdG9jayBkaWN0aW9uYXJpZXMgYWxvbmUgYW5kIHJlZnVzZSB0aGUgcmVsZWFzZSBvdmVyIHRoZSBwbHVnaW4ncyBvd24gbmFtZTpcbiAqIGEgY2hlY2sgdGhlIHByb2plY3QgbmV2ZXIgYWRvcHRlZCwgZW5mb3JjZWQgb25seSBhdCByZWxlYXNlIHRpbWUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbmRpbmdzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3MoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPENoYW5nZWxvZ0ZpbmRpbmdbXT4ge1xuICBjb25zdCBjb250ZW50ID0gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSk7XG5cbiAgY29uc3QgbWFya2Rvd25saW50RmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhMSU5UX01EX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgbGludE1hcmtkb3duQ29udGVudCh7XG4gICAgICBjb250ZW50LFxuICAgICAgZmlsZVBhdGhcbiAgICB9KVxuICAgIDogW107XG4gIGNvbnN0IHNwZWxsaW5nRmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhTUEVMTENIRUNLX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgc3BlbGxjaGVja0NvbnRlbnQoe1xuICAgICAgY29udGVudCxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICA6IFtdO1xuXG4gIHJldHVybiBbXG4gICAgLi4ubWFya2Rvd25saW50RmluZGluZ3MubWFwKCh0ZXh0KSA9PiAoe1xuICAgICAgc2NyaXB0TmFtZTogTElOVF9NRF9TQ1JJUFRfTkFNRSxcbiAgICAgIHRleHRcbiAgICB9KSksXG4gICAgLi4uc3BlbGxpbmdGaW5kaW5ncy5tYXAoKHRleHQpID0+ICh7XG4gICAgICBzY3JpcHROYW1lOiBTUEVMTENIRUNLX1NDUklQVF9OQU1FLFxuICAgICAgdGV4dFxuICAgIH0pKVxuICBdO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZWxlYXNlIGFzc2V0czogdGhlIHByb2plY3QncyBgbnBtIHBhY2tgIHRhcmJhbGwsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2AuXG4gKlxuICogQHJldHVybnMgVGhlIGFzc2V0IHBhdGhzLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXROcG1QYWNrUmVsZWFzZUFzc2V0UGF0aHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXN1bHRPdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWyducG0nLCAncGFjaycsICctLXBhY2stZGVzdGluYXRpb24nLCBSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlTnBtUGFja091dHB1dChyZXN1bHRPdXRwdXQpO1xuICByZXR1cm4gW1xuICAgIGpvaW4oUmVwb1BhdGhzLkRpc3QsIHJlc3VsdC5maWxlbmFtZSksXG4gICAgam9pbihSZXBvUGF0aHMuRGlzdCwgUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgYnVtcCByZWFjaGVzIGEgZmxvb3IuXG4gKlxuICogU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gZ2l2ZW4gbnVtZXJpYyByYW5rcywgYmVjYXVzZSB0aHJlZSBsZXZlbHMgZG8gbm90IG5lZWQgYW4gb3JkZXJpbmcgc2NoZW1lIGFuZCBhXG4gKiBgMiA+PSAzYCBpbiBhIHJlbGVhc2UgZ2F0ZSBpcyBvbmUgdHJhbnNwb3NpdGlvbiBhd2F5IGZyb20gc2lsZW50bHkgcGFzc2luZyBldmVyeXRoaW5nLiBgZmxvb3JMZXZlbGAgZXhjbHVkZXNcbiAqIHtAbGluayBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaH0gZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyBub3QgdGVzdGVkIGZvcjogYSBwYXRjaCBmbG9vciBpcyBubyBmbG9vciwgYW5kIGl0c1xuICogb25seSBjYWxsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlbiDigJQgYSBicmFuY2ggdGhhdCBjYW4gb25seSBldmVyIGFuc3dlciBgdHJ1ZWAgaXMgb25lIG5vYm9keSByZWFkcyBhbmRcbiAqIG5vdGhpbmcgY292ZXJzLlxuICpcbiAqIEBwYXJhbSBsZXZlbCAtIFRoZSB7QGxpbmsgQnVtcExldmVsfSBhY3R1YWxseSB0YWtlbi5cbiAqIEBwYXJhbSBmbG9vckxldmVsIC0gVGhlIHtAbGluayBCdW1wTGV2ZWx9IHJlcXVpcmVkLlxuICogQHJldHVybnMgV2hldGhlciBgbGV2ZWxgIGlzIGF0IGxlYXN0IGBmbG9vckxldmVsYC5cbiAqL1xuZnVuY3Rpb24gaXNCdW1wTGV2ZWxBdExlYXN0KGxldmVsOiBCdW1wTGV2ZWwsIGZsb29yTGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZsb29yTGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yXG4gICAgPyBsZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3JcbiAgICA6IGxldmVsICE9PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2luZ2xlIHBhY2sgcmVzdWx0IGZyb20gdGhlIG91dHB1dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgdGhpcyBtb3JlIHRoYW4gYSBgSlNPTi5wYXJzZSgpYC4gVGhlIHBheWxvYWQgaXMgUFJFQ0VERUQgb24gc3Rkb3V0IGJ5IHdoYXRldmVyIHRoZVxuICogYHByZXBhcmVgIHNjcmlwdCBwcmludGVkICh0aGUgYG5wbSBub3RpY2VgIGxpbmVzIGdvIHRvIHN0ZGVyciwgbm90IGhlcmUpLCBzbyBpdHMgc3RhcnQgaGFzIHRvIGJlIGZvdW5kIOKAlFxuICogYW5kIGl0IGlzIGZvdW5kIGJ5IHBhcnNpbmcgZnJvbSBlYWNoIGNhbmRpZGF0ZSBzdGFydCByYXRoZXIgdGhhbiBieSBtYXRjaGluZyBhIGxpdGVyYWwsIGJlY2F1c2UgdGhlXG4gKiBwcmVmaXggbWF5IGl0c2VsZiBjb250YWluIGEgYnJhY2UuIEFuZCB0aGUgcGF5bG9hZCdzIFNIQVBFIGRlcGVuZHMgb24gdGhlIG5wbSBtYWpvcjogbnBtIDExIGFuZCBlYXJsaWVyXG4gKiBlbWl0IGFuIGFycmF5IG9mIHBhY2sgcmVzdWx0cywgbnBtIDEyIGVtaXRzIGFuIG9iamVjdCBrZXllZCBieSBwYWNrYWdlIG5hbWUuIEJvdGggYXJlIGFjY2VwdGVkOyBzY2FubmluZ1xuICogZm9yIHRoZSBhcnJheSdzIGxpdGVyYWwgb3BlbmluZyBpcyB3aGF0IGJyb2tlIGV2ZXJ5IHJlbGVhc2Ugb24gbnBtIDEyLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgc3Rkb3V0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICogQHJldHVybnMgVGhlIHtAbGluayBOcG1QYWNrUmVzdWx0fSBkZXNjcmliaW5nIHRoZSBwYWNrZWQgdGFyYmFsbC5cbiAqIEB0aHJvd3MgSWYgdGhlIG91dHB1dCBob2xkcyBubyBwYXJzYWJsZSBKU09OIHBheWxvYWQsIG9yIHRoZSBwYXlsb2FkIGhvbGRzIG5vIHBhY2sgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZU5wbVBhY2tPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBOcG1QYWNrUmVzdWx0IHtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwoL1tbe10vZykpIHtcbiAgICBsZXQgcGF5bG9hZDogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShvdXRwdXQuc2xpY2UobWF0Y2guaW5kZXgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCBhcyBOcG1QYWNrUmVzdWx0W10gOiBPYmplY3QudmFsdWVzKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgTnBtUGFja1Jlc3VsdD4pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbMF07XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwYWNrIHJlc3VsdCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIEpTT04gcGF5bG9hZCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIGZ1bGwgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQg4oCUIGluY2x1ZGluZyB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCB3aGVuIG9uZSBpcyBkdWUg4oCUXG4gKiBXSVRIT1VUIHRvdWNoaW5nIHRoZSByZXBvc2l0b3J5LiBOb3RoaW5nIGhlcmUgd3JpdGVzIGludG8gdGhlIHJlcG8sIHNvIGFuIGludGVycnVwdCBhbnl3aGVyZSBpbiB0aGVcbiAqIHJldmlldyB3aW5kb3cgKHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc3BsaXQpIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGV4YWN0bHkgYXMgaXQgd2FzLlxuICpcbiAqIFRoZSBzZXR0bGVkIGNvbnRlbnQgaXMgaGFuZGVkIHRvIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGJlZm9yZSBpdCBpcyByZXR1cm5lZCwgd2hpY2ggaXNcbiAqIGhvdyB0aGF0IGd1YXJkIHJlYWNoZXMgZXZlcnkgY2FsbGVyIGFuZCBldmVyeSBwYXRoIOKAlCByZXZpZXdlZCBvciBub3QsIGNvbW1pdC1kZXJpdmVkIG9yIHByZXBhcmVkIOKAlCBmcm9tIGFcbiAqIHNpbmdsZSBzaXRlLlxuICpcbiAqIEl0IGlzIGFsc28gd2hlcmUgdGhlIG5ldyBzZWN0aW9uIGlzIExJTlRFRCBhbmQgU1BFTExDSEVDS0VELCBmb3IgdGhlIHNhbWUgcmVhc29uIGFuZCBvbmUgdGhlIHJlbGVhc2Unc1xuICogb3JkZXJpbmcgZm9yY2VzOiB0aGUgcmVsZWFzZSdzIG9ubHkgYGxpbnQ6bWRgIGFuZCBgc3BlbGxjaGVja2AgcnVuIGluIHRoZSBnYXRlLCB3aGljaCBpcyBvdmVyIGJlZm9yZSB0aGlzXG4gKiB0ZXh0IGV4aXN0cywgc28gZXZlcnkgY2hhcmFjdGVyIG9mIGEgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIHVzZWQgdG8gZW50ZXIgdGhlIHJlcG9zaXRvcnkgYWZ0ZXIgdGhlIG9ubHlcbiAqIGNoZWNrcyB0aGF0IGNvdWxkIGhhdmUgbG9va2VkIGF0IGl0LiBUaGUgZ2VuZXJhdG9yJ3Mgb3duIGJ1bGxldHMgY2Fubm90IGZhaWwgdGhlbSDigJQgdGhleSBhcmUgb25lXG4gKiBgdG9GaXJzdExpbmVgIHBlciBjb21taXQg4oCUIGJ1dCB0aGUgdHdvIHBhdGhzIGEgaHVtYW4gb3IgYW4gYWdlbnQgd3JpdGVzLCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGFuZFxuICogYC0tY2hhbmdlbG9nLWZpbGVgLCBhcmUgZXhhY3RseSB0aGUgcGF0aHMgdGhhdCBjYXJyeSBwcm9zZS4gQSBkZWZlY3QgdGhlcmUgZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZTogaXRcbiAqIGxhbmRzIG9uIHRoZSBkZWZhdWx0IGJyYW5jaCBpbnNpZGUgdGhlIGBjaG9yZTogcmVsZWFzZWAgY29tbWl0LCBhbmQgdHVybnMgdGhlIE5FWFQgZ2F0ZSByZWQsIG9uIGEgYnJhbmNoXG4gKiBiZWxvbmdpbmcgdG8gc29tZWJvZHkgd2hvIGRpZCBub3Qgd3JpdGUgaXQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB3aGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gYXdhaXQgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXMoKTtcblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKTtcbiAgICBjb25zdCBjb21taXRSYW5nZSA9IGxhc3RUYWcgPyBgJHtsYXN0VGFnfS4uSEVBRGAgOiAnSEVBRCc7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHJpbmcgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXMgPSBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9DaGFuZ2Vsb2dFbnRyeShjb21taXRNZXNzYWdlKSk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgLSAke2F1dG9saW5rQmFyZVVybHMobWVzc2FnZSl9XFxuYDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJlcGFyZWROb3RlcyA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7cmVwbGFjZUFsbCh7ICRzdHJpbmc6IHByZXBhcmVkTm90ZXMsIHJlcGxhY2VyOiAnXFxuJywgc2VhcmNoVmFsdWU6ICdcXHJcXG4nIH0pLnRyaW0oKX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVwYXJlZCBub3RlcyBhcmUgYWxyZWFkeSB0aGUgcmV2aWV3ZWQgdGV4dCwgc28gdGhleSBuZXZlciBvcGVuIGFuIGVkaXRvciwgd2hhdGV2ZXIgYHNob3VsZEVkaXRDaGFuZ2Vsb2dgIHNheXMuXG4gIGNvbnN0IGlzUmV2aWV3RHVlID0gY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCAmJiBzaG91bGRFZGl0Q2hhbmdlbG9nO1xuICBsZXQgc2V0dGxlZENoYW5nZUxvZyA9IG5ld0NoYW5nZUxvZztcbiAgbGV0IGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10gPSBbXTtcblxuICAvLyBUaGUgY2hlY2tzIHJ1biBvbiB0aGUgU0VUVExFRCB0ZXh0LCBzbyB0aGUgcmV2aWV3IHNpdHMgaW5zaWRlIHRoZSBsb29wIHJhdGhlciB0aGFuIGJlZm9yZSBpdDogdGhlIGF1dGhvciBpc1xuICAvLyBzdGlsbCBzaXR0aW5nIGF0IHRoZSBlZGl0b3IsIHNvIHRoZXkgYXJlIGhhbmRlZCB0aGUgZmluZGluZ3MgYW5kIHRoZSBzYW1lIHNjcmF0Y2ggY29weSBiYWNrLiBBIHJldmlldyB0aGF0XG4gIC8vIHJldHVybnMgYnl0ZS1pZGVudGljYWwgdGV4dCBpcyB0aGUgYXV0aG9yIGRlY2xpbmluZyB0byBmaXggdGhlbSwgd2hpY2ggZW5kcyB0aGUgbG9vcCBpbnN0ZWFkIG9mIHJlb3BlbmluZ1xuICAvLyBmb3IgZXZlci4gVGhlcmUgaXMgbm9ib2R5IHRvIGhhbmQgYSBmaW5kaW5nIHRvIG9uIHRoZSBvdGhlciBwYXRocywgc28gdGhvc2UgdGhyb3cgb24gdGhlIGZpcnN0IG9uZS5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpc1Jldmlld0R1ZSkge1xuICAgICAgY29uc3QgcmV2aWV3ZWRDaGFuZ2VMb2cgPSBhd2FpdCByZXZpZXdDaGFuZ2Vsb2coc2V0dGxlZENoYW5nZUxvZywgZmluZGluZ3MpO1xuICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDAgJiYgcmV2aWV3ZWRDaGFuZ2VMb2cgPT09IHNldHRsZWRDaGFuZ2VMb2cpIHtcbiAgICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGxlZENoYW5nZUxvZyA9IHJldmlld2VkQ2hhbmdlTG9nO1xuICAgIH1cblxuICAgIGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKHNldHRsZWRDaGFuZ2VMb2csIG5ld1ZlcnNpb24pO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICghaXNSZXZpZXdEdWUpIHtcbiAgICAgIHRocm93IHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5ncywgbmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGxhc3QgdGhpbmcgdGhlIGNvbXBvc2l0aW9uIGRvZXMsIGFuZCB0aGF0IHBsYWNlbWVudCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoaXMgT05FIHNpdGUgc2VlcyB0aGVcbiAgLy8gY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgdGhlIHByZXBhcmVkIG5vdGVzIGFuZCB3aGF0ZXZlciBhIHJldmlldyBsZWZ0IGJlaGluZCwgc28gdGhlIGd1YXJkIHJ1bnMgd2hldGhlciBvciBub3RcbiAgLy8gdGhlIGludGVyYWN0aXZlIHJldmlldyBkb2VzIOKAlCBhbmQgdGhlIHJldmlldyBpcyBwcmVjaXNlbHkgd2hhdCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Agc2tpcHMuIE5vdGhpbmcgaGFzIGJlZW5cbiAgLy8gd3JpdHRlbiB0byB0aGUgcmVwb3NpdG9yeSB5ZXQgZWl0aGVyLCBzbyB0aGUgdGhyb3cgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIHJldHVybiBzZXR0bGVkQ2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIGBDSEFOR0VMT0cubWRgIGFuZCByZXR1cm5zIGV2ZXJ5dGhpbmcgYmVsb3cgaXRzIGAjIENIQU5HRUxPR2AgaGVhZGVyIOKAlCBzbyB0aGUgZmlyc3QgbGluZSBpcyB0aGVcbiAqIG5ld2VzdCBgIyMgPHZlcnNpb24+YCBoZWFkaW5nLCB3aGljaCBpcyB3aGF0IG5hbWVzIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGluZXMsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHJlcG9zaXRvcnkgaGFzIG5vIGNoYW5nZWxvZ1xuICogeWV0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIG9mIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24g4oCUIHRoZSBiYXNlbGluZSBib3RoIHRoZSBjaGFuZ2Vsb2cgcmFuZ2UgYW5kIHRoZSBidW1wIGZsb29yIGFyZVxuICogbWVhc3VyZWQgZnJvbSwgZGVyaXZlZCBvbmNlIGhlcmUgc28gdGhvc2UgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGljaCBjb21taXRzIGFyZSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQSBoZWFkaW5nIGlzIG5vdCBhIHRhZy4gQSBoYW5kLXdyaXR0ZW4gYCMjIDAuMC4wYCBwbGFjZWhvbGRlciBpbiBhIG5ldmVyLXRhZ2dlZCByZXBvLCBvciBhIHRhZyBkZWxldGVkIGFmdGVyXG4gKiB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIOKAlCBhbmQgaXQgdXNlZCB0byByZWFjaCBpdCBhdCB0aGVcbiAqIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhZCBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gbm8gYmFzZWxpbmVcbiAqIG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIGNoYW5nZWxvZyByZXZpZXcgaXMgZXhhY3RseSB3aGVyZSBhblxuICogb3Zlci1pbmNsdWRlZCByYW5nZSBnZXRzIHRyaW1tZWQsIGFuZCB0aGUgYnVtcCBmbG9vciBkZWNsaW5lcyB0byBkZXJpdmUgYW55dGhpbmcgYXQgYWxsIHdpdGhvdXQgYSBiYXNlbGluZS5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyAtIFRoZSBsaW5lcyB7QGxpbmsgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXN9IHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFnIG5hbWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gcmVzb2x2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgfSk7XG5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMYXN0VGFnID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuXG4gIGlmICghcmVzb2x2ZWRMYXN0VGFnKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gc3RhcnRzIGF0ICcjIyAke2xhc3RUYWd9JywgYnV0IG5vIHN1Y2ggdGFnIGV4aXN0cy4gR2VuZXJhdGluZyB0aGUgY2hhbmdlbG9nIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBpbnN0ZWFkLmBcbiAgICApO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBsYXN0VGFnO1xufVxuXG4vKipcbiAqIEhhbmRzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgdG8gdGhlIHVzZXIgZm9yIHJldmlldyBvbiBhIHNjcmF0Y2ggY29weSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBhbmRcbiAqIHJldHVybnMgd2hhdGV2ZXIgdGhleSBsZWZ0IGJlaGluZC4gVGhlIHNjcmF0Y2ggZm9sZGVyIGlzIHJlbW92ZWQgZXZlbiB3aGVuIHRoZSByZXZpZXcgZmFpbHMuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIGhhbmQgb3ZlciBmb3IgcmV2aWV3LlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRoZSBwcmV2aW91cyByb3VuZCBvZiB0aGlzIHJldmlldyBsZWZ0IHVuZml4ZWQsIHByaW50ZWQgYWJvdmUgdGhlIHByb21wdCBzb1xuICogdGhlIGF1dGhvciBzZWVzIHdoYXQgaGFzIHRvIGNoYW5nZS4gRW1wdHkgb24gdGhlIGZpcnN0IHJvdW5kLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV2aWV3ZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV2aWV3Q2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nLCBmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NyYXRjaEZvbGRlciA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgJ2NoYW5nZWxvZy0nKSk7XG4gIGNvbnN0IHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoID0gam9pbihzY3JhdGNoRm9sZGVyLCBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY29kZVZlcnNpb24gPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2NvZGUgLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgICBpZiAoZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKFxuICAgICAgICBgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGRvZXMgbm90IHBhc3MgJHt0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzKX0geWV0OlxcbiR7dG9GaW5kaW5nTGluZXMoZmluZGluZ3MpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvZGVWZXJzaW9uKSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoYFBsZWFzZSB1cGRhdGUgdGhlICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBDbG9zZSBWaXN1YWwgU3R1ZGlvIENvZGUgd2hlbiB5b3UgYXJlIGRvbmUuLi5gKTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2NvZGUnLCAnLXcnLCBzY3JhdGNoQ2hhbmdlbG9nUGF0aF0sIHtcbiAgICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoJ0NvdWxkIG5vdCBmaW5kIFZpc3VhbCBTdHVkaW8gQ29kZSBpbiB5b3VyIFBBVEguIFVzaW5nIGNvbnNvbGUgbW9kZSBpbnN0ZWFkLicpO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbihcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgdGhlICR7c2NyYXRjaENoYW5nZWxvZ1BhdGh9IGZpbGUuIFByZXNzIEVudGVyIHdoZW4geW91IGFyZSBkb25lLi4uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVhZEZpbGUoc2NyYXRjaENoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2hGb2xkZXIsIHtcbiAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIHRoYXQgcmVmdXNlcyBhIGJ1bXAgbG93ZXIgdGhhbiB0aGUgcmFuZ2UgZm9yY2VzLlxuICpcbiAqIEl0IG5hbWVzIGV2ZXJ5IGZvcmNpbmcgY29tbWl0IHdpdGggaXRzIHNob3J0IGhhc2gsIGl0cyBzdWJqZWN0IGFuZCBXSElDSCBtYXJrZXIgZm9yY2VkIGl0LCBiZWNhdXNlIHRoZVxuICogcmVtZWR5IGRlcGVuZHMgb24gdGhhdDogYSBgZmVhdCFgIGlzIGEgZGVsaWJlcmF0ZSBicmVhayBzb21lYm9keSB0eXBlZCwgd2hpbGUgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyXG4gKiBzaXRzIGluIGEgYm9keSBub2JvZHkgcmUtcmVhZHMgYW5kIGlzIGV4YWN0bHkgdGhlIHRoaW5nIHRoaXMgZ2F0ZSBleGlzdHMgdG8gc3VyZmFjZS4gVGhlIGluc3RydWN0aW9uIGlzIHRvXG4gKiB0YWtlIHRoZSBoaWdoZXIgYnVtcCwgbm90IHRvIGVkaXQgdGhlIGNvbW1pdHMg4oCUIGhpc3RvcnkgdGhhdCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRlZmF1bHQgYnJhbmNoIGlzIHdoYXQgYVxuICogcmVsZWFzZSBwdWJsaXNoZXMsIGFuZCByZXdyaXRpbmcgaXQgdG8gZG9kZ2UgYSB2ZXJzaW9uIHNpZ25hbCBpcyB0aGUgZGVmZWN0IG9uZSBsZXZlbCB1cC5cbiAqXG4gKiBAcGFyYW0gYnVtcEZsb29yIC0gVGhlIGRlcml2ZWQge0BsaW5rIEJ1bXBGbG9vcn0uXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSB7QGxpbmsgQnVtcEZsb29yUmVmdXNhbENvbnRleHR9IGRlc2NyaWJpbmcgd2hhdCB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgVGhlIGVycm9yIHRvIHRocm93LlxuICovXG5mdW5jdGlvbiB0b0J1bXBGbG9vckVycm9yKGJ1bXBGbG9vcjogQnVtcEZsb29yLCBjb250ZXh0OiBCdW1wRmxvb3JSZWZ1c2FsQ29udGV4dCk6IEVycm9yIHtcbiAgY29uc3QgZm9yY2luZ0xpbmVzID0gYnVtcEZsb29yLmZvcmNpbmdDb21taXRzXG4gICAgLm1hcCgoZm9yY2luZ0NvbW1pdCkgPT4gYCAgJHtmb3JjaW5nQ29tbWl0LnNoYS5zbGljZSgwLCBTSE9SVF9TSEFfTEVOR1RIKX0gICR7Zm9yY2luZ0NvbW1pdC5zdWJqZWN0fSAgKCR7Zm9yY2luZ0NvbW1pdC5tYXJrZXJ9KWApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYFRoZSBjb21taXRzIHNpbmNlICR7Y29udGV4dC5sYXN0VGFnfSBmb3JjZSBhdCBsZWFzdCBhICR7YnVtcEZsb29yLmxldmVsfSByZWxlYXNlLCBidXQgJyR7Y29udGV4dC52ZXJzaW9uVXBkYXRlVHlwZX0nIHdvdWxkIHB1Ymxpc2hgXG4gICAgICArIGAgJHtjb250ZXh0Lm5ld1ZlcnNpb259LCB3aGljaCBpcyBhICR7Y29udGV4dC50YWtlbkxldmVsfS5cXG5gXG4gICAgICArIGAke2ZvcmNpbmdMaW5lc31cXG5gXG4gICAgICArICdBIHJlbGVhc2UgcHVibGlzaGVzIGV2ZXJ5IGNvbW1pdCBzaW5jZSB0aGUgbGFzdCB0YWcsIG5vdCB0aGUgY2hhbmdlIHlvdSBoYXBwZW4gdG8gYmUgd29ya2luZyBvbiwgc28gdGhlJ1xuICAgICAgKyAnIGJ1bXAgaGFzIHRvIGFuc3dlciBmb3IgYWxsIG9mIHRoZW0uIFJlLXJ1biB0aGUgcmVsZWFzZSB3aXRoIGEnXG4gICAgICArIGAgJHtidW1wRmxvb3IubGV2ZWx9IGJ1bXAg4oCUIGEgaGlnaGVyIG9uZSBpcyBhbHdheXMgYWNjZXB0ZWQsIGFuZCBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBUdXJucyBvbmUgZnVsbCBjb21taXQgbWVzc2FnZSAoYGdpdCBsb2cgLS1mb3JtYXQ9JUJgKSBpbnRvIHRoZSBjaGFuZ2Vsb2cgbGluZSBpdCBzaG91bGQgY29udHJpYnV0ZS5cbiAqXG4gKiBOb3JtYWxseSB0aGF0IGlzIHRoZSBzdWJqZWN0LiBUaGUgZXhjZXB0aW9uIGlzIGEgbWVyZ2Ugd2hvc2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOiBmb3IgYSBub24tZmYgbWVyZ2VcbiAqIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IElTIHRoZSBtZXJnZSBjb21taXQsIHNvIGl0cyBzdWJqZWN0IGlzIHdoYXQgc2hpcHMsIGFuZCBhIGRlZmF1bHQgb25lIHB1Ymxpc2hlcyBhXG4gKiBwcml2YXRlIGJyYW5jaCBuYW1lIGFzIGEgY2hhbmdlbG9nIGVudHJ5LiBUaGUgbWVzc2FnZSB0aGUgYXV0aG9yIGFjdHVhbGx5IHdyb3RlIGlzIHVzdWFsbHkgc3RpbGwgdGhlcmUg4oCUXG4gKiBvbmUgbGluZSBiZWxvdywgYXMgdGhlIG1lcmdlIGJvZHkg4oCUIHNvIGl0IGlzIGxpZnRlZCBvdXQgcmF0aGVyIHRoYW4gZGlzY2FyZGVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBlZGl0IGFcbiAqIGh1bWFuIG1ha2VzIGJ5IGhhbmQgYXQgdGhlIHJldmlldyBzdGVwLiBBIG1lcmdlIHdpdGggbm8gYm9keSBoYXMgbm90aGluZyB0byBsaWZ0IGFuZCBrZWVwcyBpdHMgc3ViamVjdDtcbiAqIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGlzIHdoYXQgc3RvcHMgdGhhdCBvbmUgZnJvbSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIGNvbW1pdE1lc3NhZ2UgLSBUaGUgZnVsbCBjb21taXQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIFRoZSBjaGFuZ2Vsb2cgbGluZSBmb3IgdGhhdCBjb21taXQuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nRW50cnkoY29tbWl0TWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjb21taXRNZXNzYWdlLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzdWJqZWN0ID0gbGluZXNbMF0gPz8gJyc7XG4gIHJldHVybiBNRVJHRV9TVUJKRUNUX1JFR19FWFAudGVzdChzdWJqZWN0KSA/IGxpbmVzWzFdID8/IHN1YmplY3QgOiBzdWJqZWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXJyb3IgdGhhdCBzdG9wcyBhIHJlbGVhc2Ugd2hvc2UgbmV3IGNoYW5nZWxvZyBzZWN0aW9uIGRvZXMgbm90IHBhc3MgYGxpbnQ6bWRgIG9yIGBzcGVsbGNoZWNrYC5cbiAqXG4gKiBJdCBpcyB0aHJvd24gZnJvbSB0aGUgY29tcG9zaXRpb24gc3RlcCwgd2hpY2ggaXMgQkVGT1JFIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIHRoZSByZWNvdmVyeSBpdCBkZXNjcmliZXMgaXNcbiAqIHRoZSB3aG9sZSByZWNvdmVyeTogdGhlcmUgaXMgbm90aGluZyB0byByZXZlcnQsIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5zIGZyb20gdGhlIHRvcC5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MsIGFzIHtAbGluayBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3N9IGNvbGxlY3RlZCB0aGVtLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIHdhcyBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUgZXJyb3IgdG8gdGhyb3cuXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdLCB2ZXJzaW9uOiBzdHJpbmcpOiBFcnJvciB7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gdG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5ncyk7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGRvZXMgbm90IHBhc3MgJHtzY3JpcHROYW1lc306XFxuYFxuICAgICAgKyBgJHt0b0ZpbmRpbmdMaW5lcyhmaW5kaW5ncyl9XFxuYFxuICAgICAgKyAnVGhlIGNoYW5nZWxvZyBpcyBzZXR0bGVkIGJlZm9yZSBpdCBpcyB3cml0dGVuLCBzbyB0aGlzIHN0b3BzIHRoZSByZWxlYXNlIHdpdGggdGhlIHJlcG9zaXRvcnkgdW50b3VjaGVkJ1xuICAgICAgKyAnIGFuZCBub3RoaW5nIHRvIHJldmVydC4gVGhlIGxpbmUgbnVtYmVycyBhcmUgdGhlIG9uZXMgdGhlIHdyaXR0ZW4gZmlsZSB3b3VsZCBoYXZlIGhhZC4gRml4IHRoZSByZWxlYXNlJ1xuICAgICAgKyAnIG5vdGVzIOKAlCBpbiB0aGUgcHJlcGFyZWQgbm90ZXMgZmlsZSwgb3IgaW4gdGhlIGNvbW1pdCBtZXNzYWdlcyB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20g4oCUIG9yLCBmb3IgYSB3b3JkJ1xuICAgICAgKyAnIHRoaXMgcHJvamVjdCByZWFsbHkgZG9lcyB1c2UsIGFkZCBpdCB0byB0aGUgcHJvamVjdFxcJ3MgYGNzcGVsbGAgY29uZmlndXJhdGlvbiwgYW5kIHJlLXJ1biB0aGUgcmVsZWFzZS4nXG4gICAgICArICcgUmVsZWFzaW5nIGFueXdheSB3b3VsZCBsYW5kIHRoZSBkZWZlY3Qgb24gdGhlIGRlZmF1bHQgYnJhbmNoIGluc2lkZSB0aGUgcmVsZWFzZSBjb21taXQsIHdoZXJlIHRoZSBuZXh0J1xuICAgICAgKyBgICR7c2NyaXB0TmFtZXN9IG9uIGFueW9uZSdzIGJyYW5jaCByZXBvcnRzIGl0LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBvbmUgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uIGluIHRoZSBtaW5pbWFsIGRvY3VtZW50IHRoZSBjaGVja3MgYXJlIGhhbmRlZC5cbiAqXG4gKiBUaGUgc2VjdGlvbiBnb2VzIGluc2lkZSBhIGRvY3VtZW50IHJhdGhlciB0aGFuIG9uIGl0cyBvd24sIHNvIHRoZSBoZWFkaW5nIGFuZCBsaXN0IHJ1bGVzIHNlZSB0aGVcbiAqIGNvbnRleHQgdGhleSBuZWVkIChhIGRvY3VtZW50IHdob3NlIGZpcnN0IGxpbmUgaXMgYSBsaXN0IGl0ZW0gaXMgYSBkaWZmZXJlbnQgZG9jdW1lbnQpLiBUaGUgbGluZSBudW1iZXJzIGFcbiAqIGZpbmRpbmcgcmVwb3J0cyBhcmUgdGhlbiB0aGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAncyBvd24sIHdoaWNoIGlzIG5vdCBhIGNvaW5jaWRlbmNlIGFuZCBpcyB3b3J0aCBrZWVwaW5nOlxuICogYSBzZWN0aW9uIGlzIFBSRVBFTkRFRCwgc28gdGhpcyBkb2N1bWVudCBpcyBjaGFyYWN0ZXItZm9yLWNoYXJhY3RlciB0aGUgaGVhZCBvZiB0aGUgZmlsZSBhYm91dCB0byBiZSB3cml0dGVuLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUgbWluaW1hbCBkb2N1bWVudCB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoZWFkaW5nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHt2ZXJzaW9ufWA7XG4gIGNvbnN0IHNlY3Rpb24gPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKTtcbiAgLy8gQW4gZW1wdHkgc2VjdGlvbiBpcyBhIHJlYWwgc2hhcGUg4oCUIGEgcmVsZWFzZSB3aXRoIG5vIGNvbW1pdHMgdG8gZGVzY3JpYmUsIG9yIHByZXBhcmVkIG5vdGVzIHRoYXQgYXJlIGFuXG4gIC8vIGVtcHR5IGZpbGUg4oCUIGFuZCBhcHBlbmRpbmcgYSBibGFuayBib2R5IHRvIHRoZSBoZWFkaW5nIHdvdWxkIHJlcG9ydCBhIGRlZmVjdCB0aGlzIHJlbGVhc2UgZGlkIG5vdCBjb21taXQuXG4gIHJldHVybiBzZWN0aW9uID09PSAnJyA/IGAke2hlYWRpbmd9XFxuYCA6IGAke2hlYWRpbmd9XFxuXFxuJHtzZWN0aW9ufVxcbmA7XG59XG5cbi8qKlxuICogUmVhZHMgb2ZmIHdoaWNoIHJlbGVhc2UgbGluZSBhIHZlcnNpb24gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZSBpdCBpcyBiZWluZyBjdXQgZnJvbS5cbiAqXG4gKiBUaGlzIGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSByZXF1ZXN0ZWQgdHlwZSBvbiBwdXJwb3NlLCBiZWNhdXNlIHRoZSB0eXBlIGRvZXMgbm90IGFsd2F5cyBzYXkuXG4gKiBgcHJlcmVsZWFzZWAgYWR2YW5jZXMgd2hpY2hldmVyIGxpbmUgYW4gZWFybGllciBgcHJlbWFqb3JgIG9yIGBwcmVtaW5vcmAgYWxyZWFkeSBjaG9zZSwgYW5kIGFuIGV4cGxpY2l0XG4gKiBgeC55LnpgIHNheXMgbm90aGluZyBhdCBhbGwgdW50aWwgaXQgaXMgY29tcGFyZWQuIFRha2luZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHJlc3VsdGluZyB2ZXJzaW9uIGFuc3dlcnMgYWxsXG4gKiBvZiB0aGVtIHdpdGggb25lIHJ1bGUg4oCUIGFuZCBpdCBhbnN3ZXJzIHRoZW0gdGhlIHdheSBhIGNvbnN1bWVyJ3MgY2FyZXQgcmFuZ2Ugc2VlcyBpdCwgd2hpY2ggaXMgdGhlIG9ubHlcbiAqIHJlYWRpbmcgdGhhdCBtYXR0ZXJzIGZvciBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICpcbiAqIEBwYXJhbSBiYXNlVmVyc2lvbiAtIFRoZSBwcmV2aW91cyByZWxlYXNlZCB2ZXJzaW9uLlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEJ1bXBMZXZlbH0sIG9yIGBudWxsYCB3aGVuIGVpdGhlciB2ZXJzaW9uIGlzIG5vdCBwYXJzYWJsZSBhcyBzZW12ZXIuXG4gKi9cbmZ1bmN0aW9uIHRvRWZmZWN0aXZlQnVtcExldmVsKGJhc2VWZXJzaW9uOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZyk6IEJ1bXBMZXZlbCB8IG51bGwge1xuICBjb25zdCBiYXNlID0gcGFyc2UoYmFzZVZlcnNpb24pO1xuICBjb25zdCBuZXh0ID0gcGFyc2UobmV3VmVyc2lvbik7XG4gIGlmICghYmFzZSB8fCAhbmV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5leHQubWFqb3IgPiBiYXNlLm1ham9yKSB7XG4gICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yO1xuICB9XG5cbiAgcmV0dXJuIG5leHQubWlub3IgPiBiYXNlLm1pbm9yID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgbnBtIHNjcmlwdHMgdGhhdCBhY3R1YWxseSByZXBvcnRlZCBzb21ldGhpbmcsIGluIHRoZSBvcmRlciB0aGV5IHJhbi5cbiAqXG4gKiBOYW1pbmcgYm90aCB1bmNvbmRpdGlvbmFsbHkgd291bGQgYmUgdGhlIGVhc3kgdmVyc2lvbiBhbmQgd291bGQgYmUgYSBsaWUgaGFsZiB0aGUgdGltZTogYSByZWxlYXNlIHN0b3BwZWQgYnlcbiAqIGEgY29pbmVkIHdvcmQgd291bGQgdGVsbCBpdHMgYXV0aG9yIHRvIGdvIGFuZCBsb29rIGF0IGBsaW50Om1kYCwgd2hpY2ggcGFzc2VkLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBuYW1lIHRoZSBzY3JpcHRzIG9mLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBuYW1lcywgam9pbmVkIGZvciBwcm9zZSDigJQgYGxpbnQ6bWRgLCBgc3BlbGxjaGVja2AsIG9yIGBsaW50Om1kIGFuZCBzcGVsbGNoZWNrYC5cbiAqL1xuZnVuY3Rpb24gdG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBbTElOVF9NRF9TQ1JJUFRfTkFNRSwgU1BFTExDSEVDS19TQ1JJUFRfTkFNRV0uZmlsdGVyKChzY3JpcHROYW1lKSA9PiBmaW5kaW5ncy5zb21lKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNjcmlwdE5hbWUgPT09IHNjcmlwdE5hbWUpKTtcbiAgcmV0dXJuIHNjcmlwdE5hbWVzLmpvaW4oJyBhbmQgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgZmluZGluZ3MgZm9yIGEgbWVzc2FnZSwgZWFjaCBsaW5lIHRhZ2dlZCB3aXRoIHRoZSBzY3JpcHQgdGhhdCByZXBvcnRlZCBpdC5cbiAqXG4gKiBUaGUgdGFnIGlzIG5vdCBkZWNvcmF0aW9uOiB0aGUgdHdvIHRvb2xzJyBvdXRwdXQgc2hhcGVzIGFyZSBzaW1pbGFyIGVub3VnaCB0byBiZSBtaXN0YWtlbiBmb3IgZWFjaCBvdGhlcixcbiAqIGFuZCB0aGUgZml4IGZvciBvbmUgaXMgbm90IHRoZSBmaXggZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdG8gcmVuZGVyLlxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIGxpbmVzLCBvbmUgZmluZGluZyBwZXIgbGluZS5cbiAqL1xuZnVuY3Rpb24gdG9GaW5kaW5nTGluZXMoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBmaW5kaW5ncy5tYXAoKGZpbmRpbmcpID0+IGBbJHtmaW5kaW5nLnNjcmlwdE5hbWV9XSAke2ZpbmRpbmcudGV4dH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmaWVzIG9uZSBgZ2l0IGxvZyAtLWZvcm1hdD0lSCVuJUIgLXpgIHJlY29yZCBpbnRvIHRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0gaXQgaXMsIG9yIGBudWxsYCB3aGVuIGl0XG4gKiBmb3JjZXMgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gcmVjb3JkIC0gT25lIE5VTC1kZWxpbWl0ZWQgcmVjb3JkOiB0aGUgZnVsbCBoYXNoIG9uIHRoZSBmaXJzdCBsaW5lLCB0aGUgZnVsbCBjb21taXQgbWVzc2FnZSBiZWxvdyBpdC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0sIG9yIGBudWxsYCBmb3IgYSByZWNvcmQgdGhhdCBjb25zdHJhaW5zIG5vdGhpbmcgb3IgaXMgbm90IGEgcmVjb3JkIGF0IGFsbFxuICogKHRoZSB0cmFpbGluZyBlbXB0eSBzdHJpbmcgYC16YCBvdXRwdXQgZW5kcyB3aXRoLCBhbW9uZyBvdGhlcnMpLlxuICovXG5mdW5jdGlvbiB0b0ZvcmNpbmdDb21taXQocmVjb3JkOiBzdHJpbmcpOiBGb3JjaW5nQ29tbWl0IHwgbnVsbCB7XG4gIC8vIFRoZSB0cmFpbGluZyBlbXB0eSByZWNvcmQgYC16YCBsZWF2ZXMgaGFzIG5vIGhhc2gsIGFuZCBhIHJlY29yZCB3aXRoIG5vIGxpbmUgdW5kZXIgdGhlIGhhc2ggaXMgbm90IG9uZVxuICAvLyB0aGlzIGNhbiBjbGFzc2lmeS4gQm90aCBhcmUgdGhlIHNhbWUgbm9uLWFuc3dlci5cbiAgY29uc3QgW3NoYSwgc3ViamVjdExpbmUsIC4uLmJvZHlMaW5lc10gPSByZWNvcmQuc3BsaXQoJ1xcbicpO1xuICBpZiAoIXNoYSB8fCBzdWJqZWN0TGluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdExpbmUudHJpbSgpO1xuICBjb25zdCBib2R5ID0gYm9keUxpbmVzLmpvaW4oJ1xcbicpO1xuICBjb25zdCBzdWJqZWN0TWF0Y2ggPSBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUC5leGVjKHN1YmplY3QpO1xuXG4gIGlmIChzdWJqZWN0TWF0Y2g/Lmdyb3Vwcz8uWydicmVha2luZyddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcixcbiAgICAgIG1hcmtlcjogQlJFQUtJTkdfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH07XG4gIH1cblxuICBpZiAoQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQLnRlc3QoYm9keSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICAgICAgbWFya2VyOiBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN1YmplY3RNYXRjaD8uZ3JvdXBzPy5bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gRkVBVF9UWVBFXG4gICAgPyB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IsXG4gICAgICBtYXJrZXI6IEZFQVRfVFlQRV9NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIHRoZSBjb21taXRzIHRoYXQgZm9yY2Ugc29tZXRoaW5nIHRvIHRoZSBvbmUgZmxvb3IgdGhlIHJhbmdlIGFzIGEgd2hvbGUgaGFzIHRvIGNsZWFyLlxuICpcbiAqIEBwYXJhbSBmb3JjaW5nQ29tbWl0cyAtIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH1zIGZvdW5kIGluIHRoZSByYW5nZS5cbiAqIEByZXR1cm5zIFRoZSBoaWdoZXN0IHtAbGluayBCdW1wTGV2ZWx9IGFueSBvZiB0aGVtIGZvcmNlcywgb3Ige0BsaW5rIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNofSDigJQgbm9cbiAqIGNvbnN0cmFpbnQg4oCUIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHRvSGlnaGVzdEJ1bXBMZXZlbChmb3JjaW5nQ29tbWl0czogcmVhZG9ubHkgRm9yY2luZ0NvbW1pdFtdKTogQnVtcExldmVsIHtcbiAgaWYgKGZvcmNpbmdDb21taXRzLnNvbWUoKGZvcmNpbmdDb21taXQpID0+IGZvcmNpbmdDb21taXQubGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yKSkge1xuICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcjtcbiAgfVxuXG4gIHJldHVybiBmb3JjaW5nQ29tbWl0cy5sZW5ndGggPiAwID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyBpbnRvIHRoZSByZXBvc2l0b3J5LiBEZWxpYmVyYXRlbHkgdGhlIGxhc3QgdGhpbmcgdGhlIGNoYW5nZWxvZyBzdGVwIGRvZXMsXG4gKiBzbyBub3RoaW5nIGxhbmRzIG9uIGRpc2sgdW50aWwgdGhlIGNvbnRlbnQgaXMgc2V0dGxlZC5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byB3cml0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlbG9nIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlRmlsZShyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KSwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxTQUFTLHNCQUFzQjtBQUMv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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-dev-toolkit",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
5
5
  "keywords": [
6
6
  "typescript",