obsidian-integration-testing 11.0.0 → 12.1.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.
- package/dist/lib/cjs/adb-device-list.cjs +54 -0
- package/dist/lib/cjs/adb-device-list.d.cts +72 -0
- package/dist/lib/cjs/android-sdk.cjs +52 -0
- package/dist/lib/cjs/android-sdk.d.cts +29 -0
- package/dist/lib/cjs/app-startup-progress.cjs +87 -0
- package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
- package/dist/lib/cjs/appium-server-marker.cjs +112 -0
- package/dist/lib/cjs/appium-server-marker.d.cts +103 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
- package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
- package/dist/lib/cjs/cli.cjs +104 -19
- package/dist/lib/cjs/cli.d.cts +16 -8
- package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
- package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
- package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
- package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
- package/dist/lib/cjs/config-directory.cjs +46 -0
- package/dist/lib/cjs/config-directory.d.cts +45 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
- package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
- package/dist/lib/cjs/context-provider.cjs +12 -1
- package/dist/lib/cjs/context-provider.d.cts +26 -3
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +114 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +38 -10
- package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
- package/dist/lib/cjs/device-readiness.cjs +38 -3
- package/dist/lib/cjs/device-readiness.d.cts +83 -9
- package/dist/lib/cjs/emulator-arguments.cjs +6 -2
- package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
- package/dist/lib/cjs/emulator-backend.cjs +71 -0
- package/dist/lib/cjs/emulator-backend.d.cts +76 -0
- package/dist/lib/cjs/emulator-liveness.cjs +72 -0
- package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
- package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
- package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
- package/dist/lib/cjs/global-setup-core.cjs +30 -30
- package/dist/lib/cjs/global-setup-core.d.cts +27 -2
- package/dist/lib/cjs/headless-vault-config.cjs +51 -0
- package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
- package/dist/lib/cjs/index.cjs +24 -1
- package/dist/lib/cjs/index.d.cts +14 -5
- package/dist/lib/cjs/installer-asset.cjs +1 -1
- package/dist/lib/cjs/installer-asset.d.cts +1 -1
- package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
- package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
- package/dist/lib/cjs/jest/global-setup.cjs +2 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/kill-process-tree.cjs +18 -7
- package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +173 -0
- package/dist/lib/cjs/mobile-input.d.cts +156 -0
- package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
- package/dist/lib/cjs/obsidian-installer.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +52 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
- package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
- package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
- package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
- package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
- package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
- package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
- package/dist/lib/cjs/parent-liveness.cjs +42 -5
- package/dist/lib/cjs/parent-liveness.d.cts +37 -5
- package/dist/lib/cjs/port-owner.cjs +61 -0
- package/dist/lib/cjs/port-owner.d.cts +47 -0
- package/dist/lib/cjs/process-capture.cjs +62 -0
- package/dist/lib/cjs/process-capture.d.cts +83 -0
- package/dist/lib/cjs/process-exit-message.cjs +14 -8
- package/dist/lib/cjs/process-exit-message.d.cts +37 -3
- package/dist/lib/cjs/process-liveness.cjs +51 -0
- package/dist/lib/cjs/process-liveness.d.cts +18 -0
- package/dist/lib/cjs/release-catalog.cjs +73 -0
- package/dist/lib/cjs/release-catalog.d.cts +125 -0
- package/dist/lib/cjs/run-version-matrix.cjs +1 -1
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/teardown-verdict.cjs +53 -0
- package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
- package/dist/lib/cjs/temporary-vault.cjs +43 -8
- package/dist/lib/cjs/temporary-vault.d.cts +47 -5
- package/dist/lib/cjs/transport-appium.cjs +223 -17
- package/dist/lib/cjs/transport-appium.d.cts +104 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +201 -6
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +100 -0
- package/dist/lib/cjs/transport-factory.cjs +1165 -142
- package/dist/lib/cjs/transport-factory.d.cts +10 -1
- package/dist/lib/cjs/transport-options.cjs +11 -3
- package/dist/lib/cjs/transport-options.d.cts +131 -12
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +7 -1
- package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
- package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
- package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
- package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
- package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/vitest/setup.cjs +2 -1
- package/dist/lib/cjs/vitest/setup.d.cts +5 -0
- package/dist/lib/cjs/vitest/typings.d.cts +6 -4
- package/dist/lib/cjs/webview-cdp.cjs +263 -0
- package/dist/lib/cjs/webview-cdp.d.cts +156 -0
- package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
- package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
- package/dist/lib/esm/adb-device-list.d.mts +72 -0
- package/dist/lib/esm/adb-device-list.mjs +28 -0
- package/dist/lib/esm/android-sdk.d.mts +29 -0
- package/dist/lib/esm/android-sdk.mjs +18 -0
- package/dist/lib/esm/app-startup-progress.d.mts +128 -0
- package/dist/lib/esm/app-startup-progress.mjs +59 -0
- package/dist/lib/esm/appium-server-marker.d.mts +103 -0
- package/dist/lib/esm/appium-server-marker.mjs +89 -0
- package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
- package/dist/lib/esm/cli.d.mts +16 -8
- package/dist/lib/esm/cli.mjs +110 -19
- package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
- package/dist/lib/esm/community-plugin-registry.mjs +23 -0
- package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
- package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
- package/dist/lib/esm/config-directory.d.mts +45 -0
- package/dist/lib/esm/config-directory.mjs +21 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
- package/dist/lib/esm/connect-to-cdp.mjs +13 -7
- package/dist/lib/esm/context-provider.d.mts +26 -3
- package/dist/lib/esm/context-provider.mjs +10 -1
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +114 -0
- package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
- package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
- package/dist/lib/esm/demo-vault-populate.mjs +35 -9
- package/dist/lib/esm/device-readiness.d.mts +83 -9
- package/dist/lib/esm/device-readiness.mjs +34 -2
- package/dist/lib/esm/emulator-arguments.d.mts +26 -0
- package/dist/lib/esm/emulator-arguments.mjs +6 -2
- package/dist/lib/esm/emulator-backend.d.mts +76 -0
- package/dist/lib/esm/emulator-backend.mjs +45 -0
- package/dist/lib/esm/emulator-liveness.d.mts +158 -0
- package/dist/lib/esm/emulator-liveness.mjs +47 -0
- package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
- package/dist/lib/esm/emulator-snapshot.mjs +32 -0
- package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +27 -2
- package/dist/lib/esm/global-setup-core.mjs +34 -35
- package/dist/lib/esm/headless-vault-config.d.mts +67 -0
- package/dist/lib/esm/headless-vault-config.mjs +31 -0
- package/dist/lib/esm/index.d.mts +14 -5
- package/dist/lib/esm/index.mjs +26 -2
- package/dist/lib/esm/installer-asset.d.mts +1 -1
- package/dist/lib/esm/installer-asset.mjs +1 -1
- package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
- package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
- package/dist/lib/esm/jest/global-setup.d.mts +5 -1
- package/dist/lib/esm/jest/global-setup.mjs +2 -2
- package/dist/lib/esm/kill-process-tree.d.mts +10 -2
- package/dist/lib/esm/kill-process-tree.mjs +16 -6
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +156 -0
- package/dist/lib/esm/mobile-input.mjs +144 -0
- package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
- package/dist/lib/esm/obsidian-installer.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +12 -0
- package/dist/lib/esm/obsidian-instance.mjs +55 -3
- package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
- package/dist/lib/esm/obsidian-metadata.mjs +123 -17
- package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
- package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
- package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
- package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
- package/dist/lib/esm/owned-vault-seed.mjs +9 -5
- package/dist/lib/esm/parent-liveness.d.mts +37 -5
- package/dist/lib/esm/parent-liveness.mjs +42 -5
- package/dist/lib/esm/port-owner.d.mts +47 -0
- package/dist/lib/esm/port-owner.mjs +36 -0
- package/dist/lib/esm/process-capture.d.mts +83 -0
- package/dist/lib/esm/process-capture.mjs +38 -0
- package/dist/lib/esm/process-exit-message.d.mts +37 -3
- package/dist/lib/esm/process-exit-message.mjs +13 -8
- package/dist/lib/esm/process-liveness.d.mts +18 -0
- package/dist/lib/esm/process-liveness.mjs +17 -0
- package/dist/lib/esm/release-catalog.d.mts +125 -0
- package/dist/lib/esm/release-catalog.mjs +46 -0
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +1 -1
- package/dist/lib/esm/teardown-verdict.d.mts +69 -0
- package/dist/lib/esm/teardown-verdict.mjs +28 -0
- package/dist/lib/esm/temporary-vault.d.mts +47 -5
- package/dist/lib/esm/temporary-vault.mjs +43 -8
- package/dist/lib/esm/transport-appium.d.mts +104 -3
- package/dist/lib/esm/transport-appium.mjs +233 -17
- package/dist/lib/esm/transport-desktop-cdp.d.mts +100 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +208 -7
- package/dist/lib/esm/transport-factory.d.mts +10 -1
- package/dist/lib/esm/transport-factory.mjs +1220 -149
- package/dist/lib/esm/transport-options.d.mts +131 -12
- package/dist/lib/esm/transport-options.mjs +9 -2
- package/dist/lib/esm/transport.d.mts +7 -1
- package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
- package/dist/lib/esm/vault-plugin-install.mjs +20 -0
- package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
- package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
- package/dist/lib/esm/vitest/global-setup.mjs +14 -7
- package/dist/lib/esm/vitest/setup.d.mts +5 -0
- package/dist/lib/esm/vitest/setup.mjs +3 -1
- package/dist/lib/esm/vitest/typings.d.mts +6 -4
- package/dist/lib/esm/webview-cdp.d.mts +156 -0
- package/dist/lib/esm/webview-cdp.mjs +235 -0
- package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
- package/dist/lib/esm/wedged-appium-server.mjs +86 -0
- package/package.json +25 -23
- package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
- package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
- package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
- package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
- package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
- package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
- package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
- package/dist/lib/esm/obsidian-namespace.mjs +0 -1
|
@@ -18,20 +18,29 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var context_provider_exports = {};
|
|
20
20
|
__export(context_provider_exports, {
|
|
21
|
+
getSetupError: () => getSetupError,
|
|
21
22
|
getTransportOptions: () => getTransportOptions,
|
|
22
23
|
getVaultPath: () => getVaultPath,
|
|
24
|
+
setSetupErrorResolver: () => setSetupErrorResolver,
|
|
23
25
|
setTransportOptionsResolver: () => setTransportOptionsResolver,
|
|
24
26
|
setVaultPathResolver: () => setVaultPathResolver
|
|
25
27
|
});
|
|
26
28
|
module.exports = __toCommonJS(context_provider_exports);
|
|
29
|
+
let setupErrorResolver;
|
|
27
30
|
let transportOptionsResolver;
|
|
28
31
|
let vaultPathResolver;
|
|
32
|
+
function getSetupError() {
|
|
33
|
+
return setupErrorResolver?.();
|
|
34
|
+
}
|
|
29
35
|
function getTransportOptions() {
|
|
30
36
|
return transportOptionsResolver?.();
|
|
31
37
|
}
|
|
32
38
|
function getVaultPath() {
|
|
33
39
|
return vaultPathResolver?.();
|
|
34
40
|
}
|
|
41
|
+
function setSetupErrorResolver(callback) {
|
|
42
|
+
setupErrorResolver = callback;
|
|
43
|
+
}
|
|
35
44
|
function setTransportOptionsResolver(callback) {
|
|
36
45
|
transportOptionsResolver = callback;
|
|
37
46
|
}
|
|
@@ -40,9 +49,11 @@ function setVaultPathResolver(callback) {
|
|
|
40
49
|
}
|
|
41
50
|
// Annotate the CommonJS export names for ESM import in node:
|
|
42
51
|
0 && (module.exports = {
|
|
52
|
+
getSetupError,
|
|
43
53
|
getTransportOptions,
|
|
44
54
|
getVaultPath,
|
|
55
|
+
setSetupErrorResolver,
|
|
45
56
|
setTransportOptionsResolver,
|
|
46
57
|
setVaultPathResolver
|
|
47
58
|
});
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtcHJvdmlkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBGcmFtZXdvcmstbmV1dHJhbCBjb250ZXh0IHByb3ZpZGVyIGZvciBpbnRlZ3JhdGlvbiB0ZXN0IHN0YXRlLlxuICpcbiAqIEVhY2ggZnJhbWV3b3JrIGFkYXB0ZXIgKHZpdGVzdCwgamVzdCkgcmVnaXN0ZXJzIHJlc29sdmVycyB2aWFcbiAqIHtAbGluayBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXJ9LCB7QGxpbmsgc2V0VmF1bHRQYXRoUmVzb2x2ZXJ9IGFuZFxuICoge0BsaW5rIHNldFNldHVwRXJyb3JSZXNvbHZlcn0gZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbi4gQ29yZSBtb2R1bGVzIGNhbGwgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGdldHRlcnMgdG8gcmV0cmlldmUgc3RhdGUgd2l0aG91dCBkZXBlbmRpbmcgb24gYW55IHNwZWNpZmljIHRlc3QgZnJhbWV3b3JrLlxuICovXG5cbmltcG9ydCB0eXBlIHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBmYWlsdXJlIG9mIHRoaXMgcHJvamVjdCdzIGdsb2JhbCBzZXR1cCwgaWYgaXQgZmFpbGVkLlxuICovXG5leHBvcnQgdHlwZSBTZXR1cEVycm9yUmVzb2x2ZXIgPSAoKSA9PiBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIGN1cnJlbnQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciA9ICgpID0+IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIGN1cnJlbnQgdmF1bHQgcGF0aC5cbiAqL1xuZXhwb3J0IHR5cGUgVmF1bHRQYXRoUmVzb2x2ZXIgPSAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmxldCBzZXR1cEVycm9yUmVzb2x2ZXI6IFNldHVwRXJyb3JSZXNvbHZlciB8IHVuZGVmaW5lZDtcbmxldCB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXI6IFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciB8IHVuZGVmaW5lZDtcbmxldCB2YXVsdFBhdGhSZXNvbHZlcjogdW5kZWZpbmVkIHwgVmF1bHRQYXRoUmVzb2x2ZXI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmFpbHVyZSBvZiB0aGlzIHByb2plY3QncyBnbG9iYWwgc2V0dXAsIGFzIHB1Ymxpc2hlZCBieSB0aGUgcmVnaXN0ZXJlZFxuICogZnJhbWV3b3JrIGFkYXB0ZXIuIEEgdGVzdCB3b3JrZXIgbXVzdCBmYWlsIHdpdGggdGhpcyByYXRoZXIgdGhhbiBidWlsZCBhIHRyYW5zcG9ydFxuICogb2YgaXRzIG93bjogd2l0aCBubyBvcHRpb25zIHB1Ymxpc2hlZCwgdGhlIGRlZmF1bHQgaXMgdGhlIG93bmVkICoqZGVza3RvcCoqIENEUFxuICogaW5zdGFuY2UsIHdoYXRldmVyIHBsYXRmb3JtIHRoZSBwcm9qZWN0IGFza2VkIGZvci5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgZmFpbHVyZSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHNldHVwIHN1Y2NlZWRlZCAob3IgbmV2ZXIgcmFuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHVwRXJyb3IoKTogSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2V0dXBFcnJvclJlc29sdmVyPy4oKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFuc3BvcnQgb3B0aW9ucyByZXNvbHZlZCBieSB0aGUgcmVnaXN0ZXJlZCBmcmFtZXdvcmsgYWRhcHRlci5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNwb3J0IG9wdGlvbnMsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyPy4oKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YXVsdCBwYXRoIHJlc29sdmVkIGJ5IHRoZSByZWdpc3RlcmVkIGZyYW1ld29yayBhZGFwdGVyLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YXVsdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgY29uZmlndXJlZCAoZmFsbHMgYmFjayB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YXVsdFBhdGhSZXNvbHZlcj8uKCk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoaXMgcHJvamVjdCdzIHNldHVwIGZhaWx1cmUuIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcyBcdTIwMTQgbW9zdFxuICogaW1wb3J0YW50bHkgaW4gdGhlICoqcGVyLXdvcmtlcioqIHNldHVwIGZpbGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBmYWlsdXJlIGhhcyB0byBiZVxuICogc2VlbiAoc2VlIGB2aXRlc3Qvc2V0dXAudHNgKS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR1cEVycm9yUmVzb2x2ZXIoY2FsbGJhY2s6IFNldHVwRXJyb3JSZXNvbHZlcik6IHZvaWQge1xuICBzZXR1cEVycm9yUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdHJhbnNwb3J0IG9wdGlvbnMuIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoY2FsbGJhY2s6IFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcik6IHZvaWQge1xuICB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdGhlIHZhdWx0IHBhdGguIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYXVsdFBhdGhSZXNvbHZlcihjYWxsYmFjazogVmF1bHRQYXRoUmVzb2x2ZXIpOiB2b2lkIHtcbiAgdmF1bHRQYXRoUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkJBLElBQUk7QUFDSixJQUFJO0FBQ0osSUFBSTtBQVVHLFNBQVMsZ0JBQTBFO0FBQ3hGLFNBQU8scUJBQXFCO0FBQzlCO0FBT08sU0FBUyxzQkFBNEQ7QUFDMUUsU0FBTywyQkFBMkI7QUFDcEM7QUFPTyxTQUFTLGVBQW1DO0FBQ2pELFNBQU8sb0JBQW9CO0FBQzdCO0FBVU8sU0FBUyxzQkFBc0IsVUFBb0M7QUFDeEUsdUJBQXFCO0FBQ3ZCO0FBUU8sU0FBUyw0QkFBNEIsVUFBMEM7QUFDcEYsNkJBQTJCO0FBQzdCO0FBUU8sU0FBUyxxQkFBcUIsVUFBbUM7QUFDdEUsc0JBQW9CO0FBQ3RCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -4,11 +4,16 @@
|
|
|
4
4
|
* Framework-neutral context provider for integration test state.
|
|
5
5
|
*
|
|
6
6
|
* Each framework adapter (vitest, jest) registers resolvers via
|
|
7
|
-
* {@link setTransportOptionsResolver}
|
|
8
|
-
* during module initialization. Core modules call the
|
|
9
|
-
* getters to retrieve state without depending on any specific test framework.
|
|
7
|
+
* {@link setTransportOptionsResolver}, {@link setVaultPathResolver} and
|
|
8
|
+
* {@link setSetupErrorResolver} during module initialization. Core modules call the
|
|
9
|
+
* corresponding getters to retrieve state without depending on any specific test framework.
|
|
10
10
|
*/
|
|
11
|
+
import type { IntegrationSetupFailedErrorConstructorParams } from './integration-setup-failed-error.cjs';
|
|
11
12
|
import type { ObsidianTransportOptions } from './transport-options.cjs';
|
|
13
|
+
/**
|
|
14
|
+
* A function that resolves the failure of this project's global setup, if it failed.
|
|
15
|
+
*/
|
|
16
|
+
export type SetupErrorResolver = () => IntegrationSetupFailedErrorConstructorParams | undefined;
|
|
12
17
|
/**
|
|
13
18
|
* A function that resolves the current transport options.
|
|
14
19
|
*/
|
|
@@ -17,6 +22,15 @@ export type TransportOptionsResolver = () => ObsidianTransportOptions | undefine
|
|
|
17
22
|
* A function that resolves the current vault path.
|
|
18
23
|
*/
|
|
19
24
|
export type VaultPathResolver = () => string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Returns the failure of this project's global setup, as published by the registered
|
|
27
|
+
* framework adapter. A test worker must fail with this rather than build a transport
|
|
28
|
+
* of its own: with no options published, the default is the owned **desktop** CDP
|
|
29
|
+
* instance, whatever platform the project asked for.
|
|
30
|
+
*
|
|
31
|
+
* @returns The setup failure, or `undefined` if the setup succeeded (or never ran).
|
|
32
|
+
*/
|
|
33
|
+
export declare function getSetupError(): IntegrationSetupFailedErrorConstructorParams | undefined;
|
|
20
34
|
/**
|
|
21
35
|
* Returns the transport options resolved by the registered framework adapter.
|
|
22
36
|
*
|
|
@@ -29,6 +43,15 @@ export declare function getTransportOptions(): ObsidianTransportOptions | undefi
|
|
|
29
43
|
* @returns The vault path, or `undefined` if not configured (falls back to `process.cwd()`).
|
|
30
44
|
*/
|
|
31
45
|
export declare function getVaultPath(): string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Registers a resolver function for this project's setup failure. Called by framework
|
|
48
|
+
* adapters at module load time to bridge their native injection mechanisms — most
|
|
49
|
+
* importantly in the **per-worker** setup file, which is where the failure has to be
|
|
50
|
+
* seen (see `vitest/setup.ts`).
|
|
51
|
+
*
|
|
52
|
+
* @param callback - The resolver function.
|
|
53
|
+
*/
|
|
54
|
+
export declare function setSetupErrorResolver(callback: SetupErrorResolver): void;
|
|
32
55
|
/**
|
|
33
56
|
* Registers a resolver function for transport options. Called by framework
|
|
34
57
|
* adapters at module load time to bridge their native injection mechanisms.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var demo_vault_bootstrap_exports = {};
|
|
30
|
+
__export(demo_vault_bootstrap_exports, {
|
|
31
|
+
bootstrapDemoVaultPlugins: () => bootstrapDemoVaultPlugins,
|
|
32
|
+
buildDemoVaultPopulateAsync: () => buildDemoVaultPopulateAsync
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(demo_vault_bootstrap_exports);
|
|
35
|
+
var import_node_fs = require("node:fs");
|
|
36
|
+
var import_node_path = require("node:path");
|
|
37
|
+
var import_node_process = __toESM(require("node:process"), 1);
|
|
38
|
+
var import_community_plugin_registry = require("./community-plugin-registry.cjs");
|
|
39
|
+
var import_demo_vault_populate = require("./demo-vault-populate.cjs");
|
|
40
|
+
var import_log = require("./log.cjs");
|
|
41
|
+
const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
|
|
42
|
+
const HTTP_NOT_FOUND = 404;
|
|
43
|
+
let registryPromise;
|
|
44
|
+
async function bootstrapDemoVaultPlugins(params) {
|
|
45
|
+
const { demoVaultPath, injectPlugins, shouldForce = false } = params;
|
|
46
|
+
const bootstrappable = injectPlugins.filter((plugin) => plugin.sourceDirectory === void 0);
|
|
47
|
+
const targets = shouldForce ? bootstrappable : (0, import_demo_vault_populate.resolveMissingInjectedPlugins)({ demoVaultPath, injectPlugins });
|
|
48
|
+
const targetPluginIds = new Set(targets.map((plugin) => plugin.pluginId));
|
|
49
|
+
const installed = [];
|
|
50
|
+
for (const plugin of targets) {
|
|
51
|
+
installed.push(await installPlugin(demoVaultPath, plugin));
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
installed,
|
|
55
|
+
skippedPluginIds: injectPlugins.map((plugin) => plugin.pluginId).filter((pluginId) => !targetPluginIds.has(pluginId))
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function buildDemoVaultPopulateAsync(params) {
|
|
59
|
+
if (params.injectPlugins !== void 0) {
|
|
60
|
+
await bootstrapDemoVaultPlugins({ demoVaultPath: params.demoVaultPath, injectPlugins: params.injectPlugins });
|
|
61
|
+
}
|
|
62
|
+
return (0, import_demo_vault_populate.buildDemoVaultPopulate)(params);
|
|
63
|
+
}
|
|
64
|
+
function buildGitHubHeaders() {
|
|
65
|
+
const headers = new Headers({ "User-Agent": DOWNLOAD_USER_AGENT });
|
|
66
|
+
const token = import_node_process.default.env["GITHUB_TOKEN"] ?? import_node_process.default.env["GH_TOKEN"];
|
|
67
|
+
if (token) {
|
|
68
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
69
|
+
}
|
|
70
|
+
return headers;
|
|
71
|
+
}
|
|
72
|
+
async function downloadAsset(url, isRequired) {
|
|
73
|
+
const response = await fetch(url, { headers: buildGitHubHeaders() });
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
if (!isRequired && response.status === HTTP_NOT_FOUND) {
|
|
76
|
+
return void 0;
|
|
77
|
+
}
|
|
78
|
+
throw new Error(`Failed to download ${url}: HTTP ${String(response.status)} ${response.statusText}`);
|
|
79
|
+
}
|
|
80
|
+
return Buffer.from(await response.arrayBuffer());
|
|
81
|
+
}
|
|
82
|
+
async function fetchCommunityPluginRegistry() {
|
|
83
|
+
registryPromise ??= (async () => {
|
|
84
|
+
(0, import_log.log)(`[demo-vault-bootstrap] Fetching Obsidian's community plugin registry from ${import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL}...`);
|
|
85
|
+
const response = await fetch(import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL, { headers: buildGitHubHeaders() });
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Failed to fetch Obsidian's community plugin registry (${import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL}): HTTP ${String(response.status)} ${response.statusText}. Pass an explicit \`repo\` on the injected plugin to skip the registry lookup.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return await response.json();
|
|
92
|
+
})();
|
|
93
|
+
try {
|
|
94
|
+
return await registryPromise;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
registryPromise = void 0;
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function installPlugin(demoVaultPath, plugin) {
|
|
101
|
+
const { pluginId, version } = plugin;
|
|
102
|
+
const repo = await resolvePluginRepo(plugin);
|
|
103
|
+
const targetDirectory = (0, import_demo_vault_populate.resolveInjectedPluginSourceDirectory)({ demoVaultPath, plugin });
|
|
104
|
+
(0, import_log.log)(`[demo-vault-bootstrap] Installing "${pluginId}" from ${repo}@${version ?? "latest"} into ${targetDirectory}...`);
|
|
105
|
+
const downloads = await Promise.all([
|
|
106
|
+
...import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES.map(async (assetName) => ({
|
|
107
|
+
assetName,
|
|
108
|
+
content: await downloadAsset((0, import_community_plugin_registry.buildPluginAssetUrl)({ assetName, repo, version }), true)
|
|
109
|
+
})),
|
|
110
|
+
...import_community_plugin_registry.OPTIONAL_PLUGIN_ASSET_NAMES.map(async (assetName) => ({
|
|
111
|
+
assetName,
|
|
112
|
+
content: await downloadAsset((0, import_community_plugin_registry.buildPluginAssetUrl)({ assetName, repo, version }), false)
|
|
113
|
+
}))
|
|
114
|
+
]);
|
|
115
|
+
(0, import_node_fs.mkdirSync)(targetDirectory, { recursive: true });
|
|
116
|
+
const assetNames = [];
|
|
117
|
+
for (const { assetName, content } of downloads) {
|
|
118
|
+
if (content === void 0) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
(0, import_node_fs.writeFileSync)((0, import_node_path.join)(targetDirectory, assetName), content);
|
|
122
|
+
assetNames.push(assetName);
|
|
123
|
+
}
|
|
124
|
+
(0, import_log.log)(`[demo-vault-bootstrap] Installed "${pluginId}": ${assetNames.join(", ")}.`);
|
|
125
|
+
return { assetNames, pluginId, repo, version };
|
|
126
|
+
}
|
|
127
|
+
async function resolvePluginRepo(plugin) {
|
|
128
|
+
const { pluginId, repo } = plugin;
|
|
129
|
+
if (repo !== void 0) {
|
|
130
|
+
if (!(0, import_community_plugin_registry.isValidRepoReference)(repo)) {
|
|
131
|
+
throw new Error(`Invalid \`repo\` for community plugin "${pluginId}": ${repo}. Expected an \`owner/name\` reference.`);
|
|
132
|
+
}
|
|
133
|
+
return repo;
|
|
134
|
+
}
|
|
135
|
+
const registryRepo = (0, import_community_plugin_registry.selectPluginRepo)({ entries: await fetchCommunityPluginRegistry(), pluginId });
|
|
136
|
+
if (registryRepo === void 0) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`Community plugin "${pluginId}" is not listed in Obsidian's community plugin registry, so its GitHub repository cannot be resolved. Pass an explicit \`repo\` (\`owner/name\`) on the injected plugin.`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return registryRepo;
|
|
142
|
+
}
|
|
143
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
144
|
+
0 && (module.exports = {
|
|
145
|
+
bootstrapDemoVaultPlugins,
|
|
146
|
+
buildDemoVaultPopulateAsync
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtYm9vdHN0cmFwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBkZW1vIHZhdWx0J3MgKippbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyoqIGhlYWRsZXNzbHksIGJ5IGRvd25sb2FkaW5nXG4gKiB0aGVpciBwdWJsaXNoZWQgR2l0SHViIHJlbGVhc2UgYXNzZXRzIHN0cmFpZ2h0IGludG9cbiAqIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYC5cbiAqXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgZWFjaCBpbmplY3RlZCBwbHVnaW4ncyBgbWFpbi5qc2AgL1xuICogYG1hbmlmZXN0Lmpzb25gIHRvIGFscmVhZHkgYmUgb24gZGlzaywgYW5kIHRocm93cyB3aGVuIHRoZXkgYXJlIG5vdC4gVW50aWwgdGhpc1xuICogbW9kdWxlIGV4aXN0ZWQgdGhlIG9ubHkgZG9jdW1lbnRlZCByZW1lZHkgd2FzIGEgKipHVUkgc3RlcCoqIFx1MjAxNCBvcGVuIGBkZW1vLXZhdWx0L2BcbiAqIGluIE9ic2lkaWFuIG9uY2UgYW5kIGxldCBgZGVtby12YXVsdC1oZWxwZXJgIGluc3RhbGwgdGhlIHBsdWdpbiBhdCBydW50aW1lLlxuICogYC5vYnNpZGlhbi9wbHVnaW5zLypgIGlzIGdpdGlnbm9yZWQgaW4gYSBwbHVnaW4gcmVwbywgc28gdGhhdCBzdGF0ZVxuICogZXhpc3RzIG9uIGV4YWN0bHkgdGhlIG9uZSBtYWNoaW5lIHRoYXQgZGlkIGl0IGFuZCBpcyBpbnZpc2libGUgdG8gYSBmcmVzaCBjbG9uZSxcbiAqIGEgbmV3IG1hY2hpbmUsIG9yIENJLiBTaW5jZSBhIHBsdWdpbiByZXBvJ3MgcmVsZWFzZSBwcmVmbGlnaHQgcnVucyBpdHNcbiAqIGludGVncmF0aW9uIHRlc3RzLCB0aGF0IG1hZGUgKmN1dHRpbmcgYSByZWxlYXNlIGZyb20gYSBjbGVhbiBjbG9uZSogaW1wb3NzaWJsZVxuICogd2l0aG91dCBhIGh1bWFuIG9wZW5pbmcgYSBHVUkuXG4gKlxuICogRG93bmxvYWRpbmcgdGhlIHJlbGVhc2UgYXNzZXRzIGlzIHRoZSBleGFjdCBoZWFkbGVzcyBlcXVpdmFsZW50OiB0aGUgcmVzdWx0aW5nXG4gKiBmb2xkZXIgaXMgd2hhdCBPYnNpZGlhbiBpdHNlbGYgd291bGQgaGF2ZSBpbnN0YWxsZWQsIHNvIHRoZSBzaGlwcGVkXG4gKiBgKi1kZW1vLXZhdWx0LnppcGAgXHUyMDE0IHdoaWNoIHVuemlwcyBpbnRvIGEgc2luZ2xlIGAqLWRlbW8tdmF1bHQtPHZlcnNpb24+YCBmb2xkZXIgXHUyMDE0XG4gKiBzdGF5cyB0aGUgc3RhbmRhcmQgZGVtby12YXVsdCBhcnRpZmFjdC5cbiAqXG4gKiBUd28gZW50cnkgcG9pbnRzLCBwbHVzIHRoZSBgYm9vdHN0cmFwLWRlbW8tdmF1bHRgIENMSSBzdWJjb21tYW5kOlxuICpcbiAqIC0ge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9IFx1MjAxNCBpbnN0YWxsIHRoZSBtaXNzaW5nIG9uZXMsIGV4cGxpY2l0bHkuXG4gKiAtIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmN9IFx1MjAxNCBkbyB0aGF0IGFuZCB0aGVuIGJ1aWxkIHRoZSBwb3B1bGF0ZSBtYXAsXG4gKiAgIHNvIGEgZ2xvYmFsIHNldHVwIHNlbGYtaGVhbHMgd2l0aCBubyBtYW51YWwgc3RlcCBhdCBhbGwuXG4gKlxuICogVGhlIHN5bmMgYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgIGRlbGliZXJhdGVseSBrZWVwcyB0aHJvd2luZzogYGZldGNoYCBoYXMgbm9cbiAqIHN5bmNocm9ub3VzIGZvcm0sIHNvIGF1dG8taGVhbGluZyBjYW4gb25seSBsaXZlIG9uIGFuIGFzeW5jIHNpYmxpbmcuIEl0cyBtZXNzYWdlXG4gKiBub3cgbmFtZXMgYm90aCByZW1lZGllcyBhYm92ZSBpbnN0ZWFkIG9mIHRoZSBHVUkgc3RlcC5cbiAqL1xuXG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeSB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5janMnO1xuXG5pbXBvcnQge1xuICBidWlsZFBsdWdpbkFzc2V0VXJsLFxuICBDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwsXG4gIGlzVmFsaWRSZXBvUmVmZXJlbmNlLFxuICBPUFRJT05BTF9QTFVHSU5fQVNTRVRfTkFNRVMsXG4gIFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyxcbiAgc2VsZWN0UGx1Z2luUmVwb1xufSBmcm9tICcuL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkuY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUsXG4gIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuXG4vKipcbiAqIEJyb3dzZXIgYFVzZXItQWdlbnRgIGZvciB0aGUgYXNzZXQgZG93bmxvYWRzLCBtYXRjaGluZyBgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCBcdTIwMTRcbiAqIGEgcGxhaW4gTm9kZSBmZXRjaCBpcyByZWplY3RlZCBieSBzb21lIENETiBlZGdlcy5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTI0LjAuMC4wIFNhZmFyaS81MzcuMzYnO1xuXG5jb25zdCBIVFRQX05PVF9GT1VORCA9IDQwNDtcblxuLyoqXG4gKiBUaGUgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgZmV0Y2hlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MuIEV2ZXJ5IGluamVjdGVkXG4gKiBwbHVnaW4gb2YgZXZlcnkgZGVtby12YXVsdCBwcm9qZWN0IGluIGEgcnVuIHJlc29sdmVzIGFnYWluc3QgdGhlIHNhbWUgdGFibGUsIGFuZFxuICogaXQgaXMgYSBtdWx0aS1tZWdhYnl0ZSBkb2N1bWVudC5cbiAqL1xubGV0IHJlZ2lzdHJ5UHJvbWlzZTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmplY3RlZCBwbHVnaW5zIHRvIGluc3RhbGwgXHUyMDE0IHRoZSBzYW1lIGxpc3QgcGFzc2VkIHRvIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYC4gUGx1Z2lucyB3aG9zZVxuICAgKiBiaW5hcmllcyBhcmUgYWxyZWFkeSBwcmVzZW50IGFyZSBza2lwcGVkICh1bmxlc3Mge0BsaW5rIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMuc2hvdWxkRm9yY2V9KSxcbiAgICogYXMgYXJlIHBsdWdpbnMgY2FycnlpbmcgYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAuXG4gICAqL1xuICByZWFkb25seSBpbmplY3RQbHVnaW5zOiByZWFkb25seSBJbmplY3RQbHVnaW5QYXJhbXNbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZS1kb3dubG9hZCBwbHVnaW5zIHRoYXQgYXJlIGFscmVhZHkgaW5zdGFsbGVkLCByZXBsYWNpbmcgdGhlbSB3aXRoIHRoZSBjdXJyZW50IHJlbGVhc2UuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAgXHUyMDE0IHRoZSBub3JtYWwgcGF0aCBpbnN0YWxscyBvbmx5IHdoYXQgaXMgbWlzc2luZywgc28gYSB3YXJtIGNoZWNrb3V0IGRvZXMgbm9cbiAgICogbmV0d29yayBJL08gYXQgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIGEge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9IHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUmVzdWx0IHtcbiAgLyoqXG4gIFRoZSBwbHVnaW5zIHRoYXQgd2VyZSBkb3dubG9hZGVkIGFuZCB3cml0dGVuLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluc3RhbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxlZDogcmVhZG9ubHkgSW5zdGFsbGVkUGx1Z2luSW5mb1tdO1xuXG4gIC8qKlxuICBUaGUgaWRzIG9mIHBsdWdpbnMgbGVmdCB1bnRvdWNoZWQgXHUyMDE0IGFscmVhZHkgaW5zdGFsbGVkLCBvciBvcHRlZCBvdXQgdmlhIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcHBlZFBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogT25lIHBsdWdpbiBpbnN0YWxsZWQgYnkge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxlZFBsdWdpbkluZm8ge1xuICAvKipcbiAgVGhlIGFzc2V0IGZpbGUgbmFtZXMgYWN0dWFsbHkgd3JpdHRlbiwgZS5nLiBgWydtYWluLmpzJywgJ21hbmlmZXN0Lmpzb24nLCAnc3R5bGVzLmNzcyddYC5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgcGx1Z2luJ3MgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgR2l0SHViIHJlcG9zaXRvcnkgdGhlIGFzc2V0cyBjYW1lIGZyb20sIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcblxuICAvKipcbiAgVGhlIHJlbGVhc2UgdGFnIGRvd25sb2FkZWQgZnJvbSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVwb3NpdG9yeSdzIGxhdGVzdCByZWxlYXNlIHdhcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGV2ZXJ5IGluamVjdGVkIGNvbW11bml0eSBwbHVnaW4gd2hvc2UgYnVpbHQgZmlsZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZGVtbyB2YXVsdCwgYnlcbiAqIGRvd25sb2FkaW5nIGl0cyBwdWJsaXNoZWQgcmVsZWFzZSBhc3NldHMgaW50byBgZGVtby12YXVsdC8ub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AuXG4gKlxuICogRWFjaCBwbHVnaW4ncyByZXBvc2l0b3J5IGNvbWVzIGZyb20gaXRzIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30gd2hlbiBnaXZlbiwgb3RoZXJ3aXNlIGZyb21cbiAqIE9ic2lkaWFuJ3Mgb3duIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkgXHUyMDE0IHRoZSBzYW1lIGBpZGAgXHUyMTkyIGByZXBvYCB0YWJsZSB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyXG4gKiBpbnN0YWxscyBmcm9tLCBzbyBubyBwbHVnaW4tc3BlY2lmaWMgbWFwcGluZyBpcyBoYXJkY29kZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtc30uXG4gKiBAcmV0dXJucyBXaGF0IHdhcyBpbnN0YWxsZWQgYW5kIHdoYXQgd2FzIHNraXBwZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEgcGx1Z2luJ3MgcmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQsIG9yIGEgcmVxdWlyZWQgYXNzZXQgY2Fubm90IGJlIGRvd25sb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zKHBhcmFtczogQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyk6IFByb21pc2U8Qm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdD4ge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGluamVjdFBsdWdpbnMsIHNob3VsZEZvcmNlID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICBjb25zdCBib290c3RyYXBwYWJsZSA9IGluamVjdFBsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+IHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRhcmdldHMgPSBzaG91bGRGb3JjZSA/IGJvb3RzdHJhcHBhYmxlIDogcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMoeyBkZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zIH0pO1xuICBjb25zdCB0YXJnZXRQbHVnaW5JZHMgPSBuZXcgU2V0KHRhcmdldHMubWFwKChwbHVnaW4pID0+IHBsdWdpbi5wbHVnaW5JZCkpO1xuXG4gIGNvbnN0IGluc3RhbGxlZDogSW5zdGFsbGVkUGx1Z2luSW5mb1tdID0gW107XG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIHRhcmdldHMpIHtcbiAgICAvLyBTZXF1ZW50aWFsIG9uIHB1cnBvc2U6IHRoZSBpbnN0YWxscyBzaGFyZSBvbmUgbWVtb2lzZWQgcmVnaXN0cnkgZmV0Y2guXG4gICAgLy8gUGFyYWxsZWxpc20gd291bGQgYnV5IG5vdGhpbmcgYnV0IGludGVybGVhdmVkIGxvZ3MgZm9yIHRoZSBoYW5kZnVsIG9mIHBsdWdpbnMgYSBkZW1vIHZhdWx0IGluamVjdHMuXG4gICAgaW5zdGFsbGVkLnB1c2goYXdhaXQgaW5zdGFsbFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4pKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVkLFxuICAgIHNraXBwZWRQbHVnaW5JZHM6IGluamVjdFBsdWdpbnMubWFwKChwbHVnaW4pID0+IHBsdWdpbi5wbHVnaW5JZCkuZmlsdGVyKChwbHVnaW5JZCkgPT4gIXRhcmdldFBsdWdpbklkcy5oYXMocGx1Z2luSWQpKVxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzZWxmLWhlYWxpbmcgY291bnRlcnBhcnQgb2YgYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgOiBpbnN0YWxscyBhbnkgaW5qZWN0ZWQgY29tbXVuaXR5IHBsdWdpbiB3aG9zZVxuICogYmluYXJpZXMgYXJlIG1pc3NpbmcgKHNlZSB7QGxpbmsgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc30pLCB0aGVuIGJ1aWxkcyB0aGUgcG9wdWxhdGUgbWFwIGV4YWN0bHkgYXMgdGhlXG4gKiBzeW5jaHJvbm91cyBidWlsZGVyIGRvZXMuXG4gKlxuICogVXNlIHRoaXMgZnJvbSBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgdGh1bmsgXHUyMDE0IGJvdGggdGhlIFZpdGVzdCBhbmQgSmVzdCBhZGFwdGVycyBhY2NlcHQgYSB0aHVua1xuICogcmV0dXJuaW5nIGEgcHJvbWlzZSBcdTIwMTQgc28gYSBmcmVzaCBjbG9uZSwgYSBuZXcgbWFjaGluZSwgb3IgQ0kgbmVlZHMgbm8gbWFudWFsIGluc3RhbGwgc3RlcC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbWUgYEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXNgIHRoZSBzeW5jaHJvbm91cyBidWlsZGVyIHRha2VzLlxuICogQHJldHVybnMgVGhlIHBvcHVsYXRlIG1hcCwgcmVhZHkgdG8gaGFuZCB0byBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgb3IgYFRlbXBvcmFyeVZhdWx0LnBvcHVsYXRlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luYyhwYXJhbXM6IEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXMpOiBQcm9taXNlPFBvcHVsYXRlRmlsZXNQYXJhbXM+IHtcbiAgaWYgKHBhcmFtcy5pbmplY3RQbHVnaW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zKHsgZGVtb1ZhdWx0UGF0aDogcGFyYW1zLmRlbW9WYXVsdFBhdGgsIGluamVjdFBsdWdpbnM6IHBhcmFtcy5pbmplY3RQbHVnaW5zIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUocGFyYW1zKTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIE5ldHdvcmsgZG93bmxvYWQgZ2x1ZSwgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQnVpbGRzIHRoZSByZXF1ZXN0IGhlYWRlcnMgZm9yIGEgR2l0SHViIGRvd25sb2FkLCBzZW5kaW5nIGEgYEdJVEhVQl9UT0tFTmAgLyBgR0hfVE9LRU5gIGJlYXJlciB3aGVuIG9uZVxuICogaXMgaW4gdGhlIGVudmlyb25tZW50IFx1MjAxNCB3aXRob3V0IGl0IHRoZSBhbm9ueW1vdXMgcXVvdGEgcmV0dXJucyBIVFRQIDQwMyBvbiBzaGFyZWQgQ0kgcnVubmVyIElQcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgaGVhZGVycyB0byBzZW5kLlxuICovXG5mdW5jdGlvbiBidWlsZEdpdEh1YkhlYWRlcnMoKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdVc2VyLUFnZW50JzogRE9XTkxPQURfVVNFUl9BR0VOVCB9KTtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ10gPz8gcHJvY2Vzcy5lbnZbJ0dIX1RPS0VOJ107XG4gIGlmICh0b2tlbikge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke3Rva2VufWApO1xuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBvbmUgcmVsZWFzZSBhc3NldC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGFzc2V0J3MgZG93bmxvYWQgVVJMLlxuICogQHBhcmFtIGlzUmVxdWlyZWQgLSBXaGV0aGVyIGEgbWlzc2luZyBhc3NldCAoSFRUUCA0MDQpIGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGFuIGFic2VudCBvcHRpb25hbCBmaWxlLlxuICogQHJldHVybnMgVGhlIGFzc2V0J3MgYnl0ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gYW4gb3B0aW9uYWwgYXNzZXQgaXMgbm90IHB1Ymxpc2hlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzIGFuZCB0aGUgYXNzZXQgaXMgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGlzUmVxdWlyZWQ6IGJvb2xlYW4pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiBidWlsZEdpdEh1YkhlYWRlcnMoKSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGlmICghaXNSZXF1aXJlZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IEhUVFBfTk9UX0ZPVU5EKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCAke3VybH06IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgbWVtb2lzZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkgcm93cy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlZ2lzdHJ5IGNhbm5vdCBiZSBmZXRjaGVkIG9yIHBhcnNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb21tdW5pdHlQbHVnaW5SZWdpc3RyeSgpOiBQcm9taXNlPHJlYWRvbmx5IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnlbXT4ge1xuICByZWdpc3RyeVByb21pc2UgPz89IChhc3luYyAoKTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+ID0+IHtcbiAgICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gRmV0Y2hpbmcgT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5IGZyb20gJHtDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkx9Li4uYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwsIHsgaGVhZGVyczogYnVpbGRHaXRIdWJIZWFkZXJzKCkgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSAoJHtDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkx9KTogYFxuICAgICAgICAgICsgYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fS4gYFxuICAgICAgICAgICsgJ1Bhc3MgYW4gZXhwbGljaXQgYHJlcG9gIG9uIHRoZSBpbmplY3RlZCBwbHVnaW4gdG8gc2tpcCB0aGUgcmVnaXN0cnkgbG9va3VwLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgcmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdO1xuICB9KSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlZ2lzdHJ5UHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAvLyBEbyBub3QgbWVtb2lzZSBhIGZhaWx1cmU6IGEgdHJhbnNpZW50IG5ldHdvcmsgZXJyb3IgbXVzdCBub3QgcG9pc29uIGV2ZXJ5IGxhdGVyIGxvb2t1cC5cbiAgICByZWdpc3RyeVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgb25lIHBsdWdpbidzIHJlbGVhc2UgYXNzZXRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBkZW1vIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBkZW1vVmF1bHRQYXRoIC0gVGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIGluc3RhbGwuXG4gKiBAcmV0dXJucyBXaGF0IHdhcyBpbnN0YWxsZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSByZXBvc2l0b3J5IGNhbm5vdCBiZSByZXNvbHZlZCBvciBhIHJlcXVpcmVkIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBQcm9taXNlPEluc3RhbGxlZFBsdWdpbkluZm8+IHtcbiAgY29uc3QgeyBwbHVnaW5JZCwgdmVyc2lvbiB9ID0gcGx1Z2luO1xuICBjb25zdCByZXBvID0gYXdhaXQgcmVzb2x2ZVBsdWdpblJlcG8ocGx1Z2luKTtcbiAgY29uc3QgdGFyZ2V0RGlyZWN0b3J5ID0gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHsgZGVtb1ZhdWx0UGF0aCwgcGx1Z2luIH0pO1xuXG4gIGxvZyhgW2RlbW8tdmF1bHQtYm9vdHN0cmFwXSBJbnN0YWxsaW5nIFwiJHtwbHVnaW5JZH1cIiBmcm9tICR7cmVwb31AJHt2ZXJzaW9uID8/ICdsYXRlc3QnfSBpbnRvICR7dGFyZ2V0RGlyZWN0b3J5fS4uLmApO1xuXG4gIGNvbnN0IGRvd25sb2FkcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAuLi5SRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMubWFwKGFzeW5jIChhc3NldE5hbWUpID0+ICh7XG4gICAgICBhc3NldE5hbWUsXG4gICAgICBjb250ZW50OiBhd2FpdCBkb3dubG9hZEFzc2V0KGJ1aWxkUGx1Z2luQXNzZXRVcmwoeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSksIHRydWUpXG4gICAgfSkpLFxuICAgIC4uLk9QVElPTkFMX1BMVUdJTl9BU1NFVF9OQU1FUy5tYXAoYXN5bmMgKGFzc2V0TmFtZSkgPT4gKHtcbiAgICAgIGFzc2V0TmFtZSxcbiAgICAgIGNvbnRlbnQ6IGF3YWl0IGRvd25sb2FkQXNzZXQoYnVpbGRQbHVnaW5Bc3NldFVybCh7IGFzc2V0TmFtZSwgcmVwbywgdmVyc2lvbiB9KSwgZmFsc2UpXG4gICAgfSkpXG4gIF0pO1xuXG4gIG1rZGlyU3luYyh0YXJnZXREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGFzc2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgeyBhc3NldE5hbWUsIGNvbnRlbnQgfSBvZiBkb3dubG9hZHMpIHtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHRhcmdldERpcmVjdG9yeSwgYXNzZXROYW1lKSwgY29udGVudCk7XG4gICAgYXNzZXROYW1lcy5wdXNoKGFzc2V0TmFtZSk7XG4gIH1cblxuICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gSW5zdGFsbGVkIFwiJHtwbHVnaW5JZH1cIjogJHthc3NldE5hbWVzLmpvaW4oJywgJyl9LmApO1xuXG4gIHJldHVybiB7IGFzc2V0TmFtZXMsIHBsdWdpbklkLCByZXBvLCB2ZXJzaW9uIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIEdpdEh1YiByZXBvc2l0b3J5IHB1Ymxpc2hpbmcgYSBwbHVnaW4gXHUyMDE0IHRoZSBleHBsaWNpdCBvdmVycmlkZSB3aGVuIGdpdmVuLCBvdGhlcndpc2VcbiAqIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICogQHJldHVybnMgVGhlIGBvd25lci9uYW1lYCByZXBvc2l0b3J5IHJlZmVyZW5jZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW4gZXhwbGljaXQgb3ZlcnJpZGUgaXMgbWFsZm9ybWVkLCBvciB0aGUgaWQgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb21tdW5pdHkgcGx1Z2luLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luUmVwbyhwbHVnaW46IEluamVjdFBsdWdpblBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcGx1Z2luSWQsIHJlcG8gfSA9IHBsdWdpbjtcblxuICBpZiAocmVwbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFpc1ZhbGlkUmVwb1JlZmVyZW5jZShyZXBvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFxcYHJlcG9cXGAgZm9yIGNvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiOiAke3JlcG99LiBFeHBlY3RlZCBhbiBcXGBvd25lci9uYW1lXFxgIHJlZmVyZW5jZS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcG87XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVJlcG8gPSBzZWxlY3RQbHVnaW5SZXBvKHsgZW50cmllczogYXdhaXQgZmV0Y2hDb21tdW5pdHlQbHVnaW5SZWdpc3RyeSgpLCBwbHVnaW5JZCB9KTtcbiAgaWYgKHJlZ2lzdHJ5UmVwbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LCBzbyBpdHMgR2l0SHViIGBcbiAgICAgICAgKyAncmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQuIFBhc3MgYW4gZXhwbGljaXQgYHJlcG9gIChgb3duZXIvbmFtZWApIG9uIHRoZSBpbmplY3RlZCBwbHVnaW4uJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVnaXN0cnlSZXBvO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlDQSxxQkFHTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFTcEIsdUNBT087QUFDUCxpQ0FJTztBQUNQLGlCQUFvQjtBQU1wQixNQUFNLHNCQUFzQjtBQUU1QixNQUFNLGlCQUFpQjtBQU92QixJQUFJO0FBOEVKLGVBQXNCLDBCQUEwQixRQUFtRjtBQUNqSSxRQUFNLEVBQUUsZUFBZSxlQUFlLGNBQWMsTUFBTSxJQUFJO0FBRTlELFFBQU0saUJBQWlCLGNBQWMsT0FBTyxDQUFDLFdBQVcsT0FBTyxvQkFBb0IsTUFBUztBQUM1RixRQUFNLFVBQVUsY0FBYyxxQkFBaUIsMERBQThCLEVBQUUsZUFBZSxjQUFjLENBQUM7QUFDN0csUUFBTSxrQkFBa0IsSUFBSSxJQUFJLFFBQVEsSUFBSSxDQUFDLFdBQVcsT0FBTyxRQUFRLENBQUM7QUFFeEUsUUFBTSxZQUFtQyxDQUFDO0FBQzFDLGFBQVcsVUFBVSxTQUFTO0FBRzVCLGNBQVUsS0FBSyxNQUFNLGNBQWMsZUFBZSxNQUFNLENBQUM7QUFBQSxFQUMzRDtBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxrQkFBa0IsY0FBYyxJQUFJLENBQUMsV0FBVyxPQUFPLFFBQVEsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQztBQUFBLEVBQ3RIO0FBQ0Y7QUFhQSxlQUFzQiw0QkFBNEIsUUFBb0U7QUFDcEgsTUFBSSxPQUFPLGtCQUFrQixRQUFXO0FBQ3RDLFVBQU0sMEJBQTBCLEVBQUUsZUFBZSxPQUFPLGVBQWUsZUFBZSxPQUFPLGNBQWMsQ0FBQztBQUFBLEVBQzlHO0FBRUEsYUFBTyxtREFBdUIsTUFBTTtBQUN0QztBQVVBLFNBQVMscUJBQThCO0FBQ3JDLFFBQU0sVUFBVSxJQUFJLFFBQVEsRUFBRSxjQUFjLG9CQUFvQixDQUFDO0FBQ2pFLFFBQU0sUUFBUSxvQkFBQUEsUUFBUSxJQUFJLGNBQWMsS0FBSyxvQkFBQUEsUUFBUSxJQUFJLFVBQVU7QUFDbkUsTUFBSSxPQUFPO0FBQ1QsWUFBUSxJQUFJLGlCQUFpQixVQUFVLEtBQUssRUFBRTtBQUFBLEVBQ2hEO0FBQ0EsU0FBTztBQUNUO0FBVUEsZUFBZSxjQUFjLEtBQWEsWUFBa0Q7QUFDMUYsUUFBTSxXQUFXLE1BQU0sTUFBTSxLQUFLLEVBQUUsU0FBUyxtQkFBbUIsRUFBRSxDQUFDO0FBQ25FLE1BQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsUUFBSSxDQUFDLGNBQWMsU0FBUyxXQUFXLGdCQUFnQjtBQUNyRCxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sSUFBSSxNQUFNLHNCQUFzQixHQUFHLFVBQVUsT0FBTyxTQUFTLE1BQU0sQ0FBQyxJQUFJLFNBQVMsVUFBVSxFQUFFO0FBQUEsRUFDckc7QUFDQSxTQUFPLE9BQU8sS0FBSyxNQUFNLFNBQVMsWUFBWSxDQUFDO0FBQ2pEO0FBUUEsZUFBZSwrQkFBaUY7QUFDOUYsdUJBQXFCLFlBQThEO0FBQ2pGLHdCQUFJLDZFQUE2RSwrREFBOEIsS0FBSztBQUNwSCxVQUFNLFdBQVcsTUFBTSxNQUFNLGlFQUFnQyxFQUFFLFNBQVMsbUJBQW1CLEVBQUUsQ0FBQztBQUM5RixRQUFJLENBQUMsU0FBUyxJQUFJO0FBQ2hCLFlBQU0sSUFBSTtBQUFBLFFBQ1IseURBQXlELCtEQUE4QixXQUMzRSxPQUFPLFNBQVMsTUFBTSxDQUFDLElBQUksU0FBUyxVQUFVO0FBQUEsTUFFNUQ7QUFBQSxJQUNGO0FBQ0EsV0FBTyxNQUFNLFNBQVMsS0FBSztBQUFBLEVBQzdCLEdBQUc7QUFFSCxNQUFJO0FBQ0YsV0FBTyxNQUFNO0FBQUEsRUFDZixTQUFTLE9BQWdCO0FBRXZCLHNCQUFrQjtBQUNsQixVQUFNO0FBQUEsRUFDUjtBQUNGO0FBVUEsZUFBZSxjQUFjLGVBQXVCLFFBQTBEO0FBQzVHLFFBQU0sRUFBRSxVQUFVLFFBQVEsSUFBSTtBQUM5QixRQUFNLE9BQU8sTUFBTSxrQkFBa0IsTUFBTTtBQUMzQyxRQUFNLHNCQUFrQixpRUFBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQztBQUV0RixzQkFBSSxzQ0FBc0MsUUFBUSxVQUFVLElBQUksSUFBSSxXQUFXLFFBQVEsU0FBUyxlQUFlLEtBQUs7QUFFcEgsUUFBTSxZQUFZLE1BQU0sUUFBUSxJQUFJO0FBQUEsSUFDbEMsR0FBRyw2REFBNEIsSUFBSSxPQUFPLGVBQWU7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsU0FBUyxNQUFNLGtCQUFjLHNEQUFvQixFQUFFLFdBQVcsTUFBTSxRQUFRLENBQUMsR0FBRyxJQUFJO0FBQUEsSUFDdEYsRUFBRTtBQUFBLElBQ0YsR0FBRyw2REFBNEIsSUFBSSxPQUFPLGVBQWU7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsU0FBUyxNQUFNLGtCQUFjLHNEQUFvQixFQUFFLFdBQVcsTUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLO0FBQUEsSUFDdkYsRUFBRTtBQUFBLEVBQ0osQ0FBQztBQUVELGdDQUFVLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRTlDLFFBQU0sYUFBdUIsQ0FBQztBQUM5QixhQUFXLEVBQUUsV0FBVyxRQUFRLEtBQUssV0FBVztBQUM5QyxRQUFJLFlBQVksUUFBVztBQUN6QjtBQUFBLElBQ0Y7QUFDQSwwQ0FBYyx1QkFBSyxpQkFBaUIsU0FBUyxHQUFHLE9BQU87QUFDdkQsZUFBVyxLQUFLLFNBQVM7QUFBQSxFQUMzQjtBQUVBLHNCQUFJLHFDQUFxQyxRQUFRLE1BQU0sV0FBVyxLQUFLLElBQUksQ0FBQyxHQUFHO0FBRS9FLFNBQU8sRUFBRSxZQUFZLFVBQVUsTUFBTSxRQUFRO0FBQy9DO0FBVUEsZUFBZSxrQkFBa0IsUUFBNkM7QUFDNUUsUUFBTSxFQUFFLFVBQVUsS0FBSyxJQUFJO0FBRTNCLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFFBQUksS0FBQyx1REFBcUIsSUFBSSxHQUFHO0FBQy9CLFlBQU0sSUFBSSxNQUFNLDBDQUEwQyxRQUFRLE1BQU0sSUFBSSx5Q0FBeUM7QUFBQSxJQUN2SDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBZSxtREFBaUIsRUFBRSxTQUFTLE1BQU0sNkJBQTZCLEdBQUcsU0FBUyxDQUFDO0FBQ2pHLE1BQUksaUJBQWlCLFFBQVc7QUFDOUIsVUFBTSxJQUFJO0FBQUEsTUFDUixxQkFBcUIsUUFBUTtBQUFBLElBRS9CO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Installs a demo vault's **injected community plugins** headlessly, by downloading
|
|
5
|
+
* their published GitHub release assets straight into
|
|
6
|
+
* `demo-vault/.obsidian/plugins/<id>/`.
|
|
7
|
+
*
|
|
8
|
+
* `buildDemoVaultPopulate` requires each injected plugin's `main.js` /
|
|
9
|
+
* `manifest.json` to already be on disk, and throws when they are not. Until this
|
|
10
|
+
* module existed the only documented remedy was a **GUI step** — open `demo-vault/`
|
|
11
|
+
* in Obsidian once and let `demo-vault-helper` install the plugin at runtime.
|
|
12
|
+
* `.obsidian/plugins/*` is gitignored in a plugin repo, so that state
|
|
13
|
+
* exists on exactly the one machine that did it and is invisible to a fresh clone,
|
|
14
|
+
* a new machine, or CI. Since a plugin repo's release preflight runs its
|
|
15
|
+
* integration tests, that made *cutting a release from a clean clone* impossible
|
|
16
|
+
* without a human opening a GUI.
|
|
17
|
+
*
|
|
18
|
+
* Downloading the release assets is the exact headless equivalent: the resulting
|
|
19
|
+
* folder is what Obsidian itself would have installed, so the shipped
|
|
20
|
+
* `*-demo-vault.zip` — which unzips into a single `*-demo-vault-<version>` folder —
|
|
21
|
+
* stays the standard demo-vault artifact.
|
|
22
|
+
*
|
|
23
|
+
* Two entry points, plus the `bootstrap-demo-vault` CLI subcommand:
|
|
24
|
+
*
|
|
25
|
+
* - {@link bootstrapDemoVaultPlugins} — install the missing ones, explicitly.
|
|
26
|
+
* - {@link buildDemoVaultPopulateAsync} — do that and then build the populate map,
|
|
27
|
+
* so a global setup self-heals with no manual step at all.
|
|
28
|
+
*
|
|
29
|
+
* The sync `buildDemoVaultPopulate` deliberately keeps throwing: `fetch` has no
|
|
30
|
+
* synchronous form, so auto-healing can only live on an async sibling. Its message
|
|
31
|
+
* now names both remedies above instead of the GUI step.
|
|
32
|
+
*/
|
|
33
|
+
import type { BuildDemoVaultPopulateParams, InjectPluginParams } from './demo-vault-populate.cjs';
|
|
34
|
+
import type { PopulateFilesParams } from './temporary-vault.cjs';
|
|
35
|
+
/**
|
|
36
|
+
* Parameters for {@link bootstrapDemoVaultPlugins}.
|
|
37
|
+
*/
|
|
38
|
+
export interface BootstrapDemoVaultPluginsParams {
|
|
39
|
+
/**
|
|
40
|
+
Absolute path to the plugin repo's `demo-vault/` directory.
|
|
41
|
+
*/
|
|
42
|
+
readonly demoVaultPath: string;
|
|
43
|
+
/**
|
|
44
|
+
* The injected plugins to install — the same list passed to `buildDemoVaultPopulate`. Plugins whose
|
|
45
|
+
* binaries are already present are skipped (unless {@link BootstrapDemoVaultPluginsParams.shouldForce}),
|
|
46
|
+
* as are plugins carrying an explicit `sourceDirectory`.
|
|
47
|
+
*/
|
|
48
|
+
readonly injectPlugins: readonly InjectPluginParams[];
|
|
49
|
+
/**
|
|
50
|
+
* Whether to re-download plugins that are already installed, replacing them with the current release.
|
|
51
|
+
* Defaults to `false` — the normal path installs only what is missing, so a warm checkout does no
|
|
52
|
+
* network I/O at all.
|
|
53
|
+
*/
|
|
54
|
+
readonly shouldForce?: boolean | undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The outcome of a {@link bootstrapDemoVaultPlugins} run.
|
|
58
|
+
*/
|
|
59
|
+
export interface BootstrapDemoVaultPluginsResult {
|
|
60
|
+
/**
|
|
61
|
+
The plugins that were downloaded and written, in the order they were installed.
|
|
62
|
+
*/
|
|
63
|
+
readonly installed: readonly InstalledPluginInfo[];
|
|
64
|
+
/**
|
|
65
|
+
The ids of plugins left untouched — already installed, or opted out via an explicit `sourceDirectory`.
|
|
66
|
+
*/
|
|
67
|
+
readonly skippedPluginIds: readonly string[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* One plugin installed by {@link bootstrapDemoVaultPlugins}.
|
|
71
|
+
*/
|
|
72
|
+
export interface InstalledPluginInfo {
|
|
73
|
+
/**
|
|
74
|
+
The asset file names actually written, e.g. `['main.js', 'manifest.json', 'styles.css']`.
|
|
75
|
+
*/
|
|
76
|
+
readonly assetNames: readonly string[];
|
|
77
|
+
/**
|
|
78
|
+
The plugin's id.
|
|
79
|
+
*/
|
|
80
|
+
readonly pluginId: string;
|
|
81
|
+
/**
|
|
82
|
+
The GitHub repository the assets came from, as `owner/name`.
|
|
83
|
+
*/
|
|
84
|
+
readonly repo: string;
|
|
85
|
+
/**
|
|
86
|
+
The release tag downloaded from, or `undefined` when the repository's latest release was used.
|
|
87
|
+
*/
|
|
88
|
+
readonly version: string | undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Installs every injected community plugin whose built files are missing from the demo vault, by
|
|
92
|
+
* downloading its published release assets into `demo-vault/.obsidian/plugins/<id>/`.
|
|
93
|
+
*
|
|
94
|
+
* Each plugin's repository comes from its {@link InjectPluginParams.repo} when given, otherwise from
|
|
95
|
+
* Obsidian's own community plugin registry — the same `id` → `repo` table the in-app community browser
|
|
96
|
+
* installs from, so no plugin-specific mapping is hardcoded.
|
|
97
|
+
*
|
|
98
|
+
* @param params - The {@link BootstrapDemoVaultPluginsParams}.
|
|
99
|
+
* @returns What was installed and what was skipped.
|
|
100
|
+
* @throws Error if a plugin's repository cannot be resolved, or a required asset cannot be downloaded.
|
|
101
|
+
*/
|
|
102
|
+
export declare function bootstrapDemoVaultPlugins(params: BootstrapDemoVaultPluginsParams): Promise<BootstrapDemoVaultPluginsResult>;
|
|
103
|
+
/**
|
|
104
|
+
* The self-healing counterpart of `buildDemoVaultPopulate`: installs any injected community plugin whose
|
|
105
|
+
* binaries are missing (see {@link bootstrapDemoVaultPlugins}), then builds the populate map exactly as the
|
|
106
|
+
* synchronous builder does.
|
|
107
|
+
*
|
|
108
|
+
* Use this from a global setup's `populate` thunk — both the Vitest and Jest adapters accept a thunk
|
|
109
|
+
* returning a promise — so a fresh clone, a new machine, or CI needs no manual install step.
|
|
110
|
+
*
|
|
111
|
+
* @param params - The same `BuildDemoVaultPopulateParams` the synchronous builder takes.
|
|
112
|
+
* @returns The populate map, ready to hand to a global setup's `populate` or `TemporaryVault.populate`.
|
|
113
|
+
*/
|
|
114
|
+
export declare function buildDemoVaultPopulateAsync(params: BuildDemoVaultPopulateParams): Promise<PopulateFilesParams>;
|
|
@@ -18,18 +18,20 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var demo_vault_populate_exports = {};
|
|
20
20
|
__export(demo_vault_populate_exports, {
|
|
21
|
-
buildDemoVaultPopulate: () => buildDemoVaultPopulate
|
|
21
|
+
buildDemoVaultPopulate: () => buildDemoVaultPopulate,
|
|
22
|
+
resolveInjectedPluginSourceDirectory: () => resolveInjectedPluginSourceDirectory,
|
|
23
|
+
resolveMissingInjectedPlugins: () => resolveMissingInjectedPlugins
|
|
22
24
|
});
|
|
23
25
|
module.exports = __toCommonJS(demo_vault_populate_exports);
|
|
24
26
|
var import_node_fs = require("node:fs");
|
|
25
27
|
var import_node_path = require("node:path");
|
|
28
|
+
var import_community_plugin_registry = require("./community-plugin-registry.cjs");
|
|
29
|
+
var import_config_directory = require("./config-directory.cjs");
|
|
26
30
|
var import_demo_vault_tree = require("./demo-vault-tree.cjs");
|
|
27
31
|
var import_type_guards = require("./type-guards.cjs");
|
|
28
|
-
const OBSIDIAN_CONFIG_DIR =
|
|
32
|
+
const OBSIDIAN_CONFIG_DIR = import_config_directory.DEFAULT_CONFIG_DIRECTORY;
|
|
29
33
|
const PLUGINS_DIR = "plugins";
|
|
30
34
|
const DATA_JSON = "data.json";
|
|
31
|
-
const MANIFEST_JSON = "manifest.json";
|
|
32
|
-
const MAIN_JS = "main.js";
|
|
33
35
|
const DATA_JSON_INDENT = 2;
|
|
34
36
|
const DEFAULT_OBSIDIAN_CONFIG_FILES = ["app.json", "appearance.json", "core-plugins.json"];
|
|
35
37
|
function buildDemoVaultPopulate(params) {
|
|
@@ -46,15 +48,39 @@ function buildDemoVaultPopulate(params) {
|
|
|
46
48
|
}
|
|
47
49
|
return map;
|
|
48
50
|
}
|
|
51
|
+
function resolveInjectedPluginSourceDirectory(params) {
|
|
52
|
+
const { demoVaultPath, plugin } = params;
|
|
53
|
+
return plugin.sourceDirectory ?? (0, import_node_path.join)(demoVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, plugin.pluginId);
|
|
54
|
+
}
|
|
55
|
+
function resolveMissingInjectedPlugins(params) {
|
|
56
|
+
const { demoVaultPath } = params;
|
|
57
|
+
return params.injectPlugins.filter((plugin) => {
|
|
58
|
+
if (plugin.sourceDirectory !== void 0) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const fileNames = readPluginFileNames(resolveInjectedPluginSourceDirectory({ demoVaultPath, plugin }));
|
|
62
|
+
return import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES.some((assetName) => !fileNames.includes(assetName));
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function buildMissingPluginRemedy(demoVaultPath, plugin) {
|
|
66
|
+
if (plugin.sourceDirectory !== void 0) {
|
|
67
|
+
return "It was read from an explicit `sourceDirectory`, which opts it out of the headless bootstrap \u2014 build it into that directory, or drop `sourceDirectory` to install it from its published release.";
|
|
68
|
+
}
|
|
69
|
+
return `Install it headlessly with \`npx obsidian-integration-testing bootstrap-demo-vault --demo-vault "${demoVaultPath}"\`, or switch this setup to \`buildDemoVaultPopulateAsync\`, which installs missing plugins itself. Opening demo-vault/ in Obsidian once so demo-vault-helper installs it also works.`;
|
|
70
|
+
}
|
|
71
|
+
function readPluginFileNames(sourceDirectory) {
|
|
72
|
+
return (0, import_node_fs.existsSync)(sourceDirectory) ? (0, import_node_fs.readdirSync)(sourceDirectory, { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => entry.name) : [];
|
|
73
|
+
}
|
|
49
74
|
function seedPlugin(demoVaultPath, plugin, map) {
|
|
50
75
|
const { data, pluginId } = plugin;
|
|
51
|
-
const sourceDirectory =
|
|
76
|
+
const sourceDirectory = resolveInjectedPluginSourceDirectory({ demoVaultPath, plugin });
|
|
52
77
|
const pluginPrefix = `${OBSIDIAN_CONFIG_DIR}/${PLUGINS_DIR}/${pluginId}`;
|
|
53
|
-
const fileNames = (
|
|
54
|
-
for (const requiredFile of
|
|
78
|
+
const fileNames = readPluginFileNames(sourceDirectory);
|
|
79
|
+
for (const requiredFile of import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES) {
|
|
55
80
|
if (!fileNames.includes(requiredFile)) {
|
|
81
|
+
const remedy = buildMissingPluginRemedy(demoVaultPath, plugin);
|
|
56
82
|
throw new Error(
|
|
57
|
-
`Community plugin "${pluginId}" is not installed in the demo vault (${(0, import_node_path.join)(sourceDirectory, requiredFile)} missing).
|
|
83
|
+
`Community plugin "${pluginId}" is not installed in the demo vault (${(0, import_node_path.join)(sourceDirectory, requiredFile)} missing). ${remedy}`
|
|
58
84
|
);
|
|
59
85
|
}
|
|
60
86
|
}
|
|
@@ -72,6 +98,8 @@ function seedPlugin(demoVaultPath, plugin, map) {
|
|
|
72
98
|
}
|
|
73
99
|
// Annotate the CommonJS export names for ESM import in node:
|
|
74
100
|
0 && (module.exports = {
|
|
75
|
-
buildDemoVaultPopulate
|
|
101
|
+
buildDemoVaultPopulate,
|
|
102
|
+
resolveInjectedPluginSourceDirectory,
|
|
103
|
+
resolveMissingInjectedPlugins
|
|
76
104
|
});
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0LmNqcyc7XG5cbmltcG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5janMnO1xuXG5jb25zdCBPQlNJRElBTl9DT05GSUdfRElSID0gJy5vYnNpZGlhbic7XG5jb25zdCBQTFVHSU5TX0RJUiA9ICdwbHVnaW5zJztcbmNvbnN0IERBVEFfSlNPTiA9ICdkYXRhLmpzb24nO1xuY29uc3QgTUFOSUZFU1RfSlNPTiA9ICdtYW5pZmVzdC5qc29uJztcbmNvbnN0IE1BSU5fSlMgPSAnbWFpbi5qcyc7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSB0byByZWFkIHRoZSBwbHVnaW4ncyBidWlsdCBmaWxlcyBmcm9tLiBFdmVyeSBmaWxlIGRpcmVjdGx5IGluc2lkZSBpdCBpcyBjb3BpZWQgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9gOyBgbWFpbi5qc2AgYW5kIGBtYW5pZmVzdC5qc29uYCBhcmUgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA8ZGVtb1ZhdWx0UGF0aD4vLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPmBcbiAgICovXG5cbiAgcmVhZG9ubHkgc291cmNlRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFNlZWRzIG9uZSBpbmplY3RlZCBwbHVnaW4ncyBiaW5hcmllcyAoYW5kIG9wdGlvbmFsIGBkYXRhLmpzb25gKSBpbnRvIHRoZSBwb3B1bGF0ZSBtYXAuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LCB1c2VkIHRvIHJlc29sdmUgdGhlIGRlZmF1bHQgc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHNlZWQuXG4gKiBAcGFyYW0gbWFwIC0gVGhlIHBvcHVsYXRlIG1hcCB0byB3cml0ZSBpbnRvLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICBjb25zdCBwbHVnaW5QcmVmaXggPSBgJHtPQlNJRElBTl9DT05GSUdfRElSfS8ke1BMVUdJTlNfRElSfS8ke3BsdWdpbklkfWA7XG5cbiAgY29uc3QgZmlsZU5hbWVzID0gZXhpc3RzU3luYyhzb3VyY2VEaXJlY3RvcnkpXG4gICAgPyByZWFkZGlyU3luYyhzb3VyY2VEaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSlcbiAgICA6IFtdO1xuXG4gIGZvciAoY29uc3QgcmVxdWlyZWRGaWxlIG9mIFtNQUlOX0pTLCBNQU5JRkVTVF9KU09OXSkge1xuICAgIGlmICghZmlsZU5hbWVzLmluY2x1ZGVzKHJlcXVpcmVkRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiBgXG4gICAgICAgICAgKyAnT3BlbiBkZW1vLXZhdWx0LyBpbiBPYnNpZGlhbiBvbmNlIHNvIGRlbW8tdmF1bHQtaGVscGVyIGluc3RhbGxzIGl0LCB0aGVuIHJlLXJ1bi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEscUJBSU87QUFDUCx1QkFBcUI7QUFJckIsNkJBQWtDO0FBQ2xDLHlCQUFrQztBQUVsQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sVUFBVTtBQUNoQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGdDQUFnQyxDQUFDLFlBQVksbUJBQW1CLG1CQUFtQjtBQW1FbEYsU0FBUyx1QkFBdUIsUUFBMkQ7QUFDaEcsUUFBTSxFQUFFLGVBQWUsZUFBZSxnQkFBZ0IsQ0FBQyxHQUFHLHNCQUFzQiw4QkFBOEIsSUFBSTtBQUVsSCxRQUFNLFVBQU0sMENBQWtCLGtCQUFrQixTQUFZLEVBQUUsY0FBYyxJQUFJLEVBQUUsZUFBZSxjQUFjLENBQUM7QUFFaEgsYUFBVyxjQUFjLHFCQUFxQjtBQUM1QyxVQUFNLGlCQUFhLHVCQUFLLGVBQWUscUJBQXFCLFVBQVU7QUFDdEUsWUFBSSwyQkFBVyxVQUFVLEdBQUc7QUFDMUIsVUFBSSxHQUFHLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxRQUFJLDZCQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTQSxTQUFTLFdBQVcsZUFBdUIsUUFBNEIsS0FBZ0M7QUFDckcsUUFBTSxFQUFFLE1BQU0sU0FBUyxJQUFJO0FBQzNCLFFBQU0sa0JBQWtCLE9BQU8sdUJBQW1CLHVCQUFLLGVBQWUscUJBQXFCLGFBQWEsUUFBUTtBQUNoSCxRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLGdCQUFZLDJCQUFXLGVBQWUsUUFDeEMsNEJBQVksaUJBQWlCLEVBQUUsZUFBZSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxNQUFNLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSSxJQUNqSCxDQUFDO0FBRUwsYUFBVyxnQkFBZ0IsQ0FBQyxTQUFTLGFBQWEsR0FBRztBQUNuRCxRQUFJLENBQUMsVUFBVSxTQUFTLFlBQVksR0FBRztBQUNyQyxZQUFNLElBQUk7QUFBQSxRQUNSLHFCQUFxQixRQUFRLDZDQUF5Qyx1QkFBSyxpQkFBaUIsWUFBWSxDQUFDO0FBQUEsTUFFM0c7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLGFBQVcsWUFBWSxXQUFXO0FBRWhDLFFBQUksYUFBYSxhQUFhLFNBQVMsUUFBVztBQUNoRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLEdBQUcsWUFBWSxJQUFJLFFBQVEsRUFBRSxRQUFJLGlDQUFhLHVCQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sZUFBbUIsc0NBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0LmNqcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LmNqcyc7XG5pbXBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcblxuLypcbiAqIEJvdGggdGhlIGZvbGRlciB0aGUgZGVtbyB2YXVsdCdzIG93biBjb21taXR0ZWQgY29uZmlnIHNpdHMgaW4gb24gZGlzaywgYW5kIHRoZSBkZXN0aW5hdGlvbiB0aGUgbWFwXG4gKiBuYW1lcyBmb3IgaXQuIFRoZSB0d28gY29pbmNpZGUgYnkgY29uc3RydWN0aW9uOiB0aGUgc291cmNlIGlzIGEgcmVwbyBmb2xkZXIgT2JzaWRpYW4gY3JlYXRlZCB1bmRlciBpdHNcbiAqIGRlZmF1bHQsIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlIG9uIHRoZSBydW4gaXMgYXBwbGllZCB0byB0aGUgZGVzdGluYXRpb24ga2V5cyBsYXRlciwgYnlcbiAqIGByZW1hcENvbmZpZ0RpcmVjdG9yeUtleXNgIGluIGBnbG9iYWwtc2V0dXAtY29yZWAsIHdoaWNoIGlzIHdoZXJlIHRoZSBvdmVycmlkZSBpcyBhY3R1YWxseSBrbm93bi5cbiAqL1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9IERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWTtcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxxQkFJTztBQUNQLHVCQUFxQjtBQUlyQix1Q0FBNEM7QUFDNUMsOEJBQXlDO0FBQ3pDLDZCQUFrQztBQUNsQyx5QkFBa0M7QUFRbEMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sWUFBWTtBQUNsQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGdDQUFnQyxDQUFDLFlBQVksbUJBQW1CLG1CQUFtQjtBQW9IbEYsU0FBUyx1QkFBdUIsUUFBMkQ7QUFDaEcsUUFBTSxFQUFFLGVBQWUsZUFBZSxnQkFBZ0IsQ0FBQyxHQUFHLHNCQUFzQiw4QkFBOEIsSUFBSTtBQUVsSCxRQUFNLFVBQU0sMENBQWtCLGtCQUFrQixTQUFZLEVBQUUsY0FBYyxJQUFJLEVBQUUsZUFBZSxjQUFjLENBQUM7QUFFaEgsYUFBVyxjQUFjLHFCQUFxQjtBQUM1QyxVQUFNLGlCQUFhLHVCQUFLLGVBQWUscUJBQXFCLFVBQVU7QUFDdEUsWUFBSSwyQkFBVyxVQUFVLEdBQUc7QUFDMUIsVUFBSSxHQUFHLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxRQUFJLDZCQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLHFDQUFxQyxRQUE0RDtBQUMvRyxRQUFNLEVBQUUsZUFBZSxPQUFPLElBQUk7QUFDbEMsU0FBTyxPQUFPLHVCQUFtQix1QkFBSyxlQUFlLHFCQUFxQixhQUFhLE9BQU8sUUFBUTtBQUN4RztBQWNPLFNBQVMsOEJBQThCLFFBQW1FO0FBQy9HLFFBQU0sRUFBRSxjQUFjLElBQUk7QUFDMUIsU0FBTyxPQUFPLGNBQWMsT0FBTyxDQUFDLFdBQVc7QUFDN0MsUUFBSSxPQUFPLG9CQUFvQixRQUFXO0FBQ3hDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxZQUFZLG9CQUFvQixxQ0FBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQyxDQUFDO0FBQ3JHLFdBQU8sNkRBQTRCLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxTQUFTLFNBQVMsQ0FBQztBQUFBLEVBQ3ZGLENBQUM7QUFDSDtBQVlBLFNBQVMseUJBQXlCLGVBQXVCLFFBQW9DO0FBQzNGLE1BQUksT0FBTyxvQkFBb0IsUUFBVztBQUN4QyxXQUFPO0FBQUEsRUFFVDtBQUVBLFNBQU8sb0dBQW9HLGFBQWE7QUFHMUg7QUFRQSxTQUFTLG9CQUFvQixpQkFBbUM7QUFDOUQsYUFBTywyQkFBVyxlQUFlLFFBQzdCLDRCQUFZLGlCQUFpQixFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksSUFDakgsQ0FBQztBQUNQO0FBVUEsU0FBUyxXQUFXLGVBQXVCLFFBQTRCLEtBQWdDO0FBQ3JHLFFBQU0sRUFBRSxNQUFNLFNBQVMsSUFBSTtBQUMzQixRQUFNLGtCQUFrQixxQ0FBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQztBQUN0RixRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLFlBQVksb0JBQW9CLGVBQWU7QUFFckQsYUFBVyxnQkFBZ0IsOERBQTZCO0FBQ3RELFFBQUksQ0FBQyxVQUFVLFNBQVMsWUFBWSxHQUFHO0FBQ3JDLFlBQU0sU0FBUyx5QkFBeUIsZUFBZSxNQUFNO0FBQzdELFlBQU0sSUFBSTtBQUFBLFFBQ1IscUJBQXFCLFFBQVEsNkNBQXlDLHVCQUFLLGlCQUFpQixZQUFZLENBQUMsY0FBYyxNQUFNO0FBQUEsTUFDL0g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLGFBQVcsWUFBWSxXQUFXO0FBRWhDLFFBQUksYUFBYSxhQUFhLFNBQVMsUUFBVztBQUNoRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLEdBQUcsWUFBWSxJQUFJLFFBQVEsRUFBRSxRQUFJLGlDQUFhLHVCQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sZUFBbUIsc0NBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|