@mnaoumov/obsidian-dev-toolkit 3.1.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +1 -75
  2. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +3 -77
  3. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +1 -75
  4. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -75
  5. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +1 -75
  6. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -75
  7. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -76
  8. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
  9. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +1 -75
  10. package/dist/lib/cjs/bundlers/esbuild.cjs +1 -75
  11. package/dist/lib/cjs/bundlers/index.cjs +1 -75
  12. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +1 -75
  13. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +1 -75
  14. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +1 -75
  15. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +1 -75
  16. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +1 -75
  17. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +32 -85
  18. package/dist/lib/cjs/bundlers/parcel.cjs +112 -81
  19. package/dist/lib/cjs/bundlers/parcel.d.cts +13 -6
  20. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +1 -75
  21. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +1 -75
  22. package/dist/lib/cjs/bundlers/rollup.cjs +1 -75
  23. package/dist/lib/cjs/bundlers/vite.cjs +1 -75
  24. package/dist/lib/cjs/bundlers/webpack.cjs +3 -77
  25. package/dist/lib/cjs/demo-vault-app-json.cjs +1 -75
  26. package/dist/lib/cjs/demo-vault-buttons.cjs +1 -75
  27. package/dist/lib/cjs/demo-vault-cli.cjs +1 -75
  28. package/dist/lib/cjs/demo-vault-coverage.cjs +1 -75
  29. package/dist/lib/cjs/demo-vault.cjs +3 -77
  30. package/dist/lib/cjs/docs-site/index.cjs +1 -75
  31. package/dist/lib/cjs/docs-site/obsidian-external-type-links.cjs +1 -75
  32. package/dist/lib/cjs/formatters/dprint.cjs +1 -75
  33. package/dist/lib/cjs/formatters/index.cjs +1 -75
  34. package/dist/lib/cjs/index.cjs +1 -75
  35. package/dist/lib/cjs/integration-test-setup.cjs +1 -75
  36. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +1 -75
  37. package/dist/lib/cjs/jest-setup.cjs +1 -75
  38. package/dist/lib/cjs/jest-setup.d.cts +2 -1
  39. package/dist/lib/cjs/linters/eslint-config.cjs +1 -75
  40. package/dist/lib/cjs/linters/eslint-rules/index.cjs +1 -75
  41. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -75
  42. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +1 -75
  43. package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -75
  44. package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -75
  45. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -75
  46. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +1 -75
  47. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -77
  48. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +1 -75
  49. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +1 -75
  50. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -75
  51. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -75
  52. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +1 -75
  53. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +1 -75
  54. package/dist/lib/cjs/linters/eslint.cjs +1 -75
  55. package/dist/lib/cjs/linters/index.cjs +1 -75
  56. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +1 -75
  57. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +1 -75
  58. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +1 -75
  59. package/dist/lib/cjs/linters/markdownlint.cjs +1 -75
  60. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -75
  61. package/dist/lib/cjs/linters/plugin-names.cjs +1 -75
  62. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -75
  63. package/dist/lib/cjs/setup.cjs +1 -75
  64. package/dist/lib/cjs/templates.cjs +3 -77
  65. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +1 -75
  66. package/dist/lib/cjs/test-runners/coverage-badge.cjs +1 -75
  67. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +1 -75
  68. package/dist/lib/cjs/test-runners/index.cjs +4 -75
  69. package/dist/lib/cjs/test-runners/index.d.cts +1 -0
  70. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +3 -77
  71. package/dist/lib/cjs/test-runners/jest-config.cjs +92 -0
  72. package/dist/lib/cjs/test-runners/jest-config.d.cts +50 -0
  73. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +1 -75
  74. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +4 -75
  75. package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +12 -3
  76. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +1 -75
  77. package/dist/lib/cjs/test-runners/vitest-config.cjs +4 -80
  78. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +1 -75
  79. package/dist/lib/cjs/version.cjs +1 -75
  80. package/dist/lib/cjs/vitest-setup.cjs +1 -75
  81. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
  82. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -2
  83. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +32 -15
  84. package/dist/lib/esm/bundlers/parcel.d.mts +13 -6
  85. package/dist/lib/esm/bundlers/parcel.mjs +110 -5
  86. package/dist/lib/esm/jest-setup.d.mts +2 -1
  87. package/dist/lib/esm/jest-setup.mjs +1 -1
  88. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -2
  89. package/dist/lib/esm/test-runners/index.d.mts +1 -0
  90. package/dist/lib/esm/test-runners/index.mjs +3 -1
  91. package/dist/lib/esm/test-runners/jest-config.d.mts +50 -0
  92. package/dist/lib/esm/test-runners/jest-config.mjs +68 -0
  93. package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +12 -3
  94. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +3 -1
  95. package/dist/lib/esm/test-runners/vitest-config.mjs +4 -5
  96. package/package.json +19 -2
  97. package/test-runners/jest-config/package.json +6 -0
@@ -2,13 +2,22 @@
2
2
  /**
3
3
  * @file
4
4
  *
5
- * The per-eval cap of the `integration-tests:desktop-performance` project, and the file suffix that
6
- * project collects.
5
+ * The per-eval caps the integration-test transports enforce, and the file suffix the
6
+ * `integration-tests:desktop-performance` project collects.
7
7
  *
8
- * Both live here, rather than in `vitest-config.ts`, because the `no-over-cap-wait-in-eval-in-obsidian`
8
+ * They live here, rather than in `vitest-config.ts`, because the `no-over-cap-wait-in-eval-in-obsidian`
9
9
  * ESLint rule reads them too, and the shared ESLint config loads that rule in every consuming repo:
10
10
  * importing `vitest-config.ts` from the rule would load `vitest/config` at lint time for nothing.
11
11
  */
12
+ /**
13
+ * The per-eval cap both `obsidian-integration-testing` transports enforce by default, in milliseconds.
14
+ *
15
+ * It restates that package's own `DEFAULT_EVAL_CAP_IN_MILLISECONDS` instead of importing it, because
16
+ * `obsidian-integration-testing` is an OPTIONAL peer: the import made the ESLint rule, and with it the shared
17
+ * ESLint config every plugin lints with, fail to load in a project without the harness installed. A unit test
18
+ * pins the two numbers together, so they cannot drift apart.
19
+ */
20
+ export declare const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 30000;
12
21
  /**
13
22
  * The per-eval cap the `integration-tests:desktop-performance` project gives its CDP transport, in
14
23
  * milliseconds.
@@ -3,10 +3,12 @@ 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
5
 
6
+ const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 3e4;
6
7
  const PERFORMANCE_EVAL_CAP_IN_MILLISECONDS = 6e5;
7
8
  const DESKTOP_PERFORMANCE_TEST_FILE_SUFFIX = ".desktop-performance.integration.test.ts";
8
9
  export {
10
+ DEFAULT_EVAL_CAP_IN_MILLISECONDS,
9
11
  DESKTOP_PERFORMANCE_TEST_FILE_SUFFIX,
10
12
  PERFORMANCE_EVAL_CAP_IN_MILLISECONDS
11
13
  };
12
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9wZXJmb3JtYW5jZS1ldmFsLWNhcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBwZXItZXZhbCBjYXAgb2YgdGhlIGBpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wLXBlcmZvcm1hbmNlYCBwcm9qZWN0LCBhbmQgdGhlIGZpbGUgc3VmZml4IHRoYXRcbiAqIHByb2plY3QgY29sbGVjdHMuXG4gKlxuICogQm90aCBsaXZlIGhlcmUsIHJhdGhlciB0aGFuIGluIGB2aXRlc3QtY29uZmlnLnRzYCwgYmVjYXVzZSB0aGUgYG5vLW92ZXItY2FwLXdhaXQtaW4tZXZhbC1pbi1vYnNpZGlhbmBcbiAqIEVTTGludCBydWxlIHJlYWRzIHRoZW0gdG9vLCBhbmQgdGhlIHNoYXJlZCBFU0xpbnQgY29uZmlnIGxvYWRzIHRoYXQgcnVsZSBpbiBldmVyeSBjb25zdW1pbmcgcmVwbzpcbiAqIGltcG9ydGluZyBgdml0ZXN0LWNvbmZpZy50c2AgZnJvbSB0aGUgcnVsZSB3b3VsZCBsb2FkIGB2aXRlc3QvY29uZmlnYCBhdCBsaW50IHRpbWUgZm9yIG5vdGhpbmcuXG4gKi9cblxuLyoqXG4gKiBUaGUgcGVyLWV2YWwgY2FwIHRoZSBgaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcC1wZXJmb3JtYW5jZWAgcHJvamVjdCBnaXZlcyBpdHMgQ0RQIHRyYW5zcG9ydCwgaW5cbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBFdmVyeSBvdGhlciBwcm9qZWN0IGtlZXBzIHRoZSB0cmFuc3BvcnQncyBvd24gYERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTYCAoMzAgMDAwKSwgYW5kIGEgcmVwb1xuICogdGhhdCByYWlzZXMgaXRzIGRlc2t0b3AgY2FwIGFib3ZlIHRoYXQgaXMgc2V0dGluZyBhIEJBQ0tTVE9QLCBub3QgYSBidWRnZXQgYSBjbG9zdXJlIG1heSBzcGVuZC4gVGhlXG4gKiBwZXJmb3JtYW5jZSBwcm9qZWN0IGlzIHRoZSBvbmUgZXhjZXB0aW9uLCBhbmQgYSBkZWxpYmVyYXRlIG9uZTogaXRzIHdob2xlIG1lYXN1cmVtZW50IGlzIG9uZSBsb25nXG4gKiBpbi1wYWdlIGBSdW50aW1lLmV2YWx1YXRlYCBvdmVyIGEgdmF1bHQgb2YgdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMsIGFuZCBpdHMgZmlsZXMgcnVuIG9uIG5vIG90aGVyXG4gKiBwcm9qZWN0LiBBIGNyb3NzLXBsYXRmb3JtIHN1aXRlIGdhaW5zIG5vdGhpbmcgZnJvbSBhbnkgZGVza3RvcCByYWlzZSwgYmVjYXVzZSBBcHBpdW0gY2FwcyBpdCBhdFxuICogMzAgMDAwIHdoYXRldmVyIHRoZSBkZXNrdG9wIHByb2plY3Qgc2F5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5cbi8qKlxuICogVGhlIGZpbGUtbmFtZSBzdWZmaXggb2YgYSBzdWl0ZSB0aGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QgY29sbGVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERVNLVE9QX1BFUkZPUk1BTkNFX1RFU1RfRklMRV9TVUZGSVggPSAnLmRlc2t0b3AtcGVyZm9ybWFuY2UuaW50ZWdyYXRpb24udGVzdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQXNCTyxNQUFNLHVDQUF1QztBQUs3QyxNQUFNLHVDQUF1QzsiLAogICJuYW1lcyI6IFtdCn0K
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9wZXJmb3JtYW5jZS1ldmFsLWNhcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBwZXItZXZhbCBjYXBzIHRoZSBpbnRlZ3JhdGlvbi10ZXN0IHRyYW5zcG9ydHMgZW5mb3JjZSwgYW5kIHRoZSBmaWxlIHN1ZmZpeCB0aGVcbiAqIGBpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wLXBlcmZvcm1hbmNlYCBwcm9qZWN0IGNvbGxlY3RzLlxuICpcbiAqIFRoZXkgbGl2ZSBoZXJlLCByYXRoZXIgdGhhbiBpbiBgdml0ZXN0LWNvbmZpZy50c2AsIGJlY2F1c2UgdGhlIGBuby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW5gXG4gKiBFU0xpbnQgcnVsZSByZWFkcyB0aGVtIHRvbywgYW5kIHRoZSBzaGFyZWQgRVNMaW50IGNvbmZpZyBsb2FkcyB0aGF0IHJ1bGUgaW4gZXZlcnkgY29uc3VtaW5nIHJlcG86XG4gKiBpbXBvcnRpbmcgYHZpdGVzdC1jb25maWcudHNgIGZyb20gdGhlIHJ1bGUgd291bGQgbG9hZCBgdml0ZXN0L2NvbmZpZ2AgYXQgbGludCB0aW1lIGZvciBub3RoaW5nLlxuICovXG5cbi8qKlxuICogVGhlIHBlci1ldmFsIGNhcCBib3RoIGBvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nYCB0cmFuc3BvcnRzIGVuZm9yY2UgYnkgZGVmYXVsdCwgaW4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEl0IHJlc3RhdGVzIHRoYXQgcGFja2FnZSdzIG93biBgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFNgIGluc3RlYWQgb2YgaW1wb3J0aW5nIGl0LCBiZWNhdXNlXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgaXMgYW4gT1BUSU9OQUwgcGVlcjogdGhlIGltcG9ydCBtYWRlIHRoZSBFU0xpbnQgcnVsZSwgYW5kIHdpdGggaXQgdGhlIHNoYXJlZFxuICogRVNMaW50IGNvbmZpZyBldmVyeSBwbHVnaW4gbGludHMgd2l0aCwgZmFpbCB0byBsb2FkIGluIGEgcHJvamVjdCB3aXRob3V0IHRoZSBoYXJuZXNzIGluc3RhbGxlZC4gQSB1bml0IHRlc3RcbiAqIHBpbnMgdGhlIHR3byBudW1iZXJzIHRvZ2V0aGVyLCBzbyB0aGV5IGNhbm5vdCBkcmlmdCBhcGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuXG4vKipcbiAqIFRoZSBwZXItZXZhbCBjYXAgdGhlIGBpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wLXBlcmZvcm1hbmNlYCBwcm9qZWN0IGdpdmVzIGl0cyBDRFAgdHJhbnNwb3J0LCBpblxuICogbWlsbGlzZWNvbmRzLlxuICpcbiAqIEV2ZXJ5IG90aGVyIHByb2plY3Qga2VlcHMgdGhlIHRyYW5zcG9ydCdzIG93biBgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFNgICgzMCAwMDApLCBhbmQgYSByZXBvXG4gKiB0aGF0IHJhaXNlcyBpdHMgZGVza3RvcCBjYXAgYWJvdmUgdGhhdCBpcyBzZXR0aW5nIGEgQkFDS1NUT1AsIG5vdCBhIGJ1ZGdldCBhIGNsb3N1cmUgbWF5IHNwZW5kLiBUaGVcbiAqIHBlcmZvcm1hbmNlIHByb2plY3QgaXMgdGhlIG9uZSBleGNlcHRpb24sIGFuZCBhIGRlbGliZXJhdGUgb25lOiBpdHMgd2hvbGUgbWVhc3VyZW1lbnQgaXMgb25lIGxvbmdcbiAqIGluLXBhZ2UgYFJ1bnRpbWUuZXZhbHVhdGVgIG92ZXIgYSB2YXVsdCBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZiBub3RlcywgYW5kIGl0cyBmaWxlcyBydW4gb24gbm8gb3RoZXJcbiAqIHByb2plY3QuIEEgY3Jvc3MtcGxhdGZvcm0gc3VpdGUgZ2FpbnMgbm90aGluZyBmcm9tIGFueSBkZXNrdG9wIHJhaXNlLCBiZWNhdXNlIEFwcGl1bSBjYXBzIGl0IGF0XG4gKiAzMCAwMDAgd2hhdGV2ZXIgdGhlIGRlc2t0b3AgcHJvamVjdCBzYXlzLlxuICovXG5leHBvcnQgY29uc3QgUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTID0gNjAwXzAwMDtcblxuLyoqXG4gKiBUaGUgZmlsZS1uYW1lIHN1ZmZpeCBvZiBhIHN1aXRlIHRoZSBgaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcC1wZXJmb3JtYW5jZWAgcHJvamVjdCBjb2xsZWN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFX1NVRkZJWCA9ICcuZGVza3RvcC1wZXJmb3JtYW5jZS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBbUJPLE1BQU0sbUNBQW1DO0FBYXpDLE1BQU0sdUNBQXVDO0FBSzdDLE1BQU0sdUNBQXVDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -35,9 +35,8 @@ import {
35
35
  DEFAULT_VITEST_TEST_EXCLUDE
36
36
  } from "@mnaoumov/typescript-dev-toolkit/test-runners/vitest-config";
37
37
  import process from "node:process";
38
- import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "obsidian-integration-testing";
39
- import { defineConfig } from "vitest/config";
40
38
  import {
39
+ DEFAULT_EVAL_CAP_IN_MILLISECONDS,
41
40
  DESKTOP_PERFORMANCE_TEST_FILE_SUFFIX,
42
41
  PERFORMANCE_EVAL_CAP_IN_MILLISECONDS
43
42
  } from "./performance-eval-cap.mjs";
@@ -296,7 +295,7 @@ function defineObsidianPluginVitestConfig(options = {}) {
296
295
  pool: "forks"
297
296
  }
298
297
  }];
299
- return defineConfig({
298
+ return {
300
299
  test: {
301
300
  coverage: {
302
301
  exclude: context.coverageExclude,
@@ -333,7 +332,7 @@ function defineObsidianPluginVitestConfig(options = {}) {
333
332
  ],
334
333
  reporters: [...context.reporters]
335
334
  }
336
- });
335
+ };
337
336
  }
338
337
  function validateCustomProjects(customProjects) {
339
338
  for (const [index, customProject] of customProjects.entries()) {
@@ -357,4 +356,4 @@ export {
357
356
  ObsidianPluginVitestConfigContext,
358
357
  defineObsidianPluginVitestConfig
359
358
  };
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2hhcmVkIHZpdGVzdCBjb25maWd1cmF0aW9uIGZvciBPYnNpZGlhbiBwbHVnaW5zLlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBpbiB0aGUgd29ya3NwYWNlIGRlY2xhcmVzIHRoZSBzYW1lIGZpdmUgdml0ZXN0IHByb2plY3RzIOKAlCBgdW5pdC10ZXN0c2AgcGx1cyB0aGVcbiAqIGBpbnRlZ3JhdGlvbi10ZXN0czp7bm8tYXBwLGRlc2t0b3AsZGVza3RvcC1wZXJmb3JtYW5jZSxhbmRyb2lkfWAgZmFtaWx5IOKAlCB3aXRoIHRoZSBzYW1lIHRpbWVvdXRzLFxuICogYHNldHVwRmlsZXNgLCBhbmQgYGdsb2JhbFNldHVwYCB3aXJpbmcuIE1haW50YWluaW5nIHRoYXQgcGVyIHJlcG8gbWVhbnMgYSBjb252ZW50aW9uIGNoYW5nZSBjb3N0cyBvbmVcbiAqIG5lYXItaWRlbnRpY2FsIGVkaXQgcGVyIHBsdWdpbiwgYW5kIGFueSByZXBvIHRoYXQgaXMgbWlzc2VkIGRyaWZ0cyBzaWxlbnRseS4gVGhpcyBtb2R1bGUgb3ducyB0aGF0XG4gKiBjb25maWd1cmF0aW9uIG9uY2UsIHNvIGEgcGx1Z2luJ3MgYHNjcmlwdHMvdml0ZXN0LWNvbmZpZy50c2AgY29sbGFwc2VzIHRvIGEgc2luZ2xlIGNhbGwuXG4gKlxuICogVGhlIHNlYW0gbWlycm9ycyB0aGUgRVNMaW50IG9uZSAoYGRlZmluZUVzbGludENvbmZpZ3NgKTogdGhlIGZhY3RvcnkgYnVpbGRzIGEgY29udGV4dCBob2xkaW5nIHRoZSBzdGFuZGFyZCBwcm9qZWN0cywgdGhlIGNhbGxlciBlZGl0c1xuICogaXQgaW4gcGxhY2UgdGhyb3VnaCB7QGxpbmsgRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zLmVkaXRDb250ZXh0fSwgYW5kIGFwcGVuZHMgYW55XG4gKiBwcm9qZWN0IHRoZSBiYXNlIGRvZXMgbm90IGtub3cgYWJvdXQgdGhyb3VnaFxuICoge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5jdXN0b21Qcm9qZWN0c30uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaXRlc3RSZXBvcnRlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L3Rlc3QtcnVubmVycy92aXRlc3QtY29uZmlnJztcbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQge1xuICBERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlMsXG4gIERFRkFVTFRfVklURVNUX1RFU1RfRVhDTFVERVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQge1xuICBERVNLVE9QX1BFUkZPUk1BTkNFX1RFU1RfRklMRV9TVUZGSVgsXG4gIFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL3BlcmZvcm1hbmNlLWV2YWwtY2FwLnRzJztcblxuLyoqXG4gKiBUaGUgYHRlc3RgIHNlY3Rpb24gb2YgYSBzaW5nbGUgdml0ZXN0IHByb2plY3QgZW50cnkuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IE5vbk51bGxhYmxlPFRlc3RQcm9qZWN0SW5saW5lQ29uZmlndXJhdGlvblsndGVzdCddPjtcblxuLyoqXG4gKiBPbmUgZW50cnkgb2YgYSB2aXRlc3QgYHJlcG9ydGVyc2AgbGlzdDogdGhlIG5hbWUgb2YgYSBidWlsdC1pbiByZXBvcnRlciBvciBhIHJlcG9ydGVyIGluc3RhbmNlLiBUaGUgc2FtZSBzaGFwZSBhc1xuICogdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbidzIHtAbGluayBWaXRlc3RSZXBvcnRlcn0uXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuUGx1Z2luVml0ZXN0UmVwb3J0ZXIgPSBWaXRlc3RSZXBvcnRlcjtcblxuLy8gVGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbidzIHBpbm5lZCByZXBvcnRlcnMsIHJlLWV4cG9ydGVkIHNvIGEgcGx1Z2luIHJlcG8gdGhhdCBhc3NlbWJsZXMgaXRzIHZpdGVzdCBwcm9qZWN0cyBieVxuLy8gaGFuZCBuZWVkcyBvbmx5IHRoaXMgcGFja2FnZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1leHBvcnQtZnJvbSAtLSBUaGUgYmluZGluZyBpcyBhbHNvIHVzZWQgYmVsb3csIHNvIGl0IGlzIGltcG9ydGVkIG9uY2UuXG5leHBvcnQgeyBERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlMgfTtcblxuLypcbiAqIEhvdyBtdWNoIGEgcHJvamVjdCdzIHBlci10ZXN0IGJ1ZGdldCBjbGVhcnMgYERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTYCBieSDigJQgdGhlIHBlci1ldmFsIGNhcFxuICogQk9USCB0cmFuc3BvcnRzIGVuZm9yY2UsIGltcG9ydGVkIGZyb20gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgIHJhdGhlciB0aGFuIHJlc3RhdGVkIHNvIHRoZVxuICogYnVkZ2V0cyBiZWxvdyBhbmQgdGhlIGNhcCB0aGV5IGFyZSBzaXplZCBhZ2FpbnN0IGNhbiBuZXZlciBiZSB0d28gbnVtYmVycy4gT25lIGBldmFsSW5PYnNpZGlhbmAgY2xvc3VyZVxuICogZ2V0cyB0aGF0IG11Y2ggYW5kIG5vIG1vcmUsIG1lYXN1cmVkIGZyb20gdGhlIG1vbWVudCB0aGUgdHJhbnNwb3J0IGRpc3BhdGNoZXMgaXQ7IG91dHJ1bm5pbmcgaXQgcmFpc2VzXG4gKiBgRXZhbENhcEV4Y2VlZGVkRXJyb3JgLCB3aGljaCBuYW1lcyB0aGUgY2FwLCB0aGUgdHJhbnNwb3J0IHRoYXQgZW5mb3JjZWQgaXQsIGFuZCB0aGUgYHBvbGxJbk9ic2lkaWFuYFxuICogcmVtZWR5IOKAlCB0aGUgb25lIG1lc3NhZ2UgdGhhdCB0dXJucyBcInRoaXMgdGltZWQgb3V0XCIgaW50byBcInRoaXMgY2xvc3VyZSBhc2tlZCBmb3IgbW9yZSB0aW1lIHRoYW5cbiAqIGV4aXN0c1wiLlxuICpcbiAqIEEgdGVzdCBidWRnZXQgRVFVQUwgdG8gdGhlIGNhcCBtYWtlcyB0aGUgY2FwJ3Mgb3duIGRpYWdub3NpcyB1bnJlYWNoYWJsZTogdml0ZXN0IHN0YXJ0cyBpdHMgY2xvY2sgYXRcbiAqIHRoZSB0b3Agb2YgdGhlIHRlc3QgYW5kIHRoZSB0cmFuc3BvcnQgc3RhcnRzIGl0cyBvd24gb25seSBvbmNlIHRoZSBldmFsIGlzIGRpc3BhdGNoZWQsIHNvIHZpdGVzdCBhbHdheXNcbiAqIHdpbnMgYnkgdGhlIGZldyBtaWxsaXNlY29uZHMgaW4gYmV0d2VlbiBhbmQgcmVwb3J0cyBpdHMgYW5vbnltb3VzIGBUZXN0IHRpbWVkIG91dCBpbiAzMDAwMG1zYC4gVGhhdCBpc1xuICogbm90IGEgaHlwb3RoZXRpY2FsIOKAlCBpdCBpcyBob3cgZXZlcnkgb3Zlci1jYXAgZGVza3RvcCBldmFsIGhhZCBzdXJmYWNlZCBoZXJlIHVudGlsIHRoaXMgbWFyZ2luIGV4aXN0ZWQsXG4gKiBhbmQgb25lIG9mIHRoZW0gYWJvcnRlZCBhbiBvdGhlcndpc2UgZ3JlZW4gcmVsZWFzZSBmaXZlIG1pbnV0ZXMgaW50byB0aGUgcHJlZmxpZ2h0IHdpdGggbm8gaW5kaWNhdGlvblxuICogb2Ygd2hpY2ggd2FpdCB3YXMgdG8gYmxhbWUgKG1lYXN1cmVkIDIwMjYtMDktMTU6IDMwMDQ0IG1zIGJ1cm5lZCBhZ2FpbnN0IGEgMzAwMDAgbXMgYnVkZ2V0KS5cbiAqXG4gKiBUaGUgbWFyZ2luIGhhcyB0byBjb3ZlciBldmVyeXRoaW5nIGEgdGVzdCBkb2VzIEJFRk9SRSB0aGUgZXZhbCB0aGF0IGhhbmdzIOKAlCBlYXJsaWVyIG9uZXMgaW5jbHVkZWQg4oCUXG4gKiBzbyBpdCBpcyBhIGhlYWx0aHkgZnJhY3Rpb24gb2YgdGhlIGNhcCByYXRoZXIgdGhhbiBhIGNvdXBsZSBvZiBzZWNvbmRzLlxuICovXG5jb25zdCBUUkFOU1BPUlRfRVZBTF9DQVBfTUFSR0lOX0lOX01JTExJU0VDT05EUyA9IDE1XzAwMDtcblxuLypcbiAqIEFuZHJvaWQgd2FzIG5ldmVyIGFmZmVjdGVkLCBhbmQgdGhhdCBhc3ltbWV0cnkgaXMgdGhlIGV2aWRlbmNlIHRoZSBkZXNrdG9wIGVxdWFsaXR5IHdhcyBhbiBvdmVyc2lnaHRcbiAqIHJhdGhlciB0aGFuIGEgZGVjaXNpb246IGl0cyBidWRnZXQgaGFzIGFsd2F5cyBiZWVuIGRvdWJsZSB0aGUgQXBwaXVtIGNhcCwgc28gYW4gb3Zlci1jYXAgbW9iaWxlIGNsb3N1cmVcbiAqIGhhcyBhbHdheXMgYmVlbiBhYmxlIHRvIHJlcG9ydCBpdHNlbGYuXG4gKi9cbmNvbnN0IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBIT09LX1RJTUVPVVRfTVVMVElQTElFUiA9IDQ7XG5cbi8qXG4gKiBUaGUgcGVyZm9ybWFuY2UgcHJvamVjdCdzIGJ1ZGdldCBjbGVhcnMgaXRzIG93biBwZXItZXZhbCBjYXAgYnkgdGhlIHNhbWUgbWFyZ2luLCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiB0aGUgcmVndWxhciBidWRnZXQgY2xlYXJzIHRoZSB0cmFuc3BvcnQgZGVmYXVsdDogYW4gZXF1YWwgYnVkZ2V0IGxldHMgdml0ZXN0J3MgYW5vbnltb3VzIHRpbWVvdXQgd2luXG4gKiB0aGUgcmFjZSBhZ2FpbnN0IHRoZSBjYXAncyBvd24gYEV2YWxDYXBFeGNlZWRlZEVycm9yYC5cbiAqL1xuY29uc3QgUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSBQRVJGT1JNQU5DRV9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgKyBUUkFOU1BPUlRfRVZBTF9DQVBfTUFSR0lOX0lOX01JTExJU0VDT05EUztcblxuLyoqXG4gKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBhIHJlcG8gdGhhdCBhc3NlbWJsZXMgaXRzIHZpdGVzdCBwcm9qZWN0cyBieSBoYW5kIGluc3RlYWQgb2YgdGhyb3VnaFxuICoge0BsaW5rIGRlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnfSBzdGlsbCBuZWVkcyB0aGUgc2FtZSByZWxhdGlvbnNoaXAgdG8gdGhlIHBlci1ldmFsIGNhcCwgYW5kXG4gKiByZXN0YXRpbmcgdGhlIG51bWJlciB0aGVyZSBpcyBob3cgdGhlIHR3byBkcmlmdCBhcGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IElOVEVHUkFUSU9OX1RFU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyArIFRSQU5TUE9SVF9FVkFMX0NBUF9NQVJHSU5fSU5fTUlMTElTRUNPTkRTO1xuXG5jb25zdCBBTkRST0lEX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouYW5kcm9pZC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouY3Jvc3MtcGxhdGZvcm0uaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBERUNMQVJBVElPTl9GSUxFUyA9ICdzcmMvKiovKi5kLnRzJztcbmNvbnN0IERFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFUyA9IGBzcmMvKiovKiR7REVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVfU1VGRklYfWA7XG5jb25zdCBERVNLVE9QX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouZGVza3RvcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IElOVEVHUkFUSU9OX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBOT19BUFBfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfRklMRVMgPSAnc3JjLyoqLyoudGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfR0xPQkFMX1NUVUJTX1BST0pFQ1RfTkFNRSA9ICd1bml0LXRlc3RzOmdsb2JhbC1zdHVicyc7XG5cbi8qXG4gKiBSdW5zIGJlZm9yZSB0aGUgaGFybmVzcydzIG93biBzZXR1cCBpbiBldmVyeSBwcm9qZWN0IHRoYXQgbG9hZHMgdGhlIHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL21haW4uanNgLFxuICogYW5kIHJlZnVzZXMgdG8gc3RhcnQgd2hlbiB0aGF0IGJ1aWxkIGlzIG1pc3Npbmcgb3Igb2xkZXIgdGhhbiB0aGUgc291cmNlLiBBIHBsdWdpbidzXG4gKiBgdGVzdDppbnRlZ3JhdGlvbipgIHNjcmlwdHMgY2FsbCB2aXRlc3QgZGlyZWN0bHkgYW5kIG5ldmVyIGJ1aWxkLCBzbyB3aXRob3V0IGl0IGEgc2Vzc2lvbiB0aGF0IGVkaXRzXG4gKiBgc3JjL2AgYW5kIHJ1bnMgb25lIGludGVncmF0aW9uIHByb2plY3QgdGVzdHMgdGhlIHByZXZpb3VzIGJ1aWxkIGFuZCByZWFkcyB0aGUgcmVzdWx0IGFzIGEgZGVmZWN0LlxuICovXG5jb25zdCBTVEFMRV9CVUlMRF9HTE9CQUxfU0VUVVAgPSAnQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0L3Rlc3QtcnVubmVycy9zdGFsZS1idWlsZC1nbG9iYWwtc2V0dXAnO1xuXG5jb25zdCBPQlNJRElBTl9WRVJTSU9OX0VOVl9WQVJJQUJMRV9OQU1FID0gJ09CU0lESUFOX1ZFUlNJT04nO1xuY29uc3QgU0hBUkVEX0VYQ0xVREUgPSBERUZBVUxUX1ZJVEVTVF9URVNUX0VYQ0xVREU7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIGEgcGx1Z2luJ3Mgdml0ZXN0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBidWlsZHMgcHJvamVjdHMgdGhlIGJhc2UgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBrbm93IGFib3V0LCBzdWNoIGFzIGEgcGx1Z2luJ3Mgb3duXG4gICAqIGBpbnRlZ3JhdGlvbi10ZXN0czpkZW1vLXZhdWx0YCBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcHJvamVjdHMgYXJlIGFwcGVuZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBmaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBUaGUgZXh0cmEgcHJvamVjdHMuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Qcm9qZWN0cz86IChjb250ZXh0OiBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQpID0+IFRlc3RQcm9qZWN0Q29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgZWRpdHMgdGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQgYmVmb3JlIGl0IGlzIGFzc2VtYmxlZCBpbnRvIGEgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgdml0ZXN0IGNvbmZpZ3VyYXRpb24gY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXRDb250ZXh0PzogKGNvbnRleHQ6IE9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnQ29udGV4dCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFdmVyeSBtZW1iZXIgaXMgbGl2ZTogdGhlIGFycmF5cyBhbmQgb2JqZWN0cyBpdCBleHBvc2VzIGFyZSB0aGUgdmVyeSBvbmVzIHRoZSBhc3NlbWJsZWQgY29uZmlndXJhdGlvblxuICogaXMgYnVpbHQgZnJvbSwgc28gZWRpdGluZyB0aGVtIGluIHBsYWNlIHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuZWRpdENvbnRleHR9IGlzIHdoYXQgY3VzdG9taXplcyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZGAgcHJvamVjdCwgcnVubmluZyB0aGUgbW9iaWxlLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFuXG4gICAqIEFuZHJvaWQgZW11bGF0b3IgdGhyb3VnaCBBcHBpdW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XG4gICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICBhcHBpdW1Vcmw6ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMnLFxuICAgICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gICAgICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFtTVEFMRV9CVUlMRF9HTE9CQUxfU0VUVVAsICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgKiBIT09LX1RJTUVPVVRfTVVMVElQTElFUixcbiAgICBpbmNsdWRlOiBbQU5EUk9JRF9URVNUX0ZJTEVTLCBDUk9TU19QTEFURk9STV9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZCcsXG4gICAgc2V0dXBGaWxlczogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1zZXR1cCddLFxuICAgIHRlc3RUaW1lb3V0OiBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIEFuZHJvaWQgaW50ZWdyYXRpb24gcHJvamVjdCwgaW4gbWlsbGlzZWNvbmRzLiBCb290aW5nIGFuIGVtdWxhdG9yIGFuZFxuICAgKiBkcml2aW5nIGl0IG92ZXIgQXBwaXVtIGlzIHNsb3dlciB0aGFuIHRoZSBkZXNrdG9wIHBhdGgsIGhlbmNlIGl0cyBvd24gY29uc3RhbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDAwMGBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhbmRyb2lkVGltZW91dEluTWlsbGlzZWNvbmRzID0gQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIHBlci10ZXN0IGJ1ZGdldCBvZiB0aGUgcmVndWxhciBpbnRlZ3JhdGlvbiBwcm9qZWN0cywgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBJdCBkZWxpYmVyYXRlbHkgQ0xFQVJTIHRoZSB0cmFuc3BvcnRzJyBwZXItZXZhbCBjYXAgcmF0aGVyIHRoYW4gbWF0Y2hpbmcgaXQsIHNvIHRoYXQgYSBjbG9zdXJlIHdoaWNoXG4gICAqIG91dHJ1bnMgdGhlIGNhcCBmYWlscyB3aXRoIHRoZSBoYXJuZXNzJ3MgYEV2YWxDYXBFeGNlZWRlZEVycm9yYCDigJQgbmFtaW5nIHRoZSBjYXAgYW5kIHRoZSByZW1lZHkg4oCUXG4gICAqIGluc3RlYWQgb2Ygd2l0aCB2aXRlc3QncyBhbm9ueW1vdXMgdGltZW91dC4gTG93ZXJpbmcgaXQgdG8gdGhlIGNhcCByZXN0b3JlcyB0aGF0IGJsaW5kIHNwb3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA0NTAwMGBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBiaWdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBJTlRFR1JBVElPTl9URVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIC8qKlxuICAgKiBUaGUgY292ZXJhZ2UgYGV4Y2x1ZGVgIGdsb2JzLiBQdXNoIG9udG8gaXQgdG8gZHJvcCBtb3JlIGZpbGVzIGZyb20gdGhlIGNvdmVyYWdlIHJlcG9ydC5cbiAgICpcbiAgICogRGVjbGFyYXRpb24gZmlsZXMgYXJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgY292ZXJhZ2UgYGluY2x1ZGVgIGJlbG93IGlzIGBzcmMvKipcXC8qLnRzYCxcbiAgICogd2hpY2ggYSBgLmQudHNgIG1hdGNoZXMuIEEgZGVjbGFyYXRpb24gZmlsZSBlbWl0cyBubyBydW50aW1lIGNvZGUsIHNvIGl0IHJlcG9ydHMgMCUgYW5kIG5vIHRlc3QgY2FuXG4gICAqIGV2ZXIgcmFpc2UgaXQg4oCUIGEgcGx1Z2luIHRoYXQgZ3Jvd3Mgb25lIHVuZGVyIGBzcmMvYCBzaWxlbnRseSBsb3NlcyBpdHMgMTAwJSBnYXRlLCBhbmQgdGhlIHVzdWFsXG4gICAqIHJlbWVkeSBvZiBhbiBpbmxpbmUgYHY4IGlnbm9yZWAgY29tbWVudCBkb2VzIG5vdCBhcHBseSB0byBhIHR5cGUtb25seSBmaWxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvdmVyYWdlRXhjbHVkZTogc3RyaW5nW10gPSBbVU5JVF9URVNUX0ZJTEVTLCBERUNMQVJBVElPTl9GSUxFU107XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcGAgcHJvamVjdCwgcnVubmluZyB0aGUgZGVza3RvcC1vbmx5IGFuZCBjcm9zcy1wbGF0Zm9ybSBzdWl0ZXMgYWdhaW5zdCBhXG4gICAqIHJlYWwgZGVza3RvcCBPYnNpZGlhbiBvdmVyIENEUC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNrdG9wOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBmaWxlUGFyYWxsZWxpc206IGZhbHNlLFxuICAgIGdsb2JhbFNldHVwOiBbU1RBTEVfQlVJTERfR0xPQkFMX1NFVFVQLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbiddLFxuICAgIGhvb2tUaW1lb3V0OiBJTlRFR1JBVElPTl9URVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfVEVTVF9GSUxFUywgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogSU5URUdSQVRJT05fVEVTVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGF0LXNjYWxlIHN1aXRlcy4gSXQgaXMgZGVjbGFyZWQgZm9yXG4gICAqIGV2ZXJ5IHBsdWdpbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBzdWl0ZSB5ZXQg4oCUIGBwYXNzV2l0aE5vVGVzdHNgIG1ha2VzIGFuIGVtcHR5IHByb2plY3QgZnJlZSxcbiAgICogYW5kIHRoZSBtYXRjaGluZyBgdGVzdDppbnRlZ3JhdGlvbjpkZXNrdG9wOnBlcmZvcm1hbmNlYCBzY3JpcHQgZXhpc3RzIGluIGV2ZXJ5IHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIEEgcGx1Z2luJ3MgYHRlc3Q6aW50ZWdyYXRpb25gIGFnZ3JlZ2F0ZSBsZWF2ZXMgdGhpcyBwcm9qZWN0IG91dCBvbiBwdXJwb3NlLCBhbmQgaXQgc3RheXMgb3V0IGV2ZW4gb24gYVxuICAgKiBtYWNoaW5lIHdpdGggYSBkZXNrdG9wIE9ic2lkaWFuIHNldCB1cC4gVGhlIHJlYXNvbiBpcyB0aGUgZml4dHVyZSByYXRoZXIgdGhhbiB0aGUgY29zdDogYSBwZXJmIHN1aXRlXG4gICAqIG5lZWRzIGl0cyBvd24gZ2VuZXJhdGVkLCBwb3B1bGF0ZWQgdmF1bHQsIHNpemVkIHRocm91Z2ggZW52IHZhcnMsIGFuZCB0aGUgYWdncmVnYXRlJ3Mgc21hbGwgdGVtcG9yYXJ5XG4gICAqIHZhdWx0IGlzIHRoZSB3cm9uZyBvbmUuIFRoZSA2MDAgcyBiZWxvdyBpcyBhIHRpbWVvdXQsIG5vdCBhIGR1cmF0aW9uIOKAlCBtZWFzdXJlZCBlbmQgdG8gZW5kLCBtb3N0IHBlcmZcbiAgICogc3VpdGVzIGZpbmlzaCBpbiBzZWNvbmRzLCBhbmQgb25seSBvbmUgdGhhdCBnZW5lcmF0ZXMgdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMgdGFrZXMgbWludXRlcy5cbiAgICpcbiAgICogSXRzIENEUCB0cmFuc3BvcnQncyBwZXItZXZhbCBjYXAgaXMgcmFpc2VkIHRvIDYwMCBzIGFzIHdlbGwgKHRoZSBidWRnZXQgY2xlYXJzIGl0IGJ5IHRoZSB1c3VhbFxuICAgKiBtYXJnaW4pLCBiZWNhdXNlIGEgcGVyZiBzdWl0ZSdzIHdob2xlIG1lYXN1cmVtZW50IGlzIHR5cGljYWxseSBPTkUgbG9uZyBpbi1wYWdlIGV2YWx1YXRpb24sIHdoaWNoIHRoZVxuICAgKiB0cmFuc3BvcnQncyAzMCBzIGRlZmF1bHQga2lsbGVkIGFzIGEgYmFyZSBgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IOKApiBSdW50aW1lLmV2YWx1YXRlYCBuYW1pbmcgbmVpdGhlciB0aGVcbiAgICogd2FpdCBub3IgdGhlIGFzc2VydGlvbi4gVGhyZWUgcGx1Z2lucyBoYWQgZWFjaCBoYW5kLXdyaXR0ZW4gdGhpcyByYWlzZSBpbiB0aGVpciBvd24gYGVkaXRDb250ZXh0YFxuICAgKiBiZWZvcmUgaXQgbW92ZWQgaGVyZS4gVW5saWtlIGEgcmFpc2VkIGRlc2t0b3AgY2FwLCB3aGljaCBpcyBhIGJhY2tzdG9wIHJhdGhlciB0aGFuIGEgYnVkZ2V0IGEgY2xvc3VyZVxuICAgKiBtYXkgc3BlbmQsIHRoaXMgb25lIElTIGEgYnVkZ2V0OiBgbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuYCByZWFkcyBpdCBmb3IgdGhlc2UgZmlsZXMgYW5kXG4gICAqIGZvciBubyBvdGhlci5cbiAgICpcbiAgICogTm8gcm91dGluZSBjb21tYW5kIHJ1bnMgdGhlbSwgYnV0IHNvbWV0aGluZyBkb2VzOiBhIHdlZWtseSBzd2VlcCBydW5zIGV2ZXJ5IHBsdWdpbidzXG4gICAqIGB0ZXN0OmludGVncmF0aW9uOmRlc2t0b3A6cGVyZm9ybWFuY2VgLCB3aGljaCBpcyBhbHNvIGhvdyB0byByZWFjaCB0aGVtIGJ5IGhhbmQuIEFkZGluZyB0aGVtIHRvIHRoYXRcbiAgICogYWdncmVnYXRlIGlzIGRyaWZ0LCBub3QgYSBnYXAgdG8gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcFBlcmZvcm1hbmNlOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnM6IHtcbiAgICAgIG9ic2lkaWFuVHJhbnNwb3J0OiB7XG4gICAgICAgIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFtTVEFMRV9CVUlMRF9HTE9CQUxfU0VUVVAsICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IFBFUkZPUk1BTkNFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgIGluY2x1ZGU6IFtERVNLVE9QX1BFUkZPUk1BTkNFX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wLXBlcmZvcm1hbmNlJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IFBFUkZPUk1BTkNFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSB1bml0IHRlc3QgZmlsZXMgdGhhdCByZWRlZmluZSBgd2luZG93YCwgYGRvY3VtZW50YCwgYGxvY2F0aW9uYCBvciBgdG9wYCwgd2hpY2ggdGhlIGB1bml0LXRlc3RzYFxuICAgKiBwcm9qZWN0J3MgVk0gcG9vbCBjYW5ub3QgcnVuLlxuICAgKlxuICAgKiBVbmRlciBgcG9vbDogJ3ZtVGhyZWFkcydgIHRob3NlIGZvdXIgYXJlIG5vbi1jb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgVk0gZ2xvYmFsLCBzb1xuICAgKiBgdmkuc3R1Ykdsb2JhbCgnd2luZG93Jywg4oCmKWAgb3IgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhdGlvbicsIOKApilgIHRocm93c1xuICAgKiBgQ2Fubm90IHJlZGVmaW5lIHByb3BlcnR5YC4gVGhhdCBpcyBKUyBzZW1hbnRpY3MsIG5vdCBhIGJ1ZyB0byByb3V0ZSBhcm91bmQuIEV2ZXJ5IG90aGVyIGdsb2JhbCBzdGF5c1xuICAgKiBjb25maWd1cmFibGUgYW5kIHN0dWJzIG5vcm1hbGx5LlxuICAgKlxuICAgKiBQdXNoIGEgZmlsZSBoZXJlIGFuZCBpdCBsZWF2ZXMgYHVuaXQtdGVzdHNgIGZvciBhIHNpYmxpbmcgYHVuaXQtdGVzdHM6Z2xvYmFsLXN0dWJzYCBwcm9qZWN0IHRoYXQgaXNcbiAgICogaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHBvb2wsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IG9uZS4gQSBwbHVnaW4ncyBgdGVzdGAgYW5kIGB0ZXN0OmNvdmVyYWdlYCBzY3JpcHRzXG4gICAqIG5hbWUgYHVuaXQtdGVzdHNgLCB3aGljaCBhbHNvIHNlbGVjdHMgZXZlcnkgYHVuaXQtdGVzdHM6KmAgcHJvamVjdCwgc28gdGhlIHNpYmxpbmcgcnVucyBhbmQgaXMgY292ZXJlZFxuICAgKiB3aXRob3V0IGEgc2NyaXB0IGNoYW5nZS4gSXQgaXMgZW1pdHRlZCBvbmx5IHdoZW4gdGhpcyBsaXN0IGlzIG5vbi1lbXB0eS5cbiAgICpcbiAgICogVG8ga2VlcCBhIHdob2xlIHN1aXRlIG9uIHRoZSBkZWZhdWx0IHBvb2wgaW5zdGVhZCwgc2V0IGB1bml0VGVzdHMucG9vbGAgdG8gYCdmb3JrcydgIGFuZCBzYXkgd2h5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdsb2JhbFN0dWJUZXN0RmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBtdWx0aXBsaWVyIGFwcGxpZWQgdG8gYSBwcm9qZWN0J3MgdGVzdCBidWRnZXQgdG8gZ2V0IGl0cyBob29rIGJ1ZGdldC4gQSBob29rIHR5cGljYWxseSBwb3B1bGF0ZXNcbiAgICogYW5kIG9wZW5zIGEgdmF1bHQsIHNvIGl0IG5lZWRzIHNldmVyYWwgdGltZXMgd2hhdCBhIHNpbmdsZSB0ZXN0IGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA0YFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhvb2tUaW1lb3V0TXVsdGlwbGllciA9IEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSO1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOm5vLWFwcGAgcHJvamVjdCwgcnVubmluZyB0aGUgc3VpdGVzIHRoYXQgbmVlZCBubyBPYnNpZGlhbiBpbnN0YW5jZSBhdCBhbGwuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm9BcHA6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IHtcbiAgICBlbnZpcm9ubWVudDogJ25vZGUnLFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgaG9va1RpbWVvdXQ6IElOVEVHUkFUSU9OX1RFU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgKiBIT09LX1RJTUVPVVRfTVVMVElQTElFUixcbiAgICBpbmNsdWRlOiBbTk9fQVBQX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpuby1hcHAnLFxuICAgIHRlc3RUaW1lb3V0OiBJTlRFR1JBVElPTl9URVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItZXZhbCBjYXAgdGhlIHBlcmZvcm1hbmNlIGludGVncmF0aW9uIHByb2plY3QgZ2l2ZXMgaXRzIENEUCB0cmFuc3BvcnQsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwMGBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJmb3JtYW5jZUV2YWxDYXBJbk1pbGxpc2Vjb25kcyA9IFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIHBlci10ZXN0IGJ1ZGdldCBvZiB0aGUgcGVyZm9ybWFuY2UgaW50ZWdyYXRpb24gcHJvamVjdCwgaW4gbWlsbGlzZWNvbmRzLiBBIHBlcmZvcm1hbmNlIHZhdWx0IGlzXG4gICAqIHByZS1wb3B1bGF0ZWQgd2l0aCB0ZW5zIG9mIHRob3VzYW5kcyBvZiBub3RlcyBiZWZvcmUgT2JzaWRpYW4gb3BlbnMsIHNvIGJvdGggaXRzIHNldHVwIGFuZCBpdHMgdGVzdHNcbiAgICogbmVlZCBmYXIgbW9yZSB0aW1lIHRoYW4gdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMuXG4gICAqXG4gICAqIExpa2UgdGhlIHJlZ3VsYXIgYnVkZ2V0LCBpdCBDTEVBUlMgdGhlIHByb2plY3QncyBwZXItZXZhbCBjYXBcbiAgICogKHtAbGluayBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQucGVyZm9ybWFuY2VFdmFsQ2FwSW5NaWxsaXNlY29uZHN9KSByYXRoZXIgdGhhbiBtYXRjaGluZyBpdCxcbiAgICogc28gYW4gZXZhbHVhdGlvbiB0aGF0IG91dHJ1bnMgdGhlIGNhcCByZXBvcnRzIGl0c2VsZiBpbnN0ZWFkIG9mIGR5aW5nIGFzIHZpdGVzdCdzIGFub255bW91cyB0aW1lb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjE1MDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlVGltZW91dEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRlcnMgdGhlIHJ1biBwcmludHMgdGhyb3VnaC5cbiAgICpcbiAgICogUGlubmVkIHJhdGhlciB0aGFuIGxlZnQgdG8gdml0ZXN0LCB3aGljaCByZXNvbHZlcyBhbiB1bnNldCBgcmVwb3J0ZXJzYCBkaWZmZXJlbnRseSBmb3IgYSBkZXZlbG9wZXJcbiAgICogYW5kIGZvciBhbiBBSSBjb2Rpbmcgc2Vzc2lvbiDigJQgc2VlIHtAbGluayBERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlN9IGZvciB0aGUgd2hvbGUgb2Ygd2h5LCBhbmQgZm9yXG4gICAqIHdoYXQgaXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyB0byB2aXRlc3QgNSBpdHNlbGYuXG4gICAqXG4gICAqIFB1c2ggb250byBpdCB0byBhZGQgYSByZXBvcnRlciBiZXNpZGUgdGhlIHBpbm5lZCBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlN9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ZXJzOiBPYnNpZGlhblBsdWdpblZpdGVzdFJlcG9ydGVyW10gPSBbLi4uREVGQVVMVF9WSVRFU1RfUkVQT1JURVJTXTtcblxuICAvKipcbiAgICogVGhlIGB1bml0LXRlc3RzYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBtb2NrZWQtT2JzaWRpYW4gc3VpdGVzIGluIGBqc2RvbWAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5pdFRlc3RzOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdqc2RvbScsXG4gICAgZXhjbHVkZTogWy4uLlNIQVJFRF9FWENMVURFLCBJTlRFR1JBVElPTl9URVNUX0ZJTEVTXSxcbiAgICAvLyBBIHRocmVhZHMvZm9ya3MgcG9vbCBvcHRpb24gdGhhdCBzdGlsbCByZWFjaGVzIHRoZSB3b3JrZXIgdW5kZXIgdGhlIFZNIHBvb2wgYmVsb3c6IG1lYXN1cmVkXG4gICAgLy8gMjAyNi0wOS0xNiwgYHByb2Nlc3MuZXhlY0FyZ3ZgIGNhcnJpZXMgaXQgYW5kIE5vZGUncyBvd24gYGxvY2FsU3RvcmFnZWAgZGVzY3JpcHRvciBpcyBnb25lLCBhcyBpdFxuICAgIC8vIGlzIHVuZGVyIGB0aHJlYWRzYC4gV2l0aG91dCB0aGUgZmxhZyB0aGUgZGVzY3JpcHRvciBpcyBiYWNrIHVuZGVyIGJvdGggcG9vbHMuXG4gICAgZXhlY0FyZ3Y6IFsnLS1uby13ZWJzdG9yYWdlJ10sXG4gICAgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ3VuaXQtdGVzdHMnLFxuICAgIC8qXG4gICAgICogVGhlIGRlZmF1bHQgcG9vbCBjb25zdHJ1Y3RzIG9uZSBqc2RvbSBwZXIgdGVzdCBmaWxlLCBhbmQgdGhhdCBjb25zdHJ1Y3Rpb24sIG5vdCB0aGUgdGVzdHMsIHdhc1xuICAgICAqIHRoZSB1bml0IHN1aXRlJ3MgY29zdDogNjclIG9mIHRyYWNrZWQgdGltZSBpbiBgb2JzaWRpYW4tZGV2LXV0aWxzYCcgb3duIHN1aXRlLiBBIFZNIHBvb2wgYnVpbGRzXG4gICAgICogdGhlIGpzZG9tIG9uY2UgcGVyIHdvcmtlciBhbmQgZ2l2ZXMgZWFjaCBmaWxlIGEgZnJlc2ggVk0gY29udGV4dCwgc28gcGVyLWZpbGUgaXNvbGF0aW9uIGhvbGRzLlxuICAgICAqIE1lYXN1cmVkIHRoZXJlIG9uIDIwMjYtMDktMTU6IHRoZSBqc2RvbSBwcm9qZWN0IDM2LjA2cyAtPiA5LjkycywgYGNvdmVyYWdlL2xjb3YuaW5mb2BcbiAgICAgKiBieXRlLWlkZW50aWNhbCB0byB0aGUgZGVmYXVsdCBwb29sJ3MsIGFuZCBubyBET00sIGBnbG9iYWxUaGlzYCBvciBwcm90b3R5cGUgc3RhdGUgY3Jvc3NpbmcgZmlsZXMuXG4gICAgICogYGlzb2xhdGU6IGZhbHNlYCwgdGhlIG90aGVyIHJlbWVkeSB2aXRlc3Qgc3VnZ2VzdHMsIHdhcyBzbG93ZXIgKDkxLjYycykgYW5kIGJyb2tlIDY4IHRlc3RzLlxuICAgICAqIFRoZSBvbmUgY29zdCBpcyByZWRlZmluaW5nIGB3aW5kb3dgLCBgZG9jdW1lbnRgLCBgbG9jYXRpb25gIG9yIGB0b3BgOiBzZWUgYGdsb2JhbFN0dWJUZXN0RmlsZXNgLlxuICAgICAqL1xuICAgIHBvb2w6ICd2bVRocmVhZHMnLFxuICAgIHNlcnZlcjoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRlcHNgIGlzIGRlY2xhcmVkIGJ5IGB2aXRlc3RgOyByZW5hbWluZyBpdCBoZXJlIHdvdWxkIG5vdCBtYXRjaCB0aGUgQVBJLlxuICAgICAgZGVwczoge1xuICAgICAgICBpbmxpbmU6IFsnQG1uYW91bW92JywgJ0BvYnNpZGlhbi10eXBpbmdzJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIHNldHVwRmlsZXM6IFtcbiAgICAgICdvYnNpZGlhbi10ZXN0LW1vY2tzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0L3ZpdGVzdC1zZXR1cCdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBzZWVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgcHJvamVjdHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb2JzaWRpYW5WZXJzaW9uID0gcHJvY2Vzcy5lbnZbT0JTSURJQU5fVkVSU0lPTl9FTlZfVkFSSUFCTEVfTkFNRV07XG5cbiAgICAvKlxuICAgICAqIFN1cHBvcnQgaXMgdGhlIHJhbmdlIFtsYXRlc3QgcHVibGljLCBsYXRlc3QgY2F0YWx5c3RdIGFuZCBCT1RIIGVuZHMgbXVzdCB3b3JrLCBzbyB0aGUgdmVyc2lvblxuICAgICAqIGlzIGEga25vYiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGUga2V5IGlzIGFkZGVkIE9OTFkgd2hlbiB0aGUgdmFyaWFibGUgaXMgc2V0OiBhbiBleHBsaWNpdFxuICAgICAqIGBvYnNpZGlhblZlcnNpb25gIG1ha2VzIHRoZSBoYXJuZXNzIHJlc29sdmUgYSBjb25jcmV0ZSB2ZXJzaW9uIGFuZCBzd2FwIHRoZSBhc2FyLCB3aGljaCBpcyBub3Qgd2hhdFxuICAgICAqIGFuIHVucGlubmVkIHJ1biBkb2VzLCBzbyBzZWVkaW5nIGEgZGVmYXVsdCBoZXJlIHdvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXZlcnkgcGx1Z2luLlxuICAgICAqL1xuICAgIGlmIChvYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZXNrdG9wLmVudmlyb25tZW50T3B0aW9ucyA9IHtcbiAgICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgICBvYnNpZGlhblZlcnNpb24sXG4gICAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zID0ge30pOiBWaXRlVXNlckNvbmZpZyB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KCk7XG5cbiAgaWYgKG9wdGlvbnMuZWRpdENvbnRleHQpIHtcbiAgICBvcHRpb25zLmVkaXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tUHJvamVjdHMgPSBvcHRpb25zLmN1c3RvbVByb2plY3RzPy4oY29udGV4dCkgPz8gW107XG4gIHZhbGlkYXRlQ3VzdG9tUHJvamVjdHMoY3VzdG9tUHJvamVjdHMpO1xuXG4gIGNvbnN0IHVuaXRUZXN0c1Jlc29sdmUgPSB7XG4gICAgYWxpYXM6IHtcbiAgICAgIG9ic2lkaWFuOiAnb2JzaWRpYW4tdGVzdC1tb2Nrcy9vYnNpZGlhbidcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdsb2JhbFN0dWJUZXN0RmlsZXMgPSBbLi4uY29udGV4dC5nbG9iYWxTdHViVGVzdEZpbGVzXTtcbiAgY29uc3QgdW5pdFRlc3RzOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBnbG9iYWxTdHViVGVzdEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgID8gY29udGV4dC51bml0VGVzdHNcbiAgICA6IHsgLi4uY29udGV4dC51bml0VGVzdHMsIGV4Y2x1ZGU6IFsuLi5jb250ZXh0LnVuaXRUZXN0cy5leGNsdWRlID8/IFtdLCAuLi5nbG9iYWxTdHViVGVzdEZpbGVzXSB9O1xuICBjb25zdCBnbG9iYWxTdHVic1Byb2plY3RzOiBUZXN0UHJvamVjdENvbmZpZ3VyYXRpb25bXSA9IGdsb2JhbFN0dWJUZXN0RmlsZXMubGVuZ3RoID09PSAwXG4gICAgPyBbXVxuICAgIDogW3tcbiAgICAgIHJlc29sdmU6IHVuaXRUZXN0c1Jlc29sdmUsXG4gICAgICB0ZXN0OiB7XG4gICAgICAgIC4uLmNvbnRleHQudW5pdFRlc3RzLFxuICAgICAgICBpbmNsdWRlOiBnbG9iYWxTdHViVGVzdEZpbGVzLFxuICAgICAgICBuYW1lOiBVTklUX1RFU1RfR0xPQkFMX1NUVUJTX1BST0pFQ1RfTkFNRSxcbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgcG9vbCwgbmFtZWQgcmF0aGVyIHRoYW4gb21pdHRlZCBzbyB0aGUgc3ByZWFkIGFib3ZlIGNhbm5vdCBjYXJyeSB0aGUgVk0gcG9vbCBvdmVyLlxuICAgICAgICBwb29sOiAnZm9ya3MnXG4gICAgICB9XG4gICAgfV07XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XG4gICAgdGVzdDoge1xuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgZXhjbHVkZTogY29udGV4dC5jb3ZlcmFnZUV4Y2x1ZGUsXG4gICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyoudHMnXSxcbiAgICAgICAgcHJvdmlkZXI6ICd2OCcsXG4gICAgICAgIHJlcG9ydGVyOiBbJ3RleHQnLCAnbGNvdicsICdodG1sJ10sXG4gICAgICAgIHJlcG9ydHNEaXJlY3Rvcnk6ICcuL2NvdmVyYWdlJ1xuICAgICAgfSxcbiAgICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERV0sXG4gICAgICBnbG9iYWxzOiBmYWxzZSxcbiAgICAgIC8qXG4gICAgICAgKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gcm9vdC1sZXZlbCBgaW5jbHVkZWAgaGVyZSwgYW5kIHJlc3RvcmluZyBvbmUgYnJlYWtzIGV2ZXJ5IHByb2plY3QuXG4gICAgICAgKiBVbmRlciB2aXRlc3QgNCBhIHByb2plY3QncyBvd24gYGluY2x1ZGVgIHJlcGxhY2VkIHRoZSByb290IG9uZSwgc28gYSByb290XG4gICAgICAgKiBgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU11gIHdhcyBtZXJlbHkgcmVkdW5kYW50IOKAlCB0aGUgYHVuaXQtdGVzdHNgIHByb2plY3QgYWxyZWFkeSBkZWNsYXJlc1xuICAgICAgICogdGhhdCBzYW1lIGdsb2IgZm9yIGl0c2VsZi4gVW5kZXIgdml0ZXN0IDUgdGhlIHByb2plY3QgZ2xvYiBubyBsb25nZXIgcmVwbGFjZXMgaXQsIGFuZFxuICAgICAgICogYHNyYy8qKlxcLyoudGVzdC50c2AgaXMgYSBzdXBlcnNldCBvZiBldmVyeSBwcm9qZWN0IGdsb2IsIHNvIEVWRVJZIHByb2plY3QgY29sbGVjdGVkIEVWRVJZIHRlc3RcbiAgICAgICAqIGZpbGU6IHVuaXQgc3VpdGVzIHJhbiBpbiB0aGUgQ0RQIGludGVncmF0aW9uIGVudmlyb25tZW50IGFuZCBkaWVkIG9uIGBGYWlsZWQgdG8gcmVzb2x2ZSBlbnRyeVxuICAgICAgICogZm9yIHBhY2thZ2UgXCJvYnNpZGlhblwiYCwgdGhlIHNjcmVlbnNob3QtY2FwdHVyZSBzdWl0ZXMgcmFuIGFuZCByZXdyb3RlIGNoZWNrZWQtaW4gUE5HcywgYW5kIHRoZVxuICAgICAgICogYW5kcm9pZCAvIGRlbW8tdmF1bHQgc3VpdGVzIHJhbiB1bmRlciB0aGUgZGVza3RvcCB0cmFuc3BvcnQuIE1lYXN1cmVkIGluIGEgY29uc3VtZXI6IHRoZSBkZXNrdG9wXG4gICAgICAgKiBwcm9qZWN0IGNvbGxlY3RlZCAyMjcgZmlsZXMgaW5zdGVhZCBvZiBpdHMgb3duIDEwNSwgYW5kIGRlbGV0aW5nIHRoaXMgb25lIGxpbmUgcmVzdG9yZWQgMTA1LlxuICAgICAgICovXG4gICAgICBwYXNzV2l0aE5vVGVzdHM6IHRydWUsXG4gICAgICBwcm9qZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZTogdW5pdFRlc3RzUmVzb2x2ZSxcbiAgICAgICAgICB0ZXN0OiB1bml0VGVzdHNcbiAgICAgICAgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0Lm5vQXBwIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wUGVyZm9ybWFuY2UgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0LmFuZHJvaWQgfSxcbiAgICAgICAgLi4uZ2xvYmFsU3R1YnNQcm9qZWN0cyxcbiAgICAgICAgLi4uY3VzdG9tUHJvamVjdHNcbiAgICAgIF0sXG4gICAgICByZXBvcnRlcnM6IFsuLi5jb250ZXh0LnJlcG9ydGVyc11cbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBjdXN0b20gcHJvamVjdCB0aGF0IGRlY2xhcmVzIG5vIGBpbmNsdWRlYCBnbG9iIG9mIGl0cyBvd24uXG4gKlxuICogVGhlIHJvb3Qgc2VjdGlvbiBkZWxpYmVyYXRlbHkgZGVjbGFyZXMgbm8gYGluY2x1ZGVgIChzZWUgdGhlIGNvbW1lbnQgb24gaXQgYWJvdmUpLCBzbyBhIHByb2plY3QgdGhhdFxuICogZGVjbGFyZXMgbm9uZSBmYWxscyBiYWNrIHRvIHZpdGVzdCdzIG93biBkZWZhdWx0IGdsb2Ig4oCUIHdoaWNoIG1hdGNoZXMgRVZFUlkgdGVzdCBmaWxlIGluIHRoZSByZXBvLlxuICogVGhhdCBwcm9qZWN0IHRoZW4gcnVucyB0aGUgdW5pdCBzdWl0ZXMgaW4gYW4gT2JzaWRpYW4gZW52aXJvbm1lbnQsIHRoZSBhbmRyb2lkIHN1aXRlcyB1bmRlciB0aGVcbiAqIGRlc2t0b3AgdHJhbnNwb3J0LCBhbmQgdGhlIGAqLWNhcHR1cmUuYCBzY3JlZW5zaG90IHN1aXRlcyB0aGF0IG9wZW4gYSB3aW5kb3cgYW5kIHJld3JpdGUgY2hlY2tlZC1pblxuICogUE5Hcy4gQSB3aWRlbmVkIHByb2plY3QgaXMgc2lsZW50OiBpdCBwYXNzZXMsIHNsb3dseSwgaGF2aW5nIGRvbmUgYWxsIG9mIHRoYXQuXG4gKlxuICogT25seSBhIHBsYWluIGlubGluZSBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGVja2VkIGhlcmUuIEEgcHJvamVjdCBuYW1lZCBieSBhIGdsb2Igc3RyaW5nLCBidWlsdCBieSBhXG4gKiBmdW5jdGlvbiwgb3IgYXdhaXRlZCBmcm9tIGEgcHJvbWlzZSBpcyByZXNvbHZlZCBieSB2aXRlc3QgaXRzZWxmLCBvdXQgb2YgdGhpcyBmdW5jdGlvbidzIHJlYWNoLlxuICpcbiAqIEBwYXJhbSBjdXN0b21Qcm9qZWN0cyAtIFRoZSBwcm9qZWN0cyByZXR1cm5lZCBieSB7QGxpbmsgRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zLmN1c3RvbVByb2plY3RzfS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDdXN0b21Qcm9qZWN0cyhjdXN0b21Qcm9qZWN0czogVGVzdFByb2plY3RDb25maWd1cmF0aW9uW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGN1c3RvbVByb2plY3RdIG9mIGN1c3RvbVByb2plY3RzLmVudHJpZXMoKSkge1xuICAgIGlmICh0eXBlb2YgY3VzdG9tUHJvamVjdCAhPT0gJ29iamVjdCcgfHwgJ3RoZW4nIGluIGN1c3RvbVByb2plY3QpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGUgPSBjdXN0b21Qcm9qZWN0LnRlc3Q/LmluY2x1ZGU7XG5cbiAgICBpZiAoaW5jbHVkZSAmJiBpbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBjdXN0b21Qcm9qZWN0LnRlc3Q/Lm5hbWU7XG4gICAgY29uc3QgbGFiZWwgPSB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgPyBuYW1lIDogbmFtZT8ubGFiZWwgPz8gYGF0IGluZGV4ICR7U3RyaW5nKGluZGV4KX1gO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBjdXN0b20gdml0ZXN0IHByb2plY3QgJHtsYWJlbH0gZGVjbGFyZXMgbm8gXFxgdGVzdC5pbmNsdWRlXFxgLCBzbyB2aXRlc3QgZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdCBnbG9iIGFuZCB0aGUgcHJvamVjdCBjb2xsZWN0cyBFVkVSWSB0ZXN0IGZpbGUg4oCUIGluY2x1ZGluZyB0aGUgXFxgKi1jYXB0dXJlLlxcYCBzdWl0ZXMgdGhhdCByZXdyaXRlIGNoZWNrZWQtaW4gc2NyZWVuc2hvdHMuIERlY2xhcmUgYW4gZXhwbGljaXQgXFxgaW5jbHVkZVxcYCwgb3Igc3ByZWFkIGEgc3RhbmRhcmQgcHJvamVjdCAoXFxgLi4uY29udGV4dC5kZXNrdG9wXFxgKSBhbmQgb3ZlcnJpZGUgaXQuYFxuICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLGFBQWE7QUFDcEIsU0FBUyx3Q0FBd0M7QUFDakQsU0FBUyxvQkFBb0I7QUFFN0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFxQ1AsTUFBTSw0Q0FBNEM7QUFPbEQsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSwwQkFBMEI7QUFPaEMsTUFBTSxzQ0FBc0MsdUNBQXVDO0FBUzVFLE1BQU0sMkNBQTJDLG1DQUFtQztBQUUzRixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGlDQUFpQyxXQUFX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
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2hhcmVkIHZpdGVzdCBjb25maWd1cmF0aW9uIGZvciBPYnNpZGlhbiBwbHVnaW5zLlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBpbiB0aGUgd29ya3NwYWNlIGRlY2xhcmVzIHRoZSBzYW1lIGZpdmUgdml0ZXN0IHByb2plY3RzIOKAlCBgdW5pdC10ZXN0c2AgcGx1cyB0aGVcbiAqIGBpbnRlZ3JhdGlvbi10ZXN0czp7bm8tYXBwLGRlc2t0b3AsZGVza3RvcC1wZXJmb3JtYW5jZSxhbmRyb2lkfWAgZmFtaWx5IOKAlCB3aXRoIHRoZSBzYW1lIHRpbWVvdXRzLFxuICogYHNldHVwRmlsZXNgLCBhbmQgYGdsb2JhbFNldHVwYCB3aXJpbmcuIE1haW50YWluaW5nIHRoYXQgcGVyIHJlcG8gbWVhbnMgYSBjb252ZW50aW9uIGNoYW5nZSBjb3N0cyBvbmVcbiAqIG5lYXItaWRlbnRpY2FsIGVkaXQgcGVyIHBsdWdpbiwgYW5kIGFueSByZXBvIHRoYXQgaXMgbWlzc2VkIGRyaWZ0cyBzaWxlbnRseS4gVGhpcyBtb2R1bGUgb3ducyB0aGF0XG4gKiBjb25maWd1cmF0aW9uIG9uY2UsIHNvIGEgcGx1Z2luJ3MgYHNjcmlwdHMvdml0ZXN0LWNvbmZpZy50c2AgY29sbGFwc2VzIHRvIGEgc2luZ2xlIGNhbGwuXG4gKlxuICogVGhlIHNlYW0gbWlycm9ycyB0aGUgRVNMaW50IG9uZSAoYGRlZmluZUVzbGludENvbmZpZ3NgKTogdGhlIGZhY3RvcnkgYnVpbGRzIGEgY29udGV4dCBob2xkaW5nIHRoZSBzdGFuZGFyZCBwcm9qZWN0cywgdGhlIGNhbGxlciBlZGl0c1xuICogaXQgaW4gcGxhY2UgdGhyb3VnaCB7QGxpbmsgRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zLmVkaXRDb250ZXh0fSwgYW5kIGFwcGVuZHMgYW55XG4gKiBwcm9qZWN0IHRoZSBiYXNlIGRvZXMgbm90IGtub3cgYWJvdXQgdGhyb3VnaFxuICoge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5jdXN0b21Qcm9qZWN0c30uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaXRlc3RSZXBvcnRlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L3Rlc3QtcnVubmVycy92aXRlc3QtY29uZmlnJztcbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQge1xuICBERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlMsXG4gIERFRkFVTFRfVklURVNUX1RFU1RfRVhDTFVERVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyxcbiAgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVfU1VGRklYLFxuICBQRVJGT1JNQU5DRV9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFNcbn0gZnJvbSAnLi9wZXJmb3JtYW5jZS1ldmFsLWNhcC50cyc7XG5cbi8qKlxuICogVGhlIGB0ZXN0YCBzZWN0aW9uIG9mIGEgc2luZ2xlIHZpdGVzdCBwcm9qZWN0IGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBOb25OdWxsYWJsZTxUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb25bJ3Rlc3QnXT47XG5cbi8qKlxuICogT25lIGVudHJ5IG9mIGEgdml0ZXN0IGByZXBvcnRlcnNgIGxpc3Q6IHRoZSBuYW1lIG9mIGEgYnVpbHQtaW4gcmVwb3J0ZXIgb3IgYSByZXBvcnRlciBpbnN0YW5jZS4gVGhlIHNhbWUgc2hhcGUgYXNcbiAqIHRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24ncyB7QGxpbmsgVml0ZXN0UmVwb3J0ZXJ9LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFJlcG9ydGVyID0gVml0ZXN0UmVwb3J0ZXI7XG5cbi8vIFRoZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24ncyBwaW5uZWQgcmVwb3J0ZXJzLCByZS1leHBvcnRlZCBzbyBhIHBsdWdpbiByZXBvIHRoYXQgYXNzZW1ibGVzIGl0cyB2aXRlc3QgcHJvamVjdHMgYnlcbi8vIGhhbmQgbmVlZHMgb25seSB0aGlzIHBhY2thZ2UuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZXhwb3J0LWZyb20gLS0gVGhlIGJpbmRpbmcgaXMgYWxzbyB1c2VkIGJlbG93LCBzbyBpdCBpcyBpbXBvcnRlZCBvbmNlLlxuZXhwb3J0IHsgREVGQVVMVF9WSVRFU1RfUkVQT1JURVJTIH07XG5cbi8qXG4gKiBIb3cgbXVjaCBhIHByb2plY3QncyBwZXItdGVzdCBidWRnZXQgY2xlYXJzIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AgYnkg4oCUIHRoZSBwZXItZXZhbCBjYXBcbiAqIEJPVEggdHJhbnNwb3J0cyBlbmZvcmNlLCByZXN0YXRlZCBpbiBgcGVyZm9ybWFuY2UtZXZhbC1jYXAudHNgICh0aGUgaGFybmVzcyBpcyBhbiBvcHRpb25hbCBwZWVyKSBhbmQgcGlubmVkXG4gKiB0aGVyZSB0byB0aGUgaGFybmVzcydzIG93biBjb25zdGFudCBieSBhIHVuaXQgdGVzdCwgc28gdGhlIGJ1ZGdldHMgYmVsb3cgYW5kIHRoZSBjYXAgdGhleSBhcmUgc2l6ZWQgYWdhaW5zdFxuICogY2FuIG5ldmVyIGJlIHR3byBudW1iZXJzLiBPbmUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlXG4gKiBnZXRzIHRoYXQgbXVjaCBhbmQgbm8gbW9yZSwgbWVhc3VyZWQgZnJvbSB0aGUgbW9tZW50IHRoZSB0cmFuc3BvcnQgZGlzcGF0Y2hlcyBpdDsgb3V0cnVubmluZyBpdCByYWlzZXNcbiAqIGBFdmFsQ2FwRXhjZWVkZWRFcnJvcmAsIHdoaWNoIG5hbWVzIHRoZSBjYXAsIHRoZSB0cmFuc3BvcnQgdGhhdCBlbmZvcmNlZCBpdCwgYW5kIHRoZSBgcG9sbEluT2JzaWRpYW5gXG4gKiByZW1lZHkg4oCUIHRoZSBvbmUgbWVzc2FnZSB0aGF0IHR1cm5zIFwidGhpcyB0aW1lZCBvdXRcIiBpbnRvIFwidGhpcyBjbG9zdXJlIGFza2VkIGZvciBtb3JlIHRpbWUgdGhhblxuICogZXhpc3RzXCIuXG4gKlxuICogQSB0ZXN0IGJ1ZGdldCBFUVVBTCB0byB0aGUgY2FwIG1ha2VzIHRoZSBjYXAncyBvd24gZGlhZ25vc2lzIHVucmVhY2hhYmxlOiB2aXRlc3Qgc3RhcnRzIGl0cyBjbG9jayBhdFxuICogdGhlIHRvcCBvZiB0aGUgdGVzdCBhbmQgdGhlIHRyYW5zcG9ydCBzdGFydHMgaXRzIG93biBvbmx5IG9uY2UgdGhlIGV2YWwgaXMgZGlzcGF0Y2hlZCwgc28gdml0ZXN0IGFsd2F5c1xuICogd2lucyBieSB0aGUgZmV3IG1pbGxpc2Vjb25kcyBpbiBiZXR3ZWVuIGFuZCByZXBvcnRzIGl0cyBhbm9ueW1vdXMgYFRlc3QgdGltZWQgb3V0IGluIDMwMDAwbXNgLiBUaGF0IGlzXG4gKiBub3QgYSBoeXBvdGhldGljYWwg4oCUIGl0IGlzIGhvdyBldmVyeSBvdmVyLWNhcCBkZXNrdG9wIGV2YWwgaGFkIHN1cmZhY2VkIGhlcmUgdW50aWwgdGhpcyBtYXJnaW4gZXhpc3RlZCxcbiAqIGFuZCBvbmUgb2YgdGhlbSBhYm9ydGVkIGFuIG90aGVyd2lzZSBncmVlbiByZWxlYXNlIGZpdmUgbWludXRlcyBpbnRvIHRoZSBwcmVmbGlnaHQgd2l0aCBubyBpbmRpY2F0aW9uXG4gKiBvZiB3aGljaCB3YWl0IHdhcyB0byBibGFtZSAobWVhc3VyZWQgMjAyNi0wOS0xNTogMzAwNDQgbXMgYnVybmVkIGFnYWluc3QgYSAzMDAwMCBtcyBidWRnZXQpLlxuICpcbiAqIFRoZSBtYXJnaW4gaGFzIHRvIGNvdmVyIGV2ZXJ5dGhpbmcgYSB0ZXN0IGRvZXMgQkVGT1JFIHRoZSBldmFsIHRoYXQgaGFuZ3Mg4oCUIGVhcmxpZXIgb25lcyBpbmNsdWRlZCDigJRcbiAqIHNvIGl0IGlzIGEgaGVhbHRoeSBmcmFjdGlvbiBvZiB0aGUgY2FwIHJhdGhlciB0aGFuIGEgY291cGxlIG9mIHNlY29uZHMuXG4gKi9cbmNvbnN0IFRSQU5TUE9SVF9FVkFMX0NBUF9NQVJHSU5fSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKlxuICogQW5kcm9pZCB3YXMgbmV2ZXIgYWZmZWN0ZWQsIGFuZCB0aGF0IGFzeW1tZXRyeSBpcyB0aGUgZXZpZGVuY2UgdGhlIGRlc2t0b3AgZXF1YWxpdHkgd2FzIGFuIG92ZXJzaWdodFxuICogcmF0aGVyIHRoYW4gYSBkZWNpc2lvbjogaXRzIGJ1ZGdldCBoYXMgYWx3YXlzIGJlZW4gZG91YmxlIHRoZSBBcHBpdW0gY2FwLCBzbyBhbiBvdmVyLWNhcCBtb2JpbGUgY2xvc3VyZVxuICogaGFzIGFsd2F5cyBiZWVuIGFibGUgdG8gcmVwb3J0IGl0c2VsZi5cbiAqL1xuY29uc3QgQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSID0gNDtcblxuLypcbiAqIFRoZSBwZXJmb3JtYW5jZSBwcm9qZWN0J3MgYnVkZ2V0IGNsZWFycyBpdHMgb3duIHBlci1ldmFsIGNhcCBieSB0aGUgc2FtZSBtYXJnaW4sIGZvciB0aGUgc2FtZSByZWFzb25cbiAqIHRoZSByZWd1bGFyIGJ1ZGdldCBjbGVhcnMgdGhlIHRyYW5zcG9ydCBkZWZhdWx0OiBhbiBlcXVhbCBidWRnZXQgbGV0cyB2aXRlc3QncyBhbm9ueW1vdXMgdGltZW91dCB3aW5cbiAqIHRoZSByYWNlIGFnYWluc3QgdGhlIGNhcCdzIG93biBgRXZhbENhcEV4Y2VlZGVkRXJyb3JgLlxuICovXG5jb25zdCBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyArIFRSQU5TUE9SVF9FVkFMX0NBUF9NQVJHSU5fSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBFeHBvcnRlZCBiZWNhdXNlIGEgcmVwbyB0aGF0IGFzc2VtYmxlcyBpdHMgdml0ZXN0IHByb2plY3RzIGJ5IGhhbmQgaW5zdGVhZCBvZiB0aHJvdWdoXG4gKiB7QGxpbmsgZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWd9IHN0aWxsIG5lZWRzIHRoZSBzYW1lIHJlbGF0aW9uc2hpcCB0byB0aGUgcGVyLWV2YWwgY2FwLCBhbmRcbiAqIHJlc3RhdGluZyB0aGUgbnVtYmVyIHRoZXJlIGlzIGhvdyB0aGUgdHdvIGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgSU5URUdSQVRJT05fVEVTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTICsgVFJBTlNQT1JUX0VWQUxfQ0FQX01BUkdJTl9JTl9NSUxMSVNFQ09ORFM7XG5cbmNvbnN0IEFORFJPSURfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5hbmRyb2lkLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5jcm9zcy1wbGF0Zm9ybS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVTID0gJ3NyYy8qKi8qLmQudHMnO1xuY29uc3QgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVTID0gYHNyYy8qKi8qJHtERVNLVE9QX1BFUkZPUk1BTkNFX1RFU1RfRklMRV9TVUZGSVh9YDtcbmNvbnN0IERFU0tUT1BfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5kZXNrdG9wLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgSU5URUdSQVRJT05fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IE5PX0FQUF9URVNUX0ZJTEVTID0gJ3NyYy8qKi8qLm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IFVOSVRfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi50ZXN0LnRzJztcbmNvbnN0IFVOSVRfVEVTVF9HTE9CQUxfU1RVQlNfUFJPSkVDVF9OQU1FID0gJ3VuaXQtdGVzdHM6Z2xvYmFsLXN0dWJzJztcblxuLypcbiAqIFJ1bnMgYmVmb3JlIHRoZSBoYXJuZXNzJ3Mgb3duIHNldHVwIGluIGV2ZXJ5IHByb2plY3QgdGhhdCBsb2FkcyB0aGUgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvbWFpbi5qc2AsXG4gKiBhbmQgcmVmdXNlcyB0byBzdGFydCB3aGVuIHRoYXQgYnVpbGQgaXMgbWlzc2luZyBvciBvbGRlciB0aGFuIHRoZSBzb3VyY2UuIEEgcGx1Z2luJ3NcbiAqIGB0ZXN0OmludGVncmF0aW9uKmAgc2NyaXB0cyBjYWxsIHZpdGVzdCBkaXJlY3RseSBhbmQgbmV2ZXIgYnVpbGQsIHNvIHdpdGhvdXQgaXQgYSBzZXNzaW9uIHRoYXQgZWRpdHNcbiAqIGBzcmMvYCBhbmQgcnVucyBvbmUgaW50ZWdyYXRpb24gcHJvamVjdCB0ZXN0cyB0aGUgcHJldmlvdXMgYnVpbGQgYW5kIHJlYWRzIHRoZSByZXN1bHQgYXMgYSBkZWZlY3QuXG4gKi9cbmNvbnN0IFNUQUxFX0JVSUxEX0dMT0JBTF9TRVRVUCA9ICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQvdGVzdC1ydW5uZXJzL3N0YWxlLWJ1aWxkLWdsb2JhbC1zZXR1cCc7XG5cbmNvbnN0IE9CU0lESUFOX1ZFUlNJT05fRU5WX1ZBUklBQkxFX05BTUUgPSAnT0JTSURJQU5fVkVSU0lPTic7XG5jb25zdCBTSEFSRURfRVhDTFVERSA9IERFRkFVTFRfVklURVNUX1RFU1RfRVhDTFVERTtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBwcm9qZWN0cyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGtub3cgYWJvdXQsIHN1Y2ggYXMgYSBwbHVnaW4ncyBvd25cbiAgICogYGludGVncmF0aW9uLXRlc3RzOmRlbW8tdmF1bHRgIHByb2plY3QuIFRoZSByZXR1cm5lZCBwcm9qZWN0cyBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIGZpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIFRoZSBleHRyYSBwcm9qZWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVByb2plY3RzPzogKGNvbnRleHQ6IE9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnQ29udGV4dCkgPT4gVGVzdFByb2plY3RDb25maWd1cmF0aW9uW107XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBlZGl0cyB0aGUgdml0ZXN0IGNvbmZpZ3VyYXRpb24gY29udGV4dCBiZWZvcmUgaXQgaXMgYXNzZW1ibGVkIGludG8gYSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdENvbnRleHQ/OiAoY29udGV4dDogT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBjb250ZXh0IGZvciBkZWZpbmluZyBhIHBsdWdpbidzIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICpcbiAqIEV2ZXJ5IG1lbWJlciBpcyBsaXZlOiB0aGUgYXJyYXlzIGFuZCBvYmplY3RzIGl0IGV4cG9zZXMgYXJlIHRoZSB2ZXJ5IG9uZXMgdGhlIGFzc2VtYmxlZCBjb25maWd1cmF0aW9uXG4gKiBpcyBidWlsdCBmcm9tLCBzbyBlZGl0aW5nIHRoZW0gaW4gcGxhY2UgdGhyb3VnaFxuICoge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5lZGl0Q29udGV4dH0gaXMgd2hhdCBjdXN0b21pemVzIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQge1xuICAvKipcbiAgICogVGhlIGBpbnRlZ3JhdGlvbi10ZXN0czphbmRyb2lkYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBtb2JpbGUtb25seSBhbmQgY3Jvc3MtcGxhdGZvcm0gc3VpdGVzIGFnYWluc3QgYW5cbiAgICogQW5kcm9pZCBlbXVsYXRvciB0aHJvdWdoIEFwcGl1bS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhbmRyb2lkOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnM6IHtcbiAgICAgIG9ic2lkaWFuVHJhbnNwb3J0OiB7XG4gICAgICAgIGFwcGl1bVVybDogJ2h0dHA6Ly9sb2NhbGhvc3Q6NDcyMycsXG4gICAgICAgIGF2ZE5hbWU6ICdvYnNpZGlhbl90ZXN0JyxcbiAgICAgICAgdHlwZTogJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJ1xuICAgICAgfVxuICAgIH0sXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogW1NUQUxFX0JVSUxEX0dMT0JBTF9TRVRVUCwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtBTkRST0lEX1RFU1RfRklMRVMsIENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czphbmRyb2lkJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHBlci10ZXN0IGJ1ZGdldCBvZiB0aGUgQW5kcm9pZCBpbnRlZ3JhdGlvbiBwcm9qZWN0LCBpbiBtaWxsaXNlY29uZHMuIEJvb3RpbmcgYW4gZW11bGF0b3IgYW5kXG4gICAqIGRyaXZpbmcgaXQgb3ZlciBBcHBpdW0gaXMgc2xvd2VyIHRoYW4gdGhlIGRlc2t0b3AgcGF0aCwgaGVuY2UgaXRzIG93biBjb25zdGFudC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFuZHJvaWRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEl0IGRlbGliZXJhdGVseSBDTEVBUlMgdGhlIHRyYW5zcG9ydHMnIHBlci1ldmFsIGNhcCByYXRoZXIgdGhhbiBtYXRjaGluZyBpdCwgc28gdGhhdCBhIGNsb3N1cmUgd2hpY2hcbiAgICogb3V0cnVucyB0aGUgY2FwIGZhaWxzIHdpdGggdGhlIGhhcm5lc3MncyBgRXZhbENhcEV4Y2VlZGVkRXJyb3JgIOKAlCBuYW1pbmcgdGhlIGNhcCBhbmQgdGhlIHJlbWVkeSDigJRcbiAgICogaW5zdGVhZCBvZiB3aXRoIHZpdGVzdCdzIGFub255bW91cyB0aW1lb3V0LiBMb3dlcmluZyBpdCB0byB0aGUgY2FwIHJlc3RvcmVzIHRoYXQgYmxpbmQgc3BvdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDQ1MDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJpZ1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IElOVEVHUkFUSU9OX1RFU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb3ZlcmFnZSBgZXhjbHVkZWAgZ2xvYnMuIFB1c2ggb250byBpdCB0byBkcm9wIG1vcmUgZmlsZXMgZnJvbSB0aGUgY292ZXJhZ2UgcmVwb3J0LlxuICAgKlxuICAgKiBEZWNsYXJhdGlvbiBmaWxlcyBhcmUgZXhjbHVkZWQgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBjb3ZlcmFnZSBgaW5jbHVkZWAgYmVsb3cgaXMgYHNyYy8qKlxcLyoudHNgLFxuICAgKiB3aGljaCBhIGAuZC50c2AgbWF0Y2hlcy4gQSBkZWNsYXJhdGlvbiBmaWxlIGVtaXRzIG5vIHJ1bnRpbWUgY29kZSwgc28gaXQgcmVwb3J0cyAwJSBhbmQgbm8gdGVzdCBjYW5cbiAgICogZXZlciByYWlzZSBpdCDigJQgYSBwbHVnaW4gdGhhdCBncm93cyBvbmUgdW5kZXIgYHNyYy9gIHNpbGVudGx5IGxvc2VzIGl0cyAxMDAlIGdhdGUsIGFuZCB0aGUgdXN1YWxcbiAgICogcmVtZWR5IG9mIGFuIGlubGluZSBgdjggaWdub3JlYCBjb21tZW50IGRvZXMgbm90IGFwcGx5IHRvIGEgdHlwZS1vbmx5IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY292ZXJhZ2VFeGNsdWRlOiBzdHJpbmdbXSA9IFtVTklUX1RFU1RfRklMRVMsIERFQ0xBUkFUSU9OX0ZJTEVTXTtcblxuICAvKipcbiAgICogVGhlIGBpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBkZXNrdG9wLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFcbiAgICogcmVhbCBkZXNrdG9wIE9ic2lkaWFuIG92ZXIgQ0RQLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2t0b3A6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IHtcbiAgICBlbnZpcm9ubWVudDogJ25vZGUnLFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFtTVEFMRV9CVUlMRF9HTE9CQUxfU0VUVVAsICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IElOVEVHUkFUSU9OX1RFU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgKiBIT09LX1RJTUVPVVRfTVVMVElQTElFUixcbiAgICBpbmNsdWRlOiBbREVTS1RPUF9URVNUX0ZJTEVTLCBDUk9TU19QTEFURk9STV9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcCcsXG4gICAgc2V0dXBGaWxlczogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1zZXR1cCddLFxuICAgIHRlc3RUaW1lb3V0OiBJTlRFR1JBVElPTl9URVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcC1wZXJmb3JtYW5jZWAgcHJvamVjdCwgcnVubmluZyB0aGUgYXQtc2NhbGUgc3VpdGVzLiBJdCBpcyBkZWNsYXJlZCBmb3JcbiAgICogZXZlcnkgcGx1Z2luIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBzdWNoIHN1aXRlIHlldCDigJQgYHBhc3NXaXRoTm9UZXN0c2AgbWFrZXMgYW4gZW1wdHkgcHJvamVjdCBmcmVlLFxuICAgKiBhbmQgdGhlIG1hdGNoaW5nIGB0ZXN0OmludGVncmF0aW9uOmRlc2t0b3A6cGVyZm9ybWFuY2VgIHNjcmlwdCBleGlzdHMgaW4gZXZlcnkgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeS5cbiAgICpcbiAgICogQSBwbHVnaW4ncyBgdGVzdDppbnRlZ3JhdGlvbmAgYWdncmVnYXRlIGxlYXZlcyB0aGlzIHByb2plY3Qgb3V0IG9uIHB1cnBvc2UsIGFuZCBpdCBzdGF5cyBvdXQgZXZlbiBvbiBhXG4gICAqIG1hY2hpbmUgd2l0aCBhIGRlc2t0b3AgT2JzaWRpYW4gc2V0IHVwLiBUaGUgcmVhc29uIGlzIHRoZSBmaXh0dXJlIHJhdGhlciB0aGFuIHRoZSBjb3N0OiBhIHBlcmYgc3VpdGVcbiAgICogbmVlZHMgaXRzIG93biBnZW5lcmF0ZWQsIHBvcHVsYXRlZCB2YXVsdCwgc2l6ZWQgdGhyb3VnaCBlbnYgdmFycywgYW5kIHRoZSBhZ2dyZWdhdGUncyBzbWFsbCB0ZW1wb3JhcnlcbiAgICogdmF1bHQgaXMgdGhlIHdyb25nIG9uZS4gVGhlIDYwMCBzIGJlbG93IGlzIGEgdGltZW91dCwgbm90IGEgZHVyYXRpb24g4oCUIG1lYXN1cmVkIGVuZCB0byBlbmQsIG1vc3QgcGVyZlxuICAgKiBzdWl0ZXMgZmluaXNoIGluIHNlY29uZHMsIGFuZCBvbmx5IG9uZSB0aGF0IGdlbmVyYXRlcyB0ZW5zIG9mIHRob3VzYW5kcyBvZiBub3RlcyB0YWtlcyBtaW51dGVzLlxuICAgKlxuICAgKiBJdHMgQ0RQIHRyYW5zcG9ydCdzIHBlci1ldmFsIGNhcCBpcyByYWlzZWQgdG8gNjAwIHMgYXMgd2VsbCAodGhlIGJ1ZGdldCBjbGVhcnMgaXQgYnkgdGhlIHVzdWFsXG4gICAqIG1hcmdpbiksIGJlY2F1c2UgYSBwZXJmIHN1aXRlJ3Mgd2hvbGUgbWVhc3VyZW1lbnQgaXMgdHlwaWNhbGx5IE9ORSBsb25nIGluLXBhZ2UgZXZhbHVhdGlvbiwgd2hpY2ggdGhlXG4gICAqIHRyYW5zcG9ydCdzIDMwIHMgZGVmYXVsdCBraWxsZWQgYXMgYSBiYXJlIGBDRFAgY29tbWFuZCB0aW1lZCBvdXQg4oCmIFJ1bnRpbWUuZXZhbHVhdGVgIG5hbWluZyBuZWl0aGVyIHRoZVxuICAgKiB3YWl0IG5vciB0aGUgYXNzZXJ0aW9uLiBUaHJlZSBwbHVnaW5zIGhhZCBlYWNoIGhhbmQtd3JpdHRlbiB0aGlzIHJhaXNlIGluIHRoZWlyIG93biBgZWRpdENvbnRleHRgXG4gICAqIGJlZm9yZSBpdCBtb3ZlZCBoZXJlLiBVbmxpa2UgYSByYWlzZWQgZGVza3RvcCBjYXAsIHdoaWNoIGlzIGEgYmFja3N0b3AgcmF0aGVyIHRoYW4gYSBidWRnZXQgYSBjbG9zdXJlXG4gICAqIG1heSBzcGVuZCwgdGhpcyBvbmUgSVMgYSBidWRnZXQ6IGBuby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW5gIHJlYWRzIGl0IGZvciB0aGVzZSBmaWxlcyBhbmRcbiAgICogZm9yIG5vIG90aGVyLlxuICAgKlxuICAgKiBObyByb3V0aW5lIGNvbW1hbmQgcnVucyB0aGVtLCBidXQgc29tZXRoaW5nIGRvZXM6IGEgd2Vla2x5IHN3ZWVwIHJ1bnMgZXZlcnkgcGx1Z2luJ3NcbiAgICogYHRlc3Q6aW50ZWdyYXRpb246ZGVza3RvcDpwZXJmb3JtYW5jZWAsIHdoaWNoIGlzIGFsc28gaG93IHRvIHJlYWNoIHRoZW0gYnkgaGFuZC4gQWRkaW5nIHRoZW0gdG8gdGhhdFxuICAgKiBhZ2dyZWdhdGUgaXMgZHJpZnQsIG5vdCBhIGdhcCB0byBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNrdG9wUGVyZm9ybWFuY2U6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IHtcbiAgICBlbnZpcm9ubWVudDogJ25vZGUnLFxuICAgIGVudmlyb25tZW50T3B0aW9uczoge1xuICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfVxuICAgIH0sXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogW1NUQUxFX0JVSUxEX0dMT0JBTF9TRVRVUCwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2UnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHVuaXQgdGVzdCBmaWxlcyB0aGF0IHJlZGVmaW5lIGB3aW5kb3dgLCBgZG9jdW1lbnRgLCBgbG9jYXRpb25gIG9yIGB0b3BgLCB3aGljaCB0aGUgYHVuaXQtdGVzdHNgXG4gICAqIHByb2plY3QncyBWTSBwb29sIGNhbm5vdCBydW4uXG4gICAqXG4gICAqIFVuZGVyIGBwb29sOiAndm1UaHJlYWRzJ2AgdGhvc2UgZm91ciBhcmUgbm9uLWNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBWTSBnbG9iYWwsIHNvXG4gICAqIGB2aS5zdHViR2xvYmFsKCd3aW5kb3cnLCDigKYpYCBvciBgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2F0aW9uJywg4oCmKWAgdGhyb3dzXG4gICAqIGBDYW5ub3QgcmVkZWZpbmUgcHJvcGVydHlgLiBUaGF0IGlzIEpTIHNlbWFudGljcywgbm90IGEgYnVnIHRvIHJvdXRlIGFyb3VuZC4gRXZlcnkgb3RoZXIgZ2xvYmFsIHN0YXlzXG4gICAqIGNvbmZpZ3VyYWJsZSBhbmQgc3R1YnMgbm9ybWFsbHkuXG4gICAqXG4gICAqIFB1c2ggYSBmaWxlIGhlcmUgYW5kIGl0IGxlYXZlcyBgdW5pdC10ZXN0c2AgZm9yIGEgc2libGluZyBgdW5pdC10ZXN0czpnbG9iYWwtc3R1YnNgIHByb2plY3QgdGhhdCBpc1xuICAgKiBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgcG9vbCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgb25lLiBBIHBsdWdpbidzIGB0ZXN0YCBhbmQgYHRlc3Q6Y292ZXJhZ2VgIHNjcmlwdHNcbiAgICogbmFtZSBgdW5pdC10ZXN0c2AsIHdoaWNoIGFsc28gc2VsZWN0cyBldmVyeSBgdW5pdC10ZXN0czoqYCBwcm9qZWN0LCBzbyB0aGUgc2libGluZyBydW5zIGFuZCBpcyBjb3ZlcmVkXG4gICAqIHdpdGhvdXQgYSBzY3JpcHQgY2hhbmdlLiBJdCBpcyBlbWl0dGVkIG9ubHkgd2hlbiB0aGlzIGxpc3QgaXMgbm9uLWVtcHR5LlxuICAgKlxuICAgKiBUbyBrZWVwIGEgd2hvbGUgc3VpdGUgb24gdGhlIGRlZmF1bHQgcG9vbCBpbnN0ZWFkLCBzZXQgYHVuaXRUZXN0cy5wb29sYCB0byBgJ2ZvcmtzJ2AgYW5kIHNheSB3aHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2xvYmFsU3R1YlRlc3RGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIG11bHRpcGxpZXIgYXBwbGllZCB0byBhIHByb2plY3QncyB0ZXN0IGJ1ZGdldCB0byBnZXQgaXRzIGhvb2sgYnVkZ2V0LiBBIGhvb2sgdHlwaWNhbGx5IHBvcHVsYXRlc1xuICAgKiBhbmQgb3BlbnMgYSB2YXVsdCwgc28gaXQgbmVlZHMgc2V2ZXJhbCB0aW1lcyB3aGF0IGEgc2luZ2xlIHRlc3QgZG9lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDRgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9va1RpbWVvdXRNdWx0aXBsaWVyID0gSE9PS19USU1FT1VUX01VTFRJUExJRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBzdWl0ZXMgdGhhdCBuZWVkIG5vIE9ic2lkaWFuIGluc3RhbmNlIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub0FwcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBob29rVGltZW91dDogSU5URUdSQVRJT05fVEVTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtOT19BUFBfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOm5vLWFwcCcsXG4gICAgdGVzdFRpbWVvdXQ6IElOVEVHUkFUSU9OX1RFU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIHBlci1ldmFsIGNhcCB0aGUgcGVyZm9ybWFuY2UgaW50ZWdyYXRpb24gcHJvamVjdCBnaXZlcyBpdHMgQ0RQIHRyYW5zcG9ydCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlRXZhbENhcEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSBwZXJmb3JtYW5jZSBpbnRlZ3JhdGlvbiBwcm9qZWN0LCBpbiBtaWxsaXNlY29uZHMuIEEgcGVyZm9ybWFuY2UgdmF1bHQgaXNcbiAgICogcHJlLXBvcHVsYXRlZCB3aXRoIHRlbnMgb2YgdGhvdXNhbmRzIG9mIG5vdGVzIGJlZm9yZSBPYnNpZGlhbiBvcGVucywgc28gYm90aCBpdHMgc2V0dXAgYW5kIGl0cyB0ZXN0c1xuICAgKiBuZWVkIGZhciBtb3JlIHRpbWUgdGhhbiB0aGUgcmVndWxhciBpbnRlZ3JhdGlvbiBwcm9qZWN0cy5cbiAgICpcbiAgICogTGlrZSB0aGUgcmVndWxhciBidWRnZXQsIGl0IENMRUFSUyB0aGUgcHJvamVjdCdzIHBlci1ldmFsIGNhcFxuICAgKiAoe0BsaW5rIE9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnQ29udGV4dC5wZXJmb3JtYW5jZUV2YWxDYXBJbk1pbGxpc2Vjb25kc30pIHJhdGhlciB0aGFuIG1hdGNoaW5nIGl0LFxuICAgKiBzbyBhbiBldmFsdWF0aW9uIHRoYXQgb3V0cnVucyB0aGUgY2FwIHJlcG9ydHMgaXRzZWxmIGluc3RlYWQgb2YgZHlpbmcgYXMgdml0ZXN0J3MgYW5vbnltb3VzIHRpbWVvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MTUwMDBgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGVyZm9ybWFuY2VUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIHJlcG9ydGVycyB0aGUgcnVuIHByaW50cyB0aHJvdWdoLlxuICAgKlxuICAgKiBQaW5uZWQgcmF0aGVyIHRoYW4gbGVmdCB0byB2aXRlc3QsIHdoaWNoIHJlc29sdmVzIGFuIHVuc2V0IGByZXBvcnRlcnNgIGRpZmZlcmVudGx5IGZvciBhIGRldmVsb3BlclxuICAgKiBhbmQgZm9yIGFuIEFJIGNvZGluZyBzZXNzaW9uIOKAlCBzZWUge0BsaW5rIERFRkFVTFRfVklURVNUX1JFUE9SVEVSU30gZm9yIHRoZSB3aG9sZSBvZiB3aHksIGFuZCBmb3JcbiAgICogd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIHRvIHZpdGVzdCA1IGl0c2VsZi5cbiAgICpcbiAgICogUHVzaCBvbnRvIGl0IHRvIGFkZCBhIHJlcG9ydGVyIGJlc2lkZSB0aGUgcGlubmVkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfVklURVNUX1JFUE9SVEVSU31cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRlcnM6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UmVwb3J0ZXJbXSA9IFsuLi5ERUZBVUxUX1ZJVEVTVF9SRVBPUlRFUlNdO1xuXG4gIC8qKlxuICAgKiBUaGUgYHVuaXQtdGVzdHNgIHByb2plY3QsIHJ1bm5pbmcgdGhlIG1vY2tlZC1PYnNpZGlhbiBzdWl0ZXMgaW4gYGpzZG9tYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1bml0VGVzdHM6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IHtcbiAgICBlbnZpcm9ubWVudDogJ2pzZG9tJyxcbiAgICBleGNsdWRlOiBbLi4uU0hBUkVEX0VYQ0xVREUsIElOVEVHUkFUSU9OX1RFU1RfRklMRVNdLFxuICAgIC8vIEEgdGhyZWFkcy9mb3JrcyBwb29sIG9wdGlvbiB0aGF0IHN0aWxsIHJlYWNoZXMgdGhlIHdvcmtlciB1bmRlciB0aGUgVk0gcG9vbCBiZWxvdzogbWVhc3VyZWRcbiAgICAvLyAyMDI2LTA5LTE2LCBgcHJvY2Vzcy5leGVjQXJndmAgY2FycmllcyBpdCBhbmQgTm9kZSdzIG93biBgbG9jYWxTdG9yYWdlYCBkZXNjcmlwdG9yIGlzIGdvbmUsIGFzIGl0XG4gICAgLy8gaXMgdW5kZXIgYHRocmVhZHNgLiBXaXRob3V0IHRoZSBmbGFnIHRoZSBkZXNjcmlwdG9yIGlzIGJhY2sgdW5kZXIgYm90aCBwb29scy5cbiAgICBleGVjQXJndjogWyctLW5vLXdlYnN0b3JhZ2UnXSxcbiAgICBpbmNsdWRlOiBbVU5JVF9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAndW5pdC10ZXN0cycsXG4gICAgLypcbiAgICAgKiBUaGUgZGVmYXVsdCBwb29sIGNvbnN0cnVjdHMgb25lIGpzZG9tIHBlciB0ZXN0IGZpbGUsIGFuZCB0aGF0IGNvbnN0cnVjdGlvbiwgbm90IHRoZSB0ZXN0cywgd2FzXG4gICAgICogdGhlIHVuaXQgc3VpdGUncyBjb3N0OiA2NyUgb2YgdHJhY2tlZCB0aW1lIGluIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBvd24gc3VpdGUuIEEgVk0gcG9vbCBidWlsZHNcbiAgICAgKiB0aGUganNkb20gb25jZSBwZXIgd29ya2VyIGFuZCBnaXZlcyBlYWNoIGZpbGUgYSBmcmVzaCBWTSBjb250ZXh0LCBzbyBwZXItZmlsZSBpc29sYXRpb24gaG9sZHMuXG4gICAgICogTWVhc3VyZWQgdGhlcmUgb24gMjAyNi0wOS0xNTogdGhlIGpzZG9tIHByb2plY3QgMzYuMDZzIC0+IDkuOTJzLCBgY292ZXJhZ2UvbGNvdi5pbmZvYFxuICAgICAqIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBkZWZhdWx0IHBvb2wncywgYW5kIG5vIERPTSwgYGdsb2JhbFRoaXNgIG9yIHByb3RvdHlwZSBzdGF0ZSBjcm9zc2luZyBmaWxlcy5cbiAgICAgKiBgaXNvbGF0ZTogZmFsc2VgLCB0aGUgb3RoZXIgcmVtZWR5IHZpdGVzdCBzdWdnZXN0cywgd2FzIHNsb3dlciAoOTEuNjJzKSBhbmQgYnJva2UgNjggdGVzdHMuXG4gICAgICogVGhlIG9uZSBjb3N0IGlzIHJlZGVmaW5pbmcgYHdpbmRvd2AsIGBkb2N1bWVudGAsIGBsb2NhdGlvbmAgb3IgYHRvcGA6IHNlZSBgZ2xvYmFsU3R1YlRlc3RGaWxlc2AuXG4gICAgICovXG4gICAgcG9vbDogJ3ZtVGhyZWFkcycsXG4gICAgc2VydmVyOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGVwc2AgaXMgZGVjbGFyZWQgYnkgYHZpdGVzdGA7IHJlbmFtaW5nIGl0IGhlcmUgd291bGQgbm90IG1hdGNoIHRoZSBBUEkuXG4gICAgICBkZXBzOiB7XG4gICAgICAgIGlubGluZTogWydAbW5hb3Vtb3YnLCAnQG9ic2lkaWFuLXR5cGluZ3MnXVxuICAgICAgfVxuICAgIH0sXG4gICAgc2V0dXBGaWxlczogW1xuICAgICAgJ29ic2lkaWFuLXRlc3QtbW9ja3Mvdml0ZXN0LXNldHVwJyxcbiAgICAgICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQvdml0ZXN0LXNldHVwJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHNlZWRlZCB3aXRoIHRoZSBzdGFuZGFyZCBwcm9qZWN0cy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBvYnNpZGlhblZlcnNpb24gPSBwcm9jZXNzLmVudltPQlNJRElBTl9WRVJTSU9OX0VOVl9WQVJJQUJMRV9OQU1FXTtcblxuICAgIC8qXG4gICAgICogU3VwcG9ydCBpcyB0aGUgcmFuZ2UgW2xhdGVzdCBwdWJsaWMsIGxhdGVzdCBjYXRhbHlzdF0gYW5kIEJPVEggZW5kcyBtdXN0IHdvcmssIHNvIHRoZSB2ZXJzaW9uXG4gICAgICogaXMgYSBrbm9iIHJhdGhlciB0aGFuIGEgY29uc3RhbnQuIFRoZSBrZXkgaXMgYWRkZWQgT05MWSB3aGVuIHRoZSB2YXJpYWJsZSBpcyBzZXQ6IGFuIGV4cGxpY2l0XG4gICAgICogYG9ic2lkaWFuVmVyc2lvbmAgbWFrZXMgdGhlIGhhcm5lc3MgcmVzb2x2ZSBhIGNvbmNyZXRlIHZlcnNpb24gYW5kIHN3YXAgdGhlIGFzYXIsIHdoaWNoIGlzIG5vdCB3aGF0XG4gICAgICogYW4gdW5waW5uZWQgcnVuIGRvZXMsIHNvIHNlZWRpbmcgYSBkZWZhdWx0IGhlcmUgd291bGQgY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBldmVyeSBwbHVnaW4uXG4gICAgICovXG4gICAgaWYgKG9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRlc2t0b3AuZW52aXJvbm1lbnRPcHRpb25zID0ge1xuICAgICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICAgIG9ic2lkaWFuVmVyc2lvbixcbiAgICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGZvciBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyBUaGUgdml0ZXN0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZyhvcHRpb25zOiBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMgPSB7fSk6IFZpdGVVc2VyQ29uZmlnIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQoKTtcblxuICBpZiAob3B0aW9ucy5lZGl0Q29udGV4dCkge1xuICAgIG9wdGlvbnMuZWRpdENvbnRleHQoY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBjdXN0b21Qcm9qZWN0cyA9IG9wdGlvbnMuY3VzdG9tUHJvamVjdHM/Lihjb250ZXh0KSA/PyBbXTtcbiAgdmFsaWRhdGVDdXN0b21Qcm9qZWN0cyhjdXN0b21Qcm9qZWN0cyk7XG5cbiAgY29uc3QgdW5pdFRlc3RzUmVzb2x2ZSA9IHtcbiAgICBhbGlhczoge1xuICAgICAgb2JzaWRpYW46ICdvYnNpZGlhbi10ZXN0LW1vY2tzL29ic2lkaWFuJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2xvYmFsU3R1YlRlc3RGaWxlcyA9IFsuLi5jb250ZXh0Lmdsb2JhbFN0dWJUZXN0RmlsZXNdO1xuICBjb25zdCB1bml0VGVzdHM6IE9ic2lkaWFuUGx1Z2luVml0ZXN0UHJvamVjdENvbmZpZyA9IGdsb2JhbFN0dWJUZXN0RmlsZXMubGVuZ3RoID09PSAwXG4gICAgPyBjb250ZXh0LnVuaXRUZXN0c1xuICAgIDogeyAuLi5jb250ZXh0LnVuaXRUZXN0cywgZXhjbHVkZTogWy4uLmNvbnRleHQudW5pdFRlc3RzLmV4Y2x1ZGUgPz8gW10sIC4uLmdsb2JhbFN0dWJUZXN0RmlsZXNdIH07XG4gIGNvbnN0IGdsb2JhbFN0dWJzUHJvamVjdHM6IFRlc3RQcm9qZWN0Q29uZmlndXJhdGlvbltdID0gZ2xvYmFsU3R1YlRlc3RGaWxlcy5sZW5ndGggPT09IDBcbiAgICA/IFtdXG4gICAgOiBbe1xuICAgICAgcmVzb2x2ZTogdW5pdFRlc3RzUmVzb2x2ZSxcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgLi4uY29udGV4dC51bml0VGVzdHMsXG4gICAgICAgIGluY2x1ZGU6IGdsb2JhbFN0dWJUZXN0RmlsZXMsXG4gICAgICAgIG5hbWU6IFVOSVRfVEVTVF9HTE9CQUxfU1RVQlNfUFJPSkVDVF9OQU1FLFxuICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb29sLCBuYW1lZCByYXRoZXIgdGhhbiBvbWl0dGVkIHNvIHRoZSBzcHJlYWQgYWJvdmUgY2Fubm90IGNhcnJ5IHRoZSBWTSBwb29sIG92ZXIuXG4gICAgICAgIHBvb2w6ICdmb3JrcydcbiAgICAgIH1cbiAgICB9XTtcblxuICAvKlxuICAgKiBBIHBsYWluIG9iamVjdCByYXRoZXIgdGhhbiBgZGVmaW5lQ29uZmlnKC4uLilgLCB3aGljaCBpcyBvbmx5IGFuIGlkZW50aXR5IGZ1bmN0aW9uIGZvciB0aGUgdHlwZXM6IGNhbGxpbmcgaXRcbiAgICogbWFkZSB0aGlzIG1vZHVsZSBsb2FkIGB2aXRlc3QvY29uZmlnYCwgYW5kIHNvIG1hZGUgdGhlIGB0ZXN0LXJ1bm5lcnNgIGJhcnJlbCBmYWlsIHRvIGxvYWQgaW4gYSBwcm9qZWN0XG4gICAqIHdpdGhvdXQgYHZpdGVzdGAsIGFuIG9wdGlvbmFsIHBlZXIuIGBkZWZpbmVMaWJyYXJ5Vml0ZXN0Q29uZmlnYCBpbiBgQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXRgIHJldHVybnNcbiAgICogaXRzIGNvbmZpZ3VyYXRpb24gdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgcmV0dXJuIHtcbiAgICB0ZXN0OiB7XG4gICAgICBjb3ZlcmFnZToge1xuICAgICAgICBleGNsdWRlOiBjb250ZXh0LmNvdmVyYWdlRXhjbHVkZSxcbiAgICAgICAgaW5jbHVkZTogWydzcmMvKiovKi50cyddLFxuICAgICAgICBwcm92aWRlcjogJ3Y4JyxcbiAgICAgICAgcmVwb3J0ZXI6IFsndGV4dCcsICdsY292JywgJ2h0bWwnXSxcbiAgICAgICAgcmVwb3J0c0RpcmVjdG9yeTogJy4vY292ZXJhZ2UnXG4gICAgICB9LFxuICAgICAgZXhjbHVkZTogWy4uLlNIQVJFRF9FWENMVURFXSxcbiAgICAgIGdsb2JhbHM6IGZhbHNlLFxuICAgICAgLypcbiAgICAgICAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyByb290LWxldmVsIGBpbmNsdWRlYCBoZXJlLCBhbmQgcmVzdG9yaW5nIG9uZSBicmVha3MgZXZlcnkgcHJvamVjdC5cbiAgICAgICAqIFVuZGVyIHZpdGVzdCA0IGEgcHJvamVjdCdzIG93biBgaW5jbHVkZWAgcmVwbGFjZWQgdGhlIHJvb3Qgb25lLCBzbyBhIHJvb3RcbiAgICAgICAqIGBpbmNsdWRlOiBbVU5JVF9URVNUX0ZJTEVTXWAgd2FzIG1lcmVseSByZWR1bmRhbnQg4oCUIHRoZSBgdW5pdC10ZXN0c2AgcHJvamVjdCBhbHJlYWR5IGRlY2xhcmVzXG4gICAgICAgKiB0aGF0IHNhbWUgZ2xvYiBmb3IgaXRzZWxmLiBVbmRlciB2aXRlc3QgNSB0aGUgcHJvamVjdCBnbG9iIG5vIGxvbmdlciByZXBsYWNlcyBpdCwgYW5kXG4gICAgICAgKiBgc3JjLyoqXFwvKi50ZXN0LnRzYCBpcyBhIHN1cGVyc2V0IG9mIGV2ZXJ5IHByb2plY3QgZ2xvYiwgc28gRVZFUlkgcHJvamVjdCBjb2xsZWN0ZWQgRVZFUlkgdGVzdFxuICAgICAgICogZmlsZTogdW5pdCBzdWl0ZXMgcmFuIGluIHRoZSBDRFAgaW50ZWdyYXRpb24gZW52aXJvbm1lbnQgYW5kIGRpZWQgb24gYEZhaWxlZCB0byByZXNvbHZlIGVudHJ5XG4gICAgICAgKiBmb3IgcGFja2FnZSBcIm9ic2lkaWFuXCJgLCB0aGUgc2NyZWVuc2hvdC1jYXB0dXJlIHN1aXRlcyByYW4gYW5kIHJld3JvdGUgY2hlY2tlZC1pbiBQTkdzLCBhbmQgdGhlXG4gICAgICAgKiBhbmRyb2lkIC8gZGVtby12YXVsdCBzdWl0ZXMgcmFuIHVuZGVyIHRoZSBkZXNrdG9wIHRyYW5zcG9ydC4gTWVhc3VyZWQgaW4gYSBjb25zdW1lcjogdGhlIGRlc2t0b3BcbiAgICAgICAqIHByb2plY3QgY29sbGVjdGVkIDIyNyBmaWxlcyBpbnN0ZWFkIG9mIGl0cyBvd24gMTA1LCBhbmQgZGVsZXRpbmcgdGhpcyBvbmUgbGluZSByZXN0b3JlZCAxMDUuXG4gICAgICAgKi9cbiAgICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICAgIHByb2plY3RzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByZXNvbHZlOiB1bml0VGVzdHNSZXNvbHZlLFxuICAgICAgICAgIHRlc3Q6IHVuaXRUZXN0c1xuICAgICAgICB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQubm9BcHAgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0LmRlc2t0b3AgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0LmRlc2t0b3BQZXJmb3JtYW5jZSB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQuYW5kcm9pZCB9LFxuICAgICAgICAuLi5nbG9iYWxTdHVic1Byb2plY3RzLFxuICAgICAgICAuLi5jdXN0b21Qcm9qZWN0c1xuICAgICAgXSxcbiAgICAgIHJlcG9ydGVyczogWy4uLmNvbnRleHQucmVwb3J0ZXJzXVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgY3VzdG9tIHByb2plY3QgdGhhdCBkZWNsYXJlcyBubyBgaW5jbHVkZWAgZ2xvYiBvZiBpdHMgb3duLlxuICpcbiAqIFRoZSByb290IHNlY3Rpb24gZGVsaWJlcmF0ZWx5IGRlY2xhcmVzIG5vIGBpbmNsdWRlYCAoc2VlIHRoZSBjb21tZW50IG9uIGl0IGFib3ZlKSwgc28gYSBwcm9qZWN0IHRoYXRcbiAqIGRlY2xhcmVzIG5vbmUgZmFsbHMgYmFjayB0byB2aXRlc3QncyBvd24gZGVmYXVsdCBnbG9iIOKAlCB3aGljaCBtYXRjaGVzIEVWRVJZIHRlc3QgZmlsZSBpbiB0aGUgcmVwby5cbiAqIFRoYXQgcHJvamVjdCB0aGVuIHJ1bnMgdGhlIHVuaXQgc3VpdGVzIGluIGFuIE9ic2lkaWFuIGVudmlyb25tZW50LCB0aGUgYW5kcm9pZCBzdWl0ZXMgdW5kZXIgdGhlXG4gKiBkZXNrdG9wIHRyYW5zcG9ydCwgYW5kIHRoZSBgKi1jYXB0dXJlLmAgc2NyZWVuc2hvdCBzdWl0ZXMgdGhhdCBvcGVuIGEgd2luZG93IGFuZCByZXdyaXRlIGNoZWNrZWQtaW5cbiAqIFBOR3MuIEEgd2lkZW5lZCBwcm9qZWN0IGlzIHNpbGVudDogaXQgcGFzc2VzLCBzbG93bHksIGhhdmluZyBkb25lIGFsbCBvZiB0aGF0LlxuICpcbiAqIE9ubHkgYSBwbGFpbiBpbmxpbmUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hlY2tlZCBoZXJlLiBBIHByb2plY3QgbmFtZWQgYnkgYSBnbG9iIHN0cmluZywgYnVpbHQgYnkgYVxuICogZnVuY3Rpb24sIG9yIGF3YWl0ZWQgZnJvbSBhIHByb21pc2UgaXMgcmVzb2x2ZWQgYnkgdml0ZXN0IGl0c2VsZiwgb3V0IG9mIHRoaXMgZnVuY3Rpb24ncyByZWFjaC5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tUHJvamVjdHMgLSBUaGUgcHJvamVjdHMgcmV0dXJuZWQgYnkge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5jdXN0b21Qcm9qZWN0c30uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tUHJvamVjdHMoY3VzdG9tUHJvamVjdHM6IFRlc3RQcm9qZWN0Q29uZmlndXJhdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2luZGV4LCBjdXN0b21Qcm9qZWN0XSBvZiBjdXN0b21Qcm9qZWN0cy5lbnRyaWVzKCkpIHtcbiAgICBpZiAodHlwZW9mIGN1c3RvbVByb2plY3QgIT09ICdvYmplY3QnIHx8ICd0aGVuJyBpbiBjdXN0b21Qcm9qZWN0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmNsdWRlID0gY3VzdG9tUHJvamVjdC50ZXN0Py5pbmNsdWRlO1xuXG4gICAgaWYgKGluY2x1ZGUgJiYgaW5jbHVkZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lID0gY3VzdG9tUHJvamVjdC50ZXN0Py5uYW1lO1xuICAgIGNvbnN0IGxhYmVsID0gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnID8gbmFtZSA6IG5hbWU/LmxhYmVsID8/IGBhdCBpbmRleCAke1N0cmluZyhpbmRleCl9YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgY3VzdG9tIHZpdGVzdCBwcm9qZWN0ICR7bGFiZWx9IGRlY2xhcmVzIG5vIFxcYHRlc3QuaW5jbHVkZVxcYCwgc28gdml0ZXN0IGZhbGxzIGJhY2sgdG8gaXRzIGRlZmF1bHQgZ2xvYiBhbmQgdGhlIHByb2plY3QgY29sbGVjdHMgRVZFUlkgdGVzdCBmaWxlIOKAlCBpbmNsdWRpbmcgdGhlIFxcYCotY2FwdHVyZS5cXGAgc3VpdGVzIHRoYXQgcmV3cml0ZSBjaGVja2VkLWluIHNjcmVlbnNob3RzLiBEZWNsYXJlIGFuIGV4cGxpY2l0IFxcYGluY2x1ZGVcXGAsIG9yIHNwcmVhZCBhIHN0YW5kYXJkIHByb2plY3QgKFxcYC4uLmNvbnRleHQuZGVza3RvcFxcYCkgYW5kIG92ZXJyaWRlIGl0LmBcbiAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBRXBCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNDUCxNQUFNLDRDQUE0QztBQU9sRCxNQUFNLGtDQUFrQztBQUN4QyxNQUFNLDBCQUEwQjtBQU9oQyxNQUFNLHNDQUFzQyx1Q0FBdUM7QUFTNUUsTUFBTSwyQ0FBMkMsbUNBQW1DO0FBRTNGLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0saUNBQWlDLFdBQVcsb0NBQW9DO0FBQ3RGLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sc0NBQXNDO0FBUTVDLE1BQU0sMkJBQTJCO0FBRWpDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0saUJBQWlCO0FBOEJoQixNQUFNLGtDQUFrQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLN0IsVUFBNkM7QUFBQSxJQUMzRCxhQUFhO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxNQUNsQixtQkFBbUI7QUFBQSxRQUNqQixXQUFXO0FBQUEsUUFDWCxTQUFTO0FBQUEsUUFDVCxNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLElBQ2pCLGFBQWEsQ0FBQywwQkFBMEIseURBQXlEO0FBQUEsSUFDakcsYUFBYSxrQ0FBa0M7QUFBQSxJQUMvQyxTQUFTLENBQUMsb0JBQW9CLHlCQUF5QjtBQUFBLElBQ3ZELE1BQU07QUFBQSxJQUNOLFlBQVksQ0FBQywyQ0FBMkM7QUFBQSxJQUN4RCxhQUFhO0FBQUEsRUFDZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWdCLCtCQUErQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVy9CLDJCQUEyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVUzQixrQkFBNEIsQ0FBQyxpQkFBaUIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU0vRCxVQUE2QztBQUFBLElBQzNELGFBQWE7QUFBQSxJQUNiLGlCQUFpQjtBQUFBLElBQ2pCLGFBQWEsQ0FBQywwQkFBMEIseURBQXlEO0FBQUEsSUFDakcsYUFBYSwyQ0FBMkM7QUFBQSxJQUN4RCxTQUFTLENBQUMsb0JBQW9CLHlCQUF5QjtBQUFBLElBQ3ZELE1BQU07QUFBQSxJQUNOLFlBQVksQ0FBQywyQ0FBMkM7QUFBQSxJQUN4RCxhQUFhO0FBQUEsRUFDZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXlCZ0IscUJBQXdEO0FBQUEsSUFDdEUsYUFBYTtBQUFBLElBQ2Isb0JBQW9CO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsUUFDakIsOEJBQThCO0FBQUEsUUFDOUIsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxJQUNqQixhQUFhLENBQUMsMEJBQTBCLHlEQUF5RDtBQUFBLElBQ2pHLGFBQWE7QUFBQSxJQUNiLFNBQVMsQ0FBQyw4QkFBOEI7QUFBQSxJQUN4QyxNQUFNO0FBQUEsSUFDTixZQUFZLENBQUMsMkNBQTJDO0FBQUEsSUFDeEQsYUFBYTtBQUFBLEVBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBa0JnQixzQkFBZ0MsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWpDLHdCQUF3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3hCLFFBQTJDO0FBQUEsSUFDekQsYUFBYTtBQUFBLElBQ2IsaUJBQWlCO0FBQUEsSUFDakIsYUFBYSwyQ0FBMkM7QUFBQSxJQUN4RCxTQUFTLENBQUMsaUJBQWlCO0FBQUEsSUFDM0IsTUFBTTtBQUFBLElBQ04sYUFBYTtBQUFBLEVBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPZ0IsbUNBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYW5DLG1DQUFtQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFuQyxZQUE0QyxDQUFDLEdBQUcsd0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLeEUsWUFBK0M7QUFBQSxJQUM3RCxhQUFhO0FBQUEsSUFDYixTQUFTLENBQUMsR0FBRyxnQkFBZ0Isc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJbkQsVUFBVSxDQUFDLGlCQUFpQjtBQUFBLElBQzVCLFNBQVMsQ0FBQyxlQUFlO0FBQUEsSUFDekIsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBVU4sTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBO0FBQUEsTUFFTixNQUFNO0FBQUEsUUFDSixRQUFRLENBQUMsYUFBYSxtQkFBbUI7QUFBQSxNQUMzQztBQUFBLElBQ0Y7QUFBQSxJQUNBLFlBQVk7QUFBQSxNQUNWO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxjQUFjO0FBQ25CLFVBQU0sa0JBQWtCLFFBQVEsSUFBSSxrQ0FBa0M7QUFRdEUsUUFBSSxvQkFBb0IsUUFBVztBQUNqQyxXQUFLLFFBQVEscUJBQXFCO0FBQUEsUUFDaEMsbUJBQW1CO0FBQUEsVUFDakI7QUFBQSxVQUNBLE1BQU07QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLGlDQUFpQyxVQUFtRCxDQUFDLEdBQW1CO0FBQ3RILFFBQU0sVUFBVSxJQUFJLGtDQUFrQztBQUV0RCxNQUFJLFFBQVEsYUFBYTtBQUN2QixZQUFRLFlBQVksT0FBTztBQUFBLEVBQzdCO0FBRUEsUUFBTSxpQkFBaUIsUUFBUSxpQkFBaUIsT0FBTyxLQUFLLENBQUM7QUFDN0QseUJBQXVCLGNBQWM7QUFFckMsUUFBTSxtQkFBbUI7QUFBQSxJQUN2QixPQUFPO0FBQUEsTUFDTCxVQUFVO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFDQSxRQUFNLHNCQUFzQixDQUFDLEdBQUcsUUFBUSxtQkFBbUI7QUFDM0QsUUFBTSxZQUErQyxvQkFBb0IsV0FBVyxJQUNoRixRQUFRLFlBQ1IsRUFBRSxHQUFHLFFBQVEsV0FBVyxTQUFTLENBQUMsR0FBRyxRQUFRLFVBQVUsV0FBVyxDQUFDLEdBQUcsR0FBRyxtQkFBbUIsRUFBRTtBQUNsRyxRQUFNLHNCQUFrRCxvQkFBb0IsV0FBVyxJQUNuRixDQUFDLElBQ0QsQ0FBQztBQUFBLElBQ0QsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0osR0FBRyxRQUFRO0FBQUEsTUFDWCxTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUE7QUFBQSxNQUVOLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRixDQUFDO0FBUUgsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLE1BQ0osVUFBVTtBQUFBLFFBQ1IsU0FBUyxRQUFRO0FBQUEsUUFDakIsU0FBUyxDQUFDLGFBQWE7QUFBQSxRQUN2QixVQUFVO0FBQUEsUUFDVixVQUFVLENBQUMsUUFBUSxRQUFRLE1BQU07QUFBQSxRQUNqQyxrQkFBa0I7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsU0FBUyxDQUFDLEdBQUcsY0FBYztBQUFBLE1BQzNCLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFZVCxpQkFBaUI7QUFBQSxNQUNqQixVQUFVO0FBQUEsUUFDUjtBQUFBLFVBQ0UsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBLEVBQUUsTUFBTSxRQUFRLE1BQU07QUFBQSxRQUN0QixFQUFFLE1BQU0sUUFBUSxRQUFRO0FBQUEsUUFDeEIsRUFBRSxNQUFNLFFBQVEsbUJBQW1CO0FBQUEsUUFDbkMsRUFBRSxNQUFNLFFBQVEsUUFBUTtBQUFBLFFBQ3hCLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQSxNQUNMO0FBQUEsTUFDQSxXQUFXLENBQUMsR0FBRyxRQUFRLFNBQVM7QUFBQSxJQUNsQztBQUFBLEVBQ0Y7QUFDRjtBQWdCQSxTQUFTLHVCQUF1QixnQkFBa0Q7QUFDaEYsYUFBVyxDQUFDLE9BQU8sYUFBYSxLQUFLLGVBQWUsUUFBUSxHQUFHO0FBQzdELFFBQUksT0FBTyxrQkFBa0IsWUFBWSxVQUFVLGVBQWU7QUFDaEU7QUFBQSxJQUNGO0FBRUEsVUFBTSxVQUFVLGNBQWMsTUFBTTtBQUVwQyxRQUFJLFdBQVcsUUFBUSxTQUFTLEdBQUc7QUFDakM7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLGNBQWMsTUFBTTtBQUNqQyxVQUFNLFFBQVEsT0FBTyxTQUFTLFdBQVcsT0FBTyxNQUFNLFNBQVMsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUV4RixVQUFNLElBQUk7QUFBQSxNQUNSLDZCQUE2QixLQUFLO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/obsidian-dev-toolkit",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "description": "Tooling for Obsidian plugin development: the plugin builder for esbuild, vite, rollup, webpack and parcel, shared ESLint/Vitest configs, demo vaults and the release script.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -252,12 +252,14 @@
252
252
  "test": "jiti scripts/test.ts",
253
253
  "test:coverage": "jiti scripts/test-coverage.ts",
254
254
  "test:integration": "jiti scripts/test-integration.ts",
255
+ "test:integration:obsidian": "jiti scripts/test-integration-obsidian.ts",
256
+ "test:integration:obsidian:android": "jiti scripts/test-integration-obsidian-android.ts",
255
257
  "test:watch": "jiti scripts/test-watch.ts",
256
258
  "version": "jiti scripts/version.ts"
257
259
  },
258
260
  "dependencies": {
259
261
  "@eslint/json": "^2.1.0",
260
- "@mnaoumov/typescript-dev-toolkit": "^3.0.0",
262
+ "@mnaoumov/typescript-dev-toolkit": "^3.5.0",
261
263
  "@mnaoumov/typescript-lib": "^1.0.0",
262
264
  "@mnaoumov/typescript-test-toolkit": "^1.0.0",
263
265
  "@types/babel__core": "^7.20.5",
@@ -313,6 +315,8 @@
313
315
  "dprint": "^0.57.4",
314
316
  "esbuild-loader": "^4.5.0",
315
317
  "husky": "^9.1.7",
318
+ "jest": "^30.5.2",
319
+ "jest-environment-jsdom": "^30.5.2",
316
320
  "jiti": "^2.7.0",
317
321
  "jsdom": "^30.1.3",
318
322
  "markdownlint-cli2": "^0.23.2",
@@ -330,6 +334,7 @@
330
334
  "solid-js": "^1.9.17",
331
335
  "svelte": "^5.57.2",
332
336
  "tailwindcss": "^4.3.3",
337
+ "ts-jest": "^29.4.15",
333
338
  "ts-morph": "^28.0.0",
334
339
  "tslib": "^2.8.1",
335
340
  "typedoc-plugin-mdn-links": "^5.1.1",
@@ -351,10 +356,13 @@
351
356
  "@tailwindcss/postcss": "^4.3.3",
352
357
  "babel-preset-solid": "^1.9.16",
353
358
  "css-loader": "^7.1.5",
359
+ "jest": "^30.5.2",
360
+ "jest-environment-jsdom": "^30.5.2",
354
361
  "mini-css-extract-plugin": "^2.10.2",
355
362
  "obsidian-integration-testing": "^17.3.0",
356
363
  "rollup": "^4.64.7",
357
364
  "svelte": "^5.57.2",
365
+ "ts-jest": "^29.4.15",
358
366
  "unplugin-vue": "^8.0.0",
359
367
  "vite": "^8.3.4",
360
368
  "vitest": "^5.0.1",
@@ -388,6 +396,12 @@
388
396
  "css-loader": {
389
397
  "optional": true
390
398
  },
399
+ "jest": {
400
+ "optional": true
401
+ },
402
+ "jest-environment-jsdom": {
403
+ "optional": true
404
+ },
391
405
  "mini-css-extract-plugin": {
392
406
  "optional": true
393
407
  },
@@ -400,6 +414,9 @@
400
414
  "svelte": {
401
415
  "optional": true
402
416
  },
417
+ "ts-jest": {
418
+ "optional": true
419
+ },
403
420
  "unplugin-vue": {
404
421
  "optional": true
405
422
  },
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/test-runners/jest-config.cjs",
3
+ "module": "../../dist/lib/esm/test-runners/jest-config.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/test-runners/jest-config.d.cts"
6
+ }