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
|
@@ -29,6 +29,23 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
29
29
|
* The Appium server URL (e.g. `'http://localhost:4723'`).
|
|
30
30
|
*/
|
|
31
31
|
readonly appiumUrl: string;
|
|
32
|
+
/**
|
|
33
|
+
* Timeout in milliseconds for Obsidian Mobile to get as far as `globalThis.app`
|
|
34
|
+
* existing after the vault is (re)opened.
|
|
35
|
+
*
|
|
36
|
+
* The first of the two budgets the transport spends after `location.reload()`.
|
|
37
|
+
* It covers the app's own cold start — the WebView reloading and Obsidian's
|
|
38
|
+
* bundle coming up — which on a cold or contended guest can take minutes, and
|
|
39
|
+
* is not work {@link layoutReadyTimeoutInMilliseconds} should be sized for.
|
|
40
|
+
* Only once `globalThis.app` appears does that far tighter clock start.
|
|
41
|
+
*
|
|
42
|
+
* Splitting the two is what stops a first run after a machine restart from
|
|
43
|
+
* failing by design: the old single 90s wall clock started at the reload, so a
|
|
44
|
+
* cold app start spent it before Obsidian had begun laying anything out.
|
|
45
|
+
*
|
|
46
|
+
* @default `180000`
|
|
47
|
+
*/
|
|
48
|
+
readonly appStartTimeoutInMilliseconds?: number;
|
|
32
49
|
/**
|
|
33
50
|
* The Android AVD (Android Virtual Device) name.
|
|
34
51
|
*
|
|
@@ -48,9 +65,8 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
48
65
|
*/
|
|
49
66
|
readonly deviceId?: string;
|
|
50
67
|
/**
|
|
51
|
-
* Timeout in milliseconds for waiting, after `sys.boot_completed`, for
|
|
52
|
-
*
|
|
53
|
-
* established.
|
|
68
|
+
* Timeout in milliseconds for waiting, after `sys.boot_completed`, for the
|
|
69
|
+
* emulator to become idle before the Appium session is established.
|
|
54
70
|
*
|
|
55
71
|
* `sys.boot_completed` fires *before* the guest is actually idle: package
|
|
56
72
|
* optimization and system services keep churning, so establishing the session
|
|
@@ -58,8 +74,12 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
58
74
|
* contend with that work and inflates session establishment ~3x. The factory
|
|
59
75
|
* instead waits until the boot animation has stopped and the package manager
|
|
60
76
|
* is serving, proceeding early once idle or after this budget (best-effort — a
|
|
61
|
-
* timeout logs a warning and proceeds). Set `0` to skip the wait.
|
|
62
|
-
*
|
|
77
|
+
* timeout logs a warning and proceeds). Set `0` to skip the wait.
|
|
78
|
+
*
|
|
79
|
+
* Applies to a **reused** device as well as a harness-started one. A device
|
|
80
|
+
* that is merely present in `adb devices` can still be mid-`dex2oat`, and
|
|
81
|
+
* skipping the gate there is what left a run polling a churning guest until
|
|
82
|
+
* {@link layoutReadyTimeoutInMilliseconds} ran out.
|
|
63
83
|
*
|
|
64
84
|
* @default `60000`
|
|
65
85
|
*/
|
|
@@ -88,14 +108,21 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
88
108
|
*/
|
|
89
109
|
readonly isEmulatorVisible?: boolean;
|
|
90
110
|
/**
|
|
91
|
-
* Timeout in milliseconds for waiting for `app.workspace.layoutReady
|
|
92
|
-
* the
|
|
111
|
+
* Timeout in milliseconds for waiting for `app.workspace.layoutReady`, counted
|
|
112
|
+
* from the moment {@link appStartTimeoutInMilliseconds} is satisfied — not
|
|
113
|
+
* from the reload.
|
|
114
|
+
*
|
|
115
|
+
* The second of the two budgets the transport spends after `location.reload()`.
|
|
116
|
+
* It covers only Obsidian's own work — opening the vault and loading every
|
|
117
|
+
* plugin — once the app itself is up, which is why it can stay tight: measured
|
|
118
|
+
* at ~1s, and ≤8.4s under 12-core + disk + memory stress.
|
|
93
119
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
120
|
+
* Blowing it therefore means Obsidian genuinely stalled, **or** that each probe
|
|
121
|
+
* round-trip is being inflated by a busy guest. The timeout error names which,
|
|
122
|
+
* by reporting the probe count and slowest round-trip alongside the furthest
|
|
123
|
+
* startup milestone reached: a handful of probes each taking tens of seconds is
|
|
124
|
+
* a contended guest, and the knob for that is
|
|
125
|
+
* {@link deviceIdleTimeoutInMilliseconds}, not this one.
|
|
99
126
|
*
|
|
100
127
|
* @default `90000`
|
|
101
128
|
*/
|
|
@@ -114,6 +141,31 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
114
141
|
* @default `7200000`
|
|
115
142
|
*/
|
|
116
143
|
readonly leftoverMaxAgeInMilliseconds?: number;
|
|
144
|
+
/**
|
|
145
|
+
* Timeout in milliseconds for waiting, after the device-idle gate, for the
|
|
146
|
+
* emulator to report a **validated default network** before the Appium session
|
|
147
|
+
* is established.
|
|
148
|
+
*
|
|
149
|
+
* A device can be idle, fully packaged and answering `adb` while still having
|
|
150
|
+
* no route: the two {@link deviceIdleTimeoutInMilliseconds} signals are
|
|
151
|
+
* satisfied well before the default network is created and validated, which
|
|
152
|
+
* lands ~80s into guest uptime. That gap is dangerous rather than merely slow
|
|
153
|
+
* — a test that reaches the network there runs to completion against a
|
|
154
|
+
* silently **empty result**, which no assertion inside the suite can tell
|
|
155
|
+
* apart from a genuinely empty response.
|
|
156
|
+
*
|
|
157
|
+
* The factory polls `dumpsys connectivity` until an active default network
|
|
158
|
+
* reports validation, proceeding early once it does or after this budget
|
|
159
|
+
* (best-effort — a timeout logs a warning naming the missing network and
|
|
160
|
+
* proceeds). Set `0` to skip the wait, e.g. for a deliberately offline AVD or
|
|
161
|
+
* a suite that never touches the network.
|
|
162
|
+
*
|
|
163
|
+
* Applies to a **reused** device as well as a harness-started one, for the
|
|
164
|
+
* same reason the idle gate does.
|
|
165
|
+
*
|
|
166
|
+
* @default `120000`
|
|
167
|
+
*/
|
|
168
|
+
readonly networkReadyTimeoutInMilliseconds?: number;
|
|
117
169
|
/**
|
|
118
170
|
* Number of extra attempts to enable the plugin and verify it loaded, on top
|
|
119
171
|
* of the first attempt.
|
|
@@ -188,6 +240,30 @@ export interface ObsidianAndroidAppiumTransportOptions {
|
|
|
188
240
|
* @default `true`
|
|
189
241
|
*/
|
|
190
242
|
readonly shouldAutoStartAppium?: boolean;
|
|
243
|
+
/**
|
|
244
|
+
* Whether the auto-started emulator may resume — and refresh — the AVD's
|
|
245
|
+
* saved boot snapshot.
|
|
246
|
+
*
|
|
247
|
+
* When `false` (the default) the emulator is started with
|
|
248
|
+
* `-no-snapshot-load -no-snapshot-save`, so every run cold-boots a guest whose
|
|
249
|
+
* state nothing carried over. That is the hermetic default a test harness
|
|
250
|
+
* owes its callers, and it is also the safe one: a snapshot the harness loads
|
|
251
|
+
* but never writes rots unnoticed, and the failure it eventually produces — a
|
|
252
|
+
* device that serves adb, accepts a session, then drops `offline` about half a
|
|
253
|
+
* minute later — is indistinguishable from a code regression. Measured on one
|
|
254
|
+
* AVD back to back, a resumed snapshot killed the guest ~90s in *every* time,
|
|
255
|
+
* while the same AVD cold-booted in 50s and stayed up.
|
|
256
|
+
*
|
|
257
|
+
* Set it to `true` on a **persistent runner** whose AVD is not shared with
|
|
258
|
+
* anything else: the emulator then both loads and saves `default_boot`, so the
|
|
259
|
+
* snapshot each run resumes is one a previous run wrote, and the ~112s cold
|
|
260
|
+
* boot is largely bought back. The trade is test isolation — a guest that
|
|
261
|
+
* carries state between runs — so it is opt-in per project, never a default.
|
|
262
|
+
* Ignored when reusing an already-running device (nothing is launched).
|
|
263
|
+
*
|
|
264
|
+
* @default `false`
|
|
265
|
+
*/
|
|
266
|
+
readonly shouldReuseEmulatorSnapshot?: boolean;
|
|
191
267
|
/**
|
|
192
268
|
* Whether the harness removes the temporary directories earlier runs leaked.
|
|
193
269
|
*
|
|
@@ -244,6 +320,35 @@ export interface ObsidianCdpTransportOptions {
|
|
|
244
320
|
* Defaults to 30000
|
|
245
321
|
*/
|
|
246
322
|
readonly commandTimeoutInMilliseconds?: number;
|
|
323
|
+
/**
|
|
324
|
+
* The vault's **config folder** — Obsidian's per-vault *Override config
|
|
325
|
+
* folder* setting, e.g. `'.obsidian-desktop'`. Must start with a dot, must not
|
|
326
|
+
* be the bare dot, and must not contain a path separator; anything else throws
|
|
327
|
+
* before Obsidian is launched, because Obsidian itself would silently
|
|
328
|
+
* substitute `.obsidian`.
|
|
329
|
+
*
|
|
330
|
+
* Needed to open a vault that keeps its settings somewhere other than
|
|
331
|
+
* `.obsidian` — a vault with a stale `.obsidian` beside the real folder would
|
|
332
|
+
* otherwise open successfully against the wrong settings and report success.
|
|
333
|
+
* The override lives in `localStorage`, keyed by vault id, and so is scoped to
|
|
334
|
+
* a user-data directory: an owned instance gets a fresh temp one and therefore
|
|
335
|
+
* inherits nothing from the user's Obsidian, however that vault is configured
|
|
336
|
+
* there.
|
|
337
|
+
*
|
|
338
|
+
* Setting it costs one extra boot phase: the instance is launched to the
|
|
339
|
+
* starter screen, the override is written in that renderer, and the vault is
|
|
340
|
+
* then opened over IPC. After the vault is ready its actual
|
|
341
|
+
* `app.vault.configDir` is read back and any mismatch throws
|
|
342
|
+
* `ConfigDirectoryFallbackError` — there is no knob to downgrade that, because a
|
|
343
|
+
* vault opened against the wrong config folder is silently the wrong vault.
|
|
344
|
+
*
|
|
345
|
+
* Only meaningful in owned mode; **ignored in attach mode** ({@link ObsidianCdpTransportOptions.port}
|
|
346
|
+
* set), where the vault is opened by the user's own Obsidian under its own
|
|
347
|
+
* config.
|
|
348
|
+
*
|
|
349
|
+
* @default `undefined` (Obsidian's own default, `.obsidian`)
|
|
350
|
+
*/
|
|
351
|
+
readonly configDirectory?: string;
|
|
247
352
|
/**
|
|
248
353
|
* Grace window in milliseconds for fast-failing a **dead boot** of the owned
|
|
249
354
|
* instance.
|
|
@@ -442,3 +547,17 @@ export type ObsidianTransportOptions = ObsidianAndroidAppiumTransportOptions | O
|
|
|
442
547
|
* @returns `true` for a mobile transport, `false` for desktop.
|
|
443
548
|
*/
|
|
444
549
|
export declare function checkIsMobileTransport(options: ObsidianTransportOptions): boolean;
|
|
550
|
+
/**
|
|
551
|
+
* The config folder a vault the harness **owns** will actually read, or `undefined` when it is
|
|
552
|
+
* Obsidian's own default.
|
|
553
|
+
*
|
|
554
|
+
* {@link ObsidianCdpTransportOptions.configDirectory} is the only knob that moves it, and it is
|
|
555
|
+
* meaningful only in owned mode: in attach mode the vault is opened by the user's own Obsidian under
|
|
556
|
+
* its own config, and on Android there is no override at all. Anything the harness writes into a vault
|
|
557
|
+
* before it is opened has to go where that vault will look, so this is the answer every such writer
|
|
558
|
+
* needs — see `ensureHeadlessVaultConfig`.
|
|
559
|
+
*
|
|
560
|
+
* @param options - The resolved transport options.
|
|
561
|
+
* @returns The overridden config folder name, or `undefined` for Obsidian's default.
|
|
562
|
+
*/
|
|
563
|
+
export declare function resolveOwnedConfigDirectory(options: ObsidianTransportOptions): string | undefined;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
function checkIsMobileTransport(options) {
|
|
2
2
|
return options.type === "obsidian-android-appium";
|
|
3
3
|
}
|
|
4
|
+
function resolveOwnedConfigDirectory(options) {
|
|
5
|
+
if (options.type !== "obsidian-cdp" || options.port !== void 0) {
|
|
6
|
+
return void 0;
|
|
7
|
+
}
|
|
8
|
+
return options.configDirectory;
|
|
9
|
+
}
|
|
4
10
|
export {
|
|
5
|
-
checkIsMobileTransport
|
|
11
|
+
checkIsMobileTransport,
|
|
12
|
+
resolveOwnedConfigDirectory
|
|
6
13
|
};
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIEFWRCAoQW5kcm9pZCBWaXJ0dWFsIERldmljZSkgbmFtZS5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBmYWN0b3J5IGxhdW5jaGVzIGBlbXVsYXRvciAtYXZkIDxhdmROYW1lPmAgYXMgYSBiYWNrZ3JvdW5kXG4gICAqIHByb2Nlc3MgYW5kIHBvbGxzIHVudGlsIHRoZSBkZXZpY2UgYXBwZWFycy4gVGhlIGVtdWxhdG9yIGlzIGtpbGxlZFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIFJ1biBgZW11bGF0b3IgLWxpc3QtYXZkc2AgdG8gc2VlIGF2YWlsYWJsZSBBVkQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCB0byByZXVzZSAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLiBXaGVuIHByZXNlbnQgYWxvbmdzaWRlIHtAbGluayBzZXNzaW9uSWR9LCB0aGUgdHJhbnNwb3J0XG4gICAqIGZhY3Rvcnkgc2tpcHMgZW11bGF0b3Igc3RhcnR1cCBhbmQgYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLCBmb3IgYVxuICAgKiBoYXJuZXNzLXN0YXJ0ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC4gT25seSBhcHBsaWVzXG4gICAqIHRvIGEgaGFybmVzcy1zdGFydGVkIGVtdWxhdG9yLCBub3QgYSByZXVzZWQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93bi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIHByb2Nlc3MgaXMgc3Bhd25lZCB3aXRoXG4gICAqIGl0cyBjb25zb2xlIHdpbmRvdyBoaWRkZW4gKGB3aW5kb3dzSGlkZWApIGFuZCBpdHMgb3V0cHV0IGRpc2NhcmRlZCwgc28gaXRcbiAgICogbmVpdGhlciBzdGVhbHMgZm9jdXMgbm9yIHdyaXRlcyB0byB0aGUgaW52b2tpbmcgdGVybWluYWwuIElnbm9yZWQgd2hlblxuICAgKiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIEFwcGl1bSBzZXJ2ZXIgKHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19XG4gICAqIGBmYWxzZWAsIG9yIHRoZSBzZXJ2ZXIgYWxyZWFkeSByZWFjaGFibGUpLiBTZXQgYHRydWVgIHRvIHNlZSB0aGUgc2VydmVyIGxvZyB3aW5kb3dcbiAgICogYW5kIGl0cyBsaXZlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBbmRyb2lkIGVtdWxhdG9yIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgZW11bGF0b3IgaXMgc3RhcnRlZCB3aXRoIGAtbm8td2luZG93YFxuICAgKiAoaGVhZGxlc3MpLCBzbyBpdCBuZXZlciBzdGVhbHMgZm9jdXMuIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZ1xuICAgKiBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQgdG8gaGlkZSkuIFNldCBgdHJ1ZWAgdG8gd2F0Y2ggdGhlIGVtdWxhdG9yIFVJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgYWZ0ZXJcbiAgICogdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQuXG4gICAqXG4gICAqIFJlZ2lzdGVyaW5nIGEgdmF1bHQgdHJpZ2dlcnMgYSBmdWxsIE9ic2lkaWFuIHJlLWluaXQgKGBsb2NhdGlvbi5yZWxvYWQoKWBcbiAgICogcmVvcGVucyB0aGUgdmF1bHQgYW5kIHJlbG9hZHMgZXZlcnkgcGx1Z2luIFx1MjAxNCB0aGUgaGVhdmllc3Qgc3RhcnR1cCBzdGVwKS4gT25cbiAgICogYSBjb2xkLWJvb3RlZCBvciB1bmRlci1wcm92aXNpb25lZCBlbXVsYXRvciB0aGF0IGluaXQgY2FuIHRha2UgYSB3aGlsZSwgc29cbiAgICogdGhpcyBidWRnZXQgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHRyYW5zcG9ydCB0aW1lb3V0cy4gUmFpc2UgaXQgZnVydGhlciBpZlxuICAgKiByZWxlYXNlcyBzdGlsbCBmbGFrZSBvbiBzbG93IENJIGVtdWxhdG9ycy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciAqKmhvc3QqKiBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmVcbiAgICoge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfSByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBHb3Zlcm5zIHRoZSBob3N0LXNpZGUgc3dlZXAgb25seSAodGhlIGB0ZW1wLXZhdWx0LSpgIHN0YWdpbmcgZGlyZWN0b3JpZXNcbiAgICogdGhpcyBydW4ncyBtYWNoaW5lIGFjY3VtdWxhdGVzIGluIGl0cyB0ZW1wIGRpcikuIFRoZSAqKmRldmljZSoqIHN3ZWVwIGlzXG4gICAqIHVuY29uZGl0aW9uYWw6IEFuZHJvaWQgcnVucyBob2xkIHRoZSBleGNsdXNpdmUgYGFuZHJvaWRgIHNldHVwIGxvY2ssIHNvIG5vXG4gICAqIGNvbmN1cnJlbnQgcnVuIGNhbiBvd24gYSBkZXZpY2UgdmF1bHQsIGFuZCBhbiBhZ2UgZ2F0ZSB0aGVyZSB3b3VsZCBsZXQgYVxuICAgKiB2YXVsdCBsZWFrZWQgbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1biBcdTIwMTQgd2hpY2ggaXMgdGhlIGZhaWx1cmVcbiAgICogbG9vcCB0aGUgc3dlZXAgZXhpc3RzIHRvIGJyZWFrLiBTZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBob3N0IG1hdGNoIHRvby5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaGFybmVzcyByZW1vdmVzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgZWFjaCBydW4gc3dlZXBzIGF0IHN0YXJ0ICoqYW5kKiogYXQgZW5kOiBvbiB0aGVcbiAgICogZGV2aWNlLCBldmVyeSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcnkgdW5kZXIge0BsaW5rIHZhdWx0QmFzZVBhdGh9IChwbHVzIHRoZVxuICAgKiBzdGFsZSB2YXVsdCByZWdpc3RyYXRpb25zIGluIE9ic2lkaWFuIE1vYmlsZSdzIGBsb2NhbFN0b3JhZ2VgKTsgb24gdGhlIGhvc3QsXG4gICAqIHRoZSBsZWZ0b3ZlciBgdGVtcC12YXVsdC0qYCBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGRpcmVjdG9yaWVzIG9sZGVyIHRoYW5cbiAgICoge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LlxuICAgKlxuICAgKiBBIHJ1biB0aGF0IGRpZXMgY2Fubm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiBcdTIwMTQgaXRzIHRlYXJkb3duIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogV2ViVmlldywgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIHdoYXQgbW9zdCBBbmRyb2lkIGZhaWx1cmVzIGFyZSBcdTIwMTQgc28gdGhlXG4gICAqIHJlc2lkdWUgYWNjdW11bGF0ZXMgYW5kIHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXAgZW51bWVyYXRpb24gdW50aWwgaXRcbiAgICogbWlzc2VzIHRoZSBXZWJWaWV3LXJlYWRpbmVzcyBidWRnZXQuIFRoZSBzdGFydCBzd2VlcCBpcyB0aGUgaGFsZiB0aGF0IGJyZWFrc1xuICAgKiB0aGF0IGxvb3AsIGJlY2F1c2UgaXQgcnVucyBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZGllLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogT24gc2xvdyBlbXVsYXRvcnMsIHRoZSBDaHJvbWVEcml2ZXIgcHJveHkgdGhhdCBoYW5kbGVzIFdlYlZpZXcgY29tbWFuZHNcbiAgICogbWF5IG5vdCBiZSByZWFkeSBpbW1lZGlhdGVseSBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gc3RhcnRzLiBUaGlzIHRpbWVvdXRcbiAgICogY29udHJvbHMgaG93IGxvbmcgdG8gcG9sbCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBkZXNrdG9wIHRlc3RpbmcgdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHRoZSBoYXJuZXNzICoqbGF1bmNoZXMgYW5kXG4gKiBvd25zIGFuIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlKiogaW4gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciAobmV2ZXJcbiAqIHRvdWNoaW5nIHRoZSB1c2VyJ3MgT2JzaWRpYW4pLCBjb25uZWN0ZWQgb3ZlciBhIGZyZWUgQ0RQIHBvcnQuIFByb3ZpZGVcbiAqIHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH0gdG8gaW5zdGVhZCBhdHRhY2ggdG8gYW5cbiAqIGFscmVhZHktcnVubmluZyBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byAzMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBUaGUgZ2F0ZSBtYXR0ZXJzIG1vc3Qgb24gZGVza3RvcDogcnVucyBhcmUgZGVsaWJlcmF0ZWx5ICoqbm90Kiogc2VyaWFsaXplZFxuICAgKiAoZWFjaCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSwgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzXG4gICAqIG9uZSB0ZW1wIGRpcmVjdG9yeSwgc28gYSB5b3VuZyBgdGVtcC12YXVsdC0qYCAvIGB1c2VyZGF0YS0qYCBkaXJlY3RvcnkgbWF5XG4gICAqIHdlbGwgYmVsb25nIHRvIGEgcnVuIHRoYXQgaXMgc3RpbGwgaW4gZmxpZ2h0LiBSYWlzZSBpdCBpZiBhIHJ1biBvZiB5b3VycyBjYW5cbiAgICogb3V0bGl2ZSB0aGUgZGVmYXVsdDsgc2V0IGAwYCB0byByZW1vdmUgZXZlcnkgbWF0Y2ggcmVnYXJkbGVzcyBvZiBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipFbGVjdHJvbiBzaGVsbCoqIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFRoZSBtYXRjaGluZyBHaXRIdWIgcmVsZWFzZSBpbnN0YWxsZXIgaXMgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRvIGFcbiAgICogcG9ydGFibGUgc2hlbGwgKGNhY2hlZCBmb3IgcmV1c2UpLiBQdWJsaWMgcmVsZWFzZXMgb25seSBcdTIwMTQgY2F0YWx5c3QgYnVpbGRzXG4gICAqIGhhdmUgbm8gcHVibGljIGluc3RhbGxlci4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipPYnNpZGlhbiBhcHAgdmVyc2lvbioqIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBWZXJzaW9ucyBhdCBvciBhYm92ZSB0aGUgc2hlbGwgdmVyc2lvbiBhcmUgYXBwbGllZCBhcyBhIGNoZWFwIGFzYXIgc3dhcDtcbiAgICogb2xkZXIgdmVyc2lvbnMgdHJhbnNwYXJlbnRseSB1c2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgdXNlcidzIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9XG4gICAqIChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0byAodGhlXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgaXQgd2FzIGxhdW5jaGVkIHdpdGgpLiBXaGVuIHNldCwgdGhlIGhhcm5lc3NcbiAgICogYXR0YWNoZXMgaW5zdGVhZCBvZiBvd25pbmcgYW4gaW5zdGFuY2UsIGFuZCB0aGUgdmVyc2lvbiBrbm9icyBhcmUgaWdub3JlZC5cbiAgICogV2hlbiBvbWl0dGVkLCBhbiBvd25lZCBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5XG4gICAqIGNob3NlbiBmcmVlIHBvcnQgKG5vIHBvcnQgaXMgaGFyZGNvZGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGF1bmNoIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoIENocm9taXVtJ3Mgc2FuZGJveCBkaXNhYmxlZFxuICAgKiAoYC0tbm8tc2FuZGJveGApLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gYm9vdCBhbiBvd25lZCBpbnN0YW5jZSBvbiBMaW51eCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciBcdTIwMTQgZS5nLiBhIHBvcnRhYmxlIHNoZWxsXG4gICAqIGV4dHJhY3RlZCBmcm9tIGFuIGluc3RhbGxlciwgb3IgYSBDSSBydW5uZXIgbGF1bmNoaW5nIGFzIGEgbm9uLXJvb3QgdXNlciwgaW5cbiAgICogd2hpY2ggY2FzZSB0aGUgcmVuZGVyZXIgb3RoZXJ3aXNlIHJlZnVzZXMgdG8gc3RhcnQuIEhhcm1sZXNzIG9uXG4gICAqIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSB1c2VyJ3MgcnVubmluZyBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgYW5kIGF0IGVuZCBmb3JcbiAgICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZyBkaXJlY3RvcmllcyBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGluc3RhbmNlIHByb2ZpbGVzXG4gICAqIG9sZGVyIHRoYW4ge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LiBBIHJ1biBraWxsZWQgbWlkLWZsaWdodFxuICAgKiBuZXZlciByZWFjaGVzIGl0cyBvd24gY2xlYW51cCwgc28gd2l0aG91dCB0aGlzIHRoZSB0ZW1wIGRpcmVjdG9yeSBncm93c1xuICAgKiB3aXRob3V0IGJvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhbiAqKnVucnVubmFibGUqKiBpbnN0YWxsZXJcdTIxOTRhcHAgdmVyc2lvbiBwYWlyIGZhaWxzIGZhc3QgYmVmb3JlIGxhdW5jaC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgKHRoZVxuICAgKiBvbGRlc3QgaW5zdGFsbGVyIHRoZSBhcHAncyBhc2FyIGNhbiBib290IG9uKSB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24sIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLiBTZXQgYGZhbHNlYCB0byBsZXQgdGhlIHBpbiBwcm9jZWVkIHRvIGxhdW5jaFxuICAgKiBpbnN0ZWFkIFx1MjAxNCB3aGVyZSB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbFxuICAgKiAoYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLCBzZWUge0BsaW5rIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kc30pXG4gICAqIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXNcbiAgICogc3VyZmFjZWQgYXMgZGF0YSByYXRoZXIgdGhhbiB0aHJvd24uIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdCBhZnRlciBib290LlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCB0b28gb2xkIGZvciBpdCwgdGhlIGluc3RhbmNlXG4gICAqIG1heSBub3QgZGVhZC1ib290IFx1MjAxNCBpdCBjYW4gc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZFxuICAgKiBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmcgKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWBcbiAgICogKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBhZ2FpbnN0IHRoZSBwaW5cbiAgICogcG9zdC1ib290IGFuZCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBvbiBhIG1pc21hdGNoLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBsZXQgdGhlIGJvb3QgcHJvY2VlZCBcdTIwMTQgdGhlIG1pc21hdGNoIGlzIHRoZW4gc3VyZmFjZWQgYXMgZGF0YSAodGhlIGZhbGxiYWNrXG4gICAqIHZlcmRpY3QpIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlIHJ1bm5pbmcgYVxuICAgKiBzd2FwcGVkLWluIGFzYXIgKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQsIGFuZCB3aGVuIG5vIGFzYXIgaXNcbiAgICogc3dhcHBlZCBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyAqKmJvdGgqKiBjb21wYXRpYmlsaXR5IG5hZ3M6IHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIChhXG4gICAqIHJ1bm5hYmxlIGluc3RhbGxlciBiZWxvdyB0aGUgcmVjb21tZW5kZWQgZmxvb3IpIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZyAoYSBsaXZlIEVsZWN0cm9uIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZFxuICAgKiBtaW5pbXVtKS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzcyBsb2c7IHNldFxuICAgKiBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBjb21wdXRlZCBhbmQgc3VyZmFjZWQgYXNcbiAgICogZGF0YSAoYGNvbXBhdGliaWxpdHlgIC8gYGVsZWN0cm9uQ29tcGF0aWJpbGl0eWApLCBvbmx5IHRoZSBsb2cgaXMgc3VwcHJlc3NlZC5cbiAgICogRG9lcyBub3QgYWZmZWN0IHRoZSBgJ3VucnVubmFibGUnYCB0aHJvdyAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSkuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZFxuICAgKiBpbnN0YW5jZSAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZXNlIG9wdGlvbnMgZGVzY3JpYmUgYSBtb2JpbGUgdHJhbnNwb3J0LlxuICpcbiAqIFRoZSBzYW1lIGZhY3QgYXMge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmlzTW9iaWxlfSwgYnV0IGtub3dhYmxlIGZyb20gdGhlIG9wdGlvbnMgYWxvbmUgXHUyMDE0IHNvIGEgY2FsbGVyXG4gKiBjYW4gYWN0IG9uIGl0IGJlZm9yZSBwYXlpbmcgZm9yIGEgZGV2aWNlLiBSZWFkaW5nIGl0IG9mZiBhIGxpdmUgdHJhbnNwb3J0IG1lYW5zIGJvb3RpbmcgdGhlIGVtdWxhdG9yXG4gKiBhbmQgdGhlIEFwcGl1bSBzZXNzaW9uIGZpcnN0LCB3aGljaCBpcyB+NzAgcyB0byBsZWFybiBzb21ldGhpbmcgdGhlIGRpc2NyaW1pbmFudCBhbHJlYWR5IHNheXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbW9iaWxlIHRyYW5zcG9ydCwgYGZhbHNlYCBmb3IgZGVza3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrZU8sU0FBUyx1QkFBdUIsU0FBNEM7QUFDakYsU0FBTyxRQUFRLFNBQVM7QUFDMUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBPYnNpZGlhbiBNb2JpbGUgdG8gZ2V0IGFzIGZhciBhcyBgZ2xvYmFsVGhpcy5hcHBgXG4gICAqIGV4aXN0aW5nIGFmdGVyIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBidWRnZXRzIHRoZSB0cmFuc3BvcnQgc3BlbmRzIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAuXG4gICAqIEl0IGNvdmVycyB0aGUgYXBwJ3Mgb3duIGNvbGQgc3RhcnQgXHUyMDE0IHRoZSBXZWJWaWV3IHJlbG9hZGluZyBhbmQgT2JzaWRpYW4nc1xuICAgKiBidW5kbGUgY29taW5nIHVwIFx1MjAxNCB3aGljaCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGd1ZXN0IGNhbiB0YWtlIG1pbnV0ZXMsIGFuZFxuICAgKiBpcyBub3Qgd29yayB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IHNob3VsZCBiZSBzaXplZCBmb3IuXG4gICAqIE9ubHkgb25jZSBgZ2xvYmFsVGhpcy5hcHBgIGFwcGVhcnMgZG9lcyB0aGF0IGZhciB0aWdodGVyIGNsb2NrIHN0YXJ0LlxuICAgKlxuICAgKiBTcGxpdHRpbmcgdGhlIHR3byBpcyB3aGF0IHN0b3BzIGEgZmlyc3QgcnVuIGFmdGVyIGEgbWFjaGluZSByZXN0YXJ0IGZyb21cbiAgICogZmFpbGluZyBieSBkZXNpZ246IHRoZSBvbGQgc2luZ2xlIDkwcyB3YWxsIGNsb2NrIHN0YXJ0ZWQgYXQgdGhlIHJlbG9hZCwgc28gYVxuICAgKiBjb2xkIGFwcCBzdGFydCBzcGVudCBpdCBiZWZvcmUgT2JzaWRpYW4gaGFkIGJlZ3VuIGxheWluZyBhbnl0aGluZyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFuZHJvaWQgQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBuYW1lLlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIHRvIHJldXNlIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gaXNcbiAgICogZXN0YWJsaXNoZWQuIFdoZW4gcHJlc2VudCBhbG9uZ3NpZGUge0BsaW5rIHNlc3Npb25JZH0sIHRoZSB0cmFuc3BvcnRcbiAgICogZmFjdG9yeSBza2lwcyBlbXVsYXRvciBzdGFydHVwIGFuZCBhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZywgYWZ0ZXIgYHN5cy5ib290X2NvbXBsZXRlZGAsIGZvciB0aGVcbiAgICogZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC5cbiAgICpcbiAgICogQXBwbGllcyB0byBhICoqcmV1c2VkKiogZGV2aWNlIGFzIHdlbGwgYXMgYSBoYXJuZXNzLXN0YXJ0ZWQgb25lLiBBIGRldmljZVxuICAgKiB0aGF0IGlzIG1lcmVseSBwcmVzZW50IGluIGBhZGIgZGV2aWNlc2AgY2FuIHN0aWxsIGJlIG1pZC1gZGV4Mm9hdGAsIGFuZFxuICAgKiBza2lwcGluZyB0aGUgZ2F0ZSB0aGVyZSBpcyB3aGF0IGxlZnQgYSBydW4gcG9sbGluZyBhIGNodXJuaW5nIGd1ZXN0IHVudGlsXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gcmFuIG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgYG5weCBhcHBpdW1gIHNlcnZlciBwcm9jZXNzIGlzIHNwYXduZWQgd2l0aFxuICAgKiBpdHMgY29uc29sZSB3aW5kb3cgaGlkZGVuIChgd2luZG93c0hpZGVgKSBhbmQgaXRzIG91dHB1dCBkaXNjYXJkZWQsIHNvIGl0XG4gICAqIG5laXRoZXIgc3RlYWxzIGZvY3VzIG5vciB3cml0ZXMgdG8gdGhlIGludm9raW5nIHRlcm1pbmFsLiBJZ25vcmVkIHdoZW5cbiAgICogYXR0YWNoaW5nIHRvIGFuIGFscmVhZHktcnVubmluZyBBcHBpdW0gc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfVxuICAgKiBgZmFsc2VgLCBvciB0aGUgc2VydmVyIGFscmVhZHkgcmVhY2hhYmxlKS4gU2V0IGB0cnVlYCB0byBzZWUgdGhlIHNlcnZlciBsb2cgd2luZG93XG4gICAqIGFuZCBpdHMgbGl2ZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90XG4gICAqIGZyb20gdGhlIHJlbG9hZC5cbiAgICpcbiAgICogVGhlIHNlY29uZCBvZiB0aGUgdHdvIGJ1ZGdldHMgdGhlIHRyYW5zcG9ydCBzcGVuZHMgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYC5cbiAgICogSXQgY292ZXJzIG9ubHkgT2JzaWRpYW4ncyBvd24gd29yayBcdTIwMTQgb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmcgZXZlcnlcbiAgICogcGx1Z2luIFx1MjAxNCBvbmNlIHRoZSBhcHAgaXRzZWxmIGlzIHVwLCB3aGljaCBpcyB3aHkgaXQgY2FuIHN0YXkgdGlnaHQ6IG1lYXN1cmVkXG4gICAqIGF0IH4xcywgYW5kIFx1MjI2NDguNHMgdW5kZXIgMTItY29yZSArIGRpc2sgKyBtZW1vcnkgc3RyZXNzLlxuICAgKlxuICAgKiBCbG93aW5nIGl0IHRoZXJlZm9yZSBtZWFucyBPYnNpZGlhbiBnZW51aW5lbHkgc3RhbGxlZCwgKipvcioqIHRoYXQgZWFjaCBwcm9iZVxuICAgKiByb3VuZC10cmlwIGlzIGJlaW5nIGluZmxhdGVkIGJ5IGEgYnVzeSBndWVzdC4gVGhlIHRpbWVvdXQgZXJyb3IgbmFtZXMgd2hpY2gsXG4gICAqIGJ5IHJlcG9ydGluZyB0aGUgcHJvYmUgY291bnQgYW5kIHNsb3dlc3Qgcm91bmQtdHJpcCBhbG9uZ3NpZGUgdGhlIGZ1cnRoZXN0XG4gICAqIHN0YXJ0dXAgbWlsZXN0b25lIHJlYWNoZWQ6IGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIGlzXG4gICAqIGEgY29udGVuZGVkIGd1ZXN0LCBhbmQgdGhlIGtub2IgZm9yIHRoYXQgaXNcbiAgICoge0BsaW5rIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LCBub3QgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgbGVmdG92ZXIgKipob3N0KiogZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlXG4gICAqIHtAbGluayBzaG91bGRTd2VlcExlZnRvdmVyc30gcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogR292ZXJucyB0aGUgaG9zdC1zaWRlIHN3ZWVwIG9ubHkgKHRoZSBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzXG4gICAqIHRoaXMgcnVuJ3MgbWFjaGluZSBhY2N1bXVsYXRlcyBpbiBpdHMgdGVtcCBkaXIpLiBUaGUgKipkZXZpY2UqKiBzd2VlcCBpc1xuICAgKiB1bmNvbmRpdGlvbmFsOiBBbmRyb2lkIHJ1bnMgaG9sZCB0aGUgZXhjbHVzaXZlIGBhbmRyb2lkYCBzZXR1cCBsb2NrLCBzbyBub1xuICAgKiBjb25jdXJyZW50IHJ1biBjYW4gb3duIGEgZGV2aWNlIHZhdWx0LCBhbmQgYW4gYWdlIGdhdGUgdGhlcmUgd291bGQgbGV0IGFcbiAgICogdmF1bHQgbGVha2VkIG1pbnV0ZXMgYWdvIHN1cnZpdmUgaW50byB0aGUgbmV4dCBydW4gXHUyMDE0IHdoaWNoIGlzIHRoZSBmYWlsdXJlXG4gICAqIGxvb3AgdGhlIHN3ZWVwIGV4aXN0cyB0byBicmVhay4gU2V0IGAwYCB0byByZW1vdmUgZXZlcnkgaG9zdCBtYXRjaCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIHRoZSBkZXZpY2UtaWRsZSBnYXRlLCBmb3IgdGhlXG4gICAqIGVtdWxhdG9yIHRvIHJlcG9ydCBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZSB0aGUgQXBwaXVtIHNlc3Npb25cbiAgICogaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEEgZGV2aWNlIGNhbiBiZSBpZGxlLCBmdWxseSBwYWNrYWdlZCBhbmQgYW5zd2VyaW5nIGBhZGJgIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAgKiBubyByb3V0ZTogdGhlIHR3byB7QGxpbmsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gc2lnbmFscyBhcmVcbiAgICogc2F0aXNmaWVkIHdlbGwgYmVmb3JlIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkLCB3aGljaFxuICAgKiBsYW5kcyB+ODBzIGludG8gZ3Vlc3QgdXB0aW1lLiBUaGF0IGdhcCBpcyBkYW5nZXJvdXMgcmF0aGVyIHRoYW4gbWVyZWx5IHNsb3dcbiAgICogXHUyMDE0IGEgdGVzdCB0aGF0IHJlYWNoZXMgdGhlIG5ldHdvcmsgdGhlcmUgcnVucyB0byBjb21wbGV0aW9uIGFnYWluc3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5IHJlc3VsdCoqLCB3aGljaCBubyBhc3NlcnRpb24gaW5zaWRlIHRoZSBzdWl0ZSBjYW4gdGVsbFxuICAgKiBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgZmFjdG9yeSBwb2xscyBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHVudGlsIGFuIGFjdGl2ZSBkZWZhdWx0IG5ldHdvcmtcbiAgICogcmVwb3J0cyB2YWxpZGF0aW9uLCBwcm9jZWVkaW5nIGVhcmx5IG9uY2UgaXQgZG9lcyBvciBhZnRlciB0aGlzIGJ1ZGdldFxuICAgKiAoYmVzdC1lZmZvcnQgXHUyMDE0IGEgdGltZW91dCBsb2dzIGEgd2FybmluZyBuYW1pbmcgdGhlIG1pc3NpbmcgbmV0d29yayBhbmRcbiAgICogcHJvY2VlZHMpLiBTZXQgYDBgIHRvIHNraXAgdGhlIHdhaXQsIGUuZy4gZm9yIGEgZGVsaWJlcmF0ZWx5IG9mZmxpbmUgQVZEIG9yXG4gICAqIGEgc3VpdGUgdGhhdCBuZXZlciB0b3VjaGVzIHRoZSBuZXR3b3JrLlxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGEgKipyZXVzZWQqKiBkZXZpY2UgYXMgd2VsbCBhcyBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUsIGZvciB0aGVcbiAgICogc2FtZSByZWFzb24gdGhlIGlkbGUgZ2F0ZSBkb2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgXHUyMDE0IGFuZCByZWZyZXNoIFx1MjAxNCB0aGUgQVZEJ3NcbiAgICogc2F2ZWQgYm9vdCBzbmFwc2hvdC5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aFxuICAgKiBgLW5vLXNuYXBzaG90LWxvYWQgLW5vLXNuYXBzaG90LXNhdmVgLCBzbyBldmVyeSBydW4gY29sZC1ib290cyBhIGd1ZXN0IHdob3NlXG4gICAqIHN0YXRlIG5vdGhpbmcgY2FycmllZCBvdmVyLiBUaGF0IGlzIHRoZSBoZXJtZXRpYyBkZWZhdWx0IGEgdGVzdCBoYXJuZXNzXG4gICAqIG93ZXMgaXRzIGNhbGxlcnMsIGFuZCBpdCBpcyBhbHNvIHRoZSBzYWZlIG9uZTogYSBzbmFwc2hvdCB0aGUgaGFybmVzcyBsb2Fkc1xuICAgKiBidXQgbmV2ZXIgd3JpdGVzIHJvdHMgdW5ub3RpY2VkLCBhbmQgdGhlIGZhaWx1cmUgaXQgZXZlbnR1YWxseSBwcm9kdWNlcyBcdTIwMTQgYVxuICAgKiBkZXZpY2UgdGhhdCBzZXJ2ZXMgYWRiLCBhY2NlcHRzIGEgc2Vzc2lvbiwgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhXG4gICAqIG1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gTWVhc3VyZWQgb24gb25lXG4gICAqIEFWRCBiYWNrIHRvIGJhY2ssIGEgcmVzdW1lZCBzbmFwc2hvdCBraWxsZWQgdGhlIGd1ZXN0IH45MHMgaW4gKmV2ZXJ5KiB0aW1lLFxuICAgKiB3aGlsZSB0aGUgc2FtZSBBVkQgY29sZC1ib290ZWQgaW4gNTBzIGFuZCBzdGF5ZWQgdXAuXG4gICAqXG4gICAqIFNldCBpdCB0byBgdHJ1ZWAgb24gYSAqKnBlcnNpc3RlbnQgcnVubmVyKiogd2hvc2UgQVZEIGlzIG5vdCBzaGFyZWQgd2l0aFxuICAgKiBhbnl0aGluZyBlbHNlOiB0aGUgZW11bGF0b3IgdGhlbiBib3RoIGxvYWRzIGFuZCBzYXZlcyBgZGVmYXVsdF9ib290YCwgc28gdGhlXG4gICAqIHNuYXBzaG90IGVhY2ggcnVuIHJlc3VtZXMgaXMgb25lIGEgcHJldmlvdXMgcnVuIHdyb3RlLCBhbmQgdGhlIH4xMTJzIGNvbGRcbiAgICogYm9vdCBpcyBsYXJnZWx5IGJvdWdodCBiYWNrLiBUaGUgdHJhZGUgaXMgdGVzdCBpc29sYXRpb24gXHUyMDE0IGEgZ3Vlc3QgdGhhdFxuICAgKiBjYXJyaWVzIHN0YXRlIGJldHdlZW4gcnVucyBcdTIwMTQgc28gaXQgaXMgb3B0LWluIHBlciBwcm9qZWN0LCBuZXZlciBhIGRlZmF1bHQuXG4gICAqIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZyBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgKiphbmQqKiBhdCBlbmQ6IG9uIHRoZVxuICAgKiBkZXZpY2UsIGV2ZXJ5IGB0ZW1wLXZhdWx0LSpgIGRpcmVjdG9yeSB1bmRlciB7QGxpbmsgdmF1bHRCYXNlUGF0aH0gKHBsdXMgdGhlXG4gICAqIHN0YWxlIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWApOyBvbiB0aGUgaG9zdCxcbiAgICogdGhlIGxlZnRvdmVyIGB0ZW1wLXZhdWx0LSpgIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgZGlyZWN0b3JpZXMgb2xkZXIgdGhhblxuICAgKiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uXG4gICAqXG4gICAqIEEgcnVuIHRoYXQgZGllcyBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIFx1MjAxNCBpdHMgdGVhcmRvd24gZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBXZWJWaWV3LCBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlIFx1MjAxNCBzbyB0aGVcbiAgICogcmVzaWR1ZSBhY2N1bXVsYXRlcyBhbmQgc2xvd3MgdGhlIG5leHQgcnVuJ3Mgc3RhcnR1cCBlbnVtZXJhdGlvbiB1bnRpbCBpdFxuICAgKiBtaXNzZXMgdGhlIFdlYlZpZXctcmVhZGluZXNzIGJ1ZGdldC4gVGhlIHN0YXJ0IHN3ZWVwIGlzIHRoZSBoYWxmIHRoYXQgYnJlYWtzXG4gICAqIHRoYXQgbG9vcCwgYmVjYXVzZSBpdCBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBPbiBzbG93IGVtdWxhdG9ycywgdGhlIENocm9tZURyaXZlciBwcm94eSB0aGF0IGhhbmRsZXMgV2ViVmlldyBjb21tYW5kc1xuICAgKiBtYXkgbm90IGJlIHJlYWR5IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBBcHBpdW0gc2Vzc2lvbiBzdGFydHMuIFRoaXMgdGltZW91dFxuICAgKiBjb250cm9scyBob3cgbG9uZyB0byBwb2xsIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IG9wdGlvbnMgZm9yIGRlc2t0b3AgdGVzdGluZyB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVza3RvcCB0cmFuc3BvcnQuIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgKipsYXVuY2hlcyBhbmRcbiAqIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UqKiBpbiBhIHRlbXBvcmFyeSB1c2VyLWRhdGEgZGlyIChuZXZlclxuICogdG91Y2hpbmcgdGhlIHVzZXIncyBPYnNpZGlhbiksIGNvbm5lY3RlZCBvdmVyIGEgZnJlZSBDRFAgcG9ydC4gUHJvdmlkZVxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5wb3J0fSB0byBpbnN0ZWFkIGF0dGFjaCB0byBhblxuICogYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqIERlZmF1bHRzIHRvIDMwMDAwXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyAqKmNvbmZpZyBmb2xkZXIqKiBcdTIwMTQgT2JzaWRpYW4ncyBwZXItdmF1bHQgKk92ZXJyaWRlIGNvbmZpZ1xuICAgKiBmb2xkZXIqIHNldHRpbmcsIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBNdXN0IHN0YXJ0IHdpdGggYSBkb3QsIG11c3Qgbm90XG4gICAqIGJlIHRoZSBiYXJlIGRvdCwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYSBwYXRoIHNlcGFyYXRvcjsgYW55dGhpbmcgZWxzZSB0aHJvd3NcbiAgICogYmVmb3JlIE9ic2lkaWFuIGlzIGxhdW5jaGVkLCBiZWNhdXNlIE9ic2lkaWFuIGl0c2VsZiB3b3VsZCBzaWxlbnRseVxuICAgKiBzdWJzdGl0dXRlIGAub2JzaWRpYW5gLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gb3BlbiBhIHZhdWx0IHRoYXQga2VlcHMgaXRzIHNldHRpbmdzIHNvbWV3aGVyZSBvdGhlciB0aGFuXG4gICAqIGAub2JzaWRpYW5gIFx1MjAxNCBhIHZhdWx0IHdpdGggYSBzdGFsZSBgLm9ic2lkaWFuYCBiZXNpZGUgdGhlIHJlYWwgZm9sZGVyIHdvdWxkXG4gICAqIG90aGVyd2lzZSBvcGVuIHN1Y2Nlc3NmdWxseSBhZ2FpbnN0IHRoZSB3cm9uZyBzZXR0aW5ncyBhbmQgcmVwb3J0IHN1Y2Nlc3MuXG4gICAqIFRoZSBvdmVycmlkZSBsaXZlcyBpbiBgbG9jYWxTdG9yYWdlYCwga2V5ZWQgYnkgdmF1bHQgaWQsIGFuZCBzbyBpcyBzY29wZWQgdG9cbiAgICogYSB1c2VyLWRhdGEgZGlyZWN0b3J5OiBhbiBvd25lZCBpbnN0YW5jZSBnZXRzIGEgZnJlc2ggdGVtcCBvbmUgYW5kIHRoZXJlZm9yZVxuICAgKiBpbmhlcml0cyBub3RoaW5nIGZyb20gdGhlIHVzZXIncyBPYnNpZGlhbiwgaG93ZXZlciB0aGF0IHZhdWx0IGlzIGNvbmZpZ3VyZWRcbiAgICogdGhlcmUuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgY29zdHMgb25lIGV4dHJhIGJvb3QgcGhhc2U6IHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCB0byB0aGVcbiAgICogc3RhcnRlciBzY3JlZW4sIHRoZSBvdmVycmlkZSBpcyB3cml0dGVuIGluIHRoYXQgcmVuZGVyZXIsIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogdGhlbiBvcGVuZWQgb3ZlciBJUEMuIEFmdGVyIHRoZSB2YXVsdCBpcyByZWFkeSBpdHMgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyByZWFkIGJhY2sgYW5kIGFueSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JgIFx1MjAxNCB0aGVyZSBpcyBubyBrbm9iIHRvIGRvd25ncmFkZSB0aGF0LCBiZWNhdXNlIGFcbiAgICogdmF1bHQgb3BlbmVkIGFnYWluc3QgdGhlIHdyb25nIGNvbmZpZyBmb2xkZXIgaXMgc2lsZW50bHkgdGhlIHdyb25nIHZhdWx0LlxuICAgKlxuICAgKiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTsgKippZ25vcmVkIGluIGF0dGFjaCBtb2RlKiogKHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH1cbiAgICogc2V0KSwgd2hlcmUgdGhlIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlciBpdHMgb3duXG4gICAqIGNvbmZpZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGAgKE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQsIGAub2JzaWRpYW5gKVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSAqKmRlYWQgYm9vdCoqIG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZS5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGNhbm5vdCBydW4gb24gdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsICh0aGUgaW5zdGFsbGVyXG4gICAqIHZlcnNpb24gaXMgdG9vIG9sZCBmb3IgdGhlIGFwcCB2ZXJzaW9uKSwgdGhlIHJlbmRlcmVyIGxvYWRzIGJ1dCBuZXZlclxuICAgKiBib290c3RyYXBzOiBgZG9jdW1lbnQuYm9keWAgc3RheXMgZW1wdHkgYW5kIGB3aW5kb3cuYXBwYCByZW1haW5zXG4gICAqIGB1bmRlZmluZWRgIFx1MjAxNCBhIGJsYWNrIHNjcmVlbi4gUmF0aGVyIHRoYW4gd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzXG4gICAqIHRpbWVvdXQsIHRoZSBvd25lZC12YXVsdCByZWFkaW5lc3MgcG9sbCBjb25jbHVkZXMgdGhlIGJvb3QgaXMgZGVhZCBvbmNlIHRoZVxuICAgKiByZW5kZXJlciBoYXMgYmVlbiBgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgIGZvciB0aGlzIGxvbmcgd2l0aCBub1xuICAgKiBgd2luZG93LmFwcGAgYW5kIGFuIGVtcHR5IGA8Ym9keT5gLCBhbmQgdGhyb3dzIGFcbiAgICogYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2VcbiAgICogKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvIGRpc2FibGUgZmFzdC1mYWlsIGFuZFxuICAgKiByZXN0b3JlIHRoZSBwbGFpbiB3YWl0LW91dC10aGUtcmVhZGluZXNzLXRpbWVvdXQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqIERlZmF1bHRzIHRvIGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1hcmtzIHtAbGluayBwb3J0fSBhcyB0aGUgQ0RQIHBvcnQgb2YgYSAqKmhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlKipcbiAgICogdGhhdCB0aGUgZ2xvYmFsIHNldHVwIGFscmVhZHkgbGF1bmNoZWQgYW5kIHByZXBhcmVkICh2YXVsdCByZWdpc3RlcmVkLFxuICAgKiBwbHVnaW4gZW5hYmxlZCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2VycyB2aWFcbiAgICogdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLiBXaGVuIHNldCxcbiAgICogdGhlIHdvcmtlciAqKmF0dGFjaGVzKiogdG8gdGhlIG93bmVkIGluc3RhbmNlIG9uIHtAbGluayBwb3J0fSBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyBpdHMgb3duLCBhbmQgc2tpcHMgdGhlIHVzZXItc2NvcGUgdmF1bHQtcmVnaXN0cmF0aW9uIHByZWZsaWdodCBcdTIwMTRcbiAgICogdGhlIG93bmVkIGluc3RhbmNlJ3MgdmF1bHQgbGl2ZXMgaW4gYW4gaXNvbGF0ZWQgdXNlci1kYXRhIGNvbmZpZywgbm90IHRoZVxuICAgKiB1c2VyLXNjb3BlIHJlZ2lzdHJ5LiBEbyBub3Qgc2V0IHRoaXMgbWFudWFsbHk7IGZvciBwbGFpbiBhdHRhY2ggbW9kZSB1c2VcbiAgICoge0BsaW5rIHBvcnR9IGFsb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIGRlc2t0b3AgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgLCB0aGUgaGFybmVzcyBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aFxuICAgKiBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZCBtb3ZlcyBpdHMgd2luZG93ICoqb2ZmLXNjcmVlbioqIG9uY2UgRWxlY3Ryb24nc1xuICAgKiByZW1vdGUgYnJpZGdlIGlzIGF2YWlsYWJsZSwgc28gdGhlIHJ1biBuZXZlciBzdGVhbHMgZm9jdXMgb3IgcG9wcyBhIHdpbmRvdyBpblxuICAgKiBmcm9udCBvZiB5b3UuIE9mZi1zY3JlZW4gKG5vdCBtaW5pbWl6ZWQpIGtlZXBzIHRoZSByZW5kZXJlciBsaXZlLCBzb1xuICAgKiBgc2V0VGltZW91dGAsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQgYmVoYXZlXG4gICAqIGlkZW50aWNhbGx5IHRvIGEgdmlzaWJsZSB3aW5kb3cuIERlZmF1bHRzIHRvIGB0cnVlYDsgaW50ZWdyYXRpb24gc2V0dXBcbiAgICogZXhwbGljaXRseSBwYXNzZXMgYGZhbHNlYCB0byBhdm9pZCBzdGVhbGluZyBmb2N1cy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZVxuICAgKiAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIG1vdmVzIHRoZSB1c2VyJ3Mgb3duIHJ1bm5pbmcgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSG93IG9sZCBhIGxlZnRvdmVyIGRpcmVjdG9yeSBtdXN0IGJlIGJlZm9yZSB7QGxpbmsgc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIFRoZSBnYXRlIG1hdHRlcnMgbW9zdCBvbiBkZXNrdG9wOiBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKipub3QqKiBzZXJpYWxpemVkXG4gICAqIChlYWNoIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UpLCBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXNcbiAgICogb25lIHRlbXAgZGlyZWN0b3J5LCBzbyBhIHlvdW5nIGB0ZW1wLXZhdWx0LSpgIC8gYHVzZXJkYXRhLSpgIGRpcmVjdG9yeSBtYXlcbiAgICogd2VsbCBiZWxvbmcgdG8gYSBydW4gdGhhdCBpcyBzdGlsbCBpbiBmbGlnaHQuIFJhaXNlIGl0IGlmIGEgcnVuIG9mIHlvdXJzIGNhblxuICAgKiBvdXRsaXZlIHRoZSBkZWZhdWx0OyBzZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBtYXRjaCByZWdhcmRsZXNzIG9mIGFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKkVsZWN0cm9uIHNoZWxsKiogKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuXG4gICAqXG4gICAqIEFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogVGhlIG1hdGNoaW5nIEdpdEh1YiByZWxlYXNlIGluc3RhbGxlciBpcyBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQgdG8gYVxuICAgKiBwb3J0YWJsZSBzaGVsbCAoY2FjaGVkIGZvciByZXVzZSkuIFB1YmxpYyByZWxlYXNlcyBvbmx5IFx1MjAxNCBjYXRhbHlzdCBidWlsZHNcbiAgICogaGF2ZSBubyBwdWJsaWMgaW5zdGFsbGVyLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKk9ic2lkaWFuIGFwcCB2ZXJzaW9uKiogKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFZlcnNpb25zIGF0IG9yIGFib3ZlIHRoZSBzaGVsbCB2ZXJzaW9uIGFyZSBhcHBsaWVkIGFzIGEgY2hlYXAgYXNhciBzd2FwO1xuICAgKiBvbGRlciB2ZXJzaW9ucyB0cmFuc3BhcmVudGx5IHVzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsLiBXaGVuIG9taXR0ZWQsXG4gICAqIHRoZSB1c2VyJ3MgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuIElnbm9yZWQgd2hlbiB7QGxpbmsgcG9ydH1cbiAgICogKGF0dGFjaCBtb2RlKSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvICh0aGVcbiAgICogYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBpdCB3YXMgbGF1bmNoZWQgd2l0aCkuIFdoZW4gc2V0LCB0aGUgaGFybmVzc1xuICAgKiBhdHRhY2hlcyBpbnN0ZWFkIG9mIG93bmluZyBhbiBpbnN0YW5jZSwgYW5kIHRoZSB2ZXJzaW9uIGtub2JzIGFyZSBpZ25vcmVkLlxuICAgKiBXaGVuIG9taXR0ZWQsIGFuIG93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHlcbiAgICogY2hvc2VuIGZyZWUgcG9ydCAobm8gcG9ydCBpcyBoYXJkY29kZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IGFuIG93bmVkIGluc3RhbmNlIG9uIExpbnV4IHdoZW4gdGhlcmUgaXMgbm9cbiAgICogY29ycmVjdGx5LWNvbmZpZ3VyZWQgc2V0dWlkIGBjaHJvbWUtc2FuZGJveGAgaGVscGVyIFx1MjAxNCBlLmcuIGEgcG9ydGFibGUgc2hlbGxcbiAgICogZXh0cmFjdGVkIGZyb20gYW4gaW5zdGFsbGVyLCBvciBhIENJIHJ1bm5lciBsYXVuY2hpbmcgYXMgYSBub24tcm9vdCB1c2VyLCBpblxuICAgKiB3aGljaCBjYXNlIHRoZSByZW5kZXJlciBvdGhlcndpc2UgcmVmdXNlcyB0byBzdGFydC4gSGFybWxlc3Mgb25cbiAgICogV2luZG93cy9tYWNPUy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHVzZXIncyBydW5uaW5nIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhhcm5lc3MgcmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQuXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGVhY2ggcnVuIHN3ZWVwcyBhdCBzdGFydCBhbmQgYXQgZW5kIGZvclxuICAgKiBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgaW5zdGFuY2UgcHJvZmlsZXNcbiAgICogb2xkZXIgdGhhbiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uIEEgcnVuIGtpbGxlZCBtaWQtZmxpZ2h0XG4gICAqIG5ldmVyIHJlYWNoZXMgaXRzIG93biBjbGVhbnVwLCBzbyB3aXRob3V0IHRoaXMgdGhlIHRlbXAgZGlyZWN0b3J5IGdyb3dzXG4gICAqIHdpdGhvdXQgYm91bmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciAodGhlXG4gICAqIG9sZGVzdCBpbnN0YWxsZXIgdGhlIGFwcCdzIGFzYXIgY2FuIGJvb3Qgb24pIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiwgYmVmb3JlIGFueXRoaW5nXG4gICAqIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoXG4gICAqIGluc3RlYWQgXHUyMDE0IHdoZXJlIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsXG4gICAqIChgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAsIHNlZSB7QGxpbmsgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzfSlcbiAgICogc3RpbGwgY2F0Y2hlcyB0aGUgYmxhY2stc2NyZWVuIGJvb3QsIGFuZCB0aGUgYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCBpc1xuICAgKiBzdXJmYWNlZCBhcyBkYXRhIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiBmYWlscyBmYXN0IGFmdGVyIGJvb3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IG5vdCBkZWFkLWJvb3QgXHUyMDE0IGl0IGNhbiBzaWxlbnRseSByZXZlcnQgdG8gdGhlIGluc3RhbGxlcidzIG93biBidW5kbGVkXG4gICAqIGFzYXIgYW5kIHJ1biB0aGUgKip3cm9uZyAob2xkZXIpKiogdmVyc2lvbiBiZWhpbmQgYSBoZWFsdGh5IFVJLiBXaGVuIGB0cnVlYFxuICAgKiAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFnYWluc3QgdGhlIHBpblxuICAgKiBwb3N0LWJvb3QgYW5kIHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgIG9uIGEgbWlzbWF0Y2guIFNldCBgZmFsc2VgIHRvXG4gICAqIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2ggaXMgdGhlbiBzdXJmYWNlZCBhcyBkYXRhICh0aGUgZmFsbGJhY2tcbiAgICogdmVyZGljdCkgcmF0aGVyIHRoYW4gdGhyb3duLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2UgcnVubmluZyBhXG4gICAqIHN3YXBwZWQtaW4gYXNhciAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCwgYW5kIHdoZW4gbm8gYXNhciBpc1xuICAgKiBzd2FwcGVkIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzICoqYm90aCoqIGNvbXBhdGliaWxpdHkgbmFnczogdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgKGFcbiAgICogcnVubmFibGUgaW5zdGFsbGVyIGJlbG93IHRoZSByZWNvbW1lbmRlZCBmbG9vcikgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nIChhIGxpdmUgRWxlY3Ryb24gYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkXG4gICAqIG1pbmltdW0pLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzIGxvZzsgc2V0XG4gICAqIGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCBhc1xuICAgKiBkYXRhIChgY29tcGF0aWJpbGl0eWAgLyBgZWxlY3Ryb25Db21wYXRpYmlsaXR5YCksIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIGAndW5ydW5uYWJsZSdgIHRocm93IChzZWVcbiAgICoge0BsaW5rIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KS4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkXG4gICAqIGluc3RhbmNlIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZWQgaW4gdml0ZXN0IGBlbnZpcm9ubWVudE9wdGlvbnMub2JzaWRpYW5UcmFuc3BvcnRgIHRvIHNlbGVjdCBhbmRcbiAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zID1cbiAgfCBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gIHwgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlc2Ugb3B0aW9ucyBkZXNjcmliZSBhIG1vYmlsZSB0cmFuc3BvcnQuXG4gKlxuICogVGhlIHNhbWUgZmFjdCBhcyB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuaXNNb2JpbGV9LCBidXQga25vd2FibGUgZnJvbSB0aGUgb3B0aW9ucyBhbG9uZSBcdTIwMTQgc28gYSBjYWxsZXJcbiAqIGNhbiBhY3Qgb24gaXQgYmVmb3JlIHBheWluZyBmb3IgYSBkZXZpY2UuIFJlYWRpbmcgaXQgb2ZmIGEgbGl2ZSB0cmFuc3BvcnQgbWVhbnMgYm9vdGluZyB0aGUgZW11bGF0b3JcbiAqIGFuZCB0aGUgQXBwaXVtIHNlc3Npb24gZmlyc3QsIHdoaWNoIGlzIH43MCBzIHRvIGxlYXJuIHNvbWV0aGluZyB0aGUgZGlzY3JpbWluYW50IGFscmVhZHkgc2F5cy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYSBtb2JpbGUgdHJhbnNwb3J0LCBgZmFsc2VgIGZvciBkZXNrdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc01vYmlsZVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlnIGZvbGRlciBhIHZhdWx0IHRoZSBoYXJuZXNzICoqb3ducyoqIHdpbGwgYWN0dWFsbHkgcmVhZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICogT2JzaWRpYW4ncyBvd24gZGVmYXVsdC5cbiAqXG4gKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLmNvbmZpZ0RpcmVjdG9yeX0gaXMgdGhlIG9ubHkga25vYiB0aGF0IG1vdmVzIGl0LCBhbmQgaXQgaXNcbiAqIG1lYW5pbmdmdWwgb25seSBpbiBvd25lZCBtb2RlOiBpbiBhdHRhY2ggbW9kZSB0aGUgdmF1bHQgaXMgb3BlbmVkIGJ5IHRoZSB1c2VyJ3Mgb3duIE9ic2lkaWFuIHVuZGVyXG4gKiBpdHMgb3duIGNvbmZpZywgYW5kIG9uIEFuZHJvaWQgdGhlcmUgaXMgbm8gb3ZlcnJpZGUgYXQgYWxsLiBBbnl0aGluZyB0aGUgaGFybmVzcyB3cml0ZXMgaW50byBhIHZhdWx0XG4gKiBiZWZvcmUgaXQgaXMgb3BlbmVkIGhhcyB0byBnbyB3aGVyZSB0aGF0IHZhdWx0IHdpbGwgbG9vaywgc28gdGhpcyBpcyB0aGUgYW5zd2VyIGV2ZXJ5IHN1Y2ggd3JpdGVyXG4gKiBuZWVkcyBcdTIwMTQgc2VlIGBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBvdmVycmlkZGVuIGNvbmZpZyBmb2xkZXIgbmFtZSwgb3IgYHVuZGVmaW5lZGAgZm9yIE9ic2lkaWFuJ3MgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeShvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucy50eXBlICE9PSAnb2JzaWRpYW4tY2RwJyB8fCBvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy5jb25maWdEaXJlY3Rvcnk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEra0JPLFNBQVMsdUJBQXVCLFNBQTRDO0FBQ2pGLFNBQU8sUUFBUSxTQUFTO0FBQzFCO0FBZU8sU0FBUyw0QkFBNEIsU0FBdUQ7QUFDakcsTUFBSSxRQUFRLFNBQVMsa0JBQWtCLFFBQVEsU0FBUyxRQUFXO0FBQ2pFLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRO0FBQ2pCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -120,7 +120,13 @@ export interface ObsidianTransport {
|
|
|
120
120
|
* Registers a vault path so Obsidian can target it.
|
|
121
121
|
*
|
|
122
122
|
* On desktop: uses Electron IPC to open the vault and polls for readiness.
|
|
123
|
-
* On mobile: pushes
|
|
123
|
+
* On mobile: pushes only a minimal `.obsidian` marker so the folder is recognized as a vault,
|
|
124
|
+
* points the app's `localStorage` at it, and reloads.
|
|
125
|
+
*
|
|
126
|
+
* It does **not** carry the vault's contents across on either platform — that is
|
|
127
|
+
* {@link ObsidianTransport.pushFiles}' job, which `TemporaryVault.register` runs first. A caller
|
|
128
|
+
* driving a transport directly has to push before registering, or the app opens an empty vault
|
|
129
|
+
* with nothing raised to say so.
|
|
124
130
|
*
|
|
125
131
|
* @param vaultPath - The absolute path to the vault folder.
|
|
126
132
|
*/
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Installs a built plugin into a **harness-owned** vault's config folder, before
|
|
5
|
+
* that vault is ever opened: the build output into
|
|
6
|
+
* `<configDirectory>/plugins/<pluginId>/`, and the id into
|
|
7
|
+
* `<configDirectory>/community-plugins.json` so Obsidian enables it on load.
|
|
8
|
+
*
|
|
9
|
+
* Carved out of `global-setup-core`'s `copyPluginIntoVault` for the same reason
|
|
10
|
+
* `ensureHeadlessVaultConfig` was carved out of the `app.json` write: the write
|
|
11
|
+
* has to go where the vault will actually look, and a `configDirectory` override
|
|
12
|
+
* moves that. `copyPluginIntoVault` still owns the parts around it — resolving
|
|
13
|
+
* `dist/dev` vs `dist/build`, reading the manifest, and refusing a desktop-only
|
|
14
|
+
* plugin on a mobile transport — and delegates only the write here, which is
|
|
15
|
+
* what makes the override path reachable from a unit test.
|
|
16
|
+
*
|
|
17
|
+
* Writing into `.obsidian` while the vault reads `.obsidian-desktop` installs the
|
|
18
|
+
* plugin into a folder nothing looks at, and the enable that follows fails with
|
|
19
|
+
* the generic "enabled but not loaded" shape, naming nothing about a config
|
|
20
|
+
* folder. `resolveOwnedConfigDirectory` (`transport-options.ts`) is the one
|
|
21
|
+
* answer to "which folder will this vault read"; every caller here takes its
|
|
22
|
+
* result.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Parameters for {@link installPluginIntoVault}.
|
|
26
|
+
*/
|
|
27
|
+
export interface InstallPluginIntoVaultParams {
|
|
28
|
+
/**
|
|
29
|
+
* The vault's config folder name, when it is overridden away from
|
|
30
|
+
* {@link DEFAULT_CONFIG_DIRECTORY}. Installing into `.obsidian` while the vault
|
|
31
|
+
* reads `.obsidian-desktop` leaves the plugin where nothing looks for it, so
|
|
32
|
+
* the override has to reach this far.
|
|
33
|
+
*
|
|
34
|
+
* @default `'.obsidian'`
|
|
35
|
+
*/
|
|
36
|
+
readonly configDirectory?: string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* The directory holding the built plugin (`main.js`, `manifest.json`, …) —
|
|
39
|
+
* the resolved `dist/dev` or `dist/build`.
|
|
40
|
+
*/
|
|
41
|
+
readonly distPath: string;
|
|
42
|
+
/**
|
|
43
|
+
* The plugin's id, which names both its folder and its
|
|
44
|
+
* `community-plugins.json` entry.
|
|
45
|
+
*/
|
|
46
|
+
readonly pluginId: string;
|
|
47
|
+
/**
|
|
48
|
+
* The absolute path of the harness-owned vault to install into.
|
|
49
|
+
*/
|
|
50
|
+
readonly vaultPath: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Copies the built plugin into the vault's config folder and marks it as an
|
|
54
|
+
* enabled community plugin.
|
|
55
|
+
*
|
|
56
|
+
* Only ever call this on a vault the harness owns: it overwrites
|
|
57
|
+
* `community-plugins.json` outright, because the harness is the one that decides
|
|
58
|
+
* what a throwaway vault has enabled. Extra community plugins are seeded through
|
|
59
|
+
* `populate` and enabled after open instead, so they do not need to survive this
|
|
60
|
+
* write.
|
|
61
|
+
*
|
|
62
|
+
* @param params - The vault to install into, its config folder, and the build to install.
|
|
63
|
+
*/
|
|
64
|
+
export declare function installPluginIntoVault(params: InstallPluginIntoVaultParams): Promise<void>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cp,
|
|
3
|
+
mkdir,
|
|
4
|
+
writeFile
|
|
5
|
+
} from "node:fs/promises";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { DEFAULT_CONFIG_DIRECTORY } from "./config-directory.mjs";
|
|
8
|
+
const PLUGINS_DIR = "plugins";
|
|
9
|
+
const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
10
|
+
async function installPluginIntoVault(params) {
|
|
11
|
+
const { configDirectory = DEFAULT_CONFIG_DIRECTORY, distPath, pluginId, vaultPath } = params;
|
|
12
|
+
const pluginDirectory = join(vaultPath, configDirectory, PLUGINS_DIR, pluginId);
|
|
13
|
+
await mkdir(pluginDirectory, { recursive: true });
|
|
14
|
+
await cp(distPath, pluginDirectory, { recursive: true });
|
|
15
|
+
await writeFile(join(vaultPath, configDirectory, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
installPluginIntoVault
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXBsdWdpbi1pbnN0YWxsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBidWlsdCBwbHVnaW4gaW50byBhICoqaGFybmVzcy1vd25lZCoqIHZhdWx0J3MgY29uZmlnIGZvbGRlciwgYmVmb3JlXG4gKiB0aGF0IHZhdWx0IGlzIGV2ZXIgb3BlbmVkOiB0aGUgYnVpbGQgb3V0cHV0IGludG9cbiAqIGA8Y29uZmlnRGlyZWN0b3J5Pi9wbHVnaW5zLzxwbHVnaW5JZD4vYCwgYW5kIHRoZSBpZCBpbnRvXG4gKiBgPGNvbmZpZ0RpcmVjdG9yeT4vY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgc28gT2JzaWRpYW4gZW5hYmxlcyBpdCBvbiBsb2FkLlxuICpcbiAqIENhcnZlZCBvdXQgb2YgYGdsb2JhbC1zZXR1cC1jb3JlYCdzIGBjb3B5UGx1Z2luSW50b1ZhdWx0YCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiBgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZ2Agd2FzIGNhcnZlZCBvdXQgb2YgdGhlIGBhcHAuanNvbmAgd3JpdGU6IHRoZSB3cml0ZVxuICogaGFzIHRvIGdvIHdoZXJlIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IGxvb2ssIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlXG4gKiBtb3ZlcyB0aGF0LiBgY29weVBsdWdpbkludG9WYXVsdGAgc3RpbGwgb3ducyB0aGUgcGFydHMgYXJvdW5kIGl0IFx1MjAxNCByZXNvbHZpbmdcbiAqIGBkaXN0L2RldmAgdnMgYGRpc3QvYnVpbGRgLCByZWFkaW5nIHRoZSBtYW5pZmVzdCwgYW5kIHJlZnVzaW5nIGEgZGVza3RvcC1vbmx5XG4gKiBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0IFx1MjAxNCBhbmQgZGVsZWdhdGVzIG9ubHkgdGhlIHdyaXRlIGhlcmUsIHdoaWNoIGlzXG4gKiB3aGF0IG1ha2VzIHRoZSBvdmVycmlkZSBwYXRoIHJlYWNoYWJsZSBmcm9tIGEgdW5pdCB0ZXN0LlxuICpcbiAqIFdyaXRpbmcgaW50byBgLm9ic2lkaWFuYCB3aGlsZSB0aGUgdmF1bHQgcmVhZHMgYC5vYnNpZGlhbi1kZXNrdG9wYCBpbnN0YWxscyB0aGVcbiAqIHBsdWdpbiBpbnRvIGEgZm9sZGVyIG5vdGhpbmcgbG9va3MgYXQsIGFuZCB0aGUgZW5hYmxlIHRoYXQgZm9sbG93cyBmYWlscyB3aXRoXG4gKiB0aGUgZ2VuZXJpYyBcImVuYWJsZWQgYnV0IG5vdCBsb2FkZWRcIiBzaGFwZSwgbmFtaW5nIG5vdGhpbmcgYWJvdXQgYSBjb25maWdcbiAqIGZvbGRlci4gYHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeWAgKGB0cmFuc3BvcnQtb3B0aW9ucy50c2ApIGlzIHRoZSBvbmVcbiAqIGFuc3dlciB0byBcIndoaWNoIGZvbGRlciB3aWxsIHRoaXMgdmF1bHQgcmVhZFwiOyBldmVyeSBjYWxsZXIgaGVyZSB0YWtlcyBpdHNcbiAqIHJlc3VsdC5cbiAqL1xuXG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcblxuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsUGx1Z2luSW50b1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgbmFtZSwgd2hlbiBpdCBpcyBvdmVycmlkZGVuIGF3YXkgZnJvbVxuICAgKiB7QGxpbmsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZfS4gSW5zdGFsbGluZyBpbnRvIGAub2JzaWRpYW5gIHdoaWxlIHRoZSB2YXVsdFxuICAgKiByZWFkcyBgLm9ic2lkaWFuLWRlc2t0b3BgIGxlYXZlcyB0aGUgcGx1Z2luIHdoZXJlIG5vdGhpbmcgbG9va3MgZm9yIGl0LCBzb1xuICAgKiB0aGUgb3ZlcnJpZGUgaGFzIHRvIHJlYWNoIHRoaXMgZmFyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy5vYnNpZGlhbidgXG4gICAqL1xuICByZWFkb25seSBjb25maWdEaXJlY3Rvcnk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgYnVpbHQgcGx1Z2luIChgbWFpbi5qc2AsIGBtYW5pZmVzdC5qc29uYCwgXHUyMDI2KSBcdTIwMTRcbiAgICogdGhlIHJlc29sdmVkIGBkaXN0L2RldmAgb3IgYGRpc3QvYnVpbGRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLCB3aGljaCBuYW1lcyBib3RoIGl0cyBmb2xkZXIgYW5kIGl0c1xuICAgKiBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgZW50cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgaGFybmVzcy1vd25lZCB2YXVsdCB0byBpbnN0YWxsIGludG8uXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgYW5kIG1hcmtzIGl0IGFzIGFuXG4gKiBlbmFibGVkIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogT25seSBldmVyIGNhbGwgdGhpcyBvbiBhIHZhdWx0IHRoZSBoYXJuZXNzIG93bnM6IGl0IG92ZXJ3cml0ZXNcbiAqIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCBvdXRyaWdodCwgYmVjYXVzZSB0aGUgaGFybmVzcyBpcyB0aGUgb25lIHRoYXQgZGVjaWRlc1xuICogd2hhdCBhIHRocm93YXdheSB2YXVsdCBoYXMgZW5hYmxlZC4gRXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgYXJlIHNlZWRlZCB0aHJvdWdoXG4gKiBgcG9wdWxhdGVgIGFuZCBlbmFibGVkIGFmdGVyIG9wZW4gaW5zdGVhZCwgc28gdGhleSBkbyBub3QgbmVlZCB0byBzdXJ2aXZlIHRoaXNcbiAqIHdyaXRlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmF1bHQgdG8gaW5zdGFsbCBpbnRvLCBpdHMgY29uZmlnIGZvbGRlciwgYW5kIHRoZSBidWlsZCB0byBpbnN0YWxsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdpbkludG9WYXVsdChwYXJhbXM6IEluc3RhbGxQbHVnaW5JbnRvVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjb25maWdEaXJlY3RvcnkgPSBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlksIGRpc3RQYXRoLCBwbHVnaW5JZCwgdmF1bHRQYXRoIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgcGx1Z2luRGlyZWN0b3J5ID0gam9pbih2YXVsdFBhdGgsIGNvbmZpZ0RpcmVjdG9yeSwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHZhdWx0UGF0aCwgY29uZmlnRGlyZWN0b3J5LCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBd0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUVyQixTQUFTLGdDQUFnQztBQUV6QyxNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUE4Qy9CLGVBQXNCLHVCQUF1QixRQUFxRDtBQUNoRyxRQUFNLEVBQUUsa0JBQWtCLDBCQUEwQixVQUFVLFVBQVUsVUFBVSxJQUFJO0FBRXRGLFFBQU0sa0JBQWtCLEtBQUssV0FBVyxpQkFBaUIsYUFBYSxRQUFRO0FBQzlFLFFBQU0sTUFBTSxpQkFBaUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxRQUFNLEdBQUcsVUFBVSxpQkFBaUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN2RCxRQUFNLFVBQVUsS0FBSyxXQUFXLGlCQUFpQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure decision for whether unregistering a vault may tear its window down.
|
|
5
|
+
*
|
|
6
|
+
* The desktop CDP transport used to answer this with a single flag. Its
|
|
7
|
+
* readiness guard asks `ownedConfig || isHarnessOwnedInstance` — the two ways
|
|
8
|
+
* "the harness owns this instance" can be true — while its teardown guard asked
|
|
9
|
+
* only `ownedConfig`. A **worker** attached to a harness-owned instance has
|
|
10
|
+
* `isHarnessOwnedInstance: true` and no `ownedConfig` at all (the global setup
|
|
11
|
+
* owns the config; the worker was handed only the port), so it fell straight
|
|
12
|
+
* through the teardown guard and ran `destroyCurrentWindow()` against the vault
|
|
13
|
+
* it was asked to unregister. When that vault is the one the whole run shares,
|
|
14
|
+
* its window is the only one — destroying it quits the app, and every later file
|
|
15
|
+
* fails with `ECONNREFUSED` on a closed CDP port, which reads as a harness
|
|
16
|
+
* outage rather than as a teardown that overreached.
|
|
17
|
+
*
|
|
18
|
+
* Making the two guards identical would fix that and break something else: an
|
|
19
|
+
* attached worker that registers its **own** `TemporaryVault` does need that
|
|
20
|
+
* window closed, and a blanket early-return leaks one stale window per temp
|
|
21
|
+
* vault for the life of the run — each pointing at a directory the disposal has
|
|
22
|
+
* already deleted. Since every worker in a `createSetup` run is an attached one,
|
|
23
|
+
* that is the common path, not an edge case.
|
|
24
|
+
*
|
|
25
|
+
* So the invariant is narrower than either guard expressed: **a worker attached
|
|
26
|
+
* to a harness-owned instance may tear down only a vault it registered itself.**
|
|
27
|
+
* Everything else in that instance belongs to the global setup that launched it.
|
|
28
|
+
*
|
|
29
|
+
* Kept out of the integration-only transport module (excluded from unit tests,
|
|
30
|
+
* `LF:0` in coverage) for the same reason `vault-path-match.ts` is — so the
|
|
31
|
+
* decision is unit-testable while the transport keeps only the plumbing.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Parameters for {@link shouldTearDownVaultWindow}.
|
|
35
|
+
*/
|
|
36
|
+
export interface ShouldTearDownVaultWindowParams {
|
|
37
|
+
/**
|
|
38
|
+
Whether this transport is a worker attached to an instance the harness launched elsewhere.
|
|
39
|
+
*/
|
|
40
|
+
readonly isHarnessOwnedInstance: boolean;
|
|
41
|
+
/**
|
|
42
|
+
Whether this transport launched and owns the instance itself.
|
|
43
|
+
*/
|
|
44
|
+
readonly isOwnedInstance: boolean;
|
|
45
|
+
/**
|
|
46
|
+
Whether this transport is the one that registered the vault being unregistered.
|
|
47
|
+
*/
|
|
48
|
+
readonly isSelfRegistered: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Whether unregistering a vault may destroy its window and remove it from the
|
|
52
|
+
* registry, or must leave the instance untouched.
|
|
53
|
+
*
|
|
54
|
+
* @param params - Who owns the instance, and who registered the vault.
|
|
55
|
+
* @returns `true` when the window may be torn down.
|
|
56
|
+
*/
|
|
57
|
+
export declare function shouldTearDownVaultWindow(params: ShouldTearDownVaultWindowParams): boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function shouldTearDownVaultWindow(params) {
|
|
2
|
+
const {
|
|
3
|
+
isHarnessOwnedInstance,
|
|
4
|
+
isOwnedInstance,
|
|
5
|
+
isSelfRegistered
|
|
6
|
+
} = params;
|
|
7
|
+
if (isOwnedInstance) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
if (isHarnessOwnedInstance) {
|
|
11
|
+
return isSelfRegistered;
|
|
12
|
+
}
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
shouldTearDownVaultWindow
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXRlYXJkb3duLXZlcmRpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGRlY2lzaW9uIGZvciB3aGV0aGVyIHVucmVnaXN0ZXJpbmcgYSB2YXVsdCBtYXkgdGVhciBpdHMgd2luZG93IGRvd24uXG4gKlxuICogVGhlIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydCB1c2VkIHRvIGFuc3dlciB0aGlzIHdpdGggYSBzaW5nbGUgZmxhZy4gSXRzXG4gKiByZWFkaW5lc3MgZ3VhcmQgYXNrcyBgb3duZWRDb25maWcgfHwgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgXHUyMDE0IHRoZSB0d28gd2F5c1xuICogXCJ0aGUgaGFybmVzcyBvd25zIHRoaXMgaW5zdGFuY2VcIiBjYW4gYmUgdHJ1ZSBcdTIwMTQgd2hpbGUgaXRzIHRlYXJkb3duIGd1YXJkIGFza2VkXG4gKiBvbmx5IGBvd25lZENvbmZpZ2AuIEEgKip3b3JrZXIqKiBhdHRhY2hlZCB0byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgaGFzXG4gKiBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZWAgYW5kIG5vIGBvd25lZENvbmZpZ2AgYXQgYWxsICh0aGUgZ2xvYmFsIHNldHVwXG4gKiBvd25zIHRoZSBjb25maWc7IHRoZSB3b3JrZXIgd2FzIGhhbmRlZCBvbmx5IHRoZSBwb3J0KSwgc28gaXQgZmVsbCBzdHJhaWdodFxuICogdGhyb3VnaCB0aGUgdGVhcmRvd24gZ3VhcmQgYW5kIHJhbiBgZGVzdHJveUN1cnJlbnRXaW5kb3coKWAgYWdhaW5zdCB0aGUgdmF1bHRcbiAqIGl0IHdhcyBhc2tlZCB0byB1bnJlZ2lzdGVyLiBXaGVuIHRoYXQgdmF1bHQgaXMgdGhlIG9uZSB0aGUgd2hvbGUgcnVuIHNoYXJlcyxcbiAqIGl0cyB3aW5kb3cgaXMgdGhlIG9ubHkgb25lIFx1MjAxNCBkZXN0cm95aW5nIGl0IHF1aXRzIHRoZSBhcHAsIGFuZCBldmVyeSBsYXRlciBmaWxlXG4gKiBmYWlscyB3aXRoIGBFQ09OTlJFRlVTRURgIG9uIGEgY2xvc2VkIENEUCBwb3J0LCB3aGljaCByZWFkcyBhcyBhIGhhcm5lc3NcbiAqIG91dGFnZSByYXRoZXIgdGhhbiBhcyBhIHRlYXJkb3duIHRoYXQgb3ZlcnJlYWNoZWQuXG4gKlxuICogTWFraW5nIHRoZSB0d28gZ3VhcmRzIGlkZW50aWNhbCB3b3VsZCBmaXggdGhhdCBhbmQgYnJlYWsgc29tZXRoaW5nIGVsc2U6IGFuXG4gKiBhdHRhY2hlZCB3b3JrZXIgdGhhdCByZWdpc3RlcnMgaXRzICoqb3duKiogYFRlbXBvcmFyeVZhdWx0YCBkb2VzIG5lZWQgdGhhdFxuICogd2luZG93IGNsb3NlZCwgYW5kIGEgYmxhbmtldCBlYXJseS1yZXR1cm4gbGVha3Mgb25lIHN0YWxlIHdpbmRvdyBwZXIgdGVtcFxuICogdmF1bHQgZm9yIHRoZSBsaWZlIG9mIHRoZSBydW4gXHUyMDE0IGVhY2ggcG9pbnRpbmcgYXQgYSBkaXJlY3RvcnkgdGhlIGRpc3Bvc2FsIGhhc1xuICogYWxyZWFkeSBkZWxldGVkLiBTaW5jZSBldmVyeSB3b3JrZXIgaW4gYSBgY3JlYXRlU2V0dXBgIHJ1biBpcyBhbiBhdHRhY2hlZCBvbmUsXG4gKiB0aGF0IGlzIHRoZSBjb21tb24gcGF0aCwgbm90IGFuIGVkZ2UgY2FzZS5cbiAqXG4gKiBTbyB0aGUgaW52YXJpYW50IGlzIG5hcnJvd2VyIHRoYW4gZWl0aGVyIGd1YXJkIGV4cHJlc3NlZDogKiphIHdvcmtlciBhdHRhY2hlZFxuICogdG8gYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIG1heSB0ZWFyIGRvd24gb25seSBhIHZhdWx0IGl0IHJlZ2lzdGVyZWQgaXRzZWxmLioqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaW4gdGhhdCBpbnN0YW5jZSBiZWxvbmdzIHRvIHRoZSBnbG9iYWwgc2V0dXAgdGhhdCBsYXVuY2hlZCBpdC5cbiAqXG4gKiBLZXB0IG91dCBvZiB0aGUgaW50ZWdyYXRpb24tb25seSB0cmFuc3BvcnQgbW9kdWxlIChleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMsXG4gKiBgTEY6MGAgaW4gY292ZXJhZ2UpIGZvciB0aGUgc2FtZSByZWFzb24gYHZhdWx0LXBhdGgtbWF0Y2gudHNgIGlzIFx1MjAxNCBzbyB0aGVcbiAqIGRlY2lzaW9uIGlzIHVuaXQtdGVzdGFibGUgd2hpbGUgdGhlIHRyYW5zcG9ydCBrZWVwcyBvbmx5IHRoZSBwbHVtYmluZy5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRUZWFyRG93blZhdWx0V2luZG93UGFyYW1zIHtcbiAgLyoqXG4gIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgYSB3b3JrZXIgYXR0YWNoZWQgdG8gYW4gaW5zdGFuY2UgdGhlIGhhcm5lc3MgbGF1bmNoZWQgZWxzZXdoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciB0aGlzIHRyYW5zcG9ydCBsYXVuY2hlZCBhbmQgb3ducyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNPd25lZEluc3RhbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIHRoZSBvbmUgdGhhdCByZWdpc3RlcmVkIHRoZSB2YXVsdCBiZWluZyB1bnJlZ2lzdGVyZWQuXG4gICAqL1xuICByZWFkb25seSBpc1NlbGZSZWdpc3RlcmVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdW5yZWdpc3RlcmluZyBhIHZhdWx0IG1heSBkZXN0cm95IGl0cyB3aW5kb3cgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZVxuICogcmVnaXN0cnksIG9yIG11c3QgbGVhdmUgdGhlIGluc3RhbmNlIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gV2hvIG93bnMgdGhlIGluc3RhbmNlLCBhbmQgd2hvIHJlZ2lzdGVyZWQgdGhlIHZhdWx0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHdpbmRvdyBtYXkgYmUgdG9ybiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvdyhwYXJhbXM6IFNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3dQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2UsXG4gICAgaXNPd25lZEluc3RhbmNlLFxuICAgIGlzU2VsZlJlZ2lzdGVyZWRcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNPd25lZEluc3RhbmNlKSB7XG4gICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZSwgYW5kIGl0cyByZWdpc3RyeSBsaXZlc1xuICAgIC8vIEluIHRoZSBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHVucmVnaXN0ZXIgZnJvbS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgIC8vIEF0dGFjaGVkIHRvIHNvbWVvbmUgZWxzZSdzIGluc3RhbmNlOiBvbmx5IHRoaXMgdHJhbnNwb3J0J3Mgb3duIHZhdWx0cy5cbiAgICByZXR1cm4gaXNTZWxmUmVnaXN0ZXJlZDtcbiAgfVxuXG4gIC8vIFBsYWluIGF0dGFjaCBtb2RlIFx1MjAxNCBhIGZvcmVpZ24gT2JzaWRpYW4gdGhlIGhhcm5lc3Mgb3BlbmVkIGEgdmF1bHQgaW4sIHdoaWNoXG4gIC8vIE91dGxpdmVzIHRoZSBydW4gYW5kIG11c3QgYmUgbGVmdCBhcyBpdCB3YXMgZm91bmQuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNERPLFNBQVMsMEJBQTBCLFFBQWtEO0FBQzFGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixNQUFJLGlCQUFpQjtBQUduQixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksd0JBQXdCO0FBRTFCLFdBQU87QUFBQSxFQUNUO0FBSUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* version.
|
|
6
6
|
*
|
|
7
7
|
* Support is the range `[latest public, latest catalyst]` and both ends must be
|
|
8
|
-
* verified
|
|
8
|
+
* verified. The two ends are moving targets, and they periodically
|
|
9
9
|
* **coincide** — when public catches up to catalyst, both specifiers provision
|
|
10
10
|
* the same build, so running the suites twice re-runs the same build and buys
|
|
11
11
|
* nothing. Worse, a consumer that ran both still reports "green on public AND
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
import type { DesktopReleasesManifest } from './obsidian-version.mjs';
|
|
24
24
|
/**
|
|
25
25
|
* The version specifiers a matrix run defaults to: both ends of the supported
|
|
26
|
-
* range
|
|
26
|
+
* range. They are de-duplicated on their resolved versions, so when public
|
|
27
27
|
* has caught up to catalyst this yields a single run.
|
|
28
28
|
*/
|
|
29
29
|
export declare const DEFAULT_OBSIDIAN_VERSION_SPECS: readonly string[];
|